OPERATION:OPS - A post-mortem*


Last update: 16/12/2024

Operation:OPS (OOps) is my one game project that reached a reasonable state of completion.

It's available for free on Itch.io, and currently has a 4.5 star rating.

Exterior view of the warehouse in Operation 1. Player is armed with the shotgun.

It's a colourful, old-school-looking tactical shooter with an emphasis on stealth and caution. It's been described as a cross between Wolfenstein 3D and Metal Gear Solid, which was exactly what I was going for.

OOps is fairly short and mostly linear, with a maximum of 9 levels plus one training level. There are seven possible endings, depending on how many prisoners the player rescues, and wether or not they discover the secret objectives.

The levels are fairly small, made up of 32x32 tiles about 2x2 metres each. I tried to design the missions to have lots of back-tracking to make them feel a bit more substantial. Missions can be completed in under a minute, if you know exactly what to do, but the player character is extremely vulnerable. A single burst of enemy gunfire can kill you.

If enemies detect you, a timer will start counting down, after which more enemies will spawn. This encourages the use of silenced weapons, melee attacks, and hiding bodies.

There are some lite immersive-sim elements too: searching computers for access codes, conversations with NPCs and prisoners to rescue/assassinate.

You can select your inventory at mission start, choosing 3 different main weapons, 2 types of grenades, 2 types of explosives, a motion detector, a radio jammer, hazmat suit, body-armour, sentry gun and addictive amphetamines.


The gifs give a pretty good idea of how it plays.

An animated gif showing gameplay footage of Operation : Ops. Lots of gunfire, blood and explosions. Another animated gif showing gameplay footage of Operation : Ops. Sneaking around, entering codes, knocking out sentries and hiding their bodies.

These videos give an even better illustration of what its like to play. A massive thanks to Jayalen and Rex705 Gaming for uploading these!

The first video is just a single mission, although Rex705 has uploaded playthroughs of each mission. Second video is a longplay, with the full game completed in an hour and twelve minutes, not including restarts after death. Jayalen was also trying to get footage of accessing every single in-game computer terminal, so that would have stretched out the time.


Gameplay - general thoughts

Personally, I find the gameplay loop a lot of fun, even if I cringe at the bugginess and rough edges.

There's a good mix of tense, cautious, slow sneaking around the levels punctuated by shorter periods of really frenetic action.

Death is quick and frequent, but I hope doesn't usually feel too unfair. Most times I die, I can usually point to a clear mistake that got me killed. The consequences of death aren't too bad though, on account of the short levels. I personally find mission 7 - Jungle Base the hardest, because there's no way to complete it quickly, and it's frustrating to die so close to the end of the mission after a long run.

There's no one loadout that works well for all missions, although it is beatable using only the default loadout (with much difficulty). I also don't think there is a clear best strategy for most of the missions. Lots of different play styles and preferences are valid.

Accomodating the different playstyles, combined with some randomness and nonlinearity within missions added greatly to the replayability. I don't know if most people would actually find OOps fun, but each time I replay it, I always have a great time.

Stealth Mechanics

The youtube videos embedded above indicate that most players chose to take it slowly and carefully, trying to eliminate all the guards in the level and then going round to complete the objectives.

That's definitely the safest and smartest strategy, so I hope people didn't end up "optimizing all the fun out of it". I like to try to use as much stealth as possible, but when the shooting inevitably starts, I make an honest go of it. The moments after the alarms go off and you're forced to think on your feet and fight your way out of trouble are the most chaotic and fun.

It's a wonderful feeling when things don't go according to plan.

I did think about having the sentries do a "roll-call", to sound an alarm when eliminated guards don't report back. Ultimately, I decided it would feel too restrictive and stressful if I did that. The difficulty is fairly tough already, and giving players the options to carefully clear the levels lets players mitigate some of that stress and unpredictability. On the flipside, a really long and careful run feels tense by the end of it, because the penalty for death means you've wasted more time than if you'd just tried to blast your way through.

Everyone gripes about bad stealth mechanics. They're so hard to get right. At least I don't think anyone complained about these ones in the comments.

