Final Fantasy Hacktics

Modding => Event Editing => Topic started by: Guru on January 24, 2016, 04:34:41 am

Title: Guru's long road to eventing
Post by: Guru on January 24, 2016, 04:34:41 am
Well I'm slowly learning the workings of FFT and I'm starting out with eventing for now. I'm just messing around to get some practice in and I'm not gonna post every event but figured I'd post anything worth while that I do and you guys can make fun of it.
( long as you give me tips or advice while doing so  :mrgreen: )

This is my first event (besides tutorial one I did) so gotta post it. Took me a lot longer than I'd like to admit lol. Dem Camera angles are a bitch!

//Offset(x00004000)
//Remove the previous line if you wish not to override the offset in CONFIG.INI.
Text(x00001800)


AddUnitStart()
AddUnit(x01,x00,x00)
AddUnit(x02,x00,x00)
AddUnit(x03,x00,x00)
AddUnit(x04,x00,x00)
AddUnitEnd()
WaitAddUnitEnd()

UnitAnim(x02,x00,x0002,x00)

Erase(x01,x00)
Erase(x03,x00)
Erase(x04,x00)


{63}(rC9)
Camera(+00784,-00192,+00672,+00302,+00512,+00000,+04096,+00001)
Camera(+00784,-00192,+00672,+00302,+00512,+00000,+04096,+00128)
Reveal(120)
Camera(+00784,-00192,+00672,+00302,+00512,+00000,+04096,+00128)
Wait(00250)

Wait(00050)

DisplayMessage(x10,x91,x0001,x01,x00,x00,+00000,+00000,+00000,x10)
WaitForInstruction(x01,x00)
ChangeDialog(x01,xFFFF,x00,x00)
DisplayMessage(x10,x11,x0002,x03,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)

BlockStart()
SpriteMove(x03,x00,-00018,+00000,+00000,x00,x01,+00000)
ColorUnit(x03,x00,x01,-006,-004,-002,000)
Wait(00002)
Draw(x03,x00)
ColorUnit(x03,x00,x08,+000,+000,+000,004)
SpriteMove(x03,x00,+00000,+00000,+00000,x00,x01,+00018)
WaitSpriteMove(x03,x00)
WalkTo(x03,x00,006,003,x00,x00,+008,x01)
WaitWalk(x03,x00)
WalkTo(x03,x00,006,006,x00,x00,+008,x01)
WaitWalk(x03,x00)
UnitAnim(x03,x00,x0002,x00)
BlockEnd()

Wait(00080)

SpriteMove(x01,x00,-00018,+00000,+00000,x00,x01,+00000)
ColorUnit(x01,x00,x01,-006,-004,-002,000)
Wait(00002)
Draw(x01,x00)
ColorUnit(x01,x00,x08,+000,+000,+000,004)
SpriteMove(x01,x00,+00000,+00000,+00000,x00,x01,+00018)
WaitSpriteMove(x01,x00)
WalkTo(x01,x00,008,002,x00,x00,+008,x01)
WaitWalk(x01,x00)
WalkTo(x01,x00,008,006,x00,x00,+008,x01)
WaitWalk(x01,x00)
Wait(00010)
UnitAnim(x01,x00,x0002,x00)

Jump(x02,x00,0002,x00)
WaitWalk(x02,x00)
UnitAnim(x02,x00,x0002,x00)

WalkTo(x01,x00,008,008,x00,x00,+016,x01)
WaitWalk(x01,x00)
UnitAnim(x01,x00,x0002,x00)

DisplayMessage(x10,x11,x0003,x01,x00,x00,+00000,+00000,+00000,x10)
WaitForInstruction(x01,x00)

DisplayMessage(x10,x11,x0004,x03,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)

WalkTo(x02,x00,006,008,x00,x00,+008,x01)
DisplayMessage(x10,x91,x0005,x02,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)
ChangeDialog(x01,xFFFF,x00,x00)
WaitWalk(x02,x00)

LoadEVTCHR(x00,x33,x00)
WaitForInstruction(x34,x00)
SaveEVTCHR(x00)

