- updated Black_Hex with changes to recharge times for both spells it affects
- updated Lunar_Magic_-_Celestial_Cascade to medium spell recharge time
- added Water Thug to Balance\Monster_AI_Improvements (technically a weapon collision fix, not an AI change, but it affects usefulness of their AI)
- modified Title_Screen\Music_Fade_Fallback to add a heavy-handed timing fix for when the intro loops; should prevent possible hangs / crashes that afflict a wide range of hardware and emulators differently
- modified timing requirements and added deadlock safety to Title_Screen\Turbo_Logo
- implemented Bug_Fixes\Ownerless_Event_Safety which fixes a softlock when the event owning player is lost before an event wait-for-input happens (e.g. player who cast Analyzer on a Crystal Orb dies before the text boxes show)
- implemented Bug_Fixes\Matango_Caves_Trap (different from Miscellaneous\Enable_Matango_Caves_Trap) which fixes some "sticky" environment collision by the underground stream
- changes to Combat\Manual_Block glove weapon throws: fancier logic to synchronize throw direction between attacker and defender, uncharged throw is always the judo throw, charged throws pick throw animation depending on charge level
- tidy map treatment for Matango Caves
- improved Bug_Fixes\Late_HDMA_Fix to deal with transparent mosaic layer visual glitches in ZSNES (fixes Kakkara Desert clouds and Ruins fog)
- added super quick cast variant to Quality_of_Life\QuickSpell_Hotkeys: Hold L to start, press D-Pad pattern to select, make sure no buttons other than L are held and Release L to cast
- fixed ability to target inactive characters with QuickSpell_Hotkeys
- fixed event ownership to match vanilla ring menu spell cast behavior when using QuickSpell_Hotkeys (e.g. for casting on Crystal Orbs)
- fixed QuickItems changing last selected ring menu item position
- rewrote setProperWeaponRelativeBank() for Combat\Strong_And_Weak_Attacks
- changed DEBUG_MODE control for map reset from P3R + P1Start to P3R + P1Select
, I didn't change the recharge times on Inferno Barrier or Shadow Saber because I left them long on purpose. Both are way too good of spells, no harm in them having long recast times. While I doubt Celestial_Cascade really needs
a non-short recast, I agree that medium is suitable.
$C81000 is the base address of an array of palettes that are applied to actors (monsters, players, etc.: the spell's target). $DCFC3E is the address for the actor palette the hardcoded Fire Bouquet (Dust Flare) uses. The comment beside the value explains how to calculate the actor palette address: $C81000 + 0x1E * palette. Since you wanted actor palette number 0x8F, it was $C81000 + 0x1E * 0x8F = $C820C2.
$D1F600 is the base address of an array of palettes that are applied to spell effects (and weapons). $DCFC3A is the address for the spell palette the hardcoded Fire Bouquet (Dust Flare) uses. The comment beside the value explains how to calculate the spell palette address: $D1F600 + 0x0A * palette. Since you wanted spell palette number 0xB8, it was $D1F600 + 0x0A * 0xB8 = $D1FD30.
The hardcoded Evil Gate animation is probably somewhere in bank $DC as well.
I liked the idea about weapon charge level letting you use the different throw animations, and as importantly, it was easy to implement. Unfortunately, it's not practical to let charge level boost throw damage because the throws are being activated in a non-standard way that doesn't clear your charge when they finish, so block throws have to just waste charge level. Because it can be hard to get to a high charge level when blocking resets your charge, it's set up as:
0 = judo throw (uncharged)
1 = suplex
2 = power bomb
3 = pile driver
4 = judo throw
5 = suplex
6 = power bomb
7 = pile driver
8 = judo throw
This was also inexpensive computationally to implement (cheaper than having ranges of charge level be certain throws).
For the QuickSpell patterns, there's a reason for the weird direction layouts: no direction can occur twice in a row. Undine / Salamando = Right, Undine = Up (not Right), Undine's spells = Left/Down/Right (not Up). While it makes searching less intuitive, building muscle memory for any of the inputs is arguably unaffected, and this system avoids any 2 (or 3) same direction presses, which take an extra input frame to execute due to requiring release for at least 1 input frame between presses.
Unfortunately ease of direction press is highly subjective: I actually consider Up to be the easiest direction to press, which is why I put the QuickItems drum and rope on Up, and the spell layouts essentially were built around Cure Water being on Right > Up > Right (the pattern I consider easiest).
Since the whole scheme is built around building muscle memory, I specifically avoided a "back one level" hotkey: Y/X/A are the "back" buttons, and all take you back to the first level (category selection). Learning partial patterns, for example, Right > Down, wait... no... Back > Up > Right, is destructive to learning the correct pattern (in this case, Right > Up > Right).
Good call on the Water Thug. It was actually a problem with their weapon: it lacked a collision rectangle. I didn't test Ice Thugs, but if they use the same weapon animation frames, they should be fixed too (and I guess I should update the description to mention them if it affects them). For the Kid Goblins, a bunch of the AI branches play a weird hop animation that was probably supposed to be an axe chop attack; I changed their short range AI branch to be an axe chop attack (or 2 or 3) instead of a hop. I left the other hops as-is because they'd be out of melee range anyway, and the hop is sort of their signature stupid move (other than snoring).
Oh, and Event2A8.Revisit_Kakkara_Desert.new is correct. It's somewhat coincidental that Revisit_Kakkara_Desert affects both Event28A and Event2A8.
, that image is excellent and probably shows why they cut the claw graphics: the right hand claw is floating a pixel above her hand. It's not possible to align claws on both hands with all 3 characters in all possible glove weapon attack poses (because they didn't design said poses with perfect hand placement consistency between the three characters).
, Event 16D is named that way to be less spoilery:
You can use somedit to look at events by their number, or search the Turbo ZPS file for @OFF Event### (e.g. @OFF Event16D).
getPlayerChar() isn't something to worry about; technical changes are more about me documenting code changes that don't (in theory) affect the user, but could be the source of bugs, so if I suddenly get reports of something malfunctioning after a certain version, I can check the change notes and jog my memory. Anyway, it's a little helper function that converts a player index to a character index (I didn't name it). I inlined it and similar helper functions, which means instead of being a (computationally expensive for an SNES at 14 cycles) function call for a tiny bit of code, the code is inserted where a function call would otherwise be. In compiled programming languages, function inlining is usually an automatic process done by an optimizing compiler, but since ZPS patches are an assembly language (and optimizing assemblers is an oxymoron), I made a macro of sorts that inlines these helper functions (instead of me copy&pasting).
Now that QuickItems are in I dare you (or anyone) to do a whole run only using the quick menu to use spells or items. I've tried, but there are a few bosses (Great Viper) where I've still found myself having to pause (to the Ring Menu) to avoid losing.