demo 0.1.2.3 优化

This commit is contained in:
cakipaul 2025-07-02 15:32:37 +08:00
parent 1882cc4969
commit ed0cf6ba8d
58 changed files with 984 additions and 330 deletions

View File

@ -1,25 +1,74 @@
[gd_resource type="SpriteFrames" load_steps=17 format=3 uid="uid://c8dl7c68f1yb0"]
[gd_resource type="SpriteFrames" load_steps=28 format=3 uid="uid://c8dl7c68f1yb0"]
[ext_resource type="Texture2D" uid="uid://c0a8gd6jo2ov3" path="res://asset/art/gif/c02_二楼/疯子跑动/0.png" id="1_63k7g"]
[ext_resource type="Texture2D" uid="uid://b1c1c3i0yw2ec" path="res://asset/art/gif/c02_二楼/疯子撞墙/0.png" id="1_hj708"]
[ext_resource type="Texture2D" path="res://asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/0.png" id="1_wsslv"]
[ext_resource type="Texture2D" uid="uid://bfngukedof1y5" path="res://asset/art/gif/c02_二楼/疯子撞墙/1.png" id="2_1du44"]
[ext_resource type="Texture2D" uid="uid://cbasvdgqr8446" path="res://asset/art/gif/c02_二楼/疯子跑动/1.png" id="2_22fhs"]
[ext_resource type="Texture2D" path="res://asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/1.png" id="2_226pc"]
[ext_resource type="Texture2D" uid="uid://cj6cjxjsi6v1o" path="res://asset/art/gif/c02_二楼/疯子跑动/2.png" id="3_jh047"]
[ext_resource type="Texture2D" path="res://asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/2.png" id="3_ki3d0"]
[ext_resource type="Texture2D" uid="uid://cwt2h0rs4olgx" path="res://asset/art/gif/c02_二楼/疯子撞墙/2.png" id="3_lhftd"]
[ext_resource type="Texture2D" uid="uid://85ws4e51p7xd" path="res://asset/art/gif/c02_二楼/疯子跑动/3.png" id="4_0umtp"]
[ext_resource type="Texture2D" path="res://asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/3.png" id="4_222li"]
[ext_resource type="Texture2D" uid="uid://cah0u1r1etyit" path="res://asset/art/gif/c02_二楼/疯子撞墙/3.png" id="4_mg204"]
[ext_resource type="Texture2D" path="res://asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/4.png" id="5_cylr4"]
[ext_resource type="Texture2D" uid="uid://dvjfqwhwfyhbd" path="res://asset/art/gif/c02_二楼/疯子撞墙/4.png" id="5_f5uit"]
[ext_resource type="Texture2D" path="res://asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/5.png" id="6_3dyjx"]
[ext_resource type="Texture2D" uid="uid://ch1xvskmqros" path="res://asset/art/gif/c02_二楼/疯子撞墙/5.png" id="6_m5vcj"]
[ext_resource type="Texture2D" path="res://asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/6.png" id="7_7hwpj"]
[ext_resource type="Texture2D" uid="uid://b72c8cfitylg8" path="res://asset/art/gif/c02_二楼/疯子撞墙/6.png" id="7_1671v"]
[ext_resource type="Texture2D" path="res://asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/7.png" id="8_ffct7"]
[ext_resource type="Texture2D" uid="uid://cni6i40kn1b8b" path="res://asset/art/gif/c02_二楼/疯子撞墙/7.png" id="8_mvc2t"]
[ext_resource type="Texture2D" path="res://asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/8.png" id="9_82f58"]
[ext_resource type="Texture2D" uid="uid://ci2r63i3a6l6h" path="res://asset/art/gif/c02_二楼/疯子撞墙/8.png" id="9_dko4h"]
[ext_resource type="Texture2D" path="res://asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/9.png" id="10_b4lti"]
[ext_resource type="Texture2D" uid="uid://blcgp2qwfjn3b" path="res://asset/art/gif/c02_二楼/疯子撞墙/9.png" id="10_rxt3q"]
[ext_resource type="Texture2D" path="res://asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/10.png" id="11_opiqg"]
[ext_resource type="Texture2D" uid="uid://ccdpsykfnhik8" path="res://asset/art/gif/c02_二楼/疯子跪下/2.png" id="17_7v1rg"]
[ext_resource type="Texture2D" uid="uid://8g5rukqap3w8" path="res://asset/art/gif/c02_二楼/疯子跪下/3.png" id="18_ox23s"]
[resource]
animations = [{
"frames": [{
"duration": 6.0,
"texture": ExtResource("1_wsslv")
}, {
"duration": 6.0,
"texture": ExtResource("2_226pc")
}, {
"duration": 6.0,
"texture": ExtResource("3_ki3d0")
}, {
"duration": 6.0,
"texture": ExtResource("4_222li")
}, {
"duration": 6.0,
"texture": ExtResource("5_cylr4")
}, {
"duration": 6.0,
"texture": ExtResource("6_3dyjx")
}, {
"duration": 6.0,
"texture": ExtResource("7_7hwpj")
}, {
"duration": 6.0,
"texture": ExtResource("8_ffct7")
}, {
"duration": 6.0,
"texture": ExtResource("9_82f58")
}, {
"duration": 6.0,
"texture": ExtResource("10_b4lti")
}, {
"duration": 6.0,
"texture": ExtResource("11_opiqg")
}],
"loop": true,
"name": &"叼纸小猫坐着呼吸",
"speed": 30.0
}, {
"frames": [{
"duration": 1.0,
"texture": ExtResource("1_hj708")
}, {

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -0,0 +1,14 @@
[remap]
importer="gif.animated.texture.plugin"
type="SpriteFrames"
uid="uid://ca5dpfgp7qt6m"
path="res://.godot/imported/叼纸小猫坐着呼吸.gif-ebf8f8899f6012e57cb36a0cbc20c0aa.tres"
[deps]
source_file="res://asset/art/gif/c02_二楼/叼纸小猫坐着呼吸.gif"
dest_files=["res://.godot/imported/叼纸小猫坐着呼吸.gif-ebf8f8899f6012e57cb36a0cbc20c0aa.tres"]
[params]

Binary file not shown.

After

Width:  |  Height:  |  Size: 605 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c236epftux1w2"
path="res://.godot/imported/0.png-922aee4d362cd8bc880e41a7e186d37f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/0.png"
dest_files=["res://.godot/imported/0.png-922aee4d362cd8bc880e41a7e186d37f.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.

After

Width:  |  Height:  |  Size: 570 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://beqqq2s3pjwed"
path="res://.godot/imported/1.png-b92d00f4ace5ead0469124bfdea6ae58.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/1.png"
dest_files=["res://.godot/imported/1.png-b92d00f4ace5ead0469124bfdea6ae58.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.

After

Width:  |  Height:  |  Size: 590 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cblt1arfn4lov"
path="res://.godot/imported/10.png-eea90f0c222a833753cc40b7b9a43588.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/10.png"
dest_files=["res://.godot/imported/10.png-eea90f0c222a833753cc40b7b9a43588.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.

After

Width:  |  Height:  |  Size: 590 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://1buxuxtjilqk"
path="res://.godot/imported/2.png-d5793bc1252058454127de975fb2981b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/2.png"
dest_files=["res://.godot/imported/2.png-d5793bc1252058454127de975fb2981b.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.

After

Width:  |  Height:  |  Size: 592 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://1u5chw5en7tw"
path="res://.godot/imported/3.png-509b591c5554c88a9dba8d233b6cb5fb.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/3.png"
dest_files=["res://.godot/imported/3.png-509b591c5554c88a9dba8d233b6cb5fb.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.

After

Width:  |  Height:  |  Size: 577 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://yrt55cq06fe"
path="res://.godot/imported/4.png-ded117d8988392b6d67bd8c69f35ba1d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/4.png"
dest_files=["res://.godot/imported/4.png-ded117d8988392b6d67bd8c69f35ba1d.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.

After

Width:  |  Height:  |  Size: 565 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cwlexhsxfg88o"
path="res://.godot/imported/5.png-18cb5808969f3ed699deda90b9065adb.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/5.png"
dest_files=["res://.godot/imported/5.png-18cb5808969f3ed699deda90b9065adb.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.

After

Width:  |  Height:  |  Size: 588 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cbckomfskxykj"
path="res://.godot/imported/6.png-1bdd54a7f2ad072dfb65d9bf297bd8a8.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/6.png"
dest_files=["res://.godot/imported/6.png-1bdd54a7f2ad072dfb65d9bf297bd8a8.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.

After

Width:  |  Height:  |  Size: 565 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cj2hmg3cnripa"
path="res://.godot/imported/7.png-13b26bd998a8b9041876718098906d90.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/7.png"
dest_files=["res://.godot/imported/7.png-13b26bd998a8b9041876718098906d90.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.

After

Width:  |  Height:  |  Size: 577 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://br2u1ia6gs0vv"
path="res://.godot/imported/8.png-5c8f07ac5e310e04b8996773df71213b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/8.png"
dest_files=["res://.godot/imported/8.png-5c8f07ac5e310e04b8996773df71213b.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.

After

Width:  |  Height:  |  Size: 592 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b5ph1p5cp7dyg"
path="res://.godot/imported/9.png-783e520bf611e5ccde008a69e8321917.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/9.png"
dest_files=["res://.godot/imported/9.png-783e520bf611e5ccde008a69e8321917.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.

After

Width:  |  Height:  |  Size: 52 KiB

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b5kolhax7pf4u"
path="res://.godot/imported/小猫纸条.png-2bb3dea64dd13aca468eb7e6755e754e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://asset/art/prop/c02/小猫纸条.png"
dest_files=["res://.godot/imported/小猫纸条.png-2bb3dea64dd13aca468eb7e6755e754e.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

View File

@ -0,0 +1,11 @@
~ EventStage
# 0:关闭 1:打开 2:放入小蝉人偶 3:全部放置正确_可摇手柄 4:已播放完成
c02_musicbox_stage
# 1:已交互疯子 2小鞋已掉落
c02_madman_interacted
# 0:默认 1:寻找弹珠_老虎钳可以换弹珠 2:给出弹珠 3:游戏结束_小猫纸片 4:游戏结束_小猫离开
c02_ball_game_stage
=> END
~ ArchiveStage
=> END

View File

@ -0,0 +1,16 @@
[remap]
importer="dialogue_manager"
importer_version=15
type="Resource"
uid="uid://dohpsb4jttuv1"
path="res://.godot/imported/event_stage.dialogue-6d96900dfc739f5d1bb21542d623179e.tres"
[deps]
source_file="res://asset/dialogue/event_stage.dialogue"
dest_files=["res://.godot/imported/event_stage.dialogue-6d96900dfc739f5d1bb21542d623179e.tres"]
[params]
defaults=true

View File

@ -1,45 +1,22 @@
keys,zh_CN,_character,_notes,_tags,zh_SH,en
重要物品示例,重要物品示例,,,,,
1,1,,,,,
2,2,,,,,
3,3,,,,,
4,4,,,,,
c02_杂物堆,杂物堵住了,,,,,
prop_新鲜的肉,新鲜的肉,,,[#texture=c02/新鲜的肉.png],,
c02_小蝉寻人启事_脸部破碎,寻人启事...画像和字迹都看不清。,,,,,
小猫玩具发光,嗯?玩具在发光,,,,,
setting_画册,画册G,,,,,
notes_干掉的血迹,干掉的血迹,,,,,
c02_瞎子卧室_血脚印,这画上的脚印和刚刚看到的一样。,,,,,
bag_tab_日志,笔记,,,,,
ux_panel_退出,退出,,,,,
setting_主界面,回到主界面,,,,,Back to Menu
setting_退出,保存并退出,,,,,Save & Exit
setting_日志,笔记B,,,,,Open the Log
setting_记忆,记忆G,,,,,
setting_全屏游戏,全屏游戏,,,,,Full Screen
setting_窗口置顶,窗口置顶,,,,,Top Window
ux_panel_笔记,线索,,,,,
c02_小手其他交易,...还有什么东西能跟它交换呢?,,,,,
这是什么鬼东西,它是在讨要什么 [ID:],这是什么鬼东西,它是在讨要什么 [ID:],,,,,
index_新游戏,新游戏,,,,,New Game
index_继续游戏,继续游戏,,,,,Resume
index_退出游戏,退出游戏,,,,,Exit
index_新游戏,新游戏,,,,,
index_继续游戏,继续游戏,,,,,
index_退出游戏,退出游戏,,,,,
ux_panel_继续,继续,,,,,
ux_panel_线索笔记,线索,,,,,
ux_panel_设置,设置,,,,,
ux_panel_返回主菜单,返回主菜单,,,,,
ux_panel_退出游戏,退出游戏,,,,,
setting_总音量,总音量,,,,,Main Volume
setting_音效音量,音效音量,,,,,SFX Volume
setting_对话音量,对话音量,,,,,Dialogue Volume
setting_语言,语言(Lang),,,,,Language
setting_总音量,总音量,,,,,
setting_音效音量,音效音量,,,,,
setting_对话音量,对话音量,,,,,
setting_语言,语言(Lang),,,,,
setting_字幕,字幕,,,,,
setting_气泡文字自动结束,气泡文字自动结束,,,,,
setting_气泡等待时长,气泡停留,,,,,
setting_全屏,全屏游戏,,,,,
setting_置顶,窗口置顶,,,,,
setting_自动保存,自动保存,,,,,Auto Save
setting_自动保存,自动保存,,,,,
ui_秒,秒,,,,,S
setting_返回,返回,,,,,
bag_tab_笔记,线索,,,,,
@ -111,6 +88,8 @@ prop_木头人偶_说明,略显粗糙的木头玩偶,能依稀辨认出是个
prop_小蝉人偶_说明,小小的人儿,小小的鞋子,小小的友情啊——像蝶依偎着花,,,,,
prop_粘鼠板,粘鼠板,,,[#texture=c02/粘鼠板特写.png],,
prop_粘鼠板_说明,自制的捕鼠工具,纸上面有黏黏的浆糊,,,,,
prop_小猫纸条,小猫纸条,,,[#texture=c02/小猫纸条.png],,
prop_小猫纸条_说明,「大哥,今晚老地方见 /井\」,,,,,
prop_一把香,一把香,,,[#texture=c02/一把香.png],,
prop_2014钥匙,2014钥匙,,,[#texture=c02/1012钥匙物品.png],,
prop_重要物品示例,重要物品示例,,,[#texture=c01/银元.png],,
@ -123,16 +102,8 @@ c01_s05_检查院长房间,好像忘记了什么事情,再回去检查一遍
c01_s07_需要报纸,书店还没开门。,,,,,
c01_s08_书店工作,老板交代的工作还没做完,不能偷懒。,,,,,
c01_s08_书店工钱,这个月的工钱还没拿。,,,,,
c02_杂物堆堵住,杂物堵住了,,,,,
notes_纸条,纸条,,,,,
notes_锁住了,锁住了,,,,,
notes_打不开,打不开,,,,,
notes_无法通过,无法通过,,,,,
notes_有什么东西,有什么东西,,,,,
notes_无法触碰,无法触碰,,,,,
notes_挂画,挂画,,,,,
notes_相框,相框,,,,,
notes_寻人启事,寻人启事,,,,,
mem_偷听对话,偷听对话,,,,,
mem_疯子看井,疯子看井,,,,,
c01_鸡毛掸子,这是鸡毛掸子吗?,,,,,
c01_院长书桌,桌上放着一本《圣经》。<br>「得著生命的,將要失喪生命...」,,,,,
c01_院长床,这本书已经看过了。<br>...那些句子是什么意思呢?,,,,,
@ -205,5 +176,3 @@ c02_小蝉恨他们,我恨他们!,,,,,
c02_火灾等待准备,还没准备好点火呢,,,,,
c02_霸凌救小蝉开始,啊!我得想办法帮帮她...,,,,,
c02_点火前阻止右移,没时间浪费了!想想办法救出小蝉...,,,,,
g_偷听对话,偷听对话,,,,,
g_疯子看井,疯子看井,,,,,

1 keys zh_CN _character _notes _tags zh_SH en
2 重要物品示例 index_新游戏 重要物品示例 新游戏
3 1 index_继续游戏 1 继续游戏
4 2 index_退出游戏 2 退出游戏
3 3
4 4
c02_杂物堆 杂物堵住了
prop_新鲜的肉 新鲜的肉 [#texture=c02/新鲜的肉.png]
c02_小蝉寻人启事_脸部破碎 寻人启事...画像和字迹都看不清。
小猫玩具发光 嗯?玩具在发光
setting_画册 画册(G)
notes_干掉的血迹 干掉的血迹
c02_瞎子卧室_血脚印 这画上的脚印和刚刚看到的一样。
bag_tab_日志 笔记
ux_panel_退出 退出
setting_主界面 回到主界面 Back to Menu
setting_退出 保存并退出 Save & Exit
setting_日志 笔记(B) Open the Log
setting_记忆 记忆(G)
setting_全屏游戏 全屏游戏 Full Screen
setting_窗口置顶 窗口置顶 Top Window
ux_panel_笔记 线索
c02_小手其他交易 ...还有什么东西能跟它交换呢?
这是什么鬼东西,它是在讨要什么 [ID:] 这是什么鬼东西,它是在讨要什么 [ID:]
index_新游戏 新游戏 New Game
index_继续游戏 继续游戏 Resume
index_退出游戏 退出游戏 Exit
5 ux_panel_继续 继续
6 ux_panel_线索笔记 线索
7 ux_panel_设置 设置
8 ux_panel_返回主菜单 返回主菜单
9 ux_panel_退出游戏 退出游戏
10 setting_总音量 总音量 Main Volume
11 setting_音效音量 音效音量 SFX Volume
12 setting_对话音量 对话音量 Dialogue Volume
13 setting_语言 语言(Lang) Language
14 setting_字幕 字幕
15 setting_气泡文字自动结束 气泡文字自动结束
16 setting_气泡等待时长 气泡停留
17 setting_全屏 全屏游戏
18 setting_置顶 窗口置顶
19 setting_自动保存 自动保存 Auto Save
20 ui_秒 S
21 setting_返回 返回
22 bag_tab_笔记 线索
88 prop_小蝉人偶_说明 小小的人儿,小小的鞋子,小小的友情啊——像蝶依偎着花
89 prop_粘鼠板 粘鼠板 [#texture=c02/粘鼠板特写.png]
90 prop_粘鼠板_说明 自制的捕鼠工具,纸上面有黏黏的浆糊
91 prop_小猫纸条 小猫纸条 [#texture=c02/小猫纸条.png]
92 prop_小猫纸条_说明 「大哥,今晚老地方见 /井\」
93 prop_一把香 一把香 [#texture=c02/一把香.png]
94 prop_2014钥匙 2014钥匙 [#texture=c02/1012钥匙物品.png]
95 prop_重要物品示例 重要物品示例 [#texture=c01/银元.png]
102 c01_s07_需要报纸 书店还没开门。
103 c01_s08_书店工作 老板交代的工作还没做完,不能偷懒。
104 c01_s08_书店工钱 这个月的工钱还没拿。
105 c02_杂物堆堵住 mem_偷听对话 杂物堵住了 偷听对话
106 notes_纸条 mem_疯子看井 纸条 疯子看井
notes_锁住了 锁住了
notes_打不开 打不开
notes_无法通过 无法通过
notes_有什么东西 有什么东西
notes_无法触碰 无法触碰
notes_挂画 挂画
notes_相框 相框
notes_寻人启事 寻人启事
107 c01_鸡毛掸子 这是鸡毛掸子吗?
108 c01_院长书桌 桌上放着一本《圣经》。<br>「得著生命的,將要失喪生命...」
109 c01_院长床 这本书已经看过了。<br>...那些句子是什么意思呢?
176 c02_火灾等待准备 还没准备好点火呢
177 c02_霸凌救小蝉开始 啊!我得想办法帮帮她...
178 c02_点火前阻止右移 没时间浪费了!想想办法救出小蝉...
g_偷听对话 偷听对话
g_疯子看井 疯子看井

View File

@ -108,6 +108,8 @@
小小的人儿,小小的鞋子,小小的友情啊——像蝶依偎着花 [ID:prop_小蝉人偶_说明]
粘鼠板 [#texture=c02/粘鼠板特写.png] [ID:prop_粘鼠板]
自制的捕鼠工具,纸上面有黏黏的浆糊[ID:prop_粘鼠板_说明]
小猫纸条 [#texture=c02/小猫纸条.png] [ID:prop_小猫纸条]
「大哥,今晚老地方见 /井\」[ID:prop_小猫纸条_说明]
# 未使用
一把香 [#texture=c02/一把香.png] [ID:prop_一把香]
@ -134,24 +136,20 @@
~ HoldingReason
# c01
好像忘记了什么事情,再回去检查一遍吧。 [ID:c01_s05_检查院长房间]
书店还没开门。 [ID:c01_s07_需要报纸]
老板交代的工作还没做完,不能偷懒。 [ID:c01_s08_书店工作]
这个月的工钱还没拿。 [ID:c01_s08_书店工钱]
杂物堵住了 [ID:c02_杂物堆堵住]
# c02
=> END
~ Notes
# 通用
纸条 [ID:notes_纸条]
锁住了 [ID:notes_锁住了]
打不开 [ID:notes_打不开]
无法通过 [ID:notes_无法通过]
有什么东西 [ID:notes_有什么东西]
无法触碰 [ID:notes_无法触碰]
挂画 [ID:notes_挂画]
相框 [ID:notes_相框]
寻人启事 [ID:notes_寻人启事]
~ Memory
偷听对话[ID:mem_偷听对话]
疯子看井[ID:mem_疯子看井]
=> END
~ Notes_c01
# c01-s05 院长房间
这是鸡毛掸子吗? [ID:c01_鸡毛掸子]
桌上放着一本《圣经》。<br>「得著生命的,將要失喪生命...」 [ID:c01_院长书桌]
@ -172,6 +170,9 @@
# c01-s08 书店
这些书都被老鼠啃坏了,连木头架子都没放过。 [ID:c01_s08_书架游戏完成]
工钱还在老地方。 [ID:c01_s08_获得袁大头后]
=> END
~ Notes_c02
# c02
剪辫悬梁上侦探奇闻 [ID:c02_海报_剪辫子侦探]
朱连魁全班戏法——「各有幻女...演技新奇」 [ID:c02_海报_戏法班]
@ -190,7 +191,7 @@
看着唬人,这尺寸只是给孩子们戴着玩的 [ID:c02_s02_大头娃娃头套]
自制的八音盒,这么用心的小玩意,怎么会被人扔在这里呢? [ID:c02_s02_八音盒]
别出心裁的小机关,缺了点东西,暂时还不能用 [ID:c02_s02_八音盒缺人偶]
# c02 院子
#院子
这地方有些不对劲,最好先找个人问问 [ID:c02_院子_保卫科旁]
血迹看上去干了很久,血脚印有大有小,咦,还有个特别小的... [ID:c02_s03_干掉的血迹]
算命的摊位? [ID:c02_院子_算命摊位]
@ -199,17 +200,17 @@
被铁链锁住了 [ID:c02_s03_铁门]
三快三慢?是和那个肉铺老板交流的暗号吗? [ID:c02_偷听李癞对话后]
这里之前放着的东西好像被人挪走了? [ID:c02_柜子可放置区域]
# c02 保卫科
#保卫科
登记簿?<br>刚才那个小孩在上面写了些什么 [ID:c02_保卫科花名册os]
3012上面有我的名字看来确实是这里... <br>先去三楼看看吧[ID:c02_保卫科花名册首次互动结束]
祭台是专门供奉这只大老鼠的? [ID:c02_保卫科祭台os]
鼠歌 <br><br>天地小如喉,<br>红轮自吞吐。<br>多少世间人,<br>都被红轮误。 [ID:c02_保卫科老鼠精]
# c02 小手
#小手
...还有什么东西能跟它交换呢? [ID:c02_小手还能换什么]
[ID:c02_小手出现摔倒]
这是什么鬼东西,它是在讨要什么 [ID:c02_小手是什么鬼]
又来一个! [ID:c02_小手再次出现]
# c02 内侧楼道
#内侧楼道
被挡住了 [ID:c02_一楼楼道被挡住]
盖着布的木头架子...用来做什么的呢 [ID:c02_一楼戏台]
桶是空的,飘着一股血气,又酸又腥。 [ID:c02_描述垃圾通道]
@ -217,14 +218,14 @@
这里原来放着什么? [ID:c02_一楼粘鼠板]
老鼠被粘住死掉了。 [ID:c02_一楼死老鼠]
怎么回事...头...好痛 [ID:c02_获得木头人偶]
# c02 空房间
#空房间
我的头,又开始痛了 [ID:c02_获得小猫玩具]
吕萍阿姨,我不想死,求你...帮帮我 [ID:c02_小蝉头套文字]
# c02 敲门_老鼠叼肉
[ID:c02_互动小蝉头套]
#敲门_老鼠叼肉
楼道有东西掉下来了? [ID:c02_敲门_肉掉落]
刚刚这里有块肉不见了? [ID:c02_敲门_老鼠叼肉]
# c02 二楼
#二楼
另一只小鞋子。 [ID:c02_锡箔换小鞋子]
去三楼的路被堵住了,要不先看看别的地方吧。 [ID:c02_二楼楼梯杂物堆]
盆里的水很清澈,看上去像是刚盛的。 [ID:c02_二楼水盆]
@ -232,19 +233,31 @@
又是这种小小尖尖的血脚印... [ID:c02_二楼血脚印]
那女孩为什么要我引开这个疯男人?[ID:c02_老鼠叼鞋引开疯子]
我要去找洞里的小手把弹珠拿回来。 [ID:c02_小手换回弹珠]
# c02 瞎子卧室
#瞎子卧室
刚才那些...到底是怎么回事? [ID:c02_离开红色演出]
「乾三连,坤六断;震仰盂,艮覆碗;离中虚,坎中满;兑上缺,巽下断」<br>咦,这口诀是谁教我的来着... [ID:c02_瞎子卧室_八卦图]
院长房间里也有一个类似的十字架。[ID:c02_瞎子卧室_十字架]
我会在盒子里一直陪着你 :3 [ID:c02_小蝉盒子特写]
我恨他们![ID:c02_小蝉恨他们]
# c02 火灾
#火灾
还没准备好点火呢 [ID:c02_火灾等待准备]
啊!我得想办法帮帮她... [ID:c02_霸凌救小蝉开始]
没时间浪费了!想想办法救出小蝉... [ID:c02_点火前阻止右移]
=> END
~ Memory
偷听对话[ID:g_偷听对话]
疯子看井[ID:g_疯子看井]
~ Notes_c03
# s01
# s02
# s03
# s04
# s05
=> END
~ Notes_c04
=> END
~ Notes_c05
=> END
~ Notes_c06
=> END

View File

@ -1,31 +1,51 @@
@tool
extends Node2D
class_name Event2D
# 前置依赖事件,为空时意味着无前置事件
@export var pre_event: String
# 当前事件
@export var event: String
@export var event: StringName
@export var hide_if_on_stage: Array[int] = []
# 前置依赖事件,为空时意味着无前置事件
@export var pre_event: StringName
@export var hide_if_pre_on_stage: Array[int] = []
@export_tool_button("创建脚本") var create_script := _create_script
var prev_stage := 0
var stage := 0
func _ready() -> void:
if Engine.is_editor_hint():
return
if event == &"":
printerr("[Event2D] event is not set. continue processing...")
stage = EventManager.get_stage(event)
if pre_event:
prev_stage = EventManager.get_stage(pre_event)
refresh_visibility()
SceneManager.ground_ready.connect(_on_ground_ready)
EventManager.stage_updated.connect(_on_global_stage_updated)
func refresh_visibility() -> void:
var should_show = not stage in hide_if_on_stage and not prev_stage in hide_if_pre_on_stage
if visible != should_show:
visible = should_show
func _on_global_stage_updated(e: StringName, s: int):
var updated = false
var pre_updated = false
if e == pre_event:
pre_updated = prev_stage != s
prev_stage = s
print("[Event2D] Pre-event stage updated: %s, stage: %s" % [pre_event, prev_stage])
_on_pre_stage_updated()
elif e == event:
updated = stage != s
stage = s
print("[Event2D] Event stage updated: %s, stage: %s" % [event, stage])
refresh_visibility()
if pre_updated:
_on_pre_stage_updated()
if updated:
_on_stage_updated()
@ -39,3 +59,31 @@ func _on_pre_stage_updated():
func _on_stage_updated():
pass
###### TOOL BUTTON
var script_template = preload("uid://bmxsei74o3pyw") as Script
func _create_script():
var script = script_template.duplicate(true) as Script
var ground = get_node("..")
while ground and not ground is Ground2D:
ground = ground.get_node("..")
if not ground:
printerr("[Event2D] _create_script Ground2D not found.")
return
var chapter = ground.scene_name.substr(0, 3)
if len(chapter) != 3:
printerr("[Event2D] _create_script chapter name error: %s" % ground.scene_name)
return
var file_name = name.to_snake_case() + ".gd"
var path = "res://scene/ground/script/" + chapter + "/" + file_name
if FileAccess.file_exists(path):
print("file exists, reattach the script to node: %s" % path)
set_script(load(path))
return
ResourceSaver.save(script, path)
set_script(load(path))
print("[Event2D] Script created: %s" % path)

View File

@ -222,7 +222,7 @@ panel={
[internationalization]
locale/translations=PackedStringArray("res://asset/dialogue/c01.zh_CN.translation", "res://asset/dialogue/c02.zh_CN.translation", "res://asset/dialogue/inspect_content.zh_CN.translation", "res://asset/dialogue/item_description.zh_CN.translation", "res://asset/dialogue/names.zh_CN.translation", "res://asset/dialogue/npc.zh_CN.translation", "res://asset/dialogue/c01.zh_SH.translation", "res://asset/dialogue/纯中文_无需本地化.zh_CN.translation", "res://asset/dialogue/c01.en.translation", "res://asset/dialogue/c03.zh_CN.translation", "res://asset/dialogue/c04.zh_CN.translation", "res://asset/dialogue/c05.zh_CN.translation", "res://asset/dialogue/c06.zh_CN.translation", "res://asset/dialogue/item_description.en.translation", "res://asset/dialogue/item_description.zh_SH.translation", "res://asset/dialogue/c02.zh_SH.translation", "res://asset/dialogue/npc.zh_SH.translation")
locale/translations_pot_files=PackedStringArray("res://asset/dialogue/item_description.dialogue", "res://asset/dialogue/c01.dialogue", "res://asset/dialogue/c02.dialogue", "res://asset/dialogue/inspect_content.dialogue", "res://asset/dialogue/npc.dialogue", "res://asset/dialogue/c03.dialogue", "res://asset/dialogue/c04.dialogue", "res://asset/dialogue/c05.dialogue", "res://asset/dialogue/c06.dialogue", "res://asset/dialogue/纯中文_无需本地化.dialogue")
locale/translations_pot_files=PackedStringArray("res://asset/dialogue/item_description.dialogue", "res://asset/dialogue/c01.dialogue", "res://asset/dialogue/c02.dialogue", "res://asset/dialogue/inspect_content.dialogue", "res://asset/dialogue/npc.dialogue", "res://asset/dialogue/c03.dialogue", "res://asset/dialogue/c04.dialogue", "res://asset/dialogue/c05.dialogue", "res://asset/dialogue/c06.dialogue", "res://asset/dialogue/纯中文_无需本地化.dialogue", "res://asset/dialogue/event_stage.dialogue")
locale/test="zh-Hans"
locale/fallback="zh"

View File

@ -12,6 +12,8 @@ shader_parameter/samples = 4
shader_parameter/angle_spread = 2.0
[node name="DizzyShader" type="CanvasLayer"]
layer = 0
visible = false
script = ExtResource("1_t0l4c")
[node name="TextureRect" type="TextureRect" parent="."]

View File

@ -101,23 +101,26 @@ func _ready() -> void:
ground_archive = ArchiveManager.archive.ground_archive()
played = ground_archive.get_value(name, "played", false)
played_time = 0.0
_check_sign_status()
if on_first_enter_tree:
_do_trigger.call_deferred()
if played:
if GlobalConfig.DEBUG:
print("Ambush has played, name=", name, " one_shot=", one_shot)
if interacted_sign_texture:
sign_mark.sprite2d.texture = interacted_sign_texture
if one_shot:
return
sign_mark.interacted.connect(_interacted)
area2d.body_entered.connect(_entered)
area2d.area_entered.connect(_area_entered)
if on_first_enter_tree:
_do_trigger.call_deferred()
visibility_changed.connect(_visibility_changed)
_check_sign_status()
func _visibility_changed():
_check_sign_status()
func _check_sign_status():
sign_mark.enabled = enabled and (not played or not one_shot)
sign_mark.enabled = visible and enabled and (not played or not one_shot)
sign_mark.display_sign = trigger_mode == "interact"

View File

@ -6,6 +6,7 @@ signal interacted
signal interacted_with_key(key)
# 交互 prop 不匹配
signal interact_mismatch_failed
signal canceled
signal sign_mark_offset_updated
@ -71,15 +72,15 @@ func _ready() -> void:
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)
area2d.body_entered.connect(_on_entered)
area2d.body_exited.connect(_on_exited)
sign_snapper.action_on_arrived = action_key
if enable_snapper:
sign_snapper.arrived.connect(_pre_interacted)
else:
sign_snapper.enabled = false
sign_mark.interacted.connect(_pre_interacted)
sign_mark.cancel.connect(_on_cancel)
sign_mark.cancel.connect(canceled.emit)
# setup default value
ground_archive = ArchiveManager.archive.ground_archive()
icount = ground_archive.get_value(name, "icount", 0)
@ -87,13 +88,20 @@ func _ready() -> void:
if interacted_times and interacted_texture:
texture = interacted_texture
_check_sign_status()
visibility_changed.connect(_visibility_changed)
func _visibility_changed():
_check_sign_status()
func _check_sign_status():
sign_mark.enabled = enabled and (not one_shot or interacted_times < one_shot_max_times)
sign_mark.enabled = (
visible and enabled and (not one_shot or interacted_times < one_shot_max_times)
)
func _reset(_body = null) -> void:
func _on_entered(_body = null) -> void:
_reset_sign_testure_to_prop()
var prop_hud = SceneManager.get_prop_hud() as PropHud
if not prop_hud.current_item_changed.is_connected(_set_sign_texture_to_prop):
@ -118,7 +126,8 @@ func _set_sign_texture_to_prop(_key):
# else:
# sign_mark.sprite2d.texture = unmatched_sign_texture
func _on_cancel(_body = null) -> void:
func _on_exited(_body = null) -> void:
# disconnect signal
var prop_hud = SceneManager.get_prop_hud() as PropHud
if prop_hud and prop_hud.current_item_changed.is_connected(_set_sign_texture_to_prop):
@ -142,13 +151,14 @@ func is_key_matched(key) -> bool:
func _pre_interacted() -> void:
SceneManager.player_action(action_key)
SceneManager.lock_player(0, action_key)
if icount == 0 and first_interact_os_key:
sign_mark.display_sign = false
SceneManager.pop_os_with_str(first_interact_os_key)
await SceneManager.get_player().os_finished
sign_mark.display_sign = true
_on_interacted()
SceneManager.unlock_player()
func _on_interacted() -> void:

View File

@ -13,7 +13,7 @@ signal sign_mark_offset_updated
set(val):
enabled = val
if is_node_ready():
sign_mark.enabled = val
sign_mark.enabled = enabled and visible
@export var collision_width_and_x := Vector2(20.0, 0):
set(val):
collision_width_and_x = val
@ -44,7 +44,7 @@ signal sign_mark_offset_updated
if is_node_ready() and Engine.is_editor_hint():
notify_property_list_changed()
var note_key := ""
@export_enum("none", "notes", "c01", "c02", "c03", "c04", "c05") var title_filter := "none":
@export_enum("c01", "c02", "c03", "c04", "c05", "c06") var title_filter := "c01":
set(val):
title_filter = val
if is_node_ready() and Engine.is_editor_hint():
@ -63,7 +63,6 @@ var dialogue_c05 = preload("res://asset/dialogue/c05.dialogue")
var dialogue_c06 = preload("res://asset/dialogue/c06.dialogue")
var dialogue_res = dialogue_items
var interacting = false
var mutex = Mutex.new()
var ground_archive: GroundArchive
@ -83,20 +82,18 @@ func _ready() -> void:
if Engine.is_editor_hint():
notify_property_list_changed()
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()
icount = ground_archive.get_value(name, "icount", 0)
visibility_changed.connect(_visibility_changed)
func _visibility_changed():
sign_mark.enabled = enabled and visible
func _on_interacted() -> void:
if interacting:
return
if not note_key:
printerr("Note key is not set")
return
@ -119,14 +116,8 @@ func _on_interacted() -> void:
func _show_os():
interacting = true
create_tween().tween_property(sign_mark, "modulate:a", 0.0, 0.3)
SceneManager.pop_os_with_str(note_key)
SceneManager.player_action(action)
await SceneManager.get_player().os_finished
var tween = create_tween()
tween.tween_property(sign_mark, "modulate:a", 1.0, 0.3)
interacting = false
func _show_balloon(res, title):
@ -135,13 +126,11 @@ func _show_balloon(res, title):
# note viewing animation
if GlobalConfig.DEBUG:
print("[" + name + "] call lock")
SceneManager.freeze_player(0, action)
interacting = true
SceneManager.lock_player(0, action)
await DialogueManager.dialogue_ended
if GlobalConfig.DEBUG:
print("[" + name + "] call lock")
SceneManager.release_player()
interacting = false
SceneManager.unlock_player()
func _set(property: StringName, value: Variant) -> bool:
@ -165,7 +154,8 @@ func _get_property_list() -> Array[Dictionary]:
if Engine.is_editor_hint():
var title_arr = []
if dialogue == "items":
var id = dialogue_items.titles["Notes"]
var title = "Notes_" + title_filter
var id = dialogue_items.titles[title]
var current_line = dialogue_items.lines[id]
while current_line:
if current_line.has("translation_key"):
@ -175,11 +165,7 @@ func _get_property_list() -> Array[Dictionary]:
current_line = dialogue_items.lines[current_line.next_id]
else:
title_arr = dialogue_res.get_ordered_titles()
if title_filter and title_filter != "none":
var filted_titles = title_arr.filter(_filter_property)
titles = ",".join(filted_titles)
else:
titles = ",".join(title_arr)
titles = ",".join(title_arr)
return [
{
"name": "note_key",
@ -188,15 +174,3 @@ func _get_property_list() -> Array[Dictionary]:
"hint_string": titles
}
]
func _filter_property(property: StringName) -> bool:
return property.find(title_filter) >= 0
func _on_cancel(_body = null):
interacting = false
func _reset(_body):
interacting = false

View File

@ -73,7 +73,11 @@ func _ready() -> void:
if GlobalConfig.DEBUG:
print("Prop has picked, name=", name, " key=", prop_key)
sign_snapper.arrived.connect(_interacted)
sign_mark.enabled = enabled
_check_display()
visibility_changed.connect(_visibility_changed)
func _visibility_changed():
_check_display()
@ -82,7 +86,7 @@ func _check_display():
visible = false
elif visible_follow_enabled:
visible = enabled
sign_mark.enabled = enabled
sign_mark.enabled = enabled and visible
func _get_animation_player() -> AnimationPlayer:

View File

@ -81,6 +81,7 @@ var icount: int:
icount = val
ground_archive.set_pair(name, "icount", val)
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
name = "portal_" + portal_name
@ -101,6 +102,11 @@ func _ready() -> void:
area2d.body_exited.connect(_on_cancel)
sign_snapper.arrived.connect(_on_interacted)
sign_mark.cancel.connect(_on_cancel)
visibility_changed.connect(_visibility_changed)
func _visibility_changed():
_check_sign_mark_and_texture()
func _reload_items() -> void:
@ -118,7 +124,7 @@ 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

View File

@ -13,6 +13,7 @@ var dialogue_c06 := preload("res://asset/dialogue/c06.dialogue") as DialogueReso
# 首次进入场景时触发
"oneshot_animation_played": false
}
@export_tool_button("reset 存档") var reset_archive = _reset_archive
# event 也混合其中
@export var debug_global_data: Dictionary[String, Variant] = {
"enabled_items": ["prop_火柴", "prop_院长的信", "prop_银元"],
@ -21,7 +22,6 @@ var dialogue_c06 := preload("res://asset/dialogue/c06.dialogue") as DialogueReso
@export var debug_ground_data: Dictionary[String, Variant] = {}
@export var auto_reset_on_debug_restarting := false
@export_tool_button("reset 存档") var reset_archive = _reset_archive
var oneshot_animation := ""
var ground_archive: GroundArchive
@ -65,95 +65,6 @@ func _ready() -> void:
ready.connect(_on_ready)
func _reset_archive() -> void:
var archive = (
ResourceLoader.load("user://data/archives/save000.tres", "AssembledArchive")
as AssembledArchive
)
archive.player_global_position_x = debug_global_data.get_or_add("player_x", 30.0)
# 重置全局变量
var prop_arr = archive.prop_inventory.default_enabled_items
if get_node("../MainPlayer").character.begins_with("吕萍"):
prop_arr = archive.prop_inventory.xdie_enabled_items
elif get_node("../MainPlayer").character.begins_with("小小蝶"):
prop_arr = archive.prop_inventory.xxdie_enabled_items
elif get_node("../MainPlayer").character.begins_with("小小小蝶"):
prop_arr = archive.prop_inventory.xxxdie_enabled_items
for prop in debug_global_data["enabled_items"]:
if not prop_arr.has(prop):
prop_arr.append(prop)
# 从 code 中找到 set_global_entry/get_global_value 方法中第一个 property
var code = get_script().source_code
# set_global_entry(property: StringName, value)
# get_global_value(property: StringName, default = null)
var setter_regx = RegEx.create_from_string(r'set_global_entry\(.?"(.+)"') as RegEx
var getter_regx = RegEx.create_from_string(r'get_global_value\(.?"(.+)"') as RegEx
var properties = {}
for setter_match in setter_regx.search_all(code):
properties[(setter_match as RegExMatch).get_string(1)] = true
for getter_match in getter_regx.search_all(code):
properties[(getter_match as RegExMatch).get_string(1)] = true
for p in properties.keys():
if debug_global_data.get(p) == null:
debug_global_data[p] = 0
# archive.set_global_entry(p, new_data[p])
archive.global_data_dict[p] = debug_global_data[p]
# 重置 ground_archive
if not archive.ground_archives.has(ground.scene_name):
archive.ground_archives[ground.scene_name] = GroundArchive.new()
archive.ground_archives[ground.scene_name].scene_name = ground.scene_name
# setup
_setup_ground_data(debug_ground_data, ground)
archive.ground_archives[ground.scene_name].data = debug_ground_data
# 重置 event 状态
# EventManager.set_stage(&"c02_burning_end", 2)
# EventManager.set_stage_if_greater("handnote_stage", 5)
var event_setter_regx = RegEx.create_from_string(r'EventManager.set_stage\(.?"(.+)"') as RegEx
var event_getter_regx = RegEx.create_from_string(r'EventManager.get_stage\(.?"(.+)"') as RegEx
var event_set_greater_regx = (
RegEx.create_from_string(r'set_stage_if_greater\(.?"(.+)"') as RegEx
)
var events = {}
for event_match in event_setter_regx.search_all(code):
events[(event_match as RegExMatch).get_string(1)] = true
for event_match in event_set_greater_regx.search_all(code):
events[(event_match as RegExMatch).get_string(1)] = true
for event_match in event_getter_regx.search_all(code):
events[(event_match as RegExMatch).get_string(1)] = true
# 遍历 ".." 下所有节点,找到属于 Event2D 的节点
_find_event2d(events, ground)
for e in events.keys():
if debug_global_data.get(e) == null:
debug_global_data[e] = 0
archive.event_stage[e] = debug_global_data[e]
print("reset archive data success")
ResourceSaver.save(archive)
notify_property_list_changed()
func _setup_ground_data(g_data: Dictionary[String, Variant], node: Node):
if not node:
return
for child in node.get_children():
if child is Ambush2D and not g_data.has(child.name):
g_data[child.name] = {"played": false}
elif child is Interactable2D and not g_data.has(child.name):
g_data[child.name] = {"interacted_times": 0}
elif child is Pickable2D and not g_data.has(child.name):
g_data[child.name] = {"picked": false}
elif child is AnimationRoot and not g_data.has(child.name):
g_data[child.name] = child.data
_setup_ground_data(g_data, child)
func _find_event2d(events: Dictionary, node: Node) -> void:
if not node:
return
for child in node.get_children():
if child is Event2D:
events[child.event] = true
_find_event2d(events, child)
func _on_ground_ready() -> void:
pass
@ -219,3 +130,98 @@ func _get_property_list() -> Array[Dictionary]:
"hint_string": ",".join(get_animation_list()),
}
]
###### TOOL BUTTON
func _reset_archive() -> void:
var archive = (
ResourceLoader.load("user://data/archives/save000.tres", "AssembledArchive")
as AssembledArchive
)
archive.player_global_position_x = debug_global_data.get_or_add("player_x", 30.0)
# 重置全局变量
var prop_arr = archive.prop_inventory.default_enabled_items
if get_node("../MainPlayer").character.begins_with("吕萍"):
prop_arr = archive.prop_inventory.xdie_enabled_items
elif get_node("../MainPlayer").character.begins_with("小小蝶"):
prop_arr = archive.prop_inventory.xxdie_enabled_items
elif get_node("../MainPlayer").character.begins_with("小小小蝶"):
prop_arr = archive.prop_inventory.xxxdie_enabled_items
for prop in debug_global_data["enabled_items"]:
if not prop_arr.has(prop):
prop_arr.append(prop)
# 从 code 中找到 set_global_entry/get_global_value 方法中第一个 property
var code = get_script().source_code
# set_global_entry(property: StringName, value)
# get_global_value(property: StringName, default = null)
var setter_regx = RegEx.create_from_string(r'set_global_entry\(.?"(.+)"') as RegEx
var getter_regx = RegEx.create_from_string(r'get_global_value\(.?"(.+)"') as RegEx
var properties = {}
for setter_match in setter_regx.search_all(code):
properties[(setter_match as RegExMatch).get_string(1)] = true
for getter_match in getter_regx.search_all(code):
properties[(getter_match as RegExMatch).get_string(1)] = true
for p in properties.keys():
if debug_global_data.get(p) == null:
debug_global_data[p] = false
# archive.set_global_entry(p, new_data[p])
archive.global_data_dict[p] = debug_global_data[p]
# 重置 ground_archive
if not archive.ground_archives.has(ground.scene_name):
archive.ground_archives[ground.scene_name] = GroundArchive.new()
archive.ground_archives[ground.scene_name].scene_name = ground.scene_name
# setup
_setup_ground_data(debug_ground_data, ground)
archive.ground_archives[ground.scene_name].data = debug_ground_data
# 重置 event 状态
# EventManager.set_stage(&"c02_burning_end_stage", 2)
# EventManager.set_stage_if_greater("handnote_stage", 5)
var event_setter_regx = RegEx.create_from_string(r'EventManager.set_stage\(.?"(.+)"') as RegEx
var event_getter_regx = RegEx.create_from_string(r'EventManager.get_stage\(.?"(.+)"') as RegEx
var event_set_greater_regx = (
RegEx.create_from_string(r'set_stage_if_greater\(.?"(.+)"') as RegEx
)
var events = {}
for event_match in event_setter_regx.search_all(code):
events[(event_match as RegExMatch).get_string(1)] = true
for event_match in event_set_greater_regx.search_all(code):
events[(event_match as RegExMatch).get_string(1)] = true
for event_match in event_getter_regx.search_all(code):
events[(event_match as RegExMatch).get_string(1)] = true
# 遍历 ".." 下所有节点,找到属于 Event2D 的节点
_find_event2d(events, ground)
for e in events.keys():
if debug_global_data.get(e) == null:
debug_global_data[e] = 0
archive.event_stage[e] = debug_global_data[e]
print("reset archive data success")
ResourceSaver.save(archive)
notify_property_list_changed()
func _setup_ground_data(g_data: Dictionary[String, Variant], node: Node):
if not node:
return
for child in node.get_children():
if child is Ambush2D and not g_data.has(child.name):
g_data[child.name] = {"played": false}
elif child is Interactable2D and not g_data.has(child.name):
g_data[child.name] = {"interacted_times": 0}
elif child is Pickable2D and not g_data.has(child.name):
g_data[child.name] = {"picked": false}
elif child is AnimationRoot and not g_data.has(child.name):
g_data[child.name] = child.data
_setup_ground_data(g_data, child)
func _find_event2d(events: Dictionary, node: Node) -> void:
if not node:
return
for child in node.get_children():
if child is Event2D:
if child.event != &"":
events[child.event] = true
if child.pre_event != &"":
events[child.pre_event] = true
_find_event2d(events, child)

View File

@ -6,6 +6,11 @@ var paper_man: Ambush2D
var music_box: Closeup2D
var flyer
# 用于 reset 存档
# ArchiveManager.get_global_value(&"c02_musicbox_pic_taken")
# ArchiveManager.get_global_value(&"c02_musicbox_danzhu_taken")
# ArchiveManager.get_global_value(&"c02_musicbox_xiaomao_taken")
# ArchiveManager.get_global_value(&"c02_musicbox_xiaochan_taken")
# 覆盖该方法
func _default_data() -> Dictionary:
@ -28,7 +33,8 @@ func _on_ground_ready() -> void:
else:
_oneshot_wind.call_deferred()
paper_man = $"../DeployLayer/Ambush纸人"
if 5 <= ArchiveManager.get_global_value(&"c02_musicbox_stage", 0):
# 0:关闭 1:打开 2:放入小蝉人偶 3:全部放置正确_可摇手柄 4:已播放完成
if 4 <= EventManager.get_stage(&"c02_musicbox_stage"):
_display_paper_man(false)
else:
paper_man.get_node("wall/CollisionShape2D").disabled = true
@ -102,7 +108,7 @@ func _on_blink_finished(blink_sprite):
func _on_music_box_exited(_arg):
if 5 <= ArchiveManager.get_global_value(&"c02_musicbox_stage"):
if 4 <= EventManager.get_stage(&"c02_musicbox_stage"):
_display_paper_man(false)
# _display_paper_man(true)

View File

@ -63,7 +63,52 @@ data = {
"oneshot_animation_played": false
}
debug_global_data = Dictionary[String, Variant]({
"enabled_items": ["prop_火柴", "prop_院长的信", "prop_银元"]
"c02_musicbox_danzhu_taken": false,
"c02_musicbox_pic_taken": false,
"c02_musicbox_stage": 0,
"c02_musicbox_xiaochan_taken": false,
"c02_musicbox_xiaomao_taken": false,
"c02_s02_mouse_push_shoe": false,
"enabled_items": ["prop_火柴", "prop_木头人偶", "prop_银元"],
"player_x": 530.0
})
debug_ground_data = Dictionary[String, Variant]({
"Ambush太暗了": {
"played": false
},
"Ambush小蝉闪现": {
"played": false
},
"Ambush推小鞋子": {
"played": false
},
"Ambush杂物堆": {
"played": false
},
"Ambush纸人": {
"played": false
},
"AnimationPlayer": {
"display_paper_man": false,
"first_enter": false,
"flyer_shaven": false,
"oneshot_animation_played": false
},
"Closeup八音盒": {
"interacted_times": 0
},
"Closeup刮海报": {
"interacted_times": 0
},
"InteractableLeftPortal": {
"interacted_times": 0
},
"Interactable小鞋子": {
"interacted_times": 0
},
"煤油灯": {
"interacted_times": 0
}
})
oneshot_animation = ""

View File

@ -48,7 +48,7 @@ func _on_ground_ready() -> void:
if not ArchiveManager.get_global_value(&"c02_burning"):
# 点燃前
counter.enabled = true
elif EventManager.get_stage(&"c02_burning_end") == 2:
elif EventManager.get_stage(&"c02_burning_end_stage") == 2:
# 离开后
counter.visible = false
@ -56,7 +56,7 @@ func _on_ground_ready() -> void:
# 点燃后~离开前
if (
ArchiveManager.get_global_value(&"c02_burning")
and not EventManager.get_stage(&"c02_burning_end") == 2
and not EventManager.get_stage(&"c02_burning_end_stage") == 2
):
new_bg.modulate.a = 1.0
# 火灾开始后,无需 enable
@ -68,7 +68,7 @@ func _on_ground_ready() -> void:
madman_npc.visible = false
# c02_madman_hitwall 之后, c02_ball_game_stage==3游戏结束 之前;同时 eavesdrop_finished
if (
ArchiveManager.get_global_value(&"c02_ball_game_stage", 0) < 3
EventManager.get_stage(&"c02_ball_game_stage") < 3
# and ArchiveManager.get_global_value(&"c02_eavesdrop_finished")
):
if not ArchiveManager.get_global_value("c02_watched_the_well"):
@ -111,7 +111,7 @@ func _on_ground_ready() -> void:
bully_layer = $"../DeployLayer/霸凌"
burning_layer = $"../DeployLayer/火灾"
if ArchiveManager.get_global_value(&"c02_ball_game_stage", 0) >= 3:
if EventManager.get_stage(&"c02_ball_game_stage") >= 3:
_setup_bully_or_burning(true)
@ -194,7 +194,7 @@ func _setup_bully_or_burning(reenter_scene := false):
# 弹珠游戏结束后就开始霸凌,此时禁止偷听。第一章结束后(火灾结束),第二章再偷听
$"../DeployLayer/Ambush偷听对话".enabled = false
eavesdrop_window.visible = false
if EventManager.get_stage(&"c02_burning_end") == 2:
if EventManager.get_stage(&"c02_burning_end_stage") == 2:
# 火灾演出完全结束
burning_layer.visible = false
bully_layer.visible = false
@ -328,6 +328,6 @@ func run_away():
tween.tween_property(node, "global_position:x", 20.0, 18.0)
await tween.finished
# 1: 牵手跑结束; 2: 谢幕演出结束
EventManager.set_stage(&"c02_burning_end", 1)
EventManager.set_stage(&"c02_burning_end_stage", 1)
camera.force_offset.x = 0.0
SceneManager.get_ground_loader().transition_to_scene("c02_s06", "right")

View File

@ -288,11 +288,11 @@ data = {
debug_global_data = Dictionary[String, Variant]({
"c02_ball_game_stage": 1,
"c02_burning": false,
"c02_burning_end": 0,
"c02_burning_end_stage": 0,
"c02_counter_pushed_out": false,
"c02_eavesdrop_finished": false,
"c02_madman_hitwall": false,
"c02_madman_interacted": false,
"c02_madman_interacted": 0,
"c02_open_gate_first_failed": false,
"c02_ready_to_fire": false,
"c02_the_blind_room_unlocked": false,
@ -584,7 +584,7 @@ texture = ExtResource("8_plfv5")
[node name="Event2D小蝉哼歌" type="Node2D" parent="Ground/DeployLayer" index="15"]
position = Vector2(800, -173)
script = ExtResource("26_o1qbs")
event = "c02_madman_interacted"
event = &"c02_madman_interacted"
metadata/_custom_type_script = "uid://bkkiyk5jkdw4d"
[node name="Sfx2D小蝉哼歌" type="AudioStreamPlayer2D" parent="Ground/DeployLayer/Event2D小蝉哼歌"]

View File

@ -331,6 +331,7 @@ autoplay = "default"
position = Vector2(627.8, 66.8)
color = Color(0.999971, 0.912551, 0.842208, 1)
energy = 1.2
blend_mode = 2
texture = ExtResource("22_laquj")
texture_scale = 0.3
@ -351,7 +352,7 @@ flip_h = true
[node name="Event2D小蝉哼歌" type="Node2D" parent="Ground/DeployLayer" index="18"]
position = Vector2(92, 38)
script = ExtResource("23_4c54f")
event = "c02_madman_interacted"
event = &"c02_madman_interacted"
metadata/_custom_type_script = "uid://bkkiyk5jkdw4d"
[node name="Sfx2D小蝉哼歌" type="AudioStreamPlayer2D" parent="Ground/DeployLayer/Event2D小蝉哼歌"]
@ -366,8 +367,6 @@ loop = true
metadata/_custom_type_script = "uid://wapo47a1oddf"
[node name="DizzyShader" parent="Ground/DeployLayer" index="19" instance=ExtResource("29_74b3r")]
layer = 0
visible = false
[node name="MainPlayer" parent="Ground" index="5"]
position = Vector2(41, 98)

View File

@ -25,7 +25,7 @@ func _on_ground_ready() -> void:
if (
ArchiveManager.get_global_value(&"c02_burning")
# 1: 牵手跑结束; 2: 谢幕演出结束
and EventManager.get_stage(&"c02_burning_end") == 1
and EventManager.get_stage(&"c02_burning_end_stage") == 1
):
# 禁止再回到瞎子卧室
ArchiveManager.set_global_entry(&"c02_the_blind_room_unlocked", false)
@ -57,10 +57,10 @@ func _on_ground_ready() -> void:
$"../DeployLayer/portal_1".status = "opened"
ball_game_boys_ambush = $"../DeployLayer/Ambush三男孩"
# 0:默认 1:寻找弹珠(老虎钳可以换弹珠) 2:给出弹珠 3:游戏结束
# 0:默认 1:寻找弹珠(老虎钳可以换弹珠) 2:给出弹珠 3/4:游戏结束
if (
ArchiveManager.get_global_value(&"c02_the_blind_room_unlocked", false)
and ArchiveManager.get_global_value(&"c02_ball_game_stage", 0) < 3
and EventManager.get_stage(&"c02_ball_game_stage") < 3
):
# 进入瞎子卧室后,可开始弹珠游戏
ball_game_boys_ambush.enabled = true
@ -105,9 +105,9 @@ func _on_mice_hole_interacted():
func boys_ball_game() -> void:
# 0:默认 1:寻找弹珠(老虎钳可以换弹珠) 2:给出弹珠 3:游戏结束
var stage = ArchiveManager.get_global_value(&"c02_ball_game_stage", 0)
var stage = EventManager.get_stage(&"c02_ball_game_stage")
if stage == 0:
ArchiveManager.set_global_entry(&"c02_ball_game_stage", 1)
EventManager.set_stage(&"c02_ball_game_stage", 1)
ArchiveManager.set_global_entry(&"c02_pliers_to_ball", true)
SceneManager.lock_player()
DialogueManager.show_dialogue_balloon(dialogue_c02, "c02_s05_三男孩弹珠游戏1")
@ -175,7 +175,7 @@ func _on_exit_final_show(_arg):
c02_final_layer.queue_free()
SceneManager.release_player()
# 1: 牵手跑结束; 2: 谢幕演出结束
EventManager.set_stage(&"c02_burning_end", 2)
EventManager.set_stage(&"c02_burning_end_stage", 2)
EventManager.set_stage_if_greater("handnote_stage", 5)
# TODO 小蝉上楼后开启第二章
ArchiveManager.archive.set_chapter_if_greater(3)

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=49 format=3 uid="uid://cootarwb44vvh"]
[gd_scene load_steps=51 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_二楼.gd" id="2_4dg6u"]
@ -34,6 +34,8 @@
[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="Script" uid="uid://cny3n681h2588" path="res://scene/ground/script/c02/event_2d叼纸小猫.gd" id="35_h3h1a"]
[ext_resource type="PackedScene" uid="uid://dsa6frlw6e6gg" path="res://scene/entity/pickable.tscn" id="36_3u30v"]
[ext_resource type="Texture2D" uid="uid://ca3km2f6ncrqo" path="res://asset/art/scene/c02/s06_二楼楼道/e_小蝉偷看.png" id="37_osg51"]
[sub_resource type="Animation" id="Animation_k01ve"]
@ -847,16 +849,17 @@ libraries = {
}
script = ExtResource("2_4dg6u")
debug_global_data = Dictionary[String, Variant]({
"c02_ball_game_stage": 1,
"c02_burning": true,
"c02_burning_end": 1,
"c02_ball_game_stage": 2,
"c02_burning": false,
"c02_burning_end_stage": 1,
"c02_madman_hitwall": false,
"c02_mouse_follow_player": false,
"c02_pliers_to_ball": false,
"c02_s02_mouse_push_shoe": false,
"c02_the_blind_room_unlocked": true,
"enabled_items": ["prop_火柴", "prop_院长的信", "prop_银元"],
"handnote_stage": 0
"enabled_items": ["prop_火柴", "prop_院长的信", "prop_弹珠"],
"handnote_stage": 0,
"player_x": 30.0
})
debug_ground_data = Dictionary[String, Variant]({
"Ambush三男孩": {
@ -865,6 +868,9 @@ debug_ground_data = Dictionary[String, Variant]({
"Ambush小蝉偷看": {
"played": true
},
"AnimationPlayer": {
"oneshot_animation_played": false
},
"Closeup弹珠游戏": {
"interacted_times": 0
},
@ -877,6 +883,9 @@ debug_ground_data = Dictionary[String, Variant]({
"Interactable老鼠洞": {
"interacted_times": 0
},
"Pickable小猫纸条": {
"picked": false
},
"煤油灯": {
"interacted_times": 0
},
@ -933,10 +942,9 @@ status = "locked"
[node name="portal_2" parent="Ground/DeployLayer" index="3" instance=ExtResource("4_haidv")]
position = Vector2(222, 14)
debug_note = "瞎子理发店"
enabled = false
portal_name = "2"
target_scene = "c03_s01"
holding = true
holding_reason_key = "c02_杂物堆堵住"
prop_key = "prop_2014钥匙"
[node name="楼道杂物堆" type="Sprite2D" parent="Ground/DeployLayer" index="4"]
@ -969,12 +977,6 @@ position = Vector2(616, -14)
ground_light_texture = ExtResource("8_7x2h6")
ground_height_offset = 15.0
[node name="SfxInvalid" parent="Ground/DeployLayer/煤油灯" index="0"]
process_mode = 0
[node name="SfxSuccess" parent="Ground/DeployLayer/煤油灯" index="1"]
process_mode = 0
[node name="CollisionShape2D" parent="Ground/DeployLayer/煤油灯/Area2D" index="0"]
shape = SubResource("RectangleShape2D_lh55k")
@ -996,12 +998,6 @@ disable_prop_after_interacted = true
prop_key = "prop_小鞋子1"
prop_key2 = "prop_小鞋子2"
[node name="SfxInvalid" parent="Ground/DeployLayer/Interactable老鼠洞" index="0"]
process_mode = 0
[node name="SfxSuccess" parent="Ground/DeployLayer/Interactable老鼠洞" index="1"]
process_mode = 0
[node name="CollisionShape2D" parent="Ground/DeployLayer/Interactable老鼠洞/Area2D" index="0"]
shape = SubResource("RectangleShape2D_7kxvk")
@ -1035,6 +1031,7 @@ action_configs = Array[Dictionary]([{
}])
[node name="疯子撞墙Sfx2D" type="AudioStreamPlayer2D" parent="Ground/DeployLayer/疯子撞墙"]
process_mode = 1
position = Vector2(5, 28)
stream = SubResource("AudioStreamRandomizer_wywax")
volume_db = 10.0
@ -1160,6 +1157,7 @@ move_configs = Array[Dictionary]([{
debug_mov_animation = "方瞎子走路-左"
[node name="Sfx2D脚步声" type="AudioStreamPlayer2D" parent="Ground/DeployLayer/c02_final/瞎子"]
process_mode = 1
position = Vector2(-39, -20)
stream = SubResource("AudioStreamRandomizer_4ndyv")
bus = &"game_sfx"
@ -1187,6 +1185,23 @@ texture = ExtResource("37_osg51")
collision_width_and_x = Vector2(150, 0)
hook_method = "glimpse_hide_out"
[node name="Event2D叼纸小猫" type="Node2D" parent="Ground/DeployLayer" index="19"]
position = Vector2(164, 42)
script = ExtResource("35_h3h1a")
event = &"c02_ball_game_stage"
hide_if_on_stage = Array[int]([0, 1, 2, 4])
metadata/_custom_type_script = "uid://bkkiyk5jkdw4d"
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="Ground/DeployLayer/Event2D叼纸小猫"]
position = Vector2(0, 15)
sprite_frames = ExtResource("10_och2w")
animation = &"叼纸小猫坐着呼吸"
autoplay = "叼纸小猫坐着呼吸"
[node name="Pickable小猫纸条" parent="Ground/DeployLayer/Event2D叼纸小猫" instance=ExtResource("36_3u30v")]
position = Vector2(-3, 2)
prop_key = "prop_小猫纸条"
[node name="MainPlayer" parent="Ground" index="5"]
position = Vector2(63, 95)
catty_light_energy = 0.5

View File

@ -112,16 +112,17 @@ func _on_xiao_chan_interacted() -> void:
wood_puppet.enabled = true
wood_puppet.modulate.a = 0
# 小蝉丢下木头人偶并消失
SceneManager.freeze_player(0)
SceneManager.lock_player()
xiao_chan_sprite.play()
var tween = create_tween()
tween.tween_interval(1.0)
tween.tween_property(wood_puppet, "modulate:a", 1.0, 1.0)
await xiao_chan_sprite.animation_finished
tween = create_tween()
tween.tween_property(xiao_chan_sprite, "modulate:a", 0.0, 1.0)
counter.enabled = true
SceneManager.release_player()
await tween.finished
SceneManager.unlock_player()
xiao_chan_sprite.animation_finished.connect(func():
create_tween().tween_property(xiao_chan_sprite, "modulate:a", 0.0, 1.0)
counter.enabled = true
)
func _on_pick_wood_puppet() -> void:
@ -135,9 +136,13 @@ func _on_leave_room():
SceneManager.pop_debug_dialog_info("美术", "玩家将箱子推出房间")
var pushing_counter = false
var pushing_counter = false:
set(value):
pushing_counter = value
if GlobalConfig.DEBUG:
print("pushing_counter:", pushing_counter)
var counter_pushed_out = false
var walking = false
func _on_counter_interacted():
var player = SceneManager.get_player() as MainPlayer
@ -154,10 +159,12 @@ func _on_counter_interacted():
var x = counter.global_position.x - player_pull_offset_x
# 走到左侧,自动 freeze/release
player.walk_to_x(x).tween_callback(func():
walking = false
player.character = "吕萍推柜子"
player.lock_move_right = true
SceneManager.pop_center_notification(tr("ui_press_q_to_exit"))
)
walking = true
player.position_updated.connect(on_player_moved_counter)
pushing_counter = !pushing_counter
@ -170,9 +177,9 @@ func on_player_moved_counter(global_pos: Vector2):
func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed("cancel") and pushing_counter:
_on_counter_interacted()
if event.is_action_pressed("cancel") and not walking and pushing_counter:
get_viewport().set_input_as_handled()
_on_counter_interacted()
# 柜子移动后,检查是否展示后面的洞
@ -210,6 +217,7 @@ func _on_pick_catty_head() -> void:
await SceneManager.get_inspector().quit_and_hidden
SceneManager.pop_os_with_str("c02_获得小猫玩具")
$"Sfx头痛耳鸣".play()
$"../DizzyShader".dizzy()
SceneManager.player_action(17, true)
await SceneManager.get_player().animation_finished
SceneManager.unlock_player()

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=33 format=3 uid="uid://dny21yhtuteap"]
[gd_scene load_steps=34 format=3 uid="uid://dny21yhtuteap"]
[ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_w7j0m"]
[ext_resource type="Script" uid="uid://dkkey7qillk15" path="res://scene/ground/scene/c02/s10_空房间.gd" id="2_egtqi"]
@ -25,6 +25,7 @@
[ext_resource type="Texture2D" uid="uid://ce3kclg1i81l3" path="res://asset/art/scene/c02/s02_大门过道/e_头套场景中.png" id="17_6uftv"]
[ext_resource type="PackedScene" uid="uid://bffqprfmpt0bx" path="res://scene/ground/script/c02/空房间小蝉头套.tscn" id="18_5t4pt"]
[ext_resource type="PackedScene" uid="uid://dqkxiqbq83cmq" path="res://scene/entity/closeup.tscn" id="18_8cwaw"]
[ext_resource type="PackedScene" uid="uid://decfqoe5v0y6n" path="res://scene/effect/dizzy_shader.tscn" id="26_3kyh4"]
[sub_resource type="AtlasTexture" id="AtlasTexture_chbaa"]
atlas = ExtResource("15_kqj5r")
@ -91,7 +92,8 @@ debug_global_data = Dictionary[String, Variant]({
"c02_counter_pushed_out": false,
"c02_counter_x": -1.0,
"c02_the_blind_room_unlocked": false,
"enabled_items": ["prop_火柴", "prop_无头小猫玩具", "prop_木头人偶"]
"enabled_items": ["prop_火柴", "prop_无头小猫玩具", "prop_木头人偶"],
"player_x": 30.0
})
debug_ground_data = Dictionary[String, Variant]({
"Ambush首次进入血脚印": {
@ -186,6 +188,7 @@ frame_progress = 0.72851
position = Vector2(271, 60.1423)
color = Color(0.999971, 0.912551, 0.842208, 1)
energy = 1.2
blend_mode = 2
texture = ExtResource("15_e24j0")
texture_scale = 0.3
@ -213,6 +216,7 @@ position = Vector2(344, -39)
texture = ExtResource("17_6uftv")
packed_scene = ExtResource("18_5t4pt")
sign_mark_offset = Vector2(4.37, 46.38)
first_interact_os_key = "c02_互动小蝉头套"
[node name="Interactable柜子" parent="Ground/DeployLayer" index="8" instance=ExtResource("5_ylhfc")]
position = Vector2(364, 55)
@ -308,4 +312,6 @@ visible = false
energy = 0.9
blend_mode = 1
[node name="DizzyShader" parent="Ground" instance=ExtResource("26_3kyh4")]
[editable path="Ground"]

View File

@ -0,0 +1,30 @@
@tool
extends Event2D
# var prev_stage := 0
# var stage := 0
func _ready() -> void:
super._ready()
if Engine.is_editor_hint():
return
func _on_global_stage_updated(e: StringName, s: int):
super._on_global_stage_updated(e, s)
func _on_ground_ready(ground: Ground2D):
if $"Pickable小猫纸条".picked:
EventManager.set_stage(event, 4)
# else:
# $"Pickable小猫纸条".triggered.connect(EventManager.set_stage.bind(event, 4))
func _on_pre_stage_updated():
pass
func _on_stage_updated():
pass

View File

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

View File

@ -41,11 +41,11 @@ var draggables: Array[Draggable2D] = []
@onready var sfx_close_lid = $CloseLid as AudioStreamPlayer
@onready var sfx_open_drawer = $OpenDrawer as AudioStreamPlayer
# 1关闭 2打开 3放入小蝉人偶 4全部放置正确可摇手柄 5已播放完成
var stage := 1:
# 0:关闭 1:打开 2:放入小蝉人偶 3:全部放置正确_可摇手柄 4:已播放完成
var stage := 0:
set(value):
stage = value
ArchiveManager.set_global_entry(&"c02_musicbox_stage", value)
EventManager.set_stage(&"c02_musicbox_stage", value)
# 父,母,蝶,蝉
var playing_step_sec := 0.5
@ -57,7 +57,7 @@ func _ready() -> void:
if Engine.is_editor_hint():
return
# 读取、配置参数
stage = ArchiveManager.get_global_value(&"c02_musicbox_stage", 1)
stage = EventManager.get_stage(&"c02_musicbox_stage")
playing_step_sec = audio_manual.get_length() / playing_steps
handle_wheel.rotated.connect(_on_wheel_rotated)
@ -105,8 +105,8 @@ func _toggle_side_handle_outline(display: bool):
func _on_box_picked(_node):
sfx_open_lid.play()
# 1关闭 2打开 3放入小蝉人偶 4全部放置正确可摇手柄 5已播放完成
if stage == 1:
_chechout_stage(2)
if stage == 0:
_chechout_stage(1)
else:
box_closed.hide()
box_broken.show()
@ -174,7 +174,7 @@ func post_plugged():
if all_plugged:
# 全部插入stage 进入下一阶段
sfx_plugged_finish.play()
_chechout_stage(stage + 1)
_chechout_stage(3)
else:
sfx_plugged.play()
@ -187,7 +187,7 @@ var continue_playing := false
func _on_wheel_rotated(radiant: float) -> void:
if stage != 4 or accumulated_steps >= playing_steps:
if stage != 3 or accumulated_steps >= playing_steps:
return
accumulated_radiant += radiant
if abs(accumulated_radiant) > deg_to_rad(playing_step_degree):
@ -201,7 +201,7 @@ func _on_wheel_rotated(radiant: float) -> void:
sfx_music.play()
else:
sfx_music.stream_paused = false
Util.timer(playing_step_sec, _on_playing_step_finished)
Util.timer(playing_step_sec, _on_playing_step_finished)
func _on_playing_step_finished():
@ -212,7 +212,7 @@ func _on_playing_step_finished():
return
if continue_playing:
continue_playing = false
Util.timer(playing_step_sec, _on_playing_step_finished)
Util.timer(playing_step_sec, _on_playing_step_finished)
else:
playing = false
sfx_music.stream_paused = true
@ -227,14 +227,13 @@ func _checkout_auto_play():
# var audio_len = audio_auto.get_length()
# 音效 9.5 秒时关闭盒子
var audio_len = 9.5
Util.timer(audio_len, _on_auto_play_finished)
Util.timer(audio_len, _on_auto_play_finished)
func _on_auto_play_finished():
side_handle.pause()
stage = 5
# 不播放关闭音效,因为自动播放时已经播放过了
_chechout_stage(5, false)
_chechout_stage(4, false)
# 抖动效果,逐渐减弱
var tween = create_tween()
var fps := 10.0
@ -261,16 +260,16 @@ func _hide_all():
func _chechout_stage(s: int, play_sfx := true) -> void:
stage = s
_hide_all()
var display_handle_outline = false
# 1关闭 2打开 3放入小蝉人偶 4全部放置正确可摇手柄 5已播放完成
stage = s
match s:
1:
0:
box_closed.visible = true
if play_sfx:
sfx_close_lid.play()
2:
1:
if not ArchiveManager.get_global_value(&"c02_musicbox_has_opened"):
ArchiveManager.set_global_entry(&"c02_musicbox_has_opened", false)
SceneManager.pop_center_notification(tr("c02_s02_八音盒缺人偶"))
@ -282,7 +281,7 @@ func _chechout_stage(s: int, play_sfx := true) -> void:
pic.visible = true
if play_sfx:
sfx_open_lid.play()
3:
2:
d4.visible = true
d4.modulate.a = 0
create_tween().tween_property(d4, "modulate:a", 1.0, 1.0)
@ -291,7 +290,7 @@ func _chechout_stage(s: int, play_sfx := true) -> void:
pic.visible = true
if play_sfx:
sfx_open_lid.play()
4:
3:
box_opened.visible = true
d4.visible = true
if pic:
@ -300,7 +299,7 @@ func _chechout_stage(s: int, play_sfx := true) -> void:
display_handle_outline = true
if play_sfx:
sfx_open_lid.play()
5:
4:
box_closed.visible = true
_toggle_side_handle_outline(display_handle_outline)
@ -314,14 +313,14 @@ func _settle_plug_positions():
func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed("interact") and stage == 2:
if event.is_action_pressed("interact") and stage == 1:
get_viewport().set_input_as_handled()
# 尝试使用道具
var hud = SceneManager.get_prop_hud() as PropHud
var key = SceneManager.get_current_prop(false)
if key == "prop_木头人偶":
SceneManager.disable_prop_item(key)
_chechout_stage(3)
_chechout_stage(2)
else:
# hud 无效shaking
hud.on_toggle_invalid_prop()
@ -347,4 +346,4 @@ func _on_pick_catty():
SceneManager.enable_prop_item("prop_小猫玩具完整")
# 八音盒中看不到 os
# await inspector.quit_and_hidden
# SceneManager.pop_os_with_str("c02_获得小猫玩具")
# SceneManager.pop_os_with_str("c02_获得小猫玩具")

View File

@ -268,6 +268,7 @@ position = Vector2(294, 177)
position = Vector2(340, 178)
[node name="BrokenBox" type="Sprite2D" parent="All"]
visible = false
position = Vector2(-48, 38)
texture = ExtResource("24_rriyt")
centered = false

View File

@ -12,7 +12,6 @@ signal exit(success)
@onready var sfx_shoot = $SfxShoot as Sfx
@onready var sfx_dispatch = $SfxDispatch as Sfx
var dialogue_c02 = preload("res://asset/dialogue/c02.dialogue")
var balls_scene_dict = {
@ -21,18 +20,22 @@ var balls_scene_dict = {
2: preload("uid://dr0rwr0xjgnjw"),
}
var debug_directly_win = false
func _ready() -> void:
layer = GlobalConfig.CANVAS_LAYER_LITTLE_GAME
hand_pivot.modulate.a = 0
# 0:默认 1:寻找弹珠(老虎钳可以换弹珠) 2:给出弹珠 3:游戏结束
if ArchiveManager.get_global_value(&"c02_ball_game_stage", 0) == 2:
# checkout_round(2)
checkout_round(0)
else:
intro()
label.modulate.a = 0
# game_win()
if GlobalConfig.DEBUG and debug_directly_win:
game_win()
else:
# 0:默认 1:寻找弹珠(老虎钳可以换弹珠) 2:给出弹珠 3:游戏结束(小猫纸片) 4:游戏结束(小猫离开)
if EventManager.get_stage(&"c02_ball_game_stage") == 2:
# checkout_round(2)
checkout_round(0)
else:
intro()
func intro():
@ -49,9 +52,9 @@ func intro():
func intro_finished():
SceneManager.disable_prop_item("prop_弹珠")
# 0:默认 1:寻找弹珠(老虎钳可以换弹珠) 2:给出弹珠 3:游戏结束
# 0:默认 1:寻找弹珠(老虎钳可以换弹珠) 2:给出弹珠 3:游戏结束(小猫纸片) 4:游戏结束(小猫离开)
# 放入弹珠,开始游戏
ArchiveManager.set_global_entry(&"c02_ball_game_stage", 2)
EventManager.set_stage(&"c02_ball_game_stage", 2)
var ball = pivot.get_child(0) as RigidBody2D
ball.angular_velocity = 20
animation_player.play("give_ball")
@ -242,9 +245,9 @@ func _on_hit_boundary():
func game_win() -> void:
print("game_win 弹珠游戏胜利")
# 0:默认 1:寻找弹珠(老虎钳可以换弹珠) 2:给出弹珠 3:游戏结束
ArchiveManager.set_global_entry(&"c02_ball_game_stage", 3)
%"Sfx结尾小孩跑".play()
# 0:默认 1:寻找弹珠(老虎钳可以换弹珠) 2:给出弹珠 3:游戏结束(小猫纸片) 4:游戏结束(小猫离开)
EventManager.set_stage(&"c02_ball_game_stage", 3)
$"Sfx结尾小孩跑_耳鸣".global_play()
Util.shake_layer(self, 2.0)
# 弹珠雨
$BallsFalling.emitting = true

View File

@ -1,8 +1,9 @@
[gd_scene load_steps=25 format=3 uid="uid://cjx7o685ox8c1"]
[gd_scene load_steps=27 format=3 uid="uid://cjx7o685ox8c1"]
[ext_resource type="Script" uid="uid://c5s4giu182isu" path="res://scene/little_game/弹珠游戏/弹珠游戏.gd" id="1_p2trd"]
[ext_resource type="AudioStream" uid="uid://cra6rqbs6r1qd" path="res://asset/audio/sfx/旧版/child/小孩从近到远跑步.wav" id="2_aqxy0"]
[ext_resource type="Texture2D" uid="uid://bvf8b057baglw" path="res://asset/art/little_game/弹珠/bg_弹珠游戏.png" id="2_bm1k0"]
[ext_resource type="AudioStream" uid="uid://b8sbtn3l37uh" path="res://asset/audio/sfx/旧版/c02/红屏.mp3" id="2_w5xa1"]
[ext_resource type="Texture2D" uid="uid://bs4tp4amd1kkm" path="res://asset/art/little_game/弹珠/抱手.png" id="3_3kvx4"]
[ext_resource type="AudioStream" uid="uid://bb6njoaxi2hbx" path="res://asset/audio/sfx/game/弹珠游戏/hit.ogg" id="3_co06r"]
[ext_resource type="FontFile" uid="uid://bnxdsxp7dst7f" path="res://asset/font/锐字太空混元像素简繁-闪 超黑_mianfeiziti.com.ttf" id="3_ctokx"]
@ -18,6 +19,13 @@
[ext_resource type="PackedScene" uid="uid://dr0rwr0xjgnjw" path="res://scene/little_game/弹珠游戏/balls_2.tscn" id="7_oii6q"]
[ext_resource type="PackedScene" uid="uid://cbpy56epwth0j" path="res://scene/little_game/弹珠游戏/balls_falling.tscn" id="8_fk3jp"]
[sub_resource type="AudioStreamSynchronized" id="AudioStreamSynchronized_33cpb"]
stream_count = 2
stream_0/stream = ExtResource("2_w5xa1")
stream_0/volume = 0.0
stream_1/stream = ExtResource("2_aqxy0")
stream_1/volume = 5.0
[sub_resource type="Animation" id="Animation_fk3jp"]
length = 0.001
tracks/0/type = "value"
@ -256,9 +264,8 @@ radius = 300.0
[node name="弹珠游戏" type="CanvasLayer"]
script = ExtResource("1_p2trd")
[node name="Sfx结尾小孩跑" type="AudioStreamPlayer" parent="."]
unique_name_in_owner = true
stream = ExtResource("2_aqxy0")
[node name="Sfx结尾小孩跑_耳鸣" type="AudioStreamPlayer" parent="."]
stream = SubResource("AudioStreamSynchronized_33cpb")
bus = &"game_sfx"
script = ExtResource("4_co06r")
metadata/_custom_type_script = "uid://rq6w1vuhuq1m"

View File

@ -79,42 +79,42 @@ columns = 2
[node name="MemoryItem" parent="Mem/GridContainer" instance=ExtResource("4_6dhhp")]
layout_mode = 2
packed_scene = ExtResource("5_7f8pt")
title = "g_偷听对话"
title = "mem_偷听对话"
[node name="MemoryItem2" parent="Mem/GridContainer" instance=ExtResource("4_6dhhp")]
layout_mode = 2
packed_scene = ExtResource("6_dp1y4")
title = "g_疯子看井"
title = "mem_疯子看井"
[node name="MemoryItem3" parent="Mem/GridContainer" instance=ExtResource("4_6dhhp")]
layout_mode = 2
packed_scene = ExtResource("5_7f8pt")
title = "g_偷听对话"
title = "mem_偷听对话"
[node name="MemoryItem4" parent="Mem/GridContainer" instance=ExtResource("4_6dhhp")]
layout_mode = 2
packed_scene = ExtResource("6_dp1y4")
title = "g_疯子看井"
title = "mem_疯子看井"
[node name="MemoryItem5" parent="Mem/GridContainer" instance=ExtResource("4_6dhhp")]
layout_mode = 2
packed_scene = ExtResource("5_7f8pt")
title = "g_偷听对话"
title = "mem_偷听对话"
[node name="MemoryItem6" parent="Mem/GridContainer" instance=ExtResource("4_6dhhp")]
layout_mode = 2
packed_scene = ExtResource("6_dp1y4")
title = "g_疯子看井"
title = "mem_疯子看井"
[node name="MemoryItem7" parent="Mem/GridContainer" instance=ExtResource("4_6dhhp")]
layout_mode = 2
packed_scene = ExtResource("5_7f8pt")
title = "g_偷听对话"
title = "mem_偷听对话"
[node name="MemoryItem8" parent="Mem/GridContainer" instance=ExtResource("4_6dhhp")]
layout_mode = 2
packed_scene = ExtResource("6_dp1y4")
title = "g_疯子看井"
title = "mem_疯子看井"
[node name="GridContainer2" type="GridContainer" parent="Mem"]
z_index = 10
@ -130,39 +130,39 @@ columns = 2
[node name="MemoryItem" parent="Mem/GridContainer2" instance=ExtResource("4_6dhhp")]
layout_mode = 2
packed_scene = ExtResource("5_7f8pt")
title = "g_偷听对话"
title = "mem_偷听对话"
[node name="MemoryItem2" parent="Mem/GridContainer2" instance=ExtResource("4_6dhhp")]
layout_mode = 2
packed_scene = ExtResource("6_dp1y4")
title = "g_疯子看井"
title = "mem_疯子看井"
[node name="MemoryItem3" parent="Mem/GridContainer2" instance=ExtResource("4_6dhhp")]
layout_mode = 2
packed_scene = ExtResource("5_7f8pt")
title = "g_偷听对话"
title = "mem_偷听对话"
[node name="MemoryItem4" parent="Mem/GridContainer2" instance=ExtResource("4_6dhhp")]
layout_mode = 2
packed_scene = ExtResource("6_dp1y4")
title = "g_疯子看井"
title = "mem_疯子看井"
[node name="MemoryItem5" parent="Mem/GridContainer2" instance=ExtResource("4_6dhhp")]
layout_mode = 2
packed_scene = ExtResource("5_7f8pt")
title = "g_偷听对话"
title = "mem_偷听对话"
[node name="MemoryItem6" parent="Mem/GridContainer2" instance=ExtResource("4_6dhhp")]
layout_mode = 2
packed_scene = ExtResource("6_dp1y4")
title = "g_疯子看井"
title = "mem_疯子看井"
[node name="MemoryItem7" parent="Mem/GridContainer2" instance=ExtResource("4_6dhhp")]
layout_mode = 2
packed_scene = ExtResource("5_7f8pt")
title = "g_偷听对话"
title = "mem_偷听对话"
[node name="MemoryItem8" parent="Mem/GridContainer2" instance=ExtResource("4_6dhhp")]
layout_mode = 2
packed_scene = ExtResource("6_dp1y4")
title = "g_疯子看井"
title = "mem_疯子看井"

View File

@ -151,7 +151,6 @@ expand_mode = 1
[node name="Event2D" type="Node2D" parent="Bag/Book"]
script = SubResource("GDScript_7vpan")
event = "handnote_stage"
metadata/_custom_type_script = "uid://bkkiyk5jkdw4d"
[node name="Tabs" parent="Bag" node_paths=PackedStringArray("root") instance=ExtResource("4_7vpan")]

View File

@ -1,3 +1,4 @@
@tool
extends Event2D
# var prev_stage := 0
@ -6,7 +7,8 @@ extends Event2D
func _ready() -> void:
super._ready()
if Engine.is_editor_hint():
return
func _on_global_stage_updated(e: StringName, s: int):
super._on_global_stage_updated(e, s)