gmp(M02): add 3.3.5 input profile
Work-Package: M02-GMP-INPUT-PROFILE-335-001 Agent: sindo-main-codex Tests: player input/movement/capability/terrain/camera/presentation, coordinate/streaming, docs/coordination and renderer dry-run passed Fidelity: build-12340 binding hashes and selected defaults pinned; TrinityCore turn rate and WoWee mouse routing are compatibility references with explicit limits
This commit is contained in:
@@ -6,6 +6,7 @@ const MOVE_INTENT_PATH := "res://src/domain/input/move_intent.gd"
|
||||
const PLAYER_INPUT_SOURCE_PATH := "res://src/gameplay/input/player_input_source.gd"
|
||||
const PLAYER_CONTROLLER_PATH := "res://src/scenes/player/third_person_wow_controller.gd"
|
||||
const REGRESSION_SCENE_PATH := "res://src/tests/scenes/player_input_regression.tscn"
|
||||
const PROFILE_FIXTURE_PATH := "res://src/tests/fixtures/player_input_profile_335.json"
|
||||
|
||||
|
||||
func _initialize() -> void:
|
||||
@@ -15,6 +16,7 @@ func _initialize() -> void:
|
||||
func _run_verification() -> void:
|
||||
var failures: Array[String] = []
|
||||
_verify_default_input_actions(failures)
|
||||
_verify_profile_fixture(failures)
|
||||
_verify_move_intent_composition(failures)
|
||||
_verify_controller_boundary(failures)
|
||||
_verify_regression_scene(failures)
|
||||
@@ -25,7 +27,7 @@ func _run_verification() -> void:
|
||||
quit(1)
|
||||
return
|
||||
|
||||
print("PLAYER_INPUT PASS actions=%d intent_cases=6 controller=1 regression_scene=1" % PlayerInputActions.REQUIRED_ACTIONS.size())
|
||||
print("PLAYER_INPUT PASS actions=%d intent_cases=9 profiles=3 fixture=1 controller=1 regression_scene=3" % PlayerInputActions.REQUIRED_ACTIONS.size())
|
||||
quit(0)
|
||||
|
||||
|
||||
@@ -34,9 +36,17 @@ func _verify_default_input_actions(failures: Array[String]) -> void:
|
||||
_expect_true(InputMap.has_action(action_name), "Input Map contains %s" % action_name, failures)
|
||||
|
||||
_expect_key_binding(PlayerInputActions.MOVE_FORWARD, KEY_W, true, failures)
|
||||
_expect_key_binding(PlayerInputActions.MOVE_FORWARD, KEY_UP, false, failures)
|
||||
_expect_key_binding(PlayerInputActions.MOVE_BACKWARD, KEY_S, true, failures)
|
||||
_expect_key_binding(PlayerInputActions.MOVE_BACKWARD, KEY_DOWN, false, failures)
|
||||
_expect_key_binding(PlayerInputActions.STRAFE_LEFT, KEY_A, true, failures)
|
||||
_expect_key_binding(PlayerInputActions.STRAFE_RIGHT, KEY_D, true, failures)
|
||||
_expect_key_binding(PlayerInputActions.BLIZZLIKE_STRAFE_LEFT, KEY_Q, true, failures)
|
||||
_expect_key_binding(PlayerInputActions.BLIZZLIKE_STRAFE_RIGHT, KEY_E, true, failures)
|
||||
_expect_key_binding(PlayerInputActions.TURN_LEFT, KEY_A, true, failures)
|
||||
_expect_key_binding(PlayerInputActions.TURN_LEFT, KEY_LEFT, false, failures)
|
||||
_expect_key_binding(PlayerInputActions.TURN_RIGHT, KEY_D, true, failures)
|
||||
_expect_key_binding(PlayerInputActions.TURN_RIGHT, KEY_RIGHT, false, failures)
|
||||
_expect_key_binding(PlayerInputActions.DEBUG_FLY_UP, KEY_E, true, failures)
|
||||
_expect_key_binding(PlayerInputActions.DEBUG_FLY_DOWN, KEY_Q, true, failures)
|
||||
_expect_key_binding(PlayerInputActions.DEBUG_SPRINT, KEY_SHIFT, false, failures)
|
||||
@@ -47,6 +57,40 @@ func _verify_default_input_actions(failures: Array[String]) -> void:
|
||||
_expect_mouse_binding(PlayerInputActions.CAMERA_ZOOM_OUT, MOUSE_BUTTON_WHEEL_DOWN, failures)
|
||||
|
||||
|
||||
func _verify_profile_fixture(failures: Array[String]) -> void:
|
||||
var fixture_text := _read_text(PROFILE_FIXTURE_PATH, failures)
|
||||
var parsed_fixture: Variant = JSON.parse_string(fixture_text)
|
||||
_expect_true(parsed_fixture is Dictionary, "profile fixture parses", failures)
|
||||
if not parsed_fixture is Dictionary:
|
||||
return
|
||||
var fixture := parsed_fixture as Dictionary
|
||||
_expect_true(fixture.get("schema_version") == 1, "profile fixture schema", failures)
|
||||
_expect_true(fixture.get("profile_id") == "Blizzlike335", "profile fixture identity", failures)
|
||||
var sources := fixture.get("sources", {}) as Dictionary
|
||||
var bindings_source := sources.get("original_client_default_bindings", {}) as Dictionary
|
||||
_expect_true(bindings_source.get("build") == 12340, "fixture client build", failures)
|
||||
_expect_true(
|
||||
bindings_source.get("sha256") == "35FFA0E4E2356A13A0633A848F9E57ABE7DF9D8A16C2245E15D33013AD2F56A5",
|
||||
"fixture binding source hash",
|
||||
failures
|
||||
)
|
||||
var commands_source := sources.get("original_client_binding_commands", {}) as Dictionary
|
||||
_expect_true(
|
||||
commands_source.get("sha256") == "2E01276AFB7462F1417710F13B4BF1A456341F7F28CC8AE0D6D9C7442D7F6793",
|
||||
"fixture command source hash",
|
||||
failures
|
||||
)
|
||||
var turn_source := sources.get("trinitycore_player_turn_rate", {}) as Dictionary
|
||||
_expect_near(float(turn_source.get("radians_per_second", 0.0)), 3.141594, "fixture turn rate", failures)
|
||||
var mouse_strafe_source := sources.get("wowee_mouse_strafe_reference", {}) as Dictionary
|
||||
_expect_true(
|
||||
mouse_strafe_source.get("revision") == "626243e937fb93965fa583a6507ed5a1aa7dda4b",
|
||||
"fixture mouse-strafe reference revision",
|
||||
failures
|
||||
)
|
||||
_expect_true((fixture.get("selected_default_bindings", []) as Array).size() == 12, "fixture selected binding count", failures)
|
||||
|
||||
|
||||
func _verify_move_intent_composition(failures: Array[String]) -> void:
|
||||
var neutral := PlayerInputSource.compose_move_intent(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false)
|
||||
_expect_near(neutral.forward_axis, 0.0, "neutral forward", failures)
|
||||
@@ -67,6 +111,18 @@ func _verify_move_intent_composition(failures: Array[String]) -> void:
|
||||
var debug_requests := PlayerInputSource.compose_move_intent(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, true)
|
||||
_expect_true(debug_requests.is_sprint_requested, "sprint request retained", failures)
|
||||
|
||||
var blizzlike_strafe := PlayerInputSource.compose_blizzlike_335_move_intent(0.0, 0.0, 1.0, 0.0, 0.0, 0.0, false)
|
||||
_expect_near(blizzlike_strafe.strafe_axis, -1.0, "blizzlike Q strafe", failures)
|
||||
var blizzlike_turn := PlayerInputSource.compose_blizzlike_335_move_intent(0.0, 0.0, 0.0, 0.0, 0.0, 1.0, false)
|
||||
_expect_near(blizzlike_turn.turn_axis, 1.0, "blizzlike D turn", failures)
|
||||
var mouse_strafe := PlayerInputSource.compose_blizzlike_335_move_intent(0.0, 0.0, 0.0, 0.0, 0.0, 1.0, true)
|
||||
_expect_near(mouse_strafe.strafe_axis, 1.0, "camera-held D strafe", failures)
|
||||
_expect_near(mouse_strafe.turn_axis, 0.0, "camera-held D suppresses turn", failures)
|
||||
|
||||
_expect_true(PlayerInputSource.new(&"RenderSandbox").input_profile_id == &"RenderSandbox", "sandbox profile selected", failures)
|
||||
_expect_true(PlayerInputSource.new(&"Blizzlike335").input_profile_id == &"Blizzlike335", "blizzlike profile selected", failures)
|
||||
_expect_true(PlayerInputSource.new(&"Unknown").input_profile_id == &"Blizzlike335", "unknown profile fails closed", failures)
|
||||
|
||||
|
||||
func _verify_controller_boundary(failures: Array[String]) -> void:
|
||||
var controller_source := _read_text(PLAYER_CONTROLLER_PATH, failures)
|
||||
@@ -118,6 +174,31 @@ func _verify_regression_scene(failures: Array[String]) -> void:
|
||||
_expect_true(movement_controller.is_flight_enabled, "flight action preserves immediate sandbox toggle", failures)
|
||||
player.free()
|
||||
|
||||
var blizzlike_player := packed_scene.instantiate() as CharacterBody3D
|
||||
blizzlike_player.set("movement_profile_id", "Blizzlike335")
|
||||
root.add_child(blizzlike_player)
|
||||
blizzlike_player.set_physics_process(false)
|
||||
Input.action_press(PlayerInputActions.TURN_RIGHT)
|
||||
blizzlike_player.call("_physics_process", 0.5)
|
||||
Input.action_release(PlayerInputActions.TURN_RIGHT)
|
||||
_expect_near(blizzlike_player.rotation.y, -3.141594 * 0.5, "blizzlike D turns right", failures)
|
||||
var blizzlike_camera := blizzlike_player.get_node("CameraPivot") as ThirdPersonCameraRig
|
||||
_expect_near(blizzlike_camera.yaw_radians, blizzlike_player.rotation.y, "keyboard turn synchronizes camera yaw", failures)
|
||||
blizzlike_player.free()
|
||||
|
||||
var mouse_strafe_player := packed_scene.instantiate() as CharacterBody3D
|
||||
mouse_strafe_player.set("movement_profile_id", "Blizzlike335")
|
||||
root.add_child(mouse_strafe_player)
|
||||
mouse_strafe_player.set_physics_process(false)
|
||||
Input.action_press(PlayerInputActions.CAMERA_ROTATE)
|
||||
Input.action_press(PlayerInputActions.TURN_RIGHT)
|
||||
mouse_strafe_player.call("_physics_process", 0.5)
|
||||
Input.action_release(PlayerInputActions.TURN_RIGHT)
|
||||
Input.action_release(PlayerInputActions.CAMERA_ROTATE)
|
||||
_expect_near(mouse_strafe_player.rotation.y, 0.0, "camera-held D does not turn", failures)
|
||||
_expect_near(mouse_strafe_player.position.x, 2.25, "camera-held D strafes right", failures)
|
||||
mouse_strafe_player.free()
|
||||
|
||||
|
||||
func _expect_key_binding(
|
||||
action_name: StringName,
|
||||
|
||||
Reference in New Issue
Block a user