Last year we said:

As we venture into 2023 we definitely want to bring you guys far more dev blogs than we currently do.”

and then we went silent.

Our general lack of any sort of communication throughout 2023 may have given the impression that Anti-Citizen was dead, but rest assured that's not true. It was more like an extended coma. Throughout almost the entire year the bulk of the dev team was either busy or missing, leaving only John to endlessly toil away in the proverbial vscript mines. We will get into everything he’s been working on but first for some context, Anti-Citizen has grown in scope significantly since we last touched base. Countless hours of vscript tinkering, iteration on the story, and a mild amount of feature-creep has brought the scope closer to a full game than a mod. Development takes a long time and as you’ve likely read plenty of times in our dev blogs, we all thank you for your patience. Now let’s dive in!

1 | The Rewrite

At the start of last year we had a handful of somewhat-finished level blockouts and a decent story for the first act. Issue was, the story surrounding later acts had seen a lot of improvement but the first act wasn't getting the same attention. Since the levels were made for the previous narrative, the pacing and opening plot sections didn't flow well into each other and the few attempts we had at reworking the layout, scale or pacing never felt right. It was becoming increasingly clear that the first act would have been our worst, and that's no way to start off a mod. In late 2023 we went back to the drawing board and sought to rewrite the first act, bringing it up to snuff and better incorporating narrative beats and gameplay. With A1 more nicely integrated into the greater story, we finally have a full vision of the project, allowing us to plan correctly instead of having the influence from three separate iterations.

We aren't starting from scratch

Now I know it sounds like we're not going to be releasing for a long while (and we quite possibly aren't), but not all is lost. Though we may not have many maps to speak of yet, Anti-Citizen's real core is the new custom mechanics. Our animator turned vscript-enthusiast John spent a good chunk of 2023 coding away on various frameworks to provide functionality for new weapons, inventory, NPCs and even our good pal Lenny (more on him later). Below are some highlights and previews of where those features are right now…


2 | MP7 is so back

One of the first (and furthest along) features we'd like to showcase is the MP7. We've always felt like the vanilla HLA weapons, although quite good, are functionally very flat. Compared to other VR titles, HLA just barely scratches the weapon interaction itch. The MP7 is our response to that problem. As our first vscript-based weapon it's tricked out with an operational front grip, full-auto that matches the real life fire rate, improved recoil systems, a functioning reflex sight and a mag guidance system for buttery smooth reloads. Why am I even telling you about it? Just watch it in action!

Video demonstrating MP7 and live combat.

Despite being our furthest along feature, the MP7 still has a ways to go. There's much more for it we have yet to develop and a few visual changes in the works, which we can't wait to show off when the time comes. Speaking of which, you might've also noticed the live combatants in the second half of the showcase. I think they deserve a bit of time in the spotlight, too.

3 | Metrocops and Soldiers

It has been a few dev blogs (a year) since we showed our combatants, back then they were just reskins of the HLA grunts with the voicelines swapped out and some animgraph magic to fit different guns into their hands. It was kinda cool but lacked a little something, and a good chunk of the year was spent trying to improve that. First order of business, a new model and a new set of animations. The metrocops are edits of the existing HLA model, with grungier textures and some new gear strapped onto their belts. The soldiers are a mix of the unfinished HLA remake as well as some parts from the Nemez pack.


Speech and Sentences

For the nerds who went through and looked at all the files in their HL2 install folder, you may have come across the sentences.txt file. It contains every line of dialogue that the soldiers and metrocops can deliver during gameplay, pieced together from words and short phrases. Naturally, we closely referenced this file when originally baking these sentences down into single audio files to fit into the much simpler Half-Life: Alyx dialogue system, but even when directly copying the lines there were several annoying compromises that had to be made when porting the dialogue. Firstly, HLA and HL2 have different sets of dialogue, so there were HLA lines with no HL2 counterpart, and HL2 lines with no HLA equivalent to replace.  Worse than that, there was the issue of virtuals.

The Half-Life 2 sentence system is a bit more complicated than just stringing wav files together. Sentences can contain ‘virtuals’ that are replaced dynamically when the sentence is read. These are used for all manner of dynamic elements such as giving each unit their own callsign, calling out the players exact location using distance and heading or grid coordinates or sector or map specific address, calling out the dead units callsign when reporting a man down, choosing which nickname to call the player, counting up npc kills, reading out specific map locations in metrocop deaths, handing out random criminal charges, and a bunch of other stuff. When baking the HL2 lines for use in the HLA dialogue system all of these dynamic elements were lost (which sucked). So, like any well adjusted and sane person would do, we replaced the entire dialogue system with a bunch of vscript leaving all of the cool dynamic stuff intact (and even some additional fixes and improvements over the HL2 code, such as support for subtitles).


~5 minutes of random dialogue from the system

