News:

11 March 2016 - Forum Rules

Main Menu

Secret of Mana, Turbo - Beta 230822

Started by Queue, January 31, 2019, 06:45:12 PM

Previous topic - Next topic

Queue

Event 1E6 is when you rescue the Girl from the werewolves if the Sprite is the current party leader (I think, I didn't double-check in-game). There aren't very many unused events (that have content, lots of unused empty events).

Unfortunately there's no way to make VWF text work in a straight-forward manner in the ZPS patcher; its text encoding is too complicated. There are a couple options to work around the limitation but I don't have enough time at the moment to explain; I'll try to write something up tomorrow.

hmsong

#1301
I thought event 1E6 is when Primm/Popoi tickles Neko until he faints.  I'm looking at the script, and they're doing that.  I'm looking at C9/82D2.

Well, if it's too complicated, then I don't mind just skipping things for VWF.  VWF IPS from .NET doesn't even work.  I'm using the USA rom though.  And I dled two different roms from different sources, just to make sure.  I'm not fond of patches that make things hard for the users.

Queue

VWF Edition, the original IPS patch, requires that the ROM has a 512-byte header. Back in 2000 when it was released, this was common for SNES ROMs. Nowadays, SNES ROMs are generally expected to not have a header. Also, I think you've meant to type RHDN where you've been typing .NET (.NET is generally shorthand for the .NET Framework which is the name of Microsoft's group of interpreted programming languages / their runtime that include C# and VB.NET; the ZPS Patcher is a .NET program).

You may not mind skipping the VWF Edition, but I do. To be blunt, I won't include any event changing patches that don't work on vanilla, VWF and Relocalized, with only extreme exception (like if it's fixing a typo not present in all 3). If reconstructingmana is game to press forward with their retranslation, then that will be 4 script variants that I'll mandate support for (though my plans include work to make supporting all 4 easier).

That said, I've always been willing to do the work to make sure a given feature supports all three, in particular when importing kethinov's hacks early on before he supported them. I'm willing to do the same for yours, but I'd much prefer if you learned how; you know the second most about the Turbo ZPS, and the more you know, hopefully the more fun ideas you'll have.

Event 1E6 is the girl tickling the Sprite; Neko isn't there, the Girl just makes some comment referencing Neko, implying she bought some unnamed item from him that can heal the whole party (and revive the tickled-to-death Sprite). Event 1E6 is jumped to by event 1DA (and 1DA is called when you talk to the NPC Girl on the werewolf fight area, Map 38/0x26). It also looks like if you talk to the Girl with the Sprite she won't join you, and you have to switch to the Boy and talk to her.

hmsong

#1303
Yes, I meant RHDN.  I thought .NET was RHDN.  Haha.  My bad.

Ahh, I see, about VWF.  In that case, please teach me about VWF.  I shall do my best to learn (hopefully) and include that.  Thanks in advance.




Cripes.  I was trying to change the color of Dispel Magic animation (for Black Hex), and I'm having a hard time, after some success.

First of all, I found which address controls the target color -- D195E6, D1960C, D19630.  Yay.
Then I found out that there's at least 3 parts of color per Dispel Magic animation.  Dang it.
Then I was able to figure out the last two parts of the color animation -- D195F1, D19617, D1963D (2nd part), D19600, D19624, D1964C (3rd part).  Yay.
But I can't figure out where the first part animation color is.  Dang it.

I just need to find out the addresses that controls the color of the first part of the Dispel Magic animation.  Please help me with that.  Thanks.

Oh, also, if I wanted Stardust Herb to keep the vanilla colors of Dispel Magic animation, would that be possible?

StarWyvern

The other DL worked fine. Thanks!  ;D
Insert "Witty Text" here.

Queue

LightBaneX, your post got delayed by new post moderation, but I see it now so...

I hear you on the stunlocking. The stun duration formula is either based on damage or percentage of the enemy's health (done in one attack)? Or maybe both; now that I'm trying to remember it I'm realizing I haven't looked at it in a few months. I've taken a couple stabs at changing how it works but wasn't happy with any of the results.

For what it's worth, it's on my to-do list as:
super fast enemy recovery / unstunnable enemies

The enemies are pushovers though, but that's always been the case with Secret of Mana: it's just a fundamentally easy game. Generally, the only ones you can expect to hurt you are the ones you aren't currently attacking. Early game you typically only take damage if you mess up and walk into an enemy.




hmsong, I'll cover some of the VWF event info for now, and will look into the animations when I can. A quick answer to that though: I'm pretty sure Stardust Herb uses the Dispel Magic animation directly, so you'll need to make a copy of the animation so that one version can have original colors, and the other can be different.

Okay, so here are some options for changing a VWF event:

1) Don't change the text. This one's fairly obvious; since the text is encoded, as long as you don't change the text, you won't break it. You can move the text (either via the COPY directive or by copy&pasting the raw bytes yourself) if you need to change the event before or after (or in the middle of) the event.

2) You can cut the end off of lines of text. Every time VWF hits a newline (\n, 0x7F) it resets its encoding, so if you have:
TEXT ^N e k o : ^P u r r r r , _ i t ` s _ c o l d ! \n
TEXT _ ^S a v e _ y o u r _ g a m e ? _ ^O r ? \n

You could shave letters off the end of each of those lines, for example:
TEXT ^N e k o : ^P u r r r r , \n
TEXT _ ^S a v e _ y o u r _ g a m e ? \n

Would work. You couldn't actually use this TEXT stuff for the VWF event, I'm just showing that you could remove some of the text in the VWF event and everything else would still look okay.

3) You can adjust the event so that it uses the vanilla version with un-encoded text, instead of the VWF one, but there are some gotchas. This is the first complicated option.
First, note down the address of the vanilla event.
Second, you need to locate two addresses in the VWF event list:
$E06000 + Event# * 3
$E07E03 + Event# * 3

Then you change the $E06000 + X entry to point to the vanilla event, and the $E07E03 + X entry to $800000.
An example with event 65F:
Vanilla event 65F is at address $CA8962
$E06000 + 0x65F * 3 = $E0731D
$E07E03 + 0x65F * 3 = $E09120

@OFF $E0731D ' event 65F
ADR $CA8962 ' vanilla
@OFF $E09120 ' event 65F
ADR $800000

Sometimes vanilla event text doesn't look good with the VWF due to spacing. This generally just requires checking if the result looks okay in-game.
You can do the same with Relocalized (have it use a vanilla event), but you only need to change the $E06000 + X entry, NOT the $E07E03 + X entry, for Relocalized.
Using vanilla events with VWF / Relocalized still have line length restrictions just like vanilla events normally do.

4) You can use the VWF event, but use un-encoded text. This one's explanation will make it look complicated, but it's arguably easier than option 3. This requires altering the value at the $E07E03 + X entry, and replacing all the text in the event itself (which basically means replacing the entire event), since the encoded text that's already there won't be usable.
You need to locate the event's entry in the VWF event xor list:
$E07E03 + Event# * 3
Then you take the value that's there, and XOR it with 0x800000. XOR is a bitwise math operation; even if you don't totally grasp it, it's a button on any good calculator.
An example with event 65F:
$E07E03 + 0x65F * 3 = $E09120
The 3 bytes at $E09120 are 90 19 6A, which needs to be read as a 3-byte 24-bit address in little-endian order. So, 0x6A1990. 0x6A1990 XOR 0x800000 = 0xEA1990.
@OFF $E09120 ' event 65F
ADR $EA1990

You then need to replace the event with un-encoded text, which ZPS can do:
@OFF $??????
\event \lock \gather \camera_center \text_open
TEXT ^N e k o : ^P u r r r r , _ i t ` s _ c o l d ! \n
TEXT _ ^S a v e _ y o u r _ g a m e ? _ ^O r ?
\event \wait_input
TEXT \n
TEXT _ _ ( _
\event \text_opt_start \text_opt_define= 04
TEXT ^S a v e _ _
\event \text_opt_define= 0A
TEXT ^B u y _ _
\event \text_opt_define= 0F
TEXT ^S e l l _ )
\event \text_opt_end== \goto 000 \goto 050 \goto 308 \goto 315 \end

And obviously you can also make the alterations to the event you want, keeping in mind you still have a space constraint.

kethinov

Quote from: hmsong on April 10, 2020, 07:28:03 PM
My Neko shop modification actually changes one of the letters in the "Purrrr, it's cold" thing.  Specifically, it changes the last part -- "Or?" to "Or" (without the "?").  Would that affect things?

Nope. If that's all you did that to that event, then our changes will not conflict.

hmsong

@Queue

Wow, VWF is quite complicated, but I managed to do method 3.


'[Event 1DF - Various Nekos in the Beginning]
@OFF $C98144
'TEXT ^N e k o : ^M e o w , _ b u s y _ t r a v e l e r s ! \n
'TEXT _ ^I ' l l _ e v e n _ s a v e _ t h e _ g a m e ! \n
\event \flag== FA 01 ' Initial Neko Shop
TEXT ^N e k o : ^I _ h a v e _ i t e m s , _ n y a ! \n
TEXT _ ^I ' l l _ e v e n _ s a v e _ t h e _ g a m e ! \n
@OFF $C98195
\event \goto 312 ' Call Shop List

'[Event 318 - Mountain Neko]
@OFF $C9CD58
\event \flag== FA 0E ' Tasnica Shop

'[Event 65F - Ice Country Neko]
@OFF $CA8992
'TEXT ?
'\event \wait_input
'TEXT \n
TEXT \n
\event \flag== FA 01 ' Initial Neko Shop
@OFF $CA89B2 ' Ice Country Neko Shop Pointer
\event \goto 312 ' Call Shop List

IF [Text]
IF VWF_Edition
'[Event 1DF - Various Nekos in the Beginning]
@OFF $E0659D ' event 1DF
ADR $C9813D ' vanilla
@OFF $E083A0 ' event 1DF
ADR $800000

'[Event 318 - Mountain Neko]
@OFF $E20A4F
\event \flag== FA 0E ' Tasnica Shop

'[Event 65F - Ice Country Neko]
@OFF $E2E205
TEXT \n
\event \flag== FA 01 ' Initial Neko Shop
@OFF $E2E22A ' Ice Country Neko Shop Pointer
\event \goto 312 ' Call Shop List
ENDIF x2

IF [Text]
IF Relocalized
'[Event 1DF - Various Nekos in the Beginning]
@OFF $E19810
'TEXT ^N e k o : ^M e o w , _ b u s y _ t r a v e l e r s ! \n
\event \flag== FA 01 ' Initial Neko Shop
TEXT ^N e k o : ^I _ h a v e _ i t e m s , _ n y a ! \n
@OFF $E19866
\event \goto 312 ' Call Shop List

'[Event 318 - Mountain Neko]
@OFF $E20AB8
\event \flag== FA 0E ' Tasnica Shop

'[Event 65F - Ice Country Neko]
@OFF $E2E2D6
'TEXT ?
'\event \wait_input
'TEXT \n
TEXT \n
\event \flag== FA 01 ' Initial Neko Shop
@OFF $E2E2FB ' Ice Country Neko Shop Pointer
\event \goto 312 ' Call Shop List
ENDIF x2


It works beautifully.  To me, #3 was simpler, because it uses what I already changed.  Having said that, I had to put the 2nd line ("I'll even save the game"), because VWF changed the number of characters for the first and 2nd line (but the total characters amount was the same, thank god).

But I still want to do method 4, just for the sake of doing it.  However, I'm stuck on the last part.  What am I suppose to put for "$??????"?  Do I put $EA1990?  Well, I'm using event 1DF, so I have:

$E07E03 + 0x1DF * 3 = $E083A0

in VWF, the 3-bytes at E083A0 are: B0 F7 38, which is 38F7B0.
38F7B0 use XOR calculator with 800000 is: B8F7B0.

@OFF $E083A0   ' event 1DF
ADR   $B8F7B0 <<--- this doesn't seem right, since it's in bank B8.


'[Event 1DF - Various Nekos in the Beginning]
@OFF $?????? ' C9813D
RAW 2800
TEXT \n
RAW 2480
RAW 5D
RAW 5F
'TEXT ^N e k o : ^M e o w , _ b u s y _ t r a v e l e r s ! \n
\event \flag== FA 01 ' Initial Neko Shop
TEXT ^N e k o : ^I _ h a v e _ i t e m s , _ n y a ! \n
TEXT _ I ' l l _ e v e n _ s a v e _ t h e _ g a m e ! \n
RAW 59
RAW 03
TEXT (
RAW 58
RAW 5A05
TEXT S a v e
RAW 5A0C
TEXT B u y
RAW 5A12
TEXT S e l l _ )
RAW 5B
RAW 10FF
RAW 104F
RAW 1312 ' was event 301
RAW 1313
RAW 00




@kethinov

Uhh, would my new event 1DF screw with your new script?  I mean, I haven't messed with the total number of characters from vanilla.

Queue

To get the address of a VWF event:
- get the 24-bit value at $E06000 + Event# * 3
- and the 24-bit value at $E07E03 + Event# * 3
- and XOR them together

You already got the value at $E07E03 + 0x1DF * 3 = $E083A0 -> 0x38F7B0
So do the same for $E06000 + 0x1DF * 3; when you XOR them together the result should be a value in bank $E1.

That will give you the address to use for the @OFF $?????? placeholder.

You COULD then change the value at $E06000 + 0x1DF * 3 to the address you just calculated, and change the value at $E07E03 + 0x1DF * 3 to $800000, like for method 3. Or you could stick with the method 4 calculation, which changes fewer bytes (and which you did do correctly). Either works.

hmsong

Okay, so I did this:

$E06000 + 0x1DF * 3 = $E0659D
$E07E03 + 0x1DF * 3 = $E083A0

In VWF, the 3-bytes at E0659D are: 14 60 D9, which is D96014.
in VWF, the 3-bytes at E083A0 are: B0 F7 38, which is 38F7B0.
D96014 use XOR calculator with 38F7B0 is: E197A4.

So I did this:


'[Event 1DF - Various Nekos in the Beginning]
@OFF $E083A0 ' event 1DF
ADR $E197A4
@OFF $E197A4
RAW 2800
TEXT \n
RAW 2480
RAW 5D
RAW 5F
'TEXT ^N e k o : ^M e o w , _ b u s y _ t r a v e l e r s ! \n
\event \flag== FA 01 ' Initial Neko Shop
TEXT ^N e k o : ^I _ h a v e _ i t e m s , _ n y a ! \n
TEXT _ I ' l l _ e v e n _ s a v e _ t h e _ g a m e ! \n
RAW 59
RAW 03
TEXT (
RAW 58
RAW 5A05
TEXT S a v e
RAW 5A0C
TEXT B u y
RAW 5A12
TEXT S e l l _ )
RAW 5B
RAW 10FF
RAW 104F
RAW 1312 ' was 1301
RAW 1313
RAW 00


I don't know what I did or didn't do, but this isn't working.  Umm.  What did I do wrong now?

Queue

@OFF $E197A4
Is correct.

@OFF $E083A0 ' event 1DF
ADR $E197A4

Is incorrect.

You can put that calculated address at $E06000 + 0x1DF * 3 and $800000 at $E07E03 + 0x1DF * 3 (or vice versa) but only modifying one won't work. You've almost got it.

Also, here's a dump of vanilla, VWF Edition and Relocalized events, in ZPS format (to go along with the SoM2018 text dump from a few posts back):
https://filebin.net/7spaiz2xfys6b2i1/SoM.events.zip

hmsong

#1311
Okay!  Awesome.  Got it!

So here's my final product (for code):


'[Event 1DF - Various Nekos in the Beginning]
@OFF $C98144
'TEXT ^N ^E ^K ^O : ^M e o w , _ b u s y _ t r a v e l e r s ! \n
\event \flag== FA 01 ' Initial Neko Shop
TEXT ^N ^E ^K ^O : ^I _ h a v e _ i t e m s , _ n y a ! \n
@OFF $C98195
\event \goto 312 ' Call Shop List

'[Event 318 - Mountain Neko]
@OFF $C9CD58
\event \flag== FA 0E ' Tasnica Shop

'[Event 65F - Ice Country Neko]
@OFF $CA8992
'TEXT ?
'\event \wait_input
'TEXT \n
TEXT \n
\event \flag== FA 01 ' Initial Neko Shop
@OFF $CA89B2 ' Ice Country Neko Shop Pointer
\event \goto 312 ' Call Shop List

IF [Text]
IF VWF_Edition
'[Event 1DF - Various Nekos in the Beginning]
@OFF $E0659D ' event 1DF
ADR $800000
@OFF $E083A0 ' event 1DF
ADR $E197A4
@OFF $E197A4
\event \wait_input \text_clear \call 480 \gold_show
'TEXT ^N e k o : ^M e o w , _ b u s y _ t r a v e l e r s ! \n
\event \flag== FA 01 ' Initial Neko Shop
TEXT ^N e k o : ^I _ h a v e _ i t e m s , _ n y a ! \n
TEXT _ ^I ` l l _ e v e n _ s a v e _ t h e _ g a m e ! \n
TEXT _ _ ( _
\event \text_opt_start \text_opt_define= 04
TEXT ^S a v e _ _
\event \text_opt_define= 0A
TEXT ^B u y _ _
\event \text_opt_define= 0F
TEXT ^S e l l _ )
'\event \text_opt_end== \goto 0FF \goto 04F \goto 301 \goto 313 \end
\event \text_opt_end== \goto 0FF \goto 04F \goto 312 \goto 313 \end

'[Event 318 - Mountain Neko]
@OFF $E20A4F
\event \flag== FA 0E ' Tasnica Shop

'[Event 65F - Ice Country Neko]
@OFF $E2E205
TEXT \n
\event \flag== FA 01 ' Initial Neko Shop
@OFF $E2E22A ' Ice Country Neko Shop Pointer
\event \goto 312 ' Call Shop List
ENDIF x2

IF [Text]
IF Relocalized
'[Event 1DF - Various Nekos in the Beginning]
@OFF $E19810
'TEXT ^N e k o : ^M e o w , _ b u s y _ t r a v e l e r s ! \n
\event \flag== FA 01 ' Initial Neko Shop
TEXT ^N e k o : ^I _ h a v e _ i t e m s , _ n y a ! \n
@OFF $E19866
\event \goto 312 ' Call Shop List

'[Event 318 - Mountain Neko]
@OFF $E20AB8
\event \flag== FA 0E ' Tasnica Shop

'[Event 65F - Ice Country Neko]
@OFF $E2E2D6
'TEXT ?
'\event \wait_input
'TEXT \n
TEXT \n
\event \flag== FA 01 ' Initial Neko Shop
@OFF $E2E2FB ' Ice Country Neko Shop Pointer
\event \goto 312 ' Call Shop List
ENDIF x2


Wow, that was tough.  I had another error from "I'll even save the game" part.  The <'> from "I'll" screwed up the text part (but I didn't know why at the time).  Then I saw your text dump, and realized.  "Oh, right".  Apparently, it was supposed to be "I`ll".  But I did it, and everything seems to be in order.  Unless I missed something again.

When I sAW kethinov's other VWF works, I didn't expect it to be something so complicated.  How did he manage to do all his work, with such simple methods?  Dayamn.

So, which method is the "correct"... err, "official" method?  #3 or #4?  I'm obviously okay with either (although #3 is less wordy).  #3 requires me to put the "I`ll even save the game!" part in vanilla (since VWF changes things), while #4 requires me to put the whole E197A4 part.  Nevermind.  I would have to go with #4, because Vanilla capitalizes NEKO name, whereas VWF does not.  So in order to differentiate between the two, I'd have no choice but to go with #4.  I also made the correction above, so that vanilla would capitalize Neko's name.

Thanks for your text dump.  I'm sure it'll come in handy.  A lot.

reconstructingmana

#1312
Quote from: Queue on April 10, 2020, 07:14:17 PM
reconstructingmana, great, whew, glad that message got through.

1) I can work with whatever format for the data you go with. Data processing isn't exactly my strong suit, but I'll manage. When I read about what you'd done, I just really didn't want the effort to go to waste if possible.

