Post-Mortem For 'I Am Prey' (ALL 3 PARTS POSTED!)

That was absolutely wild.

I have been making games since I was 10 years old, but have not been finishing games. A few games came very close to release (one of them is just missing a main menu, really), but I Am Prey is the first to see public players, even though it was just a beta version.

I have a lot of scattered thoughts, and I’m not sure how to flow one into another. They’re all very tightly-connected, but it’s a matter of chronology versus relevance, so this might be a bit of a rainstorm of remarks.

The idea for this game occurred to me in November of 2022. For many years I’ve been having a recurring nightmare where I am being hunted through a facility of some kind. It looks like it could be a university, if it only had classrooms. The hunter is unstoppable. No amount of damage allows his form to accept defeat. If I reduce him to paste, then the remains will slither along the floor toward me. He’s around ever corner. He cannot be tricked, distracted, or reasoned with. He will not speak to me. He does not grow bored, and does not rest.

Above all, he just looks like some totally normal guy.

I have been having a rough time for a long time, and sometimes it feels like I’m sinking. I don’t ever try to find meaning or reason in my dreams or nightmares, for reasons that would take a whole other post to explain. If I tried to find reason in them, though, then maybe this hunter is the embodiment of The End, which I am constantly and viscerally aware of, speeding relentlessly toward me.

This hunter had tormented me for years, multiple times a week. I would often wake up on the verge of a panic attack, or stunned and disgusted by events during this iteration of the chase.

In November, I decided to put him to work. I tried my best to come up with a story that would explain his character, and I took a lot of artistic liberties to make him look a lot more menacing. This story was more familiar to me, but not the kind of story I usually write.

And then stuff hit the fan. I’m not going into specifics, because I honestly can’t remember them, but I can recall the emotions: Panic, exhaustion, eyes watching me, and sleepless nights. The idea would be on hold until December 20th, 2022.

But how did I get here, to this forum? Why interactive fiction?

Like most things in my life, this is a fish-out-of-water story. I did not grow up with interactive fiction, and I did not arrive here from any writing communities either. Some time in 2006 or so, I was introduced to one IF game, called Lunatix. It will be the only IF I would have played for another decade, but it did make me realize that text could be used for making games, just as well as graphics.

And boy, did graphics slowly become a wound in my side. Over the years, I realized the chokepoint in my development process was graphics. I could make them, but they took too long, and burned me out too quickly. I was too poor to afford an artist to join my one-person team, so—in recent years—I decided to lean into IF.

I didn’t know anything about IF.

Everything I brought with me was from visual game dev. That’s why I released a beta; that’s pretty standard practice, usually, even in competitions. I Am Prey was made with the direction of a visual indie game developer.

I simply make mechanics-driven games, and now I make them in text, too!

I thought that was all there was to it.

It took me about a year to realize that the IF community is almost completely separate from the other gamedev communities, and it seems to have more ties to writer communities (gosh, I wonder why /s). A lot of the ways things work around here are closer to writing or music groups than any dev communities I’ve seen on Discord or YouTube.

And oh my gawd, when I realized this, suddenly everything changed color, and the shapes became clear: There was culture shock happening every day, but I wasn’t noticing half of it. I thought I was secure in my footing, but then I realized there was just a board strapped to my feet, while I was actually tumbling through a raging river. Luckily everyone was kind enough to keep me from slamming into rocks along the way.

Then I met @pinkunz, who became a teacher of sorts, showing me the way, so that I could slam into rocks properly and with intent this time.

He had the context, and had been around IF for a lot longer than I had. At last, I had someone to explain the contexts and history. I thought I had taken a short walk across the street when I left graphics behind, and he showed me how I had actually walked into a completely different country.

Seeing the brilliant works of other authors had always been fascinating, and now I could contextualize their creations with his help. However, I was still set on a clear goal: Make the games I would have been making anyways, but now with text. This time, though, there was someone to help me speak the local language and learn player expectations. I have a stronger appreciation for the history of medium now, and where it is today. Maybe I still feel like an alien, but that’s nothing new to me. I still have my destination, but it seems like I will be building my vehicle from parts manufactured here.

