[FE7] Forcing and Banning characters Troubleshooting

Can someone explain to me how the character forcing and banning patches from nintendolord work? I’ve been reading the readmes but they are confusing to me.

At offset $DF1000, you will find a pointer table that determines which characters are forced to a chapter. Each chapter has it’s own pointer. The pointer points to a group of character referance number bytes ending with 00. If the pointer is 00, no characters are forced except the main character. The pointer to the pointer table is at $8DDD4, so you can change it as you wish.

So at DF1000, are the numbers here the IDs for the characters or are they the pointers that point to another spot? Because at DF1000 on my ROM, its all 00s. At 8DDD4, I see a bunch of pointers that point to a table(i assume) right under it but that table has a bunch of values I don’t recognize. So at 8DDD4, what are these? Pointers to chapters or pointers to the characters themselves?

I mean, I get that there is suppose to be a spot of pointers that point to another spot where the characters IDs are at. I don’t understand which one of these is which. Or is it one pointer that points to a table of chapter pointers that point to a table of character IDs?

im tilted

Anyway, the way it works is that at DF1000 is a list of pointers. Currently, they’re all zeroes to signify that there are no forced characters. Each chapter has one word (four bytes) dedicated to it, chapter 0x0 is the first set, chapter 0x1 is the next, etc. What these pointers point to themselves are the list of characters you want to force.

Say I wanted to ban characters 0x1D and 0x2C from chapter 0x12. I would do the following:

Find the correct pointer - 0xDF1000 + 4*0x2C = 0xDF10B0
Change that pointer to my list of characters (I’m going to use 0xD80000 as an example, so I’ll enter 00 00 D8 08)
At 0xD80000, our list consists of 1D 2C 00 (the two characters and then a zero to show that we’re done).

Make sense?

why do I multiple by 0x2C? chapter 12 is 0x0E according to the NMM isn’t it? Or did you mean chapter 18 in hexadecimal? Am I multiplying by the chapter ID in nightmare or is it something else?

If 0xDF1000 is where the table that points the group of character IDs for character forcing, what is 8DDD4 for? It says that is where the pointer to the pointer table, I’m not sure which pointer table its talking about. Is 8DDD4 where I put DF1000 to let the ROM know thats where the table of pointers that point to the list of characters?

i’m sure he meant 0x12

why multiple by 0x2C then? what is 0x2c? but regardless, nothings working for me, i even tried to brute force it and then slowly retrace backwards but nothing. only the main lord is forced, no other characters i put down work.

https://gyazo.com/1eb64a95a0cce5c3e8f1f3184a8b394f

i put down 0xDF1200 for the character list offset and at the bottom you can see the four characters I listed followed by 00.

is it Lynn mode or Eliwood mode? are you sure you installed the patch correctly?

He meant 0xDF1000 + 40x12, not 0xDF1000 + 40x2C. The table begins at DF1000. The 4 is because a pointer is 4 bytes long, and you want the 0x12’th chapter (replace this with whichever chapter you actually want). Then, at that offset, you write a pointer to a list of characters that you want to force.

@Agro my hack is using eliwood mode. is there a wrong way to install the patch? i just use nups and patch it to my rom with ignore.

I want to force some characters at chapter 18 (0x17)
0xDF1000 + 4*0x17 = 0xDF105C, so at DF105C, I put 00 12 DF 08, and at 0xDF1200, I put 01 03 17 18 00.
but the characters are still able to selected and brought on the battlefield.

Chapter 18 would be 0x12. That might be your problem.

i thought 0x12 is chapter 15 Talons Alight, where am I suppose to look for these values? I’m looking at the Chapter Data Editor Module in Nightmare.

https://gyazo.com/49f2e01207e73ce48c26517052a38294

My bad, I thought that chapter 18 was a decimal number and I just converted it to hex. I forgot about gaidens and whatnot. In that case, I don’t actually know anything about this.

cries a little on the inside

PM me a link to your ROM on Discord and I’ll sort this shit out

1 Like

very clever. I like it.

You’re in big trouble, @Rickochet. I don’t know what you did but you didn’t install the patch correctly. In fact, it looks like you didn’t install it at all. When I visit the address $8DD84 I see data that matches a clean ROM of FE7, when that shouldn’t be the case. Please paste-write this at $8DD84:

20 D1 12 48 C1 7E 02 29 0A D0 02 29 02 DC 01 29 03 D0 0A E0 03 29 06 D0 07 E0 03 2C 05 D1 13 E0 01 2C 02 D1 10 E0 02 2C 0E D0 80 7B 08 49 80 00 40 58 00 28 06 D0 01 78 00 29 03 D0 A1 42 03 D0 01 30 F8 E7 00 20 00 E0 01 20 10 BD F8 BB 02 02 00 10 DF 08 36`

In future when I ask if the patch was installed correctly, one thing you can do to check is to open up NUPS and use the “get patch data” function. This will give you a series of addresses where the patch changes data. The window often isn’t big enough so you have to highlight all the text and drag the mouse down (there’s no scroll bar) and copy and paste the data into a text viewer.

Once you have these addresses, patch a clean ROM and visit all the addresses, cross-referencing with your own ROM, and see if there’s any mismatch.

I did use the get patch data, thats why I kept asking what is at DDD84, I have no idea what any of it means. It says Lengths is 1, no clue what this means. Unless I downloaded the wrong patch, I don’t know any way to install a patch wrong with nups.

I’m not sure if the readme files are not up to date but my readme says 8DDD4 and not 8DD84, whether or not we’re talking about the same location I don’t know but this could be why the patch seemingly did nothing. I tried again from backup before I applied the character forcer patch to. Applied the patch, went to DF105C to put 00 12 DF 08 and then to 0x8DF1200 to put 01 03 17 18 00. Went to check and it didn’t work. Not until I put the set of numbers you said to at 8DD84, only then did it work.

So thank you again for taking the time to help me out with this!

EXCUSES EXCUSES

Not sure where you’re getting this from?

8DD84 is where the patch data goes, 8DDD4 is where the pointer to the table goes. It’s not DDD84, it’s 8DDD4. So 0x808DDD4.

Length of 1 means it changed 1 byte there. Length of C means it changed 12 bytes.