Jump to content

FE8: inserting new characters, multiple S ranks


Hellequin
 Share

Recommended Posts

Hey everyone

So first off, I'm relatively new to hacking games and I'm the first one to say that the stuff I've been doing isn't that difficult. However what I want to do is more difficult and I'm getting stumped...the plethora of tutorials and topics out there are very helpful, but many are beyond my scope or lacking somewhere.

Anyway, I'm editing FE8 right now, mostly just tweaking some things that I've never liked about the game; easy stuff like stat caps, promotion branches, items etc. All nightmare stuff. I've also done some palette editing for portraits and sprites, which included some hex work for the lords since they don't have palette pointers. Most recently I've created a custom portrait and sprite palette that I've successfully put into the game just to make sure they work by replacing a character, but I would really like to add an entirely new character to the game. Which brings me to my first stump point.

As I said, I've created the stuff I need for it, but I'm not really sure exactly how to insert a new character into the game. I'm making a mage knight, so no custom animations/classes or anything, just a recoloured battle sprite and a custom portrait, so no issues there. If I can help it I'd really rather not replace any characters. I've heard mention of extra spaces that are just empty, so if that's how it's done I really need info on how to get my new stuff into that area (manual hex editing then adjusting pointers?). Alternatively, I've noticed people talking about modifying events/using the chapter unit editor nightmare module, and on my own I've noticed that nightmare has a lot of empty slots in the character editor module that just have "mountain thief" (bandit I'm pretty sure). Are these available as replacers or are they important for something?That would mean I only have to figure out how to get an extra portrait in as well as the extra battle sprite palette. Plus an event to recruit them I suppose (haven't done this yet, but I think there are a number of tutorials for this). If you just add a unit using events, does that just write all the necessary data to the empty space automatically?

My second question is about weapon ranks, but I suspect it's quite a bit more difficult, if even possible. I've always hated the idea that you can only get one weapon to S through training. For one, it means that for some characters you have to choose which one (staff users especially...), plus it's SUPER annoying when you accidentally hit it when you didn't mean to, or are afraid to use a certain weapon too much even when it would be more beneficial (e.g. In a group of pirates, your cavalier having to use a lance so you don't accidentally level up swords too far). This is especially true for characters who either gain an extra weapon type upon promotion that starts WAAYY lower than the main weapon, or characters that come with base levels much higher (e.g. Duessel with axes up higher than swords/lances, but in that case it's ok because I want him S with axes :P). Anyway, I guess you didn't need the reasoning...is this possible? I know like Athos and Lyon can do it, but it looks like the way that was done was just to give them their own unique classes and set their base rates at S so they're always up there. I would much prefer training there if possible :)

Thanks in advance!! Sorry it was so long-winded!

Link to comment
Share on other sites

Duessel's weapon levels all start the same...

To answer your questions (kinda somewhat): Most of the generic information filled character slots are open for use. If you aren't sure, change an enemy (probably a Prologue Fighter) into that character slot and see what happens to their name and description, or just check what the name data is pointing at. If it's something like 'dummy' then that slot is unused. I can't help much more than that I'm afraid.

As for weapon levels, I think you need to do ASM hacking to change that. I don't know what Lyon has which makes him different.

Link to comment
Share on other sites

Thanks for the reply Tables!

First off, haha my bad, you're right about Duessel. It was his WEAPONS that had the preference for axes (silver axe and steel lance). But not important.

Second, yeah...I was afraid of that. I figured it would have to be something complicated like ASM hacking which I'm going nowhere near, so I suppose I'll just have to live with it.