If I ever make another similar game, I would probably try to include something that would gently discourage spending too much time clearing out the guards silently. I just don't know what. The "roll-call" would work, if there was a clearly defined time that it would happen, and the consequences of a few guards being missing should be just having a few more spawn to replace them, rather than the whole base going to red-alert.

Operation 7: Operator's Jungle Base. Player equipped with SMG

Motion detector and static chopper in Op 5: Offshore gas refinery

Pyrotechnics in Op 6: Missile Base

Loadout selection, with description of gas grenades

Fighting through the action-packed Op 8

Minimap: least useful item

Elite reinforcement in Op 4. Better accuracy, faster reactions, more HP, and an attractive orange jumpsuit.

I don't know if many players used the radio-jammer, because it seems kind of boring, and to be fair, the inventory screen doesn't say exactly how much it reduces enemy reinforcements by. From memory, it increases the time it takes them to spawn by 50%, and reduces the number by a third. So it's like you only have to face half the reinforcements. I almost never go without it, especially on missions 5,6,7 and 8.

Features like dragging and hiding bodies were useful, even if the crontrols were a bit clunky. The motion-scanner was another popular item, although I rarely used it myself, as I made the enemy footsteps crazy loud, to help give a sense exactly where the danger was. You can also do things like punching walls and doors to attract the attention of sentries, luring them into melee killing distance, but I think this was kind of buggy, and don't know if many players utilized it.

It seems like the silenced pistol is the people's weapon of choice too, and I do like the suggestion of a silenced SMG for a new game + mode some day. But more on that later...

Overall, I'm pleased with how the stealth gameplay worked.

Guns

Most shooters have lots of guns. OOps just had 3: SMG, silenced pistol and shotgun. In my opinion, they were enough.

When I try to do an efficient playthrough, I use all three in different missions, but the SMG is my favourite. As mentioned previously, players mostly used the pistol.

I think I got the balance mostly right. Even though the shotgun is probably the hardest to use well, it comes in handy for breaching doors, blowing things up, and is the best choice for the boss-fight. In one of the youtube playthroughs, it gets used to good effect in Mission 8, something I've never had much luck with.

I did start to implement a belt-fed M60, but for whatever reason decided it wasn't necessary.

Damage mechanics are simple, and just about right. Normal enemies have 2HP, elites have 3, same as the player by default. No locational damage or headshots. Would have been easy enough to implement, but I don't think it would have added much.

The most "innovative" feature in OOps as far as guns are concerned, is the free-aim/iron-sights system.

Obviously, this is in every modern FPS now, but I don't know if it's been done in any old-school "boomer-shooter", at least not when I started making it in 2016. Part of the design philosophy for OOps was to include more more recent Tactical Shooter mechanics into a more old-school game, and the free-aim was an important inclusion.

The camera doesn't move vertically, but your weapon does. Having to move the sights up for shooting, and down for good visibility is such a simple thing, but massively improves the feel. Adding recoil that needs to be corrected also makes the guns actually feel like guns rather than magic floating crosshairs.

When you take hits, your aim is randomly knocked off target, meaning that in a firefight, even getting hit once is a risk, and keeps you on your toes.

Looking back, there's not a lot I'd change here.

Enemy AI

The enemy AI is super simple. They wander randomly around the grid-based levels, stop when they see the player, and blast away at them.

They sound an alarm when spotting the player, hearing a gunshot or explosion, or seeing a dead body. The reaction times and movements of all enemies get faster after alarms are raised, and they will try to move to where the player has last been spotted.

Enemies and NPCs only move North East South and West, never diagonally. The grid-based layout of the levels means that this doesn't seem too weird.

I think the very lo-res unreallistic look of OOps means that these simplistic AI behaviours don't seem that weird or out-of-place. If they were 3D meshes rather than sprites, the instantaneous acceleration, grid based movements and lack of different animations would be more jarring.

I did think about adding scripted patrol routes initially, but couldn't think of an easy way to implement it at the time. This was for the best: I found the random patrols better for replayability's sake anyway.