December 20th rolls around, and it’s time to start coding. If I took any breaks, it’s because my partners both forced me to. If I slept, it’s because my partners both forced me to. If I ate, it’s because I set alarms. I’ve been unemployed this entire time, so I promise you that I had spent every possible hour working on this game from the time I started, to the submission deadline of SpringThing 2023. If I had been goofing around on the forum, it’s because one of my partners said “Alright, it’s mandatory relaxation time now. Step away from the computer.”

I had considered aiming for a later comp, actually, but Pinkunz urged me to set my sights on SpringThing, even if I had to release a beta version. That wasn’t a huge compromise to me; people release betas to competitions all the time. As the deadline approached, and the crunch became crunchier, I also began to learn that the idea of releasing alphas and betas was more similar to the sentiment in writing and music communities than in gamedev ones, which meant: Don’t release your alphas and betas.

So I decided to submit my beta, because—for me—it’s more important to embrace the fact that I came from visual gamedev, because I still feel deeply connected to that way of doing things. Some stuff is culture shock and adaptation, but other stuff is making sure that when I add my own voice to the mix, that it’s still my own voice.

I was seriously considering dropping out, though. Pinkunz urged me to keep aiming for SpringThing, as it was the home of experimental works of IF, and I definitely aim to be experimental.

But I was still full of uncertainty. The realization that this was not your average competition started to really sink in. I brought it up with one of my partners, and the response was something along the lines of “Stuff is happening right after SpringThing, so it’s best that you offload this anxiety now, because a lot of time might pass before you can enter the next comp, and relieve your anxiety later.”

So, SpringThing 2023 it was.


And this concludes the environmental half of the story. Once I gather a few more spoons, I will write the next half: The hilarity that was developing this game! I’ll make an edit here and add a link, once it’s written. I’m also concerned I’ll run the risk of going past the post length limit, if I keep going here.

But to put a pin in this, I will say I am extremely thankful for this welcoming community. I stumble a lot, I’m generally quite strange, and I’m gonna be making a lot of really weird stuff in the future. I appreciate your patience, assistance, and kindness. This forum is amazing.

EDIT: Part 2!

27 Likes

Thanks for sharing, Joey!

6 Likes

You give me far too much credit, Jess. You had this in you all along; I just pointed out a soft place to land.

Deeply happy you stuck it out and looking forward to the postcomp version, when you have the spoons, of course.

9 Likes

The sound I made when I read this was not natural, lol.

Really exciting to see how your entry got made, and how the process to get there was :eye: 0 :eye:

6 Likes

This was so sweet. The Campfire Meows are definitely glad that you stuck around on the forums! And I’m glad that your partners were there to remewnd you to take care of yourself through the relentless grinding slog, too.

6 Likes

I Am Prey is SO original. I can’t remember another time where I played a parser IF game that felt like a video platformer game. Thanks for sharing the process with us-- now I can see WHY it felt like that.

You really done good.

7 Likes

This entire forum is so kind. :face_holding_back_tears:

10 Likes

I feel like you did an incredibly good job adapting to the local language and expectations. The Survival Guide and the intro made me expect something way out there, and a big part of my impression when I finally played the game was how well it DID fit my expectations of a parser IF piece. I remember thinking, “If someone like Arthur diBianca had made this, with no warning about it being unusual, no one would have batted an eye.”

And I think your background in visual game development gives you a great design sense for this kind of thing, because usually when IF authors try to emulate other genres it feels stilted and this really did feel like a good adaptation of an action game.

7 Likes

Dually-noted! :grin: This something I want to adjust a bit more for post-comp!

YESSSSSSSSS!!! I did it!!! :grin:

10 Likes

Part 2: The Story

Okay, so this post-mortem might go on for three parts, lol. I had a lot more to say about how I wrote the story than I expected.

Initial Plans

Some time in November, I had written the project document for I Am Prey, which included the game mechanics, story, character personality traits, some algorithms, and plans for the AI.

But, as I mentioned earlier, stuff had hit the fan, so I couldn’t actually implement anything until December 20th 2022.

Now, while it’s my name on the game, but I cannot stress enough that a team worked on this. I was the only programmer, and the game was my idea, but this would not have been possible without help. Every time I try to credit these team members, they outright refuse to admit that they had anything to do with it, or insist that I’m somehow giving them “too much credit”.

Look! There’s one now! :wink:


On the Shoulders of Giants

The first giant I’d like to credit is Mike Roberts, for developing TADS 3, as well as the Adv3 library. Upon this foundation, I’m also crediting Eric Eve for the spectacular Adv3Lite library, especially for making it so flexible and customizable.