Third: Ok, so I took your advice and changed around the info for one of the prologue fighters to try and get my guy into the game. I successfully changed his name and portrait as well as his description using FEditor Adv (which led to some interesting effects...soldiers all being named "Leclerc" with a special description since those pointers were apparently generic haha). For the portrait I replaced 0x6E, which was "Novala clone". I don't know if that's actually used for anything (It's Novala, a shaman boss from one of the first few chapters - the one with the hostages for the spider - with a different palette), so if that isn't actually used that would be awesome since I wouldn't have to figure out how to inset a new portrait into empty space.

I haven't figured out how to get his new battle palette in yet though...for now it's generic class default. I did notice some ??? entries in Nightmare though in the battle palette reference module...they have pointers but apparently no one knows what they're for. Can they be safely replaced?

For the rest, I just changed everything in Nightmare (allegiance, level, promoted unit, promoted mounted unit, etc. and used the CUE to put him in in place of the fighter). I also noticed just browsing through Nightmare that after the prologue the bandits in the chapters I looked through all used the same character number, like 0x8E or something, so that's promising for all of those empty spots. I should probably be thorough though and actually go through each chapter and make sure they don't have a special purpose.

Also, I noticed that the character did, in fact, stay with you (chapter 4 - I think - that has the first battle prep screen has him in there...none of the others obv since I didn't add him to the chapter data), but it acted kind of wonky since it considered him a member of the team but nowhere on the map since the chapter data doesn't have him. What I mean is that after everyone was grayed out the turn didn't end because I assume the game thought there was another character still to move. I'll just make sure to put him in sometime after that when we have a prep screen.

SO, if I can get this all to work, all I'll need to do is create an event for his recruitment, probably in the chapter 12-ish range, although it may be easier to put him in either before or after the lord split.

Thanks again for your help...if you know anything more about what I've said please let me know! This is coming along very nicely :)

Link to comment
Share on other sites

update:

Ok so I replaced one of the randomly empty spots with my custom character. 0x1b is the character reference, which for some reason was empty between Dozla and Rennac. There may be an issue here, but I won't know it until I test Eirika's route, so I'll have to replay the beginning chapters to get there. I've looked through most of the chapters in the CUE and haven't found any reference to 0x1b so far though, so I doubt it's anything. I also discovered a portrait that was literally labelled "unused man" in Nightmare, so that's the one I've now replaced with my portrait. I was able to successfully change his name with the FEditor Adv text editor module, but I'm having trouble with the description still.

The description is being weird...between FEditor Adv (FEA from now on) and Nightmare, it seems that there is a discrepancy in the text pointer. In Nightmare, for example, Rennac's description is put at 0x88. In FEA, however, this address is 0288. Nightmare won't allow me to type in 0x288 for the description, and instead outputs in-game what FEA has as 0088, which is like "OFF" or something equally not for character descriptions. I've tried replacing a little-used actual character description (like an NPC that you have to rescue in the chapter with Syrene...17 I think), but again the same thing happens only it uses a different glitchy-looking text.

The other major problem I still can't figure out is how to assign his palette to him. I used one of the two ??? palettes from the battle palette reference module of nightmare and replaced it with his using APE, but I don't know how to point it to him. Since the character slot I used to put him in is apparently a generic character, they don't have a speical palette pointer of their own, they just use default 0x00. I assume what I need to do is hex edit the pointer, but I'm not exactly sure how to do this. More specifically, how can I locate 0x1b character reference in hex and pair it with the palette reference?

Other than that, once I get these working as they should and I'm convinced that I've put him in smoothly without glitches etc or royally messed anything up, I'll start on creating an event for recruitment. But that's down the road, this stuff is more important first. When I do get to it I'm sure I'll have more questions lol.

Any help is greatly appreciated!

Link to comment
Share on other sites

The description is being weird...between FEditor Adv (FEA from now on) and Nightmare, it seems that there is a discrepancy in the text pointer. In Nightmare, for example, Rennac's description is put at 0x88. In FEA, however, this address is 0288. Nightmare won't allow me to type in 0x288 for the description, and instead outputs in-game what FEA has as 0088, which is like "OFF" or something equally not for character descriptions. I've tried replacing a little-used actual character description (like an NPC that you have to rescue in the chapter with Syrene...17 I think), but again the same thing happens only it uses a different glitchy-looking text.

That happens because that Nightmare Module has an error.

Open it in Notepad and.... uh... I don't remember exactly how you fixed that (someone please correct me if I'm wrong), but maybe you just have to edit this:

Description value
2
1 -> change to "2"
NEHU
NULL

again, I'm not 100% sure. Maybe test it around a bit and let me know.

The other major problem I still can't figure out is how to assign his palette to him. I used one of the two ??? palettes from the battle palette reference module of nightmare and replaced it with his using APE, but I don't know how to point it to him. Since the character slot I used to put him in is apparently a generic character, they don't have a speical palette pointer of their own, they just use default 0x00. I assume what I need to do is hex edit the pointer, but I'm not exactly sure how to do this. More specifically, how can I locate 0x1b character reference in hex and pair it with the palette reference?

There should be another Module for that... though it isn't usually included in the standard packs, maybe search around a bit.

Basically there are 3 modules for palettes, one where you should specify which classes your character has (if they don't match the palette(s) won't apply), another that points to the palettes he should use and another one that points to the palettes data in hex.

If I understood correctly, you need the one in the middle right now.

Link to comment
Share on other sites

Omg Alfred you have no idea how much stress you saved me lol. That literally solved my problems in like 10 minutes!

That happens because that Nightmare Module has an error.

Open it in Notepad and.... uh... I don't remember exactly how you fixed that (someone please correct me if I'm wrong), but maybe you just have to edit this:

Description value
2
1 -> change to "2"
NEHU
NULL

again, I'm not 100% sure. Maybe test it around a bit and let me know.

Worked flawlessly...changing that to a 2 allowed me to put in all 3 numbers/letters which linked perfectly to the descriptions, glitchiness-free :D

There should be another Module for that... though it isn't usually included in the standard packs, maybe search around a bit.

Basically there are 3 modules for palettes, one where you should specify which classes your character has (if they don't match the palette(s) won't apply), another that points to the palettes he should use and another one that points to the palettes data in hex.

If I understood correctly, you need the one in the middle right now.

this worked too...found the missing modules here:

http://serenesforest.net/forums/index.php?showtopic=26737

There is a separate folder for battle palette editors in the package that has the modules you mentioned. Part 1 lists what possible classes there are (for me, he's a prepromoted mage knight so just the one), and part 2 asks for the pointer. Since I used the ??? one I just pointed it there and voilà, proper palette.

Thanks so much for your help! Now I'm off to write an event for recruitment...so I'll probably be back lol.

Link to comment
Share on other sites

Open it in Notepad and.... uh... I don't remember exactly how you fixed that (someone please correct me if I'm wrong), but maybe you just have to edit this:

[sNIP]

yeah that's correct

basically whoever wrote the nightmare module accidentally told it that it's only a one byte field when it should actually be a two-byte field so it only lets you edit the last byte

Link to comment
Share on other sites

Omg Alfred you have no idea how much stress you saved me lol. That literally solved my problems in like 10 minutes!

Hey man, I'm glad I was able to help you! =]

yeah that's correct

basically whoever wrote the nightmare module accidentally told it that it's only a one byte field when it should actually be a two-byte field so it only lets you edit the last byte

Oh I see. Well, I suppose that happens. Someone should just correct/gather all the new Modules and upload them somewhere. probably not gonna happen but it would be best for everyone

Link to comment
Share on other sites

Ok, I really appreciate everyone's help with this little endeavour. I've learned a lot!

I have one more question...I've been trying to learn the eventing stuff, but programming with code stuff is really not my forte. I think I've got what I need but I don't know if it's right or where to put it. I know the general protocol is just to try it and play around, but if it is wrong, which it probably is, I would have absolutely no idea how to fix it.

