ludic/packages/ludic.wildlife/tests/idle_pins_test.ludic
Orkuncakilkaya 67d477af77 ludic.wildlife: pin every transition of the 15 WILD_* states and the dice each draws (phase 27.2a)
Sixteen test programs under tests/*_pins_test.ludic, on today's code, each one tick from a set
state through the public step (wildlife_tick_ground / _bird / wildlife_tick, wildlife_release,
wildlife_new): the state it goes to, its timer, and how many of the package's rolls it took and
which (the next roll is read off a newborn's yaw, compared with a stream of the same seed). IDLE,
WANDER, ALERT, WARY, FLEE, CHARGE, GO_DRINK, GO_FEED, DRINK, APPROACH, EAT, TRAPPED, FLY, LAND,
PERCH; the droppings' roll before them; the newborn's seven (eight for a bird); what the step
leaves alone. tests/pin/ holds the shared step, the dice reader and two species of its own (a tame
horse, a crow that never lands on its own). Compiled, not run here: 27.2 holds to them unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 16:57:15 +03:00

94 lines
3.9 KiB
Text

# idle_pins_test.ludic - phase 27.2a: IDLE's way out as it stands. Its time up it goes WANDER for
# 6 + 10 r s toward a spot about home (an angle, a distance): a tracked walker first rolls for a bed
# when the sit was short, and the droppings' roll comes before all of them
import "ludic.wildlife"
import "ludic.base"
import "fake"
import "pin"
program IdlePins {
numbers float
bind WildlifeWorld {
ground: fn fk_ground
water: fn fk_water
players: fn fk_players
player_on: fn fk_player_on
player_x: fn fk_x
player_y: fn fk_y
player_z: fn fk_z
about: fn fk_about_of
lures: fn fk_count
lure: fn fk_lure
present: fn fk_present
spot: fn pn_spot
taught: fn pn_taught
}
test "IDLE, its time up: WANDER for 6 + 10 r0 s toward home at (r1, r2); a walker leaving no sign rolls three" (wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
pn_setup(wildlife_st, wildlife_tests_fake_st)
let a = pn_at(wildlife_st, 2, 0.0, 0.0, WILD_IDLE, 0.0)
wildlife_seed(wildlife_st, 11)
pn_step(wildlife_st, a)
expect_eq(a.state, WILD_WANDER)
expect_near(a.timer, 6.0 + 10.0 * pn_roll(11, 0), 0.0001)
expect_near(a.tx, pn_tx(a, 11, 1, 60.0), 0.001)
expect_near(a.tz, pn_tz(a, 11, 1, 60.0), 0.001)
expect_eq(pn_count(pn_drain(wildlife_st), WILD_BED), 0)
expect_eq(pn_drew(wildlife_st, 11), 3)
}
test "a tracked walker after a short sit rolls r0 for a bed (under 0.06 leaves one), then the same three" (wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
pn_setup(wildlife_st, wildlife_tests_fake_st)
let seeds = [25, 11]
for i in 0 .. 2 {
let a = pn_at(wildlife_st, 0, 0.0, 0.0, WILD_IDLE, 0.0)
wildlife_seed(wildlife_st, seeds[i])
pn_step(wildlife_st, a)
var bed = 0
if pn_roll(seeds[i], 0) < 0.06 { bed = 1 }
expect_eq(pn_count(pn_drain(wildlife_st), WILD_BED), bed)
expect_eq(a.state, WILD_WANDER)
expect_near(a.timer, 6.0 + 10.0 * pn_roll(seeds[i], 1), 0.0001)
expect_near(a.tx, pn_tx(a, seeds[i], 2, 60.0), 0.001)
expect_eq(pn_drew(wildlife_st, seeds[i]), 4)
}
}
test "a sit of 6 s or more rolls no bed: the three alone" (wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
pn_setup(wildlife_st, wildlife_tests_fake_st)
let a = pn_at(wildlife_st, 0, 0.0, 0.0, WILD_IDLE, -10.0)
wildlife_seed(wildlife_st, 25)
pn_step(wildlife_st, a)
expect_eq(a.state, WILD_WANDER)
expect_near(a.timer, 6.0 + 10.0 * pn_roll(25, 0), 0.0001)
expect_eq(pn_count(pn_drain(wildlife_st), WILD_BED), 0)
expect_eq(pn_drew(wildlife_st, 25), 3)
}
test "droppings due roll first (scat_t = 120 + 300 r0, a fact within 500 m), then bed, time, target" (wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
pn_setup(wildlife_st, wildlife_tests_fake_st)
pn_player(wildlife_tests_fake_st, 100.0, 0.0)
let a = pn_at(wildlife_st, 0, 0.0, 0.0, WILD_IDLE, 0.0)
a.scat_t = 0.0
wildlife_seed(wildlife_st, 15)
pn_step(wildlife_st, a)
let fs = pn_drain(wildlife_st)
expect_eq(pn_count(fs, WILD_SCAT), 1)
expect_near(a.scat_t, 120.0 + 300.0 * pn_roll(15, 0), 0.001)
var bed = 0
if pn_roll(15, 1) < 0.06 { bed = 1 }
expect_eq(pn_count(fs, WILD_BED), bed)
expect_near(a.timer, 6.0 + 10.0 * pn_roll(15, 2), 0.0001)
expect_near(a.tx, pn_tx(a, 15, 3, 60.0), 0.001)
expect_eq(pn_drew(wildlife_st, 15), 5)
}
test "IDLE before its time stays, and rolls nothing" (wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
pn_setup(wildlife_st, wildlife_tests_fake_st)
let a = pn_at(wildlife_st, 2, 0.0, 0.0, WILD_IDLE, 5.0)
wildlife_seed(wildlife_st, 11)
pn_step(wildlife_st, a)
expect_eq(a.state, WILD_IDLE)
expect_near(a.timer, 4.95, 0.0001)
expect_eq(pn_drew(wildlife_st, 11), 0)
}
}