//From vanilla EVTCHR

UnitAnim(x02,x00,x01F4,x00)
Wait(00008)
UnitAnim(x02,x00,x01F5,x00)
Wait(00008)
Sound(x0028)
UnitAnim(x02,x00,x01F6,x00)
Wait(00008)
UnitAnim(x02,x00,x01F7,x00)
Wait(00050)
UnitAnim(x02,x00,x01F8,x00)
Wait(00008)
UnitAnim(x02,x00,x01F9,x00)
Wait(00008)
Sound(x001B)
UnitAnim(x02,x00,x01FA,x00)
Wait(00006)
UnitAnim(x02,x00,x01FB,x00)
Wait(00004)
UnitAnim(x02,x00,x01FC,x00)
Wait(00012)
Sound(x0065)
Wait(00018)

UnitAnimRotate(x01,x00,x04,x0021,x00)

Wait(00020)

UnitAnim(x02,x00,x01FD,x00)
Wait(00004)
Sound(x0028)
Wait(00006)
SpriteMove(x02,x00,-00001,+00000,-00001,x00,x01,+00001)
UnitAnim(x02,x00,x01FE,x00)
Wait(00008)
UnitAnim(x03,x00,x0021,x00)
Wait(00040)
SpriteMove(x83,x00,+00026,+00000,+00025,x00,x01,+00028)
Wait(00004)
SpriteMove(x02,x00,+00000,+00000,-00028,x00,x01,+00008)
Wait(00002)
UnitAnim(x02,x00,x01FF,x00)
Wait(00002)
UnitAnim(x02,x00,x0200,x00)
Wait(00002)
UnitAnim(x03,x00,x0034,x00)
Sound(x0072)
Sound(x0044)
Wait(00050)
UnitAnim(x02,x00,x01FB,x00)
Wait(00004)

//End vanilla EVTCHR

DisplayMessage(x10,x91,x0006,x02,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)
ChangeDialog(x01,xFFFF,x00,x00)

DisplayMessage(x10,x11,x0007,x04,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)

SpriteMove(x04,x00,00000,+00000,-00018,x03,x01,+00000)
ColorUnit(x04,x00,x01,-006,-004,-002,000)
Wait(00002)
Draw(x04,x00)
ColorUnit(x04,x00,x08,+000,+000,+000,004)
SpriteMove(x04,x00,+00000,+00000,+00000,x03,x01,+00018)
WaitSpriteMove(x04,x00)
WalkTo(x04,x00,006,004,x00,x00,+016,x01)
WaitWalk(x04,x00)

UnitAnim(x04,x00,x0002,x00)

DisplayMessage(x10,x11,x0008,x04,x00,x00,+00000,+00000,+00000,x03)
ChangeDialog(x01,xFFFF,x00,x00)
WaitForInstruction(x01,x00)

UnitAnim(x04,x00,x0022,x00)

DisplayMessage(x10,x11,x0009,x01,x00,x00,+00000,+00000,+00000,x03)
ChangeDialog(x01,xFFFF,x00,x00)
WaitForInstruction(x01,x00)

UnitAnim(x01,x00,x002A,x00)

Wait(00050)

DisplayMessage(x10,x11,x000A,x02,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)

DisplayMessage(x10,x11,x000B,x01,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)

DisplayMessage(x10,x11,x000C,x02,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)

TempWeapon(x02,x00,x13)
UnitAnim(x02,x00,x005B,x00)

Effect(x009E,x04,006,008,x00)
EffectStart()
EffectEnd()
Wait(00050)

BlockStart()
UnitAnim(x04,x00,x0034,x00)
BlockEnd()
Sound(x0044)
Wait(00050)

UnitAnimRotate(x02,x00,x0C,x0003,x00)
DisplayMessage(x10,x11,x000D,x01,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)
Wait(00100)

UnitAnim(x02,x00,x005C,x00)
Effect(x009E,x01,006,008,x00)
EffectStart()
EffectEnd()