Ok, so I want my character to be recruited in chapter 12 Eirika or chapter 13 for Ephraim. For both chapters, I want the event to occur turn 1, just after the events that naturally occur at this time. The character should spawn in as an ally, (holding an Elfire, Mend, and Elixir) then immediately run up to the tile just beside the lord and initiate the conversation. Since they're already an ally they don't need to be turned or have a special speaking event since it happens right away automatically. This is what I have for Eirika...Ephraim's should be almost exactly the same, except with different coordinates and a different text pointer:

Turn EventPlayer (0x00, LeclercRec, 01)
UNIT 0x1B 0x29 0x00 Level(1,Ally,False) [0, 21] 0x00 0x00 0x01 LeclercRec [0x3A, 0x4C, 0x6D, 0x00] NoAI
LeclercRec:
MUS 0x30
REDA [2, 21] 0x3 0x00 0x20
TEXTSTART
TEXTSHOW 0x839
TEXTEND
REMA
Like I said, it's probably not correct, and I have no idea where to put it. I largely copied from what the game had for the normal beginning scenes and what Alfred posted for Duncan Idaho in his thread, drawing a little from the event hacking for dummies guide by Arch.
Thanks again!
Link to comment
Share on other sites

Ok after brushing up on the stuff in the Event Hacking for Dummies tutorial and rereading some of the codes in the files, I touched up my codes, put them where I thought they should go and attempted to reassemble.

I got this error: Line 134, Column 28: Didn't reach end, currently at Comma(,)

This is where the "UNIT" line is above. I put the blank unit line after it and made it a separate event that is called by the TURN event, and then calls the LeclercRec event, but otherwise didn't change it. Column 28 happens to be right where the first comma is in the Level section. This is exactly the same format as I have been seeing, so I don't know what is wrong.

In case you need it, here are the various pieces that I added in:
TurnEventPlayer (0x00, LoadLeclerc, 01)
LoadLeclerc:
UNIT 0x1B 0x29 0x00 Level(1,Ally,False) [0, 21] 0x00 0x00 0x01 LeclercRec [0x3A, 0x4C, 0x6D, 0x00] NoAI
UNIT
LeclercRec:
MUS 0x30
REDA [2, 21] 0x3 0x00 0x20
CAM1 Eirika
TEXTSTART
TEXTSHOW 0x839
TEXTEND
REMA
ENDA
Edited by Hellequin
Link to comment
Share on other sites

Hellequin, spaces and caps are very important in events!

Also, there are some mistakes there. "LeclercRec" just can't work like that, because the command for repositioning works, in fact, only for repositioning.

I'll fix this for you, pay attention to what I do and don't make the same mistakes again, ok?

TurnEventPlayer(0x00,LeclercRec,01)
 
LoadLeclerc:
UNIT 0x1B 0x29 0x00 Level(1,Ally,False) [0,21] 0x00 0x00 0x01 LeclercRepo [0x3A,0x4C,0x6D,0x00] NoAI
UNIT


LeclercRepo:
REDA [2,21] 0b 0x1 0x0 0


LeclercRec:
MUS1 0x30
_LOAD1 0x1 LoadLeclerc
ENUN// this makes the game wait until the movement(s) is done before executing the events that come next
CAM1 Eirika
TEXTSTART
TEXTSHOW 0x839
TEXTEND
REMA
_0x0228 0x7//this code is always needed to end events. Otherwise in FE8 you get a random FADU effect
ENDA
Edited by Alfred Kamon
Link to comment
Share on other sites

Thanks again, Alfred. You're a huge help...I really owe you one. I didn't know about that stuff you mentioned but I won't forget it in the future.

I'm still getting the comma error though. Maybe I disassembled wrong or something but I don't think so. Now it's saying Line 140 is the bad line, which is where the TurnEventPlayer line is. It's stopping at the comma for some reason...last time it was the UNIT line, but all that stuff is at the bottom now so it isn't making it that far. Any suggestions? I've seen numerous posts about this on the EA board but I haven't seen a definitive answer as to what causes it. If I change that line to the raw code version instead of the macro version then the UNIT line becomes problematic again...I've copy/pasted your lines.

Edited by Hellequin
Link to comment
Share on other sites

here you go :)


/////////////////////////////////////////////////////////////
// //
// Disassembled with Nintenlord's Event Assembler //
// Version: 9.10.4713.28131 //
// Game: FE8 //
// File: Fire Emblem - the Sacred Stones_HellequinHack.GBA //
// Offset: $9E94E8 //
// //
/////////////////////////////////////////////////////////////



ORG $591F40
label26:
_0x1020 0x1
_0x0220 0x2
_0x0320 0x8
_SETCONDITION 0x0 0xC 0x0
FADU 16
ENIF 0x0
_0x1020 0x0
ENDA

label15:
_0x1020 0x1
_0x0220 0x2
_0x0320 0x8
_SETCONDITION2 0x0 0xC 0x0
FADI 16
ENIF 0x0
_0x1020 0x0
ENDA

//The next line is for re-assembling purposes. Do not delete!
MESSAGE Original ending offset is $591F88 and the new ending offset is CURRENTOFFSET

ORG $591FD8
label33:
CALL label15
_0x2220
_0x3E20
_0x2220
ENDA

//The next line is for re-assembling purposes. Do not delete!
MESSAGE Original ending offset is $591FF0 and the new ending offset is CURRENTOFFSET

ORG $592104
label23:
_0x1020 0x4
ASMC 0x85375
ENDA

//The next line is for re-assembling purposes. Do not delete!
MESSAGE Original ending offset is $592114 and the new ending offset is CURRENTOFFSET