2) D'oh, well I'm in no hurry; I've been working on this Turbo project for over a year and haven't run out of steam yet.

3) Here's a dump of the 3D remake's English text:
https://filebin.net/7spaiz2xfys6b2i1/SoM18.textdump.zip
As far as I know, that's every bit of text that's not baked into an image.

As for what next step to take, it depends on what you feel up to: whether you want to use the second spreadsheet, or find the original, how much you want to rewrite, how much text from the remake you want to match up with the original (I have no idea how the text you were working off of was organized, and the remake textdump doesn't look especially organized to me)...

Questions:
- Do you want to stick with the vanilla fixed-width font? It allows for 28 characters per line (and 3 simultaneous lines), which is easy to plan for when formatting text for the game's textboxes.
- Do you want to use a variable-width font (VWF)? This requires either the creation of a specialized tool to handle previewing the text outside of the game for formatting purposes (of finding a pre-existing one that can be adapted for SoM), or in-game testing (which can vary from minorly to majorly intensive).

I bring that choice up because I would need / expect the text formatting to be done by you (or anyone working on the text), since it has an impact on how readable the result is and is best adjusted by the person writing it. I would prefer VWF, but that will require more work on your end formatting the text to fit in the game's textboxes (at least if we want it to look nice).

The next step for me is to move forward with "script insertion" prep, which I'm committing to since you got in touch. I need to essentially parse vanilla and Relocalized events into the format expected by this ZPS format (currently the latter is just a blob of raw bytes) and get that patching in byte-for-byte identical to how it is now.

Getting me an example formatted in your preference of data format (spreadsheet, text file, word document, fuzzy images of a cellphone screen, etc.) sooner rather than later would let me start figuring out how I'm going to process your new text for insertion.

I really like using the game's original font for the sake of consistency (and nostalgia!).  I know that many text hacks have changed this, but since we can expand the memory for more text boxes, it doesn't seem to be a problem.

I know next to nothing about programming, so I'd need help getting it into the right format.  When I was working with zhaDe, he was able to take what I did and make something of it, though it was probably extra work on his part.

So I'm happy to get you a sample, I just need to know the best way to format it.

Now is also the time for a translation philosophy.  We could do any of the following:

1)Only translate the original Japanese (which was my original intention)
2)Translate the original AND add in content from the 2018 script, such as work tidbits from the conversations at the inn into the main script.
3)Do everything in 2 as well as add in authentic information from Japanese sources.  There are many books in Japanese that had additional information about characters and situations that we could work into the script.

