DCUG Developer’s Diary #7

Howdy folks, and welcome to another DCUG Developer’s Diary. I’m writing at a sad time, as today the Freedom Force community is mourning the loss of one of the very best of us, my good friend Daglob, who recently lost his long battle with cancer. I hope to be able to write him a fitting tribute sometime soon, but I’m not really up to it at the moment. Yet, he would want the show to go on, and I think he’d appreciate being celebrated with the creation of more FF content, as our community was very important to him. In any case, please know that this project, and all of my projects from now on, will be dedicated to our fallen friends, Cyber Burn and Daglob, Mike and Bill, two good, generous men who I was privileged to know and call friends. I know that’s a heavy note on which to start talking about a video game, but I hope you’ll forgive me being a bit personal and sentimental and will also join me in praying for their families and friends who are missing them today.

In terms of the mod, I’ve got some some cool things to share with y’all today, so let’s chat about some of our absent friends’ favorite subjects: heroes, daring deeds, and Freedom Force, the game that delivers the best of both.

It has been a productive few weeks, though not as productive as I’d have liked. I’ve finished the next two Aquaman missions, both of which gave me more than a little trouble. In fact, the second one gave me such fits and frustrated me so much that I took a few days off and played Crusader Kings II, so I could be frustrated by a different game! Still, I managed to solve the problems…eventually! I’ll tell y’all all about the process, as well as finally talking a bit about my Green Lantern re-work and possible campaign.

Part 1: Rigging for Trouble

This stage of the project began, as did my troubles, with me returning to my old nemesis…the oil rig map! If you’ve been following this feature, you may remember me talking about this blasted map a few posts ago. I had gotten a hold of an object that would serve as my oil platform, thanks to Daglob (who was always willing to help out), but I couldn’t figure out how to make the object work as terrain in the game. I added a set of these objects directly to the map .nif, and they showed up just fine….but characters would fall right through them to the “floor” of the map! I tried approximately a zillion different fixes, and I finally settled on adding super-sized versions of the pier object from the first game to the map, and hiding them right below the surface of the “rig.” This actually worked, though it created some slight pathing issues. So, problem solved, right?

Well, not so fast! When I started actually trying to decorate the map for the mission that I’d had planned for ages and ages, I made an unpleasant discovery: while the pier sections kept my characters from falling through the oil rig, they made the map an absolute pain to work on! You see, in the map editor, you select an object whenever you click on it, even if you can’t see it. So, every time I tried to move a prop or worse, arrange a marker, I’d have to be excruciatingly careful, lest I accidentally yank my ‘subfloor’ pieces out of position, and then I’d have to try to line them back up and sink them back below the surface of the rig, which is a difficult process to do accurately. To make matters worse, somewhere along the line, this “subfloor” system stopped working! I have no idea why this happened, but it might have had something to do with there being other objects on top of it and the combination “confusing” the game’s engine.

Finally, I got fed up and decided to try to find another solution. Once again, I tried a zillion different ideas before finally landing on something that is so obvious, I can’t believe it took me this long to come up with it! The map already has pieces that the game recognizes as “floors,” right? So, why not just copy those onto the rig’s surface? It’s a nice, simple, square shape, and the “floor” pieces of the map are squares as well, so that should work. And since we’re not trying to keep the space under the rig playable in this mission, the two-story problem isn’t really an issue. So, I started copying the actual pieces of the flat map terrain and pasting them into the scene root. Then I maneuvered them up onto the surface of the rig, and once I had the whole thing covered, I dropped them just below the top, rendering the rig itself as navigable terrain as far as the game was concerned! The concept was sound, and it worked like a charm…mostly.

As I was working on this, I re-discovered a quirk of Nifskope that I had previously encountered but forgotten. When you look at the interface, you can see multiple entries for a given mesh piece, usually a top level name and a sub category called “Editable Mesh.” You can manipulate the piece using both entries, but if you don’t use the “Editable Mesh” bit, the results can be weird. When using the top level, I’ve had edits work fine, but I’ve also had them not show up at all or display strangely. In this case, I forgot to use the “Editable Mesh” entry for my edits, and I built the whole map…only for the pieces to show up all out of position because of this eccentricity. So, when I went back and started over again, manipulating the pieces from the proper entry, everything worked fine, and voila, I had a workable map that wouldn’t drive me crazy in the editing!

