From ed0cf6ba8d87d1516c397be207bdd786218ede20 Mon Sep 17 00:00:00 2001 From: cakipaul Date: Wed, 2 Jul 2025 15:32:37 +0800 Subject: [PATCH] =?UTF-8?q?demo=200.1.2.3=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- asset/art/gif/c02_二楼/c02_二楼_frames.tres | 51 ++++- asset/art/gif/c02_二楼/叼纸小猫坐着呼吸.gif | Bin 0 -> 3779 bytes .../gif/c02_二楼/叼纸小猫坐着呼吸.gif.import | 14 ++ asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/0.png | Bin 0 -> 605 bytes .../c02_二楼/叼纸小猫坐着呼吸/0.png.import | 34 ++++ asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/1.png | Bin 0 -> 570 bytes .../c02_二楼/叼纸小猫坐着呼吸/1.png.import | 34 ++++ .../art/gif/c02_二楼/叼纸小猫坐着呼吸/10.png | Bin 0 -> 590 bytes .../c02_二楼/叼纸小猫坐着呼吸/10.png.import | 34 ++++ asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/2.png | Bin 0 -> 590 bytes .../c02_二楼/叼纸小猫坐着呼吸/2.png.import | 34 ++++ asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/3.png | Bin 0 -> 592 bytes .../c02_二楼/叼纸小猫坐着呼吸/3.png.import | 34 ++++ asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/4.png | Bin 0 -> 577 bytes .../c02_二楼/叼纸小猫坐着呼吸/4.png.import | 34 ++++ asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/5.png | Bin 0 -> 565 bytes .../c02_二楼/叼纸小猫坐着呼吸/5.png.import | 34 ++++ asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/6.png | Bin 0 -> 588 bytes .../c02_二楼/叼纸小猫坐着呼吸/6.png.import | 34 ++++ asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/7.png | Bin 0 -> 565 bytes .../c02_二楼/叼纸小猫坐着呼吸/7.png.import | 34 ++++ asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/8.png | Bin 0 -> 577 bytes .../c02_二楼/叼纸小猫坐着呼吸/8.png.import | 34 ++++ asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/9.png | Bin 0 -> 592 bytes .../c02_二楼/叼纸小猫坐着呼吸/9.png.import | 34 ++++ asset/art/prop/c02/小猫纸条.png | Bin 0 -> 53788 bytes asset/art/prop/c02/小猫纸条.png.import | 34 ++++ asset/dialogue/event_stage.dialogue | 11 ++ asset/dialogue/event_stage.dialogue.import | 16 ++ asset/dialogue/item_description.csv | 55 ++---- asset/dialogue/item_description.dialogue | 63 +++--- manager/event_manager/event2d.gd | 60 +++++- project.godot | 2 +- scene/effect/dizzy_shader.tscn | 2 + scene/entity/ambush.gd | 15 +- scene/entity/interactable.gd | 24 ++- scene/entity/note.gd | 50 ++--- scene/entity/pickable.gd | 8 +- scene/entity/portal.gd | 8 +- scene/ground/scene/animation_root.gd | 186 +++++++++--------- scene/ground/scene/c02/s02_过道.gd | 10 +- scene/ground/scene/c02/s02_过道.tscn | 47 ++++- scene/ground/scene/c02/s03_院子.gd | 12 +- scene/ground/scene/c02/s03_院子.tscn | 6 +- scene/ground/scene/c02/s05_一楼内侧楼道.tscn | 5 +- scene/ground/scene/c02/s06_二楼.gd | 12 +- scene/ground/scene/c02/s06_二楼.tscn | 55 ++++-- scene/ground/scene/c02/s10_空房间.gd | 28 ++- scene/ground/scene/c02/s10_空房间.tscn | 10 +- scene/ground/script/c02/event_2d叼纸小猫.gd | 30 +++ .../ground/script/c02/event_2d叼纸小猫.gd.uid | 1 + scene/little_game/八音盒/八音盒.gd | 43 ++-- scene/little_game/八音盒/八音盒.tscn | 1 + scene/little_game/弹珠游戏/弹珠游戏.gd | 29 +-- scene/little_game/弹珠游戏/弹珠游戏.tscn | 15 +- scene/ux/memory/memory.tscn | 32 +-- scene/ux/note/ux_note.tscn | 1 - script_templates/event_2d.gd | 4 +- 58 files changed, 984 insertions(+), 330 deletions(-) create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸.gif create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸.gif.import create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/0.png create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/0.png.import create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/1.png create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/1.png.import create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/10.png create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/10.png.import create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/2.png create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/2.png.import create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/3.png create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/3.png.import create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/4.png create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/4.png.import create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/5.png create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/5.png.import create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/6.png create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/6.png.import create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/7.png create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/7.png.import create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/8.png create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/8.png.import create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/9.png create mode 100644 asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/9.png.import create mode 100644 asset/art/prop/c02/小猫纸条.png create mode 100644 asset/art/prop/c02/小猫纸条.png.import create mode 100644 asset/dialogue/event_stage.dialogue create mode 100644 asset/dialogue/event_stage.dialogue.import create mode 100644 scene/ground/script/c02/event_2d叼纸小猫.gd create mode 100644 scene/ground/script/c02/event_2d叼纸小猫.gd.uid diff --git a/asset/art/gif/c02_二楼/c02_二楼_frames.tres b/asset/art/gif/c02_二楼/c02_二楼_frames.tres index 46211a32..7bce0bc0 100644 --- a/asset/art/gif/c02_二楼/c02_二楼_frames.tres +++ b/asset/art/gif/c02_二楼/c02_二楼_frames.tres @@ -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") }, { diff --git a/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸.gif b/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸.gif new file mode 100644 index 0000000000000000000000000000000000000000..f7a3c9570c10303249fb1f2495683a536c590c4f GIT binary patch literal 3779 zcmds(eOwdw9mnr37YIoRNemF4j}sMINiGQi5)B4&LF~japw&GmBv;8WxikracFqtU z42UA_eAsF&+Rkd-L(6QXqd+WDw6?2H1GKJ1Wv&iZ`?O8^F!#Ga(C!8MW9>io{>l9= zzwh_=d*A2t`y|U(6y|Eo$&duPZiEmR+3u@+;b2?OE8Q$Gf}j|&xYpyj{Prb@P|Sjn zBx#&f5)H#J8%6QNq`2sqFbLtW!*{lBTacW>4G$OcBjqxgL?q@%@L&jLAxIdEBub)r z5fSmRv72gYggpL2ELFhc^CGxJMh1(;Vzb$NE;lV95ryCwiG&R!sVOOoQt<`J$q$v4 zu@O`f6(te~Ug~^4Ml?^CosA+0kHg_}c@P9gi^QpkNo;Qd43(VF5Cj5K@9;B)D+TBq4kMR~9aYOT$o!*6!?;h4>; z!&j?|iDIXLs9-Zi~z2^w?+z#&k4S(A6Ft4mLYQVRz27b+~0gBAJD@%WKU}xk5%T zRH2E*#s7P%-99th?J1@1?0442?(z*zN?uC2>1vmS0@LR+OF6X$7iIR)u5y}Q7kZH; zm9&R;SJF;QnI+4{(pTFYR=UQW5iBS!)~;~4J!Xf6T0!b?&_ZUjS+%)F4N0mCveel* z28E)KC{UT*Uq0m{#g5tw(Z+mx3)C2x?wA;d!cTaOzWRp7rY-)4c@1IB+Z*MC58KwZD<<`R zGBa!EF272ayQ+xJwHAeIvzoqX`HALYEL%$Frg=^`C%yB@xi6 z#?!DNDuR6Lj1NJDOL=MWBNvTmUjCBd;cH_gk56iKk=IaEFBFi=3ZSd~D4Ax$3J8R^ zxto)I((L232=2?h94NHLw!^r8uXKmc?~D9m--9dFCa6A)B@m{S>YwarZ+jp){jpB( zn@`l61YC4Bu&%EG%-;h8Fn~7=HpK<^8UWVt2*bBzXlTSoj!%r=K+$Qs(f$v`(h1Sx z$@QX=9sQ_Cl2q>O5)sjN@jyyJ0^!ZChr>sr^}~c{kY&`ztU1+LbPBJVRi(bK1k)1~ zsRu^Xaj*6dAYXzRfZ-qv%xJ{GgfIZmv`7$nW?W1NPW5^oh%xw!x!>S?$uP9_UmU8sAq<$xn(P3zSdU8 zdpp`&ro6X%Pt&ybI`%hAdGFAXCX{mwc<;HRJ~-&Tp2h$SG#Yp<5CyQ_s2^m!ckX;3 z=)6nk8K{dF8_DtZ8F?Vmcgr}j^`=-l?k7!;&?%{#TJCaQ*B0Vk9A}Y2jRIqf*a_+9 z;-{2CVn$=}ds(%B2f%lnZ4bDp5H=Z=O% zYIp~LP04iq!pEP0v$Ur$4dFrP`HY#fq`%cBy32cXp+L~s*!!edO5PT& z8U1YeR_|ze7v@16bab)Bpeg literal 0 HcmV?d00001 diff --git a/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸.gif.import b/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸.gif.import new file mode 100644 index 00000000..da8b07bb --- /dev/null +++ b/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸.gif.import @@ -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] + diff --git a/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/0.png b/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/0.png new file mode 100644 index 0000000000000000000000000000000000000000..dff64949798213ef7fab0980d5fb4391eb0c1067 GIT binary patch literal 605 zcmV-j0;2tiP)Px%7fD1xR7i=x^+6Aom*t;;CyQe;Ia-t`3;v&svlhHzf?Ig*{>&q!q4=uG% zAN%K9H*RuxbcE;S$Oo5(a-4GsGFbKD{aXQO)NAau4(Qqx56%8TJ2Mm$8+-w z+_`t3XgVYx1a#As!=s-lx7j>b&M!T*6bgC5Qi+33hn?L7t@Md&tYqtVrXIHsI~Zf| zJP!aXf}isdvRB&)?9uC^LX#T9kLGUgu>viELS^o?vtxrL@O`>zN;ge`o?|fe?##ARt9Brzl!! zIZi-b1b14e&1ww5e!GoQit@X4;&O%hm(RV##G<4}8JO@B_?e0SBY3kK3qV}1@a_AK r+N{PBmn%G6Svm8Yg2A;q7YgtT%~aPY>Uy7>00000NkvXXu0mjf^tKor literal 0 HcmV?d00001 diff --git a/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/0.png.import b/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/0.png.import new file mode 100644 index 00000000..d83ca83b --- /dev/null +++ b/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/0.png.import @@ -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 diff --git a/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/1.png b/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/1.png new file mode 100644 index 0000000000000000000000000000000000000000..dd3f009992595c4718710c52972212bb43df4adf GIT binary patch literal 570 zcmV-A0>%A_P)Px$^hrcPR7i=$$?1R>&g16YRcjlivD0Ki~0LMcW4x~xegFUf literal 0 HcmV?d00001 diff --git a/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/1.png.import b/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/1.png.import new file mode 100644 index 00000000..f4f41432 --- /dev/null +++ b/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/1.png.import @@ -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 diff --git a/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/10.png b/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/10.png new file mode 100644 index 0000000000000000000000000000000000000000..54830433bef766745503a3198e676840d5450749 GIT binary patch literal 590 zcmV-U0Px%2uVaiR7i=`bC6O1d@ zZq&6jv4R6n;MznY-Knvtl=8QPnR{GNNFykhi820m_vYO5o!>d4 zw7XrDQk358Px%2uVaiR7i=`bC6O1d@ zZq&6jv4R6n;MznY-Knvtl=8QPnR{GNNFykhi820m_vYO5o!>d4 zw7XrDQk358Px%3Q0skR7i>Klg&<3K@`V-Gq;zv&;q?)?!p*|0mBPu;v<-_B=J>P`2a@Lg}QO$ z#*dw`O~jU4-owVSQzOM(3jIJr?;IDjwLpPsV_f;)&6zXvoBug;;J+@=i}lBHHWql^ zx!7OVt@(Mmzq;B7Jy=_le*&J(WMy_LBZ2P=AU78lWTWt5Y`C&X%1uv8aLp%}^Jz31 z)S`&*J39oP2S6=~tnL|^j7&8{s8VsOTLgNl}yq>h%ccHfdiJ~ zv{eoPIA}IeN>Ti@L0BwN{r2_bVPa5n3V!9My%M}t4h0}AmiX~=S8bI;35z8juCJfF ey<1DGN%;-=Z^1r;P)Px$`$KltFJ2K^TUg*<}R^loppwHQL6srhh;ae}YMmP5cf1gPy#2Gr?Yr z7cX8kUTqUAbm4zUq&GDdl~SOsgx&c(uq6m;2PB?+lR3=fn|bE_^3K42{YFmk1$@R#s$h_x03pWm2>_KQG>87ccM9 zZnvp78hkoD#LMLXs5cr$=M2j-De9b_lE|ca{_+KPH#TTCo1~IS>W#*vyn&2vYGXRE}dNMIl=4zS@@6wRH|^RgT*y^mKrYMeC$9F%%42J*vfQ zmUJ>jh@J{+4BmctUsl)F2lH$uO(Gu0Qr2jqB^t8~LmbCpXLpB0JWhZRGG_C__iglZRmwg9txgA}6velD z_{9>nk01IM6OEF|VtgUEQuYPFFP8ZH^^2;MeesJW9u*2>wxTy=^qc(vbJ4!kc?no5 P00000NkvXXu0mjfxJm~_ literal 0 HcmV?d00001 diff --git a/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/4.png.import b/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/4.png.import new file mode 100644 index 00000000..2eddea40 --- /dev/null +++ b/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/4.png.import @@ -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 diff --git a/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/5.png b/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/5.png new file mode 100644 index 0000000000000000000000000000000000000000..b7e251d703ca31a6d5d6c3f53f96ff6f5db461ca GIT binary patch literal 565 zcmV-50?Pe~P)Px$?@2^KR7i>Kl)G*dK@^6++4Zu%Y~tA1TR@b60PzAK@d!vMBk>$mq~ZaP3{=!K zK#e02?5zC+)JQ~x4iGVDaeRs6cy|tklf@)N8Cww*e>0lV(fQ7QX6C?uouX%z$8!A4 zFBVUnox5%Kg`6jTsU(10U0#-r_181Ql}S)xeqQ{GCH!)U zZnsM-4EegVgI_EH&nl@;3UHn~iORv1ppOJr23jU`(j zKP3A*w{9~S4zcYNY4^fRj#DNo=1%)*1jUdS^BpQSmUx-0T)Dg`_0<|3NQxS$|B{Y_}SS7z{_S?ES1p+3a}Jd$~c`FI7YJ> z)VbvQ#Bq${I8@iGq+OQ?A?CMDQ@GLOYBmA@I=voBDQa&w2x@hPx%21!IgR7i=C-`tB{DT3*W=Wa#JHkx1}vb(w%u8ifbbprVTOvlTBtPZ|3*j`_F^_T~8~I<@dcP z4A1Rdx^6Bm%DwgV4D?`QL;eYPE|`(I=|G}#Spd1Qv?M#*uP25pm!SFCS&6Qei5ALq zyIq<|!smknqA&!YnIum4j7qx%_4<7ZGXc+EzTocK8trzQ>0*&)l8npCddI#q)9$@>eFRIOh^%uxk6&rYx_lvfrq4)IDZkQ#>@C&cchbiggXehwSP}f3k1&3> zoxmPL9~GL^7{0Yz!@~-+2nsc}*Ul9iEP3B&kfsdM6c|=4#^U`7le6#gz@F0N{2Z;$ z5dgu|6xYiOSOmpc^(wpWLbwyyV0jnUxE4hiWAJ^St?exe`8+9t86jz!FmQ`gVu7TBGsl<1jI?C>g?CU-*UKz1>&<;%bdAUk}yZZY*)N#-mE*+$<_^ a9;+YhtkJqNrfcK?0000Px$?@2^KR7i>Kl)G*dK@^6++4Zu%Y~tA1TR@b60PzAK@d!vMBk>$mq~ZaP3{=!K zK#e02?5zC+)JQ~x4iGVDaeRs6cy|tklf@)N8Cww*e>0lV(fQ7QX6C?uouX%z$8!A4 zFBVUnox5%Kg`6jTsU(10U0#-r_181Ql}S)xeqQ{GCH!)U zZnsM-4EegVgI_EH&nl@;3UHn~iORv1ppOJr23jU`(j zKP3A*w{9~S4zcYNY4^fRj#DNo=1%)*1jUdS^BpQSmUx-0T)Dg`_0<|3NQxS$|B{Y_}SS7z{_S?ES1p+3a}Jd$~c`FI7YJ> z)VbvQ#Bq${I8@iGq+OQ?A?CMDQ@GLOYBmA@I=voBDQa&w2x@h1r;P)Px$`$KltFJ2K^TUg*<}R^loppwHQL6srhh;ae}YMmP5cf1gPy#2Gr?Yr z7cX8kUTqUAbm4zUq&GDdl~SOsgx&c(uq6m;2PB?+lR3=fn|bE_^3K42{YFmk1$@R#s$h_x03pWm2>_KQG>87ccM9 zZnvp78hkoD#LMLXs5cr$=M2j-De9b_lE|ca{_+KPH#TTCo1~IS>W#*vyn&2vYGXRE}dNMIl=4zS@@6wRH|^RgT*y^mKrYMeC$9F%%42J*vfQ zmUJ>jh@J{+4BmctUsl)F2lH$uO(Gu0Qr2jqB^t8~LmbCpXLpB0JWhZRGG_C__iglZRmwg9txgA}6velD z_{9>nk01IM6OEF|VtgUEQuYPFFP8ZH^^2;MeesJW9u*2>wxTy=^qc(vbJ4!kc?no5 P00000NkvXXu0mjfxJm~_ literal 0 HcmV?d00001 diff --git a/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/8.png.import b/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/8.png.import new file mode 100644 index 00000000..6fac9888 --- /dev/null +++ b/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/8.png.import @@ -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 diff --git a/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/9.png b/asset/art/gif/c02_二楼/叼纸小猫坐着呼吸/9.png new file mode 100644 index 0000000000000000000000000000000000000000..f647ac2fb15fe165b146c2d397c8d6909c9eaf02 GIT binary patch literal 592 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 N7G}`f)uw+Z{1* END + +~ ArchiveStage +=> END \ No newline at end of file diff --git a/asset/dialogue/event_stage.dialogue.import b/asset/dialogue/event_stage.dialogue.import new file mode 100644 index 00000000..a86407f5 --- /dev/null +++ b/asset/dialogue/event_stage.dialogue.import @@ -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 diff --git a/asset/dialogue/item_description.csv b/asset/dialogue/item_description.csv index f49ab685..a3270a42 100644 --- a/asset/dialogue/item_description.csv +++ b/asset/dialogue/item_description.csv @@ -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_院长书桌,桌上放着一本《圣经》。
「得著生命的,將要失喪生命...」,,,,, c01_院长床,这本书已经看过了。
...那些句子是什么意思呢?,,,,, @@ -205,5 +176,3 @@ c02_小蝉恨他们,我恨他们!,,,,, c02_火灾等待准备,还没准备好点火呢,,,,, c02_霸凌救小蝉开始,啊!我得想办法帮帮她...,,,,, c02_点火前阻止右移,没时间浪费了!想想办法救出小蝉...,,,,, -g_偷听对话,偷听对话,,,,, -g_疯子看井,疯子看井,,,,, diff --git a/asset/dialogue/item_description.dialogue b/asset/dialogue/item_description.dialogue index eff59850..6024ba72 100644 --- a/asset/dialogue/item_description.dialogue +++ b/asset/dialogue/item_description.dialogue @@ -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_鸡毛掸子] 桌上放着一本《圣经》。
「得著生命的,將要失喪生命...」 [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 保卫科 +#保卫科 登记簿?
刚才那个小孩在上面写了些什么 [ID:c02_保卫科花名册os] 3012?上面有我的名字,看来确实是这里...
先去三楼看看吧[ID:c02_保卫科花名册首次互动结束] 祭台是专门供奉这只大老鼠的? [ID:c02_保卫科祭台os] 鼠歌

天地小如喉,
红轮自吞吐。
多少世间人,
都被红轮误。 [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_离开红色演出] 「乾三连,坤六断;震仰盂,艮覆碗;离中虚,坎中满;兑上缺,巽下断」
咦,这口诀是谁教我的来着... [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 diff --git a/manager/event_manager/event2d.gd b/manager/event_manager/event2d.gd index 199b9bbb..09da9f75 100644 --- a/manager/event_manager/event2d.gd +++ b/manager/event_manager/event2d.gd @@ -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) diff --git a/project.godot b/project.godot index 881b9efd..ff3ae317 100644 --- a/project.godot +++ b/project.godot @@ -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" diff --git a/scene/effect/dizzy_shader.tscn b/scene/effect/dizzy_shader.tscn index 9be782ac..b341cd35 100644 --- a/scene/effect/dizzy_shader.tscn +++ b/scene/effect/dizzy_shader.tscn @@ -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="."] diff --git a/scene/entity/ambush.gd b/scene/entity/ambush.gd index 0f698529..cb4f5cee 100644 --- a/scene/entity/ambush.gd +++ b/scene/entity/ambush.gd @@ -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" diff --git a/scene/entity/interactable.gd b/scene/entity/interactable.gd index 13aafbf5..2fcb3346 100644 --- a/scene/entity/interactable.gd +++ b/scene/entity/interactable.gd @@ -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: diff --git a/scene/entity/note.gd b/scene/entity/note.gd index 8c05a14c..7196eef1 100644 --- a/scene/entity/note.gd +++ b/scene/entity/note.gd @@ -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 diff --git a/scene/entity/pickable.gd b/scene/entity/pickable.gd index 26837f63..e08257e8 100644 --- a/scene/entity/pickable.gd +++ b/scene/entity/pickable.gd @@ -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: diff --git a/scene/entity/portal.gd b/scene/entity/portal.gd index a52de1f8..57f84994 100644 --- a/scene/entity/portal.gd +++ b/scene/entity/portal.gd @@ -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 diff --git a/scene/ground/scene/animation_root.gd b/scene/ground/scene/animation_root.gd index ccde6576..232332e3 100644 --- a/scene/ground/scene/animation_root.gd +++ b/scene/ground/scene/animation_root.gd @@ -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) diff --git a/scene/ground/scene/c02/s02_过道.gd b/scene/ground/scene/c02/s02_过道.gd index f3534ef0..d744af40 100644 --- a/scene/ground/scene/c02/s02_过道.gd +++ b/scene/ground/scene/c02/s02_过道.gd @@ -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) diff --git a/scene/ground/scene/c02/s02_过道.tscn b/scene/ground/scene/c02/s02_过道.tscn index e37d5d0b..f40d7241 100644 --- a/scene/ground/scene/c02/s02_过道.tscn +++ b/scene/ground/scene/c02/s02_过道.tscn @@ -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 = "" diff --git a/scene/ground/scene/c02/s03_院子.gd b/scene/ground/scene/c02/s03_院子.gd index e9f35a31..43904ebc 100644 --- a/scene/ground/scene/c02/s03_院子.gd +++ b/scene/ground/scene/c02/s03_院子.gd @@ -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") diff --git a/scene/ground/scene/c02/s03_院子.tscn b/scene/ground/scene/c02/s03_院子.tscn index ef5c9a23..81393353 100644 --- a/scene/ground/scene/c02/s03_院子.tscn +++ b/scene/ground/scene/c02/s03_院子.tscn @@ -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小蝉哼歌"] diff --git a/scene/ground/scene/c02/s05_一楼内侧楼道.tscn b/scene/ground/scene/c02/s05_一楼内侧楼道.tscn index d24b556c..ee56c377 100644 --- a/scene/ground/scene/c02/s05_一楼内侧楼道.tscn +++ b/scene/ground/scene/c02/s05_一楼内侧楼道.tscn @@ -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) diff --git a/scene/ground/scene/c02/s06_二楼.gd b/scene/ground/scene/c02/s06_二楼.gd index de8c6660..1212eb57 100644 --- a/scene/ground/scene/c02/s06_二楼.gd +++ b/scene/ground/scene/c02/s06_二楼.gd @@ -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) diff --git a/scene/ground/scene/c02/s06_二楼.tscn b/scene/ground/scene/c02/s06_二楼.tscn index abeee5a0..6554c1c6 100644 --- a/scene/ground/scene/c02/s06_二楼.tscn +++ b/scene/ground/scene/c02/s06_二楼.tscn @@ -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 diff --git a/scene/ground/scene/c02/s10_空房间.gd b/scene/ground/scene/c02/s10_空房间.gd index ec469428..b10d36ed 100644 --- a/scene/ground/scene/c02/s10_空房间.gd +++ b/scene/ground/scene/c02/s10_空房间.gd @@ -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() diff --git a/scene/ground/scene/c02/s10_空房间.tscn b/scene/ground/scene/c02/s10_空房间.tscn index e5ad12ad..24743e27 100644 --- a/scene/ground/scene/c02/s10_空房间.tscn +++ b/scene/ground/scene/c02/s10_空房间.tscn @@ -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"] diff --git a/scene/ground/script/c02/event_2d叼纸小猫.gd b/scene/ground/script/c02/event_2d叼纸小猫.gd new file mode 100644 index 00000000..b059848b --- /dev/null +++ b/scene/ground/script/c02/event_2d叼纸小猫.gd @@ -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 diff --git a/scene/ground/script/c02/event_2d叼纸小猫.gd.uid b/scene/ground/script/c02/event_2d叼纸小猫.gd.uid new file mode 100644 index 00000000..fed4ea5f --- /dev/null +++ b/scene/ground/script/c02/event_2d叼纸小猫.gd.uid @@ -0,0 +1 @@ +uid://cny3n681h2588 diff --git a/scene/little_game/八音盒/八音盒.gd b/scene/little_game/八音盒/八音盒.gd index db86906e..f56d913a 100644 --- a/scene/little_game/八音盒/八音盒.gd +++ b/scene/little_game/八音盒/八音盒.gd @@ -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_获得小猫玩具") \ No newline at end of file + # SceneManager.pop_os_with_str("c02_获得小猫玩具") diff --git a/scene/little_game/八音盒/八音盒.tscn b/scene/little_game/八音盒/八音盒.tscn index 6d06b071..d3f20c64 100644 --- a/scene/little_game/八音盒/八音盒.tscn +++ b/scene/little_game/八音盒/八音盒.tscn @@ -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 diff --git a/scene/little_game/弹珠游戏/弹珠游戏.gd b/scene/little_game/弹珠游戏/弹珠游戏.gd index c3cee8c2..782fb3e0 100644 --- a/scene/little_game/弹珠游戏/弹珠游戏.gd +++ b/scene/little_game/弹珠游戏/弹珠游戏.gd @@ -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 diff --git a/scene/little_game/弹珠游戏/弹珠游戏.tscn b/scene/little_game/弹珠游戏/弹珠游戏.tscn index ea04da38..5f4729a2 100644 --- a/scene/little_game/弹珠游戏/弹珠游戏.tscn +++ b/scene/little_game/弹珠游戏/弹珠游戏.tscn @@ -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" diff --git a/scene/ux/memory/memory.tscn b/scene/ux/memory/memory.tscn index 9de7800c..c42e562d 100644 --- a/scene/ux/memory/memory.tscn +++ b/scene/ux/memory/memory.tscn @@ -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_疯子看井" diff --git a/scene/ux/note/ux_note.tscn b/scene/ux/note/ux_note.tscn index ea4cb6a8..4aeeadfa 100644 --- a/scene/ux/note/ux_note.tscn +++ b/scene/ux/note/ux_note.tscn @@ -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")] diff --git a/script_templates/event_2d.gd b/script_templates/event_2d.gd index 75b51174..048346e5 100644 --- a/script_templates/event_2d.gd +++ b/script_templates/event_2d.gd @@ -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)