From 0326667bc0ea146f0d0d19d7798cb54d6ce04f49 Mon Sep 17 00:00:00 2001 From: Rob Kelly Date: Fri, 21 Mar 2025 12:07:05 -0600 Subject: [PATCH] Added items --- levels/ghost_ship/ghost_ship_level.tscn | 86 ++++++++++++++++++- levels/ghost_ship/item_data/eyeballs.tres | 9 ++ levels/mechanic_test/item_test.gd | 5 ++ levels/mechanic_test/item_test.gd.uid | 1 + levels/mechanic_test/item_test.tscn | 58 +++++++++++++ levels/mechanic_test/mechanic_test.gd | 3 + levels/mechanic_test/mechanic_test.tscn | 9 +- project.godot | 1 + src/game/game_manager.gd | 3 + src/items/item.gd | 10 +++ src/items/item.gd.uid | 1 + src/items/item_catalog.gd | 4 + src/items/item_catalog.gd.uid | 1 + src/items/item_catalog.tscn | 8 ++ src/player/player.gd | 18 ++++ src/props/interactive.gd | 17 ++++ src/props/retinal_scanner/retinal_scanner.gd | 42 +++++++++ .../retinal_scanner/retinal_scanner.gd.uid | 1 + .../retinal_scanner/retinal_scanner.tscn | 37 ++++++++ src/world/world_item/world_item.gd | 34 ++++++++ src/world/world_item/world_item.gd.uid | 1 + src/world/world_item/world_item.tscn | 25 ++++++ vault/TODO.md | 9 +- 23 files changed, 376 insertions(+), 7 deletions(-) create mode 100644 levels/ghost_ship/item_data/eyeballs.tres create mode 100644 levels/mechanic_test/item_test.gd create mode 100644 levels/mechanic_test/item_test.gd.uid create mode 100644 levels/mechanic_test/item_test.tscn create mode 100644 src/items/item.gd create mode 100644 src/items/item.gd.uid create mode 100644 src/items/item_catalog.gd create mode 100644 src/items/item_catalog.gd.uid create mode 100644 src/items/item_catalog.tscn create mode 100644 src/props/retinal_scanner/retinal_scanner.gd create mode 100644 src/props/retinal_scanner/retinal_scanner.gd.uid create mode 100644 src/props/retinal_scanner/retinal_scanner.tscn create mode 100644 src/world/world_item/world_item.gd create mode 100644 src/world/world_item/world_item.gd.uid create mode 100644 src/world/world_item/world_item.tscn diff --git a/levels/ghost_ship/ghost_ship_level.tscn b/levels/ghost_ship/ghost_ship_level.tscn index 09c399b..4fb54fe 100644 --- a/levels/ghost_ship/ghost_ship_level.tscn +++ b/levels/ghost_ship/ghost_ship_level.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=297 format=4 uid="uid://crydi5cjgfwe5"] +[gd_scene load_steps=303 format=4 uid="uid://crydi5cjgfwe5"] [ext_resource type="PackedScene" uid="uid://oowut88kr2ox" path="res://levels/ghost_ship/player_ship/player_ship.tscn" id="1_2pyr1"] [ext_resource type="PackedScene" uid="uid://c2omlx4ptrc01" path="res://src/world/gunk_body/gunk_body.tscn" id="2_2egij"] @@ -42,6 +42,9 @@ [ext_resource type="Texture2D" uid="uid://bmwmajwul60ti" path="res://assets/level/ceiling/ceiling_1_N.png" id="38_f0xh4"] [ext_resource type="PackedScene" uid="uid://d2feet02a603e" path="res://src/props/overhead_light/overhead_light.tscn" id="39_kp5n7"] [ext_resource type="Texture2D" uid="uid://8hav47a84uk" path="res://assets/level/ceiling/ceiling_1_R.png" id="39_nmnkj"] +[ext_resource type="PackedScene" uid="uid://ctr56p23cvupu" path="res://src/props/retinal_scanner/retinal_scanner.tscn" id="41_u2hqf"] +[ext_resource type="PackedScene" uid="uid://bn8fdu4houoo2" path="res://src/world/world_item/world_item.tscn" id="43_f0xh4"] +[ext_resource type="Resource" uid="uid://c6ynovu3h6twl" path="res://levels/ghost_ship/item_data/eyeballs.tres" id="44_nmnkj"] [sub_resource type="CompressedTexture2D" id="CompressedTexture2D_rp2qp"] load_path = "res://.godot/imported/debug_mask.png-fd2bc783338ed9439fe81a4eef9d86da.s3tc.ctex" @@ -3868,6 +3871,63 @@ _surfaces = [{ blend_shape_mode = 0 shadow_mesh = SubResource("ArrayMesh_u2hqf") +[sub_resource type="ArrayMesh" id="ArrayMesh_lfacn"] +resource_local_to_scene = true +_surfaces = [{ +"aabb": AABB(-0.375, -0.25, -0.75, 0.75, 0.5, 1.5), +"attribute_data": PackedByteArray("/7//P/9v/7//X/8//7//vwAA/78AAP8//6f/v/9H/7//p/+//7//v/+f//f/v////6cAAP/H/wf/n/83/7//P/+X/7//l/8//zf/P/8P/7//x//H/5//x/+/AAD/n/8H/6f/P//H/zf/X/+//0f/P/9v/z//p/8//6f////H//f/D/8//5f/v/+X/z//p/+//6f/P/83/7//R/+//0f/P/9v/z//b/+//1//P/9f/7//N/+//w//v/83/z//D/8/"), +"format": 34896613399, +"index_count": 84, +"index_data": PackedByteArray("FgANAAwADAANABcAFwANAA4ADgANABgAGAANAA8ADwANABkAGgAHAAIAAgAHABsAEAABABEAEQABABwAHQAAAAYABgAAAAMACQAUAAgACAAUABUAFQAUAAoACgAUAB4AHgAUAAsACwAUAB8AIAATAAUABQATAAQAIQAiACMAIwAiACQAJQASACYAJgASACcAKAApACoAKgApACsALAAtAC4ALgAtAC8A"), +"lods": [0.108952, PackedByteArray("DAANAA4ADgANAA8AEAABABEAEAARAAYAEQAAAAYABgAAAAMAEQABAAIAAgABAAcABwASAAIABwATABIAEgATAAUABQATAAQACQAUAAgACAAUABUAFQAUAAoACgAUAAsA"), 0.261829, PackedByteArray("AAABAAIAAQAAAAYABgAAAAMAAgABAAcABwAEAAIAAgAEAAUACAAJAAoACgAJAAsA"), 0.524037, PackedByteArray("AAABAAIAAQAAAAMAAgABAAQAAgAEAAUA")], +"material": SubResource("StandardMaterial3D_1h5r5"), +"name": "Cube", +"primitive": 3, +"uv_scale": Vector4(0, 0, 0, 0), +"vertex_count": 48, +"vertex_data": PackedByteArray("AAAyM///VNXc3f//AAD/////zMz//1TVAAAyMwAAVNUAADIzAAD8xQAAMjP///zFAADMzAAAVNX//zIzAABU1QAAzMwAAP//AAAyMwAA///c3f//AAD/////MjMAAP/////MzP///7/c3QAA///svyEi/////0TBAAAyM///Fr8hIv//AAD//yEi////////3N0AAP///MUhIgAAAAD8xSEiAAAAAP//ISL//wAA/////zIz////v9zd//////+/AADMzP//DMEhIgAA//+cvP//zMwAAFTV//8yM///VNXc3f///////wAAzMz//1TV///MzAAA///c3QAAAAD//yEiAAD///zFISL//wAAqukhIv////+q6QAAzMwAAKrpAADMzP//qunc3QAAAAD8xf//MjMAAPzF//8yM////MXc3f////+q6dzd//8AAKrp///MzP//qun//8zMAACq6dzdAAAAAP+/ISIAAAAA/7/c3QAA////vyEiAAD///+/VFWqqv9//7+qKqoqVFWqqv45/pz+Of6cVFWqqqoqqir/P/+//z//v/7A/0C2QLbA/3//f/9//3//f/9//3//f/9//7//f/+//xwBRv45/pwOQA3A/z//v/9//3//f/9//3//f/9//3+qKqoqqiqqKv9//79UVaqq0sDSQKlCqML+Of6cCWoEtQlqBLUJagS1CWoEtf8cAUb/HAFG/xwBRgQ19hUENfYVBDX2FQQ19hUAAP9/AAD/fwAA/38AAP9/") +}] +blend_shape_mode = 0 +shadow_mesh = SubResource("ArrayMesh_u2hqf") + +[sub_resource type="ArrayMesh" id="ArrayMesh_wvfch"] +resource_local_to_scene = true +_surfaces = [{ +"aabb": AABB(-0.375, -0.25, -0.75, 0.75, 0.5, 1.5), +"attribute_data": PackedByteArray("/7//P/9v/7//X/8//7//vwAA/78AAP8//6f/v/9H/7//p/+//7//v/+f//f/v////6cAAP/H/wf/n/83/7//P/+X/7//l/8//zf/P/8P/7//x//H/5//x/+/AAD/n/8H/6f/P//H/zf/X/+//0f/P/9v/z//p/8//6f////H//f/D/8//5f/v/+X/z//p/+//6f/P/83/7//R/+//0f/P/9v/z//b/+//1//P/9f/7//N/+//w//v/83/z//D/8/"), +"format": 34896613399, +"index_count": 84, +"index_data": PackedByteArray("FgANAAwADAANABcAFwANAA4ADgANABgAGAANAA8ADwANABkAGgAHAAIAAgAHABsAEAABABEAEQABABwAHQAAAAYABgAAAAMACQAUAAgACAAUABUAFQAUAAoACgAUAB4AHgAUAAsACwAUAB8AIAATAAUABQATAAQAIQAiACMAIwAiACQAJQASACYAJgASACcAKAApACoAKgApACsALAAtAC4ALgAtAC8A"), +"lods": [0.108952, PackedByteArray("DAANAA4ADgANAA8AEAABABEAEAARAAYAEQAAAAYABgAAAAMAEQABAAIAAgABAAcABwASAAIABwATABIAEgATAAUABQATAAQACQAUAAgACAAUABUAFQAUAAoACgAUAAsA"), 0.261829, PackedByteArray("AAABAAIAAQAAAAYABgAAAAMAAgABAAcABwAEAAIAAgAEAAUACAAJAAoACgAJAAsA"), 0.524037, PackedByteArray("AAABAAIAAQAAAAMAAgABAAQAAgAEAAUA")], +"material": SubResource("StandardMaterial3D_1h5r5"), +"name": "Cube", +"primitive": 3, +"uv_scale": Vector4(0, 0, 0, 0), +"vertex_count": 48, +"vertex_data": PackedByteArray("AAAyM///VNXc3f//AAD/////zMz//1TVAAAyMwAAVNUAADIzAAD8xQAAMjP///zFAADMzAAAVNX//zIzAABU1QAAzMwAAP//AAAyMwAA///c3f//AAD/////MjMAAP/////MzP///7/c3QAA///svyEi/////0TBAAAyM///Fr8hIv//AAD//yEi////////3N0AAP///MUhIgAAAAD8xSEiAAAAAP//ISL//wAA/////zIz////v9zd//////+/AADMzP//DMEhIgAA//+cvP//zMwAAFTV//8yM///VNXc3f///////wAAzMz//1TV///MzAAA///c3QAAAAD//yEiAAD///zFISL//wAAqukhIv////+q6QAAzMwAAKrpAADMzP//qunc3QAAAAD8xf//MjMAAPzF//8yM////MXc3f////+q6dzd//8AAKrp///MzP//qun//8zMAACq6dzdAAAAAP+/ISIAAAAA/7/c3QAA////vyEiAAD///+/VFWqqv9//7+qKqoqVFWqqv45/pz+Of6cVFWqqqoqqir/P/+//z//v/7A/0C2QLbA/3//f/9//3//f/9//3//f/9//7//f/+//xwBRv45/pwOQA3A/z//v/9//3//f/9//3//f/9//3+qKqoqqiqqKv9//79UVaqq0sDSQKlCqML+Of6cCWoEtQlqBLUJagS1CWoEtf8cAUb/HAFG/xwBRgQ19hUENfYVBDX2FQQ19hUAAP9/AAD/fwAA/38AAP9/") +}] +blend_shape_mode = 0 +shadow_mesh = SubResource("ArrayMesh_u2hqf") + +[sub_resource type="ArrayMesh" id="ArrayMesh_2agve"] +resource_local_to_scene = true +_surfaces = [{ +"aabb": AABB(-0.375, -0.25, -0.75, 0.75, 0.5, 1.5), +"attribute_data": PackedByteArray("/7//P/9v/7//X/8//7//vwAA/78AAP8//6f/v/9H/7//p/+//7//v/+f//f/v////6cAAP/H/wf/n/83/7//P/+X/7//l/8//zf/P/8P/7//x//H/5//x/+/AAD/n/8H/6f/P//H/zf/X/+//0f/P/9v/z//p/8//6f////H//f/D/8//5f/v/+X/z//p/+//6f/P/83/7//R/+//0f/P/9v/z//b/+//1//P/9f/7//N/+//w//v/83/z//D/8/"), +"format": 34896613399, +"index_count": 84, +"index_data": PackedByteArray("FgANAAwADAANABcAFwANAA4ADgANABgAGAANAA8ADwANABkAGgAHAAIAAgAHABsAEAABABEAEQABABwAHQAAAAYABgAAAAMACQAUAAgACAAUABUAFQAUAAoACgAUAB4AHgAUAAsACwAUAB8AIAATAAUABQATAAQAIQAiACMAIwAiACQAJQASACYAJgASACcAKAApACoAKgApACsALAAtAC4ALgAtAC8A"), +"lods": [0.108952, PackedByteArray("DAANAA4ADgANAA8AEAABABEAEAARAAYAEQAAAAYABgAAAAMAEQABAAIAAgABAAcABwASAAIABwATABIAEgATAAUABQATAAQACQAUAAgACAAUABUAFQAUAAoACgAUAAsA"), 0.261829, PackedByteArray("AAABAAIAAQAAAAYABgAAAAMAAgABAAcABwAEAAIAAgAEAAUACAAJAAoACgAJAAsA"), 0.524037, PackedByteArray("AAABAAIAAQAAAAMAAgABAAQAAgAEAAUA")], +"material": SubResource("StandardMaterial3D_1h5r5"), +"name": "Cube", +"primitive": 3, +"uv_scale": Vector4(0, 0, 0, 0), +"vertex_count": 48, +"vertex_data": PackedByteArray("AAAyM///VNXc3f//AAD/////zMz//1TVAAAyMwAAVNUAADIzAAD8xQAAMjP///zFAADMzAAAVNX//zIzAABU1QAAzMwAAP//AAAyMwAA///c3f//AAD/////MjMAAP/////MzP///7/c3QAA///svyEi/////0TBAAAyM///Fr8hIv//AAD//yEi////////3N0AAP///MUhIgAAAAD8xSEiAAAAAP//ISL//wAA/////zIz////v9zd//////+/AADMzP//DMEhIgAA//+cvP//zMwAAFTV//8yM///VNXc3f///////wAAzMz//1TV///MzAAA///c3QAAAAD//yEiAAD///zFISL//wAAqukhIv////+q6QAAzMwAAKrpAADMzP//qunc3QAAAAD8xf//MjMAAPzF//8yM////MXc3f////+q6dzd//8AAKrp///MzP//qun//8zMAACq6dzdAAAAAP+/ISIAAAAA/7/c3QAA////vyEiAAD///+/VFWqqv9//7+qKqoqVFWqqv45/pz+Of6cVFWqqqoqqir/P/+//z//v/7A/0C2QLbA/3//f/9//3//f/9//3//f/9//7//f/+//xwBRv45/pwOQA3A/z//v/9//3//f/9//3//f/9//3+qKqoqqiqqKv9//79UVaqq0sDSQKlCqML+Of6cCWoEtQlqBLUJagS1CWoEtf8cAUb/HAFG/xwBRgQ19hUENfYVBDX2FQQ19hUAAP9/AAD/fwAA/38AAP9/") +}] +blend_shape_mode = 0 +shadow_mesh = SubResource("ArrayMesh_u2hqf") + [sub_resource type="ShaderMaterial" id="ShaderMaterial_45wwf"] resource_local_to_scene = true render_priority = 0 @@ -5860,6 +5920,9 @@ process_material = SubResource("ParticleProcessMaterial_6giaa") [node name="BurnoutLight" parent="Corridor3/Hallway2" instance=ExtResource("29_lfacn")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.31134e-07, 3, -1.5) +[node name="RetinalScanner" parent="Corridor3/Hallway2" instance=ExtResource("41_u2hqf")] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -1.4, 1.5, 4.5) + [node name="T-Junction1" type="MeshInstance3D" parent="Corridor3"] transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 12, 0, 0) mesh = ExtResource("28_ji5cn") @@ -6643,15 +6706,15 @@ mesh = SubResource("ArrayMesh_2qkxu") [node name="CrateLong4" parent="Medbay/Props" instance=ExtResource("26_otfxe")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4, 0.25, -3.6) -mesh = SubResource("ArrayMesh_2qkxu") +mesh = SubResource("ArrayMesh_lfacn") [node name="CrateLong2" parent="Medbay/Props" instance=ExtResource("26_otfxe")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.9, 0.75, 0.299999) -mesh = SubResource("ArrayMesh_2qkxu") +mesh = SubResource("ArrayMesh_wvfch") [node name="CrateLong3" parent="Medbay/Props" instance=ExtResource("26_otfxe")] transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 3.9, 0.75, -1.04972) -mesh = SubResource("ArrayMesh_2qkxu") +mesh = SubResource("ArrayMesh_2agve") [node name="FloatingDust" parent="Medbay" instance=ExtResource("25_6giaa")] transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 1.5, -4.5) @@ -6687,6 +6750,17 @@ radius = 2.2 height = 0.6 sides = 16 +[node name="WorldItem" parent="Medbay" instance=ExtResource("43_f0xh4")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.2, 0) +item = ExtResource("44_nmnkj") + +[node name="Label3D" type="Label3D" parent="Medbay/WorldItem"] +pixel_size = 0.001 +billboard = 2 +text = "[Eyeballs]" +font_size = 72 +outline_size = 24 + [node name="BulkheadX" parent="." instance=ExtResource("35_f0xh4")] transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -22.5, 0, -51) @@ -6991,6 +7065,9 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12, -12, -60) [connection signal="activated" from="Corridor3/Hallway/SwitchE2" to="CrewQuarters/CommonArea/SwitchE1" method="disable"] [connection signal="activated" from="Corridor3/Hallway/SwitchE2" to="BulkheadE" method="open"] [connection signal="activated" from="Corridor3/Hallway/SwitchE2" to="Corridor3/Hallway/SwitchE2" method="disable"] +[connection signal="activated" from="Corridor3/Hallway2/RetinalScanner" to="BulkheadF" method="open"] +[connection signal="activated" from="Corridor3/Hallway2/RetinalScanner" to="Corridor3/Hallway2/RetinalScanner" method="disable"] +[connection signal="activated" from="Corridor3/Hallway2/RetinalScanner" to="OpsCenter/SwitchF2" method="disable"] [connection signal="activated" from="Corridor3/ShortHallway3/SwitchH1" to="Corridor3/ShortHallway3/SwitchH1" method="disable"] [connection signal="activated" from="Corridor3/ShortHallway3/SwitchH1" to="BulkheadH" method="open"] [connection signal="activated" from="Corridor3/ShortHallway3/SwitchH1" to="Medbay/SwitchH2" method="disable"] @@ -7000,4 +7077,5 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12, -12, -60) [connection signal="activated" from="Medbay/SwitchX" to="Medbay/SwitchX" method="disable"] [connection signal="activated" from="Medbay/SwitchX" to="BulkheadX" method="open"] [connection signal="activated" from="OpsCenter/SwitchF2" to="BulkheadF" method="open"] +[connection signal="activated" from="OpsCenter/SwitchF2" to="Corridor3/Hallway2/RetinalScanner" method="disable"] [connection signal="activated" from="OpsCenter/SwitchF2" to="OpsCenter/SwitchF2" method="disable"] diff --git a/levels/ghost_ship/item_data/eyeballs.tres b/levels/ghost_ship/item_data/eyeballs.tres new file mode 100644 index 0000000..53bcb14 --- /dev/null +++ b/levels/ghost_ship/item_data/eyeballs.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="Item" load_steps=2 format=3 uid="uid://c6ynovu3h6twl"] + +[ext_resource type="Script" uid="uid://btwfewn35d0hm" path="res://src/items/item.gd" id="1_iey6h"] + +[resource] +script = ExtResource("1_iey6h") +name = "Eyeballs" +description = "A pair of eyeballs, formerly belonging to the shift supervisor. Could be used with a retinal scanner." +metadata/_custom_type_script = "uid://btwfewn35d0hm" diff --git a/levels/mechanic_test/item_test.gd b/levels/mechanic_test/item_test.gd new file mode 100644 index 0000000..21db1a8 --- /dev/null +++ b/levels/mechanic_test/item_test.gd @@ -0,0 +1,5 @@ +extends Node3D + + +func _on_retinal_scanner_activated() -> void: + print_debug("Retinal scanner activated!!") diff --git a/levels/mechanic_test/item_test.gd.uid b/levels/mechanic_test/item_test.gd.uid new file mode 100644 index 0000000..2512e25 --- /dev/null +++ b/levels/mechanic_test/item_test.gd.uid @@ -0,0 +1 @@ +uid://bhx3bug3prp50 diff --git a/levels/mechanic_test/item_test.tscn b/levels/mechanic_test/item_test.tscn new file mode 100644 index 0000000..5d1088f --- /dev/null +++ b/levels/mechanic_test/item_test.tscn @@ -0,0 +1,58 @@ +[gd_scene load_steps=9 format=3 uid="uid://dbabcsp38wmid"] + +[ext_resource type="Script" uid="uid://bhx3bug3prp50" path="res://levels/mechanic_test/item_test.gd" id="1_fcmux"] +[ext_resource type="PackedScene" uid="uid://bn8fdu4houoo2" path="res://src/world/world_item/world_item.tscn" id="1_l8xgj"] +[ext_resource type="Resource" uid="uid://c6ynovu3h6twl" path="res://levels/ghost_ship/item_data/eyeballs.tres" id="2_fcmux"] +[ext_resource type="PackedScene" uid="uid://ctr56p23cvupu" path="res://src/props/retinal_scanner/retinal_scanner.tscn" id="3_8dd7v"] + +[sub_resource type="CylinderMesh" id="CylinderMesh_f342o"] +height = 1.0 +radial_segments = 8 +rings = 0 + +[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_cgmn0"] +data = PackedVector3Array(0, 0.5, 0.5, 0.3536, 0.5, 0.3536, 0, -0.5, 0.5, 0.3536, 0.5, 0.3536, 0.3536, -0.5, 0.3536, 0, -0.5, 0.5, 0.3536, 0.5, 0.3536, 0.5, 0.5, 0, 0.3536, -0.5, 0.3536, 0.5, 0.5, 0, 0.5, -0.5, 0, 0.3536, -0.5, 0.3536, 0.5, 0.5, 0, 0.3536, 0.5, -0.3536, 0.5, -0.5, 0, 0.3536, 0.5, -0.3536, 0.3536, -0.5, -0.3536, 0.5, -0.5, 0, 0.3536, 0.5, -0.3536, 0, 0.5, -0.5, 0.3536, -0.5, -0.3536, 0, 0.5, -0.5, 0, -0.5, -0.5, 0.3536, -0.5, -0.3536, 0, 0.5, -0.5, -0.3536, 0.5, -0.3536, 0, -0.5, -0.5, -0.3536, 0.5, -0.3536, -0.3536, -0.5, -0.3536, 0, -0.5, -0.5, -0.3536, 0.5, -0.3536, -0.5, 0.5, 0, -0.3536, -0.5, -0.3536, -0.5, 0.5, 0, -0.5, -0.5, 0, -0.3536, -0.5, -0.3536, -0.5, 0.5, 0, -0.3536, 0.5, 0.3536, -0.5, -0.5, 0, -0.3536, 0.5, 0.3536, -0.3536, -0.5, 0.3536, -0.5, -0.5, 0, -0.3536, 0.5, 0.3536, 0, 0.5, 0.5, -0.3536, -0.5, 0.3536, 0, 0.5, 0.5, 0, -0.5, 0.5, -0.3536, -0.5, 0.3536, 0, 0.5, 0, 0.3536, 0.5, 0.3536, 0, 0.5, 0.5, 0, 0.5, 0, 0.5, 0.5, 0, 0.3536, 0.5, 0.3536, 0, 0.5, 0, 0.3536, 0.5, -0.3536, 0.5, 0.5, 0, 0, 0.5, 0, 0, 0.5, -0.5, 0.3536, 0.5, -0.3536, 0, 0.5, 0, -0.3536, 0.5, -0.3536, 0, 0.5, -0.5, 0, 0.5, 0, -0.5, 0.5, 0, -0.3536, 0.5, -0.3536, 0, 0.5, 0, -0.3536, 0.5, 0.3536, -0.5, 0.5, 0, 0, 0.5, 0, 0, 0.5, 0.5, -0.3536, 0.5, 0.3536, 0, -0.5, 0, 0, -0.5, 0.5, 0.3536, -0.5, 0.3536, 0, -0.5, 0, 0.3536, -0.5, 0.3536, 0.5, -0.5, 0, 0, -0.5, 0, 0.5, -0.5, 0, 0.3536, -0.5, -0.3536, 0, -0.5, 0, 0.3536, -0.5, -0.3536, 0, -0.5, -0.5, 0, -0.5, 0, 0, -0.5, -0.5, -0.3536, -0.5, -0.3536, 0, -0.5, 0, -0.3536, -0.5, -0.3536, -0.5, -0.5, 0, 0, -0.5, 0, -0.5, -0.5, 0, -0.3536, -0.5, 0.3536, 0, -0.5, 0, -0.3536, -0.5, 0.3536, 0, -0.5, 0.5) + +[sub_resource type="BoxMesh" id="BoxMesh_goufh"] +size = Vector3(0.5, 2, 0.5) + +[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_bg05n"] +data = PackedVector3Array(-0.25, 1, 0.25, 0.25, 1, 0.25, -0.25, -1, 0.25, 0.25, 1, 0.25, 0.25, -1, 0.25, -0.25, -1, 0.25, 0.25, 1, -0.25, -0.25, 1, -0.25, 0.25, -1, -0.25, -0.25, 1, -0.25, -0.25, -1, -0.25, 0.25, -1, -0.25, 0.25, 1, 0.25, 0.25, 1, -0.25, 0.25, -1, 0.25, 0.25, 1, -0.25, 0.25, -1, -0.25, 0.25, -1, 0.25, -0.25, 1, -0.25, -0.25, 1, 0.25, -0.25, -1, -0.25, -0.25, 1, 0.25, -0.25, -1, 0.25, -0.25, -1, -0.25, 0.25, 1, 0.25, -0.25, 1, 0.25, 0.25, 1, -0.25, -0.25, 1, 0.25, -0.25, 1, -0.25, 0.25, 1, -0.25, -0.25, -1, 0.25, 0.25, -1, 0.25, -0.25, -1, -0.25, 0.25, -1, 0.25, 0.25, -1, -0.25, -0.25, -1, -0.25) + +[node name="ItemTest" type="Node3D"] +script = ExtResource("1_fcmux") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0) +mesh = SubResource("CylinderMesh_f342o") +skeleton = NodePath("../..") + +[node name="StaticBody3D" type="StaticBody3D" parent="MeshInstance3D"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="MeshInstance3D/StaticBody3D"] +shape = SubResource("ConcavePolygonShape3D_cgmn0") + +[node name="WorldItem" parent="MeshInstance3D" instance=ExtResource("1_l8xgj")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.55, 0) +item = ExtResource("2_fcmux") + +[node name="Label3D" type="Label3D" parent="MeshInstance3D/WorldItem"] +pixel_size = 0.001 +billboard = 2 +text = "[Eyeballs]" +font_size = 72 +outline_size = 24 + +[node name="ScannerPodium" type="StaticBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 1, 0) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="ScannerPodium"] +mesh = SubResource("BoxMesh_goufh") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="ScannerPodium"] +shape = SubResource("ConcavePolygonShape3D_bg05n") + +[node name="RetinalScanner" parent="ScannerPodium" instance=ExtResource("3_8dd7v")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0.35) + +[connection signal="activated" from="ScannerPodium/RetinalScanner" to="." method="_on_retinal_scanner_activated"] diff --git a/levels/mechanic_test/mechanic_test.gd b/levels/mechanic_test/mechanic_test.gd index 3dc4118..5a6f7d1 100644 --- a/levels/mechanic_test/mechanic_test.gd +++ b/levels/mechanic_test/mechanic_test.gd @@ -11,11 +11,13 @@ extends Node3D @onready var alarm_spawn_point: Marker3D = %AlarmSpawnPoint @onready var signal_test_spawn_point: Marker3D = %SignalTestSpawnPoint @onready var prop_test_spawn_point: Marker3D = %PropTestSpawnPoint +@onready var item_test_spawn_point: Marker3D = %ItemTestSpawnPoint static var nodule_scene: PackedScene = load("res://src/world/gunk_node/grunk_nodule.tscn") static var alarm_scene: PackedScene = load("res://src/world/mechanics/alarm/gunk_alarm.tscn") static var signal_test_scene: PackedScene = load("res://levels/mechanic_test/signal_test.tscn") static var prop_test_scene: PackedScene = load("res://levels/mechanic_test/prop_test.tscn") +static var item_test_scene: PackedScene = load("res://levels/mechanic_test/item_test.tscn") func reset() -> void: @@ -26,6 +28,7 @@ func reset() -> void: Callable(close_switch, "disable").call() _do_spawn(signal_test_spawn_point, signal_test_scene) _do_spawn(prop_test_spawn_point, prop_test_scene) + _do_spawn(item_test_spawn_point, item_test_scene) func _do_spawn(spawn_point: Node3D, scene: PackedScene) -> void: diff --git a/levels/mechanic_test/mechanic_test.tscn b/levels/mechanic_test/mechanic_test.tscn index 0f3778f..001c4c1 100644 --- a/levels/mechanic_test/mechanic_test.tscn +++ b/levels/mechanic_test/mechanic_test.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=30 format=4 uid="uid://b8rv6dg4tgaeb"] +[gd_scene load_steps=31 format=4 uid="uid://b8rv6dg4tgaeb"] [ext_resource type="Script" uid="uid://bvua1l2hb3an6" path="res://levels/mechanic_test/mechanic_test.gd" id="1_bg05n"] [ext_resource type="PackedScene" uid="uid://bwe2jdmvinhqd" path="res://src/player/player.tscn" id="1_goufh"] @@ -10,6 +10,7 @@ [ext_resource type="PackedScene" uid="uid://cubwniraol1qn" path="res://src/props/bulkhead/bulkhead.tscn" id="8_f342o"] [ext_resource type="PackedScene" uid="uid://b5jubpjj3d277" path="res://levels/mechanic_test/signal_test.tscn" id="9_x2vho"] [ext_resource type="PackedScene" uid="uid://cfqirm2o3uo4k" path="res://levels/mechanic_test/prop_test.tscn" id="10_f342o"] +[ext_resource type="PackedScene" uid="uid://dbabcsp38wmid" path="res://levels/mechanic_test/item_test.tscn" id="11_iyuyb"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_goufh"] @@ -292,6 +293,12 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.5, 0, 4.5) [node name="PropTest" parent="PropTestSpawnPoint" instance=ExtResource("10_f342o")] +[node name="ItemTestSpawnPoint" type="Marker3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13, 0, -2) + +[node name="ItemTest" parent="ItemTestSpawnPoint" instance=ExtResource("11_iyuyb")] + [connection signal="activated" from="ResetPodium/ResetSwitch" to="." method="reset"] [connection signal="activated" from="NoduleSpawner/WallSwitch" to="." method="spawn_nodule"] [connection signal="activated" from="AlarmSpawner/WallSwitch" to="." method="spawn_alarm"] diff --git a/project.godot b/project.godot index 843d15c..f10f098 100644 --- a/project.godot +++ b/project.godot @@ -22,6 +22,7 @@ run/max_fps=60 [autoload] +ItemCatalog="*res://src/items/item_catalog.tscn" GameManager="*res://src/game/game_manager.tscn" [debug] diff --git a/src/game/game_manager.gd b/src/game/game_manager.gd index 96d2850..e899534 100644 --- a/src/game/game_manager.gd +++ b/src/game/game_manager.gd @@ -13,6 +13,9 @@ signal alert_raised(new_value: int) ## Emitted just before the alert level is reset to zero. signal alert_cleared +## Emitted just after the player collects an item. +signal item_collected(item: Item) + const MAX_ALERT := 6 ## Maximum amount of grunk the player can carry in their tank. diff --git a/src/items/item.gd b/src/items/item.gd new file mode 100644 index 0000000..afd1896 --- /dev/null +++ b/src/items/item.gd @@ -0,0 +1,10 @@ +class_name Item extends Resource +## An item which can be collected, held in the player's inventory, and used. + +@export var name: String +@export_multiline var description: String + +## Handy typed singleton access. +static var catalog: ItemCatalogType: + get(): + return ItemCatalog diff --git a/src/items/item.gd.uid b/src/items/item.gd.uid new file mode 100644 index 0000000..7bf1dae --- /dev/null +++ b/src/items/item.gd.uid @@ -0,0 +1 @@ +uid://btwfewn35d0hm diff --git a/src/items/item_catalog.gd b/src/items/item_catalog.gd new file mode 100644 index 0000000..e23316e --- /dev/null +++ b/src/items/item_catalog.gd @@ -0,0 +1,4 @@ +class_name ItemCatalogType extends Node +## Autoloaded singleton catalog of all game items + +@export var eyeballs: Item diff --git a/src/items/item_catalog.gd.uid b/src/items/item_catalog.gd.uid new file mode 100644 index 0000000..6f997e0 --- /dev/null +++ b/src/items/item_catalog.gd.uid @@ -0,0 +1 @@ +uid://irxsuvrmtndr diff --git a/src/items/item_catalog.tscn b/src/items/item_catalog.tscn new file mode 100644 index 0000000..f3a12db --- /dev/null +++ b/src/items/item_catalog.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=3 format=3 uid="uid://wpccpkt5fl22"] + +[ext_resource type="Script" uid="uid://irxsuvrmtndr" path="res://src/items/item_catalog.gd" id="1_7eu5k"] +[ext_resource type="Resource" uid="uid://c6ynovu3h6twl" path="res://levels/ghost_ship/item_data/eyeballs.tres" id="2_vxbmx"] + +[node name="ItemCatalog" type="Node"] +script = ExtResource("1_7eu5k") +eyeballs = ExtResource("2_vxbmx") diff --git a/src/player/player.gd b/src/player/player.gd index 4404092..c6b87f7 100644 --- a/src/player/player.gd +++ b/src/player/player.gd @@ -8,6 +8,8 @@ const JUMP_FORCE := 4.5 const GROUND_FRICTION := 0.3 const AIR_FRICTION := 0.03 +@export var inventory: Dictionary[Item, int] = {} + var gravity: Vector3 = ( ProjectSettings.get_setting("physics/3d/default_gravity") * ProjectSettings.get_setting("physics/3d/default_gravity_vector") @@ -55,10 +57,26 @@ func get_tool() -> Tool: return tool_mount.get_active() +## Add the given item to the player's inventory. +func add_item(item: Item, amount: int = 1) -> void: + inventory[item] = inventory.get(item, 0) + amount + if inventory[item] > 0: + Game.manager.item_collected.emit(item) + + +## Remove the given item from the player's inventory. +func remove_item(item: Item, amount: int = 1) -> void: + inventory[item] = inventory.get(item, 0) - amount + if inventory[item] <= 0: + inventory.erase(item) + + func _physics_process(delta: float) -> void: # Will be null if no valid interactor is selected. var interactive: Interactive = interact_ray.get_collider() as Interactive hud.select_interactive(interactive) + if interactive: + interactive.select() # World interaction if interactive and Input.is_action_just_pressed("interact"): diff --git a/src/props/interactive.gd b/src/props/interactive.gd index 9f4351c..9b58820 100644 --- a/src/props/interactive.gd +++ b/src/props/interactive.gd @@ -2,13 +2,30 @@ class_name Interactive extends StaticBody3D ## Props the player can interact with. signal activated +signal selected @export var enabled := false @export var label := "" @export var verb := "use" +var _is_selected := false +var _selected_this_frame := false + func activate() -> void: if enabled: activated.emit() # TODO: bonk + + +func select() -> void: + if not _is_selected: + selected.emit() + _is_selected = true + _selected_this_frame = true + + +func _process(_delta: float) -> void: + if not _selected_this_frame: + _is_selected = false + _selected_this_frame = false diff --git a/src/props/retinal_scanner/retinal_scanner.gd b/src/props/retinal_scanner/retinal_scanner.gd new file mode 100644 index 0000000..61a3aff --- /dev/null +++ b/src/props/retinal_scanner/retinal_scanner.gd @@ -0,0 +1,42 @@ +extends Node3D + +signal activated + +@export var enabled := true + +@onready var interactive: Interactive = %Interactive + + +func _ready() -> void: + if enabled: + enable() + else: + disable() + + +func enable() -> void: + enabled = true + interactive.enabled = _has_item() + + +func disable() -> void: + enabled = false + interactive.enabled = false + + +func _has_item() -> bool: + return Player.instance and Item.catalog.eyeballs in Player.instance.inventory + + +func _activate() -> void: + if enabled and Item.catalog.eyeballs in Player.instance.inventory: + # TODO play animation/sfx + activated.emit() + else: + # TODO bonk + pass + + +func _on_interactive_selected() -> void: + if enabled: + interactive.enabled = _has_item() diff --git a/src/props/retinal_scanner/retinal_scanner.gd.uid b/src/props/retinal_scanner/retinal_scanner.gd.uid new file mode 100644 index 0000000..855a1f9 --- /dev/null +++ b/src/props/retinal_scanner/retinal_scanner.gd.uid @@ -0,0 +1 @@ +uid://brao0ea0tgfgc diff --git a/src/props/retinal_scanner/retinal_scanner.tscn b/src/props/retinal_scanner/retinal_scanner.tscn new file mode 100644 index 0000000..e026fec --- /dev/null +++ b/src/props/retinal_scanner/retinal_scanner.tscn @@ -0,0 +1,37 @@ +[gd_scene load_steps=5 format=3 uid="uid://ctr56p23cvupu"] + +[ext_resource type="Script" uid="uid://brao0ea0tgfgc" path="res://src/props/retinal_scanner/retinal_scanner.gd" id="1_c71b5"] +[ext_resource type="Script" uid="uid://deg5xd87cy8rg" path="res://src/props/interactive.gd" id="1_ldtbm"] + +[sub_resource type="BoxMesh" id="BoxMesh_c71b5"] +size = Vector3(0.475, 0.65, 0.2) + +[sub_resource type="BoxShape3D" id="BoxShape3D_5bfyo"] +size = Vector3(0.475, 0.65, 0.2) + +[node name="RetinalScanner" type="Node3D"] +script = ExtResource("1_c71b5") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +mesh = SubResource("BoxMesh_c71b5") + +[node name="Label3D" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.18, 0.105) +pixel_size = 0.001 +text = "Retinal +Scanner" +font_size = 96 +outline_size = 24 + +[node name="Interactive" type="StaticBody3D" parent="."] +unique_name_in_owner = true +collision_layer = 3 +collision_mask = 0 +script = ExtResource("1_ldtbm") +metadata/_custom_type_script = "uid://deg5xd87cy8rg" + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Interactive"] +shape = SubResource("BoxShape3D_5bfyo") + +[connection signal="activated" from="Interactive" to="." method="_activate"] +[connection signal="selected" from="Interactive" to="." method="_on_interactive_selected"] diff --git a/src/world/world_item/world_item.gd b/src/world/world_item/world_item.gd new file mode 100644 index 0000000..ce267d4 --- /dev/null +++ b/src/world/world_item/world_item.gd @@ -0,0 +1,34 @@ +@tool +class_name WorldItem extends MeshInstance3D +## A collectable item in the world. + +@export var item: Item: + set = _set_item +@export var interact_radius: float = 0.25: + set = _set_radius + +@onready var interactive: Interactive = %Interactive +@onready var collision_shape_3d: CollisionShape3D = %CollisionShape3D + + +func _ready() -> void: + _set_item(item) + _set_radius(interact_radius) + + +func _set_item(value: Item) -> void: + item = value + if item and interactive: + interactive.label = item.name + + +func _set_radius(value: float) -> void: + interact_radius = value + if collision_shape_3d: + (collision_shape_3d.shape as SphereShape3D).radius = interact_radius + + +func _on_interactive_activated() -> void: + Player.instance.add_item(item) + # TODO: animation, sfx on collect? + queue_free() diff --git a/src/world/world_item/world_item.gd.uid b/src/world/world_item/world_item.gd.uid new file mode 100644 index 0000000..70ff57e --- /dev/null +++ b/src/world/world_item/world_item.gd.uid @@ -0,0 +1 @@ +uid://cn360k7cnl1uu diff --git a/src/world/world_item/world_item.tscn b/src/world/world_item/world_item.tscn new file mode 100644 index 0000000..0b116ad --- /dev/null +++ b/src/world/world_item/world_item.tscn @@ -0,0 +1,25 @@ +[gd_scene load_steps=4 format=3 uid="uid://bn8fdu4houoo2"] + +[ext_resource type="Script" uid="uid://cn360k7cnl1uu" path="res://src/world/world_item/world_item.gd" id="1_sptcj"] +[ext_resource type="Script" uid="uid://deg5xd87cy8rg" path="res://src/props/interactive.gd" id="2_ngll7"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_0mein"] +radius = 0.25 + +[node name="WorldItem" type="MeshInstance3D"] +script = ExtResource("1_sptcj") + +[node name="Interactive" type="StaticBody3D" parent="."] +unique_name_in_owner = true +collision_layer = 2 +collision_mask = 0 +script = ExtResource("2_ngll7") +enabled = true +verb = "pick up" +metadata/_custom_type_script = "uid://deg5xd87cy8rg" + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Interactive"] +unique_name_in_owner = true +shape = SubResource("SphereShape3D_0mein") + +[connection signal="activated" from="Interactive" to="." method="_on_interactive_activated"] diff --git a/vault/TODO.md b/vault/TODO.md index 2f2dadd..35fc17a 100644 --- a/vault/TODO.md +++ b/vault/TODO.md @@ -67,7 +67,7 @@ - [ ] ship - [ ] bunk - [ ] tank terminal - - [ ] tank animations + - [x] tank animations - [ ] control console & launch button - [ ] door - [ ] counters @@ -84,4 +84,9 @@ - [ ] [[crew quarters]] props: - [ ] sofa - [ ] coffee table - - [ ] bed \ No newline at end of file + - [ ] bed + - [ ] [[medbay]] props: + - [ ] operating table + - [ ] wraparound desk + - [ ] OR cart + - [ ] OR monitor cart \ No newline at end of file