ORG $8BA170
Units1:
UNIT 0x1 0x2 0x0 0x50 [1,21] 0b 0x0 0x0 0x0 [0x9,0x6C,0x6C,0x0] [0x0,0x0,0x0,0x0]
UNIT 0x17 0x27 0x0 0x8 [1,20] 0b 0x0 0x0 0x0 [0x3A,0x39,0x0,0x0] [0x0,0x0,0x0,0x0]
UNIT 0x2 0x7 0x0 0x50 [2,22] 0b 0x0 0x0 0x0 [0x17,0x6C,0x6C,0x0] [0x0,0x0,0x0,0x0]
UNIT 0x2 0x7 0x0 0x50 [4,23] 0b 0x0 0x1 0x8BA040 [0x17,0x6C,0x6C,0x0] [0x0,0x0,0x0,0x0]
UNIT 0x2 0x7 0x0 0x50 [4,24] 0b 0x0 0x0 0x0 [0x17,0x6C,0x6C,0x0] [0x0,0x0,0x0,0x0]
UNIT 0x2 0x7 0x0 0x50 [3,23] 0b 0x0 0x0 0x0 [0x17,0x6C,0x6C,0x0] [0x0,0x0,0x0,0x0]
UNIT 0x2 0x7 0x0 0x50 [1,23] 0b 0x0 0x0 0x0 [0x17,0x6C,0x6C,0x0] [0x0,0x0,0x0,0x0]
UNIT 0x15 0x4D 0x0 0x50 [3,21] 0b 0x0 0x0 0x0 [0x6C,0x0,0x0,0x0] [0x0,0x0,0x0,0x0]
UNIT 0x2 0x7 0x0 0x50 [0,22] 0b 0x0 0x0 0x0 [0x17,0x6C,0x6C,0x0] [0x0,0x0,0x0,0x0]
UNIT 0x2 0x7 0x0 0x50 [0,20] 0b 0x0 0x0 0x0 [0x17,0x6C,0x6C,0x0] [0x0,0x0,0x0,0x0]
UNIT 0x2 0x7 0x0 0x50 [2,20] 0b 0x0 0x0 0x0 [0x17,0x6C,0x6C,0x0] [0x0,0x0,0x0,0x0]
UNIT 0x2 0x7 0x0 0x50 [4,21] 0b 0x0 0x0 0x0 [0x17,0x6C,0x6C,0x0] [0x0,0x0,0x0,0x0]
UNIT

label31:
UNIT 0x50 0x5E 0x0 0x4C [12,2] 10b 0x0 0x0 0x0 [0x25,0x2E,0x0,0x0] [0x3,0x3,0xC,0x0]
UNIT 0xBB 0x63 0x0 0x4D [11,28] 0b 0x0 0x0 0x0 [0x14,0x0,0x0,0x0] [0x0,0x3,0xC,0x0]
UNIT 0xBB 0x63 0x0 0x55 [16,26] 0b 0x0 0x0 0x0 [0x14,0x1C,0x0,0x0] [0x0,0x3,0xC,0x0]
UNIT 0xBB 0x63 0x0 0x4D [15,14] 0b 0x0 0x1 0x8BA048 [0x14,0x0,0x0,0x0] [0x0,0x3,0xC,0x0]
UNIT 0xBB 0x63 0x0 0x4D [14,14] 0b 0x0 0x1 0x8BA050 [0x14,0x0,0x0,0x0] [0x0,0x3,0xC,0x0]
UNIT 0xBB 0x63 0x0 0x4D [18,1] 0b 0x0 0x0 0x0 [0x16,0x0,0x0,0x0] [0x0,0x3,0xC,0x0]
UNIT 0xBB 0x63 0x0 0x4D [18,3] 0b 0x0 0x0 0x0 [0x16,0x0,0x0,0x0] [0x0,0x3,0xC,0x0]
UNIT 0xB0 0x58 0x0 0x55 [13,26] 0b 0x0 0x0 0x0 [0x8B,0x0,0x0,0x0] [0x0,0x0,0xC,0x0]
UNIT 0xB0 0x58 0x0 0x4D [16,14] 0b 0x0 0x0 0x0 [0x8B,0x0,0x0,0x0] [0x0,0x0,0xC,0x0]
UNIT 0xB0 0x58 0x0 0x55 [3,4] 0b 0x0 0x0 0x0 [0x8B,0x0,0x0,0x0] [0x0,0x0,0xC,0x0]
UNIT 0xB0 0x58 0x0 0x4D [16,3] 0b 0x0 0x0 0x0 [0xAF,0x0,0x0,0x0] [0x0,0x0,0xC,0x0]
UNIT 0xB0 0x58 0x0 0x4D [7,14] 0b 0x0 0x1 0x8BA058 [0x8B,0x0,0x0,0x0] [0x0,0x0,0xC,0x0]
UNIT 0xB0 0x58 0x0 0x4D [14,29] 0b 0x0 0x0 0x0 [0xAF,0x0,0x0,0x0] [0x0,0x0,0xC,0x0]
UNIT 0xB3 0x5B 0x0 0x4D [18,19] 0b 0x0 0x1 0x8BA060 [0xB1,0x0,0x0,0x0] [0x0,0x3,0xC,0x0]
UNIT 0xB3 0x5B 0x0 0x55 [18,20] 0b 0x0 0x1 0x8BA068 [0xB1,0x0,0x0,0x0] [0x0,0x3,0xC,0x0]
UNIT 0xB3 0x5B 0x0 0x4D [8,14] 0b 0x0 0x1 0x8BA070 [0xB1,0x0,0x0,0x0] [0x0,0x3,0xC,0x0]
UNIT 0xB7 0x5F 0x0 0x4D [1,10] 0b 0x0 0x0 0x0 [0xB3,0x0,0x0,0x0] [0x0,0x3,0xC,0x0]
UNIT 0xAC 0x54 0x0 0x3D [10,3] 0b 0x0 0x0 0x0 [0x3,0x0,0x0,0x0] [0x0,0x3,0x4,0x0]
UNIT 0xAC 0x54 0x0 0x3D [13,3] 0b 0x0 0x0 0x0 [0x16,0x0,0x0,0x0] [0x3,0x3,0x4,0x0]
UNIT 0xB7 0x5F 0x0 0x4D [2,12] 0b 0x0 0x0 0x0 [0xB3,0x0,0x0,0x0] [0x0,0x3,0xC,0x0]
UNIT 0xB7 0x5F 0x0 0x4D [5,5] 0b 0x0 0x0 0x0 [0xB3,0x0,0x0,0x0] [0x0,0x3,0xC,0x0]
UNIT 0xB7 0x5F 0x0 0x4D [8,6] 0b 0x0 0x0 0x0 [0xB3,0x0,0x0,0x0] [0x0,0x3,0xC,0x0]
UNIT 0xAA 0x52 0x0 0x55 [9,25] 0b 0x0 0x1 0x8BA078 [0xAD,0x0,0x0,0x0] [0x0,0x0,0xC,0x0]
UNIT 0xAA 0x52 0x0 0x55 [10,25] 0b 0x0 0x1 0x8BA080 [0xAD,0x0,0x0,0x0] [0x0,0x3,0xC,0x0]
UNIT 0xB5 0x5D 0x0 0x4D [12,5] 0b 0x0 0x0 0x0 [0x20,0x0,0x0,0x0] [0x0,0x3,0xC,0x0]
UNIT 0xB5 0x5D 0x0 0x4D [19,11] 0b 0x0 0x0 0x0 [0x20,0x0,0x0,0x0] [0x0,0x3,0xC,0x0]
UNIT 0xB3 0x5B 0x0 0x45 [10,8] 0b 0x0 0x0 0x0 [0xB1,0x0,0x0,0x0] [0x0,0x3,0xC,0x0]
UNIT 0xB3 0x5B 0x0 0x45 [12,8] 0b 0x0 0x0 0x0 [0xB1,0x0,0x0,0x0] [0x0,0x3,0xC,0x0]
UNIT 0xB0 0x58 0x0 0x55 [3,0] 0b 0x0 0x0 0x0 [0xAF,0x0,0x0,0x0] [0x0,0x0,0xC,0x0]
UNIT 0xB0 0x58 0x0 0x55 [17,0] 0b 0x0 0x0 0x0 [0x8B,0x0,0x0,0x0] [0x0,0x0,0xC,0x0]
UNIT 0xAB 0x53 0x0 0x25 [18,5] 0b 0x0 0x0 0x0 [0xAE,0x0,0x0,0x0] [0x3,0x3,0x4,0x0]
UNIT