I'm fine with any, let me know what you think.

UPDATE: After speaking to my collaborator, Karsten Beoulve, we thought we'd get ambitious and run with #3, unless you have an objection.  So basically, we'll be pulling in information from multiple sources and translations to make this the best version possible. 

Queue

hmsong, looks good.

Event 301 sets flag FA to 01, so I think your change to Event 1DF is functioning more as a bug fix. In vanilla/VWF/Reloc, if you pick Sell, then back out and pick Buy, it should show the last visited shop instead of Neko's, and your change avoids that since flag FA is set before you can pick Sell.

There may be an issue with Event 65F calling Event 312; it was relying on Event 308 calling Event 310 to open the gold display. I haven't tested if this matters, just observing the difference between the different Neko events.

I doubt there are any potential issues with Event 318.

I spent the last few days generating those event dumps and integrating them into the Turbo ZPS. Going forward, it should make certain types of patches easier to make, and I'm currently modifying some older patches to use these new capabilities. As an example, the Orb_Overflow_Event fix went from needing VWF and Reloc specific fixups, to the following:
%OFF% Event508.Orb_Overflow_Event
\event \ret '\end

Which automatically places it correctly for all 3 (technically %OFF% Event508 would work since this change happens on the first byte of Event 508, but I wanted to make it clear which feature was modifying Event 508).

