Jump to content

Event Hacking for Dummies (2nd Edition)


Arch
 Share

Recommended Posts

Alright, I've removed "Pierce" from that list of actions (since, as you said, it's not actually an action).

If Nintenlord adds Poison and DevilReversal macros, I could add those to the command list for FE8 battles as well.

Link to comment
Share on other sites

  • Replies 56
  • Created
  • Last Reply

Top Posters In This Topic

Alright, I've removed "Pierce" from that list of actions (since, as you said, it's not actually an action).

If Nintenlord adds Poison and DevilReversal macros, I could add those to the command list for FE8 battles as well.

[8:54:22 PM] shadowofchaos725 (Rey): #define Pierce(combatantNumber,damage) "_SETVAL 1 combatantNumber+damage*0x100+0xC0000000; _SAVEFORBATTLE"

[8:54:28 PM] shadowofchaos725 (Rey): That's Pierce under "Unit Helpers"

[8:55:03 PM] shadowofchaos725 (Rey): it's probably something like this

[8:55:30 PM] shadowofchaos725 (Rey): #define Poison(combatantNumber,damage) "_SETVAL 1 combatantNumber+damage*0x100+0x400000; _SAVEFORBATTLE"

[8:56:02 PM] shadowofchaos725 (Rey): #define DevilReversal(combatantNumber,damage) "_SETVAL 1 combatantNumber+damage*0x100+0x800000; _SAVEFORBATTLE"

So add it in the Unit Helpers file in the EA Standard Library Folder under "#ifdef _FE8_" ... at least until Nintenlord's next release if you want to use it:

#define Poison(combatantNumber,damage) "_SETVAL 1 combatantNumber+damage*0x100+0x400000; _SAVEFORBATTLE"

#define DevilReversal(combatantNumber,damage) "_SETVAL 1 combatantNumber+damage*0x100+0x800000; _SAVEFORBATTLE"

Edited by shadowofchaos
Link to comment
Share on other sites

Alright, if someone can supply all the macros for FE8 fixed battles, then I'll add them (I don't like adding incomplete support and my FE8 fixed battle knowledge is limited). I'd also prefer if the macros were similar to the FE6 and FE7 cases:

#define AttackerHit(damage,lastAttack)
#define DefenderHit(damage,lastAttack) 
#define AttackerPoison(damage,lastAttack) 
#define DefenderPoison(damage,lastAttack)
#define AttackerHurtItself(damage,lastAttack)
#define DefenderHurtItself(damage,lastAttack)
#define AttackerMiss(lastAttack) 
#define DefenderMiss(lastAttack) 
#define AttackerCritical(damage,lastAttack)
#define DefenderCritical(damage,lastAttack) 
#define AttackerNoDamage(lastAttack) 	
#define DefenderNoDamage(lastAttack) 	
#define AttackerSilencer(lastAttack,targetHP) 
#define DefenderSilencer(lastAttack,targetHP)
#define AttackerPierce(damage,lastAttack) 
#define DefenderPierce(damage,lastAttack)
#define AttackerSureShot(damage,lastAttack) 
#define DefenderSureShot(damage,lastAttack)
#define AttackerBigShield(damage,lastAttack) 
#define DefenderBigShield(damage,lastAttack)
#define EndOfBattle

The lastAttack parameter can be removed if FE8 has nothing like it.

EDIT: Took a quick look at the tutorial. Here's what I have problems with:

[NoAI]

...

*Tile changes stuff*

Could use a rewrite. You can use this description I wrote for MK404 as base, it should apply for all 3 GBA games:

If you have no problems using something other than EA for tile changes, you can always try learning Tiled:

http://serenesforest...showtopic=26486

It shouldn't be too much of a problem to learn. But if you want to use EA, I'll give you s short description. First, you'll need to add this definition, since I'm an idiot and forgot to add it for FE6 and 8 even though they use identical format >_>:

#define TileMap(TCN,X,Y,W,H,TilePointer) "BYTE TCN X Y W H 0 0 0; POIN TilePointer"