label35:
UNIT 0xAA 0x52 0x0 0x55 [7,12] 0b 0x0 0x0 0x0 [0xAD,0x0,0x0,0x0] [0x0,0x3,0xC,0x0]
UNIT

//The next line is for re-assembling purposes. Do not delete!
MESSAGE Original ending offset is $8BA51C and the new ending offset is CURRENTOFFSET

ORG $8BA5D0
label36:
UNIT 0x18 0x3E 0x1 0x8 [5,12] 0b 0x0 0x1 0x8BA0C0 [0x38,0x5C,0x6C,0x0] [0x0,0x0,0x0,0x0]
UNIT

label30:
UNIT 0x17 0x27 0x0 0x8 [0,21] 0b 0x0 0x1 0x8BA0C8 [0x3A,0x39,0x0,0x0] [0x0,0x0,0x0,0x0]
UNIT 0xB 0x1B 0x0 0x8 [0,22] 0b 0x0 0x1 0x8BA0D0 [0x0,0x0,0x0,0x0] [0x0,0x0,0x0,0x0]
UNIT 0x19 0x4B 0x0 0x8 [0,21] 0b 0x0 0x1 0x8BA0D8 [0x0,0x0,0x0,0x0] [0x0,0x0,0x0,0x0]
UNIT 0x2 0x7 0x0 0x8 [0,22] 0b 0x0 0x1 0x8BA0E0 [0x0,0x0,0x0,0x0] [0x0,0x0,0x0,0x0]
UNIT 0x1 0x2 0x0 0x8 [0,20] 0b 0x0 0x1 0x8BA0E8 [0x0,0x0,0x0,0x0] [0x0,0x0,0x0,0x0]
UNIT

label34:
UNIT 0x18 0x3E 0x1 0x8 [12,5] 0b 0x0 0x3 0x8BA0F0 [0x0,0x0,0x0,0x0] [0x0,0x0,0x0,0x0]
UNIT 0xC5 0x52 0x0 0x55 [12,4] 0b 0x0 0x3 0x8BA108 [0x0,0x0,0x0,0x0] [0x0,0x3,0xC,0x0]
UNIT

_0x0228 0x7//this code is always needed to end events. Otherwise in FE8 you get a random FADU effect
ENDA

//The next line is for re-assembling purposes. Do not delete!
MESSAGE Original ending offset is $8BA6AC and the new ending offset is CURRENTOFFSET

ORG $9E9450
TurnBasedEvents:
TURN 0x7 label16 [1,255] 0x0
TURN 0x8 label17 [1,255] 0x0
TurnEventPlayer(0x00,LeclercRec,01)
END_MAIN

CharacterBasedEvents:
END_MAIN

LocationBasedEvents:
LOCA 0x0 label18 [6,10] 0x10
LOCA 0x0 label19 [5,12] 0x10
SHOP 0x0 label20 [17,6] 0x17
END_MAIN

MiscBasedEvents:
AFEV 0x3 EndingScene 0x6
AREA 0x9 label21 [8,0] [19,9]
AREA 0xA label22 [0,10] [19,15]
AREA 0xA label22 [0,0] [7,9]
AFEV 0x0 label23 0x65
END_MAIN

