# 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 }