Implement Phase 17a Prop Roles UI/UX Specification and associated functionality

- Added UI/UX specification for prop roles and set down mechanics in phase 17a.
- Created `PropStageRoles` script to manage normalized behavior for props, including depth, motion, and collision settings.
- Introduced `StagePhysicsPolicy` for shared physics configurations related to props and actors.
- Developed comprehensive tests for prop roles, including default settings, legacy migration, serialization, and runtime behavior.
- Ensured proper handling of set down actions, including clearance and orientation preservation.
This commit is contained in:
2026-10-09 23:11:34 -04:00
parent 3f66cc3195
commit 1d4a71525a
52 changed files with 20051 additions and 109 deletions
+501
View File
@@ -0,0 +1,501 @@
{
"version": "1.2",
"scene_name": "Untitled",
"camera": {
"position": {
"x": -5.46832084655762,
"y": -891.389526367188
},
"zoom": 0.500000059604645
},
"objects": [
{
"file_id": "terrain_1",
"type": "terrain",
"position": {
"x": -1536.0,
"y": -192.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_2",
"type": "terrain",
"position": {
"x": -1344.0,
"y": -192.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_3",
"type": "terrain",
"position": {
"x": -1152.0,
"y": -192.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_4",
"type": "terrain",
"position": {
"x": -960.0,
"y": -192.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_5",
"type": "terrain",
"position": {
"x": -768.0,
"y": -192.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_6",
"type": "terrain",
"position": {
"x": -576.0,
"y": -192.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_7",
"type": "terrain",
"position": {
"x": -384.0,
"y": -192.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_8",
"type": "terrain",
"position": {
"x": -192.0,
"y": -192.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_9",
"type": "terrain",
"position": {
"x": 0.0,
"y": -224.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_10",
"type": "terrain",
"position": {
"x": 192.0,
"y": -224.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_11",
"type": "terrain",
"position": {
"x": 384.0,
"y": -224.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_12",
"type": "terrain",
"position": {
"x": 576.0,
"y": -224.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_13",
"type": "terrain",
"position": {
"x": 768.0,
"y": -224.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_14",
"type": "terrain",
"position": {
"x": 960.0,
"y": -224.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_15",
"type": "terrain",
"position": {
"x": 1152.0,
"y": -224.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_16",
"type": "terrain",
"position": {
"x": 1344.0,
"y": -224.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "stickman_1",
"type": "stickman",
"position": {
"x": -1152.0,
"y": -600.0
},
"rotation": 0.0,
"stk_path": "res://content/stickmen/break.stk",
"facing_profile": "FORWARD",
"action_queue": [
{
"type": "pick_up_prop",
"target_prop_id": "prop_38150657_356201114_1",
"hand": "auto"
},
{
"type": "move_to",
"target": {
"x": -1352.0,
"y": -246.0
},
"style": "run"
},
{
"type": "set_down_prop",
"target_position": {
"x": 324.0,
"y": -552.0
}
},
{
"type": "move_to",
"target": {
"x": -1452.0,
"y": -276.0
},
"style": "run"
},
{
"type": "speak",
"text": "I Don't feel good",
"duration": 1.8,
"stop_current": false,
"keep_acting": false,
"arrangement": "together",
"bubble_layout": "stack",
"connect_bubbles": false,
"reveal": "instant",
"pop_in": false,
"duration_mode": "just_enough",
"bubbles": [
{
"text": "I Don't feel good",
"visual": {
"bubble_style": "talk",
"font_preset": "comic",
"size_preset": "medium",
"color": "#202020",
"effect": "none",
"reveal": "instant",
"pop_in": false,
"word_styles": [
{
"start": 8,
"end": 12,
"effect": "wave",
"color": "#e53935"
}
]
},
"placement": {
"mode": "manual",
"center": {
"x": -19.8551330566406,
"y": -681.649047851563
}
}
}
]
},
{
"type": "ragdoll"
}
]
},
{
"file_id": "prop_1",
"type": "prop",
"position": {
"x": 324.0,
"y": -684.0
},
"rotation": 0.0,
"asset_id": "res://content/props/championship_belt.prop",
"stage_object_id": "prop_38150657_356201114_1",
"roles": {
"depth": "behind",
"start_motion": "physics",
"holds_other_props": false,
"blocks_stickmen": false,
"can_pick_up": true,
"released_blocks_stickmen": false,
"released_bumps_other_props": true,
"legacy_draw_order": false
},
"scale": {
"x": 1.0,
"y": 1.0
},
"material_preset": 4
},
{
"file_id": "prop_2",
"type": "prop",
"position": {
"x": 288.0,
"y": -408.0
},
"rotation": 0.0,
"asset_id": "res://content/props/end_table.prop",
"stage_object_id": "prop_43861651_287430243_2",
"roles": {
"depth": "behind",
"start_motion": "physics",
"holds_other_props": true,
"blocks_stickmen": false,
"can_pick_up": false,
"released_blocks_stickmen": true,
"released_bumps_other_props": true,
"legacy_draw_order": false
},
"scale": {
"x": 1.0,
"y": 1.0
},
"material_preset": 1
},
{
"file_id": "prop_3",
"type": "prop",
"position": {
"x": 288.0,
"y": -1236.0
},
"rotation": 0.0,
"asset_id": "res://content/props/flower_pot.prop",
"stage_object_id": "prop_250061258_3458839433_3",
"roles": {
"depth": "behind",
"start_motion": "physics",
"holds_other_props": false,
"blocks_stickmen": false,
"can_pick_up": true,
"released_blocks_stickmen": true,
"released_bumps_other_props": true,
"legacy_draw_order": false
},
"scale": {
"x": 1.0,
"y": 1.0
},
"material_preset": 1
},
{
"file_id": "stickman_2",
"type": "stickman",
"position": {
"x": 888.0,
"y": -636.0
},
"rotation": 0.0,
"stk_path": "res://content/stickmen/test.stk",
"facing_profile": "FORWARD",
"action_queue": []
}
],
"event_rules": [
{
"id": 1,
"trigger": {
"type": "prop_picked_up",
"source_id": "stickman_1",
"target_id": "prop_1",
"params": {}
},
"actions": [
{
"type": "speak",
"target_id": "stickman_2",
"params": {
"text": "It's JOHN CENA",
"duration": 1.6,
"stop_current": false,
"keep_acting": true,
"arrangement": "together",
"bubble_layout": "stack",
"connect_bubbles": true,
"reveal": "instant",
"pop_in": false,
"duration_mode": "just_enough",
"bubbles": [
{
"text": "It's JOHN CENA",
"visual": {
"bubble_style": "talk",
"font_preset": "scary",
"size_preset": "huge",
"color": "#202020",
"effect": "shake",
"reveal": "instant",
"pop_in": false,
"word_styles": []
},
"placement": {
"mode": "manual",
"center": {
"x": -17.8550415039063,
"y": -674.849975585938
}
}
},
{
"text": "I feel sick",
"visual": {
"bubble_style": "talk",
"font_preset": "scary",
"size_preset": "huge",
"color": "#202020",
"effect": "shake",
"reveal": "instant",
"pop_in": false,
"word_styles": [
{
"start": 7,
"end": 11,
"effect": "wave"
}
]
},
"placement": {
"mode": "manual",
"center": {
"x": 7.14495849609375,
"y": -841.75
}
}
}
]
}
},
{
"type": "ragdoll",
"target_id": "stickman_2",
"params": {}
}
]
}
],
"metadata": {
"created_unix": 1791598662.56,
"modified_unix": 1791598662.56,
"autosave": false,
"source_path": ""
}
}
+311
View File
@@ -0,0 +1,311 @@
{
"version": "1.2",
"scene_name": "Untitled",
"camera": {
"position": {
"x": -795.213195800781,
"y": -804.61474609375
},
"zoom": 0.550000071525574
},
"objects": [
{
"file_id": "terrain_1",
"type": "terrain",
"position": {
"x": -1344.0,
"y": -160.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_2",
"type": "terrain",
"position": {
"x": -1152.0,
"y": -160.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_3",
"type": "terrain",
"position": {
"x": -960.0,
"y": -160.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_4",
"type": "terrain",
"position": {
"x": -768.0,
"y": -160.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_5",
"type": "terrain",
"position": {
"x": -576.0,
"y": -160.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_6",
"type": "terrain",
"position": {
"x": -384.0,
"y": -160.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_7",
"type": "terrain",
"position": {
"x": -192.0,
"y": -160.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_8",
"type": "terrain",
"position": {
"x": 0.0,
"y": -160.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_9",
"type": "terrain",
"position": {
"x": 192.0,
"y": -160.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_10",
"type": "terrain",
"position": {
"x": 384.0,
"y": -160.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_11",
"type": "terrain",
"position": {
"x": 576.0,
"y": -160.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_12",
"type": "terrain",
"position": {
"x": 768.0,
"y": -160.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "terrain_13",
"type": "terrain",
"position": {
"x": 960.0,
"y": -160.0
},
"rotation": 0.0,
"asset_id": "ground",
"scale": {
"x": 1.0,
"y": 1.0
}
},
{
"file_id": "stickman_1",
"type": "stickman",
"position": {
"x": -1140.0,
"y": -564.0
},
"rotation": 0.0,
"stk_path": "res://content/stickmen/break.stk",
"facing_profile": "FORWARD",
"action_queue": [
{
"type": "move_to",
"target": {
"x": -491.576904296875,
"y": -206.43310546875
},
"style": "run"
},
{
"type": "pick_up_prop",
"target_prop_id": "prop_87555809_220550165_4",
"hand": "auto"
},
{
"type": "move_to",
"target": {
"x": -878.849609375,
"y": -197.342041015625
},
"style": "run"
},
{
"type": "set_down_prop",
"target_position": {
"x": -156.0,
"y": -516.0
}
},
{
"type": "move_to",
"target": {
"x": -1157.03149414063,
"y": -200.978515625
},
"style": "run"
},
{
"type": "move_to",
"target": {
"x": 735.69580078125,
"y": -200.978515625
},
"style": "run"
}
]
},
{
"file_id": "prop_1",
"type": "prop",
"position": {
"x": -156.0,
"y": -1512.0
},
"rotation": 0.0,
"asset_id": "res://content/props/briefcase.prop",
"stage_object_id": "prop_87555809_220550165_4",
"roles": {
"depth": "front",
"start_motion": "physics",
"holds_other_props": false,
"blocks_stickmen": false,
"can_pick_up": true,
"released_blocks_stickmen": false,
"released_bumps_other_props": true,
"legacy_draw_order": false
},
"scale": {
"x": 1.0,
"y": 1.0
},
"material_preset": 1
},
{
"file_id": "prop_2",
"type": "prop",
"position": {
"x": -168.0,
"y": -324.0
},
"rotation": 0.0,
"asset_id": "crate",
"stage_object_id": "prop_1055778436_3931179398_5",
"roles": {
"depth": "front",
"start_motion": "still",
"holds_other_props": true,
"blocks_stickmen": false,
"can_pick_up": false,
"released_blocks_stickmen": true,
"released_bumps_other_props": true,
"legacy_draw_order": false
},
"scale": {
"x": 4.12768173217773,
"y": 4.12768173217773
},
"material_preset": 1
}
],
"event_rules": [],
"metadata": {
"created_unix": 1791342771,
"modified_unix": 1791471934.192,
"autosave": false,
"source_path": ""
}
}