Jump to content
VincentASM

FE10: Radiant Dawn Hacking Notes

Recommended Posts

22 hours ago, Person mystery said:

Seems like doing my method gives an error, which if ignored automatically assigns Rafiel to the team. Guess you'll have to modify the save directly somehow.

There's a guide on how to do this on the very first post of this thread. It's useful when you want to change other things for your character hack. You'd need WiiScrubber and Batch LZ77 (I don't think Wiitools is available anymore).

By the way, I don't think this game has an autolevel feature. Would've been useful for Part 1/2 characters.

No worries about the staff exp. it seems pretty estoeric. And thanks for the advice on the ranks. It just took some time to become familiar with hex editing before I understood what op was talking about....

Also, just finished my hack. I rebalanced weaker units (and Haar) with suggestions from FE Reddit to be more fun to play on Hard Mode while staying true to the lore of the game.

Also,  I have ramped up elemental and Dark magic damage across the board (except for tails). And made Thunder the strongest elemental magic without weakening Wind.

Ultimately, I want people to be able to play with their favorite units.

Playing it right now. We'll see how it goes.

 

 

Edited by brassy

Share this post


Link to post
Share on other sites
On 8/17/2020 at 7:33 AM, brassy said:

I've already updated the code... I am working on updating skills though. I am trying to get Paragon on Leonardo instead of cancel.  And the weapon ranks.

Edit: I've been practicing the pointers and got Paragon to work.

I would appreciate it though if someone could advise me on doubling exp per staff use. It doesn't seem to be stored with the items. 🙂

 

you can activate unlimited exp at the base through the geckocodes 😄 https://geckocodes.org/index.php?c=RFEE01

Share this post


Link to post
Share on other sites
23 hours ago, Prophet said:

you can activate unlimited exp at the base through the geckocodes 😄 https://geckocodes.org/index.php?c=RFEE01

Wait.. Make Florete do magic damage???

I want this code in my hack...

Also, I just reviewed Dunal's hack and he has increased staff exp!!! It's very possible. Let's see if I can copy his changes by replacing his staff code... 

Edit: I can't open the patched iso with Wiiscruber (memory error).. oh well. Dunal edited the experience code, and I don't think it's located in Data.cms... If he can do it, so can I!!! Let's see.

 

 

Edited by brassy
Update

Share this post


Link to post
Share on other sites
16 hours ago, brassy said:

Wait.. Make Florete do magic damage???

I want this code in my hack...

Also, I just reviewed Dunal's hack and he has increased staff exp!!! It's very possible. Let's see if I can copy his changes by replacing his staff code... 

Edit: I can't open the patched iso with Wiiscruber (memory error).. oh well. Dunal edited the experience code, and I don't think it's located in Data.cms... If he can do it, so can I!!! Let's see.

You can also change Florete's properties by hacking FE10Data based on the item section on the first post. The weapon type at min/max range is wrong, though; it should be the weapon rank type needed and the actual type of damage done. Haven't tried it yet, but you could probably make reaver weapons this way. If you wanna make florete ignore the magical weapon triangles, you could probably change it to whatever weapon type White Breath is.

About the EXP calculation, it's PROBABLY something to do with FE8data and main.dol. Probably. Maybe. Good luck!

Edited by Person mystery

Share this post


Link to post
Share on other sites

Well, the good news is that I found how to add initial items to units in battle. The bad news is that it involves pointerception.

Step 0: Understanding the dispos files structure.

The dispos files are divided into 6 parts: Header, Unit Data, Object List, Pointer List, Group List, and Footer. Each step correspond to a section, and more detail will be given there.

These structures are also applied toward mess and shop files, although the details are a bit different in each.

