• Welcome to Final Fantasy Hacktics. Please login or sign up.
 

Guru's long road to eventing

Started by Guru, January 24, 2016, 04:34:41 am

Guru

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]

3lric

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!
  • Modding version: PSX

Xifanie

I recommend that you use OBS 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:

  • I know it sounds crazy to you right now, but some camera movement to introduce the event would be a nice touch

  • 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)

  • After jumping off the roof, Delita should face Ramza

  • If you're going to have a dialog box appear for someone walking, remove the arrow

  • You should avoid dialog boxes overlapping characters as much as possible

  • 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

  • Use Camera instructions made with my Camera Helper to focus on Cloud/Ramza's locations before Lightning Stabbing them

  • Fade out at the end of the event

  • Modding version: PSX
Love what you're seeing? https://supportus.ffhacktics.com/ 💜 it's really appreciated

Anything is possible as long as it is within the hardware's limits. (ie. disc space, RAM, Video RAM, processor, etc.)
<R999> My target market is not FFT mod players
<Raijinili> remember that? it was awful

3lric

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
  • Modding version: PSX

Jumza

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.
  • Modding version: PSX
Nyzer: Alma teleports out of her own possessed body.
Raijinili: Remember that you're telling a modding community that the game they love could use some fixing.

Guru

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.

3lric

January 24, 2016, 11:38:00 am #6 Last Edit: January 24, 2016, 01:04:40 pm by Xifanie
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)
  • Modding version: PSX

Guru

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

3lric

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 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?
  • Modding version: PSX

Guru

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.