#define TileMapEnd "WORD 0xFF 0 0"

X and Y are the coordinates of top-left corner of the change. W and H are width and height respectably. TilePointer is a pointer to the tile ID's. Since every tile ID has 2 bytes, you should use SHORT codes and format the ID's so that it in the same form as the change itself:

TileChangeList:

TileMap(0,5,6,3,3,VillageRuin)

TileMap(1,13,2,3,3,VillageRuin)

TileMap(2,4,12,3,3,VillageRuin)

TileMapEnd

VillageRuin:

SHORT topLeftTile topMiddleTile topRightTile

SHORT midLeftTile midMiddleTile midRightTile

SHORT botLeftTile botMiddleTile botRightTile

Reference tileset should have the tile ID's you are searching for. Also, a word about the order of tile changes, when tile changes overlap, the game will automatically use the latter one in the list, so put village gate closings after the village ruinings. Most tile changes will happen automatically, so you won't have to worry about that much. I don't know any codes for causing map changes, so I can't help you with that (FE8 only).

So yeah, ask if you have any questions or want more/better clarification.

It requires you to use the latest version as it uses WORD/SHORT instead of CODE. The pointer code (org 0xC9C9C8+(4*0x59); POIN pointer) can be replaced with EventPointerTable macro. Also, the TileMap parameters don't have to be in 0x format, since BYTE always has the correct size in bytes, unlike with CODE.

You also mixed labels and headers. A label is something like this:

label:

Label is just a name for the offset it is on. What you use the name label for is actually a variable, which you defined correctly.

FE6 and FE8 templates could be updated to match the FE7 one, latest EA release comes with suitable ones.

Now, another one that gets a lot of use from me is the seize command.

Seize(eventID,pointer,x-coordinate,y-coordinate)

As you should notice it follows the same basic setup as a village event. You can not include the nameofevent, which will result in it simply loading the event specified as the ending event. That would look like this:

Seize(eventID,x-coordinate,y-coordinate)

There's no Seize with 3 parameters since the pointerless Seize only works if event ID is 3.

Once your event (village conversation, 'Talk' event, reinforcements, etc.) is over, you need to tell the game to stop reading for events. Just remember to end all of your events with the following code:

ENDA

You should call it scene instead of event, as you defined in the start of the tutorial.

And I'll highlight this for emphasis, because it's just so true:

Manipulating darkness is one of the ways to give your events that extra level of "polish." Play with it; it may seem somewhat trivial (I thought it was for some time), but you can be surprised how good your events can feel by using darkness to properly hide things.

You really hit the nail with this one.

I really appreciate your effort with these tutorials, Arch. Without these, almost no-one would be using EA. And I do understand I make your life difficult by changing things all the time, but that's the nature of things. I consider every change I've made to be worth it though.

Edited by Nintenlord
Link to comment
Share on other sites

I haven't read the whole thing in depth yet, but how is this different from the first one? Cause it almost looks identical.

I feel like the biggest change is in the beginning. Most of my efforts were in revising the beginning to explain things in a more understandable way for beginners. A common complaint with the 1st Edition was that I sort of forced people who didn't know how to swim to jump into the deep end of the pool.

I've also tried to make things more cogent, and more comprehensive in the later chapters. I've incorporated differences between games into the main tutorial, rather than shoving them off into a side chapter. Eventually I'll have a chapter covering World Map events, and the tutorial will, in general, cover more content than ever before.

[NoAI]

...

I don't know what's up with this one. Cam mentioned that, in the EA standard library, the macro is "[00000000]". I might be running an old version of EA, but [NoAI] works fine for me, I've used it in Elibian Nights in literally every chapter. A quick fix would just be to remove the brackets from the definition, so that "NoAI" isn't handled differently than "[AttackInRange]," and the myriad of other AI labels.

Edited by Arch
Link to comment
Share on other sites

All AI definitions work the same way with the latest version:

AIisconsistent.png

And it's better for definitions to be full parameters, adding [] every time you want to use AI definitions is just waste of time. It tells nothing about the actual AI you are using, if people were interested in the way AI was actually implemented, they wouldn't use definitions in the first place.