Wait(00050)
BlockStart()
UnitAnim(x01,x00,x0034,x00)
BlockEnd()
Sound(x0044)

UnitAnim(x02,x00,x0002,x00)
Wait(00050)

DisplayMessage(x10,x11,x000E,x02,x00,x00,+00000,+00000,+00000,x03)
WaitForInstruction(x01,x00)

EventEnd()

//INSTRUCTION SECTION END -  TEXT START


//Message x01
{font:08}{Ramza}{br}
{font:00}Where's all these beautiful women{br}you were talking about?{end}

//Message x02
{font:08}Theif{br}
{font:00}Heh they are waiting for you right up here...{end}

//Message x03
{font:08}{Ramza}{br}
{font:00}Delita?{br}What are you doing here?{end}

//Message x04
{font:08}Theif{br}
{font:00}I delivered as promised,{br}I'll take my gold now.{end}

//Message x05
{font:08}Delita{br}
{font:00}Oh I've got something very special for you.{end}

//Message x06
{font:08}Delita{br}
{font:00}Sorry {Ramza}, I can't let anyone find out{br}your the true hero behind everything.{end}

//Message x07
{font:08}Cloud{br}
{font:00}Don't worry {Ramza} I got your back!{end}

//Message x08
{font:08}Cloud{br}
{font:00}Time for my ultimate Limit Breaker!{end}


//Message x09
{font:08}{Ramza}{br}
{font:00}Right!{br}I'll use mine too!{end}

//Message x10
{font:08}Delita{br}
{font:00}...........{br}Uh what the hell are you guys doing?{end}

//Message x11
{font:08}{Ramza}{br}
{font:00}We're casting!{end}

//Message x12
{font:08}Delita{br}
{font:00}Haha{br}Seriously!?!?{end}

//Message x13
{font:08}{Ramza}{br}
{font:00}Damnit!{end}

//Message x14
{font:08}Delita{br}
{font:00}Ha never thought it'd be this easy...{end}



[youtube]kiB_tTHBNso[youtube]
Title: Re: Guru's long road to eventing
Post by: 3lric on January 24, 2016, 07:11:17 am
Lol, this is quite good for your first event. Some parts could be fixed up, like using Xif's Camera helper for the effects so the camera doesn't jump around, however it is nice to see people actually using effects. Normally the first event anyone makes is just walking and talking.

I hope to see more from you!
Title: Re: Guru's long road to eventing
Post by: Xifanie on January 24, 2016, 08:49:51 am
I recommend that you use OBS (https://obsproject.com/) from now on for recording. With a game capture, you don't even need to resize the window to make the recording bigger. It might need a bit more fine turning (because obviously your computer is pretty weak to ouput such a low framerate), but if you're going to record events, I highly recommend it.

I understand that English is not your native language, so you'll probably want someone to proof your text before any kind of official release of your mod.

As far as eventing goes, you're successfully used a couple basic instructions. Congrats! Like Elric said, my camera helper would greatly help you out to handle the camera if you have Microsoft Excel. Without it, well, good luck. :/

If you want to fine-tune your event, I have the following suggestions:
Title: Re: Guru's long road to eventing
Post by: 3lric on January 24, 2016, 09:13:54 am
As Xif mentioned, you can place a GhostUnit (the command is on the wiki) on the panel that you want to call the effect, and not draw them. You would then spritemove the actual sprite, such as Ramza, to the panel with the ghost unit.

Essentially, you are giving the illusion that you are hitting Ramza since they would be on the same panel, but you'd actually be hitting the ghost unit.

If you do it this way I recommend for Ramza you use animation 19 (in pain loop) then a short wait followed by animation 24 for critical (followed by another short wait and a animation 1A for KO if you choose).

I know its kind of a pain for such a small detail, but having the animations not get all wonky during/after an effect is definitely much more appealing, so it's worth it in the end :P
Title: Re: Guru's long road to eventing
Post by: Jumza on January 24, 2016, 09:18:09 am
Elric and Xifanie are right on the money here with the critiques (and with the GhostUnit thing), but you did a great job for your very first event! EVTCHR and Effects? That must have taken a little while to figure out :) But now that you know how to do it, it gets much faster. Trust me.
Title: Re: Guru's long road to eventing
Post by: Guru on January 24, 2016, 10:46:11 am
Wow didn't expect you guys to comment so fast  :shock:

