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
@@ -43,11 +43,45 @@ func test_settings_round_trip() -> bool:
|
||||
save.free()
|
||||
return a and b and c
|
||||
|
||||
func test_camera_settings_round_trip() -> bool:
|
||||
var save := _save_instance()
|
||||
var err: int = save.save_settings({
|
||||
"look_sensitivity": 0.0028, "hud_font_scale": 1.0,
|
||||
"invert_y": true, "head_bob": false,
|
||||
})
|
||||
var a := TestUtils.check_eq(err, OK, "camera settings save")
|
||||
var loaded: Dictionary = save.load_settings()
|
||||
var b := TestUtils.check_eq(bool(loaded.get("invert_y", false)), true,
|
||||
"invert_y survives the round trip")
|
||||
var c := TestUtils.check_eq(bool(loaded.get("head_bob", true)), false,
|
||||
"head_bob survives the round trip")
|
||||
save.save_settings(save.DEFAULT_SETTINGS)
|
||||
save.free()
|
||||
return a and b and c
|
||||
|
||||
func test_input_bindings_round_trip() -> bool:
|
||||
var save := _save_instance()
|
||||
var bindings := {"inspect": {"type": "key", "code": int(KEY_Z)}}
|
||||
var err: int = save.save_settings({"input_bindings": bindings})
|
||||
var a := TestUtils.check_eq(err, OK, "bindings save")
|
||||
var loaded: Dictionary = save.load_settings()
|
||||
var stored: Dictionary = loaded.get("input_bindings", {})
|
||||
var inspect: Dictionary = stored.get("inspect", {})
|
||||
var b := TestUtils.check_eq(int(inspect.get("code", 0)), int(KEY_Z),
|
||||
"bindings survive the settings round trip")
|
||||
var c := TestUtils.check_eq(str(inspect.get("type", "")), "key",
|
||||
"binding type survives the settings round trip")
|
||||
save.save_settings(save.DEFAULT_SETTINGS)
|
||||
save.free()
|
||||
return a and b and c
|
||||
|
||||
func test_settings_defaults_present() -> bool:
|
||||
var save := _save_instance()
|
||||
var defaults: Dictionary = save.load_settings()
|
||||
var ok := TestUtils.check(
|
||||
defaults.has("look_sensitivity") and defaults.has("hud_font_scale"),
|
||||
defaults.has("look_sensitivity") and defaults.has("hud_font_scale")
|
||||
and defaults.has("invert_y") and defaults.has("head_bob")
|
||||
and defaults.has("input_bindings"),
|
||||
"settings have documented defaults")
|
||||
save.free()
|
||||
return ok
|
||||
Reference in new issue
Block a user