Conflicts with 0.R5's state defaults in ludic.wildlife resolved; wl_step writes the push's answer, so its callers take WildlifeState mut again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
127 lines
5.6 KiB
Text
127 lines
5.6 KiB
Text
# fake.ludic - a toy valley for the tests: flat ground at 10 m with a lake west of x = -300 (its
|
|
# surface at 10.5), forest north of z = 400, up to two players, and a table of things set out
|
|
export state WildlifeTestsFakeState {
|
|
fk_px: []float = null
|
|
fk_pz: []float = null
|
|
fk_on: []bool = null
|
|
fk_noise: float = 0.0
|
|
fk_scent: float = 0.0
|
|
fk_still: int = 0
|
|
fk_hidden: bool = false
|
|
fk_blocked: bool = false
|
|
fk_wind: float = 0.0
|
|
fk_wind_dir: float = 0.0
|
|
fk_winter: float = 0.0
|
|
fk_about: int = 0
|
|
fk_born: int = 0
|
|
fk_lures: []WildLure = null
|
|
fk_gone: int = 0 # a uid the port says is no longer there
|
|
fk_trunk: bool = false # a trunk 1 m round at (0.3, -20)
|
|
fk_out_x: float = 0.0
|
|
fk_out_z: float = 0.0
|
|
}
|
|
|
|
function fk_setup(wildlife_st: mut WildlifeState, wildlife_tests_fake_st: mut WildlifeTestsFakeState) -> void {
|
|
wildlife_tests_fake_st.fk_px = floats(2)
|
|
wildlife_tests_fake_st.fk_pz = floats(2)
|
|
wildlife_tests_fake_st.fk_on = new []bool
|
|
push(wildlife_tests_fake_st.fk_on, true)
|
|
push(wildlife_tests_fake_st.fk_on, false)
|
|
wildlife_tests_fake_st.fk_px[0] = 5000.0
|
|
wildlife_tests_fake_st.fk_pz[0] = 5000.0
|
|
wildlife_tests_fake_st.fk_lures = new []WildLure
|
|
wildlife_tests_fake_st.fk_trunk = false
|
|
wildlife_clear(wildlife_st)
|
|
wildlife_species_clear(wildlife_st)
|
|
fk_species(wildlife_st)
|
|
}
|
|
|
|
# 0 deer (meadow, tracks, medium), 1 bear (forest, charges), 2 hare (small), 3 jay (flies)
|
|
function fk_species(wildlife_st: WildlifeState) -> void {
|
|
let d = new WildSpecies
|
|
d.key = "deer"
|
|
d.walk = 1.1
|
|
d.run = 7.0
|
|
d.flee = 34.0
|
|
d.tracks = true
|
|
d.size = 1
|
|
d.range = 150.0
|
|
d.keep_away = 120.0
|
|
wildlife_species_add(wildlife_st, d)
|
|
let b = new WildSpecies
|
|
b.key = "bear"
|
|
b.habitat = WILD_FOREST
|
|
b.charges = true
|
|
b.size = 2
|
|
b.diet = WILD_FISH
|
|
b.forget = 1.6
|
|
b.run = 6.0
|
|
wildlife_species_add(wildlife_st, b)
|
|
let h = new WildSpecies
|
|
h.key = "hare"
|
|
wildlife_species_add(wildlife_st, h)
|
|
let j = new WildSpecies
|
|
j.key = "jay"
|
|
j.flies = true
|
|
j.walk = 4.0
|
|
j.flee = 8.0
|
|
j.land_shy = 0.0
|
|
j.land_chance = 1.0
|
|
wildlife_species_add(wildlife_st, j)
|
|
}
|
|
|
|
function fk_ground(x: float, z: float) -> float { return 10.0 }
|
|
function fk_water(x: float, z: float) -> float {
|
|
if x < -300.0 { return 10.5 }
|
|
return 0.0
|
|
}
|
|
function fk_forest(x: float, z: float) -> bool { return z > 400.0 }
|
|
function fk_sight(wildlife_tests_fake_st: WildlifeTestsFakeState, ax: float, ay: float, az: float, bx: float, by: float, bz: float) -> bool { return not wildlife_tests_fake_st.fk_blocked }
|
|
function fk_players() -> int { return 2 }
|
|
function fk_player_on(wildlife_tests_fake_st: WildlifeTestsFakeState, p: int) -> bool { return wildlife_tests_fake_st.fk_on[p] }
|
|
function fk_x(wildlife_tests_fake_st: WildlifeTestsFakeState, p: int) -> float { return wildlife_tests_fake_st.fk_px[p] }
|
|
function fk_y(p: int) -> float { return 10.0 }
|
|
function fk_z(wildlife_tests_fake_st: WildlifeTestsFakeState, p: int) -> float { return wildlife_tests_fake_st.fk_pz[p] }
|
|
function fk_is_hidden(wildlife_tests_fake_st: WildlifeTestsFakeState, p: int) -> bool { return wildlife_tests_fake_st.fk_hidden }
|
|
function fk_noise_of(wildlife_tests_fake_st: WildlifeTestsFakeState, p: int) -> float { return wildlife_tests_fake_st.fk_noise }
|
|
function fk_scent_of(wildlife_tests_fake_st: WildlifeTestsFakeState, p: int) -> float { return wildlife_tests_fake_st.fk_scent }
|
|
function fk_still_of(wildlife_tests_fake_st: WildlifeTestsFakeState, p: int) -> int { return wildlife_tests_fake_st.fk_still }
|
|
function fk_wind_of(wildlife_tests_fake_st: WildlifeTestsFakeState) -> float { return wildlife_tests_fake_st.fk_wind }
|
|
function fk_wind_to(wildlife_tests_fake_st: WildlifeTestsFakeState) -> float { return wildlife_tests_fake_st.fk_wind_dir }
|
|
function fk_winter_of(wildlife_tests_fake_st: WildlifeTestsFakeState) -> float { return wildlife_tests_fake_st.fk_winter }
|
|
function fk_about_of(wildlife_tests_fake_st: WildlifeTestsFakeState, a: WildAnimal) -> int { return wildlife_tests_fake_st.fk_about }
|
|
function fk_one(sp: int) -> int { return 1 }
|
|
function fk_count(wildlife_tests_fake_st: WildlifeTestsFakeState) -> int { return len(wildlife_tests_fake_st.fk_lures) }
|
|
function fk_lure(wildlife_tests_fake_st: WildlifeTestsFakeState, i: int, l: WildLure) -> bool {
|
|
let f = wildlife_tests_fake_st.fk_lures[i]
|
|
l.uid = f.uid
|
|
l.kind = f.kind
|
|
l.diet = f.diet
|
|
l.size = f.size
|
|
l.x = f.x
|
|
l.z = f.z
|
|
l.owner = f.owner
|
|
return f.uid != wildlife_tests_fake_st.fk_gone
|
|
}
|
|
function fk_present(wildlife_tests_fake_st: WildlifeTestsFakeState, uid: int) -> bool { return uid != wildlife_tests_fake_st.fk_gone }
|
|
function fk_on_born(wildlife_tests_fake_st: mut WildlifeTestsFakeState, a: WildAnimal) -> void { wildlife_tests_fake_st.fk_born += 1 }
|
|
function fk_spot(a: WildAnimal, water: bool, s: WildSpot) -> bool {
|
|
s.uid = 900
|
|
s.x = a.x + 30.0
|
|
s.z = a.z
|
|
s.water = water
|
|
return true
|
|
}
|
|
|
|
# the trunk, when it stands: a body inside it is pushed straight out from its axis
|
|
function fk_push(wildlife_tests_fake_st: mut WildlifeTestsFakeState, x: float, z: float, r: float, y0: float, y1: float) -> bool {
|
|
let dx = x - 0.3
|
|
let dz = z + 20.0
|
|
let d = Math.sqrt(dx * dx + dz * dz)
|
|
if not wildlife_tests_fake_st.fk_trunk or d > 1.0 + r or d < 0.0001 { return false }
|
|
wildlife_tests_fake_st.fk_out_x = 0.3 + dx / d * (1.0 + r)
|
|
wildlife_tests_fake_st.fk_out_z = -20.0 + dz / d * (1.0 + r)
|
|
return true
|
|
}
|
|
function fk_pushed_x(wildlife_tests_fake_st: WildlifeTestsFakeState) -> float { return wildlife_tests_fake_st.fk_out_x }
|
|
function fk_pushed_z(wildlife_tests_fake_st: WildlifeTestsFakeState) -> float { return wildlife_tests_fake_st.fk_out_z }
|