Now I just had to decorate it, which is not my favorite part of the process because I’m just not that visually creative. And I’m still not 100% happy with the results. However, the community once again chipped in to help me out, and while I was struggling against a lack of proper art assets for what I wanted, RandomDays found me a nice oil derrick object and a helipad, which he imported for me. I think they add a lot to the random conglomeration of game objects I had been using as my decor. After the decoration was finished, I had a map, and all I needed was a script!

Drilling for Danger

The scripting of this mission had a few bumps, but it wasn’t too bad. I wasn’t trying anything too terribly fancy, as the story was fairly simple and straight-forward. This mission saw our finally finished oil rig besieged by fire trolls (with gorgeous new skins by AA and Deanjo2000), and our heroes having to fight them off while also looking for an explanation for their attack. I decided to go for simple and reliable in my mission design, just using basic encounter types, like Save Civilian and Examine, but I mixed this up a bit by simply having some of the encounters overlap. The heroes will be fighting a set of villains and saving civilians in one location, but there is also a clue for them to examine there, spawned by a different encounter. This allowed me to play around with the order of progression, so that defeating the enemies might trigger more bad guys spawning, but the story wouldn’t actually progress until you had found certain clues. My biggest obstacle turned out to be just space and blocking on the map. Even though I made the rig pretty big, taking up most of the space of the map itself, there still just wasn’t that much room to spread things out, but after working with the layout a bit, I think I managed to end up with a mission that didn’t feel too cramped or overwhelming (though I suppose that’s for the testers to say, when we get there!).

A minor obstacle I encountered was trouble with some of my props. I’m having the Aquatic Aces, who are weak to fire, fight a bunch of monsters who are all about fire, and since I’m not a sadist, I wanted to help my players out with this rather difficult situation. So, I added the ability for the players to turn on a “fire suppression system”, which consisted of cold-ray firing turrets that spawned around the map to help you out. That is all built on a simple encounter system that I’ve been using for years, but I ran into an unexpected problem: namely, the nice, tech-looking control panel object from the Freedom Fortress that I wanted to be the controls for the system didn’t spawn in the mission.

Instead, the medlab bed did, which looked quite odd! I had encountered another of those strange eccentricities of Freedom Force, where a single object template sometimes stands in for a whole host of objects. I assume this was done to simplify matters in game design, lumping a bunch of objects together that were different visually, but identical in terms of gameplay. The same is true of many of the building objects. They will have a single template entry, and then in their directory, a number of different meshes. This allows you to use whichever you want in map design, as you can pick the one you want when you go to its entry in the visual editor itself, but it also means that you can’t specify which one you want through scripting or in the editor menus. Fortunately, this is a simple issue to fix, as you can just copy the template entry and point it to the specific one you want. And with that issue solved, I had a completed mission that brought Aquaman back to the surface for a bit of derring-do and an encounter with some old foes from his very first issue! I’ve had the idea for this mission ever since I saw the JLU episode “Ultimatum,” where a similar scene plays out in the opening act. I always thought that would make a great set-piece for an Aquaman campaign, and although it hasn’t turned out exactly as I’d like, I’m reasonably happy with it.

Part 2: The Big Easy, DC Universe Edition

I had always planned for mission #6 to take place in New Venice, one of those classic DC Universe ersatz-urban centers, like Gotham or Metropolis, a fictional town that had shown up in Aquaman adventures over the years. In the comics, at least the early ones, this was a normal American coastal town that had been flooded, turning it into a New World version of the Italian tourist mecca (a change accepted by its populace with an ease and equanimity only possible in fiction). I had originally toyed with actually creating a whole new map, replacing the street texture of a city map with water and things like that.

However, I realized that, while that would probably look reasonably good, and I could even add boats and swimming civilians to complete the illusion, it would, ultimately, be just that, an illusion. While I could make such a map look okay, it wouldn’t really work properly in terms of gameplay. There was no way for me to have the streets be playable space in depth, as canals should be, and there was also no way for me to properly switch Aquaman from swimming to walking as he moved between different parts of the environment. It would have been a really cool setting if I could have made it work, but it just wasn’t meant to be. So, instead, I decided to use an existing map that had a coastal theme, the Liberty Bay map, which had a big sea-wall and dock.

But there was one problem. When I went to write the mission, I remembered that I had already used that map for Coast City in my JLA campaign! Oh no! So, back to the drawing board again. I started thinking about what type of city a “New Venice” might be. If Metropolis was like New York, what would kind of real-world city would make sense as a setting for Aquaman? I finally settled on using a location from my old stomping grounds, the Gulf Coast, and I decided to model New Venice on New Orleans. The name even works! What if the early settlers in Louisiana were Italian and not French?