Regarding kethinov, he appears to strive for minimal necessary changes; I assume that he designs his changes with that in mind. If you have examples where you want to know how it was done, don't hesitate to ask. Some kethinov hack compatibility fixups were done by me so I may be able to give insight.

Probably the most "correct" would be to painstakingly figure out the bytes necessary for the VWF text; I've done this on occasion for a few features by brute-forcing the necessary values, but I both think this is overkill (I did so for "fun") and don't really know a good way to explain how I did it. It involved using an emulator where I could easily change ROM data while playing (Mesen-S), modifying an event so that it was stuck in a loop, and then changing the byte past the last correct letter until it was correct, then advancing to the next, and so on, until the text was correct.




reconstructingmana, regarding font width, fair enough, and it definitely makes it easier to plan text layout per text box with fixed. So that'll be 28 characters wide, by 3 lines tall. Player names max at 6 characters. I think those are it for the constraints with fixed width.

As for format, it's whatever you expect will be the easiest for translation; data creation by hand, which is functionally what translation amounts to, is tedious work, so having that phase be as streamlined as possible is top priority. Just as an example, if that means a spreadsheet for side-by-side boxes with, say, vanilla, Japanese, 2018 remake, misc notes, and retranslated text, okie dokey. In my previous post (3 up from this), I uploaded a zip containing event dumps in the exact format that will be used to insert this retranslation, but I do not expect it to be written in that format.

