feat(base): 0.R4 - a queue keeps its own count, so every package verb takes only its own state; ludic migrate state --prune
ludic.base's Queue<T> carries a QueueTag (its name and pending count): queue_new(name), q_push(q, v), q_drain(q), q_clear(q) take no BaseState, and core_undrained(tags) names the given queues still holding facts. A reducer on a package's state can now call that package's verbs (wallet_earn(wallet_st, n)). ludic migrate state --prune (ludicc --migrate-prune) takes out each state parameter a function no longer uses, nor anything it calls, and the argument that fills it - including an argument for a parameter the callee has dropped, which is taken out before the call is checked, so a generic's T is told by the argument that says it. A reducer keeps its state. --dry-run now counts the edits it would make. Every package was moved with it: 608 base_st parameters and their arguments, 1889 edits. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
8cf4b3fed6
commit
71735b10a2
151 changed files with 58668 additions and 54719 deletions
|
|
@ -19,7 +19,7 @@ program LuresTest {
|
|||
spot: fn fk_spot
|
||||
}
|
||||
|
||||
function facts(base_st: mut BaseState, wildlife_st: mut WildlifeState) -> []WildFact { return q_drain(base_st, wildlife_facts(base_st, wildlife_st)) }
|
||||
function facts(wildlife_st: mut WildlifeState) -> []WildFact { return q_drain(wildlife_facts(wildlife_st)) }
|
||||
function set_out(wildlife_tests_fake_st: mut WildlifeTestsFakeState, uid: int, kind: int, diet: int, x: float, z: float, owner: int) -> WildLure {
|
||||
let l = new WildLure
|
||||
l.uid = uid
|
||||
|
|
@ -36,16 +36,16 @@ program LuresTest {
|
|||
a.timer = 30.0
|
||||
return a
|
||||
}
|
||||
function go(base_st: mut BaseState, wildlife_st: mut WildlifeState, a: WildAnimal, secs: float) -> void {
|
||||
for k in 0 .. int(secs * 20.0) { wildlife_tick_ground(base_st, wildlife_st, a, 0.05, 0.05 / 60.0) }
|
||||
function go(wildlife_st: mut WildlifeState, a: WildAnimal, secs: float) -> void {
|
||||
for k in 0 .. int(secs * 20.0) { wildlife_tick_ground(wildlife_st, a, 0.05, 0.05 / 60.0) }
|
||||
}
|
||||
|
||||
test "food of its diet draws it in, it eats, and the fact names what and whose" (base_st: mut BaseState, wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
test "food of its diet draws it in, it eats, and the fact names what and whose" (wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
fk_setup(wildlife_st, wildlife_tests_fake_st)
|
||||
set_out(wildlife_tests_fake_st, 41, WILD_FEED, WILD_PLANTS, 20.0, 0.0, 3)
|
||||
let a = idle(wildlife_st, 0, 0.0, 0.0)
|
||||
go(base_st, wildlife_st, a, 40.0)
|
||||
let fs = facts(base_st, wildlife_st)
|
||||
go(wildlife_st, a, 40.0)
|
||||
let fs = facts(wildlife_st)
|
||||
var fed = 0
|
||||
for i in 0 .. len(fs) {
|
||||
if fs[i].what == WILD_FED {
|
||||
|
|
@ -58,38 +58,38 @@ program LuresTest {
|
|||
expect(a.calm > 0.0)
|
||||
}
|
||||
|
||||
test "food of another diet is left alone" (base_st: mut BaseState, wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
test "food of another diet is left alone" (wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
fk_setup(wildlife_st, wildlife_tests_fake_st)
|
||||
set_out(wildlife_tests_fake_st, 41, WILD_FEED, WILD_FISH, 20.0, 0.0, -1)
|
||||
let a = idle(wildlife_st, 0, 0.0, 0.0)
|
||||
go(base_st, wildlife_st, a, 5.0)
|
||||
go(wildlife_st, a, 5.0)
|
||||
expect(a.state != WILD_APPROACH)
|
||||
expect_eq(a.lure, 0)
|
||||
}
|
||||
|
||||
test "food taken away while it walks is given up" (base_st: mut BaseState, wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
test "food taken away while it walks is given up" (wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
fk_setup(wildlife_st, wildlife_tests_fake_st)
|
||||
set_out(wildlife_tests_fake_st, 41, WILD_FEED, WILD_PLANTS, 50.0, 0.0, -1)
|
||||
let a = idle(wildlife_st, 0, 0.0, 0.0)
|
||||
go(base_st, wildlife_st, a, 1.0)
|
||||
go(wildlife_st, a, 1.0)
|
||||
expect_eq(a.state, WILD_APPROACH)
|
||||
wildlife_tests_fake_st.fk_gone = 41
|
||||
go(base_st, wildlife_st, a, 0.2)
|
||||
go(wildlife_st, a, 0.2)
|
||||
expect(a.state != WILD_APPROACH)
|
||||
}
|
||||
|
||||
test "a snare holds a small animal, the port can find it, and a release lets it go" (base_st: mut BaseState, wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
test "a snare holds a small animal, the port can find it, and a release lets it go" (wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
fk_setup(wildlife_st, wildlife_tests_fake_st)
|
||||
let l = set_out(wildlife_tests_fake_st, 55, WILD_SNARE, 0, 10.0, 0.0, -1)
|
||||
l.size = 0
|
||||
let h = idle(wildlife_st, 2, 0.0, 0.0)
|
||||
for k in 0 .. 40 {
|
||||
if h.state == WILD_TRAPPED { break }
|
||||
go(base_st, wildlife_st, h, 2.0)
|
||||
go(wildlife_st, h, 2.0)
|
||||
}
|
||||
expect_eq(h.state, WILD_TRAPPED)
|
||||
expect(wildlife_in_snare(wildlife_st, 55) == h)
|
||||
let fs = facts(base_st, wildlife_st)
|
||||
let fs = facts(wildlife_st)
|
||||
var held = false
|
||||
for i in 0 .. len(fs) { if fs[i].what == WILD_CAUGHT and fs[i].lure == 55 { held = true } }
|
||||
expect(held)
|
||||
|
|
@ -98,19 +98,19 @@ program LuresTest {
|
|||
expect(wildlife_in_snare(wildlife_st, 55) == null)
|
||||
}
|
||||
|
||||
test "a thirsty animal walks to the water the port offers, and drinks it down" (base_st: mut BaseState, wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
test "a thirsty animal walks to the water the port offers, and drinks it down" (wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
fk_setup(wildlife_st, wildlife_tests_fake_st)
|
||||
let a = idle(wildlife_st, 0, 0.0, 0.0)
|
||||
a.thirst = 90.0
|
||||
a.state = WILD_WANDER
|
||||
go(base_st, wildlife_st, a, 0.1)
|
||||
go(wildlife_st, a, 0.1)
|
||||
expect_eq(a.state, WILD_GO_DRINK)
|
||||
expect_eq(a.spot, 900)
|
||||
go(base_st, wildlife_st, a, 40.0)
|
||||
go(wildlife_st, a, 40.0)
|
||||
expect(a.thirst < 60.0)
|
||||
}
|
||||
|
||||
test "seed down brings a bird out of the sky and it takes it" (base_st: mut BaseState, wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
test "seed down brings a bird out of the sky and it takes it" (wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
fk_setup(wildlife_st, wildlife_tests_fake_st)
|
||||
set_out(wildlife_tests_fake_st, 77, WILD_FEED, WILD_SEED, 30.0, 0.0, -1)
|
||||
let j = wildlife_new(wildlife_st, 3, 0.0, 0.0, false)
|
||||
|
|
@ -119,9 +119,9 @@ program LuresTest {
|
|||
var landed = false
|
||||
var ate = false
|
||||
for k in 0 .. 4000 {
|
||||
wildlife_tick(base_st, wildlife_st, 0.05, 0.0)
|
||||
wildlife_tick(wildlife_st, 0.05, 0.0)
|
||||
if j.state == WILD_PERCH { landed = true }
|
||||
let fs = facts(base_st, wildlife_st)
|
||||
let fs = facts(wildlife_st)
|
||||
for i in 0 .. len(fs) { if fs[i].what == WILD_FED and fs[i].diet == WILD_SEED { ate = true } }
|
||||
if ate { break }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ program WildlifeTest {
|
|||
spot: fn fk_spot
|
||||
}
|
||||
|
||||
function facts(base_st: mut BaseState, wildlife_st: mut WildlifeState) -> []WildFact { return q_drain(base_st, wildlife_facts(base_st, wildlife_st)) }
|
||||
function facts(wildlife_st: mut WildlifeState) -> []WildFact { return q_drain(wildlife_facts(wildlife_st)) }
|
||||
function count(fs: []WildFact, what: int) -> int {
|
||||
var n = 0
|
||||
for i in 0 .. len(fs) { if fs[i].what == what { n += 1 } }
|
||||
|
|
@ -47,8 +47,8 @@ program WildlifeTest {
|
|||
wildlife_tests_fake_st.fk_px[0] = x
|
||||
wildlife_tests_fake_st.fk_pz[0] = z
|
||||
}
|
||||
function go(base_st: mut BaseState, wildlife_st: mut WildlifeState, a: WildAnimal, secs: float) -> void {
|
||||
for k in 0 .. int(secs * 20.0) { wildlife_tick_ground(base_st, wildlife_st, a, 0.05, 0.05 / 60.0) }
|
||||
function go(wildlife_st: mut WildlifeState, a: WildAnimal, secs: float) -> void {
|
||||
for k in 0 .. int(secs * 20.0) { wildlife_tick_ground(wildlife_st, a, 0.05, 0.05 / 60.0) }
|
||||
}
|
||||
|
||||
test "the table handed in numbers the species, and a new animal is born through the port" (wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
|
|
@ -79,24 +79,24 @@ program WildlifeTest {
|
|||
expect_eq(wildlife_count_all(wildlife_st), wildlife_count(wildlife_st, 0) + wildlife_count(wildlife_st, 1) + wildlife_count(wildlife_st, 2) + wildlife_count(wildlife_st, 3))
|
||||
}
|
||||
|
||||
test "a player far off makes no difference that lasts: the alert settles under the unaware line" (base_st: mut BaseState, wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
test "a player far off makes no difference that lasts: the alert settles under the unaware line" (wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
fk_setup(wildlife_st, wildlife_tests_fake_st)
|
||||
let a = deer_at(wildlife_st, 0.0, 0.0)
|
||||
player_at(wildlife_tests_fake_st, 55.0, 0.0)
|
||||
wildlife_tests_fake_st.fk_noise = 0.3
|
||||
go(base_st, wildlife_st, a, 60.0)
|
||||
go(wildlife_st, a, 60.0)
|
||||
expect(a.alert < 25.0)
|
||||
expect(a.state != WILD_FLEE)
|
||||
}
|
||||
|
||||
test "close and in the open it is flushed, runs, and says so" (base_st: mut BaseState, wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
test "close and in the open it is flushed, runs, and says so" (wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
fk_setup(wildlife_st, wildlife_tests_fake_st)
|
||||
let a = deer_at(wildlife_st, 0.0, 0.0)
|
||||
player_at(wildlife_tests_fake_st, 8.0, 0.0)
|
||||
wildlife_tests_fake_st.fk_noise = 0.8
|
||||
go(base_st, wildlife_st, a, 10.0)
|
||||
go(wildlife_st, a, 10.0)
|
||||
expect(a.spook > 0.0)
|
||||
let fs = facts(base_st, wildlife_st)
|
||||
let fs = facts(wildlife_st)
|
||||
expect(count(fs, WILD_FLED) >= 1)
|
||||
expect(a.x < 0.0)
|
||||
}
|
||||
|
|
@ -135,33 +135,33 @@ program WildlifeTest {
|
|||
expect_near(wildlife_alert_rate(wildlife_st, a, 0, 60.0), 0.0, 0.0001)
|
||||
}
|
||||
|
||||
test "a charger comes at a player inside its reach, and a shove is a fact for the game" (base_st: mut BaseState, wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
test "a charger comes at a player inside its reach, and a shove is a fact for the game" (wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
fk_setup(wildlife_st, wildlife_tests_fake_st)
|
||||
let b = wildlife_make(wildlife_st, 1, 0.0, 0.0, false, 0.0, 0, 1.0, 2)
|
||||
player_at(wildlife_tests_fake_st, 6.0, 0.0)
|
||||
wildlife_tick_ground(base_st, wildlife_st, b, 0.05, 0.001)
|
||||
wildlife_tick_ground(wildlife_st, b, 0.05, 0.001)
|
||||
expect_eq(b.state, WILD_CHARGE)
|
||||
go(base_st, wildlife_st, b, 2.0)
|
||||
let fs = facts(base_st, wildlife_st)
|
||||
go(wildlife_st, b, 2.0)
|
||||
let fs = facts(wildlife_st)
|
||||
expect_eq(count(fs, WILD_CHARGED), 1)
|
||||
expect_eq(count(fs, WILD_SHOVED), 1)
|
||||
expect(b.calm > 0.0)
|
||||
}
|
||||
|
||||
test "away is hidden and skipped, gone is removed and said" (base_st: mut BaseState, wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
test "away is hidden and skipped, gone is removed and said" (wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
fk_setup(wildlife_st, wildlife_tests_fake_st)
|
||||
let a = deer_at(wildlife_st, 0.0, 0.0)
|
||||
player_at(wildlife_tests_fake_st, 10.0, 0.0)
|
||||
wildlife_tests_fake_st.fk_about = WILD_AWAY
|
||||
wildlife_tick(base_st, wildlife_st, 0.05, 0.001)
|
||||
wildlife_tick(wildlife_st, 0.05, 0.001)
|
||||
expect(not a.shown and a.alive)
|
||||
wildlife_tests_fake_st.fk_about = WILD_GONE
|
||||
wildlife_tick(base_st, wildlife_st, 0.05, 0.001)
|
||||
wildlife_tick(wildlife_st, 0.05, 0.001)
|
||||
expect(not a.alive)
|
||||
expect_eq(count(facts(base_st, wildlife_st), WILD_WENT), 1)
|
||||
expect_eq(count(facts(wildlife_st), WILD_WENT), 1)
|
||||
}
|
||||
|
||||
test "a walker leaves a print every 2.8 m, and player 0 spots a species once" (base_st: mut BaseState, wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
test "a walker leaves a print every 2.8 m, and player 0 spots a species once" (wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
fk_setup(wildlife_st, wildlife_tests_fake_st)
|
||||
let a = deer_at(wildlife_st, 0.0, 0.0)
|
||||
player_at(wildlife_tests_fake_st, 40.0, 0.0)
|
||||
|
|
@ -170,14 +170,14 @@ program WildlifeTest {
|
|||
a.tx = 0.0
|
||||
a.tz = -100.0
|
||||
a.timer = 100.0
|
||||
for k in 0 .. 200 { wildlife_tick(base_st, wildlife_st, 0.05, 0.0) }
|
||||
let fs = facts(base_st, wildlife_st)
|
||||
for k in 0 .. 200 { wildlife_tick(wildlife_st, 0.05, 0.0) }
|
||||
let fs = facts(wildlife_st)
|
||||
expect(count(fs, WILD_PRINT) >= 3)
|
||||
expect_eq(count(fs, WILD_SPOTTED), 1)
|
||||
expect(wildlife_seen(wildlife_st, 0))
|
||||
}
|
||||
|
||||
test "the record and the found ranges come back from the save section" (base_st: mut BaseState, wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
test "the record and the found ranges come back from the save section" (wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) {
|
||||
fk_setup(wildlife_st, wildlife_tests_fake_st)
|
||||
wildlife_spawn(wildlife_st, 0.0, 0.0)
|
||||
wildlife_mark_fed(wildlife_st, 2)
|
||||
|
|
@ -185,9 +185,9 @@ program WildlifeTest {
|
|||
let r = wildlife_ranges(wildlife_st)[0]
|
||||
wildlife_ranges_visit(wildlife_st, r.x, r.z)
|
||||
let v = wildlife_save(wildlife_st)
|
||||
wildlife_reset(base_st, wildlife_st)
|
||||
wildlife_reset(wildlife_st)
|
||||
expect(not wildlife_fed_any(wildlife_st) and not wildlife_ranges(wildlife_st)[0].found)
|
||||
wildlife_load(base_st, wildlife_st, v, 1)
|
||||
wildlife_load(wildlife_st, v, 1)
|
||||
expect(wildlife_fed_any(wildlife_st))
|
||||
expect_eq(wildlife_fed_mask(wildlife_st), 4)
|
||||
expect(wildlife_seen(wildlife_st, 0))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue