- fight.c in full: fight/attack with all eight special monster attacks (aquator rust, ice freeze, rattlesnake poison, wraith/vampire drains, flytrap hold, leprechaun/nymph theft), swing, roll_em dice parsing (with a C-semantics atoi — Go's strconv rejects '1x4/...'), hit/miss message variants, killed, remove_mon - chase.c completed: runners, move_monst, relocate, do_chase with dragon breath, chase target selection (C's dead oroom comparison in relocate is preserved as-is) - move.c in full: do_move with passgo turning, all eight traps, rndmove, rust_armor - sticks.c completed: do_zap (all 14 sticks), drain, fire_bolt with wall bounces; weapons.c completed: missile/do_motion/fall/wield - rip.c: death tombstone, total_winner, killname; C exit() becomes a gameEnd panic that Run will recover - score.go: top-ten scoreboard as a gob file with lock-file protocol replacing the XOR-encrypted C format - wizard.c: whatis/set_know/teleport; daemons.c stomach - monster bestiary moved to per-game state (C mutates the flytrap damage string during play) Tests: combat math, kill/removal bookkeeping, monster chase pursuit, death unwinding, scripted-input headless terminal.
26 lines
472 B
Go
26 lines
472 B
Go
package game
|
|
|
|
// testTerm is a headless Terminal for tests: rendering is a no-op and
|
|
// input plays a script, then alternates space/newline so that --More--
|
|
// and [Press return] prompts never block.
|
|
type testTerm struct {
|
|
input []byte
|
|
pos int
|
|
tick int
|
|
}
|
|
|
|
func (t *testTerm) Render(*Window) {}
|
|
|
|
func (t *testTerm) ReadChar() byte {
|
|
if t.pos < len(t.input) {
|
|
c := t.input[t.pos]
|
|
t.pos++
|
|
return c
|
|
}
|
|
t.tick++
|
|
if t.tick%2 == 0 {
|
|
return '\n'
|
|
}
|
|
return ' '
|
|
}
|