My computer just died on me last week and I haven't had a chance to diagnose it yet, so I'm stuck with my old laptop for now.

Quote from: Xifanie on January 24, 2016, 08:49:51 am
I understand that English is not your native language, so you'll probably want someone to proof your text before any kind of official release of your mod.
:lol: Ha english is my native language. I just have a "unique" way of talking. Plus this was just practice and more for shits and giggles. I would definitely fine tune it for a mod. They are all out of character too, I could never see cloud saying "I got your back!" lol.

Quote from: Xifanie on January 24, 2016, 08:49:51 am
For the two dialog boxes, remove the arrows, and show the thief's box while Ramza's is still there (one aligned at the top, the other at the bottom, and close the first one with ChangeDialog; see vanilla events, they do it all the time)
I could not get this to work... I just ended up scraping it for now, but after reading this I'm thinking it's because I did ChangeDialog on both dialog boxes. I will check out vanilla and see how they did it.

Quote from: Xifanie on January 24, 2016, 08:49:51 am
I honestly forgot what's the best way to deal with Delita walking because he used an effect, Elric can input more on this... Either a WaitForInstruction, or just using a GhostUnit to act as a catalyst IIRC

Quote from: Elric on January 24, 2016, 09:13:54 am
As Xif mentioned, you can place a GhostUnit (the command is on the wiki) on the panel that you want to call the effect, and not draw them. You would then spritemove the actual sprite, such as Ramza, to the panel with the ghost unit.

Essentially, you are giving the illusion that you are hitting Ramza since they would be on the same panel, but you'd actually be hitting the ghost unit.

If you do it this way I recommend for Ramza you use animation 19 (in pain loop) then a short wait followed by animation 24 for critical (followed by another short wait and a animation 1A for KO if you choose).

I know its kind of a pain for such a small detail, but having the animations not get all wonky during/after an effect is definitely much more appealing, so it's worth it in the end :P

I did initially put an UnitAnim to stop him from walking but I decided to remove it so it looked more like he was in a battle. This GhostUnit thing sounds interesting though and it sounds like it could have quite a few different uses. I don't quite understand it yet, but that's an easy fix lol. Plus I didn't get any sleep so I'm kinda shot atm. I'll mess around with it on the next event though and figure it out. Definitely gonna check out that camera helper too!

Ik I skipped quite a few comments but I'm tired and there's nothing for me to add anyways. But they are all noted and I really appreciate the criticism! keep em coming! lol I'll post something else sometime soon.
Title: Re: Guru's long road to eventing
Post by: 3lric on January 24, 2016, 11:38:00 am
Quote from: Guru on January 24, 2016, 10:46:11 am
I could not get this to work... I just ended up scraping it for now, but after reading this I'm thinking it's because I did ChangeDialog on both dialog boxes. I will check out vanilla and see how they did it.


You don't need to use ChangeDialog for your event anywhere that I can see. ChangeDialog is normally just for when you want a character to move or do something between their lines, since it just prints in the same box that's currently on screen. For example: Delita says a dialogue, then moves around or turns or whatever, and then another set of dialogue is called to that same box, which stayed open during the moving around. After which you close it with another ChangeDialog using message type FFFF.

In your case you are doing this:

DisplayMessage(x10,x91,x0001,x01,x00,x00,+00000,+00000,+00000,x10)
WaitForInstruction(x01,x00)
ChangeDialog(x01,xFFFF,x00,x00)

Which actually doesn't make sense. What it would look like normally is:

DisplayMessage(x10,x91,x0001,x01,x00,x00,+00000,+00000,+00000,x10)
WaitForInstruction(x01,x00)
//Things here, moving, derping, etc
ChangeDialog(x01,x0002,x00,x00)
WaitForInstruction(x01,x00)
ChangeDialog(x01,xFFFF,x00,x00)
WaitForInstruction(x01,x00)