I think what would be most beneficial on my end would be if text could have its Event Number associated with it (using the spreadsheet example, if a column parallel with the text had its Event Number). I don't know if what you have on hand already happens to have their associated Event Numbers or not, and it wouldn't be impossible to use other existing data to match things up (like if the vanilla English text is parallel with its replacement), but having numbering available would greatly reduce the complexity of getting text put into the correct Events.

As for a sample, if you intend to use the same spreadsheet formatting as your prior work, a copy of the old would give me something to look at and see what my options are. I expect to write a script to process your data into something like the aforementioned event dumps.

For translation philosophy I like the sound of 3 the most; the effort is already substantial for any of those, but I would expect the third would be the most enjoyable (under the assumption that researching additional sources and figuring out how to work them in is a more rewarding experience than translation from a single source). To which I add that townsfolk text can be made as wordy as you want as I intend to add the ability to abort from simple non-essential dialogs with the cancel (Y) button; so some old townsfolk lady could ramble for 10 text-boxes-worth, but be able to be cutoff after the first.

I suspect I could create a facsimile of some of the remake's inn "cutscenes" as they're generally just the 3 characters talking in the inn room. This would be a significant time and effort investment, like, very significant to where it's a risk it wouldn't actually be practical, but it's worth bringing up now since information from said events could / would be relocated elsewhere if they're not implemented, and alternatively, I'd need to start figuring out how I'd be implementing them now if you do want them (deciding where save data holds which inn cutscenes you've seen would go, where in the inn events to check if you've hit a certain storyline event that triggers a given inn cutscene, which unused events are available to use for the cutscenes, etc.).