The sentences are also now driven by a custom concepts system, our take on the near incomprehensible system used by Valve. This allows us to make function calls with simple concepts like “DEATH” or “IDLE” or “ANNOUNCE_KILL” and from that make intelligent sounding decisions as to which specific sentences should play based on any number of conditions. For example, the “PAIN” concept will not play a sentence if a pain sound is already playing, and also handles playing the taunt and cover sentences that sometimes play after the pain sound based on unit health. For the soldiers and metrocops this isn’t used to its fullest since HL2 handles most of its dynamic stuff within the sentence itself using virtuals, but for a character like Lenny we can do a great deal of decision making when playing concepts in order to make the character feel as real as possible.


With the bark taken care of, they also need their bite. We can’t use the normal HLA weapon firing since our units can use any number of weapons and the different weapons need to do different amounts of damage and use different particle effects, so in the spirit of just replacing anything that gives us trouble we replaced their entire weapon firing and aiming systems. On the side of firing they now all use generic pistol entities, which do weapon specific damage and use weapon specific particles, and on the side of aiming they are a lot more particular in what areas they target. Our fancy new targeting system has a different profile for each npc, letting them do cool tricks like properly target the antlion weak spots and making sure to finish off zombies with a headshot so the headcrab is killed. These interactions will be very few and far between in the campaign, but for those videos where people spawn a bunch of NPCs and have them fight it will surely look pretty cool.



Anti-Citizen Target System

Default HLA Grunt Target System

Soldier throwing grenades

Of course they spend more time dead than alive, so we put a good chunk of work into making sure they look cool after they die too. Once they’ve been unceremoniously shot in the head by the player we apply various combinations of bodygroups, skins, and particles to help sell the death. Currently we don’t have all of the injury assets made so the system is only responsible for setting the state of the emissive parts of the uniforms, which can either flicker or turn off completely. However, once we get the assets done we can depict all sorts of nifty things like dismemberment or burns from explosions or the result of a point blank shotgun blast to the face, all applied dynamically based on various criteria.

They also throw grenades more logically, and with a shorter fuse so you actually have to choose between throwing it back or fleeing from cover. Additionally, when fighting NPCs they now use a heatmap system to choose when and where to throw their grenades for maximum impact, so now they won’t toss a grenade at a single headcrab and have the grenade miss.

Metrocop death demonstration

Also we were originally planning to have some of our other characters use the HLA AI as a base, so we added a system to force relation settings between NPCs and designed everything to be as reusable as possible, such that it is very easy to add new types of combatants with unique weapons, dialogue, faction relations, injury states, health, throwables, and a bunch of other miscellaneous stuff just by adding to the cfg_ai table.

A new combine unit, implemented simply by editing cfg_ai. Texture work by Allen Scott

4 | LEnny

Last we saw of Lenny he wasn’t looking so hot. We had settled on his general look but HLA citizens don’t look great up close even with texture edits. We decided to use a pre-existing character mesh (from outside of HLA) and mold them into what Lenny looks like now. That was the easy part, textures is where stuff got painful. Our texture artist Allen had to make sure the textures matched the visual style of HLA while still making him look unique enough to stand out from the generic citizens. We did this through a mixture of additional dirt/damage and, the best part in my opinion, facial hair. That’s right! No more soy-boy Lenny, now he is a hardy lumberjack ready to wield his shotgun and say badass things like “hello percy anti-citizen”. Don’t ask John why we have a shirtless Lenny.

The original plan was to have Lenny just be a grunt replacement. New fancy model and weapons, but still the same Half-Life: Alyx AI underneath. This proved functional, but a bit underwhelming, and a large chunk of the code involved circumventing the game's AI systems to stop it from breaking when presented with a shotgun (the AI expects automatic weapons, so it isn’t a big fan of Lenny’s 870). Leaving the base game AI intact also proved troublesome for Lenny’s idle state, as once grunts enter combat they are never allowed to return to idle. Since the grunts were fighting tooth and nail against any change in tactics or behavior, we felt it would be easier to simply remove them from the picture and implement Lenny as a generic actor using combat AI written entirely in vscript.

Lenny’s new AI systems are very similar to the schedules used by Valve, but with a few small improvements. Our schedules are implemented as lua tables rather than the string arrays used by the base game, which allows us to pull off a few fun tricks like conditions at a per-task level and specific handlers for conditions or tasks failing. With the new system we should be able to provide Lenny with complex AI behavior (relatively) quickly and easily, and more importantly we can avoid fighting against the base game AI every step of the way.

Early tests of Lenny's combat AI. He draws his pistol (because its faster than drawing his shotgun) and runs to cover. Once in cover he switches to his shotgun and continues firing. A lot of the animation assets and such are yet to be added (which is why it looks bad) but the logic is working.

5 | Conclusion

Although 2023 may have been a slow year for development, it was our most important for the foundation of what Anti-Citizen will become. For the remainder of 2024, we're hoping to get the rest of the foundation done and put serious effort into getting something playable, if only internally. Just like last time, we're looking for new developers to help push HLA modding forward. If you've got experience in the areas of level design, organic modeling, sound design or character animation, and you have enough free time to help out, it would be much appreciated. This is the part where I promise we'll be back to talk soon but we've broken that promise a few too many times by now, so we'll be back when development dictates we're back.

Thank you for reading all the way through if you did, now let's send some appreciation to the man who carried Anti-Citizen through its dark days, John "feature-creep" CO.