DCUG Developer’s Journal #2

Hoo-boy, things have certainly not gone more smoothly since my first journal entry.  This campaign has given me even more troubles.  I encountered a whole set of problems I’d never seen before and just about gave up hope for the finale of the whole darn arc I’m working on.  In the process, I learned a whole lot about maps and objects that I never knew, though I still couldn’t solve my problems.  The good news is that this story has a happy ending, even if it was really in doubt there for a while.

So, when last I left you, I had just finished up mission #14 and had it basically working, so I got started on testing #15.  As with the previous mission, I had already written, scripted, and mapped this one, so testing was all that was left.  It proved to be just as temperamental as its predecessor, but the script problems were magnified by a map problem.  In this mission, the gathered heroes from #14, Green Arrow, Green Lantern, Flash, and Superman, with Batman as an ally, had to rescue the remaining Leaguers, who were once again scattered across different diskworlds.

Fortunately, I had learned from the previous problems, and I anticipated some of the issues in this mission.  I started all of the encounters off at once to avoid the non-completing encounter bug.  Still, I had problems with the custom encounters for MM and GL.  WW’s encounter worked pretty well, but I discovered that I hadn’t created a animportrait (talking head) entry for the Amazons that provided her opponents.  Interestingly, sometimes a missing head.nif or entry will crash the game, sometimes it will just show a dialog balloon with a blank space.  I’m not sure what causes the different reactions.

This instance only resulted in the latter, thankfully.  I was able to fix MM’s encounter by doing the same thing I had one with Flash, using two different encounters with two different MMs, to get both the rescue and the alliance.  This one provided an extra challenge, though, as with so many more characters in play, it isn’t as easy to make the substitution and teleportation as seamless and unnoticeable.  Complicating the matter further, the encounter in question is a ‘Rescue Fire,’ which means the diskworld is sort of a hot place, and my players aren’t going to want to hang around there!  I’ll have teleport my new Jonn to the old one and hope for the best.  Here’s the pertinent script.

#———————————-

Encounter: Burn1
Type: Rescue Fire
Allies: martian_man named jonn
Marker: desert5
Primary Objective: “Save the Martian Manhunter from his fiery prison” for 1000 prestige
Next: If All Congregated: Burn4
Next: If None Congregated: Final2

Ally Congregates Cutscene:
Camera on jonn
jonn says, “Thank you my friends, once again, I owe you my life. I would not have lasted long in this fiery world. these flame creatures seem to be everywhere, and the ground burns constantly.”
flash says, “Don’t worry about it, J’onn, that’s what we do. Now let’s get out of here!”
green_arrow says, “Right, just one more little lost lamb and we’ll have the whole set. Maybe then I can go home!”
Fade for 1 seconds

#———————————-

Encounter: Burn4
Type: Custom
Actions: allies become controllable, allies fight villains, allies follow heroes, allies remain after encounter ends
Allies: martian_man named bob
Marker: bottom2
Next: None

Alert Cutscene:
bob teleports to jonn
jonn teleports to bottom1
jonn is killed
jonn is destroyed
Unfade for 1 seconds

#———————————-

It was here that I really ran into problems, the first of many in this batch of testing, unfortunately.  The GL encounter was only partially working, but the real problem was that my heroes teleported onto the center of the map…and then couldn’t get off of it!  They teleported into the middle of a number of turrets, which were on the edges of the disk, and the team literally could not move to them or reach the Lantern to free him.  There was some type of issue with this particular diskworld that made its edges impassable.  I tried tweaking it in Nifksope, but no luck.  I really don’t know enough about meshes OR maps to figure this out.

So, I had to adjust my story, throwing out that entire encounter or reworking it to fit somewhere else.  I chose the latter, moving his encounter to the final disk, a Timemaster-flavored world, and I switched up the plot slightly.  I’m fairly happy with the results, but it gave me a bad moment or two.

Of course, that was nothing compared to what happened when I went on to #16.  You see, that problem I had with the outskirts of that one diskworld, in the final Timemaster map I was using for the grand showdown with the Key, the ENTIRE map was impassable.  My heroes couldn’t go anywhere, and if I teleported them around with console commands, they would slowly slide back to where they came from.

Once again, I examined the terrain.nif, but I couldn’t make heads or tails of what I was seeing.  I posted on FR, and fortunately, the ever-awesome Detourne_me came to my rescue.  He didn’t know how to solve the problem, but he got me looking in the right directions.  He pointed out that the actual play area of the map was a giant game object, not part of the map itself.  I checked the object attributes of the “cog_massive”, digging through FFEdit’s manual to make sure that it had all the necessary attributes, but no luck.  It’s worth mentioning that there are explanations for each of the mysteries (to me at least) template attributes in the manual.  If you’re ever tying to figure them out, you can check objattributes for a complete listing.

(One of the stages of my frantic attempts to save the map made the cog disappear entirely!)

I checked the terrain itself, which DM had suggested might be the culprit.  Its bottom surface, far below the giant spinning cog, was composed of two levels, and each had an “AREA_UNPASSABLE” label.  DM posited that this might cause problems to anything over such an area, so I tried renaming them.  Progress!  Unfortunately, this only got me one step closer.  Now my characters could move…on the very bottom level of the map, as they would fall through the cog any time I teleported them up there.  I fought and fought with this thing before I hit on a solution.  I finally just copied the cog object directly onto the terrain.nif.  It took a few tries, but I got it right, and I finally had a workable map!  Now I only had to get the script working!

