From ff379484ca6a4e661f1889cc462affffc50b86f9 Mon Sep 17 00:00:00 2001 From: Rob Kelly Date: Sat, 28 Jun 2025 17:14:54 -0600 Subject: [PATCH] Stickersss --- asset_dev/hud_tools/mp3_player.xcf | Bin 23063 -> 39194 bytes assets/stickers/glowing_star_3d.png | 3 + assets/stickers/glowing_star_3d.png.import | 34 ++++++ assets/stickers/heart_suit_3d.png | 3 + assets/stickers/heart_suit_3d.png.import | 34 ++++++ assets/ui/hud/tools/hand_bg.png | 3 + assets/ui/hud/tools/hand_bg.png.import | 34 ++++++ assets/ui/hud/tools/hand_fg.png | 3 + assets/ui/hud/tools/hand_fg.png.import | 34 ++++++ project.godot | 7 +- src/equipment/mp3_player/mp3_player.tscn | 2 + src/equipment/sticker_pack/sticker_pack.gd | 70 ++++++++++++ .../sticker_pack/sticker_pack.gd.uid | 1 + src/equipment/sticker_pack/sticker_pack.tscn | 101 ++++++++++++++++++ src/equipment/sticker_pack/world_sticker.tscn | 26 +++++ src/equipment/surface_snap_tool.gd | 15 +++ src/equipment/surface_snap_tool.gd.uid | 1 + src/equipment/toothbrush/toothbrush.gd | 16 +-- src/player/player.gd | 5 +- src/player/player.tscn | 7 +- src/world/world.tscn | 2 +- src/world/world_manager.tres | 2 +- vault/TODO.md | 2 +- 23 files changed, 384 insertions(+), 21 deletions(-) create mode 100644 assets/stickers/glowing_star_3d.png create mode 100644 assets/stickers/glowing_star_3d.png.import create mode 100644 assets/stickers/heart_suit_3d.png create mode 100644 assets/stickers/heart_suit_3d.png.import create mode 100644 assets/ui/hud/tools/hand_bg.png create mode 100644 assets/ui/hud/tools/hand_bg.png.import create mode 100644 assets/ui/hud/tools/hand_fg.png create mode 100644 assets/ui/hud/tools/hand_fg.png.import create mode 100644 src/equipment/sticker_pack/sticker_pack.gd create mode 100644 src/equipment/sticker_pack/sticker_pack.gd.uid create mode 100644 src/equipment/sticker_pack/sticker_pack.tscn create mode 100644 src/equipment/sticker_pack/world_sticker.tscn create mode 100644 src/equipment/surface_snap_tool.gd create mode 100644 src/equipment/surface_snap_tool.gd.uid diff --git a/asset_dev/hud_tools/mp3_player.xcf b/asset_dev/hud_tools/mp3_player.xcf index 7908bc5283f78c9400f25cd259dc5fa33c167392..c1ee760d2ab166ab4b3f9e2e6b03fd640949118d 100644 GIT binary patch literal 39194 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 E15iuSLI3~& delta 987 zcmX}qZ%7ki90&02thl!5n9HT3_F}O%mNN>r*6d2Qx{-p`glpiUC?dl3Dq1gkVG!<( zFB&}9LZde!y(*~77ZyYiy+~LDMTmuHLNDwOMIfbNozM3>5BB@;eV*U#?tXV8kCf_T zXC>{7Kg^s}Q|b?gJepp@?J5i(gRK@!EJ7m(Pq@X;l2;UTRrDSBs%-qjs5QDm=xDl6 zC&Y2xtJ}eK87rLK!%&O@Xx0vx1#jB$|if>Y0EY_)|eBaTs?Jtz| znq60a_OUfU+h`d!FNvDoV%_NcxL!>3ZxX@67bUPo{_XRk))?qOTR2G%i@BmN9k_)U z?0}&+bQbPBO@G61eVEP65o`41v?{*sdgqB_sa_+e)&>|E!eZ+vy;mP#vG@ZzG-p)1$`@RaG3MfV!2n7U;FsY9wqOUFRG=g`SZKcD{IKEJCO5PD_xy( F{s;32t~mez diff --git a/assets/stickers/glowing_star_3d.png b/assets/stickers/glowing_star_3d.png new file mode 100644 index 0000000..b7de53d --- /dev/null +++ b/assets/stickers/glowing_star_3d.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8041e122bfebbc72ff85c294568561ae77dc97ae322f747292c082901a3bef7 +size 28165 diff --git a/assets/stickers/glowing_star_3d.png.import b/assets/stickers/glowing_star_3d.png.import new file mode 100644 index 0000000..cd2bc49 --- /dev/null +++ b/assets/stickers/glowing_star_3d.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dsrm2mw4e4gx1" +path="res://.godot/imported/glowing_star_3d.png-5114e5219616e1224c3af11f20cc8171.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/stickers/glowing_star_3d.png" +dest_files=["res://.godot/imported/glowing_star_3d.png-5114e5219616e1224c3af11f20cc8171.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/assets/stickers/heart_suit_3d.png b/assets/stickers/heart_suit_3d.png new file mode 100644 index 0000000..52a8802 --- /dev/null +++ b/assets/stickers/heart_suit_3d.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06285abaea2e055913841a92abc1be28aeef0c6afda480ce75a1f7938a2b2d65 +size 22437 diff --git a/assets/stickers/heart_suit_3d.png.import b/assets/stickers/heart_suit_3d.png.import new file mode 100644 index 0000000..b0dc95c --- /dev/null +++ b/assets/stickers/heart_suit_3d.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cl8ui8nnoaa1i" +path="res://.godot/imported/heart_suit_3d.png-13871ac315a96fa440a66ea89478611e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/stickers/heart_suit_3d.png" +dest_files=["res://.godot/imported/heart_suit_3d.png-13871ac315a96fa440a66ea89478611e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/assets/ui/hud/tools/hand_bg.png b/assets/ui/hud/tools/hand_bg.png new file mode 100644 index 0000000..a69e203 --- /dev/null +++ b/assets/ui/hud/tools/hand_bg.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f64c92c8896755b772934e358249e9c8c2d6344271a12668c97fb46b00fa543d +size 647 diff --git a/assets/ui/hud/tools/hand_bg.png.import b/assets/ui/hud/tools/hand_bg.png.import new file mode 100644 index 0000000..cf95822 --- /dev/null +++ b/assets/ui/hud/tools/hand_bg.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://db85cfwlticnb" +path="res://.godot/imported/hand_bg.png-dba561c746d5d9d7eda16967a74a41dd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/ui/hud/tools/hand_bg.png" +dest_files=["res://.godot/imported/hand_bg.png-dba561c746d5d9d7eda16967a74a41dd.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/assets/ui/hud/tools/hand_fg.png b/assets/ui/hud/tools/hand_fg.png new file mode 100644 index 0000000..e1c9f20 --- /dev/null +++ b/assets/ui/hud/tools/hand_fg.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d49b67c111ddc61a5107279d34f1be9da3f515ef1ea03c9ffcdee3067fc7949a +size 903 diff --git a/assets/ui/hud/tools/hand_fg.png.import b/assets/ui/hud/tools/hand_fg.png.import new file mode 100644 index 0000000..f6ae9bf --- /dev/null +++ b/assets/ui/hud/tools/hand_fg.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cju4oxjgaf0ee" +path="res://.godot/imported/hand_fg.png-9b58f7a1a95a5390121469b6f08ef067.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/ui/hud/tools/hand_fg.png" +dest_files=["res://.godot/imported/hand_fg.png-9b58f7a1a95a5390121469b6f08ef067.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/project.godot b/project.godot index 0ab6011..6208248 100644 --- a/project.godot +++ b/project.godot @@ -180,11 +180,16 @@ select_mp3_player={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":52,"key_label":0,"unicode":52,"location":0,"echo":false,"script":null) ] } -select_manual={ +select_stickers={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":53,"key_label":0,"unicode":53,"location":0,"echo":false,"script":null) ] } +select_manual={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":48,"key_label":0,"unicode":48,"location":0,"echo":false,"script":null) +] +} pause={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) diff --git a/src/equipment/mp3_player/mp3_player.tscn b/src/equipment/mp3_player/mp3_player.tscn index 8da4bf9..5b9c3f8 100644 --- a/src/equipment/mp3_player/mp3_player.tscn +++ b/src/equipment/mp3_player/mp3_player.tscn @@ -34,6 +34,7 @@ anchor_right = 0.5 anchor_bottom = 0.5 grow_horizontal = 2 grow_vertical = 2 +metadata/_edit_use_anchors_ = true [node name="DeviceTexture" type="TextureRect" parent="HUDTool/Rumbler/Position/HUDElement"] texture_filter = 1 @@ -44,6 +45,7 @@ offset_right = -162.0 offset_bottom = 25.0 scale = Vector2(5, 5) texture = ExtResource("3_de88k") +metadata/_edit_use_anchors_ = true [node name="DeviceScreenMask" type="TextureRect" parent="HUDTool/Rumbler/Position/HUDElement"] clip_children = 1 diff --git a/src/equipment/sticker_pack/sticker_pack.gd b/src/equipment/sticker_pack/sticker_pack.gd new file mode 100644 index 0000000..0f31850 --- /dev/null +++ b/src/equipment/sticker_pack/sticker_pack.gd @@ -0,0 +1,70 @@ +extends SurfaceSnapTool + +const USER_STICKER_DIR := "user://stickers" + +const RUMBLE_INTENSITY = 0.0009 +const RUMBLE_DROPOFF = 0.8 + +@export var stickers_available: Array[Texture2D] = [] +@export var selection_idx: int = 0: + set = _set_selection_idx + +@export_category("Game Scenes") +@export var sticker_scene: PackedScene + +@onready var rumbler: Rumbler3D = %Rumbler +@onready var sticker_texture: TextureRect = %StickerTexture + + +func _ready() -> void: + _set_selection_idx(0) + + +func unlocked() -> bool: + return World.instance.manager.stickers_unlocked + + +func get_selected_sticker() -> Texture2D: + return stickers_available[selection_idx] + + +func _set_selection_idx(value: int) -> void: + selection_idx = wrapi(value, 0, stickers_available.size()) + + sticker_texture.texture = get_selected_sticker() + rumbler.intensity = RUMBLE_INTENSITY + + +func switch_mode() -> void: + selection_idx += 1 + + +func fire() -> void: + if not firing and raycast.is_colliding(): + firing = true + place_sticker() + rumbler.intensity = RUMBLE_INTENSITY + + +func place_sticker() -> void: + var instance: Decal = sticker_scene.instantiate() + var target: Node = raycast.get_collider() as Node + if not target: + push_warning("Tried to apply decal to non-node target ", raycast.get_collider()) + return + target.add_sibling(instance) + + instance.texture_albedo = get_selected_sticker() + instance.global_position = raycast.get_collision_point() + + # Build basis + var up := raycast.get_collision_normal() + var right := up.cross(global_basis.y).normalized() + var forward := -right.cross(up).normalized() + instance.global_basis = Basis(right, up, forward) + print_debug("Sticker placed") + + +func _physics_process(delta: float) -> void: + rumbler.intensity *= RUMBLE_DROPOFF + super._physics_process(delta) diff --git a/src/equipment/sticker_pack/sticker_pack.gd.uid b/src/equipment/sticker_pack/sticker_pack.gd.uid new file mode 100644 index 0000000..9cae536 --- /dev/null +++ b/src/equipment/sticker_pack/sticker_pack.gd.uid @@ -0,0 +1 @@ +uid://bgj4es0w5b30e diff --git a/src/equipment/sticker_pack/sticker_pack.tscn b/src/equipment/sticker_pack/sticker_pack.tscn new file mode 100644 index 0000000..30d13f9 --- /dev/null +++ b/src/equipment/sticker_pack/sticker_pack.tscn @@ -0,0 +1,101 @@ +[gd_scene load_steps=9 format=3 uid="uid://cmnokjbv3vuqt"] + +[ext_resource type="Script" uid="uid://b274q7uvn0cvp" path="res://src/ui/rumbler_3d.gd" id="1_8t584"] +[ext_resource type="Script" uid="uid://bgj4es0w5b30e" path="res://src/equipment/sticker_pack/sticker_pack.gd" id="1_eaw05"] +[ext_resource type="Script" uid="uid://dj2x7x5qkbym1" path="res://src/ui/canvas_projector.gd" id="2_vcsmi"] +[ext_resource type="PackedScene" uid="uid://dqc1a8xaqac8h" path="res://src/equipment/sticker_pack/world_sticker.tscn" id="2_yigow"] +[ext_resource type="Texture2D" uid="uid://cl8ui8nnoaa1i" path="res://assets/stickers/heart_suit_3d.png" id="3_8t584"] +[ext_resource type="Texture2D" uid="uid://db85cfwlticnb" path="res://assets/ui/hud/tools/hand_bg.png" id="3_o1h4s"] +[ext_resource type="Texture2D" uid="uid://dsrm2mw4e4gx1" path="res://assets/stickers/glowing_star_3d.png" id="3_p2skl"] +[ext_resource type="Texture2D" uid="uid://cju4oxjgaf0ee" path="res://assets/ui/hud/tools/hand_fg.png" id="4_vcsmi"] + +[node name="StickerPack" type="Node3D"] +script = ExtResource("1_eaw05") +stickers_available = Array[Texture2D]([ExtResource("3_8t584"), ExtResource("3_p2skl")]) +sticker_scene = ExtResource("2_yigow") + +[node name="Raycast" type="RayCast3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.997564, -0.0697565, 0, 0.0697565, 0.997564, 0, 0, -0.15) +target_position = Vector3(0, 0, -1) +collision_mask = 4 +hit_from_inside = true + +[node name="RestingPosition" type="Marker3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.2) + +[node name="HUDTool" type="Node3D" parent="RestingPosition"] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.2) +top_level = true + +[node name="Rumbler" type="Node3D" parent="RestingPosition/HUDTool"] +unique_name_in_owner = true +script = ExtResource("1_8t584") +metadata/_custom_type_script = "uid://b274q7uvn0cvp" + +[node name="CanvasProjector" type="Marker3D" parent="RestingPosition/HUDTool/Rumbler"] +script = ExtResource("2_vcsmi") + +[node name="HUDElement" type="Control" parent="RestingPosition/HUDTool/Rumbler/CanvasProjector"] +texture_filter = 3 +layout_mode = 3 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +grow_horizontal = 2 +grow_vertical = 2 +metadata/_edit_use_anchors_ = true + +[node name="HandRoot" type="Control" parent="RestingPosition/HUDTool/Rumbler/CanvasProjector/HUDElement"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -380.0 +offset_top = -323.0 +offset_right = -380.0 +offset_bottom = -323.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="HandBG" type="TextureRect" parent="RestingPosition/HUDTool/Rumbler/CanvasProjector/HUDElement/HandRoot"] +texture_filter = 1 +layout_mode = 0 +offset_right = 128.0 +offset_bottom = 256.0 +scale = Vector2(5, 5) +texture = ExtResource("3_o1h4s") + +[node name="StickerTexture" type="TextureRect" parent="RestingPosition/HUDTool/Rumbler/CanvasProjector/HUDElement/HandRoot"] +unique_name_in_owner = true +texture_filter = 1 +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = 232.0 +offset_top = 175.0 +offset_right = 488.0 +offset_bottom = 431.0 +grow_horizontal = 2 +grow_vertical = 2 +rotation = -0.139626 +pivot_offset = Vector2(128, 128) +texture = ExtResource("3_8t584") +metadata/_edit_use_anchors_ = true + +[node name="HandFG" type="TextureRect" parent="RestingPosition/HUDTool/Rumbler/CanvasProjector/HUDElement/HandRoot"] +texture_filter = 1 +layout_mode = 0 +offset_right = 128.0 +offset_bottom = 256.0 +scale = Vector2(5, 5) +texture = ExtResource("4_vcsmi") diff --git a/src/equipment/sticker_pack/world_sticker.tscn b/src/equipment/sticker_pack/world_sticker.tscn new file mode 100644 index 0000000..7ec9a86 --- /dev/null +++ b/src/equipment/sticker_pack/world_sticker.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=4 format=3 uid="uid://dqc1a8xaqac8h"] + +[ext_resource type="Texture2D" uid="uid://cl8ui8nnoaa1i" path="res://assets/stickers/heart_suit_3d.png" id="1_e4i3l"] + +[sub_resource type="PlaneMesh" id="PlaneMesh_e4i3l"] + +[sub_resource type="CylinderMesh" id="CylinderMesh_e4i3l"] +top_radius = 0.01 +bottom_radius = 0.01 +height = 0.2 + +[node name="WorldSticker" type="Decal"] +size = Vector3(0.25, 0.1, 0.25) +texture_albedo = ExtResource("1_e4i3l") +upper_fade = 0.01 +lower_fade = 0.01 + +[node name="DebugPlane" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.848002, -0.529993, 0, 0.529993, 0.848002, 0, 0, 0) +visible = false +mesh = SubResource("PlaneMesh_e4i3l") + +[node name="DebugNormal" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.15, 0) +visible = false +mesh = SubResource("CylinderMesh_e4i3l") diff --git a/src/equipment/surface_snap_tool.gd b/src/equipment/surface_snap_tool.gd new file mode 100644 index 0000000..0c76098 --- /dev/null +++ b/src/equipment/surface_snap_tool.gd @@ -0,0 +1,15 @@ +class_name SurfaceSnapTool extends Tool +## A Tool whose HUD component snaps to a surface + +@onready var raycast: RayCast3D = %Raycast +@onready var resting_position: Marker3D = %RestingPosition + + +func _physics_process(delta: float) -> void: + hud_tool.global_basis = global_basis + + var weight := 1 - exp(-hud_accel * delta) + var target_position := resting_position.global_position + if raycast.is_colliding(): + target_position = raycast.get_collision_point() + hud_tool.global_position = hud_tool.global_position.lerp(target_position, weight) diff --git a/src/equipment/surface_snap_tool.gd.uid b/src/equipment/surface_snap_tool.gd.uid new file mode 100644 index 0000000..5151c2e --- /dev/null +++ b/src/equipment/surface_snap_tool.gd.uid @@ -0,0 +1 @@ +uid://c260xr7jpemho diff --git a/src/equipment/toothbrush/toothbrush.gd b/src/equipment/toothbrush/toothbrush.gd index 26c6bde..1a31731 100644 --- a/src/equipment/toothbrush/toothbrush.gd +++ b/src/equipment/toothbrush/toothbrush.gd @@ -1,4 +1,4 @@ -extends Tool +extends SurfaceSnapTool # the wimpy toothbrush const PAINT_COLOR := Color(1, 0, 0, 0.3) @@ -6,14 +6,10 @@ const BRUSH_SCALE := 0.2 @export var damage := 0.0063 # ~8 seconds to destroy standard nodule -@onready var raycast: RayCast3D = %Raycast - @onready var texture_idle: TextureRect = %TextureIdle @onready var texture_used: TextureRect = %TextureUsed @onready var brush_animation: AnimationPlayer = %BrushAnimation -@onready var resting_position: Marker3D = %RestingPosition - func unlocked() -> bool: return World.instance.manager.toothbrush_unlocked @@ -42,13 +38,3 @@ func _fire() -> void: func _idle() -> void: texture_idle.visible = true texture_used.visible = false - - -func _physics_process(delta: float) -> void: - hud_tool.global_basis = global_basis - - var weight := 1 - exp(-hud_accel * delta) - var target_position := resting_position.global_position - if raycast.is_colliding(): - target_position = raycast.get_collision_point() - hud_tool.global_position = hud_tool.global_position.lerp(target_position, weight) diff --git a/src/player/player.gd b/src/player/player.gd index 2b85b04..bd0f5f9 100644 --- a/src/player/player.gd +++ b/src/player/player.gd @@ -63,6 +63,7 @@ var _was_on_floor := false @onready var wide_spray: WideSpray = %WideSpray @onready var toothbrush: Tool = %Toothbrush @onready var mp3_player: Tool = %MP3Player +@onready var sticker_pack: Tool = %StickerPack @onready var crouch_head_area: Area3D = %CrouchHeadArea @onready var crouch_animation: AnimationPlayer = %CrouchAnimation @@ -173,7 +174,7 @@ func _on_milestone(milestone: Milestone) -> void: if milestone.toothbrush: tool_mount.set_active(toothbrush) if milestone.stickers: - pass # TODO equip stickers + tool_mount.set_active(sticker_pack) func _signal_death() -> void: @@ -211,6 +212,8 @@ func _physics_process(delta: float) -> void: tool_mount.set_active(toothbrush) elif Input.is_action_just_pressed("select_mp3_player"): tool_mount.set_active(mp3_player) + elif Input.is_action_just_pressed("select_stickers"): + tool_mount.set_active(sticker_pack) # Tool use if Input.is_action_pressed("fire"): diff --git a/src/player/player.tscn b/src/player/player.tscn index 12fc357..432c753 100644 --- a/src/player/player.tscn +++ b/src/player/player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=63 format=3 uid="uid://bwe2jdmvinhqd"] +[gd_scene load_steps=64 format=3 uid="uid://bwe2jdmvinhqd"] [ext_resource type="Script" uid="uid://buwh0g1ga2aka" path="res://src/player/player.gd" id="1_npueo"] [ext_resource type="Script" uid="uid://cx1yt0drthpw3" path="res://src/player/camera_controller.gd" id="2_veeqv"] @@ -10,6 +10,7 @@ [ext_resource type="PackedScene" uid="uid://c21ksxjyixqe1" path="res://src/equipment/mp3_player/mp3_player.tscn" id="7_e7e1q"] [ext_resource type="Script" uid="uid://b274q7uvn0cvp" path="res://src/ui/rumbler_3d.gd" id="7_p6grl"] [ext_resource type="Script" uid="uid://b1vyq7e81nyt0" path="res://src/player/headbob_controller.gd" id="7_x42xx"] +[ext_resource type="PackedScene" uid="uid://cmnokjbv3vuqt" path="res://src/equipment/sticker_pack/sticker_pack.tscn" id="8_xmpm3"] [ext_resource type="Script" uid="uid://ecrhsueph7at" path="res://src/player/footsteps/footstep_controller.gd" id="9_hja65"] [ext_resource type="Script" uid="uid://brqa2wbtaspw4" path="res://src/player/footsteps/foot_controller.gd" id="9_l271a"] [ext_resource type="AudioStream" uid="uid://di0e1l1l6l3qc" path="res://assets/sfx/footsteps/metal/metal1.wav" id="10_jcdrv"] @@ -626,6 +627,10 @@ visible = false unique_name_in_owner = true visible = false +[node name="StickerPack" parent="CameraPosition/CameraPivot/ToolMount" instance=ExtResource("8_xmpm3")] +unique_name_in_owner = true +visible = false + [node name="TransformedPosition" type="Node3D" parent="CameraPosition/CameraPivot"] [node name="CamRumbler" type="Node3D" parent="CameraPosition/CameraPivot/TransformedPosition"] diff --git a/src/world/world.tscn b/src/world/world.tscn index a67352d..4d2d566 100644 --- a/src/world/world.tscn +++ b/src/world/world.tscn @@ -4,7 +4,7 @@ [ext_resource type="Resource" uid="uid://tgac5tnfx56r" path="res://src/world/world_manager.tres" id="2_5kmgb"] [ext_resource type="PackedScene" uid="uid://byvjsvavbg5xe" path="res://src/ui/menus/pause_menu/pause_menu.tscn" id="2_6fy3g"] [ext_resource type="Resource" uid="uid://0i72bf8ip1lx" path="res://src/world/spook_manager.tres" id="3_l0av5"] -[ext_resource type="PackedScene" uid="uid://bov4ok76woyc" path="res://levels/ghost_ship/ghost_ship.tscn" id="4_5kmgb"] +[ext_resource type="PackedScene" uid="uid://dc4tts6342cuj" path="res://levels/prop_test/prop_test.tscn" id="4_5kmgb"] [ext_resource type="PackedScene" uid="uid://c0uitm5cg88h1" path="res://src/ui/menus/kill_screen/kill_screen.tscn" id="6_l0av5"] [ext_resource type="PackedScene" uid="uid://brknr57xc2cp0" path="res://src/ui/elements/save_icon/save_icon.tscn" id="7_5kmgb"] diff --git a/src/world/world_manager.tres b/src/world/world_manager.tres index 9feb715..cc6c094 100644 --- a/src/world/world_manager.tres +++ b/src/world/world_manager.tres @@ -301,7 +301,7 @@ vault_milestones = Dictionary[int, ExtResource("2_c37ff")]({ }) mp3_player_unlocked = false toothbrush_unlocked = false -stickers_unlocked = false +stickers_unlocked = true mp3_collection = Array[ExtResource("3_yiuq5")]([]) grunk_tank = 0.0 grunk_vault = 0.0 diff --git a/vault/TODO.md b/vault/TODO.md index 1267450..17b412f 100644 --- a/vault/TODO.md +++ b/vault/TODO.md @@ -45,7 +45,7 @@ - [ ] HUD tools: - [x] [[spray beam]] - [x] [[toothbrush]] - - [ ] [[mp3 player]] + - [x] [[mp3 player]] - [ ] [[manual]] - [ ] [[radar]] - [ ] [[roomba]]