Game: RF 4.55 (Dragonborn), server v0.3.1, Windows build (stock gameserver.exe, SHA-256 c10012f3…f699a).
Client: the supported Taiwan build, RF_Online.bin SHA-256 46528aac…2bbc558 (2025-07-16), Language=Taiwan.
Summary
After a race destroys a Control Chip, a powerless Holy Stone Keeper appears. The winning race must protect it and
the other races try to kill it. The server accepts the keeper's death from any race, the winners included,
and also during scene 4. A kill by the winners ends their own keeper phase (scene 5).
How it is known: read in the stock v0.3.1 gameserver.exe with a Go symbol disassembler. Not reproduced in game.
What the server does (read)
- The keeper is monster
04903 (chipWarCreateKeeperLocked 0x1407bd5a0), an ordinary monster: nothing on the damage path checks the attacker's race (as for the stones). - On its death,
receiveDestroyKeeper 0x1407b54c0 gets bl = the killer's race:0x1407b5531–0x1407b554a: it accepts scene 3, 4 or 6;0x1407b554c: it stores the killer's race at [cw+0x120], then setSceneLocked(5) (the keeper is dead).
- It never compares the killer's race with the holy-master race (
[cw+0xe0]). - Scene 4 is the keeper's second phase. Inferred (from the attackable byte GoMMO puts in 19/03): the keeper isn't meant to be attackable then. A kill there is still accepted.
Expected
Only races other than the holy master can kill the powerless keeper. The winners' own hits should be refused, or at least not end their phase.
Suggested fix
- Refuse damage to the keeper from the holy-master race (as for a friendly monster).
- At least: in
receiveDestroyKeeper, ignore a kill whose race equals [cw+0xe0]; and decide whether scene 4 kills should count.
How to reproduce in game
- Win a chip war (destroy an enemy stone), and wait for the keeper (scene 3).
- Attack the keeper with a player of the winning race until it dies.
- The keeper phase ends (scene 5), as if an enemy had killed it.
What I do locally (not a fix)
A server patch (chipwar-keeper-guard): at 0x1407b554c a cave takes the no-change path (0x1407b5576) when
bl == [rdx+0xe0]. The keeper is still dead, but the phase runs on and the next scene brings a new keeper.