They don't take cover from gunfire or grenades, and they won't move to get into a better firing position when engaging the player. They just stop and shoot. In a more sophisticated shooter, this would be unacceptable. In the simple land of OOps, both the player and other agents tend to die pretty quickly, so players probably don't have a lot of time to notice the simple and robotic AI too much.

Overall, they get the job done, with only one egregious glitch I'd like to correct. The glitch is that enemies can move through each other, and sometimes overlap each other while shooting at the player. "Doubled Enemies" like this are frustrating to encounter, because what looks like a single enemy is effectively an enemy with double HP and double rate-of-fire. Fortunately, it doesn't happen too often, but it's galling to have a good run spoiled because of this glitch.

I tried a few fixes, back when my coding skills were even worse than they are now, but clearly the bug persisted. If I ever get the source ported to continue work on it, this is one of the first things I'd work on, by permitting the AI to briefly move "off-rails" when having to pass through narrow gaps.

It would have been fun to give them the ability to throw grenades, but that's a trickier problem to solve, and the game is hard enough already anyway.

Level design

For such small, flat (gameplay-wise) and blocky levels, they go alright.

They are all reasonably "open", in that there aren't many dead-ends, and there are usually multiple enterances to each location. Op 8 is the one exception, being a mostly linear labyrinth.

This was important, as it gives options, uncertainty and replayability. The fighting is more fun when there are more directions that need to be covered.

I initially sketched out "branching" type level designs, with lots of necessary back-tracking and key finding. They felt bigger, but they weren't fun to play, compared to the more open levels that paradoxically felt smaller.

There's decent variety, both visually and in gameplay terms, in spite of an uneven difficulty curve. Op 5: Offshore Refinery was tough for many, due to the massive number of objectives to complete. Op 8: Underground Base was also rough, due to stealth being impossible, but that's probably appropriate for the lead-up to the finale.

Having secret and super-secret objectives made it tricky to balance the difficulty curve. I assumed players would try to rescue all prisoners, which makes Op 4 fairly tough, and after that, the much maligned Op 5 would be a piece of cake.

This is the second-best possible ending

I made a map editor early on to build the levels for OOps, which are saved as xml files. It's slow and clunky to use, but it got the job done. It was the best my feeble coding chops could manage at the time. I had to basically hand place every wall, floor tile, ceiling tile, piece of furniture, clutter and scenery object one by one. I still needed to hard-code things like unique radio-transmissions, NPC conversations and cutscenes, but most of the unique mission content was made in that editor.

If I continue work on OOps, I would like to realese the editor, abhorent though it is.

Interaction

The worst ending is actually THIS one.

By interaction, I mean all the other ways players can interact with the game world. OOps has some semi immersive sim stuff going on that's not often in similar retro shooters. The implementation maybe wasn't great, but was a lot of fun to develop, and hopefully fun to play. I actually removed a lot of early or planned features, and don't really regret their ommission.

I'm happy with the in-game computers, terminals and keypads. Numeric keycodes are reset upon death, forcing players to access the computers that have these codes again, but computer terminal codes are persistent. I probably should have made them reset on death too, but didn't get around to that.

Originally, computers didn't display text, but just gave "intel" points when accessed, and in each mission, you would have to collect a certain ammount of intel to succeed, or gain XP. I decided not to include XP or any real RPG elements, and I'm glad I didn't go with the "intel" point system as a mission objective.

Explosives were in the very first early prototype of OOps. Walls could be demolished, but this created problems for level design, both visually and for gameplay, so I removed it. It's useful enough that they can destroy doors, and blow up mission objectives remotely.

A few people found the disarming mechanic difficult, so I think it's a bit more forgiving in the latest update. I actually stole this mechanic from the game Abe's Oddysee, but I think it fits in OOps.

