hmsong, in ZSNES's sound options menu, do you have sampling rate set to 44100HZ? If it's slow, it might be set to 32000HZ (which might be the ZSNES default? I forget). If that's not it, and you just don't like the tempo of the remake's music, you could set the sampling rate to 48000HZ in settings and the music will play fast, but you may think it's too fast then.
The tough part with Remedy and how my, uhm, let's call it "invertable targeting" works at the moment, is there would have to be no valid ally target, which would mean adding code so that Remedy won't target an ally unless they have a status effect that needs curing (not that that's a bad idea, just it's not zero work to add that check) before it could target enemies. OR making the spell target enemies by default and only usable on allies once there are no enemies.
I wasn't able to make the targeting simply able to pick between anyone freely because the targeting code only has 3 slots for targets, which it chooses early then cycles between; my code special cases if no targets are found, then inverts the target enemies bit (0x80) and reruns the targeting logic. I may be able to come up with full free targeting, but that didn't happen on my first attempt.
Things are likely stabilizing with the current crop of spell changes, so I want to get the Magic_Recharging values updated using your observations on when the timer starts for which type of spell cast animation. My goal isn't to necessarily have a fast recast option for every element for both characters, but to try and deal with some of the combinations that come out exceptionally long or exceptionally short and end up making some spells undesirable, or too desirable (especially between the simple damage only spells). I know this has been discussed already, but was hoping for a fresh round of reasoning now that quite a few spells have been changed.
zoolgremlin, bah, 2 megabytes is all the space a game will ever need. I'm just thankful Secret of Mana is HiROM and not LoROM.
ZSNES is lightning fast (in the sense of it uses very little processing power to work); it sounds like hmsong thinks the remake's music has too slow of a tempo by design. Regardless, the ZSNES MSU-1 implementation (which I wrote) simply takes the bytes straight from the PCM audio files and dumps them straight into the sound buffer as-is, with no processing to account for sampling rate difference between the PCM file (44100 Hz) and whatever the sound buffer is set to. At the beginning of each "frame" of sound, ZSNES normally zeroes its sound buffer, then mixes each SNES sound channel's data into the buffer; I replace this zeroing with directly dumping PCM data in so I didn't have to add any code to mix the PCM sound in (since it comes first). I don't do any processing on the PCM audio for a few reasons:
1) is effectively laziness, I burned a lot of time getting it working at all and wanted to be "done"
2) was I really wanted to keep code size small, since it's inside the SoM Turbo ROM
3) processing sound is pretty annoying, the silver lining is I learned a lot about digital audio data that I wasn't aware of, like how grossly misunderstood it generally is (e.g. the "stair-stepped quantized digital audio" complaints you generally see are a misunderstanding of what the data represents)
It's not that bit 0x10 of the spell data target field "could" be used for that, I just made it mean that. The target value has 4 used bits:
0x80 means target enemies
0x40 means target boy holding sword (if 0x80 isn't set)
0x20 means target chests (if 0x80 is also set)
0x01 means multi-targetable
The other bits just aren't checked so I could use them for whatever. I use 0x10 to mean "invertable" and internally use 0x08 in the QuickSpell code's targeting code since it needs to update targets in real time (not sure what I'd name bit 0x08; something like, "currently inverted"). The normal spell targeting code clears the 0x10 bit if it inverts since it's not real time so doesn't need a second bit to track state (clears the bit to avoid an infinite loop).
Revivifier specifically checks the targets type when cast, and if it's not a player or boss it skips to the function's return without curing status effects or healing. For Turn Undead, I changed it to jump beyond the end of the function's return, check if the target is a ghost/undead, if so, jump to the basic damage spell function, and if not, just jump back up to the healing part of the Revivifier function. If you time it right, it can revive a normal enemy as they die; hopefully that doesn't cause any bugs. Hm... I bet it does. Those might be fun.