Original bugs (rewrite)¶
The classic crimsonland.exe has a few behaviors that look like genuine bugs
once you read the decompile and trace their gameplay impact.
In the rewrite, we fix these by default. For parity work and future
differential testing, you can re-enable them with --preserve-bugs.
1) Bonus drop suppression: amount == current weapon id¶
Native behavior:
- In
bonus_try_spawn_on_kill(0x0041f8d0), after spawning a bonus, the exe clears the spawned entry if either: - there’s already another bonus of the same
bonus_idon the ground (duplicate suppression), or bonus.amount == player1.weapon_idregardless of bonus type.
Why it’s likely a bug:
- For non-weapon bonuses,
amountis usually the bonus metadata “default amount”, which lives in a different integer domain than weapon ids. - This creates accidental “hard bans” where certain bonuses never drop while holding specific weapons, and it can also reduce the overall drop rate (the drop is canceled, not rerolled).
Examples of the accidental hard bans (native metadata):
Reflex Boost(amount=3) while holdingShotgun(weapon_id=3)Fire Bullets(amount=4) while holdingSawed-off Shotgun(weapon_id=4)Freeze(amount=5) while holdingSubmachine Gun(weapon_id=5)Shield(amount=7) while holdingMean Minigun(weapon_id=7)Speed(amount=8) while holdingFlamethrower(weapon_id=8)Weapon Power Up/MediKit(amount=10) while holdingMulti-Plasma(weapon_id=10)
Rewrite behavior:
- Default: only suppress
Weapondrops that match the current weapon id. - With
--preserve-bugs: re-enable the exe’samount == weapon_idsuppression rule for all bonus types.