From 1d344225d36f7b89045d7d2b659acf10ee3f2834 Mon Sep 17 00:00:00 2001 From: AI Agent Date: Sat, 14 Mar 2026 14:34:00 -0600 Subject: [PATCH] Update test checklist for tick-based combat and status effect systems Add test cases for: tick engine lifecycle, tick-based combat resolution, NPC AI auto-engage, defend command, queued flee/use, status effects (poison, regen, expiration), passive HP regen, combat RNG variance, and movement lockout during combat. Update smoke test with tick-timing test. Made-with: Cursor --- TESTING.md | 73 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 66 insertions(+), 7 deletions(-) diff --git a/TESTING.md b/TESTING.md index 87f1f08..75a199b 100644 --- a/TESTING.md +++ b/TESTING.md @@ -10,6 +10,7 @@ Run through these checks before every commit to ensure consistent feature covera - [ ] Server starts: `RUST_LOG=info ./target/debug/mudserver` - [ ] World loads all rooms, NPCs, objects, races, classes (check log output) - [ ] Database opens (or creates) successfully +- [ ] Tick engine starts and logs tick rate ## Character Creation - [ ] New player SSH → gets chargen flow (race + class selection) @@ -20,12 +21,14 @@ Run through these checks before every commit to ensure consistent feature covera ## Player Persistence - [ ] Reconnecting player skips chargen, sees "Welcome back!" - [ ] Room, stats, inventory, equipment all restored from DB +- [ ] Status effects do NOT persist across sessions (cleared on login) - [ ] Verify with: `sqlite3 mudserver.db "SELECT * FROM players;"` ## Movement & Navigation - [ ] `go north`, `n`, `south`, `s`, etc. all work - [ ] Invalid direction shows error - [ ] Room view shows: NPCs (colored by attitude), objects, exits, other players +- [ ] Cannot move while in combat (combat lockout) ## NPC Interaction - [ ] `examine ` shows description, stats, attitude label @@ -33,23 +36,61 @@ Run through these checks before every commit to ensure consistent feature covera - [ ] `talk ` shows snarl message - [ ] Dead NPCs don't appear in room view -## Combat -- [ ] `attack ` initiates combat +## Combat - Tick-Based +- [ ] `attack ` enters combat state - [ ] Can't attack friendly/neutral NPCs -- [ ] Combat rounds show damage dealt and received +- [ ] Combat rounds resolve automatically on server ticks (not on command) +- [ ] Player receives tick-by-tick combat output (damage dealt, damage taken) +- [ ] Default combat action is "attack" if no other action queued +- [ ] `defend` / `def` sets defensive stance (reduced incoming damage next tick) - [ ] NPC death: awards XP, shifts attitude -10, shifts faction -5 -- [ ] Player death: respawns at spawn room with full HP +- [ ] Player death: respawns at spawn room with full HP, combat cleared - [ ] NPCs respawn after configured time -- [ ] Combat lockout: can only attack/flee/look/quit during combat -- [ ] `flee` exits combat +- [ ] Combat lockout: can only attack/defend/flee/look/use/quit during combat +- [ ] `flee` queues escape attempt — may fail based on stats +- [ ] `use ` in combat queues item use for next tick +- [ ] Multiple ticks of combat resolve correctly without player input +- [ ] Combat ends when NPC dies (player exits combat state) +- [ ] Combat ends when player flees successfully + +## Combat - NPC AI +- [ ] Hostile NPCs auto-engage players who enter their room +- [ ] Aggressive NPCs do NOT auto-engage (only attackable, not initiating) +- [ ] NPC attacks resolve on tick alongside player attacks +- [ ] NPCs in combat continue attacking even if player sends no commands + +## Combat - RNG +- [ ] Damage varies between hits (not identical each time) +- [ ] Multiple rapid attacks produce different damage values ## Items - [ ] `take ` picks up takeable objects - [ ] `drop ` places item in room - [ ] `equip ` works, old gear returns to inventory -- [ ] `use ` heals and removes item +- [ ] `use ` heals and removes item (immediate out of combat) +- [ ] `use ` in combat queues for next tick - [ ] `inventory` shows equipped + bag items +## Status Effects +- [ ] Poison deals damage each tick, shows message to player +- [ ] Regeneration heals each tick, shows message to player +- [ ] Status effects expire after their duration (in ticks) +- [ ] `stats` command shows active status effects and remaining duration +- [ ] Multiple status effects can be active simultaneously +- [ ] Status effects cleared on player death/respawn + +## Passive Regeneration +- [ ] Players out of combat slowly regenerate HP over ticks +- [ ] Regeneration does not occur while in combat +- [ ] HP does not exceed max_hp + +## Tick Engine +- [ ] Tick runs at configured interval (~2 seconds) +- [ ] Tick processes: NPC AI → combat rounds → status effects → respawns → regen +- [ ] Tick output is delivered to players promptly +- [ ] Server remains responsive to immediate commands between ticks +- [ ] Multiple players in separate combats are processed independently per tick + ## Attitude System - [ ] Per-player NPC attitudes stored in DB - [ ] `examine` shows attitude label per-player @@ -150,6 +191,24 @@ ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 newplaye quit EOF +# Test 6: Tick-based combat (connect and wait for ticks) +./target/debug/mudtool settings set registration_open true +./target/debug/mudtool players delete smoketest +ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 smoketest@localhost <<'EOF' +1 +1 +go south +go south +attack thief +EOF +# Wait for several combat ticks to resolve +sleep 8 +ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 smoketest@localhost <<'EOF' +stats +quit +EOF +# Verify XP changed (combat happened via ticks) + # Cleanup ./target/debug/mudtool settings set registration_open true ./target/debug/mudtool players delete smoketest