From 47086f56ca2c3694cda50041c71bce5d316b9123 Mon Sep 17 00:00:00 2001 From: cakipaul Date: Thu, 19 Jun 2025 14:50:06 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9B=92=E5=AD=90=E7=8C=AB=E6=95=B2=E9=97=A8?= =?UTF-8?q?=E4=B8=8E=E8=BA=B2=E8=97=8F=E8=83=BD=E5=8A=9B=EF=BC=9Bhud=20?= =?UTF-8?q?=E9=9A=90=E8=97=8F=E4=B8=8E=20prop=20inventory=20=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E8=83=BD=E5=8A=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../art/gif/c02_盒子猫/c02_盒子猫_frames.tres | 63 +++++++++++++-- .../audio/mixkit/mixkit-water-bubble-1317.wav | Bin 0 -> 76610 bytes .../mixkit-water-bubble-1317.wav.import | 24 ++++++ .../audio/sfx/交互/{第一章 => }/sfx_敲门1.wav | Bin .../交互/{第一章 => }/sfx_敲门1.wav.import | 6 +- .../audio/sfx/交互/{第一章 => }/sfx_敲门2.wav | Bin .../交互/{第一章 => }/sfx_敲门2.wav.import | 6 +- asset/dialogue/c02.csv | 2 + asset/dialogue/c02.dialogue | 7 ++ config/animation/entity_sprite_frames.tres | 4 +- manager/archive_manager/assembled_archive.gd | 6 ++ manager/deploy/deployer_window.gd | 10 --- manager/deploy/deployer_window.gd.uid | 1 - manager/deploy/deployer_window.tscn | 12 --- manager/deploy/section_deployer.gd | 12 --- manager/deploy/section_deployer.gd.uid | 1 - manager/deploy/section_deployer.tscn | 15 ---- manager/scene/global_functor.gd | 25 ++++++ manager/scene/global_functor.gd.uid | 1 + manager/scene/scene_manager.gd | 28 ++++++- project.godot | 1 + scene/entity/ambush.gd | 31 +++++--- scene/entity/ambush.tscn | 6 +- scene/ground/ground.gd | 2 + scene/ground/ground.tscn | 4 +- scene/ground/scene/c01/s08_书店.tscn | 3 +- scene/ground/scene/c02/s10_animation.gd | 10 +-- scene/ground/scene/c02/s10_空房间.tscn | 20 +++-- scene/ground/scene/c02/s12_盒子猫.tscn | 8 +- scene/ground/scene/c02/s13_盒子猫二楼.tscn | 56 +++++++++---- .../ground/scene/c02/s14_盒子猫二楼内侧.tscn | 14 ++-- .../ground/scene/c02/s15_盒子猫一楼内侧.tscn | 20 +++-- .../ground/scene/c02/s16_盒子猫三楼内侧.tscn | 20 +++-- scene/ground/scene/c02/s17_盒子猫三楼.tscn | 28 +++++-- scene/ground/script/c02/敲门游戏.tscn | 4 +- scene/ground/script/c02/水盆特写.gd | 1 + scene/ground/script/c02/水盆特写.tscn | 11 ++- scene/ground/script/c02/盒子猫canvas_layer.gd | 43 ++++++++++ scene/ground/script/c02/追猫猪头怪.gd | 57 +++++++++++++ scene/ground/script/c02/追猫猪头怪.gd.uid | 1 + scene/ground/script/c02/追猫猪头怪.tscn | 29 +++++++ scene/player/main_player.gd | 75 +++++++++++------- scene/player/player_animation_config.gd | 19 +++++ scene/prop/prop_hud.gd | 27 ++++++- 44 files changed, 540 insertions(+), 173 deletions(-) create mode 100644 asset/audio/mixkit/mixkit-water-bubble-1317.wav create mode 100644 asset/audio/mixkit/mixkit-water-bubble-1317.wav.import rename asset/audio/sfx/交互/{第一章 => }/sfx_敲门1.wav (100%) rename asset/audio/sfx/交互/{第一章 => }/sfx_敲门1.wav.import (52%) rename asset/audio/sfx/交互/{第一章 => }/sfx_敲门2.wav (100%) rename asset/audio/sfx/交互/{第一章 => }/sfx_敲门2.wav.import (52%) delete mode 100644 manager/deploy/deployer_window.gd delete mode 100644 manager/deploy/deployer_window.gd.uid delete mode 100644 manager/deploy/deployer_window.tscn delete mode 100644 manager/deploy/section_deployer.gd delete mode 100644 manager/deploy/section_deployer.gd.uid delete mode 100644 manager/deploy/section_deployer.tscn create mode 100644 manager/scene/global_functor.gd create mode 100644 manager/scene/global_functor.gd.uid create mode 100644 scene/ground/script/c02/追猫猪头怪.gd create mode 100644 scene/ground/script/c02/追猫猪头怪.gd.uid create mode 100644 scene/ground/script/c02/追猫猪头怪.tscn diff --git a/asset/art/gif/c02_盒子猫/c02_盒子猫_frames.tres b/asset/art/gif/c02_盒子猫/c02_盒子猫_frames.tres index 8076fc7f..9430968a 100644 --- a/asset/art/gif/c02_盒子猫/c02_盒子猫_frames.tres +++ b/asset/art/gif/c02_盒子猫/c02_盒子猫_frames.tres @@ -78,13 +78,13 @@ [resource] animations = [{ "frames": [{ -"duration": 30.0, +"duration": 15.0, "texture": ExtResource("1_g47xo") }, { -"duration": 30.0, +"duration": 15.0, "texture": ExtResource("2_3lx3k") }], -"loop": true, +"loop": false, "name": &"猪头怪呼吸", "speed": 30.0 }, { @@ -155,12 +155,65 @@ animations = [{ "duration": 30.0, "texture": ExtResource("24_6cnpw") }], -"loop": true, +"loop": false, "name": &"猪头怪抓盒子猫", "speed": 30.0 }, { "frames": [{ "duration": 6.0, +"texture": ExtResource("9_3b7wk") +}, { +"duration": 6.0, +"texture": ExtResource("10_lvj16") +}, { +"duration": 15.0, +"texture": ExtResource("11_ty3yp") +}, { +"duration": 15.0, +"texture": ExtResource("12_x3isd") +}, { +"duration": 15.0, +"texture": ExtResource("13_hwoj5") +}, { +"duration": 6.0, +"texture": ExtResource("14_n6lou") +}, { +"duration": 6.0, +"texture": ExtResource("15_6p0ya") +}, { +"duration": 30.0, +"texture": ExtResource("16_uxs1n") +}, { +"duration": 6.0, +"texture": ExtResource("17_rdknj") +}, { +"duration": 6.0, +"texture": ExtResource("18_c28wc") +}, { +"duration": 6.0, +"texture": ExtResource("19_eo0ng") +}, { +"duration": 15.0, +"texture": ExtResource("20_r7gaq") +}, { +"duration": 30.0, +"texture": ExtResource("21_0tnvn") +}, { +"duration": 9.0, +"texture": ExtResource("22_algl1") +}, { +"duration": 9.0, +"texture": ExtResource("23_hexfl") +}, { +"duration": 30.0, +"texture": ExtResource("24_6cnpw") +}], +"loop": false, +"name": &"猪头怪抓盒子猫后段", +"speed": 30.0 +}, { +"frames": [{ +"duration": 6.0, "texture": ExtResource("25_ty3yp") }, { "duration": 6.0, @@ -184,7 +237,7 @@ animations = [{ "duration": 6.0, "texture": ExtResource("32_c28wc") }], -"loop": true, +"loop": false, "name": &"猪头怪走路", "speed": 30.0 }, { diff --git a/asset/audio/mixkit/mixkit-water-bubble-1317.wav b/asset/audio/mixkit/mixkit-water-bubble-1317.wav new file mode 100644 index 0000000000000000000000000000000000000000..4ee597cf27d5c089d751ffbfd8e675efa7688e0f GIT binary patch literal 76610 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 literal 0 HcmV?d00001 diff --git a/asset/audio/mixkit/mixkit-water-bubble-1317.wav.import b/asset/audio/mixkit/mixkit-water-bubble-1317.wav.import new file mode 100644 index 00000000..fbde4b6d --- /dev/null +++ b/asset/audio/mixkit/mixkit-water-bubble-1317.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cm2p6wqgfuv8y" +path="res://.godot/imported/mixkit-water-bubble-1317.wav-be4e28e0eae2edccd40066c5a04b907b.sample" + +[deps] + +source_file="res://asset/audio/mixkit/mixkit-water-bubble-1317.wav" +dest_files=["res://.godot/imported/mixkit-water-bubble-1317.wav-be4e28e0eae2edccd40066c5a04b907b.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/asset/audio/sfx/交互/第一章/sfx_敲门1.wav b/asset/audio/sfx/交互/sfx_敲门1.wav similarity index 100% rename from asset/audio/sfx/交互/第一章/sfx_敲门1.wav rename to asset/audio/sfx/交互/sfx_敲门1.wav diff --git a/asset/audio/sfx/交互/第一章/sfx_敲门1.wav.import b/asset/audio/sfx/交互/sfx_敲门1.wav.import similarity index 52% rename from asset/audio/sfx/交互/第一章/sfx_敲门1.wav.import rename to asset/audio/sfx/交互/sfx_敲门1.wav.import index 3ccf4c89..89b2512d 100644 --- a/asset/audio/sfx/交互/第一章/sfx_敲门1.wav.import +++ b/asset/audio/sfx/交互/sfx_敲门1.wav.import @@ -3,12 +3,12 @@ importer="wav" type="AudioStreamWAV" uid="uid://7of24bqow07e" -path="res://.godot/imported/sfx_敲门1.wav-1c8265fc5da1dd78fdf657a9fa511d7b.sample" +path="res://.godot/imported/sfx_敲门1.wav-aa81516cb458ddb022d4221cfa4911f8.sample" [deps] -source_file="res://asset/audio/sfx/交互/第一章/sfx_敲门1.wav" -dest_files=["res://.godot/imported/sfx_敲门1.wav-1c8265fc5da1dd78fdf657a9fa511d7b.sample"] +source_file="res://asset/audio/sfx/交互/sfx_敲门1.wav" +dest_files=["res://.godot/imported/sfx_敲门1.wav-aa81516cb458ddb022d4221cfa4911f8.sample"] [params] diff --git a/asset/audio/sfx/交互/第一章/sfx_敲门2.wav b/asset/audio/sfx/交互/sfx_敲门2.wav similarity index 100% rename from asset/audio/sfx/交互/第一章/sfx_敲门2.wav rename to asset/audio/sfx/交互/sfx_敲门2.wav diff --git a/asset/audio/sfx/交互/第一章/sfx_敲门2.wav.import b/asset/audio/sfx/交互/sfx_敲门2.wav.import similarity index 52% rename from asset/audio/sfx/交互/第一章/sfx_敲门2.wav.import rename to asset/audio/sfx/交互/sfx_敲门2.wav.import index c8d1c5f5..ce6ca0a2 100644 --- a/asset/audio/sfx/交互/第一章/sfx_敲门2.wav.import +++ b/asset/audio/sfx/交互/sfx_敲门2.wav.import @@ -3,12 +3,12 @@ importer="wav" type="AudioStreamWAV" uid="uid://dw8dprxhvas85" -path="res://.godot/imported/sfx_敲门2.wav-f372a18cad0983ad8369afcad6836870.sample" +path="res://.godot/imported/sfx_敲门2.wav-917059eb9a36ca4ab352ab80b1d16167.sample" [deps] -source_file="res://asset/audio/sfx/交互/第一章/sfx_敲门2.wav" -dest_files=["res://.godot/imported/sfx_敲门2.wav-f372a18cad0983ad8369afcad6836870.sample"] +source_file="res://asset/audio/sfx/交互/sfx_敲门2.wav" +dest_files=["res://.godot/imported/sfx_敲门2.wav-917059eb9a36ca4ab352ab80b1d16167.sample"] [params] diff --git a/asset/dialogue/c02.csv b/asset/dialogue/c02.csv index 6f8ffbc0..e707cdf6 100644 --- a/asset/dialogue/c02.csv +++ b/asset/dialogue/c02.csv @@ -8,6 +8,8 @@ c02_11肉铺敲门_3,不做生意赶紧滚!,???,, c02_纸人互动_离开公寓1,你要离开芦昌公寓吗?,,, c02_纸人互动_离开公寓2,离开,(response),, c02_纸人互动_离开公寓3,留下,(response),, +c02_钻入隧道询问1,是否钻入隧道?,,, +c02_钻入隧道询问2,进入,(response),, c02_6偷听对话_李氏_1_fx,真的假的?你钻进去啦,你这个体型进得去哒?,李兰,, c02_6偷听对话_癞子_1_fx,小声点,让人听见了倒惹麻烦。,王守义,,[#db=3] c02_6偷听对话_李氏_2_fx,那你说说,都看到什么啦?,李兰,,[#db=-5] diff --git a/asset/dialogue/c02.dialogue b/asset/dialogue/c02.dialogue index 3207dadb..8b46b4d5 100644 --- a/asset/dialogue/c02.dialogue +++ b/asset/dialogue/c02.dialogue @@ -5,6 +5,13 @@ - 留下 [ID:c02_纸人互动_离开公寓3] => END +~ c02_钻入隧道询问 +是否钻入隧道? [ID:c02_钻入隧道询问1] +- 进入 [ID:c02_钻入隧道询问2] + do GlobalFunctor.transfer_to_tunnel() +- 留下 [ID:c02_纸人互动_离开公寓3] +=> END + ~ c02_04_李氏癞子 #[#anonymous] 李兰: 真的假的?你钻进去啦,你这个体型进得去哒? [ID:c02_6偷听对话_李氏_1_fx] diff --git a/config/animation/entity_sprite_frames.tres b/config/animation/entity_sprite_frames.tres index 84c5a2ca..9c89fd2f 100644 --- a/config/animation/entity_sprite_frames.tres +++ b/config/animation/entity_sprite_frames.tres @@ -3482,7 +3482,7 @@ animations = [{ }], "loop": false, "name": &"c02_盒子猫停止躲藏", -"speed": 5.0 +"speed": 7.0 }, { "frames": [{ "duration": 1.0, @@ -3560,7 +3560,7 @@ animations = [{ }], "loop": false, "name": &"c02_盒子猫躲藏", -"speed": 5.0 +"speed": 8.0 }, { "frames": [{ "duration": 1.0, diff --git a/manager/archive_manager/assembled_archive.gd b/manager/archive_manager/assembled_archive.gd index e084e3e6..84bc7dea 100644 --- a/manager/archive_manager/assembled_archive.gd +++ b/manager/archive_manager/assembled_archive.gd @@ -40,6 +40,8 @@ class_name AssembledArchive extends Resource @export var player_running_locked := true # prop hud 显示道具 @export var prop_inventory: PropInventory +@export var prop_inventory_xxdie: PropInventory +@export var prop_inventory_xxxdie: PropInventory @export_group("八音盒", "bayinhe") @export var bayinhe_current_answer := [0, 0, 0, 0, 0, 0, 0, 0, 0] @@ -49,6 +51,10 @@ class_name AssembledArchive extends Resource func _init() -> void: if not prop_inventory: prop_inventory = PropInventory.new() + if not prop_inventory_xxdie: + prop_inventory_xxdie = PropInventory.new() + if not prop_inventory_xxxdie: + prop_inventory_xxxdie = PropInventory.new() func ground_archive(scene_name := current_scene) -> GroundArchive: diff --git a/manager/deploy/deployer_window.gd b/manager/deploy/deployer_window.gd deleted file mode 100644 index 6cb95e29..00000000 --- a/manager/deploy/deployer_window.gd +++ /dev/null @@ -1,10 +0,0 @@ -extends Window - -signal changed - -@export var archive: AssembledArchive - -func _ready() -> void: - var screen_size = DisplayServer.screen_get_size() - position = screen_size / 3 - close_requested.connect(queue_free) diff --git a/manager/deploy/deployer_window.gd.uid b/manager/deploy/deployer_window.gd.uid deleted file mode 100644 index 8030f459..00000000 --- a/manager/deploy/deployer_window.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://457olpnqqdhr diff --git a/manager/deploy/deployer_window.tscn b/manager/deploy/deployer_window.tscn deleted file mode 100644 index a7961b5d..00000000 --- a/manager/deploy/deployer_window.tscn +++ /dev/null @@ -1,12 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://dfbmctdmc4ue6"] - -[ext_resource type="Script" uid="uid://457olpnqqdhr" path="res://manager/deploy/deployer_window.gd" id="1_rhcam"] - -[node name="DeployerWindow" type="Window"] -auto_translate_mode = 1 -title = "deployer" -position = Vector2i(2000, 300) -size = Vector2i(1200, 1000) -always_on_top = true -min_size = Vector2i(100, 100) -script = ExtResource("1_rhcam") diff --git a/manager/deploy/section_deployer.gd b/manager/deploy/section_deployer.gd deleted file mode 100644 index 32723e3f..00000000 --- a/manager/deploy/section_deployer.gd +++ /dev/null @@ -1,12 +0,0 @@ -extends Node2D - -@export var section_config: SectionConfig - -# Called when the node enters the scene tree for the first time. -func _ready() -> void: - pass # Replace with function body. - - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta: float) -> void: - pass diff --git a/manager/deploy/section_deployer.gd.uid b/manager/deploy/section_deployer.gd.uid deleted file mode 100644 index 15bb1d80..00000000 --- a/manager/deploy/section_deployer.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cy8jsbw6w8sg0 diff --git a/manager/deploy/section_deployer.tscn b/manager/deploy/section_deployer.tscn deleted file mode 100644 index aa197c21..00000000 --- a/manager/deploy/section_deployer.tscn +++ /dev/null @@ -1,15 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://jveao8k40jp1"] - -[ext_resource type="Script" uid="uid://cy8jsbw6w8sg0" path="res://manager/deploy/section_deployer.gd" id="1_komad"] -[ext_resource type="PackedScene" uid="uid://dygvcmykn02n8" path="res://scene/main.tscn" id="2_si45r"] -[ext_resource type="PackedScene" uid="uid://dfbmctdmc4ue6" path="res://manager/deploy/deployer_window.tscn" id="3_iq8me"] - -[node name="SectionDeployer" type="Node2D"] -script = ExtResource("1_komad") - -[node name="Main" parent="." instance=ExtResource("2_si45r")] - -[node name="DeployerWindow" parent="." instance=ExtResource("3_iq8me")] -position = Vector2i(390, 300) - -[editable path="Main"] diff --git a/manager/scene/global_functor.gd b/manager/scene/global_functor.gd new file mode 100644 index 00000000..13050f0c --- /dev/null +++ b/manager/scene/global_functor.gd @@ -0,0 +1,25 @@ +extends Node + + +# called from dialogue +# 传送进入隧道 +func transfer_to_tunnel(): + SceneManager.get_ground_loader().transition_to_scene("c02_s09", "right") + +# called from Amush2D's global_method +# c02 盒子猫游戏,小猫交互门 +var knocking = false + + +func c02_cat_play_with_door(): + if knocking: + return + knocking = true + var knock_stream = preload("uid://7of24bqow07e") + SceneManager.freeze_player(1.5, 6, true) + await get_tree().create_timer(0.8).timeout + AudioManager.play_sfx(knock_stream) + await get_tree().create_timer(0.3).timeout + AudioManager.play_sfx(knock_stream) + await get_tree().create_timer(0.5).timeout + knocking = false diff --git a/manager/scene/global_functor.gd.uid b/manager/scene/global_functor.gd.uid new file mode 100644 index 00000000..0ed6d35a --- /dev/null +++ b/manager/scene/global_functor.gd.uid @@ -0,0 +1 @@ +uid://cylss15sumkuw diff --git a/manager/scene/scene_manager.gd b/manager/scene/scene_manager.gd index 79c17dbc..b1373f19 100644 --- a/manager/scene/scene_manager.gd +++ b/manager/scene/scene_manager.gd @@ -22,6 +22,13 @@ func _ready(): func get_ground_loader() -> GroundLoader: return get_node_or_null("/root/Main/GroundLoader") as GroundLoader +# restart scene in debug launch... +func is_restarting() -> bool: + var ground = get_ground() + if ground: + return ground.restarting + return false + func get_ground() -> Ground2D: var loader = get_ground_loader() @@ -150,6 +157,25 @@ func get_prop_hud() -> PropHud: return get_node_or_null("/root/Main/UILayer/PropHUD") as PropHud +func toggle_hud_display(display_hud: bool): + var prop_hud = get_prop_hud() as PropHud + if prop_hud: + if display_hud: + prop_hud.display_hud() + else: + prop_hud.hide_hud() + else: + printerr("toggle_hud_display: PropHud node not found") + + +func checkout_prop_inventory(inv): + var prop_hud = get_prop_hud() as PropHud + if prop_hud: + prop_hud.checkout_inventory(inv) + else: + printerr("checkout_prop_inventory: PropHud node not found") + + func get_current_prop(must_selected: bool) -> String: var prop_hud = get_prop_hud() if prop_hud and (not must_selected or prop_hud.selected): @@ -170,7 +196,7 @@ func enable_prop_item_silently(prop_key: String) -> void: if prop_hud: prop_hud.enable_prop_item(prop_key, false) else: - printerr("enable_prop_item_silently PropHud node not found") + printerr("enable_prop_item_silently: PropHud node not found") func enable_prop_item(prop_key: String) -> void: diff --git a/project.godot b/project.godot index 407ca2a6..bde2ba13 100644 --- a/project.godot +++ b/project.godot @@ -48,6 +48,7 @@ SceneManager="*res://manager/scene/scene_manager.gd" AudioManager="*res://manager/audio_manager/audio_manager.gd" EventManager="*res://manager/event_manager/event_manager.gd" DialogueManager="*res://addons/dialogue_manager/dialogue_manager.gd" +GlobalFunctor="*res://manager/scene/global_functor.gd" [debug] diff --git a/scene/entity/ambush.gd b/scene/entity/ambush.gd index c1a94a4f..4b8728e3 100644 --- a/scene/entity/ambush.gd +++ b/scene/entity/ambush.gd @@ -14,17 +14,17 @@ signal sign_mark_offset_updated set(val): enabled = val if is_node_ready(): - # sign_mark.enabled = val _check_sign_display() @export_enum("enter", "area_enter", "interact") var trigger_mode := "enter": set(val): trigger_mode = val if is_node_ready(): _check_sign_display() +@export var interacted_sign_texture: Texture2D @export var one_shot := true # 首次进入 tree 就直接启用 @export var on_first_enter_tree := false -@export var freeze_time := 5.0 +@export var freeze_time := 0.5 var hook_animation = "" @export var lock_player_on_playing_dialogue = true @export var hook_os_key := "" @@ -48,6 +48,7 @@ var hook_animation = "" notify_property_list_changed() var hook_dialogue_title := "" var hook_method := "" +@export var global_method := "" var dialogue_c01 = preload("res://asset/dialogue/c01.dialogue") var dialogue_c02 = preload("res://asset/dialogue/c02.dialogue") @@ -72,6 +73,8 @@ var played: bool: played = val if not Engine.is_editor_hint() and ground_archive: ground_archive.set_pair(name, "played", played) + if is_node_ready() and val and interacted_sign_texture: + sign_mark.sprite2d.texture = interacted_sign_texture # Called when the node enters the scene tree for the first time. @@ -81,28 +84,33 @@ func _ready() -> void: # 更新 hook_animation 的可选项 if animation_player: animation_player.animation_libraries_updated.connect(notify_property_list_changed) + # editor 中展示 sign + sign_mark.enabled = true + sign_mark.display_sign = true return # setup default value ground_archive = ArchiveManager.archive.ground_archive() played = ground_archive.get_value(name, "played", false) played_time = 0.0 - sign_mark.enabled = enabled _check_sign_display() if played: if GlobalConfig.DEBUG: print("Ambush has played, name=", name, " one_shot=", one_shot) + if interacted_sign_texture: + sign_mark.sprite2d.texture = interacted_sign_texture if one_shot: return sign_mark.interacted.connect(_interacted) area.body_entered.connect(_entered) area.area_entered.connect(_area_entered) if on_first_enter_tree: - call_deferred("_do_trigger") + _do_trigger.call_deferred() func _check_sign_display(): - sign_mark.enabled = enabled and (not one_shot or not played) - sign_mark.display_sign = trigger_mode == "interact" + sign_mark.enabled = enabled and (not played or not one_shot) + sign_mark.display_sign = trigger_mode == "interact" + func _get_animation_player() -> AnimationPlayer: var node = get_parent() @@ -131,12 +139,12 @@ func _area_entered(_area = null): _do_trigger() -func _do_trigger(): +func _do_trigger() -> bool: var time = Time.get_ticks_msec() # 确保只有一个线程进入该逻辑,因为有时 player 碰撞和首次进入 tree 都会触发该方法 if not trigger_mutex.try_lock(): print("Ambush trigger mutex lock fail, name=", name) - return + return false print("Ambush trigger mutex locked, name=", name) if not one_shot and freeze_time > 0: var time_left = freeze_time - (time - played_time) * 0.001 @@ -144,10 +152,10 @@ func _do_trigger(): if GlobalConfig.DEBUG: print("Ambush freeze time not reached, time left=", time_left) trigger_mutex.unlock() - return + return false if one_shot and played: trigger_mutex.unlock() - return + return false played_time = time played = true trigger_mutex.unlock() @@ -169,10 +177,13 @@ func _do_trigger(): var animation_player = _get_animation_player() if animation_player: animation_player.call(hook_method) + if global_method: + GlobalFunctor.call(global_method) triggered.emit() if GlobalConfig.DEBUG: print("ambush triggered! name=", name) _check_sign_display() + return true func _on_dialogue_ended(_res): diff --git a/scene/entity/ambush.tscn b/scene/entity/ambush.tscn index 93762516..b2db994a 100644 --- a/scene/entity/ambush.tscn +++ b/scene/entity/ambush.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=4 format=3 uid="uid://bnf3lkcbpx1ar"] +[gd_scene load_steps=5 format=3 uid="uid://bnf3lkcbpx1ar"] [ext_resource type="Script" uid="uid://pf3dyid8b35p" path="res://scene/entity/ambush.gd" id="1_rxgbr"] +[ext_resource type="Texture2D" uid="uid://gui0ubwlwoi0" path="res://asset/art/ui/action_mark/UI手.png" id="2_1tnxk"] [ext_resource type="PackedScene" uid="uid://c4tipnj1cr1j3" path="res://scene/entity/ux/sign.tscn" id="2_n51wc"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_iwrfx"] @@ -9,14 +10,13 @@ size = Vector2(10, 70) [node name="Ambush" type="Sprite2D"] script = ExtResource("1_rxgbr") -freeze_time = 0.5 +interacted_sign_texture = ExtResource("2_1tnxk") hook_dialogue_title = "" hook_animation = "" hook_method = "" [node name="Sign" parent="." instance=ExtResource("2_n51wc")] unique_name_in_owner = true -display_sign = false [node name="Area2D" type="Area2D" parent="."] unique_name_in_owner = true diff --git a/scene/ground/ground.gd b/scene/ground/ground.gd index 21c06c80..2aa886a4 100644 --- a/scene/ground/ground.gd +++ b/scene/ground/ground.gd @@ -5,6 +5,7 @@ class_name Ground2D extends Node2D # 用于在 debug 时态下,指定进入的 portal @export_enum("left", "right", "1", "2", "3", "4", "5", "6", "7", "8", "9") var default_portal := "left" +@export var display_hud := true @export_group("Player", "player_") @export var player_y_fixed := true: set(val): @@ -77,6 +78,7 @@ func _ready() -> void: printerr("scene_name is not valid") if Engine.is_editor_hint(): return + SceneManager.toggle_hud_display(display_hud) # 隐藏 player_line player_line.visible = false _set_camera_and_player_boundary() diff --git a/scene/ground/ground.tscn b/scene/ground/ground.tscn index f8903600..277ac327 100644 --- a/scene/ground/ground.tscn +++ b/scene/ground/ground.tscn @@ -1,7 +1,6 @@ -[gd_scene load_steps=10 format=3 uid="uid://dayyx4jerj7io"] +[gd_scene load_steps=9 format=3 uid="uid://dayyx4jerj7io"] [ext_resource type="Script" uid="uid://bee4ot74k4wg2" path="res://scene/ground/ground.gd" id="1_0vrlo"] -[ext_resource type="PackedScene" uid="uid://dygvcmykn02n8" path="res://scene/main.tscn" id="2_6ggqv"] [ext_resource type="PackedScene" uid="uid://cjhw5ecygrqty" path="res://scene/player/main_player.tscn" id="3_atha7"] [ext_resource type="PackedScene" uid="uid://61pis75a8fdq" path="res://scene/entity/portal.tscn" id="3_t73yw"] [ext_resource type="PackedScene" uid="uid://cqkeegrcdjyg4" path="res://scene/ground/camera/camera_focus_marker.tscn" id="4_mgk0a"] @@ -24,7 +23,6 @@ height = 500 [node name="Ground" type="Node2D"] script = ExtResource("1_0vrlo") -main_scene = ExtResource("2_6ggqv") [node name="AnimationPlayer" type="AnimationPlayer" parent="."] diff --git a/scene/ground/scene/c01/s08_书店.tscn b/scene/ground/scene/c01/s08_书店.tscn index 5d90d363..32ca2f93 100644 --- a/scene/ground/scene/c01/s08_书店.tscn +++ b/scene/ground/scene/c01/s08_书店.tscn @@ -75,11 +75,10 @@ metadata/_custom_type_script = "uid://rq6w1vuhuq1m" [node name="诡异环境音" type="AudioStreamPlayer" parent="Ground/AnimationPlayer" index="1"] stream = ExtResource("5_eerhd") volume_db = -7.0 -autoplay = true bus = &"game_sfx" script = ExtResource("4_p6k3c") mode = "场景背景音" -"自动开始" = true +"自动开始" = false "循环播放" = true "感应玩家操作" = false metadata/_custom_type_script = "uid://rq6w1vuhuq1m" diff --git a/scene/ground/scene/c02/s10_animation.gd b/scene/ground/scene/c02/s10_animation.gd index 78a9b104..2ad180a5 100644 --- a/scene/ground/scene/c02/s10_animation.gd +++ b/scene/ground/scene/c02/s10_animation.gd @@ -26,7 +26,7 @@ var counter: Interactable2D var wood_puppet: Pickable2D var catty_head: Pickable2D var door: Portal2D -var portal: Portal2D +var portal_note: Note2D func _on_ground_ready() -> void: @@ -36,7 +36,7 @@ func _on_ground_ready() -> void: wood_puppet = $"../DeployLayer/Pickable木头人偶" catty_head = $"../DeployLayer/Pickable小猫玩具脑袋" door = $"../DeployLayer/portal_left" - portal = $"../DeployLayer/portal_1" + portal_note = $"../DeployLayer/Note进入隧道询问" # 进过瞎子卧室后,通道关闭 if ArchiveManager.get_global_value("c02_the_blind_room_unlocked"): @@ -165,14 +165,14 @@ func after_counter_moved(): # default_counter_x +- 40 var x_diff = current_x - default_counter_x if x_diff > -40 and x_diff < 40: - portal.enabled = false + portal_note.enabled = false catty_head.enabled = false return catty_head.enabled = true # 进过瞎子卧室后,通道关闭 var entered = ArchiveManager.get_global_value("c02_the_blind_room_unlocked", false) if not entered and catty_head.picked: - portal.enabled = true + portal_note.enabled = true func _on_pick_catty_head() -> void: @@ -191,4 +191,4 @@ func _on_pick_catty_head() -> void: SceneManager.enable_prop_item("prop_小猫玩具完整") # 进过瞎子卧室后,通道关闭 if not ArchiveManager.get_global_value("c02_the_blind_room_unlocked"): - portal.enabled = true + portal_note.enabled = true diff --git a/scene/ground/scene/c02/s10_空房间.tscn b/scene/ground/scene/c02/s10_空房间.tscn index 97675b9d..5015f173 100644 --- a/scene/ground/scene/c02/s10_空房间.tscn +++ b/scene/ground/scene/c02/s10_空房间.tscn @@ -1,15 +1,16 @@ -[gd_scene load_steps=25 format=3 uid="uid://dny21yhtuteap"] +[gd_scene load_steps=26 format=3 uid="uid://dny21yhtuteap"] [ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_w7j0m"] [ext_resource type="Script" uid="uid://dkkey7qillk15" path="res://scene/ground/scene/c02/s10_animation.gd" id="2_egtqi"] [ext_resource type="AudioStream" uid="uid://6gttowdwmado" path="res://asset/audio/sfx/环境音/第一章/房间内部场景1.wav" id="3_chbaa"] [ext_resource type="Texture2D" uid="uid://molvyfyy63ik" path="res://asset/art/scene/c02/s10_空房间/bg_空房间.png" id="3_ox8et"] [ext_resource type="Script" uid="uid://rq6w1vuhuq1m" path="res://scene/entity/audio/sfx.gd" id="4_chbaa"] -[ext_resource type="PackedScene" uid="uid://61pis75a8fdq" path="res://scene/entity/portal.tscn" id="4_pde4i"] [ext_resource type="PackedScene" uid="uid://cw3q5pvciumil" path="res://scene/entity/interactable.tscn" id="5_ylhfc"] [ext_resource type="PackedScene" uid="uid://dsa6frlw6e6gg" path="res://scene/entity/pickable.tscn" id="6_27dvh"] [ext_resource type="Texture2D" uid="uid://cuno8okh8ytw2" path="res://asset/art/scene/c02/s10_空房间/柜子.png" id="6_mty8e"] +[ext_resource type="PackedScene" uid="uid://jr1yd46wm5je" path="res://scene/entity/note.tscn" id="7_th1ek"] [ext_resource type="Texture2D" uid="uid://dg43u88jwlbpu" path="res://asset/art/prop/c02/新小猫头.png" id="8_3ftnp"] +[ext_resource type="Texture2D" uid="uid://gui0ubwlwoi0" path="res://asset/art/ui/action_mark/UI手.png" id="8_to1d1"] [ext_resource type="Texture2D" uid="uid://cdsq0ylmgtfq0" path="res://asset/art/prop/c02/小蝉人偶.png" id="12_27dvh"] [ext_resource type="PackedScene" uid="uid://cxw5rovg5mu1a" path="res://scene/ground/script/c02/s00_煤油灯.tscn" id="13_27dvh"] [ext_resource type="PackedScene" uid="uid://bnf3lkcbpx1ar" path="res://scene/entity/ambush.tscn" id="14_3ftnp"] @@ -71,7 +72,6 @@ metadata/_edit_horizontal_guides_ = [87.0, 86.0] [node name="Ground" parent="." instance=ExtResource("1_w7j0m")] scene_name = "c02_s10" -default_portal = "1" player_y = 60 [node name="AnimationPlayer" parent="Ground" index="0"] @@ -109,14 +109,12 @@ matched_sign_texture = null position = Vector2(510, 20.7047) matched_sign_texture = null -[node name="portal_1" parent="Ground/DeployLayer" index="2" instance=ExtResource("4_pde4i")] -position = Vector2(363, 54.2267) -debug_note = "通往裂缝" -enabled = false -portal_name = "1" -target_scene = "c02_s09" -target_portal = "right" -matched_sign_texture = null +[node name="Note进入隧道询问" parent="Ground/DeployLayer" index="2" instance=ExtResource("7_th1ek")] +position = Vector2(362, 20) +mode = "ballon" +dialogue = "c02" +note_sign_texture = ExtResource("8_to1d1") +note_key = "c02_钻入隧道询问" [node name="小蜡烛" type="AnimatedSprite2D" parent="Ground/DeployLayer" index="3"] self_modulate = Color(0.611765, 0.611765, 0.611765, 1) diff --git a/scene/ground/scene/c02/s12_盒子猫.tscn b/scene/ground/scene/c02/s12_盒子猫.tscn index b93e9fca..70f0d9a7 100644 --- a/scene/ground/scene/c02/s12_盒子猫.tscn +++ b/scene/ground/scene/c02/s12_盒子猫.tscn @@ -10,6 +10,7 @@ [node name="Ground" parent="." instance=ExtResource("1_ngo77")] scene_name = "c02_s12" +display_hud = null player_y = 87 footstep_type = "盒子猫" @@ -22,13 +23,13 @@ texture = ExtResource("3_oskpk") offset = Vector2(0, -102) [node name="portal_left" parent="Ground/DeployLayer" index="0"] -position = Vector2(152, 50) +position = Vector2(152, 56) target_scene = "c02_s17" target_portal = "1" status = "opened" [node name="portal_right" parent="Ground/DeployLayer" index="1"] -position = Vector2(579, 0) +position = Vector2(465, 21) [node name="小猫初始动画" type="AnimatedSprite2D" parent="Ground/DeployLayer" index="2"] position = Vector2(211, 3) @@ -49,6 +50,9 @@ position = Vector2(3584, -7) [node name="PlayerLine2D" parent="Ground/ParallaxForeground" index="2"] points = PackedVector2Array(37, 150, 400, 150) +[node name="DirectionalLight2D" parent="Ground" index="8"] +blend_mode = 1 + [node name="盒子猫CanvasLayer" parent="Ground" instance=ExtResource("4_vv3sh")] visible = false offset = Vector2(-40, -158) diff --git a/scene/ground/scene/c02/s13_盒子猫二楼.tscn b/scene/ground/scene/c02/s13_盒子猫二楼.tscn index 6ea31b79..8311baa8 100644 --- a/scene/ground/scene/c02/s13_盒子猫二楼.tscn +++ b/scene/ground/scene/c02/s13_盒子猫二楼.tscn @@ -1,20 +1,24 @@ -[gd_scene load_steps=11 format=3 uid="uid://bvjutch6jex0v"] +[gd_scene load_steps=13 format=3 uid="uid://bvjutch6jex0v"] [ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_71lma"] [ext_resource type="Script" uid="uid://28ujp27cbdh2" path="res://scene/ground/scene/c02/s13_animation.gd" id="2_w5nqu"] [ext_resource type="AudioStream" uid="uid://ccng5y2fip6mc" path="res://asset/audio/sfx/UI/开锁声.mp3" id="3_g6cxj"] [ext_resource type="Texture2D" uid="uid://dweafdywxenu6" path="res://asset/art/scene/c02/s12_to_s17_盒子猫/bg_二楼楼道.png" id="3_miykx"] [ext_resource type="Texture2D" uid="uid://b3ootg88b63rb" path="res://asset/art/scene/c02/旧版/s13_院子诡异版/fg_楼梯调色后.png" id="4_4adgb"] -[ext_resource type="PackedScene" uid="uid://61pis75a8fdq" path="res://scene/entity/portal.tscn" id="4_u2fv1"] [ext_resource type="Script" uid="uid://rq6w1vuhuq1m" path="res://scene/entity/audio/sfx.gd" id="4_yywsi"] [ext_resource type="PackedScene" uid="uid://jr1yd46wm5je" path="res://scene/entity/note.tscn" id="5_gge8e"] [ext_resource type="Texture2D" uid="uid://csrfyvaufo1wb" path="res://asset/art/scene/c02/s12_to_s17_盒子猫/l_瞎子理发店光.png" id="6_gge8e"] +[ext_resource type="Texture2D" uid="uid://gui0ubwlwoi0" path="res://asset/art/ui/action_mark/UI手.png" id="7_g6cxj"] [ext_resource type="PackedScene" uid="uid://khwxm5qbfj3k" path="res://scene/ground/script/c02/盒子猫canvas_layer.tscn" id="7_u2fv1"] +[ext_resource type="PackedScene" uid="uid://bnf3lkcbpx1ar" path="res://scene/entity/ambush.tscn" id="9_yywsi"] +[ext_resource type="PackedScene" uid="uid://dewbg4phd8c17" path="res://scene/ground/script/c02/追猫猪头怪.tscn" id="10_kmk38"] [node name="S13" type="Node2D"] [node name="Ground" parent="." instance=ExtResource("1_71lma")] scene_name = "c02_s13" +display_hud = null +player_y = 85 footstep_type = "盒子猫" [node name="AnimationPlayer" parent="Ground" index="0"] @@ -29,35 +33,57 @@ metadata/_custom_type_script = "uid://rq6w1vuhuq1m" [node name="BGSprite2D" parent="Ground" index="1"] texture = ExtResource("3_miykx") -offset = Vector2(0, -105) +offset = Vector2(0, -102) [node name="portal_left" parent="Ground/DeployLayer" index="0"] -position = Vector2(40, 48) +position = Vector2(36, 54) target_scene = "c02_s14" target_portal = "left" [node name="portal_right" parent="Ground/DeployLayer" index="1"] -position = Vector2(776, 52) +position = Vector2(776, 55) target_scene = "c02_s17" target_portal = "right" -[node name="portal_1" parent="Ground/DeployLayer" index="2" instance=ExtResource("4_u2fv1")] -position = Vector2(106, 51) -portal_name = "1" -target_scene = "c02_s12" -target_portal = "left" -status = "opened" - -[node name="NotePortal" parent="Ground/DeployLayer" index="3" instance=ExtResource("5_gge8e")] -position = Vector2(852, 0) +[node name="NotePortal" parent="Ground/DeployLayer" index="2" instance=ExtResource("5_gge8e")] +position = Vector2(853, 6) +note_sign_texture = ExtResource("7_g6cxj") note_key = "notes_无法通过" -[node name="终点光芒" type="Sprite2D" parent="Ground/DeployLayer" index="4"] +[node name="终点光芒" type="Sprite2D" parent="Ground/DeployLayer" index="3"] modulate = Color(1, 1, 1, 0.34902) position = Vector2(226, 11) texture = ExtResource("6_gge8e") +[node name="Ambush猫咪敲门互动" parent="Ground/DeployLayer" index="4" instance=ExtResource("9_yywsi")] +position = Vector2(103, 6) +trigger_mode = "interact" +one_shot = false +freeze_time = 1.5 +global_method = "c02_cat_play_with_door" + +[node name="Ambush猫咪敲门互动2" parent="Ground/DeployLayer" index="5" instance=ExtResource("9_yywsi")] +position = Vector2(539, 6) +trigger_mode = "interact" +one_shot = false +freeze_time = 1.5 +global_method = "c02_cat_play_with_door" + +[node name="Ambush猫咪敲门互动3" parent="Ground/DeployLayer" index="6" instance=ExtResource("9_yywsi")] +position = Vector2(663, 5) +trigger_mode = "interact" +one_shot = false +freeze_time = 1.5 +global_method = "c02_cat_play_with_door" + +[node name="追猫猪头怪" parent="Ground/DeployLayer" index="7" instance=ExtResource("10_kmk38")] +position = Vector2(642, 17) + +[node name="追猫猪头怪2" parent="Ground/DeployLayer" index="8" instance=ExtResource("10_kmk38")] +position = Vector2(154, 18) + [node name="MainPlayer" parent="Ground" index="4"] +position = Vector2(41, 73) character = "盒子猫" [node name="楼梯" type="Sprite2D" parent="Ground/ParallaxForeground/BGParallaxLayer" index="0"] diff --git a/scene/ground/scene/c02/s14_盒子猫二楼内侧.tscn b/scene/ground/scene/c02/s14_盒子猫二楼内侧.tscn index c7403444..dd24e785 100644 --- a/scene/ground/scene/c02/s14_盒子猫二楼内侧.tscn +++ b/scene/ground/scene/c02/s14_盒子猫二楼内侧.tscn @@ -10,6 +10,8 @@ [node name="Ground" parent="." instance=ExtResource("1_cr1hi")] scene_name = "c02_s14" +display_hud = null +player_y = 85 footstep_type = "盒子猫" [node name="AnimationPlayer" parent="Ground" index="0"] @@ -18,30 +20,32 @@ oneshot_animation = "" [node name="BGSprite2D" parent="Ground" index="1"] texture = ExtResource("3_cr1hi") -offset = Vector2(0, -105) +offset = Vector2(0, -102) [node name="portal_left" parent="Ground/DeployLayer" index="0"] -position = Vector2(354, 49) +position = Vector2(363, 58) target_scene = "c02_s13" target_portal = "left" [node name="portal_right" parent="Ground/DeployLayer" index="1"] -position = Vector2(564, 48) +position = Vector2(565, 56) target_scene = "c02_s15" target_portal = "right" [node name="portal_1" parent="Ground/DeployLayer" index="2" instance=ExtResource("4_o47bv")] -position = Vector2(494, 48) +position = Vector2(492, 57) portal_name = "1" target_scene = "c02_s16" target_portal = "right" [node name="MainPlayer" parent="Ground" index="4"] +position = Vector2(41, 73) character = "盒子猫" [node name="PlayerLine2D" parent="Ground/ParallaxForeground" index="2"] -points = PackedVector2Array(37, 150, 660, 150) +points = PackedVector2Array(101, 150, 660, 150) [node name="盒子猫CanvasLayer" parent="Ground" instance=ExtResource("5_cr1hi")] +visible = false [editable path="Ground"] diff --git a/scene/ground/scene/c02/s15_盒子猫一楼内侧.tscn b/scene/ground/scene/c02/s15_盒子猫一楼内侧.tscn index 13894c62..7cdf995b 100644 --- a/scene/ground/scene/c02/s15_盒子猫一楼内侧.tscn +++ b/scene/ground/scene/c02/s15_盒子猫一楼内侧.tscn @@ -1,16 +1,18 @@ -[gd_scene load_steps=6 format=3 uid="uid://b21p53g42j2nt"] +[gd_scene load_steps=7 format=3 uid="uid://b21p53g42j2nt"] [ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_qxg0l"] [ext_resource type="Script" uid="uid://ebaq235h32fd" path="res://scene/ground/scene/c02/s15_animation.gd" id="2_etqjj"] [ext_resource type="Texture2D" uid="uid://c4eb71kdnqy3y" path="res://asset/art/scene/c02/s12_to_s17_盒子猫/bg_一楼内侧楼道(粉笔画).png" id="3_qxg0l"] [ext_resource type="PackedScene" uid="uid://jr1yd46wm5je" path="res://scene/entity/note.tscn" id="4_etqjj"] [ext_resource type="PackedScene" uid="uid://khwxm5qbfj3k" path="res://scene/ground/script/c02/盒子猫canvas_layer.tscn" id="5_isic3"] +[ext_resource type="Texture2D" uid="uid://gui0ubwlwoi0" path="res://asset/art/ui/action_mark/UI手.png" id="5_qxg0l"] [node name="S15" type="Node2D"] [node name="Ground" parent="." instance=ExtResource("1_qxg0l")] scene_name = "c02_s15" -player_y = 60 +display_hud = null +player_y = 85 footstep_type = "盒子猫" [node name="AnimationPlayer" parent="Ground" index="0"] @@ -19,22 +21,23 @@ oneshot_animation = "" [node name="BGSprite2D" parent="Ground" index="1"] texture = ExtResource("3_qxg0l") -offset = Vector2(0, -105) +offset = Vector2(0, -102) [node name="portal_left" parent="Ground/DeployLayer" index="0"] -position = Vector2(64, 13) +position = Vector2(160, 57) [node name="portal_right" parent="Ground/DeployLayer" index="1"] -position = Vector2(496, 47) +position = Vector2(496, 57) target_scene = "c02_s14" target_portal = "right" [node name="NotePortal" parent="Ground/DeployLayer" index="2" instance=ExtResource("4_etqjj")] -position = Vector2(362, 0) +position = Vector2(366, 10) +note_sign_texture = ExtResource("5_qxg0l") note_key = "notes_无法通过" [node name="MainPlayer" parent="Ground" index="4"] -position = Vector2(64, 98) +position = Vector2(64, 73) character = "盒子猫" facing_direction = Vector2(1, 0) @@ -42,8 +45,9 @@ facing_direction = Vector2(1, 0) position = Vector2(-1, -15) [node name="PlayerLine2D" parent="Ground/ParallaxForeground" index="2"] -points = PackedVector2Array(37, 150, 660, 150) +points = PackedVector2Array(125, 150, 660, 150) [node name="盒子猫CanvasLayer" parent="Ground" instance=ExtResource("5_isic3")] +visible = false [editable path="Ground"] diff --git a/scene/ground/scene/c02/s16_盒子猫三楼内侧.tscn b/scene/ground/scene/c02/s16_盒子猫三楼内侧.tscn index 62d8fcc0..99114fd2 100644 --- a/scene/ground/scene/c02/s16_盒子猫三楼内侧.tscn +++ b/scene/ground/scene/c02/s16_盒子猫三楼内侧.tscn @@ -1,15 +1,17 @@ -[gd_scene load_steps=6 format=3 uid="uid://22hc3oe8t0id"] +[gd_scene load_steps=7 format=3 uid="uid://22hc3oe8t0id"] [ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_umyae"] [ext_resource type="Script" uid="uid://dx2w5v1erjyls" path="res://scene/ground/scene/c02/s16_animation.gd" id="2_tmnwc"] [ext_resource type="Texture2D" uid="uid://by4ymjhnma8c6" path="res://asset/art/scene/c02/s12_to_s17_盒子猫/bg_三楼内侧楼道(粉笔画).png" id="3_tmnwc"] [ext_resource type="PackedScene" uid="uid://61pis75a8fdq" path="res://scene/entity/portal.tscn" id="4_qkv3g"] +[ext_resource type="PackedScene" uid="uid://bnf3lkcbpx1ar" path="res://scene/entity/ambush.tscn" id="5_qkv3g"] [ext_resource type="PackedScene" uid="uid://khwxm5qbfj3k" path="res://scene/ground/script/c02/盒子猫canvas_layer.tscn" id="5_tmnwc"] [node name="S16" type="Node2D"] [node name="Ground" parent="." instance=ExtResource("1_umyae")] scene_name = "c02_s16" +display_hud = false player_y = 85 footstep_type = "盒子猫" @@ -19,22 +21,29 @@ oneshot_animation = "" [node name="BGSprite2D" parent="Ground" index="1"] texture = ExtResource("3_tmnwc") -offset = Vector2(0, -105) +offset = Vector2(0, -102) [node name="portal_left" parent="Ground/DeployLayer" index="0"] -position = Vector2(100, 25) +position = Vector2(57, 56) [node name="portal_right" parent="Ground/DeployLayer" index="1"] -position = Vector2(563, 48) +position = Vector2(564, 56) target_scene = "c02_s14" target_portal = "1" [node name="portal_1" parent="Ground/DeployLayer" index="2" instance=ExtResource("4_qkv3g")] -position = Vector2(363, 49) +position = Vector2(363, 58) portal_name = "1" target_scene = "c02_s17" target_portal = "left" +[node name="Ambush猫咪敲门互动" parent="Ground/DeployLayer" index="3" instance=ExtResource("5_qkv3g")] +position = Vector2(105, 16) +trigger_mode = "interact" +one_shot = false +freeze_time = 1.5 +global_method = "c02_cat_play_with_door" + [node name="MainPlayer" parent="Ground" index="4"] position = Vector2(235, 73) character = "盒子猫" @@ -47,5 +56,6 @@ position = Vector2(3584, -7) points = PackedVector2Array(37, 150, 655, 150) [node name="盒子猫CanvasLayer" parent="Ground" instance=ExtResource("5_tmnwc")] +visible = false [editable path="Ground"] diff --git a/scene/ground/scene/c02/s17_盒子猫三楼.tscn b/scene/ground/scene/c02/s17_盒子猫三楼.tscn index d723e75e..6aef09f7 100644 --- a/scene/ground/scene/c02/s17_盒子猫三楼.tscn +++ b/scene/ground/scene/c02/s17_盒子猫三楼.tscn @@ -1,10 +1,12 @@ -[gd_scene load_steps=6 format=3 uid="uid://cbr6gbgrl2wb1"] +[gd_scene load_steps=8 format=3 uid="uid://cbr6gbgrl2wb1"] [ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_e436a"] [ext_resource type="Script" uid="uid://bkkhxiyblu2lo" path="res://scene/ground/scene/c02/s17_animation.gd" id="2_e436a"] [ext_resource type="Texture2D" uid="uid://iyeqjguyrhog" path="res://asset/art/scene/c02/s12_to_s17_盒子猫/bg_三楼楼道(粉笔画).png" id="3_e436a"] [ext_resource type="PackedScene" uid="uid://61pis75a8fdq" path="res://scene/entity/portal.tscn" id="4_e436a"] [ext_resource type="PackedScene" uid="uid://khwxm5qbfj3k" path="res://scene/ground/script/c02/盒子猫canvas_layer.tscn" id="4_n3bxc"] +[ext_resource type="PackedScene" uid="uid://dewbg4phd8c17" path="res://scene/ground/script/c02/追猫猪头怪.tscn" id="6_pfgbg"] +[ext_resource type="PackedScene" uid="uid://bnf3lkcbpx1ar" path="res://scene/entity/ambush.tscn" id="8_m6dyn"] [node name="S17" type="Node2D"] @@ -19,24 +21,40 @@ oneshot_animation = "" [node name="BGSprite2D" parent="Ground" index="1"] texture = ExtResource("3_e436a") -offset = Vector2(0, -105) +offset = Vector2(0, -102) [node name="portal_left" parent="Ground/DeployLayer" index="0"] -position = Vector2(34, 48) +position = Vector2(35, 56) target_scene = "c02_s16" target_portal = "1" [node name="portal_right" parent="Ground/DeployLayer" index="1"] -position = Vector2(853, 47) +position = Vector2(853, 56) target_scene = "c02_s13" target_portal = "right" [node name="portal_1" parent="Ground/DeployLayer" index="2" instance=ExtResource("4_e436a")] -position = Vector2(661, 50) +position = Vector2(662, 57) debug_note = "出来就不能回来了" portal_name = "1" target_scene = "c02_s12" +[node name="Ambush猫咪敲门互动" parent="Ground/DeployLayer" index="3" instance=ExtResource("8_m6dyn")] +position = Vector2(661, 7) +trigger_mode = "interact" +one_shot = false +freeze_time = 1.5 +global_method = "c02_cat_play_with_door" + +[node name="Ambush猫咪敲门互动2" parent="Ground/DeployLayer" index="4" instance=ExtResource("8_m6dyn")] +position = Vector2(106, 6) +trigger_mode = "interact" +one_shot = false +freeze_time = 1.5 +global_method = "c02_cat_play_with_door" + +[node name="追猫猪头怪" parent="Ground/DeployLayer" index="5" instance=ExtResource("6_pfgbg")] + [node name="MainPlayer" parent="Ground" index="4"] position = Vector2(235, 73) character = "盒子猫" diff --git a/scene/ground/script/c02/敲门游戏.tscn b/scene/ground/script/c02/敲门游戏.tscn index 77bb4dbd..1037d137 100644 --- a/scene/ground/script/c02/敲门游戏.tscn +++ b/scene/ground/script/c02/敲门游戏.tscn @@ -1,9 +1,9 @@ [gd_scene load_steps=7 format=3 uid="uid://bxpexbk7f3rax"] [ext_resource type="Script" uid="uid://chap3ifmyg20c" path="res://scene/ground/script/c02/敲门游戏.gd" id="1_dnsvv"] -[ext_resource type="AudioStream" uid="uid://dw8dprxhvas85" path="res://asset/audio/sfx/交互/第一章/sfx_敲门2.wav" id="2_hgfqc"] +[ext_resource type="AudioStream" uid="uid://dw8dprxhvas85" path="res://asset/audio/sfx/交互/sfx_敲门2.wav" id="2_hgfqc"] [ext_resource type="Texture2D" uid="uid://dkvuc5llqax6d" path="res://asset/art/scene/c02/s03_公寓一楼院子/肉铺门板.png" id="3_n5c57"] -[ext_resource type="AudioStream" uid="uid://7of24bqow07e" path="res://asset/audio/sfx/交互/第一章/sfx_敲门1.wav" id="3_ue6qj"] +[ext_resource type="AudioStream" uid="uid://7of24bqow07e" path="res://asset/audio/sfx/交互/sfx_敲门1.wav" id="3_ue6qj"] [ext_resource type="AudioStream" uid="uid://sjanwwtxggtq" path="res://asset/audio/effect/impact/impactWood_medium_002.ogg" id="4_hgfqc"] [ext_resource type="AudioStream" uid="uid://b1kaqn1ewg2ly" path="res://asset/audio/sfx/交互/第一章/sfx_肉落下.wav" id="5_t58cl"] diff --git a/scene/ground/script/c02/水盆特写.gd b/scene/ground/script/c02/水盆特写.gd index 3b10a862..5a56670b 100644 --- a/scene/ground/script/c02/水盆特写.gd +++ b/scene/ground/script/c02/水盆特写.gd @@ -56,6 +56,7 @@ func _make_ripple(pos:Vector2) -> bool: if p_pos.x < 0 or p_pos.x > image_size.x or p_pos.y < 0 or p_pos.y > image_size.y: return false if image.get_pixelv(p_pos).a > 0: + $"Sfx水滴".play() # setup shader_parameter/offset var m_offset = -Vector2(pos.x / 564 - 0.5, pos.y / 316 - 0.5) shader.material.set("shader_parameter/offset", m_offset) diff --git a/scene/ground/script/c02/水盆特写.tscn b/scene/ground/script/c02/水盆特写.tscn index 364fdac2..71c47ba6 100644 --- a/scene/ground/script/c02/水盆特写.tscn +++ b/scene/ground/script/c02/水盆特写.tscn @@ -1,9 +1,11 @@ -[gd_scene load_steps=8 format=3 uid="uid://trkypc4gox20"] +[gd_scene load_steps=10 format=3 uid="uid://trkypc4gox20"] [ext_resource type="Script" uid="uid://bica4jcy2w6ta" path="res://scene/ground/script/c02/水盆特写.gd" id="1_qtddk"] [ext_resource type="Texture2D" uid="uid://oiswtv7jqcqy" path="res://asset/art/scene/c02/s06_二楼楼道/ux_水盆特写.png" id="2_h4mql"] +[ext_resource type="AudioStream" uid="uid://cm2p6wqgfuv8y" path="res://asset/audio/mixkit/mixkit-water-bubble-1317.wav" id="2_qpkvl"] [ext_resource type="Texture2D" uid="uid://bfum7jdjilgif" path="res://asset/art/scene/c02/s06_二楼楼道/ux_水中倒影成年.png" id="3_31ty5"] [ext_resource type="Texture2D" uid="uid://b0o1bgwdn6tcn" path="res://asset/art/scene/c02/s06_二楼楼道/ux_水中倒影幼年.png" id="3_ekkoo"] +[ext_resource type="Script" uid="uid://rq6w1vuhuq1m" path="res://scene/entity/audio/sfx.gd" id="3_j0ps2"] [ext_resource type="Texture2D" uid="uid://s1c6gytu0gbx" path="res://asset/art/scene/c02/s06_二楼楼道/ux_水盆波纹.png" id="3_rdtwt"] [ext_resource type="Shader" uid="uid://hxcx4sbqtniu" path="res://asset/shader/ripple.gdshader" id="4_qtddk"] @@ -22,6 +24,13 @@ script = ExtResource("1_qtddk") metadata/_edit_vertical_guides_ = [424.0] metadata/_edit_horizontal_guides_ = [253.0] +[node name="Sfx水滴" type="AudioStreamPlayer" parent="."] +stream = ExtResource("2_qpkvl") +volume_db = -5.0 +bus = &"game_sfx" +script = ExtResource("3_j0ps2") +metadata/_custom_type_script = "uid://rq6w1vuhuq1m" + [node name="背景" type="TextureRect" parent="."] anchors_preset = 15 anchor_right = 1.0 diff --git a/scene/ground/script/c02/盒子猫canvas_layer.gd b/scene/ground/script/c02/盒子猫canvas_layer.gd index 40fbab02..23b8c730 100644 --- a/scene/ground/script/c02/盒子猫canvas_layer.gd +++ b/scene/ground/script/c02/盒子猫canvas_layer.gd @@ -18,3 +18,46 @@ func _ready(): create_tween().tween_property(cat, "modulate:a", 0.0, show_cat_duration) else: cat.visible = false + + +var down_pressing = false: + set(val): + # print("down_pressing: ", val) + down_pressing = val + _try_toggle_crawl() + +var crawling = false: + set(val): + crawling = val + # print("crawling: ", val) + if val != down_pressing: + # 执行结束后,如果发现不一致,尝试切换 + # print("crawling mismatch, swtich to: ", down_pressing) + # 需要重置 tween + crawling_toggle_tween = null + _try_toggle_crawl() + +var crawling_toggle_tween: Tween + + +func _try_toggle_crawl(): + if crawling_toggle_tween and crawling_toggle_tween.is_valid(): + # print("tweening, skip.") + return + crawling_toggle_tween = create_tween() + var crawl = down_pressing + if crawl: + SceneManager.freeze_player(0, 7) + else: + SceneManager.freeze_player(0, 8, true) + crawling_toggle_tween.tween_interval(0.4) + if not crawl: + crawling_toggle_tween.tween_callback(SceneManager.release_player) + crawling_toggle_tween.tween_callback(func(): crawling = crawl) + + +func _unhandled_input(event: InputEvent) -> void: + if event.is_action_pressed("down") and not down_pressing: + down_pressing = true + elif event.is_action_released("down") and down_pressing: + down_pressing = false diff --git a/scene/ground/script/c02/追猫猪头怪.gd b/scene/ground/script/c02/追猫猪头怪.gd new file mode 100644 index 00000000..61a89faa --- /dev/null +++ b/scene/ground/script/c02/追猫猪头怪.gd @@ -0,0 +1,57 @@ +extends Node2D + +@export var enabled := true +# 追击开始距离 +@export var start_distance := 400 +# 追击开始方位(左/右) +@export var from_left := true +# 追击速度 +@export var speed := 30 +# 脚步声周期时间 +@export var footstep_wait_time := 0.7 + +@onready var sfx_footstep = $SfxFootstep as Sfx + +var footstep_timer + + +func _ready() -> void: + var player = SceneManager.get_player() + # 高度对齐 + position.y = player.position.y + # 脚步声 timer + footstep_timer = Timer.new() + footstep_timer.autostart = false + footstep_timer.wait_time = footstep_wait_time + add_child(footstep_timer) + footstep_timer.timeout.connect(_on_footstep_timer_timeout) + + +func _on_footstep_timer_timeout() -> void: + sfx_footstep.play() + # shake camera + + +# 启用/禁用脚步声 +func toggle_footstep_sfx(play := true): + if play: + footstep_timer.start() + else: + footstep_timer.stop() + +var move_tween :Tween + +# 开始追击 +func start_chasing() -> void: + toggle_footstep_sfx(true) + # 初始位置与方向 + + +# 停止追击 +func stop_chasing() -> void: + toggle_footstep_sfx(false) + +# 转身追击 +func turn_back(): + # 呼吸一帧,然后转身 + pass diff --git a/scene/ground/script/c02/追猫猪头怪.gd.uid b/scene/ground/script/c02/追猫猪头怪.gd.uid new file mode 100644 index 00000000..4ac95fcc --- /dev/null +++ b/scene/ground/script/c02/追猫猪头怪.gd.uid @@ -0,0 +1 @@ +uid://tn7sfe0qmix2 diff --git a/scene/ground/script/c02/追猫猪头怪.tscn b/scene/ground/script/c02/追猫猪头怪.tscn new file mode 100644 index 00000000..2b1fe4b7 --- /dev/null +++ b/scene/ground/script/c02/追猫猪头怪.tscn @@ -0,0 +1,29 @@ +[gd_scene load_steps=6 format=3 uid="uid://dewbg4phd8c17"] + +[ext_resource type="Script" uid="uid://tn7sfe0qmix2" path="res://scene/ground/script/c02/追猫猪头怪.gd" id="1_lrjfo"] +[ext_resource type="Script" uid="uid://wapo47a1oddf" path="res://scene/entity/audio/sfx2d.gd" id="2_35vtd"] +[ext_resource type="AudioStream" uid="uid://dd2whbtg7ah8a" path="res://asset/audio/sfx/脚步/猫咪走路2.wav" id="2_e62rv"] +[ext_resource type="SpriteFrames" uid="uid://b85gyfhk1mg6r" path="res://asset/art/gif/c02_盒子猫/c02_盒子猫_frames.tres" id="4_3sbui"] + +[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_3sbui"] +playback_mode = 1 +streams_count = 1 +stream_0/stream = ExtResource("2_e62rv") + +[node name="追猫猪头怪" type="Node2D"] +script = ExtResource("1_lrjfo") + +[node name="SfxFootstep" type="AudioStreamPlayer2D" parent="."] +stream = SubResource("AudioStreamRandomizer_3sbui") +max_distance = 600.0 +attenuation = 1.7411 +bus = &"game_sfx" +script = ExtResource("2_35vtd") +metadata/_custom_type_script = "uid://wapo47a1oddf" + +[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."] +z_index = 20 +sprite_frames = ExtResource("4_3sbui") +animation = &"猪头怪呼吸" +frame = 1 +frame_progress = 1.0 diff --git a/scene/player/main_player.gd b/scene/player/main_player.gd index 73097a1d..e13a136b 100644 --- a/scene/player/main_player.gd +++ b/scene/player/main_player.gd @@ -21,14 +21,12 @@ signal animation_finished @export var lock_move_left := false @export var lock_move_right := false @export var camera_marker: CameraFocusMarker -@export_enum("吕萍", "吕萍爬行", "吕萍带小猫", "吕萍推柜子", "小小蝶", "盒子猫") var character := "吕萍": +@export_enum("吕萍", "吕萍爬行", "吕萍带小猫", "吕萍推柜子", "小小蝶", "盒子猫", "小小小蝶") var character := "吕萍": set(val): character = val - # 使用 new,方便在 editor 中刷新新值 - current_animation_config = PlayerAnimationConfig.new().ANIMATION_CONFIG[val] - current_status = PlayerAnimationConfig.MOVEMENT_IDLE if is_node_ready(): - sprite.scale = current_animation_config["scale"] + # 切换 inventory + _check_character_runtime_status() # @export var shadow_color := Color(0.1, 0.1, 0.1, 0.7) # var shadow_y := 0.0 @export var player_movement_rect := Rect2(50, -500, 1400, 1000) @@ -61,15 +59,14 @@ signal animation_finished if not Engine.is_editor_hint(): return debug_freeze = val - current_animation_config = PlayerAnimationConfig.new().ANIMATION_CONFIG[character] - if val > 3: - freeze_player(0, val, true) - release_player() + if is_node_ready(): + _check_character_runtime_status() + if val > 3: + freeze_player(0, val, true) + release_player() # 使用 new,方便在 editor 中刷新新值 -var current_animation_config := ( - PlayerAnimationConfig.new().ANIMATION_CONFIG[character] as Dictionary -) +var current_animation_config: Dictionary @onready var light = $PointLight2D as PointLight2D @onready var catty_light = $CattyPointLight2D as PointLight2D @@ -86,28 +83,48 @@ func _ready() -> void: sprite.visible = not hide_sprite light.enabled = enable_light os_contaner.modulate.a = 0.0 - # set up animated sprite - sprite.scale = current_animation_config["scale"] + _check_character_runtime_status() _play_animation() - if Engine.is_editor_hint(): + if not Engine.is_editor_hint(): + footstep_timer.timeout.connect(_on_footstep_timer_timeout) + footstep_timer.stop() + sprite.animation_finished.connect(animation_finished.emit) + + +# func _enter_tree() -> void: +# if is_node_ready() and not Engine.is_editor_hint(): +# _check_character_runtime_status() + + +func _check_character_runtime_status(): + # set up animated sprite + # 使用 new,方便在 editor 中刷新新值 + current_animation_config = PlayerAnimationConfig.new().ANIMATION_CONFIG[character] + current_status = PlayerAnimationConfig.MOVEMENT_IDLE + sprite.scale = current_animation_config["scale"] + # editor 中无需检查下列项目 + if Engine.is_editor_hint() or not is_node_ready() or SceneManager.is_restarting(): return - footstep_timer.timeout.connect(_on_footstep_timer_timeout) - footstep_timer.stop() - sprite.animation_finished.connect(animation_finished.emit) - _check_character_status() # 如果当前是 prop_小猫玩具完整 ,尝试点亮玩家的灯效;否则无需点亮 if SceneManager.get_current_prop(false) == "prop_小猫玩具完整": set_catty_light(true) - - -func _enter_tree() -> void: - if is_node_ready() and not Engine.is_editor_hint(): - _check_character_status() - - -func _check_character_status(): - # 检查角色锁定状态 - running_locked = ArchiveManager.archive.player_running_locked + else: + set_catty_light(false) + # 设置 inventory + if not ArchiveManager or not ArchiveManager.archive: + printerr("player _checkout_inventory failed. ArchiveManager or Archive is not ready.") + else: + # 每个角色有对应 inverntory + var archive = ArchiveManager.archive + # 检查角色锁定状态 + running_locked = archive.player_running_locked + match character: + "小小蝶": + SceneManager.checkout_prop_inventory(archive.prop_inventory_xxdie) + "小小小蝶": + SceneManager.checkout_prop_inventory(archive.prop_inventory_xxxdie) + _: + SceneManager.checkout_prop_inventory(archive.prop_inventory) func _on_footstep_timer_timeout(): diff --git a/scene/player/player_animation_config.gd b/scene/player/player_animation_config.gd index a1c348e5..88530311 100644 --- a/scene/player/player_animation_config.gd +++ b/scene/player/player_animation_config.gd @@ -163,4 +163,23 @@ var ANIMATION_CONFIG = { 7: [&"c02_盒子猫躲藏", Vector2.ONE, Vector2(0, -68.0)], 8: [&"c02_盒子猫停止躲藏", Vector2.ONE, Vector2(0, -68.0)], }, + "小小小蝶": + { + "scale": Vector2(1, 1), + "speed_walking": 55.0, + "can_run": true, + "speed_runnig": 100.0, + "walk_footstep": 0.5, + "run_footstep": 7.0 / 9.0 / 2.0, + "os_height": 70.0, + "light_height": 20.0, + # 如果使用 auto,就会自动以最低点为基准 + # "auto_foot_offset": true, + "foot_offset": Vector2(0, -68.0), + MOVEMENT_IDLE: [&"", &"c02_盒子猫_idle_r"], + # 此处为[2][3]分别为 sprite 向左、向右时的 offset + MOVEMENT_WALKING: [&"", &"c02_盒子猫_walking_r"], + MOVEMENT_RUNNING: [&"", &"c02_盒子猫_running_r"], + 5: [&"c02_盒子猫钻进盒子", Vector2.ONE, Vector2(-20, -68.0)], + }, } diff --git a/scene/prop/prop_hud.gd b/scene/prop/prop_hud.gd index 15d2a42d..ddb7c969 100644 --- a/scene/prop/prop_hud.gd +++ b/scene/prop/prop_hud.gd @@ -55,12 +55,16 @@ var item_config_res = preload("res://asset/dialogue/item_description.dialogue") var path_prefix = "res://asset/art/prop/" var cached_inventory_textures := {} +# hud 展示与隐藏动效 var listen_mouse = false var displaying = false var timer := Timer.new() var display_tween: Tween var container_tween: Tween +# hud 是否监听快捷键 +var listening_hotkey = true + func _emit_changed(prop_key := ""): if not selected: @@ -127,7 +131,7 @@ func _load_items(): items_dict[item.key] = item # # 检查是否是重要物品,如果是,则添加到 items_description_dict items_description_dict[item.key] = tr(item.key + "_说明").replace("
", "\n") - + # if item_config_res.titles.has(item.key): # var important_item_line_id = item_config_res.titles[item.key] # items_description_dict[item.key] = get_import_item_content(important_item_line_id) @@ -160,6 +164,25 @@ func _load_from_archive() -> void: _update_prop_display_with_texture() +func checkout_inventory(inv: PropInventory) -> void: + inventory = inv + _align_container_size() + _load_texture_cache() + _update_prop_display_with_texture() + + +func hide_hud(): + # 隐藏 hud 并静音 + hide() + listening_hotkey = false + + +func display_hud(): + # 显示 hud 并取消静音 + show() + listening_hotkey = true + + func _load_texture_cache() -> void: if not inventory: return @@ -359,7 +382,7 @@ func _on_timer_timeout() -> void: func _unhandled_input(event: InputEvent) -> void: - if locked: + if locked or not listening_hotkey: return if event.is_action_pressed("prop_left"): on_left_pressed()