I'm undecided on the controls for plating and detonating explosives. Using the "Tab Menu" to do it meant less key-press sequences to memorize, but switching to the detonator and placing/detonating with mouseclicks is actually faster - you can plant C4 on the back of the Operator's mech in the final fight this way. You can even place C4 on unaware guards. It looks terrible, and has no real gameplay use, but I refuse to remove such an entertaining bug. I'm not sure the claymores are very useful by comparison.

Op 3: Hong Kong Warehouse. I think this was actually one of the last levels I built.

Punching guards is fun, and maybe OP. You can spam the punch button even as you fire your gun, unreallistic as it may be. I think it's necessary for unexpected close encounters - having to switch to "melee mode" would have been a bit too slow.

Both types of grenades are useful. It was probably a weird choice to bind them to Right Mouse by default. I'm a big fan of the ethically dubious nerve-gas grenades: Fantastic for area denial on Op 6 and 7. Undecided as to wether or not enemies should see and avoid clouds of nerve gas - maybe it's only visible to the player. I'd prefer a better visual effect when the player is gassed though.

Op 2: Arctic Outpost with "Palette-swapped" Arctic soldier. Each enemy type has slightly different stats. These guys are actually the slowest to react, I think.

Sentry guns are also great area denial, but too heavy to be worth taking to an Operation. I think being able to pick them up in the levels from secure store-rooms was a good way to balance them.

I don't know if players made use of the Hazmat suit, Jammer, or Minimap (which is admittedly pretty useless).

I hope some people made use of the Neurophene, and sufferred from the tolerance, addiction and withdrawal that came with it. I didn't make it clear enough how useful it can actually be, because I wanted a "diagetic" description rather than a "30% change to ignore damage, -50% recoil, +50% speed" kind of thing. I wanted people to play by feel rather than min-maxing it.

Interestingly, because the depiction of drugs here isn't entirely negative, I'm pretty sure it would be refused classification and couldn't be legally sold here in Australia.

Difficulty/Complexity

I did a lousy job showing players the mechanics. Probably didn't help that a lot of people skipped the tutorial and assumed OOps would play the same as any retro FPS. I should have flashed a warning for new players.

Below is footage of what happens when someone skips the tut.

Big thanks to BAYAEARAE for uploading. They were actually making good progress. It's cool to see the longplays of OOps played well, but as an amateur dev, seeing how a player experiences the game for the very first time is invaluable.

