Wolves with a den, fishing, and a mixed diet
Wolves - Den: a boulder cave at the foot of the rim, sited from the seed (away from the sea and spawn, mouth toward the valley, clearing in front) - Grace period: no wolves days 1-2; they move in on day 3 and howl; hunting from night 4; pack of 2, 3 from day 6, 4 from day 9; replaced by day - Wary pack hunters: circle and dart in one at a time; a lit campfire is a safe zone, a torch makes them hesitate, walls block bites (line of sight); hit one and the pack turns; hurt wolves flee; a lone wolf is timid; by day they defend the den; home at dawn - Glowing eyes, synthesised howls, can't sleep with wolves prowling - Wolf pelt and Wolf Cloak (+25 warmth) - Animals take a committed detour around obstacles Fishing - Fishing rod (workbench); cast a float onto the lake, 1.5 s to land a bite - Perch and rarer trout; faster bites at dawn/dusk and in rain; grill them - Visible fish near the shore that jump with splash rings Mixed diet - Foods belong to meat, fish or greens; each level runs down over ~1.5 days - One group low: no healing; two low: Malnourished (health drains); all three good: Balanced diet (heal x1.5); HUD diet bars; saved Tests: test_wolves and test_fishing_diet; run_all.sh covers 9 suites
This commit is contained in:
@@ -759,12 +759,17 @@ func _make_grass_tile(k: Vector2i) -> Node3D:
|
||||
## half width]. Set by world.gd whenever floors are built or removed; only the
|
||||
## grass tiles around old and new floors are rebuilt.
|
||||
var _grass_cuts: Array = []
|
||||
## Permanent cuts (the wolf den floor): [transform, half width x, half depth z].
|
||||
var static_cuts: Array = []
|
||||
|
||||
func set_grass_cuts(xforms: Array, half: float) -> void:
|
||||
var old := _grass_cuts
|
||||
_grass_cuts = []
|
||||
for xf: Transform3D in xforms:
|
||||
_grass_cuts.append([xf.affine_inverse(), xf.origin, half])
|
||||
_grass_cuts.append([xf.affine_inverse(), xf.origin, half, half])
|
||||
for c in static_cuts:
|
||||
var xf: Transform3D = c[0]
|
||||
_grass_cuts.append([xf.affine_inverse(), xf.origin, float(c[1]), float(c[2])])
|
||||
var touched := {}
|
||||
for c in old + _grass_cuts:
|
||||
var p: Vector3 = c[1]
|
||||
@@ -783,7 +788,7 @@ func set_grass_cuts(xforms: Array, half: float) -> void:
|
||||
static func _under_cut(cuts: Array, x: float, z: float) -> bool:
|
||||
for c in cuts:
|
||||
var l: Vector3 = (c[0] as Transform3D) * Vector3(x, (c[1] as Vector3).y, z)
|
||||
if absf(l.x) < c[2] and absf(l.z) < c[2]:
|
||||
if absf(l.x) < c[2] and absf(l.z) < c[3]:
|
||||
return true
|
||||
return false
|
||||
|
||||
|
||||
Reference in New Issue
Block a user