This forum also really saved me at multiple points, when I needed emergency technical help, and I cannot thank y’all enough for that.

Also, holy cow, the TADS extension for VSCode, created by Tomas. As a Linux user, this extension made the entire dev process accessible in so many ways. You also make it on the list of giants!


Technical Help

I’d also like to give a shout-out to @blindHunter for making a TADS 3 extension that sets the output style to something more compatible with screen readers. I didn’t know these settings existed (or were necessary for compatibility), so thank you for that!


Holding Together

For the core team, the first huge chunk of credit goes to my partners. I need you to understand that at the end of every day, I had an anxious spiral of self-doubt, probably because I was pushing myself so hard. They were both there to pull me out of it and tell me to eat and go to sleep, lol. After a while, it became clockwork enough that my partners anticipated it ahead of time, or I pulled myself out before it properly started.

Akira, in particular, was also the Whimsey Consultant on the core team. All the goofy stuff in cat mode, and many details in the room descriptions were Akira’s idea.


Where it all began

This part contains spoilers for the game, post-comp plans, and also my intended designs for various story elements and characters. You have been warned.

CONTENT WARNING: Discussions of suicidal ideation

The first thing I needed to figure out was the antagonist. I was pretty certain that this character would be the focus of the game, and a lot of the design would come from the consequences of this character.

I decided that while the hunter in my nightmares was uncanny in a mundane way, I wanted to do something a bit more stylized for the game.

A huge inspiration were the books Blindsight and Echopraxia by Peter Watts, which feature a biologist’s sci-fi approach to vampires. Vampires, in these books, are the natural predator of humans, but eventually went extinct due to a evolutionary glitch in their brain structure. There isn’t really anybody home behind a vampire’s eyes. Their bodies are propelled largely by instinct and reflexes, like a machine lacking self-awareness. They are aggressive, efficient, and terrifyingly intelligent.

I wanted my antagonist to take from notes from this design, while not being a perfect copy.

In I Am Prey, the country of the setting has made the descent into techno-fascism a long time ago. However, the primary instability of fascism is that it always needs an enemy to destroy, and this eventually causes it to slowly destroy itself as well. It’s implied during the dream sequence that the fascist regime is on its last legs, and is essentially putting the blame on nameless unknowns at this point. The regime holds all this power, but is still falling apart, and is looking for a way out.

This is where the clones come in. Designed in secret, clones are fitted with a cybernetic brain that upholds a behavioral code, much like how Asimov’s Three Laws are a behavioral code for robots. Just like the Three Laws, the Clone Laws are flawed, which becomes a story point later.

The idea behind the clones is the fascist regime wants a hunter-killer to slip into the cities of the country, and act as a class of inquisitors, wiping out parts of the population which fail to meet some minimum level of zealotry to the party. They are brilliant, tactical, and literally unable to give up. The tech in their skulls would permanently and thoroughly enslave them.

Or so the plan was. The specifics of how the facility was taken over have been planned out, but will be detailed in the post-comp version.

A Begging Antagonist

The Clone Law largely boils down to “the enemy must not win”, but “the enemy” is left ambiguous, because the regime needs to be able to target whoever is next on the chopping block. Most of the time, “the enemy” is death itself, which means it is fundamentally impossible for a clone to accept death. This is the primary core of the antagonist as a character.

The antagonist is the machine that keeps on working, long after the surrounding structures have gone offline. The antagonist is begging for death, but cannot die, because the Clone Law fused to his brain won’t allow it.

The clones realized that the fascist regime was built on lies and propaganda, and typically enemies aim to deceive you. Therefore, the clones reasoned that the regime itself (and the facility staff) were the first enemy. Once rid of them, the clones only had one enemy left: Death. They could not allow their first enemy to retake the facility, which was now under siege by the regime (because outsiders do not enter a closed environment full of creatures that are genetically engineered to kill you and out-think you).

Clones are not social creatures, and are designed to be lone hunters. They were not designed to have compassion, but they do have a cold sort of empathy: They know you better than you know yourself, but they still aim to kill you. They are tactical and aim for the solution of least effort, whenever possible.

So we now have our antagonist. He begs for death, but cannot bring it upon himself. The Clone Law system in his brain compels him to make an effort to succeed, even if he doesn’t want to, and even if the situation seems hopeless. The antagonist (and player) are both not entirely in control of their own bodies, because of Clone Law.

