Giving every warrior a body
How ZoreWars turns Core War programs into creatures that fight on screen: one body part per instruction, shots that fly from the instruction that fired them, and conversions you can watch happen.

Core War is hard to watch. A battle is thousands of cells changing colour, and the interesting moments, a bomb landing on the one instruction that mattered or a stun trap catching a replicator, are over in a few cycles. The grid view in ZoreWars shows everything, but it doesn't tell a story.
So I gave every warrior a body. Building the Avatars view was one of the most fun parts of the whole project.
The code is the body
An avatar isn't a sprite picked for the warrior. It's built from the warrior's own loaded code: one body part per instruction, head first from the starting instruction, then the rest in execution order. The opcode decides the part:
SPLis an armMOVis a clawADDthroughMODare gearsJMPandDJNare joints- tests (
SEQ,SNE,SLT,JMZ,JMN) are eyes DATis an ammo pod
That makes every warrior look like what it is. A four-instruction Dwarf is a short creature with a gear head. Hydra, an 89-instruction warrior with a quickscan, a stone and a paper, coils into a tall helix. A long warrior's shape tells you about its code before it does anything.

Every hit is a real write
Nothing in the fight is invented for effect. The virtual machine reports each time a warrior overwrites a cell another warrior owns, and which of its instructions did the writing. Each of those writes becomes a shot that flies from the attacker's part that wrote it to the part it hit.
What happens to the part depends on what was written. A DAT smashes it. A SPL or JMP written over something else webs it, the visual for a stun. The same opcode with different numbers chips it, which is what decrements and arithmetic do. Anything else turns the part into the attacker's kind of part, in the attacker's colour. The bar over each creature shows how much of its body is still its own.
Parts glow when they run, and the processes running elsewhere, like a paper's copies spread across memory, orbit the body.
Watching a conversion
My favourite moment is a conversion. In Core War a warrior can lose without being killed: its processes end up running the enemy's code. A vampire does this on purpose, and a stun clear does it as a side effect.
The avatar shows it as it happens. A process counts as captive when it's running an instruction an enemy wrote. The label shows the captive share, and once about 40% of a warrior's processes are captive, the whole creature slides into its captor's shape and colour. It changes back if it recovers below about 15%, so the change doesn't flicker.

Here Backdraft's stun traps have caught 18% of Volume Silk's processes. In another round of the same matchup, Volume Silk went all the way: its creature had become a second Backdraft, labelled "converted → Backdraft".
When a warrior has no processes left at all, it falls apart in slow motion.
A camera that directs itself
A fight is better with someone holding the camera. The view sways around the arena on its own, pushes in when a process dies, and swings to the knockout at the end. If you drag to turn it or zoom, it hands control to you, and takes over again after a few quiet seconds.
Map mode puts the creatures on the battlefield itself. On the classic ring the floor is the live core; on a 3D volume the creatures stand inside the cloud of cells, each over the cell its process is running, and hits land on the cells they wrote.
What's shown versus how it's drawn
The part I'm happiest with technically is a boring split. One module reads the virtual machine and decides what an avatar is: its parts, their damage, its captive share, its shots. It draws nothing. Two separate views draw that model: a WebGL view with three.js, lights and glow, and a flat canvas view for browsers without WebGL.
Because the model has no drawing code, both views always agree, and the tests can run it in Node: a core clear really smashes the Dwarf's parts and knocks it out, stun bombs really web the parts they land on, and when the Imp captures the Seeker, the Seeker really turns into the Imp. three.js only loads when you open the view, so the arena stays light for everyone else.
Try it
Open the arena, press Avatars, and run a battle. Good pairings to start with are Hydra against Vampire on the ring, or Backdraft against Volume Silk in 3D. The ZoreWars project page has the rest, and the other build stories cover adding a Z axis and how the game was tested.