Well, now I had a concept, but what I didn’t have was a map. So, looking to save myself time and effort, as I always am in mapping, I looked through Alex’s indispensable FF Atlas to try to find an existing map to use as a base. I settled on one of the Berlin maps, which had a nice multi-level elevation, which is admittedly, very unlike the pancake-flat Gulf Coast, but which gave me the idea to create a partially-flooded map, which I thought would look pretty cool. That gave me a base, and the European-style architecture could work okay for a New Orleans pastiche, if not perfectly, but the dark, grim map didn’t really capture the bright and colorful setting of the Big Easy, so I set to work on tweaking it.

First, I edited the actual terrain nif, changing the dark Berlin grass for the brighter, tropical-style grass from the Cuban maps, and making a few other changes. Then I removed all of the German signage and added some more Southern-style street decor. But that still didn’t do the trick. So, I sought out some help to create some New Orleans-inspired textures for the Berlin buildings. I didn’t want to try to gather up all the textures for the map in a custom directory, so I created new building objects and pointed them to copies of the buildings that I skoped to use new textures. Super Powered Yank came to my rescue again by creating those textures, but he also went above and beyond, volunteering to make some DC-centric signage to replace all of the German propaganda, and he came up with a whole set of general and character-specific signs and billboards that added a ton of atmosphere to this map and to the mod as a whole!

The new, colorful buildings and signs helped a lot, but I was looking through the game assets, trying to find something that I could use to supplement the Berlin buildings, something closer to the classic French-inspired architecture of New Orleans, and I came across some of the houses from the Cuban maps, which had these nice little balconies with iron railings. They were very distressed and looked super beat up, but with Tomato’s help, I got a more respectable looking version, used the “Hue and Saturation” tool in GIMP to create a few different colorful versions, and I finally had the makings of an interesting looking city that could work as my New Venice!

Uncooperative Urban Renewal

For my finishing touches, I added a big water object to the lowest level of the map, adding it directly to the terrain nif so that the cursor wouldn’t react to it in-game, and then I decorated and set the map up for use. Then I just had to write the mission and get it working. I had a pretty straightforward plan. I wanted my big monster, Chemo, to move through the city destroying buildings. That should be simple, right? Wrong. This mission drove me nuts! I thought I had it all figured out from the beginning when I realized that the brilliant creator of EZScript, M25, was even more brilliant than I had realized; he had designed the object-centered encounters to work with more than just one object. So, I just used a “Guard Object” encounter and specified a range of buildings that I set to spawn throughout the city. I made sure they were positioned where I wanted by actually placing them on the map, then converting the buildings to markers and naming them for the encounter, “no_object1, no_obect2,” etc. I thought I was good to go, but when I tested the mission, Chemo smashed the first set of buildings which were all next to where he started, but then he just stood around, drained of all motivation and direction. It turns out that he was too far away from his second objective, and a LOT of experimentation with different setups just couldn’t solve that problem.

So, I had what I thought was a clever idea. I’ll just break the encounter into sections. I’ll spawn placeholder buildings with a CS at the beginning of the mission, and then as each encounter ends, I’ll fade the camera, destroy the next building, and teleport Chemo. Then, as the next encounter starts, it will spawn the building into the right space, and its Alert CS will unfade the camera. That should have worked fine, right? Well, I thought so too, but boy I was wrong! It turns out that the “destroy” command just doesn’t work on buildings, no matter what you do. I’m guessing it’s because buildings are designed to collapse in stages, the only objects like that in the game. So, was I out of luck? Was I going to have to radically redesign the mission I’d already written, settle for something much smaller-scale? I wasn’t sure, and this is when I walked away for a few days.

But, a couple of days later, I had an idea that just might work. I thought, if it’s the fact that these are building objects that is giving me fits, why not simply copy them and make them into Generic object types for my placeholders? I tried it, and everything worked like a charm! Finally, Chemo could smash his way through the city to his heart’s content, moving the action nicely through the map and ensuring that he doesn’t just get stuck in one spot. I have to admit, I’m fairly pleased with myself for figuring this out. Poor Lady Grey had to listen to me talk through the plan as I was working it out, and I imagine she’s even happier than I am that I’m done with this mission!

Part 3: Let’s Ride!