Fortunately, despite the fact that the big finale encounter only partially functioned, it was a very easy fix.  It features a showdown with the Key, where he is invulnerable until you destroy an object.  The CSes weren’t playing, and the object wasn’t showing up.  Turns out, I had misspelled the object name (d’oh!0 and mixed my metaphors, so to speak, in naming the Key.  You see, FF doesn’t like it when you refer to a character in two different ways.  You can use generic terms (like Villain1) OR specific names, like the_key, but you CANNOT use both, or it will choke.  So, easy fixes, and now the mission is playing quite nicely.

That wraps up this journal entry.  Please let me know if this is interesting to y’all, and if there is anything you’d like to hear more/less about, or if you’d like me to illustrate other parts of the process.

DCUG Developer’s Journal #1

Okay, let’s try this out.  There will be some spoilers for the campaign stories, so read at your own peril.

So, while traveling this summer, I had a really helpful email correspondence with Unkoman, who helped me plot several new campaigns and expansions for existing ones.  The centerpiece of my DCUG 2.0 update/expansion is a finished/polished JLA campaign that also provides a significant expansion in the form of half a dozen new missions featuring Green Arrow’s recruitment to the team, the first encounters with the Injustice Gang, and the first battles with the Key.  I created a really fun but, of course, overly ambitious outline.  I wrote it all up, added new materials to the mod, set up the maps, and got it all ready to test weeks ago.  Since then I’ve been very busy, and of course, only able to test and troubleshoot occasionally.  Of course, my attempts to get fancy have led to tons of bugs and lots of frustration.  I had a little time recently and got back to it.

I’ve been working on level 14 of the JLA campaign, where Green Arrow is jumping from pocket universe to pocket universe to rescue the JLA who have been scattered through the multiverse by the Key.  I’m using the ‘disk worlds’ maps from the finale of  :ff:, which makes for a really cool level.  Unfortunately, the maps have some issues.  More unfortunately, my scripts had issues!  I think every single encounter had bugs, and I eventually had to create workarounds for certain parts of it.

The mission was designed with GA encountering four heroes, Batman, Flash, Aquaman, and Superman, each imprisoned on their own diskworld, which was a threat specifically for them.  GA could teleport between them, recruiting each hero as he rescued them.  First I discovered that the individual encounters were not ending properly, meaning the mission never progressed past the first one.  This seems to be a result of using custom encounters that had an ally join your team.

I fixed that by just starting all the encounters at once.  Then, inexplicably, the Flash would somehow join your team twice, meaning there was no room for poor Aquaman….again.  I had to split that up into two encounters, one where you rescue Flash, one where that Flash is destroyed and a different one joins the team.  After I finally solved that I discovered that the diskworld he is on has pathing issues.

Here’s a truncated version of my scripting work-around.  You’ll notice that I name the two Flashes different so the game doesn’t get confused, and I wait to tidy up my extra Flash until we reach the second encounter, that way his being wiped out of existence, Anti-Monitor style, won’t screw up that first encounter.  By fading the camera between encounters, hopefully my players won’t even notice the substitution.:

#———————————-

Encounter: Chill1
Type: Rescue Frozen
Allies: flash named bob
Villains: shurale named harry
Minions: shurale, snow_man, snow_man, snow_man, snow_man
Marker: snow1
Primary Objective: “Free Flash from his frozen prison” for 1000 prestige
Next: If All allies freed: Chill2
Next: If No allies freed: Final2

End Cutscene:
Fade for 1 seconds
bob teleports to bottom1

#———————————-

Encounter: Chill2
Type: Custom
Actions: allies become controllable, allies fight villains, allies follow heroes, allies remain after encounter ends
Allies: flash named jim
Marker: snow2
Next: None

Alert Cutscene:
jim teleports to green_arrow
bob is killed
bob is destroyed
Unfade for 1 seconds

#————–

I’ve got an idea about that, but I haven’t tried it yet.  Finally, Aquaman’s wasn’t properly rescueable in his custom encounter, so I had to change it up too.  I’ve finally got this mission mostly sorted out…and now I face another one in mission 15, where you save the rest of the team.  I honestly don’t know that I’ve ever had a mission with so many problems per-capita!

Let this be a lesson to you, future modders: don’t get fancy!

The good news is I’m still making progress, and the campaign is coming together well.  I’m also really happy with a lot of how I’ve designed these missions and the base scenes.  I know SO much more about modding these days than I did when I made the DCUG in the first place, and it’s nice to be able to bring a little higher production value to the stories I’m telling.  I’m still often limited by EZScript and the available maps, but I’ve been able to find some fun ways to change things up.  I hope y’all will agree with me when you get a chance to play these missions!

I also just got a small pile of new and updated skins/skopes from Deanjo2000, and they look fantastic!

Finally, I posted an add for a map maker on ModDB.  Since it’s just an unpaid position working on a decade old game, chances are nothing will come of it, but it would be really fantastic if I could get some help with map creation.  That could open up so many possibilities and free up an incredible amount of time for me.  So, cross your fingers, gang!

Completed script:

Story: 14jla

#
# New JLA mission pitting the team agains the Key
#
Starting Encounters: Knight1, Chill1, Red1, Dry1, Dry2, Dry3
#———————————-

Encounter: Knight1
Type: Custom
Actions: allies become controllable, allies fight villains, allies follow heroes, allies remain after encounter ends
Villains: duplicate_male1, duplicate_fem1, duplicate_male1, duplicate_fem1, duplicate_male1, duplicate_fem1, duplicate_male1, duplicate_fem1
Minions: duplicate_male1, duplicate_fem1
Allies: batman
Marker: city1
Primary Objective: “Help Batman defeat the strange civilians” for 1000 prestige
Next: If Ally Survives: None
Next: If Ally Lost: Final2

Alert Cutscene:
Set Lighting to Night
Cinematic camera on green_arrow
Unfade for 2 seconds
Play music music_pandemonium
green_arrow says, “Well…this doesn’t look that bad. Looks a bit like home, actually…though it’s strangely quiet…”
Cinematic camera on batman
batman says, “Green Arrow? How in the world did you get here?”
green_arrow says, “Hiya Bats, I just caught a lift through…”
batman says, “Nevermind! There’s no time! Watch out! There’s something wrong with the people of this world!”
green_arrow says, “What do you mean…?”
Camera on Minion1
Minion1 says, “Hsssss…fresh meat! kill them! rend their flesh!”
batman says, “I think you get the picture. It’s the Key’s idea of a joke. I have dedicated my life to protecting the people of my city…so he sent me to a world where they’re out for my blood..though it seems any will do.”
green_arrow says, “But how…?”
batman says, “Later! Now, just concentrate on survival!”

Ally Lost Cutscene:
green_arrow says, “Nooo!”

End Cutscene:
batman is revived
Cinematic camera on green_arrow
green_arrow turns to batman
batman moves to green_arrow
batman says, “Best as I can tell, this world suffered some type of plague or contamination, and its inhabitants seem to be mad. we should keep our eyes open for more infected civilians.”
batman says, “so, how did you end up here?”
green_arrow says, “You’re welcome….”
batman says, “Yes. thank you.”
green_arrow says, “For saving your….?”
batman says, “don’t push it.”
green_arrow says, “Fine. I had just teleported to the Watchtower when the Key grabbed all of you. I followed him through his portal before it closed. I found myself in a crazy place, glowing, under a neon sky…”
green_arrow says, “there were a bunch of other portals. I crossed my fingers and jumped through, found myself here.”
batman says, “Hmm…disappointing. I hoped you’d have some way to get back.”
green_arrow moves to spot1
green_arrow says, “Yeah, I didn’t really think this through…unfortunatley, these things don’t come with instruction manuals.”
batman turns to spot1
batman plays animation ranged
batman says, “Wait! The portal…it’s open again!”
green_arrow says, “How? Did you do something?”
batman says, “No…I wonder…the Key talked about absorbing dimensional energies in his travels…it’s possible that you absorbed enough as you jumped between worlds to activate his gateways.”
green_arrow says, “Well, there’s only one way to find out. You coming?”
batman says, “It would be tempting fate to say ‘anywhere is better than here,’ but I suppose I’ll take my chances.”

#———————————-

Encounter: Chill1
Type: Rescue Frozen
Allies: flash named bob
Villains: shurale named harry
Minions: shurale, snow_man, snow_man, snow_man, snow_man
Marker: snow1
Primary Objective: “Free Flash from his frozen prison” for 1000 prestige
Next: If All allies freed: Chill2
Next: If No allies freed: Final2

Start Cutscene:
Fade for 1 seconds
Set Lighting to Day
Camera on snow1
Unfade for 1 seconds
batman says, “It looks like this world is frozen over. some second ice age, or perhaps nuclear winter.”
green_arrow says, “Brrr! You’re telling me. I wish I’d have packed my thermal costume…”
Camera on bob
green_arrow says, “Look! It’s the Flash, frozen like a TV dinner! and we thought we were cold…”
Camera on harry
batman says, “And it looks like he’s not alone. We’d better free him, but tread carefully.”
harry says, “Raarraggghhhh!”
green_arrow says, “A little late for that!”

End Cutscene:
Cinematic camera on bob
batman moves to bob
green_arrow moves to bob
bob says, “thththththannnnks….gggguys…this entire world…is so cold…even I couldn’t…keep my molecules moving.”
batman says, “we must have been protected by residual dimensional energy. hopefully there’s still enough left to get out of here.”
green_arrow says, “No kidding. I snow as much as the next guy, but this place over does it!”
bob says, “whhhwhhwhat’s going on?”
batman says, “Explanations can wait. We need to find the rest of the League. Let’s hope our next stop is warmer.”
Fade for 1 seconds
bob teleports to bottom1

#———————————-

Encounter: Chill2
Type: Custom
Actions: allies become controllable, allies fight villains, allies follow heroes, allies remain after encounter ends
Allies: flash named jim
Marker: snow2
Next: None

Alert Cutscene:
jim teleports to green_arrow
bob is killed
bob is destroyed
Unfade for 1 seconds

#———————————-

Encounter: Chill3
Type: Fight
Villains: shurale named harry
Minions: shurale, snow_man, snow_man, snow_man, snow_man
Marker: snow1
Next: None

#———————————-

Encounter: Dry1
Type: Custom
Actions: allies become controllable, allies fight villains, allies remain after encounter ends, allies can be freed, allies move when freed, allies in cages, allies do not move, allies thank heroes
Villains: fire_elemental, fire_elemental, fire_elemental, fire_elemental
Minions: fire_elemental1
Allies: aquaman_classic
Marker: desert1
Primary Objective: “Rescue Aquaman from the burning desert” for 1000 prestige
Next: If Ally Survives: None
Next: If Ally Lost: Final2

Start Cutscene:
Camera on desert1
green_arrow says, “Some kind of desert world…well, at least it’s warmer.”
batman says, “very warm. we’d better be careful. we could easily dehydrate here, and there’s no water in sight.”
jim says, “dry or not, I’ll take this over that frozen…”
Camera on aquaman_classic
jim says, “Hey, there’s Aquaman! It looks like there’s something wrong with him…”
green_arrow says, “hopefully it’s not whatever was wrong with those folks on the first world…”
batman says, “no, don’t you see? he’s an amphibian. this place is killing him! we’ve got to get him out of here, quick.”
Camera on Villain1
jim says, “Ohh yeah? I wonder what they’ll have to say about that…”
green_arrow says, “what the heck are they?”
jim says, “They look like some kind of…living flame…sort of the opposite of the things on the snow world.”
green_arrow says, “well, they don’t look any more friendly!”

Ally Thanks Hero Cutscene:
Camera on aquaman_classic
aquaman_classic says, “th…thank you all…I wouldn’t have…lasted much longer…”
jim says, “we’ll find you a nice ocean as soon as we can, aqua-buddy. can you make it?”
aquaman_classic says, “Yes…I’ll be alright, once we get out of this heat…”
green_arrow says, “Then it’s onward and upward!”
jim says, “do you realize what this place means, guys? these different versions of earth…this is the multiverse that physicists have theorized about for years!”
jim says, “scientists have posited that there are infinite variations to our universe, each in its own dimension, and each differing in key ways from our own. it looks liek they were right!”
batman says, “Yes, but unfortunately that multiverse is currently trying to kill us.”
green_arrow says, “Hey, you wonder if there are alternate versions of us out there anywhere?”

#———————————-

Encounter: Dry2
Type: Destroy Object
Villains: fire_elemental
Objects: ro_generator
Primary Objective: “Sabotage the automated factory” for 1000 prestige
Marker: desert2
Next: None

Start Cutscene:
batman says, “These fire beings seem to be coming from that portal…maybe we can destabalize if we hit it hard enough…”
Red Arrow on desert2

End Cutscene:
jim says, “That’s done it!”

#———————————-

Encounter: Dry3
Type: Hunt
Villains: fire_elemental
Marker: desert3
Starts When: Dry2 not at End
Next: Dry4

#———————————-

Encounter: Dry4
Type: Wait
Minimum Time: 30
Maximum Time: 35
Next: Dry5

#———————————-

Encounter: Dry5
Type: Hunt
Villains: fire_elemental
Marker: desert4
Starts When: Dry2 not at End
Next: Dry3

#———————————-

Encounter: Red1
Type: Rescue Caged
Villains: darkman_blue, darkman_blue, darkman_blue, darkman_purple, darkman_blue, darkman_blue, darkman_blue, darkman_purple, darkman_blue, darkman_blue, darkman_blue, darkman_purple
Minions: darkman_blue, darkman_blue, darkman_blue, darkman_purple
Allies: superman
Marker: ruin1
Primary Objective: “Save Superman from the ruined world” for 1000 prestige
Next: If Ally Survives: Final1
Next: If Ally Lost: Final2

Start Cutscene:
Fade for 1 seconds
Camera on ruin1
Set Lighting to red alert
Unfade for 1 seconds
green_arrow says, “Whoa, this place has seen better days. It looks worse than Gotham.”
green_arrow turns to batman
green_arrow says, “Err…sorry Bats.”
batman says, “It looks like this world has suffered some type of catastrophe…and look…the light.”
jim says, “Red…is that the natural sun color of this world, or is it linked to whatever happened here.”
batman says, “No way to tell…but if this place is under a red sun….I can guess who the Key imprisoned here.”
aquaman_classic says, “Superman…but where…”
Camera on superman
jim says, “there he is!”
green_arrow says, “Well, the good news is, this place looks dead. Hopefully we don’t have to worry about any unfriendly natives.”
Camera on Minion
Minion says, “Outsiders! Maybe they have food! Maybe they WILL be food! Get them!”
jim says, “Arrow! Don’t you know better? You NEVER tempt fate like that!”

Ally Thanks Hero Cutscene:
Camera on superman
superman says, “Thanks, guys…I’ve been robbed of my powers under this red sun. I’ve been staying just ahead of these poor creatures. they’ve been hunting me since I arrived.”
superman says, “It looks like there was a nuclear war here…and the survivors were changed…mutated…it’s not a pretty sight…but the worst part is…all I could think about was…I wasn’t there to stop it.”
superman says, “We’ve got to get home. I won’t let the same thing happen to our world.”
superman says, “Now, someone tell me, what in the name of Krypton happened to us?”
batman says, “I’ll explain, but first, we still have a few Leaguers to find.”

#——————————————————————————-

Encounter: Final1
Type: Cutscene
Next: Win

Start Cutscene:
Play Transition

#——————————————————————————-

Encounter: Final2
Type: Cutscene
Next: Lose

Start Cutscene:
Play Transition

#——————————————————————————-

 

Modding with EZScript: An Outline

Howdy folks!  Some time back, in the process of trying to help a new modder in the FF community, I wrote a rather lengthy post on Freedom Reborn about the step by step process of creating a mod.  It occurred to me that this information, all gathered in one place, might prove helpful to other newcomers and folks who want to try their hands at modding.  So, I’m adapting that gargantuan post to a how-to-outline that I’ll share here.  So, without further ado, I give you a crash course in modding!

Let’s start at the beginning.  Make sure you have all of the necessary tools.  To mod successfully and without undue headache, one needs the following:

  • FF2 Mod Tools (FFEdit, Character Tool)
  • M25’s Mod Tools (EZScript Editor, Language File Generator, and more)
  • FFX (an amazing expansion to the core game mechanics that adds tons of new attributes and functionality)

So, install all of the various tools, and if you’re running a version of Windows newer than XP, as I imagine most folks are these days, it is probably a good idea to run all of these things in compatibility mode for XP SP3.  I’d also run them as an Administrator, just to be on the safe side.

Now, on to business!  Here is a rough, step-by-step outline that can give you a sense about what all goes into modding.

1) First, decide what you want to call your mod.  Then, copy the newest version of FFX (3.3 I think), and rename it to whatever you want your mod to be called.  The title should be simple, because you’ll have to use it a few different times, and you don’t want to be having to type out a forever-long name dozens of times.  Also, and this is something you’ll see me say a few times, make sure you don’t have any unusual characters in the name.  Limit it to letters and numbers, as FF has a tendency to freak out over anything else.  Next, make sure FFEdit is pointing in the right direction.  Do so by opening it up and directing the primary data path towards your newly created mod folder.  Make sure you leave the secondary data path alone.

