The Delta of Was and Will Be

SwiftAusterity
5 min readMay 21, 2019

The MUD Jam brought new opportunities to concentrate on a singular part of the Warrens platform; not just a new feature or mechanic but one that I wouldn’t have theoretically coded for months if not nearly a year but also one I designed over a year ago. The MUD Jam wasn’t just about my awful philosophical reference turned pun but also, ok yes there is a second pun/reference in there too but really it was about developing the Fighting Arts engine.

What was is fairly lofty and certainly not applied to code or any real playtesting. It’s a theory of automated combat design. It’s a very earnest attempt to merge old style Diku autocombat with modern fighting game mechanics but also turn everything related to combat into “white damage”. There wont be scripted skill usage and reactions because there are no usable skills for combat. Everything is an Art and you put all the Arts in combos.

One thing I really didn’t think through was the combo to art to stance situation. The “full” design has more conditionals than Zeno’s; I stripped the code of everything but players and room(s). You can’t switch combos by changing weapons mid-attack because weapons don’t exist. No one has racial Arts because there is no race data to choose from. This meant everything had to be put in a combo and every combo needed a stance.

Before we continue, let’s go over how it shook out. If you read the links early on this might be a bit of a repeat so bear with me: Arts are attacks like punch, kick and haymaker but they’re also defensive like “circle” which puts you in a dodge-ready state or block which raises your arm to deflect an attack. Additionally they’re also magic like magic missile, searing touch and the truly silly one in Zeno’s: Ghost Train which is a Rick and Morty reference. This is a design aspect that hasn’t changed.

Arts get put, in order, into Combos. Combos can be referenced with multiple Stances which are just keywords you can use the Stance <word> command with in-game. Stances are a lot like, well, stances in a fighting game such as Soul Calibur or Tekken. You change your footing or weapon hold which unlocks moves unique to that stance state. In Fighting Arts changing stances makes any Combo that references that stance to be put in the available pool. This is another aspect that hasn’t changed.

The core flow remained the same: You start combat and change stances in response to situations. Maybe one stance contains more defensive arts or combos containing lots of small overwhelming attacks or several very large, slow ones to plow through defenses.

The deltas start creeping in with the discreet mechanics. Many of the keywords remained. Arts have a prep-stagger and a cooldown stagger. Stagger is the accumulated delay before the next thing can happen. Much like “frames” in a fighting game. Originally there was a split between an art’s stagger-on-block (stagger inflicted to you if you are blocked) and stagger-on-hit (stagger added to the victim of your attack). That was folded into the same value, Impact. Impact is a result of the overwhelming amount of data needed to make one fighting art. Not counting the help text each art one has forty points of data, most of them being numbers. Now a lot is ignorable for basic attacks but all those fields are on the screen staring at you. It’s not a big wonder no one has bothered to make their own fighting arts in Zeno’s as of yet despite the user-editor for arts having been open for almost a month.

Another major change when the wheels hit the ground was Clashing. Much like it sounds if two attacks connect at the same angle (simplified to high/mid/low) at the exact same time, since this is a fully asynchronous system, you get an attack clash. The attacks effectively nullify each other and product impact to both parties. In conjunction with clashes all defensive states (block, deflect, dodge, redirect) were given “perfect block” changes if they executed on the exact moment of an attack coming in. Perfect Defenses mitigate the cooldown of themselves providing quicker ripostes, transfer 100% of the impact to the attacker to further riposte chance and also nullify all damage.

Things were also dropped. Without items to hold or wear all weapon based arts were gone and all of the math behind armor was left behind. Some of the more nuanced aspects of arts were gone, like Feint’s “100% rate to dodge if attacked, -1 to setup to next art”. Custom code like this just wasn’t possible in the time frame allowed for the jam.

Other allowances were also made. I couldn’t expect a not just a large player base for this but none at all and with zero NPCs available to fight the fight command would have no targets. I started out the entire thing with the concept of the Shadowbox command. You could start a fight with literally NULL as an opponent and the entire fighting engine began as calculating art steps and combo choices with the framework of having no Victim data. An actual command (fight) was added later on but the world began with a way to fight your shadow.

This conundrum produced some surprising learning opportunities, though. I could quickly prototype and test the flow and appearance of combat given I could just let shadowbox run while I debugged. I came up with an odd hack to Warrens’ communication pipeline. Outgoing messages (eg combat results) could be flagged as “digest” or “immediate”. Digest messages got bundled into an array which on a 1 second delay async thread would be reformatted and sent to the player. This quickly produced a prose messaging paragraph format for combat output with little effort on my part and minimal intervention. All of this is essentially throw-away as well given the Lexica will take over messaging but the knowledge of where to put such a shim is invaluable for the platform’s growth.

I can’t say Zeno’s combat is interesting especially given the entire health/stamina mechanic ensures you wont ever die and the combat pacing is nearly infinite. It’s an extremely shallow portent for what is to come when I get a chance to refine this further, which may be sooner rather than later if you stay tuned.

--

--