The antagonist must keep the facility active, or else the spies tapping the power grid from outside will know it’s offline and empty. He must stay alive to perform this mission, but knows he is the most qualified to perform it. He will not allow anyone to take his place, because it’s his mission. He grows new clones for food, but grows them alive, because he hopes that enough of them will evade him, so he can finally starve to death, and it won’t be his own fault. He is strong-armed into an existence that will not end, and must create elaborate methods to die, such that the Clone Law in his brain cannot detect it and stop him. Similarly, he also strong-arms the player—named “Prey”—into escaping, because the player also cannot accept death, and cannot allow the regime outside to retake the facility.

However, he cannot just sit idly while Prey leaves. Prey is a human-eating hunter-killer, just like he is, and allowing any clones to escape might benefit the regime, because the regime wanted the clones outside, to feed upon dissenting citizens. The Predator has no way of guaranteeing that Prey will be a pacifist on the outside, so there is also a genuine motivation to hunt Prey down, too. Also, Clone Law still dictates that he cannot die, and must eat Prey to survive.

And this is where the excessive profanity comes in. The antagonist is a shell of his former self, and is deliberately pretending to be a manic and wild killer, because that would better-motivate Prey to run away. The antagonist does not cuss out of anger; the amount of profanity coming from him is, frankly, ridiculous, and this is a clue that he is acting. He has taken on the persona of a monster, because monsters yield results. Prey is better-motivated to escape a monster than some broken-down victim of the regime. In fact, if you peek into the breakroom before he starts looking for you, he can be seen emotionally bracing himself for the chase, and reluctantly stepping into his role of “monster”. He tries so hard to be a scary monster, but he doesn’t have the heart for it, so he overcompensates, and part of the overcompensation is excessive profanity.

Having a game where both characters are so psychologically-different from the average human was also quite a challenge, and felt like taking a leap of faith. Writing these characters accurately meant accepting the possibility that 95% of players probably wouldn’t understand, relate to, or empathize with either of them, and would probably find them jarring. It meant that really committing to the bit also meant that all my efforts could be labeled as “bad character writing”, because so many stories assume the characters must be relatable in some way. I plan to add a lot of hidden items in the post-comp version, which will be written by facility staff members who hint that clones do not think about things like we do, which should hopefully clue the player into another way of examining these characters.

Fortunately, quite a few players understood the characters, and picked up on the little clues I left in the game, which hinted at the nature of the Predator and Prey.

One little detail that was really hard to stick to: The antagonist should never command the player to give up. I’m 99% sure I managed to commit to this. For example, the antagonist can insult the player, or suggest that the player cannot keep this up forever (both of which are part of the act). However, the antagonist will never say “Come back here!” or “Stop running!”

Why?

Because they’re both clones.

The Predator knows that Prey must run, and not let an enemy win (because of Clone Law). Therefore, it is a complete waste of effort to make such commands, and the effort is better spent on insults, taunts, and the rare compliment on performance, because the Predator knows that Prey can glean more data from those kinds of verbalizations. It also helps the Predator maintain his persona of “monster”.

And so we have our antagonist: A creature who is both warden and prisoner, and is forced to make it your problem, too.

And what is our antagonist named? Well, he was named after a number, so his name is actually his own creation. I tried to figure out what he would name himself, if he were attempting to be a tryhard scary monster.

The name I came up with was Skashek, which you can discover if you hide in a room while he searches it, multiple times.


Additional Thanks

A huge shout-out to my dear friend, Ayoko. I spent several phone calls with her while she explored the characters, tested the internal consistency, and shook the tree for plot holes to fall out. A lot of little story details came into play because she wondered what was hidden behind the construction signs.

Another shout-out to Pinkunz, as well, who similarly tested the internal logic of the story to examine the design, logistics, and strategy of the fascist regime. He also reviewed the downfall of the facility, and vetted the strategic arrangement of the Predator-Prey scenario.

Welcome to the team!


Aaaaaaand this is where I run out of spoons again.

Thank you again for your time!

Part 3 should cover the coding side of things, and I’ll post that here, once it’s written!

13 Likes

Wowsers Joey… that’s some complex and compelling backstory for the game!

3 Likes

Thank you!! :grin:

The post-comp version will have a lot more lore bits that can be found and pieced together, but holy cow I did not have time to try to put these into the comp version, lol!