2) Now, decide which characters you want/need in your mission.  Create herofiles for them.  Give them simple, lower case names without any special characters and punctuation marks.  Test and balance in the Rumble Room until satisfied.

3) Quit, rename your FFX3 folder to something different, FFX3a is what I use.  Now, rename your mod folder to FFX3. (This step isn’t absolutely necessary, but FFX Edit2 sometimes has something of a hard time with mods other than FFX.)

4) Run FFX Edit2.  Save.  This “Brands” all of the characters in that mod, giving each a unique “Complex” number, which helps FFX and EZScript tell them apart.  This is necessary to get stuff to run smoothly.  Once you’re done, don’t forget to change both folder names back.

5) Next, launch your mod, open the Rumble Room, and choose M25’s Add to Dat as your gametype.  Put your newly created herofiles into the roster, use the “———–” blank entry if you need to, and then run it.  It should only take a moment.  Now, quit, open FFEdit, check on the characters and make sure everything was added nicely.

6) Now, open up your EZScript Editor.  Go to “Panels,” “Config,” and set the Dat directory to your mods folder.  You can set the other directories or not, it won’t be super important for a simple project.  Now, I recommend working on top of an existing EZScript mission.  One of the example missions or one of mine would serve as a fine base.  Either way, compose your mission.  I STRONGLY recommend using:

