M1d: creatures, hunting, weapons, food buffs and the hide cloak
- Rabbits, deer and boars with procedural meshes and animated legs, a state machine (idle/wander/flee/charge/dead) and heightmap steering that avoids water, cliffs, the world edge, trees and buildings - Spawner keeps a habitat-based budget around the player (6/4/3) - Melee needs a weapon or tool (club, spear, axe, pickaxe); box sweep hits - Wooden spear (thrust or throw) and crude bow with draw-scaled arrows; projectiles stick in the world as saved pickups - Carcasses: E to butcher for meat, hide and embedded arrows - Boars charge and gore when hit; hurt flash and a brief healing pause - Cooked meat gives Well fed (faster stamina and healing); buffs saved - Hide cloak: wear for warmth, saved, goes in the grave on death - Feathers as meadow pickups (appended, existing save ids unchanged) - New test_creatures_combat suite; run_all.sh gets a per-suite time limit
This commit is contained in:
@@ -57,6 +57,14 @@ static func build(key: String) -> ArrayMesh:
|
||||
"wood_roof": m = _roof()
|
||||
"wood_gable": m = _gable()
|
||||
"bed": m = _bed()
|
||||
"raw_meat": m = _meat(MEAT_RAW)
|
||||
"cooked_meat": m = _meat(MEAT_COOKED)
|
||||
"hide": m = _hide()
|
||||
"feather": m = _feather()
|
||||
"spear": m = _spear()
|
||||
"bow": m = _bow()
|
||||
"arrow": m = _arrow()
|
||||
"hide_cloak": m = _cloak()
|
||||
"berry_bush": m = _berry_bush(true)
|
||||
"berry_bush_bare": m = _berry_bush(false)
|
||||
_:
|
||||
@@ -373,3 +381,89 @@ static func _bed() -> ArrayMesh:
|
||||
_box(st, Vector3(0, 0.5, -0.72), Vector3(0.6, 0.1, 0.32), LINEN)
|
||||
_box(st, Vector3(0, 0.47, 0.25), Vector3(0.9, 0.08, 1.3), FUR)
|
||||
return P._commit(st)
|
||||
|
||||
# --- hunting gear (M1d) -------------------------------------------------------
|
||||
|
||||
const MEAT_RAW := Color(0.72, 0.24, 0.24)
|
||||
const MEAT_COOKED := Color(0.48, 0.26, 0.12)
|
||||
const BONE := Color(0.90, 0.87, 0.78)
|
||||
const HIDE := Color(0.58, 0.42, 0.28)
|
||||
const FEATHER := Color(0.88, 0.86, 0.80)
|
||||
const FLETCH := Color(0.70, 0.22, 0.18)
|
||||
|
||||
static func _meat(col: Color) -> ArrayMesh:
|
||||
var st := P._begin()
|
||||
var r := _rng(107)
|
||||
var n := FastNoiseLite.new()
|
||||
n.seed = 107
|
||||
n.frequency = 2.2
|
||||
P._blob(st, Vector3(0.03, 0.07, 0), Vector3(0.13, 0.07, 0.1), n, 0.25, col, r, 1)
|
||||
P._cylinder(st, Vector3(-0.08, 0.07, 0), Vector3(-0.2, 0.08, 0.01), 0.022, 0.018, 5, BONE, r, -1.0, BONE)
|
||||
P._blob(st, Vector3(-0.21, 0.08, 0.01), Vector3(0.03, 0.03, 0.035), n, 0.1, BONE, r, 0)
|
||||
return P._commit(st)
|
||||
|
||||
static func _hide() -> ArrayMesh:
|
||||
var st := P._begin()
|
||||
var r := _rng(109)
|
||||
# A rough, folded pelt: a few overlapping flattened slabs.
|
||||
_box(st, Vector3(0, 0.02, 0), Vector3(0.36, 0.03, 0.26), HIDE, Basis(Vector3.UP, 0.2))
|
||||
_box(st, Vector3(0.05, 0.05, 0.02), Vector3(0.28, 0.03, 0.2), P._mul(HIDE, 0.85), Basis(Vector3.UP, -0.3))
|
||||
_box(st, Vector3(-0.04, 0.075, -0.02), Vector3(0.2, 0.025, 0.16), _board(r, HIDE), Basis(Vector3.UP, 0.6))
|
||||
return P._commit(st)
|
||||
|
||||
static func _feather() -> ArrayMesh:
|
||||
var st := P._begin()
|
||||
var r := _rng(113)
|
||||
P._cylinder(st, Vector3(-0.14, 0.01, 0), Vector3(0.14, 0.012, 0), 0.004, 0.002, 3, BONE, r)
|
||||
for side in [-1.0, 1.0]:
|
||||
var a := Vector3(-0.1, 0.01, 0)
|
||||
var b := Vector3(0.13, 0.012, 0)
|
||||
var c := Vector3(0.0, 0.01, side * 0.035)
|
||||
P._tri(st, a, b, c, Vector3.UP, FEATHER)
|
||||
P._tri(st, a, b, c, Vector3.DOWN, P._mul(FEATHER, 0.85))
|
||||
return P._commit(st)
|
||||
|
||||
## Long shaft along +Y from the grip, fire-hardened point with a flint tip.
|
||||
static func _spear() -> ArrayMesh:
|
||||
var st := P._begin()
|
||||
var r := _rng(127)
|
||||
P._cylinder(st, Vector3(0, -0.55, 0), Vector3(0, 0.75, 0), 0.022, 0.02, 6, HANDLE, r, -1.0, HANDLE)
|
||||
_box(st, Vector3(0, 0.78, 0), Vector3(0.05, 0.06, 0.05), BINDING)
|
||||
P._cylinder(st, Vector3(0, 0.8, 0), Vector3(0, 0.98, 0), 0.035, 0.004, 4, FLINT, r)
|
||||
return P._commit(st)
|
||||
|
||||
## Bent stave along +Y with a string on the +Z side (held upright).
|
||||
static func _bow() -> ArrayMesh:
|
||||
var st := P._begin()
|
||||
var r := _rng(131)
|
||||
var pts: Array[Vector3] = []
|
||||
for i in range(7):
|
||||
var t := -1.0 + 2.0 * i / 6.0
|
||||
pts.append(Vector3(0, t * 0.55, -0.1 * (1.0 - t * t)))
|
||||
for i in range(6):
|
||||
P._cylinder(st, pts[i], pts[i + 1], 0.02 if absf(i - 2.5) < 1.5 else 0.015, 0.02 if absf(i - 2.5) < 1.5 else 0.013, 5, PLANK_DARK, r, 0.0)
|
||||
P._cylinder(st, pts[0], pts[6], 0.004, 0.004, 3, LINEN, r)
|
||||
_box(st, Vector3(0, 0, -0.1), Vector3(0.05, 0.12, 0.05), BINDING)
|
||||
return P._commit(st)
|
||||
|
||||
## Arrow along -Z (its flight direction), tip at the front.
|
||||
static func _arrow() -> ArrayMesh:
|
||||
var st := P._begin()
|
||||
var r := _rng(137)
|
||||
P._cylinder(st, Vector3(0, 0, 0.35), Vector3(0, 0, -0.33), 0.008, 0.008, 4, HANDLE, r, 0.0)
|
||||
P._cylinder(st, Vector3(0, 0, -0.32), Vector3(0, 0, -0.4), 0.018, 0.002, 4, FLINT, r, 0.0)
|
||||
for a in [0.0, TAU / 3.0, TAU * 2.0 / 3.0]:
|
||||
var d := Vector3(cos(a), sin(a), 0) * 0.03
|
||||
P._tri(st, Vector3(0, 0, 0.33), Vector3(0, 0, 0.2), d + Vector3(0, 0, 0.3), Vector3(-d.y, d.x, 0), FLETCH)
|
||||
P._tri(st, Vector3(0, 0, 0.33), Vector3(0, 0, 0.2), d + Vector3(0, 0, 0.3), Vector3(d.y, -d.x, 0), FLETCH)
|
||||
return P._commit(st)
|
||||
|
||||
static func _cloak() -> ArrayMesh:
|
||||
var st := P._begin()
|
||||
var r := _rng(139)
|
||||
# Folded cloak: a stack of fur with a bone clasp.
|
||||
for i in range(3):
|
||||
_box(st, Vector3(0, 0.03 + i * 0.045, 0), Vector3(0.42 - i * 0.05, 0.04, 0.3 - i * 0.03), _board(r, HIDE), Basis(Vector3.UP, (i - 1) * 0.08))
|
||||
_box(st, Vector3(0, 0.17, 0.0), Vector3(0.32, 0.05, 0.08), P._mul(FUR, 1.1))
|
||||
_box(st, Vector3(0.1, 0.2, 0.05), Vector3(0.05, 0.03, 0.03), BONE)
|
||||
return P._commit(st)
|
||||
|
||||
Reference in New Issue
Block a user