diff --git a/packages/ludic.fishing/facts.ludic b/packages/ludic.fishing/facts.ludic new file mode 100644 index 00000000..1df7836e --- /dev/null +++ b/packages/ludic.fishing/facts.ludic @@ -0,0 +1,19 @@ +# facts.ludic - a fishing fact's record: one no drain holds any more, made fresh (and kept) only when +# every one is held. A cast, a bite, every crossing and run of a fight is a fact, and a record a fact +# is never given back (the ludic.wildlife idiom, facts.ludic there) +function fishing_fact_record(fishing_st: mut FishingState) -> FishingFact { + if fishing_st.fishing_fnext[0] >= len(fishing_st.fishing_ffree) { + q_unheld(fishing_st.fishing_fact_q, fishing_st.fishing_fpool, fishing_st.fishing_ffree) + fishing_st.fishing_fnext[0] = 0 + } + if fishing_st.fishing_fnext[0] < len(fishing_st.fishing_ffree) { + let f = fishing_st.fishing_ffree[fishing_st.fishing_fnext[0]] + fishing_st.fishing_fnext[0] += 1 + return f + } + let f = new FishingFact + push(fishing_st.fishing_fpool, f) + return f +} +# how many fact records have ever been made: the peak held at once, not the facts said +export function fishing_fact_records(fishing_st: FishingState) -> int { return len(fishing_st.fishing_fpool) } diff --git a/packages/ludic.fishing/index.ludic b/packages/ludic.fishing/index.ludic index cc285a58..db737519 100644 --- a/packages/ludic.fishing/index.ludic +++ b/packages/ludic.fishing/index.ludic @@ -6,6 +6,7 @@ import "ludic.base" import "kinds.ludic" import "ports.ludic" import "state.ludic" +import "facts.ludic" import "fight.ludic" import "verbs.ludic" import "run.ludic" diff --git a/packages/ludic.fishing/state.ludic b/packages/ludic.fishing/state.ludic index b572d9c8..72babe6f 100644 --- a/packages/ludic.fishing/state.ludic +++ b/packages/ludic.fishing/state.ludic @@ -25,6 +25,9 @@ export state FishingState { fishing_run_next: float = 0.0 fishing_dice: Rng = null fishing_fact_q: Queue = fishing_fact_q__new() + fishing_fpool: []FishingFact = new []FishingFact # every fact record made, reused once no drain holds it (facts.ludic) + fishing_ffree: []FishingFact = new []FishingFact + fishing_fnext: []int = words(1) fishing_n: int = 0 # the record: caught, the biggest (cm), a legend landed fishing_big: int = 0 fishing_leg: bool = false @@ -51,8 +54,8 @@ function fishing_rand(fishing_st: mut FishingState) -> float { return rng_float(fishing_st.fishing_dice) } -function fishing_say(fishing_st: FishingState, what: int) -> void { - let f = new FishingFact +function fishing_say(fishing_st: mut FishingState, what: int) -> void { + let f = fishing_fact_record(fishing_st) f.what = what f.species = fishing_st.fishing_sp f.cm = fishing_st.fishing_len diff --git a/packages/ludic.fishing/tests/fishing_test.ludic b/packages/ludic.fishing/tests/fishing_test.ludic index 80aad898..bf510c4d 100644 --- a/packages/ludic.fishing/tests/fishing_test.ludic +++ b/packages/ludic.fishing/tests/fishing_test.ludic @@ -254,4 +254,20 @@ program FishingTest { expect(fishing_legend_caught(fishing_st)) expect(not fishing_active(fishing_st)) } + + test "fifty fish, their facts drained each time, reuse a handful of records" (fishing_st: mut FishingState, fishing_test_st: mut FishingTestState) { + fresh(fishing_st, fishing_test_st) + for k in 0 .. 50 { + fishing_cast(fishing_st, 20.0, 0.0) + facts(fishing_st) + hook(fishing_st) + facts(fishing_st) + play(fishing_st, 12) + facts(fishing_st) + fishing_stop(fishing_st) + facts(fishing_st) + } + print(`fishing: 50 fish, {fishing_fact_records(fishing_st)} fact records made`) + expect(fishing_fact_records(fishing_st) < 30) + } }