#————————————–

to differentiate your encounters, to make it easier for you to read and for folks who help you with troubleshooting.  Avoid capitalization in composing your missions, except when writing encounter names, which are okay to capitalize, just make sure you are being consistent.  One of the biggest pieces of advice I can give you is, keep it simple.  Keep your naming schemes simple, keep your layouts simple, keep your plans simple.  The more complex you get, the more chances you’ll mess something up, and the less chance you’ll be able to find it easily.

7) Next, click “Tools,” “Analyze,” and look at the report it gives you.  This should catch MANY of the careless errors and plain ‘ol mistakes that tend to creep in to this type of work.

8) After that (or really before if you want), you can create your map, adding in any encounter markers you need.  Make sure all encounter names match what your mission calls for EXACTLY.  You can point your EZScript Editor to this newly edited map to double check that.  Unless you are designing the FIRST mission of a campaign, do NOT put any heroes on a map you create if you are using EZScript.  The first mission needs for the heroes to be placed already, otherwise check out my tutorials on what markers are necessary to get everything to play nicely.

9)
 Open your mod folder and copy your mission’s .txt file into the mod’s Story directory.  If it doesn’t have one, just create a folder named Stories in your mod’s main directory.  If you have multiple missions, you can put them all in there, but make sure to rename the copies so you don’t just overwrite them in the Stories folder.  Now, run your mod again.  Go to the RR again, for game type, select M25 Generate Language Files (or something like that).  Just use the ———- character, that will work fine.  Run it, then quit.  You’ve just added all of your missions dialog to your mod’s caption.txt.  However, the game itself can’t read txt files, so we need to get this into your captions.dat.  Now, open M25’s Language File Generator that you downloaded before we got started, and run it, pointing it at your mod director.  This updates your Lang files.  Also, before you start this process, make sure you’ve got CLEAN language files.  If you’ve already been poking around in them, I strongly recommend you get your language files from a clean install or clean version of FFX3.

