Golden Sun Hacking Community

The Editor => Golden Sun Hacking => Topic started by: Caledor on January 06, 2018, 08:02:10 PM

Title: [SOLVED] Rearraging Djinn encounters
Post by: Caledor on January 06, 2018, 08:02:10 PM
Since I'm back working on the mod for a few tweaks, i think this is a good time to pick up again an old idea of mine: swap Chill (randomly encountered in the Southern Gondowan) and Mud (Gabomba Catacombs) to fix the elemental imbalance in the first half of the game, cause you get your fifth mercury djinn while you have still only 2 venus ones, leading to some awkward setups.

Point is, i'm afraid I have to ask once again for your help guys, there are many things I don't know and i got struck pretty badly the last time i tried.

I think there are 3 things i must do in order to swap them:

- Swap the encounters. This might be the easy part cause it's something i already did, both for overworld encounters and dungeon ones.

- Swap the models: after battle for both and the dungeon model for the gabomba djinn. This is the first thing i tried to do and where i got stuck. I managed to replace the models with atrius' editor but the game froze immediately upon interacting with it or after the battle (for the overworld one).

- Swap the flags. There are flags for each djinn, which are assigned the moment you get one. I obviously need to swap the call for those 2 djinn but i have absolutely no clue about this one.

Don't know if i missed anything, I hope i'll add something more later tonight or tomorrow if i discover something interesting.

Title: Re: Rearraging Djinn encounters
Post by: Caledor on January 07, 2018, 10:10:59 PM
Testing for the gabomba djinn (map 127)
I can swap models and encounter with the editor pretty easily. The animation before battle plays flawlessly but after the battle the djinn remains stuck in midair, no animation plays, it doesn't get added to my djinn poll, and i can keep battling it by pressing A when facing it as usual.

From the editor i noticed that there are "events" binded to the djinn model so i think one or more of those handle the post battle animation and set the correct flag for the obtained djinn. There are 2 issues with them: I have no clue about what they actually do and they are stored in the ewram (02xxxxxxh), so even if i undestand what to do i can't make it permanent on the rom.

Does anybody have any familiarity with those "events"?

Title: Re: Rearraging Djinn encounters
Post by: Fox on January 08, 2018, 12:48:50 AM
Hm... I got something similar with what I did. (No animation after battle.) I fixed it by correcting the flag in the npc entry.

So like...


0200803C:0A = If changed to a number like 0x14 (First mercury djinni), then you'd also need to change 020093AA. In this example, that'd be to 0x44. (0x30 + 0x14)
... Of course, the djinni you want to change it to isn't the same one as my example...

0200803C = Djinni to battle

020093A8 = Sprite id
020093AA = Flag id

(Quick testing.  Should I do more?)

@02xxxxxx = If you mean this map code file. If you edit with Atrius's editor, it'll compress back into the ROM. (Or you could manually do it, if you make an asm hack where some files can skip the compression.)

Title: Re: Rearraging Djinn encounters
Post by: Caledor on January 08, 2018, 12:49:16 PM
Thanks a lot, it worked!

Apparently Chill is flag 0x1F. Strangely enough, setting 0x17 leads to the same enemy encounter but flag 0x17 doesn't make the djinn appear. Also, i didn't know i could edit the decompressed event from within the editor, sweet! I never noticed the code hex window cause this is the first time i need to do something map related.

Do you happen have any tips for the swapping chill with mud? I have no clue on where to start looking for flags on the world map.

EDIT: Obviously i wanted to say that i set the encounter to 0x1F and the flag to 0x4F. The strange point is that encounter 0x1F and 0x17 are the same djinn but flag 0x47 doesn't make the djinn appear. Sorry for the misunderstanding.