You don't need to add the +80 for close via ChangeDialog you can remove the 80 and just use 11 for your Message Type which will also negate the need for the ChangeDialog command.
TL;DR

In the case of what you are doing, you'll want to use

DisplayMessage(x10,x11,x0001,x01,x00,x00,+00000,+00000,+00000,x10)
WaitForInstruction(x01,x00)

instead of:

DisplayMessage(x10,x91,x0001,x01,x00,x00,+00000,+00000,+00000,x10)
WaitForInstruction(x01,x00)
ChangeDialog(x01,xFFFF,x00,x00)

Now that that's all straightened out, we can talk about removing the arrow and such, so let's take a look at how MessageType is setup, because understanding that fully will help you out a lot:







    x80: Close later with instruction {51} ChangeDialog
    x70: Display type
        x00: Appears Centered on screen
        x10: 3 lines Dialog Box (includes portrait)
        x20: 1-4 lines box named "Check"
        x30: 1-4 lines box named "Help"
        x40: 2 lines box
        x50: 8 lines box
        x60: 4 lines box
        x70: 3 lines Dialog Box (includes portrait)
    x08: Remove Arrow (Dialog Box)
    x04: Convert Arrow to Thinking Bubbles (Dialog Box)
    x03: Vertical Align
        x00: -Do not use-
        x01: Top
        x02: Bottom
        x03: Center







So if we want the dialogue box to be a standard 3 line box with a portrait (10) and at the top of the screen (01) and also to remove the arrow (8)

10 + 1 + 8 = 19

So 19 would be your dialogue type
(similarly, if you wanted the same thing at the bottom of the screen, it would be 10 + 2(bottom) + 8 = 1A)


Quote from: Guru on January 24, 2016, 10:46:11 am
I did initially put an UnitAnim to stop him from walking but I decided to remove it so it looked more like he was in a battle. This GhostUnit thing sounds interesting though and it sounds like it could have quite a few different uses. I don't quite understand it yet, but that's an easy fix lol.


I'm sure you did try lol, unfortunately, effects remove the animation and make the character walk and unless you have it timed just right (which normally isn't even possible depending on the effect and how much it visually covers the character and for how long) you will have that moment of derpy animation before your unitanim kicks in.

The way it works is this. When you WalkTo, it moves the character, the sprite, the data, everything. However, when you spritemove, it only moves the sprite itself; it doesn't change which tile the unit is standing on. So if you are standing at 01,01 and you spritemove +00028 on the X axis, your character data is still on 01,01 however, it appears to be on 02,01. The drawback is that you have to manually adjust for height and walking speed and such, since it only moves the image and does not come paired with any walking animations or take ground height into account (which is how you see people flying around all crouching tiger and shit in my events). So if you place the ghost unit (but dont draw it) on 01,02 and then spritemove Ramza from 01,01 to 01,02. You call the effect on the GhostUnits ID and then Ramza's animation isn't disturbed by the effect, so you are free to animate him as you wish. After the effect you can then remove to move the GhostUnit(SEE COMMAND ABOUT REMOVAL) and use the Warpunit command on Ramza to actually move his data to that panel while at the same time zeroing out the spritemove command, this will move him fully to 01,02 while not giving any weird graphic derps.

If you do it quick enough and have the spritemoves setup ahead of time for Ramza and Cloud, you can actually use the same GhostUnit (thanks to WarpUnit) for both effects. After Xif found out how to use this command, I've made quite a few events with a multitude of effects using only 1 or 2 GhostUnits.


I tried my best to answer the questions on the limited amount of sleep I'm currently having, so if you are confused by anything I said here or have any other questions, SERIOUSLY, do not hesitate to ask. Eventers are a rare commodity here and something that I can actually help with (unlike our other rares, spriters and ASMers)
Title: Re: Guru's long road to eventing
Post by: Guru on January 24, 2016, 06:38:30 pm
Quote from: elricI tried my best to answer the questions on the limited amount of sleep I'm currently having, so if you are confused by anything I said here or have any other questions, SERIOUSLY, do not hesitate to ask. Eventers are a rare commodity here and something that I can actually help with (unlike our other rares, spriters and ASMers)