11) Open up FFEdit and click on the “Campaign” tab.  Now, you’ll see the default FF missions there, and I recommend you leave them be for the moment.  You can delete them all, but in general things work better when you just leave them alone.  They won’t affect anything.  Add your own missions in, set the required characters and and unavailable characters, and move your missions to the top of the order.  Save and exit.

11a) For your first mission ONLY, you’ll need to place your starting heroes on your map through the editor.  Don’t forget to do this, as otherwise your mission won’t start.  The game spawns no heroes for the first mission.

12) Now your mod should be ready to play!  Open up FF and click “New Campaign” and give it a test.  Chances are you’ll run into some troubles, but stay patient and try to eliminate factors.  Always double check the obvious!  I can’t tell you how many hours I’ve spent troubleshooting missions with inexplicable problems, only to realize that I misspelled “encounter” or forgot to do something equally basic.  Also, when in doubt, feel free to ask for help!  I’m always happy to help new modders, and the FF community is amazing!

 

EZScript Script-Off Winner!

It’s decision time, my friends!  Well…actually, it was decision time earlier this week, but that’s the way things go.  Either way, I’ve played each of our two submissions a few times, and I’m ready to announce a winner.  I had hoped to see more people participate, but I was still really happy to at least see some interest.  I’ll review each entry, and then announce the winner.

Reich Around the Clock by Yellow Lantern:  This was a fun mission, with the Blitz fighting Nazis and running over hill and dale to punch the soldiers of the Reich.

Nazi Punching can quickly become an addiction

You jump right into the action, with civilians that need rescuing from a blazing fire.  We don’t get much set-up, which isn’t necessarily a bad thing, but knowing next to nothing about the character, I wouldn’t have minded a bit of context or character building.  There is a nice variety of encounters, going from that fire rescue to stopping the Nazis from tearing down some homes.  Then you’re fighting in earnest, first just soldiers, but then a pretty challenging encounter with a pair of tanks!

Something about this doesn’t seem quite right…

I found this the highlight of the mission, because you’ve only got one attack that can really hurt these behemoths, and it was tricky to maneuver around them long enough to build up the charge necessary to toast them. I thought that the mission was going to end after this encounter, especially considering how banged up I was, but imagine my surprise when I went from the frying pan into the fire. I just managed to defeat the tanks, and all of a sudden, the sky is filled with Eyes of the Reich…and The Blitz without a decent ranged attack to his name!

Alright, this hardly seems fair….

This is where the mission takes a turn for the impossible. I tried a couple times, but couldn’t get past the Eyes. With a little creative cheating, though, I managed to get through to the final encounter where I faced…Blitzkrieg himself! ‘Ol big brain is guarding a bomb that kills non-aryans, which I thought was a nice touch, and you face a pretty desperate fight against him and a passel (gaggle, flock, herd…what’s the term for a group of these guys?) of Killarillas.

Tanks and flying brains weren’t enough, now I have to be pummeled by monkeys?!

All in all, this was a fun, creative mission with a bit of witty dialog and some challenging things to do, but it is also one that becomes downright impossible by the end. The Blitz himself was fun to play, and he had a nice variety of powers. The difficulty and lack of context do hurt it a bit, but the overall effect was still pretty good. I give this one four unconscious Ratzis out of five.

The Test, by John Jr.: Here we have a Superman adventure in which the Man of Steel finds Metropolis under siege by mysterious forces. JJ gives us some simple but enjoyable bits of characterization as Supes uncovers the alien menace in their midst.

Man these guys are ugly!

It turns out that these diabolical spacefarers are testing weapons on the people of Earth because they are similar to the great enemy of their race. I thought that was a pretty neat motivation for the bad guys to have, and JJ makes good use of the built in FF aliens. Of course, Supes doesn’t take that too kindly, and he starts to hunt the invaders down.

Yeah, you’d better run!

The mission ends with a showdown against Praetor, who proves admirably resistant to a Super-thumping. However, these aliens are, in general, fairly ineffective against the Man of Steel. Their shields may stop his heat vision, and they may be resistant to crushing damage, but it still only takes him a few shots to drop them. More importantly, their weapons just aren’t much of a threat to Supes.

Let’s see your shield stop THIS!

That isn’t much of an issue in the first part of the mission, where the real danger is to the civilians you are saving, rather than to Superman himself. It is pretty challenging to get to the aliens and take them out before they can blow the citizens of Metropolis to kingdom come, but when you go after the alien’s leader, there isn’t really much tension to the encounter. This mission had some good characterization, but it needed a bit more in the way of challenge. Still, this was a fun mission, and after having slaved over DC characters for so long, it was something of a breath of fresh air to play a nice, simple adventure like this. There is something rather zen about hurling a car at an evil alien. I give it three and a half hurtling automotive missiles out of five.

The winner by a nose is Yellow Lantern! I want to stress how close this was, as these missions were, in some ways, mirror images of one another. Where YL’s entry was too tough, JJ’s was a bit too easy. Where the first didn’t have enough context, JJ’s had a nice bit of characterization. It was a pretty close call. I hope that y’all enjoyed this contest, I know that I did! I’ll be putting up a page for YL’s entry sometime this week, and I’ll come up with something for JJ too, as a consolation prize. Thanks for playing guys, and I hope you’ll have more company next time!

Elementary My Dear Watson….

You know, Holmes never actually says that….anyway, I’ve been plugging away on project number three today, and I was wondering if anyone out there has figured me out.  I thought it might be fun to see what people think I’m doing (those that care, at any rate).  If you’re curious and you’d like to take a guess, then please feel free.  I’ll point out whoever was closest to the truth when I get to release day.  I’ll give you a hint, I’ve talked about two of the three already on this blog.  So, feel free to comment and make a guess as to the list of projects that I’ve been working on!  I’m really curious to see if anyone has any inkling of this third project, which I haven’t breathed a word about.  In addition, which, if any, of the ideas I’ve mentioned would y’all LIKE to see developed?  You never know, if there is a lot of interest (unlikely considering how many people are reading this, I know) I might be persuaded to take something up that I hadn’t seriously considered before.

Doing More with EZScript

We’ve talked a bit about how to do fairly simple things with EZScript, so I thought I’d take some time tonight to talk about getting just a bit more fancy.  There are a few fairly common types of missions whose creation in EZScript may seem a little difficult to figure out when you’re just beginning.  One of the things that I wanted to do when I was first getting started on the DCUG was figure out how to create a mission where success or failure depended largely on the player’s ability to be stealthy.  Do y’all remember the stealth mission from the original FF campaign, the one where Minute Man had to sneak past a bunch of thugs who would trigger an alarm if they saw him?  Well, that gave me the idea, and since I was working on a Batman campaign, it seemed like a perfect fit!

But, how should I go about it?  Well, thanks to M25’s pointers, I finally worked out what I needed to do, and it is a system I’ve used for several missions since then.  To illustrate it, I’ll create part of  a Ninja Turtles mission in which the Heroes in a Half Shell have to slip past the police without being seen, while at the same time searching the city for clues.  We begin with a simple cutscene, and take advantage of the “Next:” field to spawn several encounters at the same time.

#——————————————————————————-

Encounter: Intro1
Type: Cutscene
Next: Punk1, Punk2, Punk3, Guard1, Guard2, Guard3

Start Cutscene:
narrator says, “After rescuing a plucky reporter from a gang of thugs out to ‘send her a message,’ the Turtles joined April O’Neil in pursuit of a story that would prove that they had not been behind a number of recent robberies around New York.”
narrator says, “While the boys stopped for a pizza, April continued her investigation, following her nose right into a trap!”
Cinematic camera on leonardo to raphael
leonardo says, “April’s disappeared, dudes!”
raphael turns to leonardo
raphael says, “Don’t worry Leo, she’s a big girl. I’m sure she can take care of herself.”
Camera on donatello
donatello says, “I’m not so sure guys. I mean, those creeps are probably still looking for her. What if they found her again?”
Cinematic camera on micaelangelo to leonardo
michaelangelo plays animation melee
michaelangelo says, “Well dudes, we gave those losers a pounding once, we can do it again!”
leonardo says, “Right Mikey, let’s hit the streets and see if any of the local riff-raff know anything. But remember, let’s act like ninjas and stay out of sight!”

#——————————————————————————-

Now, there are two things I want to point out about this.  First, you’ll see that I’m calling for six encounters to begin, but they are all encounters that won’t actually start RUNNING until you move characters close to them.  The characters in them will spawn, but they won’t take up too much juice just sitting there.  Something like this gets a lot more demanding when you are triggering encounters that start immediately, and that is something to keep in mind if your machine is a little on the older side.  Second, I forgot to talk about the difference between “Camera on” and “Cinematic camera on” commands in my last EZScript post.  Camera on points the camera more or less straight down at a single character, at a moderate height that will include a good deal of background.  Cinematic gets you in a little closer, and can be good for dramatic moments.  It is also good for FOLLOWING moving characters.  I tend to alternate the two, so there aren’t any jerky camera transitions.  Also, you can tell the game to stretch a shot from one character to another with the Cinematic camera, and that can be good for creating the illusion of a conversation or a face-off.

What’s next?  Well, the three encounters where the Turtles are looking for clues are all just variations on the same theme, stop a mugging, catch a thief, etc.  I’m going to make one of them an interrogation, though, so that our heroes can get some information pointing them to the final encounter.  I COULD make this clue encounter both an interrogation AND something else using a Custom Encounter, but we’ll talk about those another day.  Punks 1-3 won’t have a marker specified, so they’ll be random.  The player will have to search for them.  Guard 1-3, however, have to be tied to a specific location if we want them to look right.  Let me show you what I mean:

#——————————————————————————-

Encounter: Guard1
Type: Flee The Scene
Villains: cop, cop
Marker: post1
Next: If All Escaped: Alarm1
Next: If Some Escaped: Alarm1
Next: If None Escaped: None

Alert Cutscene:
Camera on leonardo
leonardo turns to Villain1
leonardo says, “Uh-oh brothers, we’d better stick to the shadows. We can’t afford to be seen, but I’d really rather not hurt innocent policemen.”

Start Cutscene:
Cinematic camera on raphael
raphael says, “They’ve spotted us! Let’s take ’em!”
donatello says, “But…they’re the good guys!”
raphael says, “Better that they wake up with a headache than we end up in a lab somewhere!”

Villains Escapes Cutscene:
Camera on donatello
donatello says, “This can’t be good…”

None Escaped Cutscene:
leonardo says, “That was too close…we must be more careful. Remember the lessons Master Splinter has taught us.”

#——————————————————————————-

You see, the base for this kind of stealth mission is simply a “Flee the Scene” encounter, and you could technically do that without calling for a marker, but if you want it to look like that Minute Man mission, where your flunkies trigger an alarm, you’ll need to do a little extra work.  See, having a specific marker, in this case “post1” allows you to place another marker “post1_end1” which will tell the villains where to run.  That may not really seem that helpful, but if you were to place the alarm bell from the Nazi base map over that marker, then you’d see these cops run for that alarm, rather than for a particular edge of the map.  Now, you’ve got a few options as to what to do once the alarm is tripped.  If you want stealth to be absolutely vital to the mission, you can simply put “lose” after the next entries for characters getting away.  What I like to do, however, is force the player to face a boatload of reinforcements if they can’t slip past the guards.  The next step is the key, though, as getting the right look is only part of the issue.

#——————————————————————————-

Encounter: Alarm1
Type: Hunt
Villains: cop
Minions: cop
Marker: post4

Start Cutscene:
michaelangelo says, “Look out, here comes the cavalry!”

#——————————————————————————-

You now have to tell the game to summon reinforcements for the shocked cops.  Here, we place a “post4” marker next to a doorway nearby, and use a hunt encounter so that these policemen will chase after the Turtles.  Thus, if the alarm is tripped, it will seem like the cops have called for backup.  You can even add in more dialog to indicate exactly what is going on.

And there you have it.  It is really simple in the execution, but it took me quite a while to figure out.  I like to think that the result in game is actually pretty neat, and a nice variation from the standard fare of “punch this guy.”  I hope that was useful to someone out there!

The Anatomy of an EZScript Adventure

Well, I’ve been debating how best to illustrate the composition of an EZScript mission, and I thought that it might be useful to y’all to actually watch one get written, in a way, so, if that interests you, join me as I put together a relatively simple adventure for a favorite character of mine:

The DCUG includes a campaign that alternates between The Atom and Hawkman and Hawkgirl, and as I was debating what I wanted to do for this post, it occurred to me that I had plans for several missions that would be pretty simple.  So, I’ll open up EZScript Edit, and instead of using my previous scripts as models, I’ll compose from scratch so you can see the whole process.

I’ve got my heroes, but who should my villain be?  Well, I’m in luck there, as I have a fairly extensive backlog of stories that I haven’t had time to get to you.  Reaching into my notes more or less at random (with an eye towards the beginning of my overall story arc with the Hawks), I come up with The Fadeaway Man!  I’ve said before that the DCUG is the home to obscure characters.  Anyway, the next step is to figure out what I actually want to happen in this mission.  Since Fadeaway Man is more or less just a thief, we’ll start with a jewel heist.  I can choose a couple different encounter types to simulate this, for example, I could chose a straight up “Fight” encounter and just create the illusion of a heist via dialog.  I could also use a “Save Civilian” encounter, implying that our villain would be going THROUGH some hapless civilian to get his trinket.  Instead, I think I’ll use an “Interrogation” encounter, which will allow our villain to have a conversation with our heroes at the end of the encounter.  So, I double click on “Interrogation,” and I receive this:

Story: 05hawkman

#————————————–

Encounter:
Type: Interrogation
Villains:
Minions:

Alert Cutscene:

Start Cutscene:

Interrogation Cutscene:

End Cutscene:

#—————————————-

You’ll notice that I’ve named my mission (something simple and easy to remember), and that I’ve added “#—-” to help me separate various encounters, and to make my scripts a little neater and easier to follow.  Now we need to fill in the blanks.  We’ll name the encounter “Jewel1,” which is a nice simple name I can recognize quickly, and use as part of something else if I ever feel so inclined.  It is important that you never name your encounters with parts of characters names, terms that show up in encounter types, or marker names. Any of those things can cause EZScript to get confused.  That’s why simple naming is such a good idea.  Next, we identify the cast.  We’ll have the Hawks as part of our team going into this mission, so we don’t need to worry about them.  The villain is, of course, fadeaway_man, and he won’t have any minions in this encounter, so I’ll remove that line.  Now all we need to do is decide which cutscenes, if any, we want.  Remember, you can use as many or as few of these as you like.  However, in encounters like this that don’t simply end when all of the bad guys are down, an End  CS can be a good litmus test to make sure everything is working properly.  For our purposes, we’ll provide an Alert, Start, and Interrogation CS.  The finished encounter looks like this:

#————————————–

Encounter: Jewel1
Type: Interrogation
Villains: fadeaway_man
Primary Objective: “Stop the robbery and catch the mysterious thief” for 50 prestige
Next: Jewel2
Marker: store1

Alert Cutscene:
Cinematic camera on hawkman to hawkgirl
hawkman says, “I suppose since we’re going to be staying here, we may as well try to make ourselves useful,Shayera.”
hawkgirl says, “Shall we patrol the city? It will be just like our joint shifts back on Thanagar.”
hawkman says, “An excellent idea, I…”
hawkgirl turns to store1
hawkgirl says, “Wait! Do you hear that?”
hawkman turns to store1
hawkman plays animation melee
hawkman says, “Yes…yes I do…just on the edge of my hearing…it sounds like…”
hawkgirl says, “A siren! Fantastic, let’s go!”
hawkgirl moves to store1
hawkman says, “This night is getting interesting already!”
Red Arrow on fadeaway_man

Start Cutscene:
Remove Arrow on fadeaway_man
Cinematic camera on fadeaway_man
hawkman says, “It’s Professor Lamont…but what in the world is he doing?”
fadeaway_man turns to hawkman
fadeaway_man plays animation melee
fadeaway_man says, “No! I just needed a few more minutes to muster the concentration needed to teleport these diamonds away…stay back aliens!”
Camera on hawkgirl
hawkgirl says, “What do you think you’re doing, pal? Don’t you want to reconsider. You can’t get away from us.”
Cinematic camera on hawkman
hawkman says, “And if you try, it’s going to hurt.”
hawkman turns to hawkgirl
hawkman says, “He must have stolen that cloak from the museum…he used us Shayera!”
Camera on fadeaway_man
fadeaway_man says, “I don’t know how you flying fools found me, but leave now or face the power of the Cloak of Cagliostro!”

