MushRog

Combat was born without graphics

October 12, 2026 arquiteturamecanica

The first thing MushRog has is a combat simulation that runs with no screen and no network. You can play a whole fight against the Blazing Salamander in an automated test.

Why

In an online game, the most expensive rule to break is the one where server and client disagree about what happened. If combat is a piece of pure code, with a fixed tick of 20 per second and a seeded random number generator, the same sequence of commands always produces the same result. The server runs this simulation as the authority, the client runs the same one to predict what’s about to happen, and the tests run it thousands of times without opening a window.

We also record every command with the tick it came in on. That gives us replay for free: any fight can be reproduced exactly, which helps find bugs, review cheating and, later on, show off plays.

How it works

Nineteen tests pass today, and they cover what matters in the design. Element order counts: fire then ice doubles the damage, ice then fire gives one and a half times. Lightning on ice cuts the target’s defense by 40% for 8 seconds, and lightning on fire explodes in an area. The fire boss is immune to fire and reacts to ice without losing its aura. Every 20 seconds it opens a window where the innate aura disappears and any element sticks.

Swapping characters neither resets nor pauses cooldowns: the mage goes to the reserve with Fireball recharging and comes back with it ready. The swap has a 1.5-second wait and is blocked if the character is stunned. If one dies, the swap is forced and doesn’t use up the wait. And with the same seed and the same commands, the exact same events come out.

The playable prototype is made of rectangles and text: Mage in blue, Warrior in brown, a red boss outlined in its aura color. Keys 1 to 4 for skills, Tab to swap. It’s ugly on purpose, because the question it answers is whether swapping to react feels good, and that doesn’t need a sprite.

Next step

Play until swapping feels natural. Then movement and range, because right now every skill hits from anywhere.

Changes

  • feat(core): deterministic combat sim with team swap and elemental reactions

    Fase 0 skeleton: Godot 4.7 project, data-driven content (elements, reactions, classes, skills, mobs), pure GDScript simulation with fixed tick, seeded RNG and command log for replay. Headless test runner with 19 tests covering reactions, swap rules, boss innate aura and replay.

  • feat(client): offline fase 0 prototype scene

    Rectangles and text over the sim: boss with innate fire aura, team of mage + warrior, skill bar with cooldowns, swap on Tab, event log.

← Back to the devlog