Dunno1:
END_MAIN

Dunno2:
END_MAIN

Dunno3:
END_MAIN

Tutorial:
END_MAIN

PointerList:
POIN TurnBasedEvents
POIN CharacterBasedEvents
POIN LocationBasedEvents
POIN MiscBasedEvents
POIN Dunno1 Dunno2 Dunno3 Tutorial
POIN Traps1 Traps2
POIN Units1 Units1
POIN $0 $0 $0
POIN $0 $0 $0
POIN BeginningScene EndingScene

//The next line is for re-assembling purposes. Do not delete!
MESSAGE Original ending offset is $9E9538 and the new ending offset is CURRENTOFFSET

ORG $9ED826
label20:
SHLI 0x38 0x39 0x3F 0x40 0x4B 0x4C 0x50 0x6C 0x6D 0x6E 0x6F

//The next line is for re-assembling purposes. Do not delete!
MESSAGE Original ending offset is $9ED83E and the new ending offset is CURRENTOFFSET

ORG $9ED9E1
Traps1:
ENDTRAP

//The next line is for re-assembling purposes. Do not delete!
MESSAGE Original ending offset is $9ED9E2 and the new ending offset is CURRENTOFFSET

ORG $9EDEB4
Traps2:
ENDTRAP

//The next line is for re-assembling purposes. Do not delete!
MESSAGE Original ending offset is $9EDEB5 and the new ending offset is CURRENTOFFSET

ORG $9EE1B8
label38:
_0x3325 0xFFFF
_SETCONDITION 0x0 0xC 0x2
CALL label24
ENIF 0x0
ENDA

label24:
_0x1929
_0x0620 0xC2
_0x0221 0xFFFF
_0x0228 0x7
ENDB

label25:
_SETCONDITION 0x0 0xC 0x0
_LOAD_WHATEVER 0x1
ENUN
ELSE 0x1
ENIF 0x0
_LOAD_WHATEVER 0x0
ENUN
ENIF 0x1
ENDA

//The next line is for re-assembling purposes. Do not delete!
MESSAGE Original ending offset is $9EE218 and the new ending offset is CURRENTOFFSET

ORG $9EE248
label32:
_0x1927
_SETCONDITION2 0x0 0xC 0x0
_0x1922
_SETCONDITION 0x0 0xC 0x0
_0x0620 0x3C
CALL label25
ENIF 0x0
ENDA

label27:
_0x1020 0x4
CALL label26
_0x0228 0x9
_LOAD_WHATEVER 0x1
ENUN
_0x0220 0x9
_0x1020 0x0
ENDA

label39:
_0x1927
_SETCONDITION2 0x0 0xC 0x0
_0x1922
_SETCONDITION 0x0 0xC 0x0
CALL label27
ENIF 0x0
ENDA

label29:
_0x0320 0x8
_SETCONDITION2 0x80BD 0xC 0x0
FADI 16
ENIF 0x80BD
TEXTSTART
_0x2220
FADU 16
ENDA

label28:
_0x0320 0x8
_SETCONDITION2 0x80D2 0xC 0x0
FADI 16
ENIF 0x80D2
_0x1A21
_0x2140 0xFFFF 0x0 0x0
FADU 16
ENDA

label37:
CALL label28
_0x0620 0x32
TEXTSHOW 0xFFFF
TEXTEND
CALL label29
ENDA

//The next line is for re-assembling purposes. Do not delete!
MESSAGE Original ending offset is $9EE330 and the new ending offset is CURRENTOFFSET

ORG $9F4F88
BeginningScene:
MUS1 0x47
_LOAD2 0x1 label30
ENUN
CUMO 0x1
STAL 60
CURE
TEXTSTART
TEXTSHOW 0xA56
TEXTEND
_0x1326 0x7FFF
TEXTCONT
TEXTEND
REMA
CAM1 [10,20]
_LOAD1 0x1 label31
ENUN
_SETVAL 0x2 0x88BA6AC
_SETVAL 0x3 0x1
CALL label32
CUMO 0x2
STAL 60
CURE
MUS1 0x25
TEXTSTART
TEXTSHOW 0xA57
TEXTEND
REMA
FADI 16
_LOAD1 0x0 Units1
ENUN
CALL label33
_0x1324 0x7FFF
CAM1 [7,21]
FADU 16
CUMO 0x17
STAL 60
CURE
MUS1 0xA
TEXTSTART
TEXTSHOW 0xA58
TEXTEND
REMA
CAM1 [9,11]
_LOAD2 0x1 label34
ENUN
CUMO 0x18
STAL 60
CURE
TEXTSTART
TEXTSHOW 0xA59
TEXTEND
REMA
_SETVAL 0xD 0x0
_SETVAL 0x1 0x2C9
_SAVEFORBATTLE
_SETVAL 0x1 0x0
_SAVEFORBATTLE
_SETVAL 0x1 0x309
_SAVEFORBATTLE
_SETVAL 0x1 0x0
_SAVEFORBATTLE
_SETVAL 0x1 0x305
_SAVEFORBATTLE
_SETVAL 0x1 0x0
_SAVEFORBATTLE
_MOVE3 0x0 0x18 0x0
_SETVAL 0xD 0x0
_SETVAL 0x1 0x2CB
_SAVEFORBATTLE
_SETVAL 0x1 0x0
_SAVEFORBATTLE
_SETVAL 0x1 0x2C9
_SAVEFORBATTLE
_SETVAL 0x1 0x0
_SAVEFORBATTLE
_SETVAL 0x1 0x309
_SAVEFORBATTLE
_SETVAL 0x1 0x0
_SAVEFORBATTLE
_SETVAL 0x1 0x306
_SAVEFORBATTLE
_SETVAL 0x1 0x0
_SAVEFORBATTLE
_MOVE3 0x0 0xC5 0x0
ENUN
DISA 0x18
STAL 30
_MOVE 0x8 0xC5 [7,12]
ENUN
CUMO [5,12]
STAL 60
CURE
_SETVAL 0x2 0x1
CALL label28
MUNO
TEXTSHOW 0xA5A
TEXTEND
REMA
MUSI
FADI 16
_0x2220
DISA 0xC5
_LOAD1 0x1 label35
ENUN
_0x0229 0x7
_0x0229 0x8
_0x0228 0x7
ENDA

