Character and movement pass
NPC characters - Articulated rig (hips/knees, shoulders/elbows/hands) replaces rigid capsules; the walk cycle bends knees and elbows and flees with a longer stride. - Layered outfits (jacket/vest/coat/dress), extended accessories and hand items (bag, umbrella, phone, camera, clipboard, cup), face details and five hair silhouettes, all deterministic per profile seed. - Idle behaviour layers (phone, clipboard, crossed arms, look-around), breathing and weight shift; escalation raises hands or points, and noticed NPCs turn toward the guard. - Reaction symbols above the head (!!, ?!, !, ?), door-queue offsets assigned by GameManager, three LOD tiers with hysteresis and a billboard impostor. - smoke_npc_budget.gd: 16 avatars = 534 meshes, ~6.9 ms average (50 ms budget). Player movement - Separate accel/decel, step-up assist for kerbs and the entrance steps, and a forward-axis fix: W was inverted (get_axis(forward, back) is negative). - Head bob, landing dip and precision-walk FOV, gated by persisted head-bob and invert-Y settings; precision chip and tick; surface-aware footsteps and a landing cue forwarded to AudioFeedback. - Gamepad support (sticks, deadzone, face buttons, bumpers), a control legend that follows the active device, and named actions for the remaining keys. - Key/button remapping in Settings, persisted as input_bindings and applied by InputBindings (mouse and gamepad axes are never removed). - smoke_movement.gd (windowed): climbs the steps, checks precision speed, chip, footsteps and landing; new 11-precision-walk capture and catalogue entry. Verification: headless 208/208, Python tooling 56/56, all 11 smokes pass, compare 11 good / 0 bad, movement judge match. Version 0.5.0. Only optional Future ideas remain in TODO.
This commit is contained in:
1 parent
2a4e0d1998
commit
a27e8cb74c
35 files changed
+1608
-185
No files matched your search
@@ -13,6 +13,9 @@ var _bed_player: AudioStreamPlayer = null
|
||||
var crowd_level: float = 0.0
|
||||
var bed_playing := false
|
||||
var radio_crackles := 0
|
||||
var footsteps := 0
|
||||
var landings := 0
|
||||
var precision_ticks := 0
|
||||
|
||||
func _ready() -> void:
|
||||
# Pre-create a few players so overlapping cues don't cut each other off.
|
||||
@@ -72,6 +75,30 @@ func play_radio_close() -> void:
|
||||
radio_crackles += 1
|
||||
_play_noise(0.06, 0.25, 1400.0)
|
||||
|
||||
## Surface-aware footstep: a short filtered burst, lower on asphalt, brighter on
|
||||
## the stone entrance steps.
|
||||
func play_footstep(surface: String) -> void:
|
||||
footsteps += 1
|
||||
var cutoff := 2600.0
|
||||
match surface:
|
||||
"asphalt":
|
||||
cutoff = 1500.0
|
||||
"stone":
|
||||
cutoff = 3400.0
|
||||
_:
|
||||
cutoff = 2400.0
|
||||
_play_noise(0.045, 0.22, cutoff)
|
||||
|
||||
## Landing thump after a step or drop.
|
||||
func play_land() -> void:
|
||||
landings += 1
|
||||
_play_tone(92.0, 0.09, 0.4)
|
||||
|
||||
## Quiet tick when the precision-walk modifier engages.
|
||||
func play_precision_tick() -> void:
|
||||
precision_ticks += 1
|
||||
_play_tone(1180.0, 0.035, 0.22)
|
||||
|
||||
## Play a denial/error cue (low buzz).
|
||||
func play_deny() -> void:
|
||||
_play_tone(220.0, 0.20, 0.5)
|
||||
|
||||
Reference in new issue
Block a user