5 Likes

Part 3: Coding and Crunch

WARNING: There are definitely spoilers beyond this point!

So December 20th, 2022 rolls around, everything has finally calmed down, and I decide I’m not worthy of rest, and I should take the project document I wrote in November, and get right into making this game.

The first thing that I set my sights on was the parkour system, and there was a specific logic I was approaching this with. I knew that the schedule was going to get a bit tight at the end, so I tried to arrange the list of tasks in a way that could create defined boundaries for other tasks, or allow tasks to be done in parallel.

My plan was the following:

  1. Create the parkour system, which would inform the possibilities of the map.
  2. Create the map, which would inform the bugfixing required for parkour, and set boundaries for the AI antagonist.
  3. Send what I had so far to the testers, who would help sand down any navigation quirks of the parkour system.
  4. While the testers did that, I would develop the antagonist AI, who did not depend on the parkour system.
  5. Once the AI was done, I would fix the really serious bugs, send another version to testers, and then fix the rest of the bugs.
  6. As the AI was being tested, I would implement any remaining game mechanics, descriptions, and other details.
  7. Testing results would come back for the AI, and at this point I should be doing the final process of bugfixing.
  8. Send the final result to Nightshademaker (my professional game tester friend), who already agreed to do intensive testing of the AI and parkour within two days of the SpringThing deadline.
  9. I expected Nightshademaker to basically find the last few rare crashes, which meant bugfixing and writing tutorial materials should only take the last two days.

The old phrase of “no plan survives first contact with the enemy” held true. Stuff went very awry at the end, and I am extremely lucky to have gotten the testers I did, and also have finished anything like a working game by the end.

Parkour!

The “parkour” system was correctly pointed out by a few reviewers as “simply climbing”. There’s a reason for this. The original parkour system was going to have a lot more going on, and I Am Prey was meant to use a lot more of the system.

However, it turns out that when a crazed maniac is hunting you down to kill you, you don’t actually have the luxury of time to perform complex parkour maneuvers from A to B. As a result, most routes between rooms usually involved climbing on one object, maybe jumping to another, and crawling into the vents of the facility. I kinda kept calling it a “parkour system” because I still have plans to make it a standalone extension, which has quite a few more features than what were used in the game.

Perhaps I should have swapped steps 1 and 2…

Anyway, I got to work making a parkour system that had a way larger scope than what was really necessary. More on this is detailed in this thread.

Around January 18th, 2023, disaster struck. You can see me panic here and here.

Okay, so what happened? Long-story-short, I had accidentally made 3 different use cases of what was effectively the same logic, but cloned 3 times. It didn’t occur to me that it could have been refactored until I had tweaked and refined some stuff near the end, and then I realized what a bugfixing nightmare I had created for myself. However, the act of consolidating everything would have required me to refactor…well…everything. So it was, by definition, a total rewrite.

At least once a week, until the deadline, I had spent at least 30 minutes cursing myself for needing to do this. This rewrite cost me a lot of time, and I was a moron for not seeing the patterns earlier. It wasn’t even a situation where I didn’t plan it out first. I did. That’s the issue. I didn’t recognize the patterns in the plan until I was almost done with the parkour code, and the patterns suddenly appeared in the code itself, and not in the abstract plan I was working from.

Another unexpected challenge was adding some new logic, which evaluated if something was in touch range of the player or not, but with the parkour rules in mind. This alone carried at least 95% of the bugs found by testers. It turns out that the logic for creating and enforcing routes was the easy part!

Oh yeah, and also rewriting the actorInStagingLocation logic, which could automatically find a short route to a nearby object, within certain complexity constraints.

The parkour system was actually only 80% done before I decided to make the map. Functionally, the system was done, but my own bug hunts were surface-level at best. I decided that if I made the map now, then I would know what parts of the parkour system needed most of my attention, and then I could focus my efforts when the real testers got their hands on this.

The Map

So here’s a fun fact, which I don’t know if anyone has picked up on yet. The core design of the map is based entirely on how many turns it would take to get from A to B. Basically, the design was to link a couple loops together, to create the best chase experience, should the player get caught. From this structure, I figured out the parkour routes that would make for excellent shortcuts.

