From 86cd6933e3286820f60823bc9a79a08e0997c2d9 Mon Sep 17 00:00:00 2001 From: cakipaul Date: Tue, 7 Jan 2025 18:54:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B9=A6=E6=9E=B6=E5=B0=8F=E6=B8=B8=E6=88=8F?= =?UTF-8?q?=EF=BC=9A=E6=90=AD=E5=BB=BA=E5=9F=BA=E6=9C=AC=E7=8E=A9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- asset/art/little_game/书架/书架与书.aseprite | Bin 0 -> 2509 bytes asset/art/little_game/书架/书架与书.png | Bin 0 -> 1590 bytes asset/art/ui/chess.png | Bin 0 -> 817 bytes asset/art/ui/journal.aseprite | Bin 0 -> 4398 bytes asset/art/ui/journal.png | Bin 0 -> 3576 bytes config/animation/entity_sprite_frames.tres | 104 +++--- config/archive/assembled_archive.gd | 5 + manager/archive_manager/archive_manager.gd | 2 +- manager/config_manager/global_config.gd | 4 +- project.godot | 14 +- scene/entity/hd_entity.tscn | 1 - scene/entity/local_inspectable.tscn | 7 +- scene/entity/note.tscn | 4 +- scene/entity/pickable.tscn | 4 +- scene/entity/ux/sfx.gd | 40 +-- scene/entity/ux/sfx.tscn | 7 +- scene/ground/ground.tscn | 1 + scene/ground/ground_loader.gd | 6 +- scene/ground/scene/c02/s02_走道.tscn | 2 +- scene/hud/prop_hud.gd | 7 +- scene/hud/prop_hud.tscn | 23 +- scene/journal/journal.gd | 136 ++++++++ scene/journal/journal.tscn | 51 +++ scene/journal/journal_item.gd | 107 ++++++ scene/journal/journal_item.tscn | 44 +++ scene/journal/journal_tip.gd | 6 + scene/little_game/书架.gd | 149 +++++++++ scene/little_game/书架.tscn | 323 +++++++++++++++++++ scene/little_game/八音盒.gd | 49 +-- scene/little_game/旋转锁.gd | 6 +- scene/little_game/旋转锁.tscn | 20 +- scene/little_game/旋转锁_齿轮.gd | 6 +- scene/main.tscn | 17 +- scene/popup/prop_inspector.gd | 7 +- scene/popup/prop_inspector.tscn | 3 +- scene/shading/shading_layer.tscn | 8 +- 36 files changed, 1012 insertions(+), 151 deletions(-) create mode 100644 asset/art/little_game/书架/书架与书.aseprite create mode 100644 asset/art/little_game/书架/书架与书.png create mode 100644 asset/art/ui/chess.png create mode 100644 asset/art/ui/journal.aseprite create mode 100644 asset/art/ui/journal.png create mode 100644 scene/journal/journal.gd create mode 100644 scene/journal/journal.tscn create mode 100644 scene/journal/journal_item.gd create mode 100644 scene/journal/journal_item.tscn create mode 100644 scene/journal/journal_tip.gd create mode 100644 scene/little_game/书架.gd create mode 100644 scene/little_game/书架.tscn diff --git a/asset/art/little_game/书架/书架与书.aseprite b/asset/art/little_game/书架/书架与书.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..61bf43dee894fa293f927025683049a16a328368 GIT binary patch literal 2509 zcmX@h$-wYnDI>!d#$OB^42%p63@Jd20ND(TAVCHJAfyHG1=|1XBOBOOHlPJ!K+LWH zwi3xYZ=e7R$aUF&K7aW2{>{((x4xY^6wWL5>*L2Sk8XateBkEV$)T#;Ki|K3esTYe z?XwQgDEAlVd3NK}_DS`P-WI8*axTIgUv9p7xc20=gyn0LQX_aQFK#-zyJ^NE)A&kJ zS9eaO_ZP3sI9=;zr=*@|$yd3NUBtwonl1?^ZV?eD{J_3GyR2g+tnGc3#$*3)FU@%`+A ztDXKQd}L?YarufZKfOA8YmUJbccCafWW!{)LR3Ocit9-f_$mP84BzD8twp{p%k) zgPDN9%ZP9GFTIxU+bVu}ec87Y`ug=dS3Z5JxBdMq1A#e>4|rJ86)cz!N^+cYC}3+c zMiF|q(BbWTk7KeNUwp3{qR3!TJVb@Q2Q0YHQ?m0plkKX#znatTsoQ6%UpU;)z32VZ zjz$&FNpR%yF&4pDqW|(heRECSTMp0PW*npB$O{2PS^%ez@XY-PeDUcYfd6+w-3FYqhmPC}53+D7Up6%cJ@89#o zm!b@;*ZgCtZ(n-%3hU(4q6RY=nPDJWWU|h`4?E^2bR`@P*k_}hozI=4mfyLEJa`f|T zrEEnw-aI>V@7AKrr-F8@l=k=GxO#Q-{sUz*rx_Mz3hQaI-1vTW!PQRx6F#!D?6`cz zmY-goy*0;Rin~yh9o333++rC1#v6;^=oK3~(!o80Z zHr@0oJtpruM~K^Z*MZx)6+1M{8id57h1kvCUi@-!!o|*z&Czmw)*Mb(Hs4s2vAt2J zFNiPHh|T=VmoFzyoLIPUVQOlsj*ia%|NntOD(a^j45YG4g8YIRfI@Tv?*DV;85me} zJY5_^D(1Ys6WevyO~N&h|KNnoR-3kY|2>kLJZ~M7@10!x``3-^y`CYCoqrd|tJMAg zx)lg)Zs-5G!6L1EL*n2u4l}n6hE2VKIXwx(@fuj%U~1M!1Z zo-?`=_Ntt5-4G}AOesR2vsiG=^p>3**StrS(LX>``Hn5-Bpi|0qkE6+o15=1?tA&R zx#kR(=yopXRi~$`GDa=cg4?3o2MU+W|98< z>Cur;Fa+p2i`j+*6^~EOJxj<3#8}H|Hd~<7Nzo+*4(*LtSxoHMFOR-zE%E4oM+ztHYo%uPxReru7*^~;j&+eez z`O1FgUpL8)I1aO8t8XQD*+2YI^;A~%;J!I}HXJzf1=);T3K0RYIN?1lgU literal 0 HcmV?d00001 diff --git a/asset/art/ui/chess.png b/asset/art/ui/chess.png new file mode 100644 index 0000000000000000000000000000000000000000..93d37ee75b863c34e2c415078acc6cb0d0f7b80a GIT binary patch literal 817 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 N(fgp-dk@vi{{mgq>=yt4 literal 0 HcmV?d00001 diff --git a/asset/art/ui/journal.png b/asset/art/ui/journal.png new file mode 100644 index 0000000000000000000000000000000000000000..a3020fc55de7a09dbb3a400345a05a93d4195414 GIT binary patch literal 3576 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 kn{y+AV@2{B?(AEA$=~cTy%&p void: if not prop_inventory: prop_inventory = PropInventory.new() diff --git a/manager/archive_manager/archive_manager.gd b/manager/archive_manager/archive_manager.gd index 053e02da..531be5b6 100644 --- a/manager/archive_manager/archive_manager.gd +++ b/manager/archive_manager/archive_manager.gd @@ -34,8 +34,8 @@ func _ready() -> void: func _notification(what): # handle window close request if what == NOTIFICATION_WM_CLOSE_REQUEST: + save_all() if has_node("/root/Main"): - save_all() print("Saved all success before Quit") SceneManager.pop_notification("已保存所有数据") var tree = get_tree() diff --git a/manager/config_manager/global_config.gd b/manager/config_manager/global_config.gd index 09f10ac6..2cf6cc1f 100644 --- a/manager/config_manager/global_config.gd +++ b/manager/config_manager/global_config.gd @@ -7,8 +7,8 @@ const DEBUG = true const RES_FILE_FORMAT = ".tres" ## layers -const CANVAS_LAYER_PROP_INSPECTOR = 12 -const CANVAS_LAYER_UI = 11 +const CANVAS_LAYER_UI = 12 +const CANVAS_LAYER_PROP_INSPECTOR = 11 const CANVAS_LAYER_SHADING = 10 const CANVAS_LAYER_FG = 2 const CANVAS_LAYER_HD_ENTITY = 1 diff --git a/project.godot b/project.godot index 47c71369..8974842c 100644 --- a/project.godot +++ b/project.godot @@ -31,19 +31,18 @@ buses/default_bus_layout="res://config/default_bus_layout.tres" [autoload] -DebugMenu="*res://addons/debug_menu/debug_menu.tscn" +DebugMenu="res://addons/debug_menu/debug_menu.tscn" GlobalConfigManager="*res://manager/config_manager/global_config_manager.gd" ArchiveManager="*res://manager/archive_manager/archive_manager.gd" CameraFocusMarker="*res://scene/camera/camera_focus_marker.tscn" MainCamera="*res://scene/camera/main_camera.tscn" -ShadingLayer="res://scene/shading/shading_layer.tscn" SceneManager="*res://manager/deploy/scene/scene_manager.gd" AudioManager="*res://manager/audio_manager/audio_manager.gd" EventManager="*res://manager/event_manager/event_manager.gd" DialogManager="*res://manager/deploy/dialog/dialog_manager.gd" CgManager="*res://manager/cg_manager/cg_manager.gd" -InputManager="*res://manager/input/input_manager.gd" -DialogueManager="*res://addons/dialogue_manager/dialogue_manager.gd" +InputManager="res://manager/input/input_manager.gd" +DialogueManager="res://addons/dialogue_manager/dialogue_manager.gd" [dialogue_manager] @@ -131,6 +130,11 @@ prop_right={ , Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":16,"position":Vector2(427, 48),"global_position":Vector2(446, 139),"factor":0.0300018,"button_index":5,"canceled":false,"pressed":true,"double_click":false,"script":null) ] } +toggle_journal={ +"deadzone": 0.5, +"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":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null) +] +} [internationalization] @@ -142,6 +146,8 @@ locale/translations_pot_files=PackedStringArray("res://asset/dialogue/item_descr 2d_physics/layer_2="wall" 2d_physics/layer_3="interactable" 2d_physics/layer_4="hud_mouse" +2d_physics/layer_5="journal" +2d_physics/layer_6="journal_wall" [rendering] diff --git a/scene/entity/hd_entity.tscn b/scene/entity/hd_entity.tscn index 827ccb39..3baa8f30 100644 --- a/scene/entity/hd_entity.tscn +++ b/scene/entity/hd_entity.tscn @@ -15,7 +15,6 @@ script = ExtResource("1_fp2a8") [node name="Sfx" parent="." instance=ExtResource("2_jmpkt")] unique_name_in_owner = true -file = "物品查看.mp3" [node name="PointLight2D" type="PointLight2D" parent="."] unique_name_in_owner = true diff --git a/scene/entity/local_inspectable.tscn b/scene/entity/local_inspectable.tscn index 4c0cc3ad..789e5de9 100644 --- a/scene/entity/local_inspectable.tscn +++ b/scene/entity/local_inspectable.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=10 format=3 uid="uid://ci5anaxsa1apl"] +[gd_scene load_steps=11 format=3 uid="uid://ci5anaxsa1apl"] [ext_resource type="Script" path="res://scene/entity/local_inspectable.gd" id="1_85el0"] [ext_resource type="PackedScene" uid="uid://c85t6stvytvjn" path="res://scene/entity/ux/sfx.tscn" id="2_h0c2s"] +[ext_resource type="AudioStream" uid="uid://csdwhc83jshd3" path="res://asset/audio/sfx/ui/纸条.mp3" id="3_3ldx7"] [ext_resource type="Texture2D" uid="uid://t526pexw4ng4" path="res://asset/art/tool/neutral_point_light.webp" id="3_o562w"] [ext_resource type="Texture2D" uid="uid://dvg6wjwn1qxiv" path="res://asset/art/ui/action_mark/探索ui.png" id="4_bi35o"] [ext_resource type="Script" path="res://scene/entity/ux/sign.gd" id="5_vsfuq"] @@ -21,6 +22,7 @@ script = ExtResource("1_85el0") [node name="Sfx" parent="." instance=ExtResource("2_h0c2s")] unique_name_in_owner = true +stream = ExtResource("3_3ldx7") file = "纸条.mp3" [node name="PointLight2D" type="PointLight2D" parent="."] @@ -63,12 +65,14 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +mouse_filter = 2 [node name="Cover" type="TextureRect" parent="InspectLayer/AspectRatioContainer"] unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 4 size_flags_vertical = 4 +mouse_filter = 2 [node name="ContentLabel" type="Label" parent="InspectLayer/AspectRatioContainer"] unique_name_in_owner = true @@ -89,6 +93,7 @@ autowrap_mode = 3 [node name="MarginContainer" type="MarginContainer" parent="InspectLayer/AspectRatioContainer"] layout_mode = 2 size_flags_vertical = 8 +mouse_filter = 2 theme_override_constants/margin_bottom = 38 [node name="TipLabel" type="Label" parent="InspectLayer/AspectRatioContainer/MarginContainer"] diff --git a/scene/entity/note.tscn b/scene/entity/note.tscn index 18b859a3..9eefa737 100644 --- a/scene/entity/note.tscn +++ b/scene/entity/note.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=7 format=3 uid="uid://jr1yd46wm5je"] +[gd_scene load_steps=8 format=3 uid="uid://jr1yd46wm5je"] [ext_resource type="Script" path="res://scene/entity/note.gd" id="1_3igk8"] [ext_resource type="Texture2D" uid="uid://dvg6wjwn1qxiv" path="res://asset/art/ui/action_mark/探索ui.png" id="1_eew1k"] [ext_resource type="Script" path="res://scene/entity/ux/sign.gd" id="2_36okt"] [ext_resource type="PackedScene" uid="uid://c85t6stvytvjn" path="res://scene/entity/ux/sfx.tscn" id="2_qocmg"] [ext_resource type="Texture2D" uid="uid://t526pexw4ng4" path="res://asset/art/tool/neutral_point_light.webp" id="3_xb81s"] +[ext_resource type="AudioStream" uid="uid://csdwhc83jshd3" path="res://asset/audio/sfx/ui/纸条.mp3" id="3_y3pwa"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_k6och"] resource_local_to_scene = true @@ -16,6 +17,7 @@ notes = Array[String]([]) [node name="Sfx" parent="." instance=ExtResource("2_qocmg")] unique_name_in_owner = true +stream = ExtResource("3_y3pwa") file = "纸条.mp3" [node name="Sign" type="Sprite2D" parent="."] diff --git a/scene/entity/pickable.tscn b/scene/entity/pickable.tscn index 449f640a..c55a0576 100644 --- a/scene/entity/pickable.tscn +++ b/scene/entity/pickable.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=7 format=3 uid="uid://dsa6frlw6e6gg"] +[gd_scene load_steps=8 format=3 uid="uid://dsa6frlw6e6gg"] [ext_resource type="Script" path="res://scene/entity/pickable.gd" id="1_jk1u0"] [ext_resource type="PackedScene" uid="uid://c85t6stvytvjn" path="res://scene/entity/ux/sfx.tscn" id="2_8s5wk"] [ext_resource type="Texture2D" uid="uid://dvg6wjwn1qxiv" path="res://asset/art/ui/action_mark/探索ui.png" id="2_bggcm"] +[ext_resource type="AudioStream" uid="uid://c7r2qp78ukje" path="res://asset/audio/sfx/ui/令牌道具获取.wav" id="3_dxdbj"] [ext_resource type="Script" path="res://scene/entity/ux/sign.gd" id="3_hpbqf"] [ext_resource type="Texture2D" uid="uid://t526pexw4ng4" path="res://asset/art/tool/neutral_point_light.webp" id="5_yhysn"] @@ -15,6 +16,7 @@ script = ExtResource("1_jk1u0") [node name="Sfx" parent="." instance=ExtResource("2_8s5wk")] unique_name_in_owner = true +stream = ExtResource("3_dxdbj") file = "令牌道具获取.wav" [node name="Sign" type="Sprite2D" parent="."] diff --git a/scene/entity/ux/sfx.gd b/scene/entity/ux/sfx.gd index e6a35663..d79fabec 100644 --- a/scene/entity/ux/sfx.gd +++ b/scene/entity/ux/sfx.gd @@ -1,15 +1,15 @@ @tool -class_name Sfx extends Node +class_name Sfx extends AudioStreamPlayer -@export var volume_db := 0.0 +# @export var volume_db := 0.0 @export_enum("child", "game/八音盒", "game/旋转锁", "ghost", "lvping", "ui", "c01", "c02") var dir := "ui": set(value): dir = value _update_files() #@export var file: String = "": - #set(val): - #if val and current_files.has(val): - #file = val +#set(val): +#if val and current_files.has(val): +#file = val var file: String var sfx_root_path = "res://asset/audio/sfx/" @@ -19,6 +19,7 @@ var sfx: AudioStream func _ready() -> void: _update_files() + bus = &"game_sfx" func _reload_sfx(): if file and dir: @@ -26,6 +27,7 @@ func _reload_sfx(): sfx = load(sfx_root_path + dir + "/" + file) as AudioStream else: sfx = null + stream = sfx func _update_files(): @@ -37,10 +39,10 @@ func _update_files(): if f.ends_with(".wav") or f.ends_with(".ogg") or f.ends_with(".mp3"): current_files.push_back(f) #for d in dir_access.get_directories(): - #var sub_dir_access := DirAccess.open(sfx_root_path + dir + "/" + d) as DirAccess - #for f in sub_dir_access.get_files(): - #if f.ends_with(".wav") or f.ends_with(".ogg") or f.ends_with(".mp3"): - #current_files.push_back(d + "/" + f) + #var sub_dir_access := DirAccess.open(sfx_root_path + dir + "/" + d) as DirAccess + #for f in sub_dir_access.get_files(): + #if f.ends_with(".wav") or f.ends_with(".ogg") or f.ends_with(".mp3"): + #current_files.push_back(d + "/" + f) if current_files.is_empty(): file = "" elif not file or not current_files.has(file): @@ -50,14 +52,15 @@ func _update_files(): #func _property_can_revert(property: StringName) -> bool: - #if property == &"file": - #return true - #return false +#if property == &"file": +#return true +#return false # #func _property_get_revert(property: StringName) -> Variant: - #if property == &"file": - #return "" - #return null +#if property == &"file": +#return "" +#return null + func _get_property_list(): return [ @@ -84,7 +87,6 @@ func _set(property: StringName, value: Variant) -> bool: return true return false - -func play() -> void: - if sfx: - AudioManager.play_sfx(sfx, volume_db) +# func play() -> void: +# if sfx: +# AudioManager.play_sfx(sfx, volume_db) diff --git a/scene/entity/ux/sfx.tscn b/scene/entity/ux/sfx.tscn index 8ce2bf3b..cb67bddb 100644 --- a/scene/entity/ux/sfx.tscn +++ b/scene/entity/ux/sfx.tscn @@ -1,7 +1,10 @@ -[gd_scene load_steps=2 format=3 uid="uid://c85t6stvytvjn"] +[gd_scene load_steps=3 format=3 uid="uid://c85t6stvytvjn"] [ext_resource type="Script" path="res://scene/entity/ux/sfx.gd" id="1_ng32y"] +[ext_resource type="AudioStream" uid="uid://casyb01uck7nn" path="res://asset/audio/sfx/ui/click.wav" id="1_xj6dy"] -[node name="Sfx" type="Node"] +[node name="Sfx" type="AudioStreamPlayer"] +stream = ExtResource("1_xj6dy") +bus = &"game_sfx" script = ExtResource("1_ng32y") file = "click.wav" diff --git a/scene/ground/ground.tscn b/scene/ground/ground.tscn index 0127c94b..579fa695 100644 --- a/scene/ground/ground.tscn +++ b/scene/ground/ground.tscn @@ -73,6 +73,7 @@ centered = false offset_right = 2256.0 offset_bottom = 1268.0 scale = Vector2(0.25, 0.25) +mouse_filter = 2 [node name="SubViewport" type="SubViewport" parent="SubViewportContainer"] transparent_bg = true diff --git a/scene/ground/ground_loader.gd b/scene/ground/ground_loader.gd index 6b85afd2..1fe8b577 100644 --- a/scene/ground/ground_loader.gd +++ b/scene/ground/ground_loader.gd @@ -125,12 +125,12 @@ func _set_camera_and_player_boundary(): # set current_boarder by bg size if bg.texture and not Engine.is_editor_hint(): var size = bg.texture.get_size() - # screen min height is 316px - var up_left = Vector2(0, -size.y / 2.0) # camera rect var camera_size = Vector2(max(564.0, size.x), max(size.y, 316.0)) - var camera_rect = Rect2(up_left, camera_size) + var camera_upleft = Vector2(0, -camera_size.y / 2.0) + var camera_rect = Rect2(camera_upleft, camera_size) # player rect should be set centered, with 30px x padding + var up_left = Vector2(0, -size.y / 2.0) size.x -= 36.0 up_left.x = bg.position.x + 18.0 var player_rect = Rect2(up_left, size) diff --git a/scene/ground/scene/c02/s02_走道.tscn b/scene/ground/scene/c02/s02_走道.tscn index 99c11fe0..7f2e4bd8 100644 --- a/scene/ground/scene/c02/s02_走道.tscn +++ b/scene/ground/scene/c02/s02_走道.tscn @@ -33,7 +33,7 @@ size = Vector2(35, 70) [node name="Ground" parent="." instance=ExtResource("1_wrr6r")] scene_config = SubResource("Resource_hd50m") -[node name="BGSprite2D" parent="Ground" index="0"] +[node name="BGSprite2D" parent="Ground" index="1"] texture = ExtResource("2_cn1s8") [node name="PortalLeft" parent="Ground/DeployLayer" index="0"] diff --git a/scene/hud/prop_hud.gd b/scene/hud/prop_hud.gd index 646d7268..28db4eda 100644 --- a/scene/hud/prop_hud.gd +++ b/scene/hud/prop_hud.gd @@ -1,5 +1,5 @@ @tool -class_name PropHud extends CanvasItem +class_name PropHud extends Control @export_group("DebugItem") @export var add_item := false: @@ -31,7 +31,6 @@ class_name PropHud extends CanvasItem @onready var prop_container = %PropContainer as Container @onready var mark = %Mark as TextureRect @onready var title_label = %TitleLabel as Label -@onready var mouse_detector = %MouseDetector as StaticBody2D var cached_inventory_textures := {} @@ -62,8 +61,8 @@ func _ready() -> void: # _toggle_btn_ability(false) left_btn.modulate.a = 0.5 right_btn.modulate.a = 0.5 - mouse_detector.mouse_entered.connect(_on_mouse_entered) - mouse_detector.mouse_exited.connect(_on_mouse_exited) + mouse_entered.connect(_on_mouse_entered) + mouse_exited.connect(_on_mouse_exited) selected = selected diff --git a/scene/hud/prop_hud.tscn b/scene/hud/prop_hud.tscn index a84e599c..d77efa33 100644 --- a/scene/hud/prop_hud.tscn +++ b/scene/hud/prop_hud.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=11 format=3 uid="uid://dc778gsjfr3ky"] +[gd_scene load_steps=10 format=3 uid="uid://dc778gsjfr3ky"] [ext_resource type="Script" path="res://scene/hud/prop_hud.gd" id="1_bbv0a"] [ext_resource type="Texture2D" uid="uid://chyumeohdhwnh" path="res://asset/art/ui/hud/normal_left.png" id="2_bjc2b"] @@ -10,22 +10,23 @@ [ext_resource type="Texture2D" uid="uid://boqpr7i2a5uan" path="res://asset/art/ui/hud/normal_right.png" id="10_vkaik"] [ext_resource type="Texture2D" uid="uid://daj2n408y2vfp" path="res://asset/art/ui/hud/pressed_right.png" id="11_a512b"] -[sub_resource type="RectangleShape2D" id="RectangleShape2D_oki4y"] -size = Vector2(646.667, 416.667) - [node name="PropHUD" type="Control"] +custom_minimum_size = Vector2(600, 500) layout_mode = 3 anchors_preset = 0 offset_left = 8.0 offset_top = 4.0 -offset_right = 8.0 -offset_bottom = 4.0 +offset_right = 608.0 +offset_bottom = 504.0 scale = Vector2(0.3, 0.3) +mouse_filter = 1 script = ExtResource("1_bbv0a") [node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 0 offset_right = 40.0 offset_bottom = 40.0 +mouse_filter = 0 [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] layout_mode = 2 @@ -126,13 +127,3 @@ layout_mode = 2 size_flags_horizontal = 4 theme_override_font_sizes/font_size = 42 text = "1012钥匙" - -[node name="MouseDetector" type="StaticBody2D" parent="."] -unique_name_in_owner = true -collision_layer = 8 -collision_mask = 8 -input_pickable = true - -[node name="CollisionShape2D" type="CollisionShape2D" parent="MouseDetector"] -position = Vector2(256.667, 171.667) -shape = SubResource("RectangleShape2D_oki4y") diff --git a/scene/journal/journal.gd b/scene/journal/journal.gd new file mode 100644 index 00000000..bef8e884 --- /dev/null +++ b/scene/journal/journal.gd @@ -0,0 +1,136 @@ +@tool +extends Control + +@export var locked := false: + set(val): + locked = val + if is_node_ready() and locked: + display = false +@export var display := false: + set(val): + if is_node_ready() and display != val: + _toggle_display() + display = val +@export var boundart_rect := Rect2(0, 0, 1000, 1000): + set(val): + boundart_rect = val + queue_redraw() +@export_group("Tip", "tip_") +@export var tip_content := "": + set(val): + tip_content = val + if is_node_ready(): + reload() +@export var tip_font_size := 12 +@export var tip_font_color := Color(1, 1, 1) +@export var tip_item_position := Vector2(220, 220) + +@onready var tip_container = $Tips as GridContainer +@onready var items_root = $ItemsRoot as Node2D + +var sty_box_empty := StyleBoxEmpty.new() + +var item_scene := preload("res://scene/journal/journal_item.tscn") +var tip_script := preload("res://scene/journal/journal_tip.gd") +var item_script := preload("res://scene/journal/journal_item.gd") +var items_dict := {} + + +func _ready() -> void: + reload() + _toggle_display(false) + + +func reload(): + for c in tip_container.get_children(): + c.queue_free() + for v in items_dict.values(): + v.queue_free() + items_dict.clear() + var btn_name_prefix = "tip_btn_" + for i in range(tip_content.length()): + var tip = tip_content[i] as String + var btn_margin = MarginContainer.new() + btn_margin.set("theme_override_constants/margin_left", -5) + btn_margin.set("theme_override_constants/margin_right", -5) + btn_margin.set("theme_override_constants/margin_top", -4) + btn_margin.set("theme_override_constants/margin_bottom", -4) + var tip_btn = Button.new() + tip_btn.flat = true + tip_btn.text = tip + tip_btn.toggle_mode = true + tip_btn.set("theme_override_styles/focus", sty_box_empty) + tip_btn.set("theme_override_font_sizes/font_size", tip_font_size) + tip_btn.custom_minimum_size = Vector2(tip_font_size, tip_font_size) + tip_btn.add_theme_color_override("font_color", tip_font_color) + tip_btn.size_flags_horizontal = Control.SIZE_SHRINK_CENTER + tip_btn.size_flags_vertical = Control.SIZE_SHRINK_CENTER + tip_btn.set_script(tip_script) + tip_btn.toggled.connect(_on_toggle_btn.bind(tip, tip_btn)) + tip_btn.name = btn_name_prefix + str(i) + btn_margin.add_child(tip_btn) + tip_container.add_child(btn_margin) + # items_dict[tip] = tip_btn + + +func _on_toggle_btn(toggled_on: bool, content: String, btn) -> void: + if not toggled_on and items_dict.has(btn.name): + items_dict[btn.name].queue_free() + items_dict.erase(content) + elif toggled_on: + var item = item_scene.instantiate() + item.label_text = content + item.boundart_rect = boundart_rect + item.position = tip_item_position + Vector2(randf_range(-10, 10), randf_range(-10, 10)) + items_root.add_child(item) + items_dict[btn.name] = item + + +func _draw() -> void: + if Engine.is_editor_hint(): + # draw boundart_rect frame + draw_rect(boundart_rect, Color(1, 0, 0), false, 2) + + +var display_tween: Tween + + +func _toggle_display(use_tween := true): + if display_tween and display_tween.is_running(): + display_tween.kill() + if display: + if use_tween: + display_tween = create_tween() + # from bottom to top + display_tween.tween_property(self, "position:y", 0.0, 0.5).set_trans(Tween.TRANS_CUBIC) + # unlock items after display + display_tween.tween_callback(_toggle_items_lock.bind(false)) + else: + position.y = 0 + _toggle_items_lock(false) + else: + # lock items before hide + _toggle_items_lock(true) + if use_tween: + display_tween = create_tween() + # from top to bottom + display_tween.tween_property(self, "position:y", 320.0, 0.5).set_trans( + Tween.TRANS_CUBIC + ) + else: + position.y = 320.0 + + +func _toggle_items_lock(lock: bool) -> void: + for v in items_dict.values(): + v.locked = lock + + +func _unhandled_input(event: InputEvent) -> void: + if event.is_action_pressed("toggle_journal"): + if locked: + # TODO 使用 icon,去重 + SceneManager.pop_notification("🔒") + return + display = !display + get_viewport().set_input_as_handled() diff --git a/scene/journal/journal.tscn b/scene/journal/journal.tscn new file mode 100644 index 00000000..1c5fa4f3 --- /dev/null +++ b/scene/journal/journal.tscn @@ -0,0 +1,51 @@ +[gd_scene load_steps=4 format=3 uid="uid://cvbt5qm70cg7t"] + +[ext_resource type="Texture2D" uid="uid://b1b005cqrjuek" path="res://asset/art/ui/journal.png" id="1_l07pp"] +[ext_resource type="Script" path="res://scene/journal/journal.gd" id="1_y2537"] +[ext_resource type="Texture2D" uid="uid://cvpb70uqj12r2" path="res://asset/art/little_game/八音盒/有按钮.png" id="2_3e7j3"] + +[node name="Journal" type="CanvasLayer"] +layer = 20 + +[node name="JournalRoot" type="Control" parent="."] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = 320.0 +offset_bottom = 320.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("1_y2537") +locked = true + +[node name="JournalPage" type="TextureRect" parent="JournalRoot"] +show_behind_parent = true +layout_mode = 0 +offset_right = 40.0 +offset_bottom = 40.0 +rotation = 0.00704862 +mouse_filter = 2 +texture = ExtResource("1_l07pp") + +[node name="EntityPic" type="TextureRect" parent="JournalRoot"] +layout_mode = 0 +offset_left = 138.0 +offset_top = 67.0 +offset_right = 702.0 +offset_bottom = 307.0 +rotation = 0.00262768 +scale = Vector2(0.249104, 0.24444) +mouse_filter = 2 +texture = ExtResource("2_3e7j3") + +[node name="Tips" type="GridContainer" parent="JournalRoot"] +layout_mode = 1 +offset_left = 262.0 +offset_top = 50.0 +offset_right = 382.0 +offset_bottom = 90.0 +columns = 12 + +[node name="ItemsRoot" type="Node2D" parent="JournalRoot"] diff --git a/scene/journal/journal_item.gd b/scene/journal/journal_item.gd new file mode 100644 index 00000000..9289855c --- /dev/null +++ b/scene/journal/journal_item.gd @@ -0,0 +1,107 @@ +extends CharacterBody2D + +@export var locked := false: + set(val): + locked = val + if locked: + listening = false + dragging = false + mouse_inside = false + if is_node_ready(): + $CollisionShape2D.disabled = locked +@export var label_text := "角": + set(val): + label_text = val + if is_node_ready(): + $Label.text = label_text +@export var boundart_rect := Rect2(0, 0, 1000, 1000) + +static var occupied := false +static var mutex := Mutex.new() +var target_position := Vector2() + +# draggable +var listening := false +var mouse_inside := false +var dragging := false: + set(val): + if dragging == val: + return + var success = false + if val: + mutex.lock() + dragging = !occupied + if dragging: + success = true + occupied = true + Input.set_default_cursor_shape(Input.CURSOR_DRAG) + mutex.unlock() + else: + mutex.lock() + if dragging: + dragging = false + occupied = false + Input.set_default_cursor_shape(Input.CURSOR_ARROW) + mutex.unlock() + if success: + _move_front() + + +func _ready(): + $CollisionShape2D.disabled = locked + $Label.text = label_text + target_position = global_position + mouse_entered.connect(_on_mouse_entered) + mouse_exited.connect(_on_mouse_exited) + + +func _move_front(): + var parent = get_parent() + if not parent: + return + parent.move_child(self, parent.get_child_count() - 1) + + +func _on_mouse_entered(): + listening = true + mouse_inside = true + + +func _on_mouse_exited(): + mouse_inside = false + if not dragging: + listening = false + + +func _physics_process(_delta: float) -> void: + if not locked and not dragging: + move_and_slide() + _clamp_position() + target_position = position + + +func _unhandled_input(event: InputEvent) -> void: + if locked or not listening: + return + if event is InputEventMouseButton: + if event.button_index == MOUSE_BUTTON_LEFT: + if dragging and not mouse_inside: + listening = false + dragging = false + else: + dragging = event.pressed + + if dragging and event is InputEventMouseMotion: + var new_pos = event.position + target_position = new_pos + position = target_position + _clamp_position() + + +func _clamp_position(): + position.x = clamp( + position.x, boundart_rect.position.x, boundart_rect.position.x + boundart_rect.size.x + ) + position.y = clamp( + position.y, boundart_rect.position.y, boundart_rect.position.y + boundart_rect.size.y + ) diff --git a/scene/journal/journal_item.tscn b/scene/journal/journal_item.tscn new file mode 100644 index 00000000..ca86822a --- /dev/null +++ b/scene/journal/journal_item.tscn @@ -0,0 +1,44 @@ +[gd_scene load_steps=5 format=3 uid="uid://c02f7iylaxl75"] + +[ext_resource type="Script" path="res://scene/journal/journal_item.gd" id="1_v5jv8"] +[ext_resource type="Texture2D" uid="uid://c1vafh15sxhrs" path="res://asset/art/ui/chess.png" id="2_aol7i"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_l31y8"] +atlas = ExtResource("2_aol7i") +region = Rect2(7, 0, 28, 26) + +[sub_resource type="CircleShape2D" id="CircleShape2D_w4qy1"] +radius = 12.0 + +[node name="JournalItem" type="CharacterBody2D"] +collision_layer = 16 +collision_mask = 16 +input_pickable = true +motion_mode = 1 +platform_wall_layers = 32 +script = ExtResource("1_v5jv8") +locked = null +label_text = null +boundart_rect = null + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture = SubResource("AtlasTexture_l31y8") + +[node name="Label" type="Label" parent="."] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -6.0 +offset_top = -7.0 +offset_right = 34.0 +offset_bottom = 8.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 4 +theme_override_colors/font_color = Color(0.212185, 0.145932, 0.00506154, 1) +text = "角" + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_w4qy1") diff --git a/scene/journal/journal_tip.gd b/scene/journal/journal_tip.gd new file mode 100644 index 00000000..7e035573 --- /dev/null +++ b/scene/journal/journal_tip.gd @@ -0,0 +1,6 @@ +extends Button + + +func _draw() -> void: + if button_pressed: + draw_circle(Vector2(9, 9), 6, Color(0, 0.5, 0, 0.5)) diff --git a/scene/little_game/书架.gd b/scene/little_game/书架.gd new file mode 100644 index 00000000..49c260da --- /dev/null +++ b/scene/little_game/书架.gd @@ -0,0 +1,149 @@ +extends Control + +const NON_SELECTED = [-1, -1] +# 3 layers, original order is the correct answer +@export var current_answer := [[0, 1, 2, 3, 4], [0, 1, 2, 3], [0, 1, 2, 3]] + +@onready var sfx_select = $SfxSelect as Sfx +@onready var sfx_interchange = $SfxInterchange as Sfx + +var book_width_by_row := [] + +var suffling := false +# [row, col] +var selected_book := NON_SELECTED: + set(value): + if selected_book == value: + return + if suffling: + selected_book = value + return + if selected_book != NON_SELECTED: + _toggle_book(false, selected_book[0], selected_book[1]) + if value != NON_SELECTED: + _toggle_book(true, value[0], value[1]) + selected_book = value + + +func _ready() -> void: + _measure_width_by_row() + _connect_signals() + # shuffle at the end + _shuffle_books() + + +func _measure_width_by_row() -> void: + for row in range(3): + var length = current_answer[row].size() + var width_arr = [] + for col in range(length): + var book_btn = _get_book_by_id(row, col).get_node("BookButton") as TextureButton + # book_btn.position.y = -book_btn.texture_normal.get_height() + # book_btn.size = book_btn.texture_normal.get_size() + # add 1 to avoid the gap between books + width_arr.append(book_btn.texture_normal.get_width() + 1) + book_width_by_row.append(width_arr) + + +func _shuffle_books() -> void: + selected_book = NON_SELECTED + suffling = true + for row in range(3): + # shuffle each row 20 times + var r_size = current_answer[row].size() + for _i in range(20): + var col_1 = randi() % r_size + var col_2 = randi() % r_size + selected_book = [row, col_1] + _interchange_book(row, col_2, false) + _relocate_books(row) + # turn off initilazing after shuffle + suffling = false + + +func _connect_signals() -> void: + for row in range(3): + var r_size = current_answer[row].size() + for id in range(r_size): + var book = _get_book_by_id(row, id) + book.get_node("BookButton").pressed.connect(_on_book_pressed.bind(row, id)) + + +func _on_book_pressed(row: int, id: int) -> void: + var col = current_answer[row].find(id) + if selected_book == NON_SELECTED: + selected_book = [row, col] + else: + if selected_book == [row, col]: + selected_book = NON_SELECTED + elif selected_book[0] == row: + _interchange_book(row, col) + else: + selected_book = [row, col] + + +func _get_book_by_id(row: int, id: int) -> Node2D: + return get_node("./Shelf/Layer" + str(row) + "/Book" + str(id)) + + +# func _get_book_by_pos(row: int, col: int) -> Node2D: +# var layer = get_node("./Shelf/Layer" + str(row)) +# return layer.get_child(col) + + +func _toggle_book(selected: bool, row: int, col: int) -> void: + var id = current_answer[row][col] + var book = _get_book_by_id(row, id) + var book_tween = create_tween() + sfx_select.play() + if selected: + book_tween.parallel().tween_property(book, "position:y", -10.0, 0.2) + else: + book_tween.parallel().tween_property(book, "position:y", 0.0, 0.2) + + +func _interchange_book(row: int, col: int, relocate := true) -> void: + if selected_book == NON_SELECTED or selected_book[0] != row: + return + var col2 = selected_book[1] + sfx_interchange.play() + # interchange current_answer + var temp = current_answer[row][col] + current_answer[row][col] = current_answer[row][col2] + current_answer[row][col2] = temp + # reset selected_book + selected_book = NON_SELECTED + # relocate after reset selected_book + if relocate: + _relocate_books(row) + # check answer + _check_answer() + + +func _relocate_books(row: int) -> void: + selected_book = NON_SELECTED + var r_size = current_answer[row].size() + var x = 0 + for col in range(r_size): + var id = current_answer[row][col] + var book = _get_book_by_id(row, id) + book.position.x = x + book.position.y = 0.0 + x += book_width_by_row[row][id] + + +func _check_answer() -> void: + for row in range(3): + var r_size = current_answer[row].size() + for col in range(r_size): + if current_answer[row][col] != col: + return + # success + _success() + + +func _success() -> void: + print("Success!") + $Success.visible = true + #TODO + pass diff --git a/scene/little_game/书架.tscn b/scene/little_game/书架.tscn new file mode 100644 index 00000000..8f7d26aa --- /dev/null +++ b/scene/little_game/书架.tscn @@ -0,0 +1,323 @@ +[gd_scene load_steps=17 format=3 uid="uid://fwfr0b2sylwx"] + +[ext_resource type="Script" path="res://scene/little_game/书架.gd" id="1_8af23"] +[ext_resource type="Texture2D" uid="uid://csrb0kuf5qx80" path="res://asset/art/little_game/书架/书架与书.png" id="1_bap6w"] +[ext_resource type="AudioStream" uid="uid://bxfm22t1rj2cq" path="res://asset/audio/sfx/ui/收起纸条.mp3" id="2_glfpo"] +[ext_resource type="PackedScene" uid="uid://c85t6stvytvjn" path="res://scene/entity/ux/sfx.tscn" id="3_03tyv"] +[ext_resource type="AudioStream" uid="uid://bpdot5dxm6vwi" path="res://asset/audio/sfx/ui/挂画查看.mp3" id="3_elhhm"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_goijy"] +atlas = ExtResource("1_bap6w") +region = Rect2(1, 14, 417, 224) + +[sub_resource type="AtlasTexture" id="AtlasTexture_c3g4t"] +atlas = ExtResource("1_bap6w") +region = Rect2(12, 254, 15, 61) + +[sub_resource type="AtlasTexture" id="AtlasTexture_pmg84"] +atlas = ExtResource("1_bap6w") +region = Rect2(34, 261, 13, 54) + +[sub_resource type="AtlasTexture" id="AtlasTexture_5xs8h"] +atlas = ExtResource("1_bap6w") +region = Rect2(58, 264, 13, 49) + +[sub_resource type="AtlasTexture" id="AtlasTexture_4cxbt"] +atlas = ExtResource("1_bap6w") +region = Rect2(80, 272, 10, 41) + +[sub_resource type="AtlasTexture" id="AtlasTexture_x1voy"] +atlas = ExtResource("1_bap6w") +region = Rect2(95, 277, 9, 35) + +[sub_resource type="AtlasTexture" id="AtlasTexture_4i6n2"] +atlas = ExtResource("1_bap6w") +region = Rect2(12, 254, 15, 61) + +[sub_resource type="AtlasTexture" id="AtlasTexture_3jfnd"] +atlas = ExtResource("1_bap6w") +region = Rect2(34, 261, 13, 54) + +[sub_resource type="AtlasTexture" id="AtlasTexture_b3xvs"] +atlas = ExtResource("1_bap6w") +region = Rect2(12, 254, 15, 61) + +[sub_resource type="AtlasTexture" id="AtlasTexture_pv5xt"] +atlas = ExtResource("1_bap6w") +region = Rect2(80, 272, 10, 41) + +[sub_resource type="AtlasTexture" id="AtlasTexture_0m1py"] +atlas = ExtResource("1_bap6w") +region = Rect2(112, 279, 9, 32) + +[node name="书架" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("1_8af23") + +[node name="SfxInterchange" parent="." instance=ExtResource("3_03tyv")] +stream = ExtResource("3_elhhm") +file = "挂画查看.mp3" + +[node name="SfxSelect" parent="." instance=ExtResource("3_03tyv")] +stream = ExtResource("2_glfpo") +file = "收起纸条.mp3" + +[node name="BG" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = 14 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +offset_top = -120.0 +offset_bottom = 120.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +color = Color(0.0404907, 0.185259, 0.00063979, 1) + +[node name="Shelf" type="Sprite2D" parent="."] +position = Vector2(283, 160) +texture = SubResource("AtlasTexture_goijy") + +[node name="Layer0" type="Control" parent="Shelf"] +layout_mode = 3 +anchors_preset = 0 +offset_left = -125.0 +offset_top = -9.0 +offset_right = -125.0 +offset_bottom = -9.0 + +[node name="Book0" type="Node2D" parent="Shelf/Layer0"] + +[node name="BookButton" type="TextureButton" parent="Shelf/Layer0/Book0"] +clip_contents = true +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_top = -49.0 +offset_right = 13.0 +grow_vertical = 0 +texture_normal = SubResource("AtlasTexture_c3g4t") +metadata/_edit_use_anchors_ = true + +[node name="Book1" type="Node2D" parent="Shelf/Layer0"] +position = Vector2(50.5455, 0.818183) + +[node name="BookButton" type="TextureButton" parent="Shelf/Layer0/Book1"] +clip_contents = true +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_top = -49.0 +offset_right = 13.0 +grow_vertical = 0 +texture_normal = SubResource("AtlasTexture_pmg84") +metadata/_edit_use_anchors_ = true + +[node name="Book2" type="Node2D" parent="Shelf/Layer0"] +position = Vector2(98.2728, 0.818183) + +[node name="BookButton" type="TextureButton" parent="Shelf/Layer0/Book2"] +clip_contents = true +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_top = -49.0 +offset_right = 13.0 +grow_vertical = 0 +texture_normal = SubResource("AtlasTexture_5xs8h") +metadata/_edit_use_anchors_ = true + +[node name="Book3" type="Node2D" parent="Shelf/Layer0"] +position = Vector2(98.2728, 0.818183) + +[node name="BookButton" type="TextureButton" parent="Shelf/Layer0/Book3"] +clip_contents = true +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_top = -41.0 +offset_right = 10.0 +grow_vertical = 0 +texture_normal = SubResource("AtlasTexture_4cxbt") +metadata/_edit_use_anchors_ = true + +[node name="Book4" type="Node2D" parent="Shelf/Layer0"] +position = Vector2(98.2728, 0.818183) + +[node name="BookButton" type="TextureButton" parent="Shelf/Layer0/Book4"] +clip_contents = true +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_top = -35.0 +offset_right = 9.0 +grow_vertical = 0 +texture_normal = SubResource("AtlasTexture_x1voy") + +[node name="Layer1" type="Control" parent="Shelf"] +layout_mode = 3 +anchors_preset = 0 +offset_left = -167.0 +offset_top = 97.0 +offset_right = -167.0 +offset_bottom = 97.0 + +[node name="Book0" type="Node2D" parent="Shelf/Layer1"] + +[node name="BookButton" type="TextureButton" parent="Shelf/Layer1/Book0"] +clip_contents = true +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_top = -49.0 +offset_right = 13.0 +grow_vertical = 0 +texture_normal = SubResource("AtlasTexture_4i6n2") + +[node name="Book1" type="Node2D" parent="Shelf/Layer1"] +position = Vector2(50.5455, 0.818183) + +[node name="BookButton" type="TextureButton" parent="Shelf/Layer1/Book1"] +clip_contents = true +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_top = -49.0 +offset_right = 13.0 +grow_vertical = 0 +texture_normal = SubResource("AtlasTexture_3jfnd") + +[node name="Book2" type="Node2D" parent="Shelf/Layer1"] +position = Vector2(98.2728, 0.818183) + +[node name="BookButton" type="TextureButton" parent="Shelf/Layer1/Book2"] +clip_contents = true +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_top = -49.0 +offset_right = 13.0 +grow_vertical = 0 +texture_normal = SubResource("AtlasTexture_5xs8h") + +[node name="Book3" type="Node2D" parent="Shelf/Layer1"] +position = Vector2(98.2728, 0.818183) + +[node name="BookButton" type="TextureButton" parent="Shelf/Layer1/Book3"] +clip_contents = true +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_top = -41.0 +offset_right = 10.0 +grow_vertical = 0 +texture_normal = SubResource("AtlasTexture_4cxbt") + +[node name="Layer2" type="Control" parent="Shelf"] +layout_mode = 3 +anchors_preset = 0 +offset_left = 28.0 +offset_top = 97.0 +offset_right = 28.0 +offset_bottom = 97.0 + +[node name="Book0" type="Node2D" parent="Shelf/Layer2"] + +[node name="BookButton" type="TextureButton" parent="Shelf/Layer2/Book0"] +clip_contents = true +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_top = -61.0 +offset_right = 15.0 +grow_vertical = 0 +texture_normal = SubResource("AtlasTexture_b3xvs") + +[node name="Book1" type="Node2D" parent="Shelf/Layer2"] +position = Vector2(50.5455, 0.818183) + +[node name="BookButton" type="TextureButton" parent="Shelf/Layer2/Book1"] +clip_contents = true +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_top = -49.0 +offset_right = 13.0 +grow_vertical = 0 +texture_normal = SubResource("AtlasTexture_5xs8h") + +[node name="Book2" type="Node2D" parent="Shelf/Layer2"] +position = Vector2(98.2728, 0.818183) + +[node name="BookButton" type="TextureButton" parent="Shelf/Layer2/Book2"] +clip_contents = true +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_top = -41.0 +offset_right = 10.0 +grow_vertical = 0 +texture_normal = SubResource("AtlasTexture_pv5xt") + +[node name="Book3" type="Node2D" parent="Shelf/Layer2"] +position = Vector2(98.2728, 0.818183) + +[node name="BookButton" type="TextureButton" parent="Shelf/Layer2/Book3"] +clip_contents = true +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_top = -32.0 +offset_right = 9.0 +grow_vertical = 0 +texture_normal = SubResource("AtlasTexture_0m1py") + +[node name="ColorRectTop" type="ColorRect" parent="."] +unique_name_in_owner = true +visible = false +custom_minimum_size = Vector2(564, 38.5) +layout_mode = 1 +anchors_preset = 5 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = -282.0 +offset_right = 282.0 +offset_bottom = 40.0 +grow_horizontal = 2 +mouse_filter = 2 +color = Color(0, 0, 0, 1) + +[node name="ColorRectBottom" type="ColorRect" parent="."] +unique_name_in_owner = true +visible = false +custom_minimum_size = Vector2(564, 38.5) +layout_mode = 1 +anchors_preset = 7 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -282.0 +offset_top = -38.5 +offset_right = 282.0 +grow_horizontal = 2 +grow_vertical = 0 +mouse_filter = 2 +color = Color(0, 0, 0, 1) + +[node name="Success" type="Label" parent="."] +visible = false +layout_mode = 0 +offset_left = 230.0 +offset_top = 142.0 +offset_right = 310.0 +offset_bottom = 191.0 +theme_override_font_sizes/font_size = 40 +text = "成功" diff --git a/scene/little_game/八音盒.gd b/scene/little_game/八音盒.gd index 90ffb08e..a7085ad2 100644 --- a/scene/little_game/八音盒.gd +++ b/scene/little_game/八音盒.gd @@ -1,12 +1,15 @@ extends Control # answer for the puzzle, by columns -@export var current_answer := [0, 0, 0, 0, 0, 0, 0, 0, 0] # @export var answer := [1, 0, 0, 0, 0, 0, 0, 0, 0] @export var answer := [1, 4, 3, 1, 3, 6, 4, 3, 2] -@export_enum("closed", "opened", "playing", "finished") var mode := "closed" @export var playing_step_degree := 45.0 @export var playing_steps := 10 +@export var debug_reload := false: + set(value): + if value: + debug_reload = false + _chechout_mode() @onready var points_polygon = $ButtonPositionPoints as Polygon2D @onready var box = $Box as TextureRect @@ -46,20 +49,26 @@ var playing_step_sec := 0.5 func _ready() -> void: + # debug mode: reset + if GlobalConfig.DEBUG: + ArchiveManager.archive.bayinhe_mode = "closed" + ArchiveManager.archive.bayinhe_current_answer = [0, 0, 0, 0, 0, 0, 0, 0, 0] playing_step_sec = audio_manual.get_length() / playing_steps _chechout_mode() inside_handle.pressed.connect(_on_handle_pressed) handle_wheel.rotated.connect(_on_wheel_rotated) # # test close shaking effect - # mode = "playing" + # ArchiveManager.archive.bayinhe_mode = "playing" # _chechout_mode(true) # get_tree().create_timer(1.0).timeout.connect(_on_auto_play_finished) func _chechout_mode(play_sfx := false) -> void: + var mode = ArchiveManager.archive.bayinhe_mode inside_handle.visible = mode == "opened" side_handle.visible = mode == "playing" or mode == "finished" + $LidHint.visible = mode == "closed" _reset_buttons() match mode: "closed": @@ -84,7 +93,7 @@ func _chechout_mode(play_sfx := false) -> void: func _reset_buttons(): - if mode != "closed": + if ArchiveManager.archive.bayinhe_mode != "closed": if has_node("button_root"): get_node("button_root").visible = false return @@ -105,7 +114,7 @@ func _reset_buttons(): else: button.texture = button_texture # load current_answer - button.position = _get_position(i, current_answer[i]) + button.position = _get_position(i, ArchiveManager.archive.bayinhe_current_answer[i]) # 自动计算的位置会有偏差,使用 polygon 的点进行标记 @@ -123,11 +132,11 @@ func _get_position(col: int, row: int) -> Vector2: # 1 up 2 down func _move_button(delta: int) -> void: - if mode != "closed": + if ArchiveManager.archive.bayinhe_mode != "closed": return - var current_row = current_answer[current_selected_btn] - var target_row = clampi(current_answer[current_selected_btn] + delta, 0, 6) - current_answer[current_selected_btn] = target_row + var current_row = ArchiveManager.archive.bayinhe_current_answer[current_selected_btn] + var target_row = clampi(current_row + delta, 0, 6) + ArchiveManager.archive.bayinhe_current_answer[current_selected_btn] = target_row # tween if not in correct position if current_row != target_row: var target_position = _get_position(current_selected_btn, target_row) @@ -137,13 +146,15 @@ func _move_button(delta: int) -> void: audio_player.stream = sfx_drag audio_player.play() # check if all buttons are in correct position - if current_answer == answer: - mode = "opened" + if ArchiveManager.archive.bayinhe_current_answer == answer: + ArchiveManager.archive.bayinhe_mode = "opened" _chechout_mode(true) func _unhandled_input(event: InputEvent) -> void: - if mode == "closed": + if event.is_action_pressed("cancel"): + pass + if ArchiveManager.archive.bayinhe_mode == "closed": # move button if event.is_action_pressed("up"): _move_button(1) @@ -153,8 +164,6 @@ func _unhandled_input(event: InputEvent) -> void: current_selected_btn = clampi(current_selected_btn - 1, 0, 8) elif event.is_action_pressed("right"): current_selected_btn = clampi(current_selected_btn + 1, 0, 8) - if mode == "playing": - pass func _on_handle_pressed() -> void: @@ -163,7 +172,7 @@ func _on_handle_pressed() -> void: func _checkout_playing(): - mode = "playing" + ArchiveManager.archive.bayinhe_mode = "playing" box.z_index = 10 var tween = create_tween() audio_player.stream = sfx_assemble @@ -180,7 +189,7 @@ var continue_playing := false func _on_wheel_rotated(radiant: float) -> void: - if mode != "playing" or accumulated_steps >= playing_steps: + if ArchiveManager.archive.bayinhe_mode != "playing" or accumulated_steps >= playing_steps: return accumulated_radiant += radiant if abs(accumulated_radiant) > deg_to_rad(playing_step_degree): @@ -225,14 +234,14 @@ func _checkout_auto_play(): func _on_auto_play_finished(): side_handle.pause() - mode = "finished" + ArchiveManager.archive.bayinhe_mode = "finished" # 不播放关闭音效,因为自动播放时已经播放过了 _chechout_mode(false) # 抖动效果,逐渐减弱 var tween = create_tween() - var fps := 6.0 - var duration := 0.5 - var delta := 4.0 + var fps := 10.0 + var duration := 0.4 + var delta := 6.0 var origin_pos = box.position var count = int(duration * fps) var delta_t = 1.0 / fps diff --git a/scene/little_game/旋转锁.gd b/scene/little_game/旋转锁.gd index 6d87fff2..a1e821c2 100644 --- a/scene/little_game/旋转锁.gd +++ b/scene/little_game/旋转锁.gd @@ -17,7 +17,7 @@ func _ready() -> void: key_origin_x = key.position.x # randomize the initial rotation of the gears for i in range(5): - random_degrees[i] = snappedi(randf_range(0, 360), 20) + random_degrees[i] = snappedi(randf_range(0, 360), 10) var gear = get_node("Pivot/" + str(i)) as Area2D gear.area_entered.connect(_on_gear_touched) $"Pivot/5".area_entered.connect(_on_success) @@ -25,7 +25,7 @@ func _ready() -> void: func _on_gear_touched(_area): - print("Gear touched!") + # print("Gear touched!") if not freeze: _reset_all() @@ -33,6 +33,7 @@ func _on_gear_touched(_area): func _on_success(_area): freeze = true print("Success!") + $SfxOpen.play() #TODO @@ -66,5 +67,6 @@ func move_key(direction := 1): if tween_key and tween_key.is_running(): return actived_gear = clampi(actived_gear + direction, 0, 5) + $SfxKey.play() tween_key = create_tween() tween_key.tween_property(key, "position:x", key_origin_x + gear_x_delta[actived_gear], 0.5) diff --git a/scene/little_game/旋转锁.tscn b/scene/little_game/旋转锁.tscn index 4ac8baa4..15c388c8 100644 --- a/scene/little_game/旋转锁.tscn +++ b/scene/little_game/旋转锁.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=13 format=3 uid="uid://ddpaot630cntr"] +[gd_scene load_steps=15 format=3 uid="uid://ddpaot630cntr"] [ext_resource type="Script" path="res://scene/little_game/旋转锁.gd" id="1_lag7y"] [ext_resource type="Texture2D" uid="uid://cv3ijagml76v0" path="res://asset/art/little_game/旋转锁/旋转锁背景.png" id="1_srn7i"] @@ -12,6 +12,8 @@ [ext_resource type="Texture2D" uid="uid://b2s0v602s7rfp" path="res://asset/art/little_game/旋转锁/钥匙.png" id="9_2tu7h"] [ext_resource type="AudioStream" uid="uid://o6fwujx5pug3" path="res://asset/audio/sfx/game/旋转锁/转轮声.mp3" id="10_4iyuf"] [ext_resource type="AudioStream" uid="uid://dmho8fjw45rbm" path="res://asset/audio/sfx/game/旋转锁/插销声.mp3" id="11_h2ycu"] +[ext_resource type="PackedScene" uid="uid://c85t6stvytvjn" path="res://scene/entity/ux/sfx.tscn" id="13_121lr"] +[ext_resource type="AudioStream" uid="uid://xw7fy2olhxdt" path="res://asset/audio/sfx/ui/门锁互动.mp3" id="14_owvcm"] [node name="旋转锁" type="Control"] layout_mode = 3 @@ -129,12 +131,16 @@ polygon = PackedVector2Array(49.5, -4.5, 9, -4, -18, -1, -52, -1, -52, 1, -18, 1 [node name="Sprite2D" type="Sprite2D" parent="Key"] texture = ExtResource("9_2tu7h") -[node name="SfxGear" type="AudioStreamPlayer" parent="."] -unique_name_in_owner = true +[node name="SfxGear" parent="." instance=ExtResource("13_121lr")] stream = ExtResource("10_4iyuf") -bus = &"game_sfx" +dir = "game/旋转锁" +file = "转轮声.mp3" -[node name="SfxKey" type="AudioStreamPlayer" parent="."] -unique_name_in_owner = true +[node name="SfxKey" parent="." instance=ExtResource("13_121lr")] stream = ExtResource("11_h2ycu") -bus = &"game_sfx" +dir = "game/旋转锁" +file = "插销声.mp3" + +[node name="SfxOpen" parent="." instance=ExtResource("13_121lr")] +stream = ExtResource("14_owvcm") +file = "门锁互动.mp3" diff --git a/scene/little_game/旋转锁_齿轮.gd b/scene/little_game/旋转锁_齿轮.gd index 247018be..44c13110 100644 --- a/scene/little_game/旋转锁_齿轮.gd +++ b/scene/little_game/旋转锁_齿轮.gd @@ -1,7 +1,7 @@ extends Area2D @export var active := false -@export var rotation_step_degrees := 20.0 +@export var rotation_step_degrees := 10.0 @export var target_rotation_degrees := 0.0 @onready var sfx_gear = $"../../SfxGear" as AudioStreamPlayer @@ -31,8 +31,8 @@ func _physics_process(delta: float) -> void: var diff = target_rotation_degrees - rotation_degrees if abs(diff) > 0.1: var direction = sign(diff) - var target_angular_velocity = direction * 60.0 - current_angular_velocity = lerp(current_angular_velocity, target_angular_velocity, 0.2) + var target_angular_velocity = direction * 50.0 + current_angular_velocity = lerp(current_angular_velocity, target_angular_velocity, 0.1) rotation_degrees += current_angular_velocity * delta if active and not sfx_gear.playing: sfx_gear.play() diff --git a/scene/main.tscn b/scene/main.tscn index 7c7c19d6..9b3c7817 100644 --- a/scene/main.tscn +++ b/scene/main.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=10 format=3 uid="uid://dygvcmykn02n8"] +[gd_scene load_steps=11 format=3 uid="uid://dygvcmykn02n8"] [ext_resource type="Script" path="res://scene/main.gd" id="1_pks84"] [ext_resource type="PackedScene" uid="uid://3gk1gxwanw24" path="res://scene/shading/shading_layer.tscn" id="2_d1re1"] @@ -9,6 +9,7 @@ [ext_resource type="PackedScene" uid="uid://cjhw5ecygrqty" path="res://scene/player/main_player.tscn" id="6_6geb0"] [ext_resource type="Environment" uid="uid://c6ri8tn5qt6fe" path="res://scene/ground/environment.tres" id="9_jsof5"] [ext_resource type="PackedScene" uid="uid://clxgkj80yin2" path="res://scene/ground/ground_loader.tscn" id="10_8rc5n"] +[ext_resource type="PackedScene" uid="uid://cvbt5qm70cg7t" path="res://scene/journal/journal.tscn" id="10_durpa"] [node name="Main" type="Node2D"] script = ExtResource("1_pks84") @@ -40,8 +41,12 @@ speed_climbing = null [node name="ShadingLayer" parent="." instance=ExtResource("2_d1re1")] +[node name="PropInspector" parent="." instance=ExtResource("5_ux0rw")] +unique_name_in_owner = true +visible = false + [node name="UILayer" type="CanvasLayer" parent="."] -layer = 11 +layer = 12 [node name="ColorRectTop" type="ColorRect" parent="UILayer"] unique_name_in_owner = true @@ -81,12 +86,14 @@ offset_right = 230.0 metadata/_edit_use_anchors_ = true [node name="Notification" parent="UILayer" instance=ExtResource("5_3gg5t")] +offset_left = -12.0 +offset_top = -2.0 +offset_right = -12.0 +offset_bottom = -2.0 metadata/_edit_use_anchors_ = true [node name="PropHUD" parent="UILayer" instance=ExtResource("4_t7gb2")] scale = Vector2(0.24, 0.24) -mouse_filter = 2 metadata/_edit_use_anchors_ = true -[node name="PropInspector" parent="." instance=ExtResource("5_ux0rw")] -unique_name_in_owner = true +[node name="Journal" parent="." instance=ExtResource("10_durpa")] diff --git a/scene/popup/prop_inspector.gd b/scene/popup/prop_inspector.gd index bbecd038..e6e61555 100644 --- a/scene/popup/prop_inspector.gd +++ b/scene/popup/prop_inspector.gd @@ -21,6 +21,7 @@ var blinking_tween : Tween # Called when the node enters the scene tree for the first time. func _ready() -> void: + visible = false layer = GlobalConfig.CANVAS_LAYER_PROP_INSPECTOR texture_rect.modulate.a = 0.0 content_label.modulate.a = 0.0 @@ -48,6 +49,7 @@ func _post_hide(): texture_notes = null content_label.text = "" tip_label.text = tip_cover + visible = false func _blink_label(init := true): @@ -64,6 +66,7 @@ func _blink_label(init := true): func pop_inspection(cover_texture, notes_texture, inspection_note): status = STATUS_INSPECTING_COVER + visible = true texture_rect.texture = cover_texture texture_cover = cover_texture texture_notes = notes_texture @@ -74,13 +77,15 @@ func pop_inspection(cover_texture, notes_texture, inspection_note): _blink_label() -func _input(event: InputEvent) -> void: +func _unhandled_input(event: InputEvent) -> void: if status == STATUS_HIDDEN: return if event.is_action_pressed("cancel"): quit.emit() _hide() + get_viewport().set_input_as_handled() if event.is_action_pressed("interact"): + get_viewport().set_input_as_handled() if status == STATUS_INSPECTING_COVER: # inspect notes status = STATUS_INSPECTING_NOTES diff --git a/scene/popup/prop_inspector.tscn b/scene/popup/prop_inspector.tscn index ef37d777..22cccbfe 100644 --- a/scene/popup/prop_inspector.tscn +++ b/scene/popup/prop_inspector.tscn @@ -8,7 +8,7 @@ line_spacing = 1.0 font_size = 11 [node name="PropInspector" type="CanvasLayer"] -layer = 12 +layer = 11 script = ExtResource("1_2wpwe") [node name="TextureRect" type="TextureRect" parent="."] @@ -65,6 +65,7 @@ offset_top = -40.0 offset_right = 47.5 grow_horizontal = 2 grow_vertical = 0 +mouse_filter = 2 theme_override_constants/margin_bottom = 38 [node name="TipLabel" type="Label" parent="MarginContainer"] diff --git a/scene/shading/shading_layer.tscn b/scene/shading/shading_layer.tscn index 1d4abf5e..2913e52a 100644 --- a/scene/shading/shading_layer.tscn +++ b/scene/shading/shading_layer.tscn @@ -63,6 +63,7 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +mouse_filter = 1 [node name="BackBufferCopy" type="BackBufferCopy" parent="ChromaticAbberation"] copy_mode = 2 @@ -75,7 +76,7 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -mouse_filter = 2 +mouse_filter = 1 [node name="BackBufferCopy" type="BackBufferCopy" parent="Palette"] copy_mode = 2 @@ -88,7 +89,7 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -mouse_filter = 2 +mouse_filter = 1 [node name="BackBufferCopy" type="BackBufferCopy" parent="GlitchEffect"] copy_mode = 2 @@ -107,7 +108,6 @@ offset_right = 300.0 offset_bottom = 256.0 grow_horizontal = 2 grow_vertical = 2 -mouse_filter = 2 texture = SubResource("NoiseTexture2D_oe2uy") stretch_mode = 1 @@ -121,7 +121,7 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -mouse_filter = 2 +mouse_filter = 1 [node name="BackBufferCopy" type="BackBufferCopy" parent="Vignette"] copy_mode = 2