There are so many things I could have tweaked to give the player more feedback about what they needed to do and not do.

  • When accessing a computer, increase the angle at which the player can turn away and still activate it
  • Inform player that access codes will change upon restart
  • "Hand" icon should maybe say "space key"
  • Have less "filler" computers for the first level at least
  • First level should be a bit more linear
  • Visual indicator when mission objective is sighted
  • Detect if new player is having trouble, offer to divert them to the tutorial
  • That's just the start. Some of that would be covered in the tutorial, but I think I wanted to give players a more old-fashioned start, with less forced hand-holding. That was a mistake.

    The very first prototype of OOps I put online was better in this regard, with its On-rails tutorial. I just found a video someone uploaded: please ignore the weird low-res texture setting.

    He goes on from the tutorial and immediately does really well in the mission. Thanks so much for the upload!

    Even when players did attempt the new tutorial, some weren't patient enough to read the instructions on the computers. To be fair, it seems like there were a few glitches in the tut for some. See below for a player starting in the tut, but not completing it.

    This player skipped a lot of important info in the tutorial, but was doing OK in the first mission. I still feel so guilty for all the people who like the look of OOps, tried it, but gave up after being confused by the mechanics or frustrated by the difficulty. Forgive meeee!

    Lesson learned: Linear, restrictive and patronizing tutorials work. That's why they're in every modern game now.


    Visuals

    Hmmm. I actually still like the look overall, messy as it is.

    Nuclear Missiles Launched! Note "big and small pixels", UI elements have small pixels, but 3D objects close to the camera like a red blood splatter left of the gun and the terminals are large. Never looks quite right to me.

    Because I've being working on this for so long (although leaving it alone for years at a time), my thoughts about art and graphics have changed, and I would make some different choices now.

    It's got the saturated colours I still love, although a slightly more restricted palette would've been better.

    The UI is mostly good, but sometimes looks weird on different screen resolutions, and some of the elements stack/overlap in unattractive ways. Text alerts and radio dialogs overlap during missions, for instance.

    The variety of locations is good, but some level themes are definitely better quality than others. Should've gone for quality over variety.

    The main thing that bothers me is having both big and small pixels on screen at the same time.

    This is a fundamental challenge for really low-res pixel art FPS games. Inevitably, objects are going to be close to the camera, so the pixels will be enormous.

    Wolf3D had 64x64 sprites, where OOps characters are only 24 pixels tall, from memory, in 32x32 sprite sheets. In hindsight, 32x32 was too small. Level textures were the same scale: 32 pixels per 2 meters, approximately.

    The low resolution let me crank out assets faster, at the cost of occasionally ugly visuals. Maybe it was for the best: my motivation to work on OOps was never that reliable, and an ugly game finished is better than a pretty game barely begun.


    The "canals" in Op 5. Possibly my favourite mission, for both its gameplay and its visuals.

    Sound

    A mixed bag. So many terrible sounds and a few really effective ones, that feel like they all belong in different games.

    I like the weapon and explosion sounds. They're all suitably punchy and satisfying, and give pleasing feedback during combat. Ditto for the melee sounds.

    I recorded the enemy voices myself, and they turned out fine, I guess.

    The environmental sounds are the real weak link, because I made them early on when I thought the game should have an even more archaic feel.

    Most of the bad SFX were synthesized in a little program called SFXR, which makes great 8-bit style sounds. It's a fantastic little program, but the 8-bit sounds don't fit the OOps aesthetic, and I should have replaced them.

    The footsteps are the worst, followed by some of the door sounds. Volumes are also inconsistent, partly for gameplay reasons. Inverse Square falloff makes it too difficult to hear distant enemies stepping around the level. Admittedly, the sound of so many footsteps is aesthetically terrible, but it's also really helpful from a gameplay perspective.

    Still enjoy the "dial-up" sounds when accessing computers though.

    The commander's office in Op 5. Giant floating keycard on the left.

    Music

    Finishing the music is my main incentive for continuing work on OOps, because I'm so frustrated by how little I've produced so far.

    The influences are fairly clear in my head; 90's Hans Zimmer scores would be a good fit, but more cheesey and melodic, possibly with an older, crustier aesthetic.

    I've changed my mind so many times about the best aesthetic to pursue here. First it was a Microsoft GS general MIDI sound, then OPL3/Soundblaster FM synthesis, and after that it was anything goes: realistic instrument samples and modern soft-synths.

    Changing my mind so much means that there's almost no complete tracks to use. A few decent decent ideas could be rearranged. The main theme has potential, and I like the music that plays after the boss battle, but there's so much work to do.

    In the end, I think I've decided that a cheesey and cheerful General MIDI sound is what I should go with, which was my very first choice a decade ago.

    If I do manage to start working on OOps again, I'll add more to this section as I go.


    The 5 ally characters in the Good Ending cutscene.

    Story

    While I had grand plans, I'm not at all happy with the writing, even if the plot did/does have some potential.

    The game length is much smaller than I first envisioned, so the plot ideas I sketched out had to be crammed down into a much smaller format. The gameplay also doesn't lend itself to slow contemplation of the plot, either.

    Partly because of the nature of the gameplay, theres no reason to get attached to most of the characters, because the player's interactions with them are so shallow.

    It's possible to learn more about the world, and find hints about character motivations by reading computer terminals, but it's dangerous to loiter when enemies are patrolling.

    Even if players do take the time to read all the plot-adjacent fluff, most of it isn't that relevant to anything, and much of it is just there because I wanted to decorate the level with a computer and needed to think of something to appear on screen.

    I was inspired mainly by Deus Ex, Metal Gear Solid, Escape from New York and They Live. I liked the aesthetic of sinister non-state factions warring and conspiring for world domination. I just found it tricky to present that kind of story in a crude first-person-shooter.

    Screenshot from very first 2014 prototype. A friendly scientist stands next to a brain floating in a specimen tank.

    It didn't help that all of the in-game text was either written in visual studio, or in my horrible map editor. It's hard for me to read the text as I go, either because it's mixed in with code, or because I can only see a few lines of it at once. Most of the writing feels a bit "off" as a result.

    What I should have done is put more care into laying out the plot beforehand, and write all the in-game text in a wordprocessor. The writing still wouldn't have been great, but it would've been a whole lot better.

    As far as I know, no players have found this room yet...

    Major spoilers ahead, if you care about that sort of thing. Highlight to reveal...

    The main baddies in the OOpsiverse are The Design, an inter-dimensional cabal controlling world affairs from the shadows in order to drain it of all its natural resources and leave it a barren husk. Totally ripping off They Live with that one.

    In a regular playthrough, where the player is simply doing the bare minimum to complete each level, they might not see any mention of The Design at all. Their interdimensional origin is also not pointed out too explicitly, although there are hints in Op 4. Canonically, only Xi and the Operator know about the true origins of The Design, because they are former initiates.

    Xi and the Operator are both clones, the operator (X) is the 10th clone, and Xi is the 11th. I hope most players that payed attention to the plot picked up on the roman numerals there.

    The leader of the design, at least in the "OOps" dimension, is the 1st clone. You see his (vaguely reptilian) pupil via radio messages in Op 6, and see his silhouette in the Bad Endings.

    You're supposed to be able to tell that all three look similar. The character sprite for the Operator, seen only in the boss battle and following cutscene, is the same as Xi's character sprite, with only a change in outfit. The clones were engineered and raised to be different flavours of Machiavellian savants. With clones 10 and 11, they had diverged too far, and the clones turned against their interdimensional alien masters.

    In OOps, we never see the true puppet masters of The Design, only their human proxies. Defeating The Design in their home dimension was going to be the finale I had originally planned, but that'll wait until the sequel, if there is one.

    Approaching the Operator's island base in Op 7


    Motivation

    It's hard to tell exactly how much work has gone into OOps, because my motivation to work on it has never been reliable. ADHD (only fairly recently diagnosed), lack of free time, and a gradual loss-of-interest in gaming altogether have been major barriers.

    I have mixed feelings about the overall "vibe" of the game too: I like the campy "Deep State" and "Reptilian overlord" as a fun fictional setting, but since Trump, Qannon and the like, it doesn't feel as fun anymore. Having the root of all evil embodied in a conspiratorial shadow government feels too close to the problematic stuff that some people actually believe. In this fucked-up timeline, the goofy and colourfully crap-sack dystopia that is OOps doesn't feel different enough from the real world.

    Another reason I struggled to stay motivated is because I've gradually become more averse to violence in games. Even cartoonish violence in OOps's unrealistic setting, with crude low-res graphics bothers me. I'm getting sick of superhuman soldier characters who slaughter dozens of weak enemies. I get it from a gameplay perspective, but it's a toxic power fantasy that I find less and less appealing. Even if the enemies are only 24 pixels tall.

    Most of it was completed in 3 or 4 periods of a couple months each, with about two years in between. With gaps in development that long, my skill with pixel art and programming changed, as did my tastes. Each time I started working on it again, I had to re-learn how my amateurish code worked, and had to build additional functionality atop that flimsy foundation.

    Somehow, I still find it fun to play.

    To Do

    Ok ok, so this isn't completely a post-mortem, I'm thinking of continuing work on it. If I can make it through the gruelling ordeal of porting it, and cope with the enshitification of Unity, these will be my priorities:

  • Fix game-breaking mission-script bugs
  • Fix conversation bugs
  • Fix enemy overlap bug
  • Make a more linear tutorial
  • Compose and add 15-20 new tunes
  • Add single-mission mode
  • Release the map editor
  • I'll update this page if I actually manage to do any of that.

    Right in the kisser! Also from 2014 prototype. Also note minimap and most colours derived from the NES palette.


    Last updated: 16/12/2024

    Home