Actually that made perfect sense. Maybe cuz of my lack of sleep lol. Thanks I'll def make use of that GhostUnit. I always wondered how you got dante's opening scene to look so good lol. I see what went wrong with the ChangeDialog and I appreciate the explanation, you actually cleared up a second question I didn't even know I had yet  :mrgreen:

I am learning some programming too(though mostly python atm), so i'll proly dive into ASM at some point. With all the work and documentation here it shouldn't be that hard once I get more of the concepts down. So thanks xif, (*insert* Are you a Wizard!? Pic) Choto and everybody ( sorry don't know all the ASMers names yet but I will  ;) )

Spriting will be my main trouble I think. Art is just about the one thing I could never grasp. Hopefully I will be able to get by on frankensprites and edits. Lots of perdy sprites on here too lol so I don't think it'll be a big problem.

Only question I got right now is if anyone knows how hard it would be to change the drop down menu for easyvent? I think the names just need edited but I'm not sure about adding the new instructions. I updated all the source files to the current format on wiki but I couldn't get into the files to code the menu so it only displays the new descriptions for the ones that have the same name as before which makes it still pretty much useless. Sorry for double posting this... I posted here (http://ffhacktics.com/smf/index.php?topic=11239.msg213603) as well, but figured everyone is proly skipping over it because of title. I'd love to be able to use easyvent instead of switching back and forth between notepad, wiki and compiler all the time but since raven isn't around.... :(
Title: Re: Guru's long road to eventing
Post by: 3lric on January 24, 2016, 08:43:47 pm
Quote from: Guru on January 24, 2016, 06:38:30 pm
Actually that made perfect sense. Maybe cuz of my lack of sleep lol. Thanks I'll def make use of that GhostUnit. I always wondered how you got dante's opening scene to look so good lol. I see what went wrong with the ChangeDialog and I appreciate the explanation, you actually cleared up a second question I didn't even know I had yet  :mrgreen:

I am learning some programming too(though mostly python atm), so i'll proly dive into ASM at some point. With all the work and documentation here it shouldn't be that hard once I get more of the concepts down. So thanks xif, (*insert* Are you a Wizard!? Pic) Choto and everybody ( sorry don't know all the ASMers names yet but I will  ;) )

Spriting will be my main trouble I think. Art is just about the one thing I could never grasp. Hopefully I will be able to get by on frankensprites and edits. Lots of perdy sprites on here too lol so I don't think it'll be a big problem.

Only question I got right now is if anyone knows how hard it would be to change the drop down menu for easyvent? I think the names just need edited but I'm not sure about adding the new instructions. I updated all the source files to the current format on wiki but I couldn't get into the files to code the menu so it only displays the new descriptions for the ones that have the same name as before which makes it still pretty much useless. Sorry for double posting this... I posted here (http://ffhacktics.com/smf/index.php?topic=11239.msg213603) as well, but figured everyone is proly skipping over it because of title. I'd love to be able to use easyvent instead of switching back and forth between notepad, wiki and compiler all the time but since raven isn't around.... :(


You can't change the dropdown without the sourcecode and without Raven, you can't get the sourcecode (Xif has an older version somewhere) Raven nearly finished EVSP 2.0 (I have a copy if you want it) some of the buttons don't work, but I updated the dropdown for that version myself. Though I still only use it as a glorified notepad with a map viewer and command list. Though really, how is that any different than using the Wiki?
Title: Re: Guru's long road to eventing
Post by: Guru on January 24, 2016, 11:36:25 pm
Yeah that'd be cool I'd like to give the new version a shot even if its not finished. It's not any different than the wiki but it is nice having everything right there and not have to switch between 3 different programs. A lot easier picking options from a drop down menu too, especially when you're just starting out and don't know many of the instructions.