So, in addition to my two new missions, I also had some base scenes to create, and while there wasn’t nearly as much backstory, world-building, and exposition to get through in this section, I wanted to do a little something to keep developing our Aquatic Aces and their environs. I just used one of CK’s excellent underwater maps for my setting, but I was able to do something a little special with it too. There’s a visual I’ve wanted in my Aquaman campaign for years, one associated with the classic version of the character, and I was pretty sure I was never going to be able to do it. Yet, thanks to RandomDays and Tomato, this little dream is coming true, which is just plain neat. Now, keep in mind, these images are still an alpha version, still needing skoping and only having placeholder skins.

You see, for decades, a common visual for Aquaman and the Aqua-Family was them riding through the seas on giant seahorses. It’s a charming and fun presentation of the character and his fantastical setting. The old 60s Aquaman cartoon, which is very much a product of its time, but which I love despite its silliness and poor animation, helped to cement this in the zeitgeist as a visual commonplace for the Sea King. Obviously, this presents all kinds of problems for FF, but RandomDays managed to import a really nice, fanatasy-themed seahorse mount, and Tomato is at work creating some great skins for the specific sea-steeds of the members of the Aqua-Family. This is a minor detail, something that won’t add to gameplay, as I don’t have access to proper animations to make these versions playable, but it’s a wonderful and atmospheric addition to the Aquaman campaign.

Part 4: In Brightest Day

One of my big goals for DCUG 2.0 is to expand the roster and add in a lot of characters that I didn’t get to before, but just as important is an updating and reworking of my existing cast. I was working on the latter when I started reworking my existing Green Lanterns to make them more unique and interesting, and that spilled over into me adding in a ton of new Lanterns, including a lot of the classic alien Lanterns, each customized and having unique builds in several key ways! While the Lanterns all had similar power sets, because they are all using the same equipment, I figured the way they used that equipment would be different, both in terms of tactics and in terms of imagery. So, while every Lantern had some basic powers, they also had at least one unique power, and even their similar powers often had unique visuals, as they would use different images for their constructs. This led me to dive down the rabbit hole of FX, and Cyber Burn came to my rescue several times throughout this process, my good right arm, as always.

One of the touches that I was most pleased with was giving each and every Lantern a distinct weapon they could summon with their ring, drawn from a weapon pack that Cyber had imported and ‘Lantern-ized’ for me. Hal, who strikes me as a baseball fan, summons a baseball bat, while Guy, who is more rough and tumble, gets a spiked club. Kilowog gets his trademark hammer, and so-on. It adds a bit more personality to characters that would otherwise be pretty similar in game.

I also gave every Lantern the ability to summon custom constructs as minions. Hal summons jets, John Stewart summons Marines, and Kyle Rayner summons giant robots, while my alien GLs each get their own thematic summons as well! This took me scouring the archives for suitable meshes and having Cyber, Daglob, and others whip me up some green versions of their skins, and I even made a few myself as I began to haltingly explore some of the tools in GIMP. Interestingly, the lessons I learned while working on this part of the project months and months ago would eventually help me in my mapping work for the Aquaman campaign.

Alright folks, that does it for today’s post. I hope that y’all found this intersting and useful. We’re heading out of town for a week and change on our usual summer trip to see family, but I’ll be back home and back to work on the DCUG soon. In my next post I’ll talk a bit more about how the Green Lantern campaign got started, as well as about the troubles that may spell its end! I’m also going to try to finish the final map and mission of the JLA/JSA crossover, so stay tuned!

DCUG Developer’s Journal #3

Welcome back Freedom Fans!  Today’s journal covers some more testing, but it also has a teaser for something that is just starting to come together!

I have been working on testing the final expansion JLA mission (other than the JSA conclusion missions), #17.  This features the conclusion of the Injustice Gang storyline, with the League ambushing the Gang in their headquarters, much to their surprise!  I drew heavily on the excellent JL:TAS two-parter, “Injustice for All” for inspiration for this story.  Like the second episode of that arc, we begin with Batman captured and with the League rushing to his rescue.  However, Luthor has an ace up his sleeve, and the villains have backup in the form of the deadly dangerous Amazo!

I thought hard about putting Amazo into his own arc also based on JL, but I figured that I needed to concentrate my storytelling in this campaign in order to get the most bang for my buck because of how much time and effort it takes to create a single mission.  I can plot out endless stories, but there are only so many hours in the day to actually make them.  Thus, I have a less than optimal setup, but I think it makes for a nicely dramatic mission.