Title: Re: Rearraging Djinn encounters
Post by: Fox on January 08, 2018, 05:05:50 PM
Kind of an FYI/trivial thing.... But...... Flag 0x1F and flag 0x17 = = Not really where the Djinn flags are. (Djinn flags start from 0x30+...) But I'm guessing it is a slight mis-understanding of what I meant. :P That's alright though. "Flags" refers to the 1-bit table at 02000040/Same flags seen in Flag Menu. ; When a flag is on, it means the Djinni was retrieved, so it disappears from the map. - If it doesn't reference the bit table, (Being, not in the (0x30+ Djinn flags), I'd just call it Djinni id or something similar.

Now that the trivial part is out of the way....

I expect it is done the same way.

02030004 = Pointer to NPC table. (0200E338)
02030010 = Pointer to Events table (0200E7C0)

I scroll through those tables to find what may match.

In the NPC table, we can identify them by their sprite number and flag number. Very easy.

0200E398 = Sprite number. (Set this to 0xF3.)
0200E39A = Flag number (Set this to 0x3A.)

The Events table isn't that difficult either, and it most certainly wasn't difficult in the dungeon.
In the dungeon, it was just two exit events and a Djinni event. (That's all.)
While the dungeon is based on an interaction with an NPC, the world map is not, and is based on tile events. So I guess we can take one extra step. (EDIT:  Although, you could skip this step and go by flag id. But for sake of most events that don't always use flags... this is the way.)
See  020101A4, for the address that points to where we are in the tilemap. (Go to it.) In my example, I have 02020D5C, there, I see 0x035E12E6... Now, what we're interested in is the event number there.... (I bolded it. It is 0x5E) So, we go back to the Event table, and we look for one that matches it.

Found it!
0200E808 = 00000002 004F005E 02008101

I have bolded the event number here, that I connected it to. Now, this is when we look at that last 32-bit. It is a pointer to code that gets executed. Go to it in a disassembler. (Thumb)

There is a bit of code here, I scan for 0x1F for some reason, and see one at 0x02008144, maybe it is the right one? (If not, I can look further.)

Title: Re: [SOLVED] Rearraging Djinn encounters
Post by: Caledor on January 08, 2018, 06:54:13 PM
Many, many thanks, Fox!

Chill becomes Mud with those changes:
0200E398 = 0xF3
0200E39A = 0x3A
02008144 = 0x0A

There's still a few things I don't understand about those events but for now this will do. I'll come back here whenever i need to make similar tweaks in the future.

EDIT: Also at 0200E808 = 00000002 004F005E 02008101, the 4F becomes 3A

Title: Re: [SOLVED] Rearraging Djinn encounters
Post by: Fox on January 09, 2018, 02:08:22 PM
You are welcome.

And yes, that's it!

Not to worry, there are some things I have yet to understand as well. (But it probably wouldn't be that difficult to figure out.)

In both cases (the dungeon and the world map), the same function gets called. (Interesting.)

The arguments are:
r0 = NPC id
r1 = Djinni id

The dungeon is:
r0 = 00000008
r1 = 0000000A

And what I saw that was interesting, was:

The world map had it as:
r0 = 0000080C
r1 = 0000001F

This suggests that the "8" may mean something. (Another thing I haven't learned about/documented! Exciting!) Probably the difference between whether the Djinni was already displayed on the map or not, but I'll need to investigate.

EDIT: The "8" flag means to skip the animation/go straight to battle!

EDIT: Okay. Figured one big thing out!
-The number you put in the event, when a map code function is called....  (BEFORE BATTLE) ... A function puts a number at like 02000494.
-Later, (AFTER BATTLE) This number is taken, and all the NPC init entries are scanned to find a matching flag.
--Value at 02000494 must be from 012C-017B (As an 11-bit... 0800 flag is okay.) Basically matching ability id.
--ONLY FLAGS OF 0x30-0x07F WILL WORK! :) As long as the flag is match with the number put in for the event.
So pretty much, this is how the right entry is found, so you could make it any entry you wanted, as long as the flag id is found, you're good to go.
From there, based on the entry used, it'll look up the respective data in the 02030014 NPC list....