Step 1: Adding the object to the file (Object List) (Ignore if the item's IID is already in the list)

Objects include SID, JID, IID, PID, SEQ, etc. At various points, the game points to these objects. When the game reads an object, it stops at the byte 00, so make sure not to forget it when adding a new object. More details on pointers/objects in this post.

You can easily spot Object List as it has a bunch of legible strings in the middle of the file. It starts with a date/time and ends with "invalid". Just add the object you want into this section. Since there are a bunch of pointers into this part, if you want to avoid a major headache you should put the new item's IID after the "invalid" object. Do not replace anything. And do not forget to add 00 at the end.

Step 2: Adding the items to the unit (Unit Data)

Unit List starts at 28, with each unit taking up 104 bytes (68 in hex). The specifics can be found here, along with a little bit of my findings here.

The part after the pointer to "invalid" is the item section. Just turn those into pointers toward whatever thing you want them to have. Do not add anything; just replace them. I don't know what'll happen if you try to point them to objects the game doesn't recognize as items, though.

Step 3: Adding the new item pointer to the file (Pointer List)  (Ignore if you're just swapping/deleting items)

You can easily spot Pointer List by as it has a bunch of increasing numbers located right after the Object List. Those increasing numbers point toward all the pointers in the file. Usually the first two pointers on this list are 00 00 00 00 and 00 00 00 0C (pointing to the pointers at 20 and 2C respectively). Note that this DOES NOT count the pointers found inside the Group List (more on that later); only on the Header and Unit Data.

An important thing to note is that this section MUST start at an address multiple of 4. If this is not the case, most likely as a result of Step 1, then you'd have to add a bunch of garbage bytes as padding.

If you wanted to add items to a unit, you'd have to create new pointers for the new items. Just add them into the appropriate slot. Do not replace anything. If you skip this step, the item you add will be the same as whatever item is pointed by the pointer that is actually listed. I don't think it matters if you put the new pointer out of order, but for easier organization I'd suggest you don't do that.

Step 4: Accounting for the new file size (Header) (Ignore if you're just swapping/deleting items)

The header has a length of 24. Bytes 20-23 is a pointer toward a date, for purposes unknown. Bytes 00-03 shows the file size (in hex). Bytes 04-07 is a pointer toward the start of Pointer List.  Bytes 08-0B is the number of pointers in the Pointer List (in hex) aka the size of Pointer List divided by 4 (in hex). Bytes 0C-0F is the size of Group List divided by 8 (in hex). Bytes 10-1F are all 00 (unused because you can't point toward those addresses).

An incorrect heading will cause the game to crash/freeze, so we need to change the bytes 00-0B such that it follows the state of your new file according to the rules above. Do this and we're done!

Step i: Irrelevant stuff (Group List and Footer)

We're already done, but there's still 2 sections left. I'll post them here for posterity.

The Group List comes right after the last pointer in the Pointer List. It contains group pointers, 8 bytes each, which is counted by the header (see above). Groups can be dates, allies, enemies, green units, etc. This section also must begin at an address multiple of 4.

The first 4 bytes are a pointer toward the beginning of the objects in the group. In most cases, the very first one points has the value 00 00 00 00, which means it points to the address 20 (which is a pointer to a date, as stated above). The rest of the groups are started with 4 bytes that defines the group, after which the unit lists begin. The first byte shows how many units are included in that group. The second byte is always 07. I have no idea what the rest means.

The last 4 bytes are special pointers that determine the group name. These pointers are special in that they don't need to be added 20 to show the correct location. It's also special in that it starts at the beginning of the footer (aka the end of the Group List).  So if the footer starts at 16A4, for example, then a 00 00 00 00 in this section points at 16A4 and a 00 00 00 28 in this section points at 16CC.

Edited by Person mystery

Share this post


Link to post
Share on other sites

It seems obvious looking back but I am unable to adjust the character (starting) level in the army and character data after the game has loaded the character. ¯\_(ツ)_/¯

---------------------------------------

Edit: Was just wondering if anyone could help me with a hard mode enable enemy range hack. I replaced the data at the marked offsets in main.dol as suggested below with 28000003 but nothing happens. Any advice? This will be my last question for a while.

User Reikken said that:

All the changes are in main.dol and involve changing one instruction, to 28000003, at different places

For range on: at these three addresses in main.dol:

18D808

04E9D8

06399C

The fix seems to work for other people. I am not sure why it's not working for me considering I am adjusting ver. 1.01 of main.dol

Edited by brassy

Share this post


Link to post
Share on other sites

Looks like he also makes a guide on how to change the EXP formula. He doesn't leave any guide on how he found those values, so I guess you're out of luck. You'd probably have to find them using Debug Mode yourself. I don't know how to do that, so I can't help you there.

But hey, if you do figure it out, at least you can change both EXP and enemy range using a similar method. And, you can probably figure out the weapon triangle, map affinity, or even what the skills do in the meantime.

Share this post


Link to post
Share on other sites
On 8/26/2020 at 10:38 PM, Person mystery said:

Looks like he also makes a guide on how to change the EXP formula. He doesn't leave any guide on how he found those values, so I guess you're out of luck. You'd probably have to find them using Debug Mode yourself. I don't know how to do that, so I can't help you there.

But hey, if you do figure it out, at least you can change both EXP and enemy range using a similar method. And, you can probably figure out the weapon triangle, map affinity, or even what the skills do in the meantime.

I'm afraid it'll take a couple dozen hours to learn how to dicipher and replace the code with debug mode.. Tell you what, if inspiration does strike I will write up a how to for the website. Once again, thanks for looking into it.

Share this post


Link to post
Share on other sites
On 8/26/2020 at 10:25 AM, brassy said:

 

Hey Brassy, I think I can help you here. There are two versions of Radiant Dawn, and this guy must have the one you don't have. At least for the first three values, his numbers seem to be off by 0x40. Try these instead:
18d848
04ea18
0639dc

Try adding 0x40 to the rest and see if they work, too.

Share this post


Link to post
Share on other sites
On 8/29/2020 at 4:45 AM, LordMewtwo73 said:

Hey Brassy, I think I can help you here. There are two versions of Radiant Dawn, and this guy must have the one you don't have. At least for the first three values, his numbers seem to be off by 0x40. Try these instead:
18d848
04ea18
0639dc

Try adding 0x40 to the rest and see if they work, too.

My version is the one with Muarim's glossary having Mist's instead, and this works. For posterity, you change the addresses 026628 for weapon triangle and 0F5550, 1151C0 for map affinity. You know you got the right addresses if they originally have the value 28 00 00 02 (change it to 28 00 00 03 to enable the feature).

Still no idea about EXP/BEXP formulas and battle save, though.

Edited by Person mystery

Share this post


Link to post
Share on other sites
15 hours ago, LordMewtwo73 said:

Hey Brassy, I think I can help you here. There are two versions of Radiant Dawn, and this guy must have the one you don't have. At least for the first three values, his numbers seem to be off by 0x40. Try these instead:
18d848
04ea18
0639dc

Try adding 0x40 to the rest and see if they work, too.

 

2 hours ago, Person mystery said:

My version is the one with Muarim's glossary having Mist's instead, and this works. As posterity, you change the addresses 026628 for weapon triangle and 0F5550, 1151C0 for map affinity. You know you got the right addresses if they originally have the value 28 00 00 02 (change it to 28 00 00 03 to enable the feature).

Still no idea about EXP/BEXP formulas and battle save, though.

 

Happy days. Thank you everyone! My dolphin says I have version Rev 1.01 but since I also have Mwarim's glossary error I guess I have the other.

Share this post


Link to post
Share on other sites

About the zmap footer and the ??? Part, I found out that the length of the ??? Part divided by 8 = the number of objects on the footer = bytes 0C-0F. The footer objects usually have the names: date, mikata, teki, and zoen. Anyone with Japanese knowledge knows what they might mean?

E: I just remembered that ENG Hard/JAP Maniac have autoleveled enemies. Not sure how it works, but MAYBE it can be used to autolevel Tormod and co?

Edited by Person mystery

Share this post


Link to post
Share on other sites
6 hours ago, Person mystery said:

About the zmap footer and the ??? Part, I found out that the length of the ??? Part divided by 8 = the number of objects on the footer = bytes 0C-0F. The footer objects usually have the names: date, mikata, teki, and zoen. Anyone with Japanese knowledge knows what they might mean?

E: I just remembered that ENG Hard/JAP Maniac have autoleveled enemies. Not sure how it works, but MAYBE it can be used to autolevel Tormod and co?

It would be useful to autolevel everyone if we could... To work around this for my hack I decided to raise everyone's starting levels (Muarim 32, Vika 27, Nealuchi 27, Tormod 17, Herons 30) without touching the stats. I then created another patch to increase the stats of these units (along with Geoffrey and Lucia) to be applied at the beginning of Part 4.

 

Edit: I just posted ver. 1 of my hack! Check it out if you would like.

 

 

Edited by brassy

Share this post


Link to post
Share on other sites

If you want to spread a hack around, I suggest using xdelta. The extra work needed on the user is slim when you only changed FE10Data, but if you change a bunch of other files too (zmap, mess, scripts, shops, main.dol, etc) it increases a lot.

Share this post


Link to post
Share on other sites
9 hours ago, Person mystery said:

If you want to spread a hack around, I suggest using xdelta. The extra work needed on the user is slim when you only changed FE10Data, but if you change a bunch of other files too (zmap, mess, scripts, shops, main.dol, etc) it increases a lot.

Thanks Person Mystery! At this time I am unsure if I want to promote it further. So far it seems like a lot of people are skeptical of my changes, and this is fair I guess. It was a personal hack I decided to release.

Share this post


Link to post
Share on other sites

Mess files are what determines the game's texts. All the english ones begin with "e_", with the japanese ones still left on the game for whatever reason. Most texts are stored in e_common, with glossary texts stored in e_dic and the story/base conversations in their relative chapter (e_c[chapter]). Its format is the same as bin files, which I covered here. The Unit Data, Pointer List, and the date section of the Header are missing, which makes the Object List start at 20, Group List right after that (at the address pointed by bytes 04-07) and Footer following it.

Each text is an object referenced in a group. The groups are then recalled by the script before being displayed in the game. For example, the text that shows "EXP" has the name "BMI_EX". For most files, all you need to know is that 00 signifies the end of the object (and also group in this case) while 0A signifies a line change (which can sometimes break the game for reasons unknown).

Conversations are more complicated. I figure out that they always start with 05 46 4C 7C before listing everyone in that particular conversation being separated by 7C before ending with 7C too, after which there's a bunch of stuff I don't understand. 11 10 are used for breaks (where you need to press to continue), 02 65 63 for eyes closed, 02 65 6F for eyes open, and 02 6D 63 2E 2E 2E 02 6D 64 for ellipsis. There are still a bunch more stuff I don't know what they're used for, but this should be a good start to customizing conversation contents.

Share this post


Link to post
Share on other sites

Shop files determines what's sold in shops/bargains. It doesn't determine how much each item is sold/bought for; that one's from FE10Data. It's a .bin file, so it mostly follows the same format as zmap. Obviously, the Unit Data will be different; it's replaced by Shop Data, which has a different format for each type of shops. Each shop in each chapter is part of its own group.

Bytes 00 - 27 are the header. Bytes 20-23 and 24-27 are pointers toward a date and name respectively, but they're never used. The date is the only difference between shopitem_n, shopitem_h and shopitem_m. Which means that all 3 files are basically the same and you can swap them out at your leisure.

Bytes 28 - E3 are part of SHOP_PERSON groups. Each group consists of 4 bytes. In order, they determine who watches over the weapon shop, items shop, selling shop, and forge for that particular chapter. The values are: 1->Muston, 2->Aimee, 3->Jorge, 4->Daniel, 5->Daein, 6->Crimean. Sometimes the value is 0 because they don't expect you to visit that particular shop in this chapter (aka it's normally unavailable).

Bytes E4 - 23A4 are part of WSHOP_ITEMS groups. They determine what's sold in the weapon shops. Each item is represented by a pointer followed by 4 null bytes (00 00 00 00). The length of each group vary, unfortunately, so making a Nightmare module is difficult.

Bytes 23A8 - 2FFB are part of ISHOP_ITEMS groups. They determine what's sold in the item shops, including bargains. Normal items follow the format from WSHOP, but bargain items are not followed by 00 00 00 00. Instead, it's followed by 01 XX 00 00 where XX is an increasing number within that group. I don't know what they do; changing them seems to do nothing. The groups in this section are also not uniformly sized.

Bytes 2FFC - A8EB are part of FSHOP_ITEMS groups. Each group is 720 bytes (2D0 in hex) long. It's a bunch of pointers that follows the pattern MIK->MDV->IID. MIK are the weapon types, and MDV are the weapon materials/tiers. The only weapon I manage to add is Worm; adding another weapon will crash the game. But at least you should be able to enable/disable the other forgeable weapons.

Bytes A8EC - A97F are part of FSHOP_CARD groups. The number of cards is defined in the first 4 bytes (A8EC - A8EF). After that, each card is represented in 12 bytes (C in hex). The first 4 bytes is a pointer toward the MESS name. The 5th is bonus Mt, 6th is bonus Acc, 7th is bonus Crit, 8th is bonus Coins, and 9th is the % chance of getting it. The last 3 bytes are junk data as far as I know.

PS:  @VincentASM Can you update the OP? It is pretty old.

PPS: I made some Python scripts that you can use to check zmap, mess and shop files.

Edited by Person mystery

Share this post


Link to post
Share on other sites

Has anyone successfully added more skills to character blocks instead of just replacing it? 

I understand that adding more skills will require recalculating all pointers, but is it possible to remove a skill from one character in exchange for adding to another. Such that the file size remain unchanged.

Share this post


Link to post
Share on other sites

A decompressed FE10Data has the same file format as a .bin. I explained that file format a few posts above. The important thing in your case is making sure that all the pointers in the data between the skill you add and the skill you remove are properly listed in the Pointer List.

Share this post


Link to post
Share on other sites
On 9/2/2020 at 12:55 AM, 1234567890num said:

Shop files determines what's sold in shops/bargains. It doesn't determine how much each item is sold/bought for; that one's from FE10Data. It's a .bin file, so it mostly follows the same format as zmap. Obviously, the Unit Data will be different; it's replaced by Shop Data, which has a different format for each type of shops. Each shop in each chapter is part of its own group.

Bytes 00 - 27 are the header. Bytes 20-23 and 24-27 are pointers toward a date and name respectively, but they're never used. The date is the only difference between shopitem_n, shopitem_h and shopitem_m. Which means that all 3 files are basically the same and you can swap them out at your leisure.

Bytes 28 - E3 are part of SHOP_PERSON groups. Each group consists of 4 bytes. In order, they determine who watches over the weapon shop, items shop, selling shop, and forge for that particular chapter. The values are: 1->Muston, 2->Aimee, 3->Jorge, 4->Daniel, 5->Daein, 6->Crimean. Sometimes the value is 0 because they don't expect you to visit that particular shop in this chapter (aka it's normally unavailable).

Bytes E4 - 23A4 are part of WSHOP_ITEMS groups. They determine what's sold in the weapon shops. Each item is represented by a pointer followed by 4 null bytes (00 00 00 00). The length of each group vary, unfortunately, so making a Nightmare module is difficult.

Bytes 23A8 - 2FFB are part of ISHOP_ITEMS groups. They determine what's sold in the item shops, including bargains. Normal items follow the format from WSHOP, but bargain items are not followed by 00 00 00 00. Instead, it's followed by 01 XX 00 00 where XX is an increasing number within that group. I don't know what they do; changing them seems to do nothing. The groups in this section are also not uniformly sized.

Bytes 2FFC - A8EB are part of FSHOP_ITEMS groups. Each group is 720 bytes (2D0 in hex) long. It's a bunch of pointers that follows the pattern MIK->MDV->IID. MIK are the weapon types, and MDV are the weapon materials/tiers. The only weapon I manage to add is Worm; adding another weapon will crash the game. But at least you should be able to enable/disable the other forgeable weapons.

Bytes A8EC - A97F are part of FSHOP_CARD groups. The number of cards is defined in the first 4 bytes (A8EC - A8EF). After that, each card is represented in 12 bytes (C in hex). The first 4 bytes is a pointer toward the MESS name. The 5th is bonus Mt, 6th is bonus Acc, 7th is bonus Crit, 8th is bonus Coins, and 9th is the % chance of getting it. The last 3 bytes are junk data as far as I know.

PS:  @VincentASM Can you update the OP? It is pretty old.

PPS: I made some Python scripts that you can use to check zmap, mess and shop files.

It may be important to note that the forge crashes because there are no weapon model files for the colored versions of any other weapons (except slim lance, slim sword, and worm because maybe they were originally supposed to be in the forge, but were removed?) If someone can figure out how the game loads in files, this is most likely done in the main.dol file, and then figure out how the weapon model files are structured, you should theoretically be able to add more forge items to the game. The weapon models are in \xwp, and the forge models are in \xwp\forge
I have spent a little time trying to add weapons to the forge with no success, but I haven't dedicated enough time to claim that it's impossible.

Share this post


Link to post
Share on other sites
On 9/3/2020 at 1:22 AM, FiveOVER said:

Has anyone successfully added more skills to character blocks instead of just replacing it? 

I understand that adding more skills will require recalculating all pointers, but is it possible to remove a skill from one character in exchange for adding to another. Such that the file size remain unchanged.

In FE10Data? Yeah, I made a python script for it a while back but it requires Excel and I think a specific version of Python. It's not the most elegant solution but it did work. But I don't think simply removing from one character and adding to another would work depending what got shifted around.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...