hmsong

#1314
QuoteEvent 301 sets flag FA to 01, so I think your change to Event 1DF is functioning more as a bug fix. In vanilla/VWF/Reloc, if you pick Sell, then back out and pick Buy, it should show the last visited shop instead of Neko's, and your change avoids that since flag FA is set before you can pick Sell.

Oh yeah, I heard about that in one of the videos.  I didn't know what was happening, so I just ignored it.  Huh.  Well, great -- it's fixed, accidentally.  Perhaps you should put that part in the Bug Fixes section (unless it's off).  Nevermind.  It looks like most Nekos suffer the same issue (including Initial Neko, Upperland Neko, and Grand Palace Neko).  Hmm.  I don't see how that bug can be solved, unless each events involving Neko is individually changed (this will involve changing the TEXTs).  And Grand Palace Neko event may screw with Kethinov's Nekos.

QuoteThere may be an issue with Event 65F calling Event 312; it was relying on Event 308 calling Event 310 to open the gold display. I haven't tested if this matters, just observing the difference between the different Neko events.

Oh dang it.  You're right.  I didn't even notice.  Gotta fix that.




Well, that was easier than I thought.  I just changed the event 312 to 310 (308 calls the shop, then calls event 310).  Your event files helped me GREATLY.  Thanks.

So it's:

'[Event 1DF - Various Nekos in the Beginning]
@OFF $C98144
'TEXT ^N ^E ^K ^O : ^M e o w , _ b u s y _ t r a v e l e r s ! \n
\event \flag== FA 01 ' Initial Neko Shop
TEXT ^N ^E ^K ^O : ^I _ h a v e _ i t e m s , _ n y a ! \n
@OFF $C98195
\event \goto 312 ' Call Shop List

'[Event 318 - Mountain Neko]
@OFF $C9CD58
\event \flag== FA 0E ' Tasnica Shop

'[Event 65F - Ice Country Neko]
@OFF $CA8992
'TEXT ?
'\event \wait_input
'TEXT \n
TEXT \n
\event \flag== FA 01 ' Initial Neko Shop
@OFF $CA89B2 ' Ice Country Neko Shop Pointer
\event \goto 310 ' Call Shop List

IF [Text]
IF VWF_Edition
IFNOT Relocalized
'[Event 1DF - Various Nekos in the Beginning]
@OFF $E0659D ' event 1DF
ADR $800000
@OFF $E083A0 ' event 1DF
ADR $E197A4
@OFF $E197A4
\event \wait_input \text_clear \call 480 \gold_show
'TEXT ^N e k o : ^M e o w , _ b u s y _ t r a v e l e r s ! \n
\event \flag== FA 01 ' Initial Neko Shop
TEXT ^N e k o : ^I _ h a v e _ i t e m s , _ n y a ! \n
TEXT _ ^I ` l l _ e v e n _ s a v e _ t h e _ g a m e ! \n
TEXT _ _ ( _
\event \text_opt_start \text_opt_define= 04
TEXT ^S a v e _ _
\event \text_opt_define= 0A
TEXT ^B u y _ _
\event \text_opt_define= 0F
TEXT ^S e l l _ )
'\event \text_opt_end== \goto 0FF \goto 04F \goto 301 \goto 313 \end
\event \text_opt_end== \goto 0FF \goto 04F \goto 312 \goto 313 \end

'[Event 318 - Mountain Neko]
@OFF $E20A4F
\event \flag== FA 0E ' Tasnica Shop

'[Event 65F - Ice Country Neko]
@OFF $E2E205
TEXT \n
\event \flag== FA 01 ' Initial Neko Shop
@OFF $E2E22A ' Ice Country Neko Shop Pointer
\event \goto 310 ' Call Shop List
ENDIF x3

IF [Text]
IF Relocalized
'[Event 1DF - Various Nekos in the Beginning]
@OFF $E19810
'TEXT ^N e k o : ^M e o w , _ b u s y _ t r a v e l e r s ! \n
\event \flag== FA 01 ' Initial Neko Shop
TEXT ^N e k o : ^I _ h a v e _ i t e m s , _ n y a ! \n
@OFF $E19866
\event \goto 312 ' Call Shop List

'[Event 318 - Mountain Neko]
@OFF $E20AB8
\event \flag== FA 0E ' Tasnica Shop

'[Event 65F - Ice Country Neko]
@OFF $E2E2D6
'TEXT ?
'\event \wait_input
'TEXT \n
TEXT \n
\event \flag== FA 01 ' Initial Neko Shop
@OFF $E2E2FB ' Ice Country Neko Shop Pointer
\event \goto 310 ' Call Shop List
ENDIF x2


There's still issue with Neko sell-buy bug, but I have no idea how to solve that.

LightBaneX

Quote from: Queue on April 12, 2020, 03:50:48 PM
LightBaneX, your post got delayed by new post moderation, but I see it now so...

I hear you on the stunlocking. The stun duration formula is either based on damage or percentage of the enemy's health (done in one attack)? Or maybe both; now that I'm trying to remember it I'm realizing I haven't looked at it in a few months. I've taken a couple stabs at changing how it works but wasn't happy with any of the results.

For what it's worth, it's on my to-do list as:
super fast enemy recovery / unstunnable enemies

The enemies are pushovers though, but that's always been the case with Secret of Mana: it's just a fundamentally easy game. Generally, the only ones you can expect to hurt you are the ones you aren't currently attacking. Early game you typically only take damage if you mess up and walk into an enemy.


Hey, I am glad my post was seen! After noticing this forum need post approval by moderators, and seeing this thread hit a new page before getting approved, I thought it would be missed.

Yeah, the enemies in SoM are pushovers. I agree with that. But the stamina system created this rhythm of attacking and retreating while you recover. The enemy had a chance to hit you again. They are still push overs, but it feels different.

I am not sure what kinds of things you could try to make it feel better if you aren't happy with the things you have tried. I don't know what is possible... I'll think about it though the next time I play.

I did end up getting my buddy to play with me with this mod, and we are enjoying it a lot. Haven't run into any issues so far. We just got as far as getting undine when we played. The only other thing I have found that feels a bit off, is that block seems overpowered. Just hold R and take no damage from any attacks it seems. Even spells. It was kind of funny, me and him were fighting the boss and the girl kept dying and we were just fine without healing.

It's super fun to play though. Can't wait to continue playing. I will definitely follow this project, too  ;D

reconstructingmana

#1316
Quote from: Queue on April 13, 2020, 07:09:00 PM
reconstructingmana, regarding font width, fair enough, and it definitely makes it easier to plan text layout per text box with fixed. So that'll be 28 characters wide, by 3 lines tall. Player names max at 6 characters. I think those are it for the constraints with fixed width.

As for format, it's whatever you expect will be the easiest for translation; data creation by hand, which is functionally what translation amounts to, is tedious work, so having that phase be as streamlined as possible is top priority. Just as an example, if that means a spreadsheet for side-by-side boxes with, say, vanilla, Japanese, 2018 remake, misc notes, and retranslated text, okie dokey. In my previous post (3 up from this), I uploaded a zip containing event dumps in the exact format that will be used to insert this retranslation, but I do not expect it to be written in that format.

I think what would be most beneficial on my end would be if text could have its Event Number associated with it (using the spreadsheet example, if a column parallel with the text had its Event Number). I don't know if what you have on hand already happens to have their associated Event Numbers or not, and it wouldn't be impossible to use other existing data to match things up (like if the vanilla English text is parallel with its replacement), but having numbering available would greatly reduce the complexity of getting text put into the correct Events.

As for a sample, if you intend to use the same spreadsheet formatting as your prior work, a copy of the old would give me something to look at and see what my options are. I expect to write a script to process your data into something like the aforementioned event dumps.

For translation philosophy I like the sound of 3 the most; the effort is already substantial for any of those, but I would expect the third would be the most enjoyable (under the assumption that researching additional sources and figuring out how to work them in is a more rewarding experience than translation from a single source). To which I add that townsfolk text can be made as wordy as you want as I intend to add the ability to abort from simple non-essential dialogs with the cancel (Y) button; so some old townsfolk lady could ramble for 10 text-boxes-worth, but be able to be cutoff after the first.

I suspect I could create a facsimile of some of the remake's inn "cutscenes" as they're generally just the 3 characters talking in the inn room. This would be a significant time and effort investment, like, very significant to where it's a risk it wouldn't actually be practical, but it's worth bringing up now since information from said events could / would be relocated elsewhere if they're not implemented, and alternatively, I'd need to start figuring out how I'd be implementing them now if you do want them (deciding where save data holds which inn cutscenes you've seen would go, where in the inn events to check if you've hit a certain storyline event that triggers a given inn cutscene, which unused events are available to use for the cutscenes, etc.).

Yes, I made the spreadsheet right away and Karsten and I are working on it.  I'm happy to grant access to anyone who wants to add the event tags.  Doing the translation phase will be a lot of work and it'd be super helpful if someone wants to do that.  Right now, we are painstakingly matching the 2018 retranslation with the Japanese and Woolsey's.  2018 actually reused Woolsey sometimes so we can definitely expand upon that.

Btw, this is a (very rough) example of what we are doing:

Japanese:  リーダーかく、闇の騎士シーク、
マシンライダーのゲシュタール
こういってんのファウナッハ‥‥
そして魔法騎士タナトス‥こいつはまだくわしいことが、よく
わかっていないんだ。

Woolsey: The Emperor has some powerful bodyguards.  Sheex, Geshtar, Fanha,
and Thanatos. They're
capable of anything!

2018: The emperor entrusts his four generals with most military matters.
Sheex is the leader. Plus there's Geshtar the Mech Rider and Fanha, the strongest woman in the empire's army.
And last, but not least, Thanatos the Mystic Knight. That's all I know, though. Sorry.

Translation I did for my blog:

There are guards called the, "four heavenly kings" that report directly to the Emperor.  They are:

The leader, the knight of darkness --- Sheex
The machine rider --- Geshtar
The lone female --- Fanha

Then there is the magic knight, Thanatos.  I'm still not very familiar with him.

Rough prototype for new translation:

...after his battle with you, the machine rider Geshtar turned half of his body into a machine, creating the ultimate cyborg fully integrated with his vehicle.  Meanwhile, Sheex is the leader of the four---he is a master of the dark sword.  I don't know if the wielder of the Mana Sword is any match for him!  As for Fanha, the only female well...no one knows the truth about her.  Then there is the magic knight, Thanatos.  He's a recent addition.  I'm still not familiar with him.

~~~

All of the preceding comes from official sources.  It'd be rewritten to flow well, but that's the kind of information in Japanese guides that could be put into the game.  We will also be checking our work against two partial translations by native/fluent speakers.  I am in touch with one of them when I have questions about the original Japanese, and Karsten is has been learning for awhile.




April 14, 2020, 07:49:10 AM - (Auto Merged - Double Posts are not allowed before 7 days.)

Regarding the inn cutscenes, I was thinking about working this information into the dialogue elsewhere.  It's up to you if you want to go through the trouble of creating new events.  The characters rarely speak amongst themselves, so it may actually be necessary in the long run.

hmsong

#1317
@reconstructingmana

Hey, just out of curiosity, but is your new translation for the SNES game, or for that new 3D remake?  I feel like it's for the 3D remake, but I remember Queue telling me that he may port your translation into ZPS here (which is for SNES).



@Queue

Ahh, cripes.  It seems that the new Neko (event 1DF) does mess with kethinov's patch (specifically, Mana Fortress Neko).  It seems that he created new events to accommodate his changes.  I don't know if my patch will overwrite kethinov's patch, but it's either [my patch overwrites kethinov's patch], or [kethinov's patch overwrites my patch].  I think using IF/IFNOT can somehow help solving this issue, but I can't quite do it.  Any idea?  It seems that kethinov made his own events for his patch, but I don't know how to do that.

I'm looking at his Mana Fortress Neko/Watts, and I understand everything except:


'[Event 4F1: Dummied Out]-[Event 4FB: Dummied Out]
@OFF $CA4D89
\event \if_flag== 4F 1F \goto 659
\event \if_flag== 4F 00 \goto 678


When did those flags happen?  I mean, I already know event 678 is for the early Nekos, and 659 is for the Fortress Neko, but I don't understand how the game chose which flags to use.  For my patch, I can just put:


'[Event 1DF]
@OFF $C98195
'\event \goto 301
\event \goto 4F1

'[Event 4F1: Dummied Out]-[Event 4FB: Dummied Out]
@OFF $CA4D89
\event \if_flag== 4F 1F \goto 659
\event \if_flag== 4F 00 \goto 678
\event \end

'[Event 659: Dummied Out]-[Event 65E: Dummied Out]
@OFF $CA895C
\event \flag== FA 0F
\event \goto 312
\event \end

'[Event 678: Dummied Out]-[Event 67D: Dummied Out]
@OFF $CA8E69
\event \flag== FA 01 <<---------------------------- just change to this
\event \goto 312
\event \end


...and their equivalents for VWF and Reloc, and that'll probably solve the problem, but I don't even understand how that works.  Instead of just solving the problem, I would like to understand what's going on.  Could you please explain to me?  Thanks for the help.

Also, how do I know which events are dummy? (and therefore can be used for hack?)  And how do I find out which dummy events aren't already in use by other hacks? (do I just "search" for [event xxx] using the notepad?

reconstructingmana

Quote from: hmsong on April 14, 2020, 08:22:58 AM
@reconstructingmana

Hey, just out of curiosity, but is your new translation for the SNES game, or for that new 3D remake?  I feel like it's for the 3D remake, but I remember Queue telling me that he may port your translation into ZPS here (which is for SNES).


It's for the SNES, though really you could use it for any version of the game.

kethinov

Quote from: hmsong on April 14, 2020, 08:22:58 AM
Also, how do I know which events are dummy? (and therefore can be used for hack?)  And how do I find out which dummy events aren't already in use by other hacks? (do I just "search" for [event xxx] using the notepad?

Dummied events is a shorthand for any event that is not called anywhere in the vanilla script. Most of the time it means an event pointer that points to an empty (zero byte) event. But sometimes when people talk about dummied events, they are referring to events in the event list that have actual executable code but are never used or called e.g. the event I restored in the Frosty the Friendly Alchemist hack that is fully functional but unused by vanilla.