P5 the Old Stag: standing stones and altar, three-phase boss with charges, stun window, spirit wolves and stomps; antler pickaxe and trophy; group scaling and credit for every fighter; online 3-player test (protocol 12)
This commit is contained in:
@@ -119,6 +119,9 @@ static func build(key: String) -> ArrayMesh:
|
||||
"rotten_food": m = _pebble(321, Color(0.33, 0.3, 0.16), Vector3(0.11, 0.06, 0.1), 0.45)
|
||||
"salt": m = _salt()
|
||||
"smoking_rack": m = _smoking_rack()
|
||||
"stag_antler": m = _antler()
|
||||
"stag_trophy": m = _stag_trophy()
|
||||
"antler_pickaxe": m = _antler_pickaxe()
|
||||
"smoked_meat": m = _meat(Color(0.36, 0.17, 0.1))
|
||||
"salted_meat": m = _meat(Color(0.68, 0.42, 0.38))
|
||||
"smoked_fish": m = _fish(Color(0.72, 0.5, 0.22), 0.2, true)
|
||||
@@ -1062,3 +1065,48 @@ static func _smoking_rack() -> ArrayMesh:
|
||||
var d := Vector3(cos(a), 0, sin(a)) * 0.18
|
||||
P._cylinder(st, Vector3(0, 0.06, 0) - d, Vector3(0, 0.06, 0) + d, 0.035, 0.035, 5, P.BARK, r, -1.0, CHARCOAL)
|
||||
return P._commit(st)
|
||||
|
||||
# --- P5 the Old Stag ---------------------------------------------------------------------
|
||||
|
||||
const ANTLER := Color(0.9, 0.87, 0.76)
|
||||
|
||||
## One branching antler lying on its side.
|
||||
static func _antler_into(st: SurfaceTool, r: RandomNumberGenerator, o: Vector3, k: float, up: Vector3 = Vector3.UP) -> void:
|
||||
var side := up.cross(Vector3.FORWARD).normalized() if absf(up.dot(Vector3.FORWARD)) < 0.9 else Vector3.RIGHT
|
||||
var a := o
|
||||
var b := o + up * 0.35 * k + side * 0.12 * k
|
||||
var c := b + up * 0.3 * k + side * 0.18 * k
|
||||
P._cylinder(st, a, b, 0.035 * k, 0.028 * k, 5, ANTLER, r)
|
||||
P._cylinder(st, b, c, 0.028 * k, 0.01 * k, 5, ANTLER, r)
|
||||
for t in [[a.lerp(b, 0.4), Vector3(0, 0.15, -0.12)], [b, Vector3(0, 0.2, -0.15)], [b.lerp(c, 0.6), Vector3(0, 0.12, 0.14)]]:
|
||||
P._cylinder(st, t[0], (t[0] as Vector3) + (up * (t[1] as Vector3).y + Vector3(0, 0, (t[1] as Vector3).z)) * k * 1.4, 0.018 * k, 0.005 * k, 4, ANTLER, r)
|
||||
|
||||
static func _antler() -> ArrayMesh:
|
||||
var st := P._begin()
|
||||
_antler_into(st, _rng(361), Vector3(-0.25, 0.04, 0), 1.0, Vector3(1, 0.12, 0).normalized())
|
||||
return P._commit(st)
|
||||
|
||||
## The skull and antlers on a wooden stand.
|
||||
static func _stag_trophy() -> ArrayMesh:
|
||||
var st := P._begin()
|
||||
var r := _rng(363)
|
||||
var n := FastNoiseLite.new()
|
||||
n.seed = 363
|
||||
_box(st, Vector3(0, 0.08, 0), Vector3(1.2, 0.16, 0.7), P._mul(BEAM, 0.9))
|
||||
_box(st, Vector3(0, 0.6, -0.15), Vector3(0.16, 0.9, 0.16), BEAM)
|
||||
P._blob(st, Vector3(0, 1.12, -0.1), Vector3(0.16, 0.16, 0.26), n, 0.1, Color(0.88, 0.85, 0.75), r, 1)
|
||||
P._blob(st, Vector3(0, 1.08, 0.12), Vector3(0.07, 0.06, 0.08), n, 0.0, Color(0.2, 0.2, 0.2), r, 0)
|
||||
for s in [-1.0, 1.0]:
|
||||
_antler_into(st, r, Vector3(s * 0.08, 1.25, -0.12), 1.6, Vector3(s * 0.7, 1.0, 0).normalized())
|
||||
P._blob(st, Vector3(s * 0.07, 1.16, 0.08), Vector3.ONE * 0.025, n, 0.0, Color(0.55, 0.9, 1.0), r, 0)
|
||||
return P._commit(st)
|
||||
|
||||
static func _antler_pickaxe() -> ArrayMesh:
|
||||
var st := P._begin()
|
||||
var r := _rng(365)
|
||||
_handle(st, 0.62, r)
|
||||
_box(st, Vector3(0, 0.57, 0), Vector3(0.06, 0.08, 0.06), IRON)
|
||||
P._cylinder(st, Vector3(-0.02, 0.58, 0), Vector3(0.27, 0.5, 0), 0.032, 0.004, 5, ANTLER, r, -1.0, ANTLER)
|
||||
P._cylinder(st, Vector3(0.02, 0.58, 0), Vector3(-0.24, 0.53, 0), 0.032, 0.004, 5, ANTLER, r, -1.0, ANTLER)
|
||||
P._cylinder(st, Vector3(0.1, 0.56, 0), Vector3(0.14, 0.66, 0), 0.012, 0.003, 4, ANTLER, r)
|
||||
return P._commit(st)
|
||||
|
||||
Reference in New Issue
Block a user