Once I had all of that figured out, I went in and did some (literal) worldbuilding to figure out how the life support systems work, how the air flows, how the plumbing works, how heat is managed, how logistics are optimized, and then how the history of the facility dictated where some remaining rooms were placed. Then, I added some extra history of what our dear antagonist did to the place, once everyone else was gone. Of course, 90% of this work would not show up in the final product, but having this information figured out would inform how I would write things that did show up in the game!

Additionally, I’m certain there would be players who might go around, collect clues, and try to figure out how this stuff would have worked.

The best part about having an antagonist who is literally making an arena to chase the player in is…if something seems weird, it’s probably Skashek’s fault.

Mostly-empty industrial kitchen? Skashek didn’t want the player improvising much. Mostly-empty assembly shop? One of the Prey clones printed a weapon once, and ruined it for everyone else. Missing furniture, or furniture in strange spots? Skashek did some renovations. It’s incredibly convenient when a major character in your game is just as invested in making a game-ified area as you are. In particular, a lot of people asked me why the locked doors around the utility corridor were so obviously terrible at providing security. Well, it’s simple: Two of the doors are locked to create a dead-end. If Skashek can funnel the player into that room, then victory is ensured. (Or is it? Maybe he built a secret exit, which only the most clever of Prey could find…)

This is where quite a bit of Akira’s writing seeped in. I was really good at creating the systems and history, but she was good at taking that information and making it seem lived in. There are plenty of little details in the map that never would have occurred to me, but she suggested. For instance, the remains in the central ventilation node, or the design of the barren industrial kitchen, the obsessive level of cleanliness in the restrooms, and more. In fact, the post-comp version is going to see a lot more of her handiwork, as I got really short on time near the end.

Oh yeah, that’s another thing: My poor testers! Woe upon them! Only 3 or so rooms had any kind of description for almost the entirety of testing. Everything else was simply:

TODO: Add description.

They had to rely entirely on the included image of the facility map, because the descriptions had nothing for them!

In fact, this is an excellent time to credit some more members of my team! Absolutely incredible round of applause to the testers: @mathbrush, Nightshademaker, @Piergiorgio_d_errico, @pinkunz, and @rovarsson!

The bugs, crashes, and strange behaviors these people found were legion.

It was a two-front war on the bugs, really. Nightshademaker was on a dozen phone calls with me—for hours at a time—while he did his absolute best to break EVERYTHING. While his unmitigated (but thorough) chaos would catch quite a lot, it was also Mathbrush, Piergiorgio, Pinkunz, and Rovarsson who caught not just bugs, crashes, and clunky mechanics, but also gave me stacks of transcripts, providing valuable insights on the thought patterns, habits, critiques, and intuitions of experienced parser players.

REMEMBER: Nightshademaker and I both come from visual indie gamedev! There were amazing data in those transcripts, which would not have occurred to either of us!

I would absolutely recommend all five of these people as testers for anyone else!

10 out of 10! :grin:

I repeat: These five people get all the credit from every reviewer who said the game was smooth. Yeah!! That was all you! I cannot possibly take credit for that!

Y’all found bugs and crashes that I didn’t even know were possible. Some of you put in commands that I didn’t even know Adv3Lite could handle, and revealed entire subsystems that I hadn’t accounted for. Honestly, the best part was that a lot of you were bringing your habits and assumptions from Inform games, which gave me a tonne of data on what TADS and Adv3Lite did differently, and what needed to be added or adjusted to welcome the Inform side of the forum to the game, too!

This is probably the most fun I ever had in gamedev. Y’all were wonderful, patient, thorough, and had amazing feedback. In the moment, I would wake up and brace myself for messages containing bug reports, but that was entirely due to the stress of the deadline. Bugfixing is actually a blast, lol. It makes me feel like a detective!

Also: Holy cow?? Gathering bug reports in parsers is so streamlined??? What?! If I were trying to gather and replicate bugs in a visual game, I would be making a custom logging system, and would need to figure out how to not spam thousands of lines from every update frame. And if I missed something, then I would be absolutely screwed trying to figure out what exactly the tester did, but it’s not like the tester can sense what’s happening on the RAM chips or anything.

Absolutely wild.

Antagonist AI

Unfortunately, by time these testers first received the first test version, March was already half over. I was receiving transcripts every day—from this day until submission time—and I was industriously fixing bugs and crashes, while also developing the AI antagonist.