EDiT: You probably should mention at the start of tutorial which version your tutorial is made for AKA the version you use. It would avoid some confusion. I still have all the post 7.0 versions stored somewhere, so I can even put that version up for download so you can link to it.

Edited by Nintenlord
Link to comment
Share on other sites

You probably should mention at the start of tutorial which version your tutorial is made for AKA the version you use. It would avoid some confusion. I still have all the post 7.0 versions stored somewhere, so I can even put that version up for download so you can link to it.

This

and since almost everyone uses your tutorials to learn events AFAIK, it's best if you keep things as up to date as possible to minimize errors from people who aren't so familiar with events that they can figure out the differences and whatnot

Link to comment
Share on other sites

Ok, now I look like an ass. I didn't notice I already had macros for FE8 battles >_>. Sorry for the confusion.

EDIT: Looking into FE8 battles right now (because I don't like releasing anything that I'm this confused about...) and it seems I've found the FE8 replacement for move manuals. It's done the same way as battles are, too. Also, all fixed battle action lists seem to start with "_SETVAL 0xD 0x0". Has anyone tested what it does?

EDIT2: Does this seem right to everyone?

#ifdef _FE8_
#define StartBattle                           "_SETVAL 0xD 0x0"
#define NormalDamage(combatantNumber,damage)  "_SETVAL 1 combatantNumber+damage*0x100;            _SAVEFORBATTLE"
#define CriticalHit(combatantNumber,damage)   "_SETVAL 1 combatantNumber+damage*0x100+0x00010000; _SAVEFORBATTLE"
#define MissedAttack(combatantNumber,damage)  "_SETVAL 1 combatantNumber+damage*0x100+0x00020000; _SAVEFORBATTLE"
#define Silencer(combatantNumber,damage)      "_SETVAL 1 combatantNumber+damage*0x100+0x00080000; _SAVEFORBATTLE"
#define SureShot(combatantNumber,damage)      "_SETVAL 1 combatantNumber+damage*0x100+0x00400000; _SAVEFORBATTLE"
#define Poison(combatantNumber,damage)        "_SETVAL 1 combatantNumber+damage*0x100+0x00400000; _SAVEFORBATTLE"
#define DevilReversal(combatantNumber,damage) "_SETVAL 1 combatantNumber+damage*0x100+0x00800000; _SAVEFORBATTLE"
#define Pierce(combatantNumber,damage)        "_SETVAL 1 combatantNumber+damage*0x100+0xC0000000; _SAVEFORBATTLE"
#define EndAttack                             "_SETVAL 1 0xFFFFFFFF;                              _SAVEFORBATTLE"
#endif

Why are Poison and SureShot exactly same? My guess is that Poison has one 0 too many, am I correct?

Edited by Nintenlord
Link to comment
Share on other sites

And it's better for definitions to be full parameters, adding [] every time you want to use AI definitions is just waste of time. It tells nothing about the actual AI you are using, if people were interested in the way AI was actually implemented, they wouldn't use definitions in the first place.

Ugh. It feels so weird to me not to have those brackets. But fine, I guess I'll bite. That's probably why I never updated; I tried updating and the EA just broke on me, this explains why.

Link to comment
Share on other sites

Yeah, handling [[shit]] once broke EA pretty badly (I still remember the debugging. Oh god the horrors >_<). I first made it not break and then made it actually handle it properly.

Link to comment
Share on other sites

Yeah, handling [[shit]] once broke EA pretty badly (I still remember the debugging. Oh god the horrors >_<). I first made it not break and then made it actually handle it properly.

Well, I guess it's time to finally update, then. Just have to bite the bullet and abandon my beloved brackets.

Turns out I was running v8.5, by the way. I was a whole version behind the rest of the world!

Link to comment
Share on other sites

i still think you should (for a short period at least) just remove inner brackets and/or just throw a warning instead.

i can see a use for a tuple of tuples but i dunno how many others would make use of it

Link to comment
Share on other sites

