Boss combat
The Last Crucible
A single soulslike boss fight against the Forge Warden, a two-phase boss that reads how you play and picks the attack that punishes it.
- Role
- Solo developer
- Year
- 2026
- Stack
- Unity 6 / C#
- Type
- Independent
Highlights
Twenty seconds from the same run. Two parries into a light combo, a poise break and the punish, the enrage into phase two, and the killing blow.
The full fight
One uncut run against the Forge Warden, from the intro to the killing blow, through both phases of the fight.
The project
The Last Crucible is one boss encounter rather than a whole game. The scope is deliberately small so the time goes into the boss: the Forge Warden has a two-phase moveset, chooses its attacks from what the player is doing, and can be learned, baited and beaten. The player meets it with a compact soulslike kit of committed attacks, a dodge, a guard with a tight parry, stamina and a healing flask.
Art, animations, VFX, music and voice lines come from asset packs. The gameplay systems and boss AI were designed and architected by me, with the help of AI coding agents.
The boss
- It scores its options. Every time the Forge Warden is free to act, it scores each thing it could do: every attack, turning, strafing, closing in or holding its ground. Options far below the best score are dropped and it picks among the rest by weighted chance, so it is readable without being a fixed pattern.
- It reads the player. Hugging it, standing off its shoulder, getting behind it, backing away, healing, holding the guard up or running out of stamina each make a specific attack more likely. Heal in the open and it charges or throws a fire wave; turtle and it switches to delayed swings.
- It retaliates. Land several hits in a row and it answers, with a rising strike in phase one and an area burst in phase two.
- It has two phases. At the enrage it swaps to a second set of attacks, and the area burst grows more likely as its health falls.
- It avoids repeating itself. The attack it just used is heavily penalised, and attacks that open with the same animation count as the same move, so the same wind-up rarely comes twice running while anything else is on offer.
- Its swings land. Distance matching stretches or shortens its travel during a wind-up so the swing connects where the player is standing, with the travel spent only while its feet are moving.
- It can be broken. Hits and parries drain its poise, and a poise break interrupts whatever it is doing and opens it up for punishment.
The player
- Committed attacks. A light combo, a heavy attack and a running attack, each with its own stamina cost, combo timing and cancel window.
- Guard and parry. A raised guard stops frontal hits at a stamina cost and breaks when stamina runs out. Pressing block opens a short parry window, and a parry sends poise damage back at the boss.
- Dodge. A roll with invulnerability frames. Locked on, the player keeps facing the boss and rolls in one of eight directions.
- Stamina and healing. Sprinting, dodging, attacking and blocking all spend stamina, and running dry leaves the player exhausted. The flask spends its charge up front and heals over a short window, so healing at the wrong moment is a real risk.
Under the hood
Boss
- A state machine runs one state at a time. Attacks, turns, staggers and the enrage are committed states that play out and clean up after themselves; pursuit is the one state in which the boss is free to decide.
- No state names what follows it. A committed state reports that it has finished and the decision layer chooses what comes next. Death, poise breaks and the start and end of the encounter arrive as event-driven interrupts and are never scored.
- Decisions are utility scoring over a single data asset. Each option’s score is its weight multiplied by every consideration, and zero when any condition fails. The highest priority with a viable option wins, and options at that priority compete by weighted chance above a score cutoff.
- Conditions, considerations and actions are small serializable classes picked from a dropdown on each option, so a new rule is one class and shows up on every option without touching the decision code.
Player
- A state machine with locomotion, attack, block, dodge, heal, flinch and dead states. The states decide; a separate motor does the moving.
- Every action goes through two gates: the active state’s timing window and the destination state’s own prerequisites. A higher-ranked action interrupts the active one outright, and anything else waits for the window.
- The input buffer holds one action, last press wins, and lives only as long as the active action’s authored buffer window, so a buffered press cannot fire late.
Shared combat
- One damage pipeline for both sides. A weapon hitbox sweeps the blade between frames, hands the hit to the target’s health, and gets back how it resolved: applied, parried, blocked or evaded.
- Dodge invulnerability, blocking and parrying are interceptors that get first refusal on a hit before health applies it, which keeps defence out of the health code.
- Poise is one component used by both the player and the boss.
- Gameplay raises events and knows nothing about its listeners. UI, VFX, audio and camera subscribe to them.
Result
A complete, winnable fight with a browser build, covered by a Play Mode test suite and scripted fight scenarios that replay specific situations on demand.
Need combat or enemy AI for your game? I’m available for contract work: tiaanvw113@gmail.com