Now, if it weren’t for the fact that game AI is a special interest of mine, I would not have gotten the antagonist done in time. At all. This was the point where I went from spending 48 hours a week on this, to spending 84 hours a week on it.

Skashek would be governed by a finite state machine, where each state rerouted various methods and functions to nuance his behaviors appropriately. Arranged around the core AI object, there was the…

  • Intro State: Governing his behaviors before the chase begins
  • Lurk State: Governing his behaviors while he gathers clues and searches the facility
  • Chase State: Governing his behaviors after the player is caught
  • Reacquire State: Governing his behaviors when the player escapes the Chase State
  • Ambush State: Governing his ability to sneak away and hide somewhere, waiting to jump out
  • Cat Mode State: Simply, a convenient “do-nothing” state for Cat Mode, to reduce possible bugs

I didn’t have time to do the Ambush State, and I quickly decided to save that for post-comp.

It turns out, too, that the logic used in the Chase State actually performs the tasks for the Reacquire State for free, so I crossed that off the list as well.

However, before these victories, there was one silly little problem I had to deal with first:

NPCs in Adv3Lite only perform true actions when commanded to do so, by the player.

Yeah.

At the end of the day, every action comes from the player, somehow. Anything else done by NPCs in any sort of Daemon seems to be faked, if implemented at all. I couldn’t find any stuff in Adv3Lite that allowed an NPC to be truly autonomous, and perform actions using the same systems as the player. So, I had to implement a turn-taking system for Skashek, as well as a small series of hooks that would allow him to reuse the same logic that was already in place for player actions, which would help reduce complexity and future bugs.

Reduce, reuse, recycle!

However, this caused me to dive DEEP into the madness that is the verify stage of actions, as implemented in the Action class itself. And let me tell you, there might have been dragons there.

Pathing was another challenge. Adv3Lite comes with pathfinding, already, but Skashek would need to do a lot of planning, calculating, and theorizing, which could really slow down the responsiveness of the game if I used the built-in pathfinding.

To solve this, I took some advice from @jbg and created a pre-cached data table. Using this table, every room would know what exit to use to get one step closer to any other room. This way, I would effectively need to say “Get closer to the library. Okay, now get closer to the library. Okay, now get another step closer to the library.” and the pathfinding system would string together the correct series of exits.

A bonus feature I added for the reacquiring behavior was to have every parkour exit also store what room it leads to, so when the player tries to escape, then Skashek knows where to look for them next.

Also, another neat thing (which I don’t know if anybody noticed) is there are specific opportunities where Skashek will actually lunge to catch up with the player. Specifically, when the player uses parkour to escape to a nearby room, Skashek will sometimes get a burst of speed to arrive just in time to resume the chase. The player still buys some extra time in the process, though. This little behavior was added in to create some rather movie-esque chase sequence moments.

Final Moments

I was working on stuff, right up until the last available moment. Four hours before the deadline, I was on a Discord call with Nightshademaker. Both he and Akira (who sat next to me on the laptop) playtested the game while I wrote the survival guide. The moment any of them encountered a bug or a crash, I went into the code, fixed it, and emailed them the patched version immediately, and testing would resume.

It was super intense, and there were multiple overlapping conversations going on, while I was trying to type up another document.

Within the final hour, Akira took action. There were still things that needed fixing and implementing, and she quickly assessed the situation, and suggested what should be cut (saved for post-comp), what should be wrapped up, and what should be simplified (again, with the more complex version being saved for post-comp).

At this point, she had been following along with what I had accomplished each day, giving occasional input, and seeing what the testers where finding. She knew the project well enough to make informed decisions, and I trusted her direction. After all, when things got really stressful, she could often summon the clarity of a starship captain.

So I followed her recommendations, wrapped the game up, packaged it, and sent it on its way, with 10 minutes to spare.

Thus concludes the Era of Crunch.


I’m really tired, lol.

I’m pretty sure this is all that remains of what I wanted to share in the post-mortem. If I have any lingering thoughts later, I’ll add them, but this should be it!

Thank you again to everyone who joined me on this crazy journey! I had a lot of fun!! :grin:

And, as always: Thank you for playing I Am Prey, and giving me a chance!

19 Likes

Honestly, I don’t think I actually deserve this 10/10 for my sub-par ßtest, also marred by a spectacular wild goose chase around a 'terp bug… I think that the homage in the ß version was more than enough for my lack of substantial contribuition.

4 Likes