EndingScene:
MUS1 0x31
FADI 16
_0x342A 0x0
_0x342C 0x0
_0x342B 0x0
_0x3320 0x18
_SETCONDITION2 0x2 0xC 0x0
_0x3322 0x17
_SETCONDITION 0x0 0xC 0x0
_SETVAL 0x2 0x1
CALL label28
TEXTSHOW 0xA5B
TEXTEND
ELSE 0x1
ENIF 0x0
_0x3322 0x15
_SETCONDITION 0x2 0xC 0x0
_SETVAL 0x2 0x1
CALL label28
TEXTSHOW 0xA5C
TEXTEND
ENIF 0x1
FADI 16
_LOAD1 0x1 label36
ENUN
ENIF 0x2
_0x2220
CAM1 [12,4]
FADU 16
STAL 15
CUMO [12,1]
STAL 60
CURE
_0x3322 0x17
_SETCONDITION 0xA 0xC 0x0
_SETVAL 0x2 0x4
CALL label28
TEXTSHOW 0xA5D
TEXTEND
REMA
_0x1324 0x7FFF
FADI 16
_SETVAL 0x2 0x1
CALL label28
MUS1 0x2B
TEXTSHOW 0xA5E
TEXTEND
_0x1324 0x7FFF
_0x0E23 0x20
MUS1 0x32
TEXTCONT
TEXTEND
REMA
FADI 4
_SETVAL 0x2 0x3
CALL label28
TEXTSHOW 0xA5F
TEXTEND
REMA
ELSE 0xB
ENIF 0xA
MUS1 0x32
_SETVAL 0x2 0x3
CALL label28
TEXTSHOW 0xA60
TEXTEND
REMA
_0x1324 0x7FFF
FADI 16
_SETVAL 0x2 0x1
CALL label28
MUS1 0x2B
TEXTSHOW 0xA61
TEXTEND
_0x1324 0x7FFF
_0x0E23 0x20
MUS1 0x32
TEXTCONT
TEXTEND
REMA
FADI 4
_SETVAL 0x2 0x3
CALL label28
TEXTSHOW 0xA62
TEXTEND
REMA
ENIF 0xB
_0x0229 0x74
MNCH 0xD
ENDA

label18:
MUNO
_SETVAL 0x2 0x1
_SETVAL 0x3 0xA63
CALL label37
MUSI
CALL label26
_SETVAL 0x3 0x59
_GIVEITEMTO 0xFFFF
_0x2720 0x2
_0x0228 0x7
ENDA

label19:
MUS2 0x30
STAL 33
ENIF 0x0
_0x2E21
_SETVAL 0x7 0x1
_SETCONDITION 0x1 0xC 0x7
_SETVAL 0x7 0x17
_SETCONDITION 0x2 0xC 0x7
_SETVAL 0x7 0x15
_SETCONDITION 0x3 0xC 0x7
_SETVAL 0x2 0x1
_SETVAL 0x3 0xA67
CALL label37
ELSE 0x9
ENIF 0x1
_SETVAL 0x2 0x1
_SETVAL 0x3 0xA64
CALL label37
ELSE 0x9
ENIF 0x2
_SETVAL 0x2 0x1
_SETVAL 0x3 0xA65
CALL label37
ELSE 0x9
ENIF 0x3
_SETVAL 0x2 0x1
_SETVAL 0x3 0xA66
CALL label37
ENIF 0x9
_LOAD1 0x1 label36
ENUN
_0x2720 0x3
MURE 0x2
_0x0228 0x7
ENDA

label21:
_SETVAL 0x2 0x0
CALL label38
_0x0221 0x7
_0x0228 0x7
ENDA

label16:
_SETVAL 0x2 0x88BA51C
CALL label27
_SETVAL 0x2 0x88BA7C4
CALL label39
_0x0228 0x7
ENDA

label22:
_SETVAL 0x2 0x0
CALL label38
_0x0221 0x8
_0x0228 0x7
ENDA

label17:
_SETVAL 0x2 0x88BA738
CALL label27
_SETVAL 0x2 0x88BA7EC
CALL label39
_SETVAL 0x2 0x88BA788
CALL label27
_SETVAL 0x2 0x88BA580
CALL label27
_0x0228 0x7
ENDA

LoadLeclerc:
UNIT 0x1B 0x29 0x00 Level(01,Ally,False) [0,21] 0x00 0x00 0x01 LeclercRepo [0x3A,0x4C,0x6D,0x00] NoAI
UNIT

LeclercRepo:
REDA [2,21] 0b 0x1 0x0 0

LeclercRec:
MUS1 0x30
_LOAD1 0x1 LoadLeclerc
ENUN// this makes the game wait until the movement(s) is done before executing the events that come next
CAM1 Eirika
TEXTSTART
TEXTSHOW 0x839
TEXTEND
REMA
_0x0228 0x7//this code is always needed to end events. Otherwise in FE8 you get a random FADU effect
ENDA

//The next line is for re-assembling purposes. Do not delete!
MESSAGE Original ending offset is $9F552C and the new ending offset is CURRENTOFFSET

