优化sign snapper交互过程:delay-arrived-wait; 第一章火灾牵手跑演出

This commit is contained in:
cakipaul 2025-06-25 18:50:02 +08:00
parent 3774b3b62a
commit 5af20d5bfe
88 changed files with 1025 additions and 911 deletions

View File

@ -1,14 +1,13 @@
[gd_resource type="SpriteFrames" load_steps=99 format=3 uid="uid://b0icyhxpj16tv"]
[gd_resource type="SpriteFrames" load_steps=98 format=3 uid="uid://b0icyhxpj16tv"]
[ext_resource type="Texture2D" uid="uid://swoydeghhp4f" path="res://asset/art/gif/c02_谢幕演出/一起牵手跑步/0.png" id="1_dcxit"]
[ext_resource type="Texture2D" uid="uid://c1b5ek0diwa4u" path="res://asset/art/gif/c02_谢幕演出/一起牵手跑步/1.png" id="2_qjesf"]
[ext_resource type="Texture2D" uid="uid://1b1a4f4ehfx5" path="res://asset/art/gif/c02_谢幕演出/一起牵手跑步/2.png" id="3_6x1hw"]
[ext_resource type="Texture2D" uid="uid://fhrrv6vj8ac7" path="res://asset/art/gif/c02_谢幕演出/一起牵手跑步/3.png" id="4_3rik6"]
[ext_resource type="Texture2D" uid="uid://xap5cy8ibaom" path="res://asset/art/gif/c02_谢幕演出/一起牵手跑步/4.png" id="5_ysr4j"]
[ext_resource type="Texture2D" uid="uid://mirprq71s1i3" path="res://asset/art/gif/c02_谢幕演出/一起牵手跑步/5.png" id="6_roeuf"]
[ext_resource type="Texture2D" uid="uid://i2horxpxqdl1" path="res://asset/art/gif/c02_谢幕演出/一起牵手跑步/6.png" id="7_hlqm1"]
[ext_resource type="Texture2D" uid="uid://bbobudcd1x0x0" path="res://asset/art/gif/c02_谢幕演出/一起牵手跑步/7.png" id="8_jn752"]
[ext_resource type="Texture2D" uid="uid://c4mcicg5jh1w3" path="res://asset/art/gif/c02_谢幕演出/一起牵手跑步/8.png" id="9_gt5gk"]
[ext_resource type="Texture2D" uid="uid://3yp8wjdlisg7" path="res://asset/art/gif/c02_谢幕演出/一起牵手跑步/0.png" id="1_dcxit"]
[ext_resource type="Texture2D" uid="uid://dy0c87f4lyanb" path="res://asset/art/gif/c02_谢幕演出/一起牵手跑步/1.png" id="2_qjesf"]
[ext_resource type="Texture2D" uid="uid://cpbwro2r8rxq8" path="res://asset/art/gif/c02_谢幕演出/一起牵手跑步/2.png" id="3_6x1hw"]
[ext_resource type="Texture2D" uid="uid://b4sptoxq8cad0" path="res://asset/art/gif/c02_谢幕演出/一起牵手跑步/3.png" id="4_3rik6"]
[ext_resource type="Texture2D" uid="uid://btduvh8b3c4ew" path="res://asset/art/gif/c02_谢幕演出/一起牵手跑步/4.png" id="5_ysr4j"]
[ext_resource type="Texture2D" uid="uid://dr6e7jomshvsh" path="res://asset/art/gif/c02_谢幕演出/一起牵手跑步/5.png" id="6_roeuf"]
[ext_resource type="Texture2D" uid="uid://cjj7vu23hgak7" path="res://asset/art/gif/c02_谢幕演出/一起牵手跑步/6.png" id="7_hlqm1"]
[ext_resource type="Texture2D" uid="uid://erpp4jgxj2y6" path="res://asset/art/gif/c02_谢幕演出/一起牵手跑步/7.png" id="8_jn752"]
[ext_resource type="Texture2D" uid="uid://cipqugfhrxn0l" path="res://asset/art/gif/c02_谢幕演出/小婵呼吸_牵手前/0.png" id="18_qjesf"]
[ext_resource type="Texture2D" uid="uid://dsxns084r0yvw" path="res://asset/art/gif/c02_谢幕演出/小婵呼吸_牵手前/1.png" id="19_6x1hw"]
[ext_resource type="Texture2D" uid="uid://dxo626pxfvhyi" path="res://asset/art/gif/c02_谢幕演出/吕萍牵手动作/0.png" id="724_met76"]
@ -102,36 +101,33 @@
[resource]
animations = [{
"frames": [{
"duration": 1.0,
"duration": 3.0,
"texture": ExtResource("1_dcxit")
}, {
"duration": 1.0,
"duration": 3.0,
"texture": ExtResource("2_qjesf")
}, {
"duration": 1.0,
"duration": 3.0,
"texture": ExtResource("3_6x1hw")
}, {
"duration": 1.0,
"duration": 3.0,
"texture": ExtResource("4_3rik6")
}, {
"duration": 1.0,
"duration": 3.0,
"texture": ExtResource("5_ysr4j")
}, {
"duration": 1.0,
"duration": 3.0,
"texture": ExtResource("6_roeuf")
}, {
"duration": 1.0,
"duration": 3.0,
"texture": ExtResource("7_hlqm1")
}, {
"duration": 1.0,
"duration": 3.0,
"texture": ExtResource("8_jn752")
}, {
"duration": 1.0,
"texture": ExtResource("9_gt5gk")
}],
"loop": true,
"name": &"一起牵手跑步",
"speed": 6.0
"speed": 30.0
}, {
"frames": [{
"duration": 9.9,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -2,7 +2,7 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://swoydeghhp4f"
uid="uid://3yp8wjdlisg7"
path="res://.godot/imported/0.png-92b018576272d5383ade0c5425e3e597.ctex"
metadata={
"vram_texture": false

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

@ -2,7 +2,7 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://c1b5ek0diwa4u"
uid="uid://dy0c87f4lyanb"
path="res://.godot/imported/1.png-1b3a5f61b7fc7400030e7cd8f1542c75.ctex"
metadata={
"vram_texture": false

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@ -2,7 +2,7 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://1b1a4f4ehfx5"
uid="uid://cpbwro2r8rxq8"
path="res://.godot/imported/2.png-544365b37e70fc733fe86187c62f642a.ctex"
metadata={
"vram_texture": false

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@ -2,7 +2,7 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://fhrrv6vj8ac7"
uid="uid://b4sptoxq8cad0"
path="res://.godot/imported/3.png-b483acae7f7d03af171d5eef5022a25c.ctex"
metadata={
"vram_texture": false

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -2,7 +2,7 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://xap5cy8ibaom"
uid="uid://btduvh8b3c4ew"
path="res://.godot/imported/4.png-7785b7bf47d72e8bef66608fe4e73845.ctex"
metadata={
"vram_texture": false

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

@ -2,7 +2,7 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://mirprq71s1i3"
uid="uid://dr6e7jomshvsh"
path="res://.godot/imported/5.png-d1d4086f4191000c0a18248983de900b.ctex"
metadata={
"vram_texture": false

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@ -2,7 +2,7 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://i2horxpxqdl1"
uid="uid://cjj7vu23hgak7"
path="res://.godot/imported/6.png-f217728f71b67bd30ef229b5aec5340e.ctex"
metadata={
"vram_texture": false

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@ -2,7 +2,7 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://bbobudcd1x0x0"
uid="uid://erpp4jgxj2y6"
path="res://.godot/imported/7.png-d76ef97d58c7c3fc046c6dfdcb091398.ctex"
metadata={
"vram_texture": false

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://c4mcicg5jh1w3"
path="res://.godot/imported/8.png-91f27a22601ccff43ca64caf14ff17c2.ctex"
uid="uid://c1x2puu766w64"
path="res://.godot/imported/0.png-aec4a844a4e7d0020a35b69d15e1821a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://asset/art/gif/c02_谢幕演出/一起牵手跑步/8.png"
dest_files=["res://.godot/imported/8.png-91f27a22601ccff43ca64caf14ff17c2.ctex"]
source_file="res://asset/art/gif/c02_谢幕演出/小婵牵手动作/0.png"
dest_files=["res://.godot/imported/0.png-aec4a844a4e7d0020a35b69d15e1821a.ctex"]
[params]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -1,14 +0,0 @@
[remap]
importer="gif.animated.texture.plugin"
type="SpriteFrames"
uid="uid://ct8il0g3ehxn2"
path="res://.godot/imported/小婵牵手跑步改后.gif-68a53fa1e4ac29f594171f2a9efb822f.tres"
[deps]
source_file="res://asset/art/gif/c02_谢幕演出/小婵牵手跑步改后.gif"
dest_files=["res://.godot/imported/小婵牵手跑步改后.gif-68a53fa1e4ac29f594171f2a9efb822f.tres"]
[params]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -1,4 +1,4 @@
[gd_resource type="SpriteFrames" load_steps=87 format=3 uid="uid://bwdidg1akthvf"]
[gd_resource type="SpriteFrames" load_steps=85 format=3 uid="uid://bwdidg1akthvf"]
[ext_resource type="Texture2D" uid="uid://b1o46xue726he" path="res://asset/art/gif/c02_谢幕演出小蝶分镜/嘴巴动效/0.png" id="1_4fn1h"]
[ext_resource type="Texture2D" uid="uid://dwusvap6pt8su" path="res://asset/art/gif/c02_谢幕演出小蝶分镜/嘴巴动效/1.png" id="2_6d3ut"]
@ -71,8 +71,6 @@
[ext_resource type="Texture2D" uid="uid://d2vjmjovcpld1" path="res://asset/art/gif/c02_谢幕演出小蝶分镜/闭眼动效/4.png" id="112_yu3om"]
[ext_resource type="Texture2D" uid="uid://dfd3von84nk8l" path="res://asset/art/gif/c02_谢幕演出小蝶分镜/闭眼动效/5.png" id="113_hcxtl"]
[ext_resource type="Texture2D" uid="uid://buuf2rxccnij5" path="res://asset/art/gif/c02_谢幕演出小蝶分镜/闭眼动效/6.png" id="114_jxtmx"]
[ext_resource type="Texture2D" uid="uid://cgop588y1kpui" path="res://asset/art/gif/c02_谢幕演出小蝶分镜/闭眼动效/7.png" id="115_xf5cy"]
[ext_resource type="Texture2D" uid="uid://bnrtr7p3hl8pd" path="res://asset/art/gif/c02_谢幕演出小蝶分镜/闭眼动效/8.png" id="116_q7mkn"]
[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_6d3ut"]
load_path = "res://.godot/imported/3.png-af7c560e9537fd9b091512aed74c448e.ctex"
@ -432,32 +430,26 @@ animations = [{
"speed": 30.0
}, {
"frames": [{
"duration": 1.5,
"duration": 1.0,
"texture": ExtResource("108_nibmg")
}, {
"duration": 1.5,
"duration": 1.0,
"texture": ExtResource("109_kqeyo")
}, {
"duration": 1.5,
"duration": 1.0,
"texture": ExtResource("110_o2psr")
}, {
"duration": 1.5,
"duration": 1.0,
"texture": ExtResource("111_6dxhq")
}, {
"duration": 1.5,
"duration": 1.0,
"texture": ExtResource("112_yu3om")
}, {
"duration": 1.5,
"duration": 1.0,
"texture": ExtResource("113_hcxtl")
}, {
"duration": 15.0,
"duration": 90.0,
"texture": ExtResource("114_jxtmx")
}, {
"duration": 30.0,
"texture": ExtResource("115_xf5cy")
}, {
"duration": 30.0,
"texture": ExtResource("116_q7mkn")
}],
"loop": true,
"name": &"闭眼动效",

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c7m10rk4cw3lf"
path="res://.godot/imported/bg_夜晚黄包车场景.jpg-63d9ff77177682efbd12e4b154e85d56.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://asset/art/scene/c01/s09_黄包车长场景/bg_夜晚黄包车场景.jpg"
dest_files=["res://.godot/imported/bg_夜晚黄包车场景.jpg-63d9ff77177682efbd12e4b154e85d56.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 972 KiB

View File

@ -1,24 +0,0 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://poyp61gxyqer"
path="res://.godot/imported/c02_小孩喊着火啦.wav-bcd1f60d994074e9e8a8a92864e6c250.sample"
[deps]
source_file="res://asset/audio/peiyin_new/c02/c02_小孩喊着火啦.wav"
dest_files=["res://.godot/imported/c02_小孩喊着火啦.wav-bcd1f60d994074e9e8a8a92864e6c250.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

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://dph8v3v5mq1xl"
path="res://.godot/imported/sfx_交互失败.wav-97e55abf1cbf14ddbe3e7e9ede2df3f3.sample"
[deps]
source_file="res://asset/audio/sfx/交互/sfx_交互失败.wav"
dest_files=["res://.godot/imported/sfx_交互失败.wav-97e55abf1cbf14ddbe3e7e9ede2df3f3.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

View File

@ -15,6 +15,9 @@
如有知其下落者请赐信,备有重谢,绝不失言。 [ID:c02_寻人启事_完整3]
=> END
~ c02_海报1
战胜北方鼠疫之二杰 [ID:c02_海报1]
=> END
~ c02_青岛啤酒
系最好最廉之酒,并且每星期有新货到埠 [ID:c02_青岛啤酒详情]
@ -27,9 +30,6 @@
民国五年一月十三日 [ID:t736cca4563]
=> END
~ c02_海报1
战胜北方鼠疫之二杰 [ID:c02_海报1]
=> END
~ c02_保卫科花名册
一零一四 空 [ID:c02_保卫科花名册1]

View File

@ -41,7 +41,11 @@ func c02_fire_count_down_try_start():
return
c02_fire_count_down_timer = Timer.new()
c02_fire_count_down_timer.autostart = true
c02_fire_count_down_timer.wait_time = 10
if GlobalConfig.DEBUG:
SceneManager.pop_debug_dialog_info("debug", "当前为测试模式,倒计时 10s正式模式倒计时 60s")
c02_fire_count_down_timer.wait_time = 10
else:
c02_fire_count_down_timer.wait_time = 60
c02_fire_count_down_timer.one_shot = false
c02_fire_count_down_timer.timeout.connect(_on_c02_fire_count_down_timeout)
add_child(c02_fire_count_down_timer)
@ -53,7 +57,7 @@ func _on_c02_fire_count_down_timeout():
SceneManager.pop_debug_dialog_info("音效", "【重开】霸凌救小蝉倒计时")
c02_fire_count_down_timer.stop()
AudioManager.stop_bgm_music("霸凌救小蝉倒计时")
DialogueManager.show_dialogue_balloon(dialogue_c02, "c02_未完成拯救小蝉的游戏")
DialogueManager.show_dialogue_balloon(dialogue_c02, "c02_未完成拯救小蝉的游戏", [GlobalConfig.DIALOG_IGNORE_INPUT])
await get_tree().create_timer(1.0).timeout
SceneManager.show_black_hand(true, 0.5)
await get_tree().create_timer(3.0).timeout

View File

@ -94,6 +94,14 @@ func unlock_player():
# player.operational = val
func player_action(action_code : int, auto_quit := false):
var player = get_player()
if player:
player.player_action(action_code, auto_quit)
else:
printerr("player_action: Player node not found")
# action_freezed 对应 freeze 与 release 方法
# lock_time: the time to lock the player action. 0 means lock forever, thus the player will be locked until release_player is called.
func freeze_player(lock_time: float, action := 3, auto_quit := false) -> void:

View File

@ -278,18 +278,10 @@ func set_catty_light(enable := false):
tween.tween_property(catty_light, "energy", 0.0, 0.5)
var lock_mutex = Mutex.new()
var release_timer: SceneTreeTimer
# 自动解除对应 animation 的 loop 状态
# lock_time: the time to lock the player action. 0 means lock forever, thus the player will be locked until release_player is called.
func freeze_player(lock_time: float, action_animation: int, auto_quit: bool) -> void:
lock_mutex.lock()
action_freezed = true
if current_animation_config.has(action_animation):
func player_action(action_code: int, auto_quit: bool):
if current_animation_config.has(action_code):
# animation_name, scale, offset
var config = current_animation_config[action_animation]
var config = current_animation_config[action_code]
var animation_l = config[0]
var animation_r = config[0]
sprite.scale = config[1]
@ -304,6 +296,18 @@ func freeze_player(lock_time: float, action_animation: int, auto_quit: bool) ->
sprite.animation_looped.connect(_play_animation, CONNECT_ONE_SHOT)
else:
sprite.animation_finished.connect(_play_animation, CONNECT_ONE_SHOT)
var lock_mutex = Mutex.new()
var release_timer: SceneTreeTimer
# 自动解除对应 animation 的 loop 状态
# lock_time: the time to lock the player action. 0 means lock forever, thus the player will be locked until release_player is called.
func freeze_player(lock_time: float, action_code: int, auto_quit: bool) -> void:
lock_mutex.lock()
action_freezed = true
player_action(action_code, auto_quit)
if lock_time:
if release_timer and release_timer.time_left > 0:
release_timer.time_left = max(lock_time, release_timer.time_left)

View File

@ -20,6 +20,13 @@ signal sign_mark_offset_updated
trigger_mode = val
if is_node_ready():
_check_sign_display()
@export var collision_width_and_x := Vector2(20.0, 0):
set(val):
collision_width_and_x = val
if is_node_ready():
var shape = area2d.get_node("CollisionShape2D").shape
shape.size.x = collision_width_and_x.x
area2d.position.x = collision_width_and_x.y
@export var interacted_sign_texture: Texture2D
@export var one_shot := true
# 首次进入 tree 就直接启用
@ -66,7 +73,8 @@ var played_time := 0.0
# played = val
@onready var sign_mark := %Sign as Sign
@onready var area := %Area2D as Area2D
@onready var area2d := %Area2D as Area2D
var ground_archive: GroundArchive
var played: bool:
set(val):
@ -79,6 +87,9 @@ var played: bool:
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
var shape = area2d.get_node("CollisionShape2D").shape
shape.size.x = collision_width_and_x.x
area2d.position.x = collision_width_and_x.y
if Engine.is_editor_hint():
var animation_player = _get_animation_player()
# 更新 hook_animation 的可选项
@ -101,8 +112,8 @@ func _ready() -> void:
if one_shot:
return
sign_mark.interacted.connect(_interacted)
area.body_entered.connect(_entered)
area.area_entered.connect(_area_entered)
area2d.body_entered.connect(_entered)
area2d.area_entered.connect(_area_entered)
if on_first_enter_tree:
_do_trigger.call_deferred()

View File

@ -6,10 +6,11 @@
[sub_resource type="RectangleShape2D" id="RectangleShape2D_iwrfx"]
resource_local_to_scene = true
size = Vector2(10, 70)
size = Vector2(25, 70)
[node name="Ambush" type="Sprite2D"]
script = ExtResource("1_rxgbr")
collision_width_and_x = Vector2(25, 0)
interacted_sign_texture = ExtResource("2_1tnxk")
hook_dialogue_title = ""
hook_animation = ""

View File

@ -11,18 +11,14 @@ signal exit(arg)
@export var first_interact_os_key := ""
@export var packed_scene: PackedScene
@export var quit_closeup_on_escape := true
var current_child: Node
@onready var sign_snapper = %SignSnapper as SignSnapper
func _ready() -> void:
super._ready()
if Engine.is_editor_hint():
return
# interacted.connect(_close_up_interacted)
sign_snapper.arrived.connect(_close_up_interacted)
interacted.connect(_close_up_interacted)
func _close_up_interacted() -> void:
@ -30,12 +26,11 @@ func _close_up_interacted() -> void:
SceneManager.freeze_player(0, action_key)
sign_mark.display_sign = false
var tween = await SceneManager.pop_os_with_str(first_interact_os_key)
tween.tween_interval(0.5)
tween.tween_callback(display)
tween.tween_callback(func(): sign_mark.display_sign = true)
else:
SceneManager.freeze_player(0, action_key)
get_tree().create_timer(0.5).timeout.connect(display)
display()
# 可以直接调用

View File

@ -10,10 +10,12 @@
[sub_resource type="RectangleShape2D" id="RectangleShape2D_ogin7"]
resource_local_to_scene = true
size = Vector2(30, 70)
size = Vector2(25, 70)
[node name="Closeup" type="Sprite2D"]
script = ExtResource("1_tvfr1")
enable_snapper = null
collision_width_and_x = Vector2(25, 0)
unrevealed_sign_texture = ExtResource("2_dnubm")
unmatched_sign_texture = ExtResource("3_dnubm")
matched_sign_texture = ExtResource("4_18yy2")
@ -47,4 +49,6 @@ script = ExtResource("7_dnubm")
release_player_on_arrived = false
radius = 3.0
delay_arrived = 0.1
action_on_arrived = 4
delay_after_action = 0.4
metadata/_custom_type_script = "uid://cnt01hiw52bmn"

View File

@ -1,30 +1,65 @@
@tool
extends Sprite2D
signal start_inspecting
signal quit_inspecting
signal sign_mark_offset_updated
# @export var entity_config: EntityConfig:
# set(value):
# entity_config = value
enum { STATUS_NORAML, STATUS_TRANSITIONING, STATUS_INSPECTING_COVER, STATUS_INSPECTING_NOTES }
@export var enabled := true:
set(val):
enabled = val
if is_node_ready() and not Engine.is_editor_hint():
sign_mark.enabled = val
# sign_mark 节点在 ready 时会直接读取
@export var sign_mark_offset := Vector2.ZERO:
set(val):
sign_mark_offset = val
sign_mark_offset_updated.emit(val)
# @export var entity_name: String = ""
@export_enum("none", "c01", "c02", "c03", "c04", "c05") var editor_filter := "none":
@export var content_centered: bool = false
@export var action_key := 4
@export var collision_width_and_x := Vector2(20.0, 0):
set(val):
collision_width_and_x = val
if is_node_ready():
var shape = area2d.get_node("CollisionShape2D").shape
shape.size.x = collision_width_and_x.x
area2d.position.x = collision_width_and_x.y
@export var texture_cover: Texture2D
@export var note_sign_texture: Texture2D
@export_enum("none", "c01", "c02", "c03", "c04", "c05", "c06") var editor_filter := "none":
set(val):
editor_filter = val
if is_node_ready() and Engine.is_editor_hint():
notify_property_list_changed()
@export var note_sign_texture: Texture2D
@export var texture_cover: Texture2D
@export var texture_note: Texture2D
@export var note_centered := false
var content_key: String = ""
@onready var sign_mark = %Sign as Sign
@onready var sign_snapper = %SignSnapper as SignSnapper
@onready var area2d = %Area2D as Area2D
var content_dialogue = preload("res://asset/dialogue/inspect_content.dialogue") as DialogueResource
var inspecting = false
@onready var sfx = %Sfx
@onready var container = %Container
@onready var cover_rect = %Cover as TextureRect
@onready var content_label = %ContentLabel as Label
@onready var tip_label = %TipLabel as Label
var tip_cover_hide_notes = "Q: " + tr("ui_退出") + " " + "E: " + tr("ui_阅读")
var tip_cover_without_notes = "Q: " + tr("ui_退出") + " " + "E: " + tr("ui_检阅")
var tip_notes = "Q: " + tr("ui_退出") + " " + "E: " + tr("ui_收起")
static var content_dialogue = (
preload("res://asset/dialogue/inspect_content.dialogue") as DialogueResource
)
var status := STATUS_NORAML
var blinking_tween: Tween
var ground_archive: GroundArchive
# 尝试互动的次数
@ -35,37 +70,29 @@ var tried_times: int:
if tried_times >= 1 and sign_mark:
sign_mark.sprite2d.texture = note_sign_texture
func _ready() -> void:
$InspectLayer.layer = GlobalConfig.CANVAS_LAYER_PROP_INSPECTOR
var shape = area2d.get_node("CollisionShape2D").shape
shape.size.x = collision_width_and_x.x
area2d.position.x = collision_width_and_x.y
container.modulate.a = 0.0
content_label.modulate.a = 0.0
content_label.text = _get_tr_content()
tip_label.text = tip_cover_hide_notes
cover_rect.texture = texture_cover
if Engine.is_editor_hint():
return
area2d.body_entered.connect(_reset)
area2d.body_exited.connect(_on_cancel)
sign_mark.interacted.connect(_on_interacted)
sign_mark.cancel.connect(_on_cancel)
sign_mark.enabled = enabled
# setup default value
ground_archive = ArchiveManager.archive.ground_archive()
tried_times = ground_archive.get_value(name, "tried_times", 0)
func _on_interacted() -> void:
if not texture_cover:
push_error("entity/inspectable.gd: texture_cover or texture_note is not set")
return
if inspecting:
return
tried_times += 1
%Sfx.play()
# connect inspector quit signal
var inspector = SceneManager.get_inspector()
if inspector:
inspector.quit_and_hidden.connect(_on_quit_inspector)
var inspection_note = _get_tr_content()
inspector.pop_standard_inspection(
texture_cover, texture_note, inspection_note, note_centered
)
inspecting = true
sign_mark.display_sign = false
if content_centered:
content_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
# sign_mark.interacted.connect(_on_interacted)
sign_snapper.arrived.connect(_on_interacted)
sign_mark.cancel.connect(_on_cancel)
func _get_tr_content():
@ -82,26 +109,85 @@ func _get_tr_content():
return inspection_note
func _on_quit_inspector():
var inspector = SceneManager.get_inspector()
if inspector:
# disconnect inspector quit signal
inspector.quit_and_hidden.disconnect(_on_quit_inspector)
inspecting = false
sign_mark.display_sign = true
func _on_interacted() -> void:
if STATUS_TRANSITIONING == status:
return
if status == STATUS_NORAML:
tried_times += 1
sfx.play()
SceneManager.focus_node(self)
SceneManager.get_camera_marker().tween_zoom(2.0)
status = STATUS_TRANSITIONING
var tween = create_tween()
tween.tween_interval(0.8)
tween.tween_property(container, "modulate:a", 1.0, 0.7)
tween.tween_callback(func(): status = STATUS_INSPECTING_COVER)
# 改变信号源
sign_mark.interacted.connect(_on_interacted)
sign_snapper.arrived.disconnect(_on_interacted)
sign_mark.display_sign = false
SceneManager.freeze_player(0.0, action_key)
cover_rect.texture = texture_cover
if content_key == "":
tip_label.text = tip_cover_without_notes
else:
tip_label.text = tip_cover_hide_notes
_blink_label(true)
start_inspecting.emit()
elif status == STATUS_INSPECTING_COVER:
sfx.play()
status = STATUS_INSPECTING_NOTES
tip_label.text = tip_notes
create_tween().tween_property(content_label, "modulate:a", 1.0, 0.15)
elif status == STATUS_INSPECTING_NOTES:
sfx.play()
status = STATUS_INSPECTING_COVER
if content_key == "":
tip_label.text = tip_cover_without_notes
else:
tip_label.text = tip_cover_hide_notes
create_tween().tween_property(content_label, "modulate:a", 0.0, 0.15)
func _blink_label(init := true):
if status == STATUS_NORAML:
return
blinking_tween = create_tween()
if init:
blinking_tween.tween_property(tip_label, "modulate:a", 0.8, 2.0)
blinking_tween.tween_callback(_blink_label.bind(false))
else:
blinking_tween.tween_property(tip_label, "modulate:a", 0.5, 1.0)
blinking_tween.tween_callback(_blink_label.bind(true))
func _on_cancel(_body = null):
inspecting = false
func _reset(_body):
inspecting = false
if STATUS_TRANSITIONING == status:
return
if status != STATUS_NORAML:
quit_inspecting.emit()
status = STATUS_TRANSITIONING
var tween = create_tween()
tween.tween_property(container, "modulate:a", 0.0, 0.15)
if blinking_tween and blinking_tween.is_running():
blinking_tween.kill()
tween.parallel().tween_property(tip_label, "modulate:a", 0.0, 0.15)
tween.tween_interval(1.0)
tween.tween_callback(func(): status = STATUS_NORAML)
tween.tween_callback(func(): content_label.modulate.a = 0.0)
SceneManager.focus_player_and_reset_zoom()
SceneManager.release_player()
sign_mark.display_sign = true
# 改变信号源
sign_mark.interacted.disconnect(_on_interacted)
sign_snapper.arrived.connect(_on_interacted)
func _set(property: StringName, value: Variant) -> bool:
if property == "content_key":
content_key = value
content_label.text = _get_tr_content()
return true
return false

View File

@ -1 +1 @@
uid://ctd1xlvqdcsg4
uid://cihyb26hjma4i

View File

@ -1,28 +1,33 @@
[gd_scene load_steps=8 format=3 uid="uid://wyj4qdjyn4ql"]
[gd_scene load_steps=12 format=3 uid="uid://ci5anaxsa1apl"]
[ext_resource type="Script" uid="uid://ctd1xlvqdcsg4" path="res://scene/entity/inspectable.gd" id="1_0pc4s"]
[ext_resource type="Texture2D" uid="uid://c0rw25jl762a1" path="res://asset/art/ui/action_mark/UI眼睛.png" id="2_ossmq"]
[ext_resource type="AudioStream" uid="uid://dky3j8lwcy5sk" path="res://asset/audio/sfx/UI/物品查看.mp3" id="3_kilnm"]
[ext_resource type="Script" uid="uid://rq6w1vuhuq1m" path="res://scene/entity/audio/sfx.gd" id="3_p1g2a"]
[ext_resource type="Texture2D" uid="uid://bei1s1uucktso" path="res://asset/art/tool/neutral_point_light.webp" id="3_vbivp"]
[ext_resource type="PackedScene" uid="uid://c4tipnj1cr1j3" path="res://scene/entity/ux/sign.tscn" id="4_1yty8"]
[ext_resource type="Script" uid="uid://cihyb26hjma4i" path="res://scene/entity/inspectable.gd" id="1_85el0"]
[ext_resource type="Texture2D" uid="uid://c0rw25jl762a1" path="res://asset/art/ui/action_mark/UI眼睛.png" id="2_3pauf"]
[ext_resource type="AudioStream" uid="uid://byjcmxy5crce5" path="res://asset/audio/sfx/UI/纸条.mp3" id="3_3ldx7"]
[ext_resource type="Texture2D" uid="uid://bei1s1uucktso" path="res://asset/art/tool/neutral_point_light.webp" id="3_o562w"]
[ext_resource type="Script" uid="uid://rq6w1vuhuq1m" path="res://scene/entity/audio/sfx.gd" id="3_q18ff"]
[ext_resource type="PackedScene" uid="uid://c4tipnj1cr1j3" path="res://scene/entity/ux/sign.tscn" id="4_do8tr"]
[ext_resource type="Texture2D" uid="uid://dwgxa5j6602vv" path="res://asset/art/ui/prop/inspect文本衬底蒙版.png" id="6_q18ff"]
[ext_resource type="FontVariation" uid="uid://1ryw42kej6lv" path="res://config/font_ui.tres" id="7_ianbs"]
[ext_resource type="Texture2D" uid="uid://f186lvt5y2ql" path="res://asset/art/ui/prop/inspect背景遮罩.png" id="7_xawjo"]
[ext_resource type="Script" uid="uid://cnt01hiw52bmn" path="res://scene/entity/ux/sign_snapper.gd" id="10_mtbvd"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_4fuic"]
resource_local_to_scene = true
size = Vector2(35, 70)
size = Vector2(25, 70)
[node name="Inspectable" type="Sprite2D"]
script = ExtResource("1_0pc4s")
note_sign_texture = ExtResource("2_ossmq")
[node name="LocalInspectable" type="Sprite2D"]
script = ExtResource("1_85el0")
collision_width_and_x = Vector2(25, 0)
note_sign_texture = ExtResource("2_3pauf")
content_key = ""
[node name="Sfx" type="AudioStreamPlayer" parent="."]
unique_name_in_owner = true
stream = ExtResource("3_kilnm")
stream = ExtResource("3_3ldx7")
bus = &"game_sfx"
script = ExtResource("3_p1g2a")
script = ExtResource("3_q18ff")
[node name="Sign" parent="." instance=ExtResource("4_1yty8")]
[node name="Sign" parent="." instance=ExtResource("4_do8tr")]
unique_name_in_owner = true
[node name="PointLight2D" type="PointLight2D" parent="."]
@ -30,7 +35,7 @@ unique_name_in_owner = true
position = Vector2(0, -35)
scale = Vector2(0.2, 0.2)
energy = 0.0
texture = ExtResource("3_vbivp")
texture = ExtResource("3_o562w")
texture_scale = 0.5
[node name="Area2D" type="Area2D" parent="."]
@ -40,3 +45,93 @@ collision_layer = 0
[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
unique_name_in_owner = true
shape = SubResource("RectangleShape2D_4fuic")
[node name="InspectLayer" type="CanvasLayer" parent="."]
layer = 20
[node name="Root" type="Control" parent="InspectLayer"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
[node name="Container" type="MarginContainer" parent="InspectLayer/Root"]
unique_name_in_owner = true
modulate = Color(1, 1, 1, 0)
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
[node name="BGMask" type="TextureRect" parent="InspectLayer/Root/Container"]
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 4
mouse_filter = 2
texture = ExtResource("7_xawjo")
[node name="Cover" type="TextureRect" parent="InspectLayer/Root/Container"]
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/Root/Container"]
unique_name_in_owner = true
modulate = Color(1, 1, 1, 0)
z_index = 100
custom_minimum_size = Vector2(130, 0)
layout_mode = 2
size_flags_horizontal = 4
vertical_alignment = 1
autowrap_mode = 3
[node name="TextureRect" type="TextureRect" parent="InspectLayer/Root/Container/ContentLabel"]
self_modulate = Color(1, 1, 1, 0.733333)
show_behind_parent = true
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
texture = ExtResource("6_q18ff")
[node name="MarginContainer" type="MarginContainer" parent="InspectLayer/Root"]
layout_mode = 2
offset_top = 263.0
offset_right = 564.0
offset_bottom = 316.0
size_flags_vertical = 8
mouse_filter = 2
theme_override_constants/margin_bottom = 38
[node name="TipLabel" type="Label" parent="InspectLayer/Root/MarginContainer"]
unique_name_in_owner = true
modulate = Color(1, 1, 1, 0)
z_index = 100
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 8
theme_override_fonts/font = ExtResource("7_ianbs")
text = "Q: 退出 E: 阅读"
horizontal_alignment = 1
vertical_alignment = 1
[node name="SignSnapper" type="Marker2D" parent="."]
unique_name_in_owner = true
script = ExtResource("10_mtbvd")
release_player_on_arrived = false
radius = 3.0
delay_arrived = 0.1
action_on_arrived = 4
delay_after_action = 0.4
metadata/_custom_type_script = "uid://cnt01hiw52bmn"

View File

@ -19,6 +19,14 @@ signal sign_mark_offset_updated
enabled = val
if is_node_ready():
_check_sign_display()
@export var enable_snapper := true
@export var collision_width_and_x := Vector2(20.0, 0):
set(val):
collision_width_and_x = val
if is_node_ready():
var shape = area2d.get_node("CollisionShape2D").shape
shape.size.x = collision_width_and_x.x
area2d.position.x = collision_width_and_x.y
@export var unrevealed_sign_texture: Texture2D
@export var unmatched_sign_texture: Texture2D
@export var matched_sign_texture: Texture2D
@ -36,6 +44,7 @@ var prop_key3 := ""
@onready var sfx_invalid = $SfxInvalid as Sfx
@onready var sfx_success = $SfxSuccess as Sfx
@onready var sign_mark = %Sign as Sign
@onready var sign_snapper = %SignSnapper as SignSnapper
@onready var area2d = %Area2D as Area2D
var ground_archive: GroundArchive
@ -54,11 +63,18 @@ static var item_config_res = preload("res://asset/dialogue/item_description.dial
func _ready() -> void:
var shape = area2d.get_node("CollisionShape2D").shape
shape.size.x = collision_width_and_x.x
area2d.position.x = collision_width_and_x.y
if Engine.is_editor_hint():
return
area2d.body_entered.connect(_reset)
area2d.body_exited.connect(_on_cancel)
sign_mark.interacted.connect(_on_interacted)
if enable_snapper:
sign_snapper.arrived.connect(_on_interacted)
else:
sign_snapper.enabled = false
sign_mark.interacted.connect(_on_interacted)
sign_mark.cancel.connect(_on_cancel)
sign_mark.enabled = enabled
# setup default value

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=10 format=3 uid="uid://cw3q5pvciumil"]
[gd_scene load_steps=11 format=3 uid="uid://cw3q5pvciumil"]
[ext_resource type="Script" uid="uid://dxyaip4khrkkq" path="res://scene/entity/interactable.gd" id="1_6nrd3"]
[ext_resource type="Texture2D" uid="uid://dtyg0nugb2tnf" path="res://asset/art/ui/action_mark/UI探索.png" id="2_03eog"]
@ -8,10 +8,11 @@
[ext_resource type="Texture2D" uid="uid://gui0ubwlwoi0" path="res://asset/art/ui/action_mark/UI手.png" id="4_njk43"]
[ext_resource type="AudioStream" uid="uid://ccng5y2fip6mc" path="res://asset/audio/sfx/UI/开锁声.mp3" id="5_exp6m"]
[ext_resource type="Script" uid="uid://rq6w1vuhuq1m" path="res://scene/entity/audio/sfx.gd" id="6_l2kr5"]
[ext_resource type="Script" uid="uid://cnt01hiw52bmn" path="res://scene/entity/ux/sign_snapper.gd" id="9_03eog"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_8d3b4"]
resource_local_to_scene = true
size = Vector2(10, 70)
size = Vector2(20, 70)
[node name="Interactable" type="Sprite2D"]
script = ExtResource("1_6nrd3")
@ -44,3 +45,12 @@ collision_layer = 0
[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
unique_name_in_owner = true
shape = SubResource("RectangleShape2D_8d3b4")
[node name="SignSnapper" type="Marker2D" parent="."]
unique_name_in_owner = true
script = ExtResource("9_03eog")
radius = 4.0
delay_arrived = 0.1
action_on_arrived = 4
delay_after_action = 0.4
metadata/_custom_type_script = "uid://cnt01hiw52bmn"

View File

@ -1,206 +0,0 @@
@tool
extends Sprite2D
signal start_inspecting
signal quit_inspecting
signal sign_mark_offset_updated
# @export var entity_config: EntityConfig:
# set(value):
# entity_config = value
enum { STATUS_NORAML, STATUS_TRANSITIONING, STATUS_INSPECTING_COVER, STATUS_INSPECTING_NOTES }
@export var enabled := true:
set(val):
enabled = val
if is_node_ready() and not Engine.is_editor_hint():
sign_mark.enabled = val
# sign_mark 节点在 ready 时会直接读取
@export var sign_mark_offset := Vector2.ZERO:
set(val):
sign_mark_offset = val
sign_mark_offset_updated.emit(val)
# @export var entity_name: String = ""
@export var content_centered: bool = false
@export var action_key := 4
@export var texture_cover: Texture2D
@export var note_sign_texture: Texture2D
@export_enum("none", "c01", "c02", "c03", "c04", "c05", "c06") var editor_filter := "none":
set(val):
editor_filter = val
if is_node_ready() and Engine.is_editor_hint():
notify_property_list_changed()
var content_key: String = ""
@onready var sign_mark = %Sign as Sign
@onready var sign_snapper = %SignSnapper as SignSnapper
@onready var area2d = %Area2D as Area2D
@onready var sfx = %Sfx
@onready var container = %Container
@onready var cover_rect = %Cover as TextureRect
@onready var content_label = %ContentLabel as Label
@onready var tip_label = %TipLabel as Label
var tip_cover_hide_notes = "Q: " + tr("ui_退出") + " " + "E: " + tr("ui_阅读")
var tip_cover_without_notes = "Q: " + tr("ui_退出") + " " + "E: " + tr("ui_检阅")
var tip_notes = "Q: " + tr("ui_退出") + " " + "E: " + tr("ui_收起")
static var content_dialogue = (
preload("res://asset/dialogue/inspect_content.dialogue") as DialogueResource
)
var status := STATUS_NORAML
var blinking_tween: Tween
var ground_archive: GroundArchive
# 尝试互动的次数
var tried_times: int:
set(val):
tried_times = val
ground_archive.set_pair(name, "tried_times", val)
if tried_times >= 1 and sign_mark:
sign_mark.sprite2d.texture = note_sign_texture
func _ready() -> void:
$InspectLayer.layer = GlobalConfig.CANVAS_LAYER_PROP_INSPECTOR
container.modulate.a = 0.0
content_label.modulate.a = 0.0
content_label.text = _get_tr_content()
tip_label.text = tip_cover_hide_notes
cover_rect.texture = texture_cover
if Engine.is_editor_hint():
return
sign_mark.enabled = enabled
# setup default value
ground_archive = ArchiveManager.archive.ground_archive()
tried_times = ground_archive.get_value(name, "tried_times", 0)
if content_centered:
content_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
# sign_mark.interacted.connect(_on_interacted)
sign_snapper.arrived.connect(_on_interacted)
sign_mark.cancel.connect(_on_cancel)
func _get_tr_content():
if content_key == "":
return ""
var inspection_note = ""
# get note content
var line_id = content_dialogue.titles.get(content_key)
while line_id and line_id != "end":
var line = content_dialogue.lines[line_id]
if line.has("text"):
inspection_note += tr(line.get("text")) + "\n"
line_id = line.get("next_id")
return inspection_note
func _on_interacted() -> void:
if STATUS_TRANSITIONING == status:
return
if status == STATUS_NORAML:
tried_times += 1
sfx.play()
SceneManager.focus_node(self)
SceneManager.get_camera_marker().tween_zoom(2.0)
status = STATUS_TRANSITIONING
var tween = create_tween()
tween.tween_interval(0.8)
tween.tween_property(container, "modulate:a", 1.0, 0.7)
tween.tween_callback(func(): status = STATUS_INSPECTING_COVER)
sign_mark.display_sign = false
SceneManager.freeze_player(0.0, action_key)
cover_rect.texture = texture_cover
if content_key == "":
tip_label.text = tip_cover_without_notes
else:
tip_label.text = tip_cover_hide_notes
_blink_label(true)
start_inspecting.emit()
elif status == STATUS_INSPECTING_COVER:
sfx.play()
status = STATUS_INSPECTING_NOTES
tip_label.text = tip_notes
create_tween().tween_property(content_label, "modulate:a", 1.0, 0.15)
elif status == STATUS_INSPECTING_NOTES:
sfx.play()
status = STATUS_INSPECTING_COVER
if content_key == "":
tip_label.text = tip_cover_without_notes
else:
tip_label.text = tip_cover_hide_notes
create_tween().tween_property(content_label, "modulate:a", 0.0, 0.15)
func _blink_label(init := true):
if status == STATUS_NORAML:
return
blinking_tween = create_tween()
if init:
blinking_tween.tween_property(tip_label, "modulate:a", 0.8, 2.0)
blinking_tween.tween_callback(_blink_label.bind(false))
else:
blinking_tween.tween_property(tip_label, "modulate:a", 0.5, 1.0)
blinking_tween.tween_callback(_blink_label.bind(true))
func _on_cancel(_body = null):
if STATUS_TRANSITIONING == status:
return
if status != STATUS_NORAML:
quit_inspecting.emit()
status = STATUS_TRANSITIONING
var tween = create_tween()
tween.tween_property(container, "modulate:a", 0.0, 0.15)
if blinking_tween and blinking_tween.is_running():
blinking_tween.kill()
tween.parallel().tween_property(tip_label, "modulate:a", 0.0, 0.15)
tween.tween_interval(1.0)
tween.tween_callback(func(): status = STATUS_NORAML)
tween.tween_callback(func(): content_label.modulate.a = 0.0)
SceneManager.focus_player_and_reset_zoom()
SceneManager.release_player()
sign_mark.display_sign = true
func _set(property: StringName, value: Variant) -> bool:
if property == "content_key":
content_key = value
content_label.text = _get_tr_content()
return true
return false
func _get(property: StringName) -> Variant:
if property == "content_key":
return content_key
return null
func _get_property_list() -> Array[Dictionary]:
var titles = ""
# only show notes_ properties in editor
if Engine.is_editor_hint():
var ordered_titles = content_dialogue.get_ordered_titles()
if editor_filter and editor_filter != "none":
var filted_titles = ordered_titles.filter(_filter_property)
if filted_titles.size() > 0:
titles = ",".join(filted_titles)
else:
titles = ",".join(ordered_titles)
return [
{
"name": "content_key",
"type": TYPE_STRING,
"hint": PROPERTY_HINT_ENUM_SUGGESTION,
"hint_string": titles
}
]
func _filter_property(property: StringName) -> bool:
return property.find(editor_filter) >= 0

View File

@ -1 +0,0 @@
uid://cihyb26hjma4i

View File

@ -1,134 +0,0 @@
[gd_scene load_steps=12 format=3 uid="uid://ci5anaxsa1apl"]
[ext_resource type="Script" uid="uid://cihyb26hjma4i" path="res://scene/entity/local_inspectable.gd" id="1_85el0"]
[ext_resource type="Texture2D" uid="uid://c0rw25jl762a1" path="res://asset/art/ui/action_mark/UI眼睛.png" id="2_3pauf"]
[ext_resource type="AudioStream" uid="uid://byjcmxy5crce5" path="res://asset/audio/sfx/UI/纸条.mp3" id="3_3ldx7"]
[ext_resource type="Texture2D" uid="uid://bei1s1uucktso" path="res://asset/art/tool/neutral_point_light.webp" id="3_o562w"]
[ext_resource type="Script" uid="uid://rq6w1vuhuq1m" path="res://scene/entity/audio/sfx.gd" id="3_q18ff"]
[ext_resource type="PackedScene" uid="uid://c4tipnj1cr1j3" path="res://scene/entity/ux/sign.tscn" id="4_do8tr"]
[ext_resource type="Texture2D" uid="uid://dwgxa5j6602vv" path="res://asset/art/ui/prop/inspect文本衬底蒙版.png" id="6_q18ff"]
[ext_resource type="FontVariation" uid="uid://1ryw42kej6lv" path="res://config/font_ui.tres" id="7_ianbs"]
[ext_resource type="Texture2D" uid="uid://f186lvt5y2ql" path="res://asset/art/ui/prop/inspect背景遮罩.png" id="7_xawjo"]
[ext_resource type="Script" uid="uid://cnt01hiw52bmn" path="res://scene/entity/ux/sign_snapper.gd" id="10_mtbvd"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_4fuic"]
resource_local_to_scene = true
size = Vector2(30, 70)
[node name="LocalInspectable" type="Sprite2D"]
script = ExtResource("1_85el0")
note_sign_texture = ExtResource("2_3pauf")
content_key = ""
[node name="Sfx" type="AudioStreamPlayer" parent="."]
unique_name_in_owner = true
stream = ExtResource("3_3ldx7")
bus = &"game_sfx"
script = ExtResource("3_q18ff")
[node name="Sign" parent="." instance=ExtResource("4_do8tr")]
unique_name_in_owner = true
[node name="PointLight2D" type="PointLight2D" parent="."]
unique_name_in_owner = true
position = Vector2(0, -35)
scale = Vector2(0.2, 0.2)
energy = 0.0
texture = ExtResource("3_o562w")
texture_scale = 0.5
[node name="Area2D" type="Area2D" parent="."]
unique_name_in_owner = true
collision_layer = 0
[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
unique_name_in_owner = true
shape = SubResource("RectangleShape2D_4fuic")
[node name="InspectLayer" type="CanvasLayer" parent="."]
layer = 20
[node name="Root" type="Control" parent="InspectLayer"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
[node name="Container" type="MarginContainer" parent="InspectLayer/Root"]
unique_name_in_owner = true
modulate = Color(1, 1, 1, 0)
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
[node name="BGMask" type="TextureRect" parent="InspectLayer/Root/Container"]
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 4
mouse_filter = 2
texture = ExtResource("7_xawjo")
[node name="Cover" type="TextureRect" parent="InspectLayer/Root/Container"]
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/Root/Container"]
unique_name_in_owner = true
modulate = Color(1, 1, 1, 0)
z_index = 100
custom_minimum_size = Vector2(130, 0)
layout_mode = 2
size_flags_horizontal = 4
vertical_alignment = 1
autowrap_mode = 3
[node name="TextureRect" type="TextureRect" parent="InspectLayer/Root/Container/ContentLabel"]
self_modulate = Color(1, 1, 1, 0.733333)
show_behind_parent = true
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
texture = ExtResource("6_q18ff")
[node name="MarginContainer" type="MarginContainer" parent="InspectLayer/Root"]
layout_mode = 2
offset_top = 263.0
offset_right = 564.0
offset_bottom = 316.0
size_flags_vertical = 8
mouse_filter = 2
theme_override_constants/margin_bottom = 38
[node name="TipLabel" type="Label" parent="InspectLayer/Root/MarginContainer"]
unique_name_in_owner = true
modulate = Color(1, 1, 1, 0)
z_index = 100
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 8
theme_override_fonts/font = ExtResource("7_ianbs")
text = "Q: 退出 E: 阅读"
horizontal_alignment = 1
vertical_alignment = 1
[node name="SignSnapper" type="Marker2D" parent="."]
unique_name_in_owner = true
script = ExtResource("10_mtbvd")
release_player_on_arrived = false
radius = 3.0
delay_arrived = 0.2
metadata/_custom_type_script = "uid://cnt01hiw52bmn"

View File

@ -14,6 +14,13 @@ signal sign_mark_offset_updated
enabled = val
if is_node_ready():
sign_mark.enabled = val
@export var collision_width_and_x := Vector2(20.0, 0):
set(val):
collision_width_and_x = val
if is_node_ready():
var shape = area2d.get_node("CollisionShape2D").shape
shape.size.x = collision_width_and_x.x
area2d.position.x = collision_width_and_x.y
@export var action := 4 #3为none; 4为lookup_wall; 之后为其他动作,请参考 PlayerAnimationConfig
@export_enum("os", "ballon") var mode = "os"
@export_enum("items", "c01", "c02", "c03", "c04", "c05", "c06") var dialogue := "items":
@ -70,6 +77,9 @@ var tried_times: int:
func _ready() -> void:
var shape = area2d.get_node("CollisionShape2D").shape
shape.size.x = collision_width_and_x.x
area2d.position.x = collision_width_and_x.y
if Engine.is_editor_hint():
notify_property_list_changed()
return

View File

@ -3,6 +3,9 @@ class_name Npc2D extends AnimatedSprite2D
signal interacted
# <0 means no walk to edge
@export var walk_to_edge_width := 25.0
@export var action_key := 4
@export var enabled := true:
set(val):
enabled = val
@ -13,10 +16,17 @@ signal interacted
height = val
if is_node_ready():
speaking_sign.position.y = -height
@export var collision_width_and_x := Vector2(20.0, 0):
set(val):
collision_width_and_x = val
if is_node_ready():
var shape = area2d.get_node("CollisionShape2D").shape
shape.size.x = collision_width_and_x.x
area2d.position.x = collision_width_and_x.y
@onready var speaking_animation = %SpeakingAnimationPlayer
@onready var speaking_sign = %SpeakingSign2D as Node2D
@onready var sign_mark = %Sign as Sign
@onready var sign_snapper = %SignSnapper as SignSnapper
@onready var area2d = %Area2D as Area2D
var dialogue_title := ""
@ -25,8 +35,13 @@ var dialogue_res = preload("res://asset/dialogue/npc.dialogue")
var base_scale := Vector2.ONE
var base_mod := Color.WHITE_SMOKE
func _ready() -> void:
speaking_sign.position.y = -height
var shape = area2d.get_node("CollisionShape2D").shape
shape.size.x = collision_width_and_x.x
area2d.position.x = collision_width_and_x.y
sign_snapper.action_on_arrived = action_key
if Engine.is_editor_hint():
# editor 直接展示
speaking_sign.visible = true
@ -38,7 +53,12 @@ func _ready() -> void:
base_mod = speaking_sign.modulate
area2d.body_entered.connect(_on_entered)
area2d.body_exited.connect(_on_exited)
sign_mark.interacted.connect(_on_interacted)
if walk_to_edge_width >= 0:
sign_snapper.radius = walk_to_edge_width
sign_snapper.arrived.connect(_on_interacted)
else:
sign_snapper.enabled = false
sign_mark.interacted.connect(_on_interacted)
# sign_mark.cancel.connect(_stop_speaking)
sign_mark.toggle_active.connect(_on_toggle_active)
_check_sign_mark_enable()
@ -55,10 +75,12 @@ func _check_sign_mark_enable():
speaking_sign.visible = enabled
sign_mark.enabled = enabled and visible
func _on_entered(_body = null) -> void:
var tween = create_tween()
tween.tween_property(speaking_sign, "modulate:a", 1.0, 0.5)
func _on_exited(_body = null) -> void:
var tween = create_tween()
tween.tween_property(speaking_sign, "modulate:a", 0.0, 0.5)
@ -70,8 +92,10 @@ func _on_toggle_active(activated: bool) -> void:
else:
_stop_speaking()
var speaking := false
func _on_interacted() -> void:
if speaking:
return

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=15 format=3 uid="uid://0sofmhrl358m"]
[gd_scene load_steps=16 format=3 uid="uid://0sofmhrl358m"]
[ext_resource type="Script" uid="uid://cqd5dqafxnwl1" path="res://scene/entity/npc.gd" id="1_jegr2"]
[ext_resource type="AudioStream" uid="uid://cvttds81trcoc" path="res://asset/audio/sfx/UI/click.wav" id="3_7lwt5"]
@ -7,6 +7,7 @@
[ext_resource type="Texture2D" uid="uid://bwt5nxyncfuqu" path="res://asset/art/ui/action_mark/说话标识1.png" id="5_foitt"]
[ext_resource type="Texture2D" uid="uid://8bnn3s72o87y" path="res://asset/art/ui/action_mark/说话标识2.png" id="6_2n6ge"]
[ext_resource type="Texture2D" uid="uid://by0rbde26tyn5" path="res://asset/art/ui/action_mark/说话标识3.png" id="7_afjxr"]
[ext_resource type="Script" uid="uid://cnt01hiw52bmn" path="res://scene/entity/ux/sign_snapper.gd" id="8_7lwt5"]
[sub_resource type="Animation" id="Animation_soodi"]
length = 0.001
@ -122,11 +123,12 @@ animations = [{
[sub_resource type="RectangleShape2D" id="RectangleShape2D_4fuic"]
resource_local_to_scene = true
size = Vector2(30, 100)
size = Vector2(25, 100)
[node name="Npc" type="AnimatedSprite2D"]
light_mask = 5
script = ExtResource("1_jegr2")
collision_width_and_x = Vector2(25, 0)
dialogue_title = ""
[node name="Sfx" type="AudioStreamPlayer" parent="."]
@ -174,3 +176,14 @@ collision_layer = 0
[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
unique_name_in_owner = true
shape = SubResource("RectangleShape2D_4fuic")
[node name="SignSnapper" type="Marker2D" parent="."]
unique_name_in_owner = true
script = ExtResource("8_7lwt5")
release_player_on_arrived = false
radius = 20.0
walk_to_edge = true
delay_arrived = 0.1
action_on_arrived = 4
delay_after_action = 0.4
metadata/_custom_type_script = "uid://cnt01hiw52bmn"

View File

@ -17,12 +17,20 @@ signal sign_mark_offset_updated
_check_sign_display()
# 除了 picked 必然隐藏,其他情况下跟随 enabled 状态
@export var visible_follow_enabled := true
@export var collision_width_and_x := Vector2(20.0, 0):
set(val):
collision_width_and_x = val
if is_node_ready():
var shape = area2d.get_node("CollisionShape2D").shape
shape.size.x = collision_width_and_x.x
area2d.position.x = collision_width_and_x.y
var prop_key := ""
@onready var sfx = $Sfx as Sfx
@onready var sign_mark := %Sign as Sign
@onready var area := %Area2D as Area2D
@onready var sign_snapper = %SignSnapper as SignSnapper
@onready var area2d := %Area2D as Area2D
var ground_archive: GroundArchive
var picked: bool:
set(val):
@ -47,6 +55,9 @@ func enable_with_ease(duration := 1.0):
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
var shape = area2d.get_node("CollisionShape2D").shape
shape.size.x = collision_width_and_x.x
area2d.position.x = collision_width_and_x.y
if Engine.is_editor_hint():
var animation_player = _get_animation_player()
# 更新 hook_animation 的可选项
@ -61,7 +72,7 @@ func _ready() -> void:
if picked:
if GlobalConfig.DEBUG:
print("Prop has picked, name=", name, " key=", prop_key)
sign_mark.interacted.connect(_interacted)
sign_snapper.arrived.connect(_interacted)
func _check_sign_display():

View File

@ -1,14 +1,15 @@
[gd_scene load_steps=7 format=3 uid="uid://dsa6frlw6e6gg"]
[gd_scene load_steps=8 format=3 uid="uid://dsa6frlw6e6gg"]
[ext_resource type="Script" uid="uid://cd3tb2he77vv4" path="res://scene/entity/pickable.gd" id="1_jk1u0"]
[ext_resource type="Script" uid="uid://rq6w1vuhuq1m" path="res://scene/entity/audio/sfx.gd" id="3_1h8r3"]
[ext_resource type="AudioStream" uid="uid://dutk2d7nilv3m" path="res://asset/audio/sfx/UI/令牌道具获取.wav" id="3_dxdbj"]
[ext_resource type="PackedScene" uid="uid://c4tipnj1cr1j3" path="res://scene/entity/ux/sign.tscn" id="4_44f4h"]
[ext_resource type="Texture2D" uid="uid://bei1s1uucktso" path="res://asset/art/tool/neutral_point_light.webp" id="5_yhysn"]
[ext_resource type="Script" uid="uid://cnt01hiw52bmn" path="res://scene/entity/ux/sign_snapper.gd" id="6_4qt5l"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_k6och"]
resource_local_to_scene = true
size = Vector2(10, 60)
size = Vector2(20, 60)
[node name="Pickable" type="Sprite2D"]
script = ExtResource("1_jk1u0")
@ -37,3 +38,12 @@ collision_layer = 0
[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
shape = SubResource("RectangleShape2D_k6och")
[node name="SignSnapper" type="Marker2D" parent="."]
unique_name_in_owner = true
script = ExtResource("6_4qt5l")
radius = 10.0
delay_arrived = 0.1
action_on_arrived = 4
delay_after_action = 0.4
metadata/_custom_type_script = "uid://cnt01hiw52bmn"

View File

@ -9,6 +9,13 @@ signal sign_mark_offset_updated
set(val):
sign_mark_offset = val
sign_mark_offset_updated.emit(val)
@export var collision_width_and_x := Vector2(20.0, 0):
set(val):
collision_width_and_x = val
if is_node_ready():
var shape = area2d.get_node("CollisionShape2D").shape
shape.size.x = collision_width_and_x.x
area2d.position.x = collision_width_and_x.y
@export_multiline var debug_note: String = ""
@export var enabled := true:
set(val):
@ -58,6 +65,7 @@ var prop_key := ""
# 门被锁定,无法打开的音效
@onready var sfx_locked = %SfxLocked as Sfx
@onready var sign_mark = %Sign as Sign
@onready var sign_snapper = %SignSnapper as SignSnapper
@onready var area2d = %Area2D as Area2D
var activated := false
@ -76,6 +84,9 @@ var tried_times: int:
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
name = "portal_" + portal_name
var shape = area2d.get_node("CollisionShape2D").shape
shape.size.x = collision_width_and_x.x
area2d.position.x = collision_width_and_x.y
if Engine.is_editor_hint():
_check_sign_mark_and_texture()
_reload_items()
@ -88,7 +99,7 @@ func _ready() -> void:
_check_sign_mark_and_texture()
area2d.body_entered.connect(_reset)
area2d.body_exited.connect(_on_cancel)
sign_mark.interacted.connect(_on_interacted)
sign_snapper.arrived.connect(_on_interacted)
sign_mark.cancel.connect(_on_cancel)
@ -107,14 +118,18 @@ func _reload_items() -> void:
func _check_sign_mark_and_texture():
if not is_node_ready():
return
return
# 切换自身 texture
if status == "opened" and opened_texture:
texture = opened_texture
elif default_texture:
texture = default_texture
# 切换 sign_mark texture 同时设置 sign_snapper 的 action
if status == "default":
sign_mark.sprite2d.texture = default_sign_texture
sign_snapper.action_on_arrived = 3
else:
sign_snapper.action_on_arrived = 4
# holding 状态下,同样显示 unrevealed_sign_texture
if tried_times == 0 or holding:
sign_mark.sprite2d.texture = unrevealed_sign_texture
@ -124,6 +139,7 @@ func _check_sign_mark_and_texture():
sign_mark.sprite2d.texture = locked_sign_texture
"opened":
sign_mark.sprite2d.texture = opened_sign_texture
# 设置 sign_mark 启用状态
if target_portal == "none" or not enabled:
sign_mark.enabled = false
else:

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=13 format=3 uid="uid://61pis75a8fdq"]
[gd_scene load_steps=14 format=3 uid="uid://61pis75a8fdq"]
[ext_resource type="Script" uid="uid://b2dvvhawm820r" path="res://scene/entity/portal.gd" id="1_jyh6v"]
[ext_resource type="Texture2D" uid="uid://bc4lpa8aao60n" path="res://asset/art/ui/action_mark/传送.png" id="2_ay30q"]
@ -11,14 +11,16 @@
[ext_resource type="Script" uid="uid://rq6w1vuhuq1m" path="res://scene/entity/audio/sfx.gd" id="6_bxihn"]
[ext_resource type="AudioStream" uid="uid://c1eftumrd4mgw" path="res://asset/audio/sfx/交互/开门.wav" id="6_p48ld"]
[ext_resource type="AudioStream" uid="uid://inmdv5gqqius" path="res://asset/audio/sfx/UI/门锁互动.mp3" id="7_bjcty"]
[ext_resource type="Script" uid="uid://cnt01hiw52bmn" path="res://scene/entity/ux/sign_snapper.gd" id="12_bxihn"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_munml"]
resource_local_to_scene = true
size = Vector2(25, 130)
size = Vector2(30, 130)
[node name="portal_left" type="Sprite2D"]
script = ExtResource("1_jyh6v")
sign_mark_offset = Vector2(0, -50)
collision_width_and_x = Vector2(30, 0)
unrevealed_sign_texture = ExtResource("2_fr7ak")
default_sign_texture = ExtResource("2_bxihn")
opened_sign_texture = ExtResource("2_bxihn")
@ -68,3 +70,13 @@ unique_name_in_owner = true
[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
shape = SubResource("RectangleShape2D_munml")
[node name="SignSnapper" type="Marker2D" parent="."]
unique_name_in_owner = true
script = ExtResource("12_bxihn")
release_player_on_arrived = false
radius = 10.0
delay_arrived = 0.1
action_on_arrived = 4
delay_after_action = 0.4
metadata/_custom_type_script = "uid://cnt01hiw52bmn"

View File

@ -4,13 +4,18 @@ class_name SignSnapper
signal arrived
@export var enabled := true
@export var release_player_on_arrived := true
# 仅使用 x 坐标;否则也用 y 进行 walk to
@export var use_x_only := true
# x 左右有效范围
@export_range(0.0, 20.0, 0.1) var radius := 0.0
# 让玩家走到边缘,特别适用于 npc 对话等情景
@export var walk_to_edge := false
# arrived 延时
@export_range(0.0, 10.0, 0.1) var delay_arrived := 0.0
@export var action_on_arrived := 3
@export_range(0.0, 10.0, 0.1) var delay_after_action := 0.0
@export_tool_button("debug 检查玩家触发位置") var debug_check_player_pos = _debug_check_player_pos
var detacted_sign: Sign
@ -31,15 +36,26 @@ func _ready():
func _on_interacted():
if not detacted_sign:
if not detacted_sign or not enabled:
return
var player = SceneManager.get_player()
var target_pos = global_position
if use_x_only:
target_pos.y = player.global_position.y
var player_x = player.global_position.x
if (radius > 0 and absf(target_pos.x - player_x) > radius) or walk_to_edge:
# clamp in range
if target_pos.x > player_x:
target_pos.x -= radius
else:
target_pos.x += radius
var tween = player.walk_to(target_pos, release_player_on_arrived)
if delay_arrived > 0:
tween.tween_interval(delay_arrived)
if action_on_arrived != 3:
tween.tween_callback(SceneManager.player_action.bind(action_on_arrived))
if delay_after_action > 0:
tween.tween_interval(delay_after_action)
tween.tween_callback(arrived.emit)

View File

@ -717,7 +717,7 @@ default_texture = ExtResource("4_gdhoy")
[node name="床" parent="Ground/DeployLayer" index="2" instance=ExtResource("10_18v0g")]
position = Vector2(84, 50)
texture = ExtResource("7_xakd0")
sign_mark_offset = Vector2(0, -17.59)
sign_mark_offset = Vector2(0, -17.22)
enabled = false
title_filter = "c01"
note_key = "c01_院长床"
@ -725,7 +725,7 @@ note_key = "c01_院长床"
[node name="桌椅" parent="Ground/DeployLayer" index="3" instance=ExtResource("10_18v0g")]
position = Vector2(155, 45.5094)
texture = ExtResource("9_x837o")
sign_mark_offset = Vector2(0, -4.6)
sign_mark_offset = Vector2(0, -16.45)
title_filter = "c01"
note_key = "c01_院长书桌"
@ -738,6 +738,7 @@ note_key = "c01_倾斜的洋相片"
[node name="座钟" parent="Ground/DeployLayer" index="5" instance=ExtResource("10_18v0g")]
position = Vector2(335, 20)
sign_mark_offset = Vector2(0, 2.3)
title_filter = "c01"
note_key = "c01_院长座钟"
@ -794,7 +795,9 @@ frame = 9
[node name="钢琴" parent="Ground/DeployLayer" index="10" instance=ExtResource("14_lq1ou")]
position = Vector2(414, 51)
texture = ExtResource("8_mnduo")
sign_mark_offset = Vector2(0.95, -1.35)
sign_mark_offset = Vector2(4.12, -17.54)
enable_snapper = false
collision_width_and_x = Vector2(49.03, 0)
mute_when_interacted = true
mute_when_invalid = true
one_shot = false

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=31 format=3 uid="uid://coiumaaenimbc"]
[gd_scene load_steps=32 format=3 uid="uid://coiumaaenimbc"]
[ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_1sveo"]
[ext_resource type="Script" uid="uid://dcn7u7v3fsscj" path="res://scene/ground/scene/c01/s11_animation.gd" id="2_espm6"]
@ -12,6 +12,7 @@
[ext_resource type="AudioStream" uid="uid://b8rg7adnnkjll" path="res://asset/audio/BGM/戏曲声.wav" id="6_68ynl"]
[ext_resource type="SpriteFrames" uid="uid://bk54qlc8dr5xr" path="res://asset/art/gif/c01_黄包车长场景/c01_黄包车长场景_frames.tres" id="7_wo6md"]
[ext_resource type="AudioStream" uid="uid://bi6gm533oqsa" path="res://asset/audio/BGM/街道背景音.wav" id="7_yajus"]
[ext_resource type="Texture2D" uid="uid://c7m10rk4cw3lf" path="res://asset/art/scene/c01/s09_黄包车长场景/bg_夜晚黄包车场景.jpg" id="8_yajus"]
[ext_resource type="Script" uid="uid://dvmw38syi54l3" path="res://scene/ground/script/c01/s11_路灯序列.gd" id="9_6p5hp"]
[ext_resource type="Texture2D" uid="uid://cg1ey0l55acvs" path="res://asset/art/scene/c01/s09_黄包车长场景/e_单个路灯.png" id="9_u6881"]
[ext_resource type="Texture2D" uid="uid://cgsq1im2q63f8" path="res://asset/art/scene/c01/s09_黄包车长场景/e_路灯灯芯.png" id="11_2w2ir"]
@ -180,9 +181,11 @@ metadata/_custom_type_script = "uid://rq6w1vuhuq1m"
[node name="BGSprite2D" parent="Ground" index="1"]
position = Vector2(-12, 2)
offset = Vector2(0, -646)
texture = ExtResource("8_yajus")
offset = Vector2(-4, -627)
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="Ground/BGSprite2D" index="0"]
visible = false
position = Vector2(-4, -5)
sprite_frames = ExtResource("7_wo6md")
animation = &"bg_黄包车场景"

View File

@ -6,7 +6,7 @@
[ext_resource type="Script" uid="uid://rq6w1vuhuq1m" path="res://scene/entity/audio/sfx.gd" id="4_vc2dw"]
[ext_resource type="Texture2D" uid="uid://d05pqud4yoxx3" path="res://asset/art/scene/c02/s01_公寓门口/bg_公寓门口.png" id="5_j2ctx"]
[ext_resource type="PackedScene" uid="uid://jr1yd46wm5je" path="res://scene/entity/note.tscn" id="6_bhi7l"]
[ext_resource type="PackedScene" uid="uid://ci5anaxsa1apl" path="res://scene/entity/local_inspectable.tscn" id="7_vc2dw"]
[ext_resource type="PackedScene" uid="uid://ci5anaxsa1apl" path="res://scene/entity/inspectable.tscn" id="7_vc2dw"]
[ext_resource type="Texture2D" uid="uid://qls0yc054048" path="res://asset/art/scene/c02/小蝉寻人启事/e_寻人启事残破.png" id="8_j2ctx"]
[ext_resource type="Texture2D" uid="uid://cuyfloebe2mht" path="res://asset/art/scene/c02/小蝉寻人启事/ux_寻人启事残破.png" id="9_bhi7l"]

View File

@ -17,7 +17,7 @@
[ext_resource type="Texture2D" uid="uid://bt37pw8hhgsec" path="res://asset/art/prop/c02/海报(小)/剪辫子侦探.png" id="10_jg8g0"]
[ext_resource type="PackedScene" uid="uid://cuuej0j8q5ixu" path="res://scene/ground/script/c02/刮海报_过道.tscn" id="11_jg8g0"]
[ext_resource type="AudioStream" uid="uid://dq2ndg5yd3rps" path="res://asset/audio/sfx/旧版/c02/出现.mp3" id="11_u68d7"]
[ext_resource type="PackedScene" uid="uid://ci5anaxsa1apl" path="res://scene/entity/local_inspectable.tscn" id="12_0fckv"]
[ext_resource type="PackedScene" uid="uid://ci5anaxsa1apl" path="res://scene/entity/inspectable.tscn" id="12_0fckv"]
[ext_resource type="PackedScene" uid="uid://cw3q5pvciumil" path="res://scene/entity/interactable.tscn" id="13_ck13g"]
[ext_resource type="Script" uid="uid://rq6w1vuhuq1m" path="res://scene/entity/audio/sfx.gd" id="14_jg8g0"]
[ext_resource type="Texture2D" uid="uid://cyctvbeqxqvpb" path="res://asset/art/prop/c02/海报特写/青岛啤酒.png" id="16_vqhm5"]
@ -122,17 +122,20 @@ position = Vector2(203, -31)
sign_mark_offset = Vector2(-1.58, 8.6)
content_centered = true
texture_cover = ExtResource("7_jg8g0")
content_key = "c02_海报1"
[node name="Closeup刮海报" parent="Ground/DeployLayer" index="6" instance=ExtResource("19_6wwyd")]
position = Vector2(253, -31)
texture = ExtResource("10_jg8g0")
first_interact_os_key = "c02_海报_剪辫子侦探"
packed_scene = ExtResource("11_jg8g0")
enable_snapper = true
[node name="青岛啤酒" parent="Ground/DeployLayer" index="7" instance=ExtResource("12_0fckv")]
position = Vector2(253, -31)
enabled = false
texture_cover = ExtResource("16_vqhm5")
content_key = "c02_青岛啤酒"
[node name="鼠疫海报" parent="Ground/DeployLayer" index="8" instance=ExtResource("12_0fckv")]
position = Vector2(439, -29)
@ -209,10 +212,16 @@ hook_method = "check_if_show_shoes"
position = Vector2(122, -15)
gaslight_energy = 2.0
gaslight_ground_energy = 0.0
collision_width_and_x = true
one_shot = false
one_shot_max_times = true
disable_prop_after_interacted = 1
interacted_texture = false
[node name="Closeup八音盒" parent="Ground/DeployLayer" index="17" instance=ExtResource("19_6wwyd")]
position = Vector2(533, 65)
packed_scene = ExtResource("10_ifae7")
enable_snapper = true
[node name="Sprite2D" type="Sprite2D" parent="Ground/DeployLayer/Closeup八音盒"]
visible = false

View File

@ -296,9 +296,9 @@ func run_away():
player.visible = false
var ambush_xiaochan = burning_layer.get_node("Ambush等待的小蝉")
ambush_xiaochan.enabled = false
var node = burning_layer.get_node("牵手跑") as Node2D
var node = burning_layer.get_node("牵手跑") as Node2D
var sprite_together = node.get_node("牵手跑动画") as AnimatedSprite2D
sprite_together.visible = true
node.visible = true
SceneManager.get_camera_marker().focus_node(sprite_together)
player.reparent_light(sprite_together)
# 牵手动作
@ -308,6 +308,7 @@ func run_away():
await sprite_together.animation_finished
sprite_xiaochan.visible = false
sprite_together.play("一起牵手跑步")
node.get_node("Sfx2D跑步").play()
# 一起跑
var tween = create_tween()
tween.tween_property(node, "global_position:x", 20.0, 18.0)

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=73 format=3 uid="uid://djc2uaefhmu7"]
[gd_scene load_steps=78 format=3 uid="uid://djc2uaefhmu7"]
[ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_0dylx"]
[ext_resource type="Script" uid="uid://dsp5plrdkrsd7" path="res://scene/ground/scene/c02/s03_animation.gd" id="2_dt5aj"]
@ -52,6 +52,9 @@
[ext_resource type="SpriteFrames" uid="uid://b0icyhxpj16tv" path="res://asset/art/gif/c02_谢幕演出/c02_谢幕演出_frames.tres" id="39_rnk1v"]
[ext_resource type="AudioStream" uid="uid://dxoj6vg0wrj0j" path="res://asset/audio/peiyin_new/c02/c02_8小男孩童谣.wav" id="46_qqdxs"]
[ext_resource type="Script" uid="uid://cnt01hiw52bmn" path="res://scene/entity/ux/sign_snapper.gd" id="51_vddfx"]
[ext_resource type="AudioStream" uid="uid://bxp3f263aaqkp" path="res://asset/audio/sfx/脚步/02_室外_1.wav" id="52_qqdxs"]
[ext_resource type="AudioStream" uid="uid://dwa7xdvg5o0i" path="res://asset/audio/sfx/脚步/02_室外_3.wav" id="53_jhod7"]
[ext_resource type="AudioStream" uid="uid://d3h0xe0qtai18" path="res://asset/audio/sfx/脚步/02_室外_2.wav" id="54_lq23y"]
[ext_resource type="Script" uid="uid://wapo47a1oddf" path="res://scene/entity/audio/sfx2d.gd" id="54_o1qbs"]
[sub_resource type="Animation" id="Animation_rt2lh"]
@ -190,7 +193,7 @@ height = 300
[sub_resource type="RectangleShape2D" id="RectangleShape2D_er6ob"]
resource_local_to_scene = true
size = Vector2(40, 70)
size = Vector2(20, 70)
[sub_resource type="RectangleShape2D" id="RectangleShape2D_mdix7"]
size = Vector2(5, 100)
@ -221,10 +224,6 @@ animations = [{
"speed": 4.0
}]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_2y8cu"]
resource_local_to_scene = true
size = Vector2(30, 100)
[sub_resource type="RectangleShape2D" id="RectangleShape2D_bbhbr"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_d7h4s"]
@ -236,6 +235,28 @@ size = Vector2(250, 50)
[sub_resource type="RectangleShape2D" id="RectangleShape2D_vddfx"]
size = Vector2(20, 100)
[sub_resource type="AudioStreamSynchronized" id="AudioStreamSynchronized_qt2qg"]
stream_count = 2
stream_0/stream = ExtResource("52_qqdxs")
stream_0/volume = 0.0
stream_1/stream = ExtResource("53_jhod7")
stream_1/volume = 0.0
[sub_resource type="AudioStreamSynchronized" id="AudioStreamSynchronized_2b6vx"]
stream_count = 2
stream_0/stream = ExtResource("54_lq23y")
stream_0/volume = 0.0
stream_1/stream = ExtResource("52_qqdxs")
stream_1/volume = 0.0
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_fxne6"]
playback_mode = 1
random_pitch = 2.0
random_volume_offset_db = 1.0
streams_count = 2
stream_0/stream = SubResource("AudioStreamSynchronized_qt2qg")
stream_1/stream = SubResource("AudioStreamSynchronized_2b6vx")
[sub_resource type="Gradient" id="Gradient_em2ma"]
offsets = PackedFloat32Array(0.00928382, 0.681698, 1)
colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0)
@ -514,7 +535,11 @@ texture = ExtResource("6_1tart")
position = Vector2(290, 1)
gaslight_energy = 1.5
gaslight_ground_energy = 0.7
collision_width_and_x = true
mute_when_interacted = false
one_shot = false
disable_prop_after_interacted = true
interacted_texture = false
[node name="煤油灯2" parent="Ground/DeployLayer" index="17" instance=ExtResource("10_jme4f")]
position = Vector2(610, 1)
@ -522,7 +547,11 @@ gaslight_texture = ExtResource("11_g0qhj")
ground_light_texture = ExtResource("12_ni5ro")
gaslight_energy = 1.5
gaslight_ground_energy = 0.7
collision_width_and_x = true
mute_when_interacted = false
one_shot = false
disable_prop_after_interacted = true
interacted_texture = false
[node name="煤油灯3" parent="Ground/DeployLayer" index="18" instance=ExtResource("10_jme4f")]
position = Vector2(857, 1)
@ -530,7 +559,11 @@ gaslight_texture = ExtResource("13_hw832")
ground_light_texture = ExtResource("14_7pq5y")
gaslight_energy = 1.5
gaslight_ground_energy = 0.7
collision_width_and_x = true
mute_when_interacted = false
one_shot = false
disable_prop_after_interacted = true
interacted_texture = false
[node name="井" type="Sprite2D" parent="Ground/DeployLayer" index="19"]
self_modulate = Color(0.739288, 0.739288, 0.739288, 1)
@ -548,11 +581,14 @@ texture = ExtResource("22_3y5s5")
[node name="Closeup敲门游戏" parent="Ground/DeployLayer" index="21" instance=ExtResource("23_81juy")]
position = Vector2(466, 3)
packed_scene = ExtResource("24_0o4rt")
enable_snapper = true
collision_width_and_x = Vector2(40, 0)
[node name="Closeup井" parent="Ground/DeployLayer" index="22" instance=ExtResource("23_81juy")]
z_index = 6
position = Vector2(2063, 50)
packed_scene = ExtResource("26_yy4fp")
enable_snapper = true
[node name="Ambush惊悚闪电" parent="Ground/DeployLayer" index="23" instance=ExtResource("25_iyaiw")]
position = Vector2(1319, 40)
@ -576,20 +612,14 @@ position = Vector2(2037, 67)
sprite_frames = ExtResource("4_gd6xp")
animation = &"疯子看井"
frame_progress = 0.298829
walk_to_edge_width = -1.0
action_key = 3
height = 49.11
collision_width_and_x = Vector2(37.08, 0)
dialogue_title = "c02_s11_井边疯子对话"
[node name="SpeakingSign2D" parent="Ground/DeployLayer/Npc井边疯子" index="4"]
position = Vector2(0, -49.11)
[node name="Area2D" parent="Ground/DeployLayer/Npc井边疯子" index="5"]
position = Vector2(-11, -2)
[node name="CollisionShape2D" parent="Ground/DeployLayer/Npc井边疯子/Area2D" index="0"]
shape = SubResource("RectangleShape2D_2y8cu")
[node name="StaticBody2D" type="StaticBody2D" parent="Ground/DeployLayer/Npc井边疯子"]
position = Vector2(2, 3)
position = Vector2(11, 7)
collision_layer = 2
[node name="CollisionShape2D" type="CollisionShape2D" parent="Ground/DeployLayer/Npc井边疯子/StaticBody2D"]
@ -863,14 +893,14 @@ move_configs = Array[Dictionary]([{
[node name="Ambush等待的小蝉" parent="Ground/DeployLayer/火灾" instance=ExtResource("25_iyaiw")]
position = Vector2(2142, 71)
sign_mark_offset = Vector2(19.04, -38.54)
sign_mark_offset = Vector2(13.57, -39.84)
enabled = false
trigger_mode = "interact"
one_shot = false
[node name="小婵呼吸" type="AnimatedSprite2D" parent="Ground/DeployLayer/火灾/Ambush等待的小蝉"]
z_index = 9
position = Vector2(21, -32)
position = Vector2(16, -36)
sprite_frames = ExtResource("39_rnk1v")
animation = &"小婵呼吸_牵手前"
autoplay = "小婵呼吸_牵手前"
@ -881,19 +911,27 @@ script = ExtResource("51_vddfx")
metadata/_custom_type_script = "uid://cnt01hiw52bmn"
[node name="牵手跑" type="AnimatableBody2D" parent="Ground/DeployLayer/火灾"]
visible = false
position = Vector2(2133, 46)
collision_layer = 4
[node name="牵手跑动画" parent="Ground/DeployLayer/火灾/牵手跑" instance=ExtResource("33_ycojw")]
visible = false
z_index = 5
position = Vector2(17, -6)
position = Vector2(17, -11)
sprite_frames = ExtResource("39_rnk1v")
animation = &"一起牵手跑步"
animation = &"吕萍牵手动作"
[node name="CollisionShape2D" type="CollisionShape2D" parent="Ground/DeployLayer/火灾/牵手跑"]
shape = SubResource("RectangleShape2D_vddfx")
[node name="Sfx2D跑步" type="AudioStreamPlayer2D" parent="Ground/DeployLayer/火灾/牵手跑"]
stream = SubResource("AudioStreamRandomizer_fxne6")
volume_db = 3.0
bus = &"game_sfx"
script = ExtResource("54_o1qbs")
loop = true
metadata/_custom_type_script = "uid://wapo47a1oddf"
[node name="Interactable柜子" parent="Ground/DeployLayer" index="29" instance=ExtResource("8_xt8j0")]
visible = false
position = Vector2(1772, 48)
@ -946,4 +984,3 @@ blend_mode = 1
[editable path="Ground"]
[editable path="Ground/DeployLayer/Interactable铁门"]
[editable path="Ground/DeployLayer/Interactable铁门/Sign"]
[editable path="Ground/DeployLayer/Npc井边疯子"]

View File

@ -22,7 +22,7 @@
[sub_resource type="RectangleShape2D" id="RectangleShape2D_gk1h4"]
resource_local_to_scene = true
size = Vector2(5, 70)
size = Vector2(20, 70)
[node name="S04" type="Node2D"]
@ -88,16 +88,19 @@ texture = ExtResource("6_gk1h4")
[node name="Closeup折锡纸" parent="Ground/DeployLayer" index="3" instance=ExtResource("6_66gue")]
position = Vector2(189, 15)
packed_scene = ExtResource("7_fvlg0")
enable_snapper = null
[node name="Closeup老鼠精" parent="Ground/DeployLayer" index="4" instance=ExtResource("6_66gue")]
position = Vector2(207.5, -40.5)
texture = ExtResource("11_ffvrp")
packed_scene = ExtResource("8_cm3g6")
enable_snapper = null
[node name="Closeup花名册" parent="Ground/DeployLayer" index="5" instance=ExtResource("6_66gue")]
position = Vector2(345, 31)
position = Vector2(351, 31)
first_interact_os_key = "c02_保卫科花名册os"
packed_scene = ExtResource("6_fvlg0")
enable_snapper = null
[node name="煤油灯" parent="Ground/DeployLayer" index="6" instance=ExtResource("8_wpvss")]
position = Vector2(370, 39)
@ -105,6 +108,7 @@ animation_low_mode = true
hide_texture = true
gaslight_texture = ExtResource("9_a43aq")
ground_light_texture = ExtResource("10_svuj3")
enable_snapper = null
[node name="CollisionShape2D" parent="Ground/DeployLayer/煤油灯/Area2D" index="0"]
shape = SubResource("RectangleShape2D_gk1h4")

View File

@ -204,6 +204,7 @@ texture = ExtResource("8_mrltr")
[node name="Closeup戏台" parent="Ground/DeployLayer" index="6" instance=ExtResource("10_2yvhw")]
position = Vector2(320, 23)
packed_scene = ExtResource("11_2yvhw")
enable_snapper = null
[node name="Note一楼内侧通道" parent="Ground/DeployLayer" index="7" instance=ExtResource("10_8t4w6")]
position = Vector2(394, 26)
@ -221,6 +222,7 @@ texture = ExtResource("15_s2g5k")
[node name="Interactable粘鼠板" parent="Ground/DeployLayer" index="10" instance=ExtResource("13_uj0pt")]
position = Vector2(604, 81)
enable_snapper = null
disable_prop_after_interacted = true
interacted_texture = ExtResource("16_jknyg")
prop_key = "prop_粘鼠板"
@ -285,7 +287,7 @@ texture = ExtResource("8_tueh3")
[node name="PlayerLine2D" parent="Ground/ParallaxForeground" index="2"]
points = PackedVector2Array(37, 150, 700, 150)
[node name="DirectionalLight2D" parent="Ground" index="8"]
[node name="DirectionalLight2D" parent="Ground" index="7"]
visible = false
energy = 0.9
blend_mode = 1

View File

@ -143,10 +143,6 @@ func _c02_final_show():
func _on_exit_final_show(_arg):
var player = SceneManager.get_player()
# 显示角色光源,但不显示 sprite
player.visible = true
player.hide_sprite = true
# 瞎、胖、蝉三人离开
play("c02_final_show_end")
SceneManager.freeze_player(0)
@ -161,5 +157,4 @@ func _on_exit_final_show(_arg):
await animation_finished
c02_final_layer.queue_free()
SceneManager.release_player()
player.hide_sprite = false
ArchiveManager.set_global_entry("c02_burning_end", true)

View File

@ -1,7 +1,8 @@
[gd_scene load_steps=48 format=3 uid="uid://cootarwb44vvh"]
[gd_scene load_steps=49 format=3 uid="uid://cootarwb44vvh"]
[ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_qkymk"]
[ext_resource type="Script" uid="uid://cbt0ubygchxvv" path="res://scene/ground/scene/c02/s06_animation.gd" id="2_4dg6u"]
[ext_resource type="Script" uid="uid://cpejxlfni6n52" path="res://manager/audio_manager/vibe_sfx.gd" id="3_h3h1a"]
[ext_resource type="Texture2D" uid="uid://6ol2om68cd1q" path="res://asset/art/scene/c02/s06_二楼楼道/bg_背景.png" id="3_och2w"]
[ext_resource type="AudioStream" uid="uid://dvc2emnfcmabx" path="res://asset/audio/sfx/环境音/白噪音/白噪声楼道1.wav" id="3_tqnu8"]
[ext_resource type="Script" uid="uid://rq6w1vuhuq1m" path="res://scene/entity/audio/sfx.gd" id="4_2e08x"]
@ -32,7 +33,7 @@
[ext_resource type="AudioStream" uid="uid://bxp3f263aaqkp" path="res://asset/audio/sfx/脚步/02_室外_1.wav" id="29_tqnu8"]
[ext_resource type="AudioStream" uid="uid://d3h0xe0qtai18" path="res://asset/audio/sfx/脚步/02_室外_2.wav" id="30_r7b2r"]
[ext_resource type="AudioStream" uid="uid://dwa7xdvg5o0i" path="res://asset/audio/sfx/脚步/02_室外_3.wav" id="31_rpn6g"]
[ext_resource type="PackedScene" uid="uid://ci5anaxsa1apl" path="res://scene/entity/local_inspectable.tscn" id="32_4ndyv"]
[ext_resource type="PackedScene" uid="uid://ci5anaxsa1apl" path="res://scene/entity/inspectable.tscn" id="32_4ndyv"]
[ext_resource type="Texture2D" uid="uid://day38kany2gmr" path="res://asset/art/scene/c02/小蝉寻人启事/e_寻人启事完整.png" id="33_h3h1a"]
[ext_resource type="Texture2D" uid="uid://ce3d785v5lxg2" path="res://asset/art/scene/c02/小蝉寻人启事/ux_寻人启事完整.png" id="34_3u30v"]
@ -89,371 +90,62 @@ tracks/3/keys = {
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("DeployLayer/c02_final/吕萍:flip_h")
tracks/4/path = NodePath("DirectionalLight2D:energy")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("DirectionalLight2D:energy")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.9]
}
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("DeployLayer/c02_final/L环境光/L火柴光:energy")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("AnimationPlayer/Sfx擦亮火柴:playing")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("AnimationPlayer/Sfx翻找东西:playing")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/9/type = "value"
tracks/9/imported = false
tracks/9/enabled = true
tracks/9/path = NodePath("DeployLayer/c02_final/L环境光:position")
tracks/9/interp = 1
tracks/9/loop_wrap = true
tracks/9/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector2(627, 29)]
}
tracks/10/type = "value"
tracks/10/imported = false
tracks/10/enabled = true
tracks/10/path = NodePath("DeployLayer/煤油灯/PointLight2D:visible")
tracks/10/interp = 1
tracks/10/loop_wrap = true
tracks/10/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/11/type = "value"
tracks/11/imported = false
tracks/11/enabled = true
tracks/11/path = NodePath("DeployLayer/煤油灯/PointLightGround2D:visible")
tracks/11/interp = 1
tracks/11/loop_wrap = true
tracks/11/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/12/type = "value"
tracks/12/imported = false
tracks/12/enabled = true
tracks/12/path = NodePath("DeployLayer/煤油灯/灯光:visible")
tracks/12/interp = 1
tracks/12/loop_wrap = true
tracks/12/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/13/type = "value"
tracks/13/imported = false
tracks/13/enabled = true
tracks/13/path = NodePath("DeployLayer/c02_final:visible")
tracks/13/interp = 1
tracks/13/loop_wrap = true
tracks/13/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/14/type = "value"
tracks/14/imported = false
tracks/14/enabled = true
tracks/14/path = NodePath("DeployLayer/c02_final/吕萍:visible")
tracks/14/interp = 1
tracks/14/loop_wrap = true
tracks/14/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/15/type = "value"
tracks/15/imported = false
tracks/15/enabled = true
tracks/15/path = NodePath("MainPlayer:hide_sprite")
tracks/15/interp = 1
tracks/15/loop_wrap = true
tracks/15/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/16/type = "value"
tracks/16/imported = false
tracks/16/enabled = true
tracks/16/path = NodePath("DeployLayer/c02_final/小蝉:visible")
tracks/16/interp = 1
tracks/16/loop_wrap = true
tracks/16/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/17/type = "value"
tracks/17/imported = false
tracks/17/enabled = true
tracks/17/path = NodePath("DeployLayer/c02_final/胖子:visible")
tracks/17/interp = 1
tracks/17/loop_wrap = true
tracks/17/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/18/type = "value"
tracks/18/imported = false
tracks/18/enabled = true
tracks/18/path = NodePath("DeployLayer/c02_final/瞎子:visible")
tracks/18/interp = 1
tracks/18/loop_wrap = true
tracks/18/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/19/type = "value"
tracks/19/imported = false
tracks/19/enabled = true
tracks/19/path = NodePath("MainPlayer:visible")
tracks/19/interp = 1
tracks/19/loop_wrap = true
tracks/19/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/20/type = "value"
tracks/20/imported = false
tracks/20/enabled = true
tracks/20/path = NodePath("DeployLayer/c02_final/小蝉:frame")
tracks/20/interp = 1
tracks/20/loop_wrap = true
tracks/20/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [0]
}
tracks/21/type = "value"
tracks/21/imported = false
tracks/21/enabled = true
tracks/21/path = NodePath("DeployLayer/c02_final/小蝉:animation")
tracks/21/interp = 1
tracks/21/loop_wrap = true
tracks/21/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"小婵捂脸"]
}
tracks/22/type = "value"
tracks/22/imported = false
tracks/22/enabled = true
tracks/22/path = NodePath("DeployLayer/c02_final/吕萍:animation")
tracks/22/interp = 1
tracks/22/loop_wrap = true
tracks/22/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"小蝶擦火柴转身"]
}
tracks/23/type = "value"
tracks/23/imported = false
tracks/23/enabled = true
tracks/23/path = NodePath("DeployLayer/c02_final/吕萍:frame")
tracks/23/interp = 1
tracks/23/loop_wrap = true
tracks/23/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [3]
}
tracks/24/type = "value"
tracks/24/imported = false
tracks/24/enabled = true
tracks/24/path = NodePath("DeployLayer/c02_final/L环境光:visible")
tracks/24/interp = 1
tracks/24/loop_wrap = true
tracks/24/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
[sub_resource type="Animation" id="Animation_lh55k"]
resource_name = "c02_final_show_end"
length = 14.0
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("DeployLayer/c02_final:visible")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/1/type = "method"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("DeployLayer/c02_final/吕萍")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 2.93333),
"transitions": PackedFloat32Array(1, 1),
"values": [{
"args": [&"小蝶蹲下呼吸"],
"method": &"play"
}, {
"args": [&"小蝶擦火柴蹲下起身"],
"method": &"play"
}]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("DeployLayer/c02_final/吕萍:flip_h")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(3.93333),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("DeployLayer/c02_final/吕萍:visible")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 4.3),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [true, false]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("MainPlayer:hide_sprite")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 4.3),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [true, false]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("DeployLayer/c02_final/小蝉:visible")
tracks/5/path = NodePath("DeployLayer/c02_final/L环境光/L火柴光:energy")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
"update": 0,
"values": [0.0]
}
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("DeployLayer/c02_final/胖子:visible")
tracks/6/path = NodePath("AnimationPlayer/Sfx擦亮火柴:playing")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
"values": [false]
}
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("DeployLayer/c02_final/瞎子:visible")
tracks/7/path = NodePath("AnimationPlayer/Sfx翻找东西:playing")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
"values": [false]
}
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("DeployLayer/c02_final/L环境光:visible")
tracks/8/path = NodePath("DeployLayer/c02_final/L环境光:position")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
"update": 0,
"values": [Vector2(627, 29)]
}
tracks/9/type = "value"
tracks/9/imported = false
@ -491,6 +183,325 @@ tracks/11/keys = {
"update": 1,
"values": [true]
}
tracks/12/type = "value"
tracks/12/imported = false
tracks/12/enabled = true
tracks/12/path = NodePath("DeployLayer/c02_final:visible")
tracks/12/interp = 1
tracks/12/loop_wrap = true
tracks/12/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/13/type = "value"
tracks/13/imported = false
tracks/13/enabled = true
tracks/13/path = NodePath("DeployLayer/c02_final/吕萍:visible")
tracks/13/interp = 1
tracks/13/loop_wrap = true
tracks/13/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/14/type = "value"
tracks/14/imported = false
tracks/14/enabled = true
tracks/14/path = NodePath("MainPlayer:hide_sprite")
tracks/14/interp = 1
tracks/14/loop_wrap = true
tracks/14/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/15/type = "value"
tracks/15/imported = false
tracks/15/enabled = true
tracks/15/path = NodePath("DeployLayer/c02_final/小蝉:visible")
tracks/15/interp = 1
tracks/15/loop_wrap = true
tracks/15/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/16/type = "value"
tracks/16/imported = false
tracks/16/enabled = true
tracks/16/path = NodePath("DeployLayer/c02_final/胖子:visible")
tracks/16/interp = 1
tracks/16/loop_wrap = true
tracks/16/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/17/type = "value"
tracks/17/imported = false
tracks/17/enabled = true
tracks/17/path = NodePath("DeployLayer/c02_final/瞎子:visible")
tracks/17/interp = 1
tracks/17/loop_wrap = true
tracks/17/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/18/type = "value"
tracks/18/imported = false
tracks/18/enabled = true
tracks/18/path = NodePath("MainPlayer:visible")
tracks/18/interp = 1
tracks/18/loop_wrap = true
tracks/18/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/19/type = "value"
tracks/19/imported = false
tracks/19/enabled = true
tracks/19/path = NodePath("DeployLayer/c02_final/小蝉:frame")
tracks/19/interp = 1
tracks/19/loop_wrap = true
tracks/19/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [0]
}
tracks/20/type = "value"
tracks/20/imported = false
tracks/20/enabled = true
tracks/20/path = NodePath("DeployLayer/c02_final/小蝉:animation")
tracks/20/interp = 1
tracks/20/loop_wrap = true
tracks/20/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"小婵捂脸"]
}
tracks/21/type = "value"
tracks/21/imported = false
tracks/21/enabled = true
tracks/21/path = NodePath("DeployLayer/c02_final/吕萍:animation")
tracks/21/interp = 1
tracks/21/loop_wrap = true
tracks/21/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"小蝶擦火柴转身"]
}
tracks/22/type = "value"
tracks/22/imported = false
tracks/22/enabled = true
tracks/22/path = NodePath("DeployLayer/c02_final/吕萍:frame")
tracks/22/interp = 1
tracks/22/loop_wrap = true
tracks/22/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [3]
}
tracks/23/type = "value"
tracks/23/imported = false
tracks/23/enabled = true
tracks/23/path = NodePath("DeployLayer/c02_final/L环境光:visible")
tracks/23/interp = 1
tracks/23/loop_wrap = true
tracks/23/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
[sub_resource type="Animation" id="Animation_lh55k"]
resource_name = "c02_final_show_end"
length = 14.0
capture_included = true
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("DeployLayer/c02_final:visible")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/1/type = "method"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("DeployLayer/c02_final/吕萍")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [&"小蝶蹲下呼吸"],
"method": &"play"
}]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("DeployLayer/c02_final/吕萍:visible")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 3.8),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [true, false]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("MainPlayer:hide_sprite")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 3.8),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [true, false]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("DeployLayer/c02_final/小蝉:visible")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("DeployLayer/c02_final/胖子:visible")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("DeployLayer/c02_final/瞎子:visible")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("DeployLayer/c02_final/L环境光:visible")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("DeployLayer/煤油灯/PointLight2D:visible")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/9/type = "value"
tracks/9/imported = false
tracks/9/enabled = true
tracks/9/path = NodePath("DeployLayer/煤油灯/PointLightGround2D:visible")
tracks/9/interp = 1
tracks/9/loop_wrap = true
tracks/9/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/10/type = "value"
tracks/10/imported = false
tracks/10/enabled = true
tracks/10/path = NodePath("DeployLayer/煤油灯/灯光:visible")
tracks/10/interp = 1
tracks/10/loop_wrap = true
tracks/10/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/11/type = "value"
tracks/11/imported = false
tracks/11/enabled = true
tracks/11/path = NodePath("DeployLayer/c02_final/吕萍:animation")
tracks/11/interp = 1
tracks/11/loop_wrap = true
tracks/11/keys = {
"times": PackedFloat32Array(2.66667),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"小蝶擦火柴蹲下起身"]
}
tracks/12/type = "value"
tracks/12/imported = false
tracks/12/enabled = true
tracks/12/path = NodePath("DeployLayer/c02_final/吕萍:frame")
tracks/12/interp = 1
tracks/12/loop_wrap = true
tracks/12/keys = {
"times": PackedFloat32Array(2.66667, 3.5),
"transitions": PackedFloat32Array(1, 1),
"update": 2,
"values": [0, 3]
}
tracks/13/type = "value"
tracks/13/imported = false
tracks/13/enabled = true
tracks/13/path = NodePath("MainPlayer:visible")
tracks/13/interp = 1
tracks/13/loop_wrap = true
tracks/13/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
[sub_resource type="Animation" id="Animation_ciatp"]
resource_name = "c02_final_show_join"
@ -515,10 +526,10 @@ tracks/1/path = NodePath("DeployLayer/c02_final/L环境光:position")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(3.46667, 5.76667, 5.9, 6.13333, 6.73333, 7.53333, 9.6, 10.1333),
"times": PackedFloat32Array(3.46667, 5.83333, 5.96667, 6.26667, 6.93333, 7.53333, 9.6, 10.1333),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1),
"update": 0,
"values": [Vector2(631, 27), Vector2(631, 30.0694), Vector2(663, 24.212), Vector2(674, 29), Vector2(673.571, 31.016), Vector2(682, 80), Vector2(682, 80), Vector2(673, 63)]
"values": [Vector2(624, 26), Vector2(624, 27.069), Vector2(648.75, 27.214), Vector2(670, 30), Vector2(664.571, 28.016), Vector2(682, 80), Vector2(682, 80), Vector2(673, 63)]
}
tracks/2/type = "method"
tracks/2/imported = false
@ -527,7 +538,7 @@ tracks/2/path = NodePath("DeployLayer/c02_final/吕萍")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0.533333, 11.1667),
"times": PackedFloat32Array(0.533333, 11.9667),
"transitions": PackedFloat32Array(1, 1),
"values": [{
"args": [&"小蝶擦火柴呼吸"],
@ -542,7 +553,7 @@ tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("DeployLayer/c02_final/吕萍:animation")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/loop_wrap = false
tracks/3/keys = {
"times": PackedFloat32Array(3.6, 9.2),
"transitions": PackedFloat32Array(1, 1),
@ -554,12 +565,12 @@ tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("DeployLayer/c02_final/吕萍:frame")
tracks/4/interp = 1
tracks/4/loop_wrap = false
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(3.6, 7.53333, 9.2, 10.6),
"times": PackedFloat32Array(3.6, 7.63333, 9.2, 11.5667),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 2,
"values": [0, 15, 0, 3]
"values": [0, 15, 0, 5]
}
tracks/5/type = "value"
tracks/5/imported = false
@ -782,7 +793,7 @@ _data = {
[sub_resource type="RectangleShape2D" id="RectangleShape2D_lh55k"]
resource_local_to_scene = true
size = Vector2(5, 70)
size = Vector2(20, 70)
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_wywax"]
playback_mode = 1
@ -838,7 +849,11 @@ data = {
}
oneshot_animation = ""
[node name="背景音效" type="AudioStreamPlayer" parent="Ground/AnimationPlayer" index="0"]
[node name="VibeSfx" type="Node" parent="Ground/AnimationPlayer" index="0"]
script = ExtResource("3_h3h1a")
metadata/_custom_type_script = "uid://cpejxlfni6n52"
[node name="背景音效" type="AudioStreamPlayer" parent="Ground/AnimationPlayer" index="1"]
stream = ExtResource("3_tqnu8")
volume_db = -3.0
autoplay = true
@ -850,13 +865,13 @@ mode = "场景背景音"
"感应玩家操作" = false
metadata/_custom_type_script = "uid://rq6w1vuhuq1m"
[node name="Sfx翻找东西" type="AudioStreamPlayer" parent="Ground/AnimationPlayer" index="1"]
[node name="Sfx翻找东西" type="AudioStreamPlayer" parent="Ground/AnimationPlayer" index="2"]
stream = ExtResource("5_lh55k")
bus = &"game_sfx"
script = ExtResource("4_2e08x")
metadata/_custom_type_script = "uid://rq6w1vuhuq1m"
[node name="Sfx擦亮火柴" type="AudioStreamPlayer" parent="Ground/AnimationPlayer" index="2"]
[node name="Sfx擦亮火柴" type="AudioStreamPlayer" parent="Ground/AnimationPlayer" index="3"]
stream = ExtResource("5_wywax")
bus = &"game_sfx"
script = ExtResource("4_2e08x")
@ -919,6 +934,9 @@ debug_mov_animation = "小小小蝶动画(跑)"
position = Vector2(616, -14)
ground_light_texture = ExtResource("8_7x2h6")
ground_height_offset = 15.0
enable_snapper = null
one_shot = false
disable_prop_after_interacted = true
[node name="CollisionShape2D" parent="Ground/DeployLayer/煤油灯/Area2D" index="0"]
shape = SubResource("RectangleShape2D_lh55k")
@ -932,10 +950,14 @@ position = Vector2(329, -14)
ground_light_texture = ExtResource("6_vbvbc")
gaslight_energy = 2.0
ground_height_offset = 15.0
enable_snapper = null
one_shot = false
disable_prop_after_interacted = true
[node name="Interactable老鼠洞" parent="Ground/DeployLayer" index="8" instance=ExtResource("7_0d746")]
position = Vector2(610, 50)
enabled = false
enable_snapper = null
one_shot_max_times = 2
disable_prop_after_interacted = true
prop_key = "prop_小鞋子1"
@ -999,16 +1021,19 @@ frame_progress = 0.121203
position = Vector2(322, -269)
packed_scene = ExtResource("12_intre")
quit_closeup_on_escape = false
enable_snapper = null
[node name="Closeup水盆" parent="Ground/DeployLayer" index="14" instance=ExtResource("11_owxx3")]
position = Vector2(289, 16)
packed_scene = ExtResource("16_p6da7")
enable_snapper = null
[node name="Closeup谢幕演出" parent="Ground/DeployLayer" index="15" instance=ExtResource("11_owxx3")]
position = Vector2(518, -272)
action_key = 3
packed_scene = ExtResource("25_m28ab")
quit_closeup_on_escape = false
enable_snapper = null
[node name="c02_final" type="Node2D" parent="Ground/DeployLayer" index="16"]
visible = false
@ -1035,7 +1060,7 @@ move_configs = Array[Dictionary]([{
debug_mov_animation = "胖子走路"
[node name="吕萍" type="AnimatedSprite2D" parent="Ground/DeployLayer/c02_final"]
position = Vector2(653, 38)
position = Vector2(646, 39.5)
sprite_frames = ExtResource("15_k01ve")
animation = &"小蝶擦火柴转身"
autoplay = "小蝶擦火柴呼吸"
@ -1116,6 +1141,7 @@ texture = SubResource("GradientTexture2D_p6da7")
position = Vector2(749, -2)
texture = ExtResource("33_h3h1a")
texture_cover = ExtResource("34_3u30v")
content_key = "c02_寻人启事_完整"
[node name="MainPlayer" parent="Ground" index="4"]
position = Vector2(650, 98)

View File

@ -154,6 +154,7 @@ texture = ExtResource("8_3ftnp")
position = Vector2(364, 55)
texture = ExtResource("6_mty8e")
enabled = false
enable_snapper = false
mute_when_interacted = true
one_shot = false
@ -187,7 +188,13 @@ texture = ExtResource("12_27dvh")
position = Vector2(373, -13.8031)
gaslight_energy = 2.0
gaslight_ground_energy = 2.0
enable_snapper = null
collision_width_and_x = true
mute_when_interacted = false
one_shot = false
one_shot_max_times = true
disable_prop_after_interacted = 1
interacted_texture = false
[node name="拼接小猫玩具" type="AnimatedSprite2D" parent="Ground/DeployLayer" index="12"]
visible = false

View File

@ -1,8 +1,7 @@
[gd_scene load_steps=14 format=3 uid="uid://cxw5rovg5mu1a"]
[gd_scene load_steps=15 format=3 uid="uid://cxw5rovg5mu1a"]
[ext_resource type="Script" uid="uid://c8vsfqoeu26gk" path="res://scene/ground/script/c02/s00_煤油灯.gd" id="1_0aa53"]
[ext_resource type="Texture2D" uid="uid://b3qgmrfslj135" path="res://asset/art/scene/c02/s03_公寓一楼院子/光晕/光晕1.png" id="2_uusov"]
[ext_resource type="AudioStream" uid="uid://inmdv5gqqius" path="res://asset/audio/sfx/UI/门锁互动.mp3" id="3_1xq2f"]
[ext_resource type="Texture2D" uid="uid://c1nrsyh1ss82v" path="res://asset/art/scene/c02/s03_公寓一楼院子/地面物品反光/地反光1.png" id="3_y2gsk"]
[ext_resource type="Texture2D" uid="uid://dtyg0nugb2tnf" path="res://asset/art/ui/action_mark/UI探索.png" id="4_abb1f"]
[ext_resource type="PackedScene" uid="uid://c4tipnj1cr1j3" path="res://scene/entity/ux/sign.tscn" id="4_w1aco"]
@ -11,17 +10,20 @@
[ext_resource type="Script" uid="uid://rq6w1vuhuq1m" path="res://scene/entity/audio/sfx.gd" id="8_abb1f"]
[ext_resource type="AudioStream" uid="uid://cljr4g0sivpdh" path="res://asset/audio/sfx/交互/sfx_煤油灯点燃成功.wav" id="9_abb1f"]
[ext_resource type="SpriteFrames" uid="uid://3nas025c2c5u" path="res://asset/art/gif/c02_杂项/c02_杂项_frames.tres" id="9_h0ajm"]
[ext_resource type="AudioStream" uid="uid://dph8v3v5mq1xl" path="res://asset/audio/sfx/交互/sfx_交互失败.wav" id="9_l338h"]
[ext_resource type="Texture2D" uid="uid://djfn6ya63emu0" path="res://asset/art/scene/c02/s02_大门过道/e_煤油灯座.png" id="10_h0ajm"]
[ext_resource type="Script" uid="uid://cnt01hiw52bmn" path="res://scene/entity/ux/sign_snapper.gd" id="13_l338h"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_h0ajm"]
resource_local_to_scene = true
size = Vector2(5, 70)
size = Vector2(20, 70)
[node name="煤油灯" type="Sprite2D"]
script = ExtResource("1_0aa53")
gaslight_texture = ExtResource("2_uusov")
ground_light_texture = ExtResource("3_y2gsk")
debug_light_switch = true
enable_snapper = null
unrevealed_sign_texture = ExtResource("4_abb1f")
unmatched_sign_texture = ExtResource("5_l338h")
matched_sign_texture = ExtResource("6_ivr1s")
@ -31,7 +33,7 @@ prop_key2 = ""
prop_key3 = ""
[node name="SfxInvalid" type="AudioStreamPlayer" parent="."]
stream = ExtResource("3_1xq2f")
stream = ExtResource("9_l338h")
bus = &"game_sfx"
script = ExtResource("8_abb1f")
@ -69,3 +71,12 @@ texture = ExtResource("10_h0ajm")
[node name="Sign" parent="." instance=ExtResource("4_w1aco")]
unique_name_in_owner = true
[node name="SignSnapper" type="Marker2D" parent="."]
unique_name_in_owner = true
script = ExtResource("13_l338h")
radius = 3.0
delay_arrived = 0.1
action_on_arrived = 4
delay_after_action = 0.4
metadata/_custom_type_script = "uid://cnt01hiw52bmn"

View File

@ -3,10 +3,10 @@
[ext_resource type="Texture2D" uid="uid://cawpq7rnho5px" path="res://asset/art/gif/c02_小手/洞.png" id="1_47cqy"]
[ext_resource type="Script" uid="uid://my5xqi3bkka6" path="res://scene/ground/script/c02/小手讨东西.gd" id="1_n7thl"]
[ext_resource type="Texture2D" uid="uid://dtyg0nugb2tnf" path="res://asset/art/ui/action_mark/UI探索.png" id="3_lr23o"]
[ext_resource type="AudioStream" uid="uid://inmdv5gqqius" path="res://asset/audio/sfx/UI/门锁互动.mp3" id="3_n7thl"]
[ext_resource type="Texture2D" uid="uid://xcmvfp72l061" path="res://asset/art/ui/action_mark/UI锁.png" id="4_0tuif"]
[ext_resource type="PackedScene" uid="uid://c4tipnj1cr1j3" path="res://scene/entity/ux/sign.tscn" id="5_3c204"]
[ext_resource type="Texture2D" uid="uid://gui0ubwlwoi0" path="res://asset/art/ui/action_mark/UI手.png" id="5_n2hq3"]
[ext_resource type="AudioStream" uid="uid://dph8v3v5mq1xl" path="res://asset/audio/sfx/交互/sfx_交互失败.wav" id="6_lr23o"]
[ext_resource type="Script" uid="uid://rq6w1vuhuq1m" path="res://scene/entity/audio/sfx.gd" id="7_7dftu"]
[ext_resource type="PackedScene" uid="uid://b50n0hvs4yh75" path="res://addons/property-inspector/pro_animation_sprite2d/pro_animated_sprite.tscn" id="7_brfob"]
[ext_resource type="AudioStream" uid="uid://44slgncnt6sj" path="res://asset/audio/sfx/交互/第一章/sfx_手交互成功.wav" id="8_7dftu"]
@ -28,7 +28,7 @@ unmatched_sign_texture = ExtResource("4_0tuif")
matched_sign_texture = ExtResource("5_n2hq3")
[node name="SfxInvalid" type="AudioStreamPlayer" parent="."]
stream = ExtResource("3_n7thl")
stream = ExtResource("6_lr23o")
bus = &"game_sfx"
script = ExtResource("7_7dftu")
metadata/_custom_type_script = "uid://rq6w1vuhuq1m"
@ -120,4 +120,7 @@ texture = ExtResource("10_47cqy")
[node name="SignSnapper" type="Marker2D" parent="."]
unique_name_in_owner = true
script = ExtResource("15_lr23o")
delay_arrived = 0.1
action_on_arrived = 4
delay_after_action = 0.4
metadata/_custom_type_script = "uid://cnt01hiw52bmn"