Anyway, because of my stacking the deck against my players, I decided to give them a way out in case they found Amazo too much to handle in addition to the other villains.  Using a setup I’ve used often before for turrets and other defenses, I gave Amazo a “kill switch” of sorts.  I created Amazo with a custom encounter, giving him a custom name so I can deal with him between encounters, but I also created a switch in that encounter, which, when flipped, triggers a CS that kills Amazo (bob).  To give the players a hint, I put in a time-delay CS to tip them off.  Check it out here:

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

Encounter: Meanbot1
Type: Custom
Actions: switches exist, villains fight heroes
Villains: amazo named bob
Secondary Objective: “Disable Luthor’s new weapon” for 2500 prestige
Switches: ff_science_equipment
Marker: warehouse2
Next: None

Start Cutscene:
Wait for 240 seconds
Hero says, “Look! If we can get to Luthor’s equipment, we might be able to disable the android!”
Red Arrow on warehouse2_object1

All Switches Turned Off Cutscene:
Camera on bob
Play effect effect_electricalburst at bob
bob says, “Nooo! I had only begun…to live…!”
bob is killed
Play music music_05_fort_ft

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

The mission itself was, once again, a bit of a mess at first, but fortunately, it was mostly an easy fix.  I had mixed my metaphors again in the main CS where the heroes confront the villains, using ‘real’ names (black_manta, cheetah, etc) instead of the substitution names I had given those characters so I could manipulate them between encounters (wet, cat, etc).  That kept the CS from playing.  You see, I had split the villains into two encounters, with Luthor in one and the rest of the Gang in another.  I did this because I had to get clever to work around Luthor’s Energy Shield interrogation bug, which I described in the first journal entry.  I had a devil of a time coming up with a workaround.

The simple thing would be to just use a Cutscene encounter with a new Lex after the defeat of the first, but this would mean you wouldn’t have to defeat the entire team to win.  I tried using that strategy, but starting the CS with a “Starts When” condition, triggered once the other encounters are finished, but those are always temperamental.  It didn’t work, so I tried a LOT of other things before settling on an unorthodox solution.

I made the final encounter a custom one, with conditions to turn off Lex’s AI and the “Allies Want to Chat” condition, meaning he’s interrogatable, without having to be defeated first.  This means that you won’t be able to talk to Lex until there are no enemies near by.  It’s not a perfect solution, but it gets us much closer.  Now, chances are, players will finish off everyone else before trying to talk to Lex.  Unfortunately, the Chat encounters have never really worked, but I got around this too.  I made the CS the End Cutscene for the encounter, so even though a Chat CS won’t work, as soon as the players click on Lex, the End CS plays, which has the same function.  And, viola, we’ve got a functional mission that even has some neat features.

With those intermediary missions finished, I’m on to the new JSA missions!

First, however, I haven’t just been working on testing.  No, I’ve been hard at work updating and tweaking other parts of the DCUG as well, and with the help of our riduclously talented and awesome community, I have a few new additions to show off.

There are a ton of really fantastic meshes, skins, and skopes out there for my favorite hero, Aquaman.  However, as you might imagine, I’m a tad picky about him, seeing as he is my favorite.  So, with the help of the community, and especially Detourne_me, I got an all-star team of mesh, skope, skin, and keys to create my ideal Aquaman for FF.  I also tweaked his powers and abilities, and he’s now more awesome than ever.  I even changed up his aquatic telepathy to use the ‘doot-doot-doot’ sound effect from the classic cartoon!



This awesome Aquaman deserved equally awesome villains, so asked Deanjo2000 to customize some new versions of Black Manta and Ocean Master.  The results are just plain stunning!  Dean really did an exceptional job on both, but his Orm is especially great because he was able to take my vague, unhelpful requests, and turn them into a really nice version of the New 52 look for the character that also incorporates some classic elements as well.



And finally, Detourne_me came through once more, providing me with something I expected to be quite tough, and doing it in record time as well!  Feast your eyes on a classic piece of DC war-comic history….the Haunted Tank!

These are only the beginning, too!  I’ve got several more skopes/skins from Dean and from others that I’m going to be using to update and expand the mod in the days to come.  I’ll post some teases for such updates in these journals from time to time!

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!

The Ease of EZScript