Interrogation Cutscene:
Camera on fadeaway_man
fadeaway_man says, “You’ve caught me…but…the question is….can you hold me!?”
Fade for 2 seconds
hawkman says, “What are you talking abo….wait, where’d he go?”
fadeaway_man teleports to spot1
Unfade for 3 seconds

#—————————————-

I’ve added my dialog, pointed the camera at what I wanted, and got just the slightest bit fancy at the end.  To make the story a bit more dramatic, I teleport our villain out of the way before we get the game rolling again.  Now we won’t be stuck looking at him until the game removes him.  You may also notice that I’ve called a few specific markers.  That’s fine as long as I place them on the map.  Without them, this encounter won’t work at all, or at least won’t work properly.  I’ve also added an objective which will show up and help the player figure out what to do.  So, what next?  Well, now we have to hunt down our escaped villain, searching for him in the city.  To make this really effective, I’m not going to call a specific marker, so that he’ll show up at a random spot each time you play.  We’ll make it a simple “Fight” encounter, which will keep him from looking for us.

#—————————————-

Encounter: Jewel2
Type: Fight
Villains: fadeaway_man
Minions: thug_with_gun
Primary Objective: “Track the thief down and stop his escape” for 150 prestige
Next: Win

Alert Cutscene:
Camera on hawkman
hawkman says, “How’d he vanish like that?”
hawkgirl says, “It has to be something to do with that cloak…he claimed it had some kind of power.”
hawkman says, “Well, I suppose we’ll find out when we take it away from him. Come on, let’s see if we can’t track him down!”

Start Cutscene:
Cinematic camera on hawkman
hawkman turns to fadeaway_man
hawkman says, “Alright magician, you’ve pulled your last vanishing act!”
Camera on fadeaway_man
fadeaway_man says, “It’s Fadeaway Man to you, bird brain! We’ll see about that!”

End Cutscene:
Camera on hawkgirl
hawkgirl says, “Let’s get this thief into a cell and this cloak back to the museum.”

#—————————————-

Well, that tells a complete story, so we could really stop here, but I like to try and provide a bit more for the player to do, so let’s flesh this adventure out with a few secondary objectives.  Since the Hawks are just getting started in Midway City, it’s only natural that they’d run into the organized criminal element sooner or later, right?  Well, we’ll scatter a few different types of encounters with mob types to spice things up a bit.

#—————————————-

Encounter: Mug1
Type: Building Rampage
Villains: thug_with_gun, thug_with_grenade, thug_with_grenade, thug_with_gun, thug_with_grenade
Allies: civilian_male
Next: If Ally Survives: None
Next: If Ally Lost: None

Start Cutscene:
Camera on Villain1
Villain1 says, “Sorry pal, but you was told that if you didn’t buy our ‘insurance’ bad things might happen to you. You shoulda’ listened. Now we gotta’ smash this place up a bit…”
Cinematic camera on hawkman
hawkman says, “No…I think that you’re the one that should listen, because I’m only going to say this once. Put down your weapons while you can still move your arms.”

#—————————————-

Encounter: Mug2
Type: Heist
Villains: thug_with_gun, thug_with_bat, thug_with_gun, thug_with_bat
Item: crate
Next: If Item Recovered: None
Next: If Item Lost: None

Start Cutscene:
Camera on Villain1
Villain1 says, “Grab the loot, sooner we get it to the fence, sooner we can split the money.”
Cinematic camera on hawkgirl
hawkgirl says, “I don’t think so boys. Why don’t you hand it over now and save us all a lot of trouble.”
Villain1 says, “Look out, it’s the fuzz…and they got wings!”

#—————————————-

Encounter: Mug3
Type: Save Civilian
Villains: thug_with_gun, thug_with_bat, thug_with_gun, thug_with_bat, thug_with_gun, thug_with_gun
Allies: civilian_female
Next: If Ally Survives: None
Next: If Ally Lost: None

Start Cutscene:
Cinematic camera on Villain1 to Ally1
Villain1 says, “Alright girlie, I imagine your rich daddy will pay well to get you back in one piece.”
Ally1 says, “No…please….just let me go….”
Villain1 says, “Now, come along quietly girlie, or things are going to get ugly.”
Cinematic camera on hawkman
hawkman turns to Villain1
hawkman says, “I know things are pretty different here, but I’m fairly certain that kidnapping people is just as unlawful here as it is where we’re from…”

Ally Thanks Hero Cutscene:
Camera on Ally1
Ally1 says, “Thanks Hawkman! Thanks Hawkgirl!”
Cinematic camera on hawkgirl
hawkgirl says, “Girl? Not again! This is going to catch on if I don’t put a stop to it.”
hawkman says, “Later darling, we’ve got bigger game to catch!”

Ally Lost Cutscene:
Camera on hawkgirl
hawkgirl says, “No…she was counting on us!”

#—————————————-

So, these are all simple, and they are all marked as having “None” following them.  Important, any time you use encounters out of sequence, you need to specify what follows them. For example, if I didn’t specify that nothing follows Mug1, after you finished it, the game would go ahead and start a SECOND Mug2.  Now we’ll add an extra treat (punishment?) for those completists who explore the entire map and do all of these encounters.

#—————————————-

Encounter: Mug4
Type: Hunt
Villains: warlord, mafioso, mafioso
Minions: thug_with_gun, thug_with_bat, thug_with_gun, mafioso
Starts When: Mug1 at End, Mug2 at End, Mug3 at End

Start Cutscene:
Camera on Villain1
Villain1 says, “Hey, birdboy! You’ve been interfering in our business…and that ain’t wise…that ain’t wise at all. We got a message for ya’, and it’s spelled in lead!”

End Cutscene:
Cinematic camera on hawkman
hawkman says, “Well, we certainly seem to be making an impression…”

#—————————————-

There you have it, total time for this mission, right around 45 minutes.  I hope that was helpful, and perhaps even interesting to a few of you.  Please post if you have any questions!