And I still think that is by far the worst option right now. Changing behavior just to rechange it later after all the bitching we've done would just even further confuse people who don't actively follow development. And I just checked, the AI codes have always been like this in official EA releases. AI codes were added in EAstdlib version 2.2 which came with EA version 8.2 and all AI codes had [] in the definitions themselves from the start.

Link to comment
Share on other sites

  • 1 month later...

Not really sure on this FIGH event... just experimentation. Maybe Cam can debug this crap. I'm too lazy to. XD

FIGH Attacker Defender Pointer [Parameter1, Parameter2, Parameter3, Parameter4]

First Parameter "Weapon Equip (Item Value in hex)" + "100 hit -- dmg -- crit" for ally + "-- hit -- dmg -- crit" for Other Ally/NPC/Enemy

Assuming that it's use is for "Support" type weapons, like Healing Staves, Dancing Rings, and the actual Dance/Play command items.

Second Parameter: "Weapon Durability Remaining + 1" if Parameter 1 has something in it. Putting any value here other than 0x00 will cause "Parameter 1" to be active... and show a non-existent sword item if Parameter 1 is "0x00".

Third Parameter: WTF

Fourth Parameter: Anything other than 0x00 will cause the fight to go to "non-controlled" mode, as if you actually attacked with the attacker on a turn, and the stats are factored in if they will double... and critical, depending on the RNG.

Fourth Parameter will cause freezing if the first or second parameter have a value other than "0x00" in them.

Edited by shadowofchaos
Link to comment
Share on other sites

FIGH Attacker Defender Pointer [Parameter1, Parameter2, Parameter3, Parameter4]

First Parameter "Weapon Equip (Item Value in hex)" + "100 hit -- dmg -- crit" for ally + "-- hit -- dmg -- crit" for Other Ally/NPC/Enemy

Assuming that it's use is for "Support" type weapons, like Healing Staves, Dancing Rings, and the actual Dance/Play command items.

Second Parameter: "Weapon Durability Remaining + 1" if Parameter 1 has something in it. Putting any value here other than 0x00 will cause "Parameter 1" to be active... and show a non-existent sword item if Parameter 1 is "0x00".

So having Parameter1 be non-0 causes you to have stats "100 hit -- dmg -- crit" for ally and "-- hit -- dmg -- crit" for Other Ally/NPC/Enemy? Assuming it does, here's a macro implementation of notes:

#define NonControlled "0x01 << 24"
#define Controlled "0x00 << 24"
#define UseSupportItem(itemID) "itemID"
#define UseSupportItemWithDurability(itemID, durability) "itemID + (durability - 1) << 8"

Link to comment
Share on other sites

  • 1 year later...

http://feuniverse.us/t/archs-guide-to-chapter-construction/110

After forever and a half I've finally updated this thing. This is the definitive version of the tutorial, split into two (Eventing for Dummies, a primer, and Arch's Guide to Chapter Construction). It's pretty much finished. Just have to write the world map events chapter and the epilogue, and possibly go back and add to the writing conditions chapter.

Only available on FEU because shameless plug and also I love the forum setup: designed for ease-of-reading.

Edited by Arch
Link to comment
Share on other sites

Why not include source code for the custom assembly hacks? Probably you don't have them available but I think they should be included with the .dmp's. Also if you're going to make a chapter on assembly through events I think you should include other nifty things like displaying spell animations on a map (which I've sadly never seen in a rom hack so far) or lightning for instance instead of just conditions. Just my 2 cents, I'm glad the tut got updated, you do a swell job

Does this cover everything that eventing has to offer?

No. The ea doc has more macros and codes to use not to mention that you could use assembly to create anything that's not already in the game's programming.

Edited by Brendor the Barbarian
Link to comment
Share on other sites

@Fateborn: It doesn't cover everything, but it covers everything I've used/learned throughout my years of eventing. I try to make sure everything useful is well covered.

@Brendor: I can go digging around for the source, and I'll add another section on those ASMCs (could you PM explain that spell animations thing I've never done it but it sounds like something awesome to include).

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...