In honor of the EZScript Script-Off, I thought I’d take tonight’s post and talk a bit about how to get started with a mission and also post an example script.  For those of you following my “Projects from the Ether” series, don’t worry, it’ll be back soon.  EZScript was, as I said in yesterday’s announcement, a great tool before the advent of the Editor, but now that we have that as well, it is really surprisingly easy to use.  To get started, I’d advise you to read the excellent manual that comes with any download of FFX3.  You’ll find a specific folder for EZScript, and there is tons of great info in those documents.  However, I can give you a crash course here to help you get the hang of it.

  1. First off, decide what you want to do.  I know this may sound like common sense, but it really does help to have a clear idea going into a project.  Decide which characters you are going to use, and make sure that you give them names that won’t cause EZScript problems.  If you’re using herofiles, avoid apostrophes or anything other than letters.  Also, keeping names lowercase is generally a good idea.
  2. If you want to use a map already set-up to work with EZS, (meaning all of the events in your mission will occur at a random spot on the map) you can simply open up the editor and start writing, but if you want to dictate where things will happen, you’ll need to place “markers” on the map you want.  You’ll want to read the Manual to get a good idea of what goes into making EZS maps, but I’ll go ahead and tell you the basic types of markers any adventure needs.
    1. hero_1, 2, 3, and 4 (assuming you’re using 4 characters)
    2. encounter1, 2, 4, etc.  You don’t NEED more than a few of these if you’re going to use specific markers, but it’s usually a good idea to have a dozen or so in case someone else wants to use the map.  All encounters that aren’t tied to a specific marker will randomly appear and one of these.
    3. skirmishspawn (very important and often forgotten)
  3. Next, you start writing your actual mission in the editor.  The easiest way to do this is simply to use someone else’s as a base.  I constantly reuse my own work, especially the stuff I KNOW works, and it saves me time and cuts down on careless errors.  You can also start a mission from scratch with the editor.  The first thing to do is to click on the “Panels” menu at the top of the program, and navigate to whichever directory you’re working in.  Doing this will let the editor recognize all of your characters, special objects, even your herofiles!
  4. Now you’re ready to pick from various different types of encounters to create the ACTION of your adventure.  If you’ll look at the big white box on the top right, you’ll see a drop down menu where you can select different types of encounters, objects, characters, and basically all of the elements you need to create your script.
  5. If you want, say, Spider-Man to stop a mugging, then chose the Save Civilian encounter, and you’ll be webbing street punks in no time!  Just chose whichever encounters you like, fill in the blanks, and you’re all set.  Missions will run straight from one encounter to the next, unless you specify something different, and as soon as the last encounter is finished, the mission will end.  Also, if you want to make sure you didn’t make any typos (my nemesis!), then click on the “Tools” menu at the top, and select the analyze option.  EZScript Editor will actually point out all of your mistakes in red!

So, just how easy to use is EZScript?  Well, I put the following simple mission together in under five minutes.  Assuming you have herofiles or built-in characters named “ninja” and “deadpool,” you can drop this in your “stories” directory and play it on any EZScript enabled map.:

Story: Ninjageddon

#Sample EZScript adventure
#
#———————————-

Encounter: Opening
Type: Cutscene
Allies: civilian_female

Start Cutscene:
Cinematic camera on deadpool
deadpool says, “Something clever involving the army of ninjas I’m about to kill.”
Ally moves to deadpool
Ally says, “Help, ninjas!”

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

Encounter: Badguy1
Type: Hunt
Minions: ninja

Start Cutscene:
Cinematic camera on Minion
Minion says, “Kill deadpool!”
Camera on deadpool
deadpool plays animation melee
deadpool says, “Something clever…again.”

End Cutscene:
Cinematic camera on deadpool
deadpool says, “I need to stop these ninjas from blowing up a bus full of children…or some such.”

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

Encounter: Explosion1
Type: Disarm Bomb
Villains: master_ninja
Minions: ninja
Bomb: ger_crate_ammo
Time: 160
Next: If Bomb Disarmed: Win
Next: If Bomb Exploded: Lose

Start Cutscene:
Cinematic camera on master_ninja
master_ninja says, “You have come to me to die!”
Camera on deadpool
deadpool says, “Blah, blah, blah, clever clever.”

Disarm Bomb Cutscene:
Cinematic camera on deadpool
deadpool says, “Was it the red wire, or the blue one?”

Bomb Exploding Cutscene:
deadpool says, “Ouch!”

Bomb Disarmed Cutscene:
deadpool says, “That got it!”

Bomb Exploded Cutscene:
deadpool says, “Ouch!”