Thanks again, Alfred. Just in case something looks messed up, this is supposed to be Eirika Chapter 12 (Village of Silence). The text pointers all seem correct so it should be the correct chapter.

The Leclerc Events that you fixed for me are all right at the bottom, line 588, and the Turn event is at 143.

Edited by Hellequin
Link to comment
Share on other sites

You're using a macro (TurnEventPlayer) but you haven't included the line that tells the Assembler to read the standard EA library.

Just paste this at the beginning of the file:

#include EAstdlib.event

Also it won't read your changes right now because you haven't included this either:

EventPointerTable(0x??,PointerList)

Just paste this below the other code.

Go to the event pointer table editor in Nightmare and search the number corresponding to the "events in chapter 12", then insert that byte in place of those question marks.

Edit: Ah, if you insert those events I'm 100% sure they'll break the game. Look at where you're inserting the stuff.

The last ORG is this:

ORG $9F4F88

and according to the last line:

MESSAGE Original ending offset is $9F552C and the new ending offset is CURRENTOFFSET

It means the events included between those two lines usually end at 0x89F552C, but if you insert more stuff there, then they will end later, overwriting some precious stuff.

What do you do, then?

Just create an extra ORG pointing to free space and place your adds there.

Where is free space in FE8? Check "Free Space.txt" which should be coming with FEeditor.

ORG 0x??????
*insert your stuff here*
MESSAGE Current events end at CURRENTOFFSET
Edited by Alfred Kamon
Link to comment
Share on other sites

Lifesaver again. Thanks so much...like I said this coding crap isn't my forte. I know it lets you do pretty much whatever you want and is totally necessary for any competent hack, but it's just not up my alley lol. Anyway it assembled without a hitch after the changes. Thanks so much!!

Just to be sure...the changes look like this:

1) Right at the top of the file just after the title box

#include EAstdlib.event
EventPointerTable(0x37,PointerList)
2)All the other crap at the bottom
ORG 0x00B2A610
TurnBasedEvents:
TurnEventPlayer(0x00,LeclercRec,01)
TURN
Now just to get to chapter 12 to test it and see if my FEditor texting stuff worked :)
LoadLeclerc:
UNIT 0x1B 0x29 0x00 Level(01,Ally,False) [0,21] 0x00 0x00 0x01 LeclercRepo [0x3A,0x4C,0x6D,0x00] NoAI
UNIT
LeclercRepo:
REDA [2,21] 0b 0x1 0x0 0
LeclercRec:
MUS1 0x30
_LOAD1 0x1 LoadLeclerc
ENUN// this makes the game wait until the movement(s) is done before executing the events that come next
CAM1 Eirika
TEXTSTART
TEXTSHOW 0x839
TEXTEND
REMA
_0x0228 0x7//this code is always needed to end events. Otherwise in FE8 you get a random FADU effect
ENDA
//The next line is for re-assembling purposes. Do not delete!
MESSAGE Original ending offset is $00B2A610 and the new ending offset is CURRENTOFFSET
Edited by Hellequin
Link to comment
Share on other sites

ORG 0x00B2A610
TurnBasedEvents:
TurnEventPlayer(0x00,LeclercRec,01)
TURN

whelp, you can't do that, there can only be one "TurnBasedEvents". I assume you kept the original one, right?

Just transfer the original down there and add your personal TURN event. Removing things from their original places won't break anything, it's just adding that could be dangerous.

Edited by Alfred Kamon
Link to comment
Share on other sites

lol ahh, good ole' FE name calling. classic.

Anyway, thanks again. I told you this wasn't my thing. Well, I figured since you couldn't add there you'd have to put it into the custom stuff going into free space. Then I figured that since it was "closed" (i.e. with END_MAIN)in the normal area above you couldn't just have the solitary "Turn" line, so I figured you'd have to re-call the turn part. Believe it or not I took an introductory programming class in high school lol. But that was with Turing I think, which is far more black and white than all this macro stuff. If you wanted a variable/macro, you had to define it yourself with like, math equations essentially. You couldn't just say "define" or whatever, and you'd have to tell it if it was string or boolean or whatever. And if a loop was closed you would have to reopen it or add to it if you wanted to make an edit like this one. Idk, it's been a while, but that's my logic for that. I know programming has made serious improvements since then so it's pretty far over my head now.

I guess you didn't really need the logic behind it but there you go. Thanks again for all of your help...I'll let you know how it turns out. Then to adapt it to Ephraim, but that should just be coordinates and a different text pointer.

Link to comment
Share on other sites

Sure, let me know! ^^ And yup, your guesses were right. You did well replacing the END_MAINs.

And thanks for the little lesson, it was quite entertaining, haha! ^^ I didn't do any programming back in high school so all this stuff is new for me

'Later!

Link to comment
Share on other sites

With those tweaks it worked flawlessly. I moved the Cam up to the top of the event because he was loading and moving before it had faded back in after Ewan's event. I also added a cursor flash on him before the conversation to make it more noticeable. I also moved his loading position up to the top spot so that he moved more than two spaces. Otherwise I had a couple of sprite and text touch-ups but it's all good now. Thanks so much for all of your help again. It's not common that someone is willing to go that out of their way for you to help you out. I know it must be frustrating to deal with noobs like myself. So thanks. Not that I'd likely ever be much assistance to you, but if you did need anything just let me know.

Link to comment
Share on other sites

Oh, I'm glad everything worked! :)

And don't worry, I'm just happy to help people, especially if they're like you, haha! I don't find it frustrating at all honestly, what's most frustrating is when you write a lot to help someone and then that someone doesn't apply enough. It makes me feel I've wasted my time for someone who doesn't even care about his own stuff, or who isn't willing to put much effort in it. You're doing your own job here, and that's enough to repay me.

Cheers!

Link to comment
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.

 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...