From 1e58baf371f002eeb5b0d01434f5f57c0d78bc69 Mon Sep 17 00:00:00 2001 From: cakipaul Date: Thu, 16 Jan 2025 20:24:21 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E4=B8=8E=E8=B5=B7=E5=A7=8B?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=EF=BC=9B=E4=B9=A6=E6=88=BF=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E9=B8=A1=E6=AF=9B=E6=8E=B8=E5=AD=90=E5=8A=A8=E7=94=BB=EF=BC=9B?= =?UTF-8?q?=E5=AD=98=E6=A1=A3=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../c01_小小蝶_walking (8帧-317px高)/1.png | Bin 0 -> 2347 bytes .../c01_小小蝶_walking (8帧-317px高)/2.png | Bin 0 -> 2321 bytes .../c01_小小蝶_walking (8帧-317px高)/3.png | Bin 0 -> 2299 bytes .../c01_小小蝶_walking (8帧-317px高)/4.png | Bin 0 -> 2328 bytes .../c01_小小蝶_walking (8帧-317px高)/5.png | Bin 0 -> 2319 bytes .../c01_小小蝶_walking (8帧-317px高)/6.png | Bin 0 -> 2261 bytes .../c01_小小蝶_walking (8帧-317px高)/7.png | Bin 0 -> 2291 bytes .../c01_小小蝶_walking (8帧-317px高)/8.png | Bin 0 -> 2380 bytes asset/art/animation/c01_小小蝶_walking/1.png | Bin 1613 -> 1570 bytes asset/art/animation/c01_小小蝶_walking/2.png | Bin 1646 -> 1521 bytes asset/art/animation/c01_小小蝶_walking/3.png | Bin 1575 -> 1576 bytes asset/art/animation/c01_小小蝶_walking/4.png | Bin 1648 -> 1527 bytes asset/art/animation/c01_小小蝶_walking/5.png | Bin 1686 -> 1556 bytes asset/art/animation/c01_小小蝶_walking/6.png | Bin 1580 -> 1519 bytes .../art/animation/c01_小小蝶_walking_l/1.png | Bin 1625 -> 1670 bytes .../art/animation/c01_小小蝶_walking_l/2.png | Bin 1646 -> 1662 bytes .../art/animation/c01_小小蝶_walking_l/3.png | Bin 1690 -> 1722 bytes .../art/animation/c01_小小蝶_walking_l/4.png | Bin 1638 -> 1675 bytes .../art/animation/c01_小小蝶_walking_l/5.png | Bin 1703 -> 1732 bytes .../art/animation/c01_小小蝶_walking_l/6.png | Bin 1664 -> 1704 bytes asset/art/animation/c01_小小蝶_侧面下蹲/1.png | Bin 0 -> 1508 bytes .../art/animation/c01_小小蝶_侧面下蹲/10.png | Bin 0 -> 1433 bytes .../art/animation/c01_小小蝶_侧面下蹲/11.png | Bin 0 -> 1508 bytes asset/art/animation/c01_小小蝶_侧面下蹲/2.png | Bin 0 -> 1433 bytes asset/art/animation/c01_小小蝶_侧面下蹲/3.png | Bin 0 -> 1538 bytes asset/art/animation/c01_小小蝶_侧面下蹲/4.png | Bin 0 -> 1486 bytes asset/art/animation/c01_小小蝶_侧面下蹲/5.png | Bin 0 -> 1487 bytes asset/art/animation/c01_小小蝶_侧面下蹲/6.png | Bin 0 -> 1483 bytes asset/art/animation/c01_小小蝶_侧面下蹲/7.png | Bin 0 -> 1487 bytes asset/art/animation/c01_小小蝶_侧面下蹲/8.png | Bin 0 -> 1486 bytes asset/art/animation/c01_小小蝶_侧面下蹲/9.png | Bin 0 -> 1538 bytes asset/art/animation/c01_小小蝶_床上看书/1.png | Bin 0 -> 1804 bytes .../art/animation/c01_小小蝶_床上看书/10.png | Bin 0 -> 1628 bytes .../art/animation/c01_小小蝶_床上看书/11.png | Bin 0 -> 1513 bytes asset/art/animation/c01_小小蝶_床上看书/2.png | Bin 0 -> 1654 bytes asset/art/animation/c01_小小蝶_床上看书/3.png | Bin 0 -> 1804 bytes asset/art/animation/c01_小小蝶_床上看书/4.png | Bin 0 -> 1701 bytes asset/art/animation/c01_小小蝶_床上看书/5.png | Bin 0 -> 1645 bytes asset/art/animation/c01_小小蝶_床上看书/6.png | Bin 0 -> 1594 bytes asset/art/animation/c01_小小蝶_床上看书/7.png | Bin 0 -> 1499 bytes asset/art/animation/c01_小小蝶_床上看书/8.png | Bin 0 -> 1559 bytes asset/art/animation/c01_小小蝶_床上看书/9.png | Bin 0 -> 1575 bytes .../art/animation/c01_小小蝶_床上看书/书.png | Bin 0 -> 412 bytes .../art/animation/c01_小小蝶_拿鸡毛掸子/1.png | Bin 0 -> 1591 bytes .../animation/c01_小小蝶_拿鸡毛掸子/10.png | Bin 0 -> 1954 bytes .../animation/c01_小小蝶_拿鸡毛掸子/11.png | Bin 0 -> 1601 bytes .../animation/c01_小小蝶_拿鸡毛掸子/12.png | Bin 0 -> 1591 bytes .../art/animation/c01_小小蝶_拿鸡毛掸子/2.png | Bin 0 -> 1601 bytes .../art/animation/c01_小小蝶_拿鸡毛掸子/3.png | Bin 0 -> 1954 bytes .../art/animation/c01_小小蝶_拿鸡毛掸子/4.png | Bin 0 -> 2159 bytes .../art/animation/c01_小小蝶_拿鸡毛掸子/5.png | Bin 0 -> 2120 bytes .../art/animation/c01_小小蝶_拿鸡毛掸子/6.png | Bin 0 -> 2155 bytes .../art/animation/c01_小小蝶_拿鸡毛掸子/7.png | Bin 0 -> 2236 bytes .../art/animation/c01_小小蝶_拿鸡毛掸子/8.png | Bin 0 -> 2147 bytes .../art/animation/c01_小小蝶_拿鸡毛掸子/9.png | Bin 0 -> 2158 bytes asset/dialogue/item_description.csv | 16 ++ asset/dialogue/item_description.dialogue | 17 ++ .../dialogue/item_description.en.translation | Bin 2650 -> 3442 bytes .../item_description.zh_CN.translation | Bin 4108 -> 5080 bytes config/animation/entity_sprite_frames.tres | 228 +++++++++++++-- config/animation/frames_display_card.gd | 2 + config/default_theme.tres | 17 +- manager/archive_manager/archive_manager.gd | 24 +- manager/config_manager/global_config.gd | 23 +- .../config_manager/global_config_manager.gd | 19 +- manager/deploy/scene/scene_manager.gd | 261 +++++++++++------- project.godot | 14 +- scene/camera/camera_focus_marker.tscn | 16 -- scene/camera/main_camera.gd | 1 - scene/camera/main_camera.tscn | 6 - scene/dialog/balloon.tscn | 2 +- scene/entity/ambush.gd | 33 ++- scene/entity/ambush.tscn | 8 +- scene/entity/hd_entity.gd | 2 +- scene/entity/interactable.tscn | 2 +- scene/entity/local_inspectable.gd | 6 +- scene/entity/local_inspectable.tscn | 7 +- scene/entity/note.gd | 6 +- scene/entity/ux/sign.gd | 19 +- .../camera/camera_focus_marker.gd | 41 ++- scene/ground/camera/camera_focus_marker.tscn | 9 + scene/ground/ground.gd | 30 ++ scene/ground/ground.tscn | 10 +- scene/ground/scene/animation_root.gd | 11 + scene/ground/scene/c01/s05_animation.gd | 11 + scene/ground/scene/c01/s05_院长房间.tscn | 251 +++++++++++++++-- scene/ground/scene/c02/s01_animation.gd | 2 + scene/ground/scene/c02/s01_街道.tscn | 8 +- scene/ground/scene/c02/s02_animation.gd | 16 +- scene/ground/scene/c02/s02_走道.tscn | 20 +- scene/ground/scene/c02/s03_animation.gd | 3 + scene/index_page.gd | 81 ++++++ scene/index_page.tscn | 131 +++++++++ scene/main.gd | 21 +- scene/main.tscn | 15 +- scene/player/main_player.gd | 85 ++++-- scene/player/main_player.tscn | 15 +- scene/player/player_animation_config.gd | 26 +- scene/prop/prop_bag.gd | 5 + scene/prop/prop_bag.tscn | 109 ++++++++ scene/{hud => prop}/prop_hud.gd | 27 +- scene/{hud => prop}/prop_hud.tscn | 4 +- scene/{popup => prop}/prop_inspector.gd | 0 scene/{popup => prop}/prop_inspector.tscn | 2 +- scene/{hud => prop}/prop_inventory.gd | 0 scene/{hud => prop}/prop_item.gd | 0 scene/settings/settings.gd | 128 +++++++++ scene/settings/settings.tscn | 152 +++++++++- ui/button/item_list_modified.tscn | 6 + ui/button/sound_button.gd | 9 +- 110 files changed, 1654 insertions(+), 303 deletions(-) create mode 100755 asset/art/animation/c01_小小蝶_walking (8帧-317px高)/1.png create mode 100755 asset/art/animation/c01_小小蝶_walking (8帧-317px高)/2.png create mode 100755 asset/art/animation/c01_小小蝶_walking (8帧-317px高)/3.png create mode 100755 asset/art/animation/c01_小小蝶_walking (8帧-317px高)/4.png create mode 100755 asset/art/animation/c01_小小蝶_walking (8帧-317px高)/5.png create mode 100755 asset/art/animation/c01_小小蝶_walking (8帧-317px高)/6.png create mode 100755 asset/art/animation/c01_小小蝶_walking (8帧-317px高)/7.png create mode 100755 asset/art/animation/c01_小小蝶_walking (8帧-317px高)/8.png create mode 100755 asset/art/animation/c01_小小蝶_侧面下蹲/1.png create mode 100755 asset/art/animation/c01_小小蝶_侧面下蹲/10.png create mode 100755 asset/art/animation/c01_小小蝶_侧面下蹲/11.png create mode 100755 asset/art/animation/c01_小小蝶_侧面下蹲/2.png create mode 100755 asset/art/animation/c01_小小蝶_侧面下蹲/3.png create mode 100755 asset/art/animation/c01_小小蝶_侧面下蹲/4.png create mode 100755 asset/art/animation/c01_小小蝶_侧面下蹲/5.png create mode 100755 asset/art/animation/c01_小小蝶_侧面下蹲/6.png create mode 100755 asset/art/animation/c01_小小蝶_侧面下蹲/7.png create mode 100755 asset/art/animation/c01_小小蝶_侧面下蹲/8.png create mode 100755 asset/art/animation/c01_小小蝶_侧面下蹲/9.png create mode 100755 asset/art/animation/c01_小小蝶_床上看书/1.png create mode 100755 asset/art/animation/c01_小小蝶_床上看书/10.png create mode 100755 asset/art/animation/c01_小小蝶_床上看书/11.png create mode 100755 asset/art/animation/c01_小小蝶_床上看书/2.png create mode 100755 asset/art/animation/c01_小小蝶_床上看书/3.png create mode 100755 asset/art/animation/c01_小小蝶_床上看书/4.png create mode 100755 asset/art/animation/c01_小小蝶_床上看书/5.png create mode 100755 asset/art/animation/c01_小小蝶_床上看书/6.png create mode 100755 asset/art/animation/c01_小小蝶_床上看书/7.png create mode 100755 asset/art/animation/c01_小小蝶_床上看书/8.png create mode 100755 asset/art/animation/c01_小小蝶_床上看书/9.png create mode 100755 asset/art/animation/c01_小小蝶_床上看书/书.png create mode 100644 asset/art/animation/c01_小小蝶_拿鸡毛掸子/1.png create mode 100644 asset/art/animation/c01_小小蝶_拿鸡毛掸子/10.png create mode 100644 asset/art/animation/c01_小小蝶_拿鸡毛掸子/11.png create mode 100644 asset/art/animation/c01_小小蝶_拿鸡毛掸子/12.png create mode 100644 asset/art/animation/c01_小小蝶_拿鸡毛掸子/2.png create mode 100644 asset/art/animation/c01_小小蝶_拿鸡毛掸子/3.png create mode 100644 asset/art/animation/c01_小小蝶_拿鸡毛掸子/4.png create mode 100644 asset/art/animation/c01_小小蝶_拿鸡毛掸子/5.png create mode 100644 asset/art/animation/c01_小小蝶_拿鸡毛掸子/6.png create mode 100644 asset/art/animation/c01_小小蝶_拿鸡毛掸子/7.png create mode 100644 asset/art/animation/c01_小小蝶_拿鸡毛掸子/8.png create mode 100644 asset/art/animation/c01_小小蝶_拿鸡毛掸子/9.png delete mode 100644 scene/camera/camera_focus_marker.tscn delete mode 100644 scene/camera/main_camera.gd delete mode 100644 scene/camera/main_camera.tscn rename scene/{ => ground}/camera/camera_focus_marker.gd (69%) create mode 100644 scene/ground/camera/camera_focus_marker.tscn create mode 100644 scene/index_page.gd create mode 100644 scene/index_page.tscn create mode 100644 scene/prop/prop_bag.gd create mode 100644 scene/prop/prop_bag.tscn rename scene/{hud => prop}/prop_hud.gd (93%) rename scene/{hud => prop}/prop_hud.tscn (97%) rename scene/{popup => prop}/prop_inspector.gd (100%) rename scene/{popup => prop}/prop_inspector.tscn (96%) rename scene/{hud => prop}/prop_inventory.gd (100%) rename scene/{hud => prop}/prop_item.gd (100%) create mode 100644 scene/settings/settings.gd create mode 100644 ui/button/item_list_modified.tscn diff --git a/asset/art/animation/c01_小小蝶_walking (8帧-317px高)/1.png b/asset/art/animation/c01_小小蝶_walking (8帧-317px高)/1.png new file mode 100755 index 0000000000000000000000000000000000000000..54b7922084bb2bad99844dbe6e4e94eeee145d82 GIT binary patch literal 2347 zcmeH}>st~A1I2N3MKyB{%bp4}M2m}BUcxj*rzUto1JqKB(k0Weta(|=%q>?)&Z($e zLM0VYFuVlj>%A27^_H7?zdnVU;H5_mF*Tk0H{N$2&U4Q5`*^;b!|=y@>g_+e9{>R8 z;jr$6UC#ypbew>Dc9Z^Z{+M0ccME$t1^_q!`bRo|M|np80N@19-Ia7FZ*jtp%A@GC zFHaqFe5M@2^J3-cBt~D<<>Gkc*C2u!Y@3QO`t!)%ez5(m6tKAh?{s_mo~@-LepCl$ ze`_Q&(;i@CXnQ8Ikd*pY5tSsrvRc8&w~rrZrzkNM;k?*SW_MGXjl~jhGXvs5cIs6Q zRVYm!LUj&?w?Y8h$zOq}sr$|wFx0q2^VPvr^o;eYY}YbOG_(=V|9-jJn0 z{#aW!{R}6eMu)tNAsG;pHyJ?irP=d9KSh6U2_t+u1u8muI)NI@rQ);OMRcbecN5Xc z5A()J-pzM3>PmVRQ1L;x4!Zw=-5&xIk)LW}eki!6IGdRGF5URc+qNApJ{fOz*@xEX z&r-f2KZ;q03SSjB;&I%!W0LJ+h{SWP&BRAQeMq3ynd&lPi^5f`N7n{ zjnyswLF(_GIy6xd*4GyighDi&F3Z3qnBX?l=yIF!Ced|k*vQUTaGiDH)$hi(ZnXm5pUNSUn85bTgN>8*PNJ67fan}Pioh*XblW>PR z?B;D4A!;n@T#Gl+Tzb24Jh`&g>bRra`D@l#&SSbyrQb-hHD8I=WIf zd?tt%IUhLoX-wx_WN){;R{msM#r+&I@>ff@oD8-|v&+JeWE2dE8Fn%Y;(MX6eNXK09tUrL(whWG`kck-BY#eqi^+9V&v{+*+)V zj^LOCaZdTqwb}#CsOTRQ{p}sKX_E1JBo1+2!yOK{;s>)}J;ocQ%yiCL;nk5oN6bzx z6c^pR{kD>xeMupBiL%A2-nbnyKY2*^*Q>PoBx!|Iy*NZB%}ibqw)iXCI^2#%J~bd3 z3zL%t>D6{$xIV5Tc`*$=vJf*&^9(;#b%mSyffl1(#}xZ9(L5Ij!ENw2gOw?z{$jGn1oZ zUAu3fY|M*dU6mQ{l^3GEe*>S+Egc&A@uNQ|JG7vl-0jooq2#`#DdQypizG)D8mD@} z|L*kDRB;BW&M6X&9{<{V+yoUv=%rA7RX(%}P{9ihcMq0gO%OE-G@~Jf=^Tggk8@;# zmWL=yFSBr@2=ix4&;t^OpO$Oq7TUVDvb+t5KH87wI4Ku?<0Csh^Wa;0GDh*n92BI7eWYho zMQ&j*mS=lhn5>#8X?x%bF*xy7v&ISB?!}yCcbd|YK$Pdl!i*ba4FRtijN3g{b`gam zm7ltACfeLR{Mbf*(bMM#nsbM$lXzXwzHXle0u?6>n9)T4adBcj!yB{8s<@KX%||vP krD46g$0Gjc_IArCmC=S_6v^s#-wy!ifp;(e=Gwi#0Y8x?&j0`b literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_walking (8帧-317px高)/2.png b/asset/art/animation/c01_小小蝶_walking (8帧-317px高)/2.png new file mode 100755 index 0000000000000000000000000000000000000000..6f0163bb5b4d369d7c1e4953fbbd5bd32b614535 GIT binary patch literal 2321 zcmeHJ{X5eOAD&YOO`6!%=?Xc8T^ynvmDiCXeP^VNiWWVb%)6LoZAO;7E#51$`CpZmJ*JHyM3n^mWC#MHSJ#UI&W#43O#cK zN(#|Y|LY^x5Boz3qq?#2m9Q2qezy9QPT+;lg^?JWj1fq=Fo#z+y}j#5C?UdMIJTgi zpRIoY7I@te3^uFX*)|aF)(uS7guhBkmm&eltVoc}JfxpRlb@4{h9ZxqFaq3+dE>QqKE)OpRkVEfP7VZ_U*uKC| zK1)>mH#+_$WU2=|)f1%G|J$E-12;{nM8evv&J6^4^4I;EuXV^2qgLCL3g*I%NZLsP8L1yLs?D~;`_IW@X8C*5go>+>dnyOyWw4N703|Fn7oRNm3E;MQ(AQ~N~61D z3JlJaL&7E(l4wSo^PHyDIs?S9l1%>`0i%TAM!7yNG(%7eN|M=3xS8d~2LB0w{yvC}BZK=s zYo`OE<)jMTu>*%4b(|8AbKxGGV7#LVlUcx$M43qa??*j}Kptvtk(=y1!_!-T)$imI z#Udb=wHOt5k(+NJLhF&M_tT@X;z93~iMNv)J(C(p92fbMJG(udNG9r9(MVQaIwTCEN3ovSKxde{3B%{!S7%&oE+-gqW1PuN{)isSee6=Vw1o#Bay% zg|D{Ym6z6M;$~&lKQqw3*mD~2v>SN09u!yD)qp#6EaKE5a57t_EvCzq;vhX=A#|Yd z!GXgFvrys*Dmea1_8C;<(&U^!#Xg@@Jnv2L>k-mz_I8y5d|Zr1PN@(7lBRuuijk}C z0>OofOfimv2%+4BiB`{2J5Gcn3HGSBv51#hL_KF>`as=Ohwp*4U*DI&q-8RU^xL@g z-5LXa?+OHgw=Yp8&qX8kMZEc~kU{QqZ|h$gaG85>;WHAy02=gKK-h$Q+YxT%+WM2h zj%c?(N*=(ji2Z)%DC@(ID8M}WtQIZx0wO2ns-g)j#Z2?Upjb}r&RX0so$*wmg)v$h zt{$4xFR`Kb8xCD9XAMrTW!tU$l-khm4?iDtEPELE$!gW8^NLi~KfU&$1E6$w*2UNE zn$q*>MFAxbJKGm@6o$G7q!(RKf?I}1^EW4~p&hA+e_gI_skyAN3C!P>!#f=Z1h{&- JJU(+h`EN>mD{=q; literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_walking (8帧-317px高)/3.png b/asset/art/animation/c01_小小蝶_walking (8帧-317px高)/3.png new file mode 100755 index 0000000000000000000000000000000000000000..125545e85093cc0ab7714f0aa0db9c92dd4a24dd GIT binary patch literal 2299 zcmeHJ{W}wi7oTe0#ibs^Op&!-c!pZuuaa$sgm?^FC}SjDEZ5t*TrVS6X70Rg!p5b% zqzw^0G*{{}cerNW;%d7SWmrPv>fiW&?+@qsoadbL!{_;&bDnd^UY-aI)nlpv06+tU zbn)KDA^r*ph>>ez8was=Oej_+n2f7E1rx_9T)Z3gb zG8$*}qBH2O=#VD?xb@UhdBL{q zb8P&5u!d=5GJc?wp`-zm-Fuj$^(t~WW7Wl7o>Fn~aH%Q(JYVT zNX+FT#N0@8rIXV?x72~5ood0~0W&ZIEylG45)N9|ZnLJ8f=!j|91I$YHLkT=6|(ZS z=i7V!+KRLG@wWCk_AWO|ZO2`5K=$0Wob-gbh1MmX0wQYdV&@^vNbTb?XLmV}vax~} z+iG&fO!kBku|gEOFwahvzP*BqOA=LC$p|cFPQ1 zBfkF5ry1Fp|9TkO1ajl>D=L$4nlP(`JW~l7BC7uKggOXRRqGe6&dkybDh*#B$ks>H z%GsW{d7-N~*Zk}qq)w4T+u7F6Px5t2 z83H21z6TMx)Uh3v`=5(3oa(+hC(h=VZN%o?08PcvrM1PBW!j+y+D_vnYM&ocNB!MQ zPNdU}-SqOwmAuBEN+4ohlti>Ms1&&F9Vqw>!U&HMzAA*)LQGLYkB_MERvW1Lrea*Y zmQUv+9lzvt%X3Da$to2h?-%lB5@EMq&33am&VeU?-%g5{Re81ZqG2B44zt1=?Nv5I znZf)jO@AWf;suxQTaj_o^{pw;C3%>*2}Cssz<@l&T@Q7mPYEY>idITK;~1i zi3!eg$xvs!J4Bfp7tpeTwnC@ z+LFvn;83b0TFgVAIYVJStpTFEKSwyf$&Yv@PfzlgXvV$dJvPL0k601ek4U)Z{2uUF zTYL4)j9|c{FN;uo?tR{sNYfev|2Y-Y$j|c##n#!7S7RLoUj>E3*Xq{=g(iHYDcG07+bM9=Z$QXjsQGyDpE^*zfX9gPdaL(X>ue!_K4 zpp%Vb%h1=L&BPdo{aJRD;r05+^#jtO>%c}_=1%O^!Q1T@%${Xdw@NCtm6hwsCEMf` z!o3r!p*7dK&0uFvYWdKNbJ^3v6$XPrKJox5z3Ts0)KH)~c)H_<0C-c7(TH2N=D|eT zJ-ES2SE1=q^hs#>heP9xs+i!^Y@2#D+-1S7q$F2Dwspb_eF}3X$)k&d5hqM8B=Vpi zTfnS~mI!V+O?Cb{x#LQ8`|)~RjjI1$Xh#{k^Q1%{y2V2Kl;5KNa+*H% z0lZfF$(l>`E!ud@hWNEDVI~RKKk4P>E{DeRMuR$e=xyF&1o7_ey26g>+e+i9VD1>t pNiX-K;f{MtNcjKSAsr$qJkMY+YyTK#zyHkuP**%%nl9Z){}=nB4RHVf literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_walking (8帧-317px高)/4.png b/asset/art/animation/c01_小小蝶_walking (8帧-317px高)/4.png new file mode 100755 index 0000000000000000000000000000000000000000..c907d16c5832b1b5ebae1aa0918cbc0c5da6bcec GIT binary patch literal 2328 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 MNUUd_M`+f60TM(i6aWAK literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_walking (8帧-317px高)/6.png b/asset/art/animation/c01_小小蝶_walking (8帧-317px高)/6.png new file mode 100755 index 0000000000000000000000000000000000000000..47cfb04fa55889bd35b9c7057148409f7369fd92 GIT binary patch literal 2261 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 literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_walking (8帧-317px高)/8.png b/asset/art/animation/c01_小小蝶_walking (8帧-317px高)/8.png new file mode 100755 index 0000000000000000000000000000000000000000..2fb6dd9ff49bc51f79fa40cf8040d2485567de48 GIT binary patch literal 2380 zcmeHJ`8OL18jX5Y^riN0YJI7FDY2AC)GkD-k}~?*L@iN@R%@G>sH!FPgpn3OiIR9i zBhS7R8Ld4M9f_x!651NeFrqB65bEZPOn$XCb3M8<X4T zP}gr%=SNN?M(Ve=wCLV%$s`${^UFAi9y_M1^FILT$OYyz`c2m%ON%HB>F-%U=*3`!VLB8rpYD{2$)dTV( z4$VwVzw+bBtGPfdVCTpg_PdVWM@5xryqrz{59%T5K#RUCQn2g)>HkGfFn{?VeO|95 z-ahhi2ccMouD;+sU{m1U7>cl&Zn>|pME5C9So?C)asP9(wC4OnothXg_BU!Y+z?7Aw5B#iI;M(A zvt1hvFWEqBvgyp)q$#XX!jQ?ZTX&?HXPWLJ(R)jdc&xXwMg;Hc31L z4Tzzd^|xeFf@u6QM$aF)b(`RKcpA$yRl8CRmf8+l9!u(FDc#8+g^U*FST4sKxHtPx zMRRx7n^d#>W4#HR@BTJu_XZznOszuFy@@s#Ut1O4Tt*)Sgs;{3U+NNT*MvEDDzY6~ z>ySo9CaP5b8`ED!^6KjHtjWH-hq6it#y8v8P}ZGe7eI}?1f3d)%Ixns5 z8q7kUY)5@Woq$x;-!x)ZD#KxCi;9zuMdp)q_2FU^i>GrI8QN3H+sTMu+;Y{Ntj-K2 zLINNiRm;Q3u9N^?GuH46{gkq+gQ#7Z&alDW7|X>@`zjk4izylDzz= z4kfOQ)#$c(&-_WX--LPUPNuU$#JxDHcHjV?UEOwV!iUjIe{dkqCsMwDx1N+wlDXP6 z|87hb+`bXEpD289Z1jd4d2ZX=-FJL!g&HUburE{78vf`8D@gVts{YWI zMQJoBB9v*F-9${|Egn$B5qHASsA_6ii@|c!_)GGBO`g?4JZ=>+azrRfvNR+{s#KNN;XMX zh>+5#x*Y3JtdL{O8fA~k&npJ#6obelOjYf~ZFUiLVvZ~D{Mr+t%cA9&&XzCCS%|$YB&E zVryNqOAIkln{|32`#uA|*d~OfI%j)NCDg|EL|}-N))Z^##FyUHVJ7w6cADoIO-LPW zvVINiaewf}YED|f)fG`8`}o_EBq}mY5OEiivzn6$O32{er6DK%X{G03%&A=YtrFek z#%q%Vj$FhV%J=vjgktc_Yi|r%p0g{s-X7w;mkG*hMn-80*%A8FO6M&4@VNiFfR-qX XiCDphShntQJpw@8;cg8s!Rh}7623iC literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_walking/1.png b/asset/art/animation/c01_小小蝶_walking/1.png index 75fddd03eaf1f0c22f31e166809bbb05a30c060d..5589ad45cb93a8bb7ad603f32a0612e48cf8aea3 100755 GIT binary patch literal 1570 zcmcIk`9IVN0R4_s7^D%o3OkM_8BEhC!{!*rV2s<0$UVl{iZqGb7^Z&qFPvI@*h2FYIeoPl)V(NK3d9Vr`itqPX^Lv| zJq6ZkV698~hB~@#t8#%9fmlOt?CEtZqt{5X_q6-j8Wo~#NSr!SFhSV$YBPf0jTZOX zT%VvMe<58Y6U*1F5a$K?^MAA1JAo_=88l^y-091)##^6_M7VMH+i6oLW8stdiQepB1O0;QyeNk zXw=mce$WC2L}1h?8H5->*-L#F8XKG|xTvC1koC?cC%rx26qMbq-Wtqn9aTegAVHJm>06~A9;AH> z`c61|HDdcr3JI#NqQ=?W`nQon3mA4f))^wT4;>=Z-2nsZJ;C6pR(6nbVU`h~MJ&05 zD;`6pxbt^z7}Pis+V;yFg7({nVxY@HFwf82h+ahJQBP7V&WTAZ(T1P4H+;YpE%d7D z)}&d~^$#yaF{NBoX4O3wrKdbz22X1wDUMv3u{dc2g|sLF8?=R%nsVXobzYIQBcIro zp8|AcA!qFI2|ebKiA%7h+b{f6^PTs*lZtzgAlJ~)zDxG6a(E2z#Pqa=1Dr8b1yoKO zBPJ}tnleXo22*<>k0du!pCO>;bIblsXPxmx4-zWXmphVmQvb2}?#^rL)t~b)+XDg! zP(e@S&w3gD_*jf%3|qkru5MZuamJm4G**5eP^JgYu4o5(7rv_P$3B#yEqtBAn9xNB zlXv=b=uC=_2U5E9p_PQDK^Bo==UjH9loM|rD1pVJUTFxar&utJrKjKPkDtMc_t2i zK!&qP8If@ao1_<3N}4IR;o|H2V{0HF!N?;AivGoYFqU1vWFcK!OR6)fUz4CS-SNrPoP4-8DM_rw4AaWjotMS|G zdbQlJCodX^&(h0o?3BLlJyY{!OQc?7Yp#Z zsG%_J`Pf**AAV6P8T*Imived9+#OFiwVEmRC%^9bl4eq^nTGg}NB9$*Y~scEJekel Po<4vzw7`_=yT<$tFr(J6 literal 1613 zcmcJQ`#aMM0LH&_Es`xKxy5o1V_BA3<&@DDGnZm?Vv}3NNTPCFDrPj(Tx!QSdq|?t z+?rY;mn6)sxkSo{Bg@D#alSoE<|R|~$faAA7ETFLBAQ9um}i^S!; zF0C^i(aEnbFPB%hp8EF^|HQwEjAP|vw?iy_Yo zSeKI#iQ{!FoHWu_-?SE0%R{ay%ocu<{z{x-ZC(Gi*eI6va8Z;g`>-KAD+bV2gSkTf zH!+wofPQ&UbWgy_P8Sm+8et)&f%Bc3u|xNf@qMVzsgWiK6c*taL%{&VeGBOy+Rw(wknMqY$t`YU!j=y+rqw(`>Gb8T%eMm#iLK0kF z^!XXg2qsRyX$3fbi+CDfW(KaW~+f=@ID2ZNXNXF9rLvumsdqzltuM0$X_!xez%2TA&C zg_;7l;R#PG*N(OLcjtWh*fQ!e=$dHTX{5|92^?$jc#bZfi)Vh&EI}}nUotyry4$v? zU0xZeiwUzsBf39|yzcINL9iaqQgtDv)|m=T<|0>C0*^-Z_!HXbZtHS}&;PS)1b7GV>d%MZE14*4<10arQ!r)N?seI!e-@PFU z(%fU4ABx8o=a3!;V@c_fr@SvyT=LuYcQ?Z-BtN?-0)M6C^UfErAdgPY>%8CFjMo^N z-r``j0nr7MtNM(irWRJC{jWp<%U_nS5w=#j^bqvIc}KO;3LYefjm0CJ=L1qrPNjlV z8QQ2{(qW(zsk1&aXfu9`D!O$IBZdEPj^*m%!lXdLy-CO@`yksbv%HS#@!s#m-*}vo5eCYa6ol& zwl=b0wY|#wSzZ@|ztV7fSddPXY2aPbbT@{>U$WLgOg3+_5S73}+I`@@5cc(l0Mnq0 z#IO;dA#qKeA7F3b-GED(X!YDZS6V%qs+ep@WS0IxGxKW8#@_YOqncS+1ULSS&e+Y9 z+QQ6L4f`Zx@5ig|VCo+N77vQ!_xxG*aoR!CS;7)e^!%jbwLYmV+g7BS%M*Wa*{$0U z$yW!PjPjxf@03`9!N`V$vW-c#QAIGmv@AE{l*MJmU7j!;I^D{ zGIXTFBDgGfcc(}WL_+vjKbd{nUdo`DP;%`V+vevD!u3$qIz_7SvhTweIzYa8(dR}Lb(4;Cq1Tyj?t28tl5;Ti$|UkYgi|LEE- z97CycE$twq^wejh8bxbom$O|p-c7>C;MJkwJJ-<+^0lyI$miKcjR zu&eIXiTTKnWXo~lo>j3>teZ}TlF@D4IHZmr)9^o0lKf(J&3sxcnZEfC0M^M3U3Hvz F^B?Iy?+E|^ diff --git a/asset/art/animation/c01_小小蝶_walking/2.png b/asset/art/animation/c01_小小蝶_walking/2.png index 8a4f8adb67e879a26521131ca25b984e0af53a1e..edd4cf74fb3813e1ca99ac1fa0bfcad18a34f404 100755 GIT binary patch literal 1521 zcmcJP`#aMM0LH(w99x>XjFuRN5h6x-MxkLYIc}+y!fN9Ex`t{PKlFW&t^E=LOyd#H4&_X@F@qDOq`d2Gz(o40=IZf zoBx#|a*kxEPUC=j~6HLDMmmVvFhxTG9_utYt5x?9n z*qTO}u1_=F6ia!Bb;&ci#l6m9o%6r(wJ{P@E3UATH6)7Pt)q*@5v+{Gk}H&s z^^Z3J2$Nt3d!!1qiFfN7dj)#92WOOn$e(h?>DUD>@HjmDMlD~y+);{(S^BQJ62a<~ zC5d+vbTE41%S&fc)6?hfj=TsdZu{mPxF!;sr0Kl8qyU*WXvkW@(FHx>s5j^~~%HVCvL*FDh#6*cZ{hPqxwexVoZ@qhp2v z+6*X)#{-dC6B>LGhsIc$GuR!a^m;Fd8hhe+;JCx6F-TvNt-L&%CDujB0E@9;Lit?{ z$IK&RMR|D>Kmfh9#MQAPk#>M+J63g(FEIR^`;#Fv5~C5dlYeOQdm1;`KJ=mFn&kXp z=`bggqsAa!cf*ONW@hAuV4?wRZ}#kL%Z$9bPXK{oZ6R!3^D;PoveMi&aT^NMY6gg4RM*Jn<3K=5^``d|%x~m>dDRx{;h=NR`5Yz9z2nX2zc*Gp zK|n`)qYc7XTn4y06*hU>46m85)9ApU4x^V9$-fhC|W-tEuUT`}}OD z+r{)VgXLWfneHHJyU=I}J9IhjD0?sLo`P&=`kpr|T)w?Iv%o+Sz_p$xD;hyg&hlqLz@Or{0@T70srh zoE_o|KLz^Jnou0ldo>??`gZtbJCeRRC+kpA@Fh8F)7i4ZWGm|Y@Jt>v{4!7<>gY@O zzzK1WV>YU|Ay4YMv)kt%9eG`Nxj6%BI%VFnKti+))c zj6sN(0V!hTb|uN=52J_|@ex8Bnh3qi`Q@I;Co1f{pHZ)+F~ zCGx8!mdt?s!E>t34l61|^^fFK1C9;Iuj4BGe$C|0E?hr+e6gwPzkM1fkp?IBvSnZW PICQ|p(F0%Y5P0WbR%y36 literal 1646 zcmcJQ`#aMM0LH&Yq8AY%&`NQ2jq=Tu(aUYi&$jlAMR&dz1X z)yX^pJ(D7E`g^@DR*0bFER9iDK}OSv%{{2~R2=VVW{(Q%U8<>rmA-qbzJX*Jf<+{b zj+(_YHG{}c+KiLqu8_^+HI&v0_2=@A&?1Lj)@Sk-Hw10v*QMV_zr|^tjRAaR4!gkv3`uVr+)s>Iw__$=>wOa)ij6L$8=Q-E}riP zZ2gRfm|071O`t!13E~j%$ZF8wzWCDH6xyU20kjoQMZ&<(v4Xsxxo= zLsQjMXD=Jt$7swA8vw7Pj&>j!W(T|23}e2vwJM)Cg6vgR2BqTyvOmm==8(Z?Z$#+9 z<2l58A9yb?#LCRWI95th<%%h{E5FU^G~J-h!dr>Qbqoup;LSb7C|wEL(>8zr_SwRwZ`6>>ix$++LS4(S3*vsn1X7 zc{5{FXxeAZI@0kL?onF|0V%WTrF#>( zDXia|;=3u|lKOK|7_vy6m>$sH9+yt3@A%jrX+*f7F3-7W)?BWhc$Ha0B0VOF_KUo& zv=Cr!1dy&i$ZO;adh9TFU>%mDt@|i;yqe&GYy|Ywd8KfXj)Mw!JUPB0z?nuV#pkY| zY(!3EEsC9H;iwbnEvaMIjrYE?Fo1~J*S9S+PYt((g(NpGeqABaf(tI>&Wu!lSsrt( zrlo9f*ntTHWI!d4cbIE0FrHePSzjzpk`fe@*=q{%xpv3W9_beBCP)LJonpK(AN%Z)G_!!P= zRZ}1fcinsw+hgk9=pVFGH0M*URP=I#_@QpKXP!rbHX3RYeoFvZdjp(|zY})0uAlK} z;=I17s2zCxS_<|z=jW`PZezw2t#*<2aIt!PLZi|z3`l3zEb~*HEliGH3+t0?bCbDNIZB2c z@)Ls~H9) zTbAd8%$|{o95j=7XRS)Z!BW_-@ctLAZm>F>GAiv@KpF=|lnb84soFY8$rLy~tQ;RV z%w?k?G+M^uE%ej}6{sH4esM~sR}79`uLmc3^j_MV+S9|n)3u;@HRAxrLg^Yw-I5l* z!UYh%zi6ZqJ2MpHjOMjd|L+-5Fx{j(Pk4Ls&OFOpAg`fLQ#w_Jm@yWw$lgRxB(R2O zkv$VB3PJJor!3XbdMlf|8XQI@R%ukG32pAz>tMH5UoGnzs!BsfY;bmMThTXk*xM}V zr_rc4WxB1AF9Y3c&d;MGW1F!4^&#`^|0XXB2XE`T+GxZ(2>^x9b^W^kj=;5)WJ zS@_oSxIsggO=Dw7?9t&K`*Y%A_MQi^tdPAkma61W{?f)z12+$L*yHs7jKGt41k`J{ z=V83B1Fap8H;*F4^xM~NnSUgQu#K*cX)P-!Qr{8&Ab|F1 z6X{!>ZLKLKdwXc4V7iZ5^Jt6Cx<4DBPIXZ!X)kc)UVv7|g^J1RPE4cgg3a+D`{^XW5Do90H_x;qLS_WzE4+gb=p?sp}E7cNP_8RpSGZRr-+1> zv%b5lYdHdq4{jb_3&GoB*+s(r$Y0Kz>z4L_zV|87i$>YgHw*-k^N@!k={!O8jf z_{o$x-I+R7&kG{v-Ilo%2qmj+{IWjwr<1Xv2wM+E5sY&d^&ItZXKc|!OHmtGfgdJ! zO)>Bree0E%Ch0I?gr1%66hJz7rn={uBPY?OxCEsy7+Q?5FV!I4E+)xVP~gTo{qd-O7mi&Rxs_*nKEtoY33p8(_ zZ#J|nY|)EApid_xATX2JH<BSL52gL#fdBvi literal 1575 zcmcJPi96E`0LOo>nho;`<(MO9BDaJvhS`whN*T+Mlyk0zght*Gxn9TITdN#t@8%}W zId{&KsGjh;-=s~B$LswY-sgRu@8|n@p6?&=ax5d=$u0RRxRMIxMzZFfur=)`er zc1*4vi$4^39R~oAQ~$yR6p_vV0N<=F0`43`+9)2pd(-7iXF~Mm&|Gmdj#{X2T|8;O@7JCnh4ZBKnLoE_K+e0tlWj6=V>Ey(0W*x?`k1E>+gQd1^qx!j7%u+W@ zh|CD?C-agYg5jvsHNXEATyD)DrQqp)e(;%@sZ2)CzAI^B`OPHNdMqn)o1q>`%4FN^ z9HxV5fIy+y(LT=q#6veKwMuR}_!G0J;4_tYS^@^+(*l%7Nl!(5E{+ozz9okGQ`(&E zFUjj>5m|T54!FIWG&8n;*AaLq(Ps(wzK*DC+B-MF2h7KC^x*BvhvZg*2-9OW z?`3L1@`bm7zr}K7g6Cs9hZ=R;BH6G&xZI_I6DYky@uhNzgZL?sE3x2Qa{Ec4@E`L$ zvlUjz;rf_A8$BCwG>@P+oc3Dq3IVCf+Vq!IaraPiq{efBLBvy&Ox0q$zQDF3sn5QC zDN~7h*akm>ii5qx7*%@TTc`y^E)vDo4i3#E9Bs_fJgzTpzOQ_4kSeLP;%hu`VRu>k zk-V=iZ?#og;?J}8?tK*40@1Z6L+(*}^3jZ^8hWq*6%;4hUmyOu5YABBmBGH_S?H3G zRS+-$4Z2WhcE8teLQ*LV1{+?ZSMpsOMMU2apYhKs#Wt*EBlWrhSm893pNq7T5u((~4mxYy05cBF2! zvyJPR0s1&>;&^}|z z2{ln>f=_2v_2GNl8T!&QJ;RHDsyH}q_m^MXXcrRcRR-|s43(ALP_L;GkV=6w_0Z$%w z4^cEpG+ZKAnKhAEKDS8$TVnc$&PD^YCiU4xQ1->TREx|vVR)67Vp@`=&RL>1_=!w? zJWs$)+j|3*t{WV&7f7)NI>u*fTbeGl7aG^$Q(XblL5%}@1|#JdbRPOaL|fC}h(iAb z3+stg4A%NiOm1S&uQ4D>h+LT_MeJ}IC!0_ga;M*pB#IK(7-N4)@-WD@A$!pWYS9PQ zxJHo@O#bv;_1fyNA60}&ucQdvB!jtX9byuF@KQ(OS#JHt!=3E8-~epWf6oC#`%Ba6 U$C*l=3_io?ia}cu&>VE_M}%r(Rz_{xDr~fe=iynj~`}7(TMYE z_tT8tC@2ua5At`0!_VdWL+&Vx5ynewPYw)LDyI`x{meyR3C$TO$Tu}gz=hit>8*YD zq@|zj>QL=G z$pU+kmul%~sa^xo^VIYvC)EFGOS$j$#vPNv*B0jviE@fP=vP4E z&05>Yh;hV1oY6-sk2)|&NHH|7B-MrdvF*fRHBV-Dg-ouUXuxX!1qWQJd=H^raD4`9 zJ#}r&=r~STj}V$QA!~p{`o6b&!No?M*hMaVsfTGHaX?N{aeK=Fp&2AEANKwDx9*vQ zPYq~Cd)79_C*4wv(FHxv35@)U7H$wfqCiav$?rW zdHH)O!~CGZP(y3+PBAv$lvQwo=`7b@I`ex91FBn{EX4&I=uoY-PH9jU(IIUqRGUYA z+fpPa`W2QmuDqk*hP=2^csmS357?MLEBgyC!Jh77J3%DMy|h0`RLhmwQlqtX1!fw| zQu#N6J-*Ri&IzS@#T%=?VjMC__;FXfhX#Yxd*%-~f%eP0m>}HyoE9nAs?rRV*t-(Z z@G}uYzoMcOXAvWtYr4Exx@V%LPurEIGkaH7d;E1c4DZj^IT+RSp2ww~qCjs-`RTy( zWmFcM`Ex!XKrV&RHn|V@!$q{B*wX7aTM4?^v@DcYbu6-9s8pe_}Dsz~JKzGDpDT z(#mU;;5#;iTa$+na@-_ik6lKOyhfuj9oPFPXE%RZNyxNFk;&AZXFot{FbC9^AdBK2 zLjkLuPD(kjhko*DPnHkty22G5bF4BwiurNL}8O1N&1hwvSLjY5xGHp1aQg literal 1648 zcmb`I>pv5E0LFi0a>+qxx;ic)WIMSe5!Dh?*l4YpSPVO^oyA0%qs%2Cp=~yoE-ty8 zNloRFBcYmd$yjcqP&0Cv%Q)pY|HAp47tiy2Up=4a-IMC!c2Y%YhY|ol#l;zc-pErM zx}+e#;jpF;(;J}}>3oh1fU?HFk^xMXHURQ^E{LOEF|3*V;gDTK&1CBBVYXmaY$%u< zEGaRh?_gR&F}hv(xbmVrFBmdHX&Zubc038YF4O46sY|@;A$QB8=5A4a4O#LDFQ9uX4jFLQN_Oo;-Hoj+L*g{8Fa*xixGGTno2cz(TrYhkS{7Dt8IpufJ%rr6m)Ycc-wHx^ zL4X`gZAz=9M4~EeYb4Ef*pn+wat)TeDwPn8^|L?)(j3s6fnwn76F zBAv=Sdn#KeoDkQvuMDZ-U%{(i?$b4DZmiylCJb@I=x6r4udlLcoeKIJpg2ma_ZlBP)N)n_u}WxsH#M z8j0sbEo=f6#}ITUo0^{9nC(F;U`JY0K4%efGc;mVW zWz`{FDqAG><*m0P_}QV~zC5BRrSEWxyfqs-TF7`J6P%iLAx^Vc`7Q5M-;hpUlw)rK zeb3OH_m_JBCr`hqV;9DiAHK`>0FK)2uXl;ic=h`e)fKlRuNHShKT7d_WP>dBOIQR17z-SV)SK@E$(J{ypK;T4dgfEro z7=?&wKVaecdukK?E#&_5$W-O;xJOgXM?nI?kPYL8MaY|02iaSA@61!Nd9c%J%M0wy zT7%<-5{EV6RnRBT3`Wn;!3y^V>9%pj zUhk}H-v6`(FTar{ju=ZP9e>>5cXr#v;NakfM zR+~}wA1uz)a`KEqn?-Dc^TR*-&*T!gEFS`mYcvqAcpzAG#&?JdE4k`WFW3BA=`#hiL{o(!T&G7PYln_%E0{}q6*~t!ml!zlG zi5x$2d8fw|i8|Ar58z^xAm_||%xs{ZLMRn!}Y4GErk?EgI7 zzd4e8CRf(Kj24k?7Z3IXlff3brm7zs?QAvMeAJrTN#}B&OI{BGt1}$SBXqKNr4z`f zJyfHE64~bcR6HxhXhqiL2jT3G2BVXCGz^w)o+|x>$c>|YcskDSzOUlwp_-G{sad8% zHb_a51i``TDiD3b=SBB8R_`I;OWWUDXJCbqn;Jk2Ss zknfz<^>OO&joIi`;;oK%Oj1i4EE5)bUiUkC;v0Ux5LIZ{y$O_9#xkonas_v>*h5SF z9xrif$A6UGy!qWTKxW~F=;c0iDCf7A5G4vr?K*x=4Jb+BYNcVVW-_?1qz8T~*l0|L zk>3aDi~9wP2l4BDQuaAn@k)goDog!ATSm|Wyp8DNYDiy54@ zQvdMMEjpf8Dy*tKBX{jQe~VF>5>s|Z9AV7R?pmoSh@WbY8$4KK2Oi$ge2^2Bnx@fr zhP!fJJ^B{&>Mii_u`y z!+c_x5xhy3t-;tAr#sREkSoiI4;z(=dQow4A-nB+$Z!k}4&$O(^M5t2CF6t!r#HKW zlr2iLr#;oAr9{6(Bmn7Di>Z4H>2&j8-YkR)!DwJCFgryF4LM8 z#@ccfac@{3Ghg-IH6LIKTI=N!(hm13?^Tg=pUG?*aA z8$LTTety?cdS5@!;r4i2-kgoD^{O{!dWE<4CcREdB)s5LBc}YgI}ls??W&AdR}l13 z4U|>|5Bj9XK9P=y*AU{3%^wmrG?*tu|KkB32;cJwGk$R}P;qqgfU~`a-D}&B2mb;# CQrl_( literal 1686 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 TAX#Cb-~iU%)vn3r+TDKu8~E2B literal 1580 zcmcJP`#aMM0LH(_F_VL0xwOfedr}BBRLq*W9!aw>m+4`~$Zh75bTn%rBh0lYmpP$m zOrnJnE4o-2=}454MY(2f$N3x1bDrn@yq_Q6-(H4?+bKn`CKvz!MJEi(bK5T4#Dad? zZd3l7nQh5OVSHi$KwHr`+=7c)wMJ@ea;u^X)L_MuyM6iiiE39%7e!~W1 zg*C1v4$ZhlIM%kdnP%W<@UL83K?IXsYmo`$i!dlr z3dh>oToLtwfR`0W5h!T-sp5o;%sO?|tj+iLPHF4ZscV>PS}J>{o@?4A8pVDec`P?= z8+-i&e@mkid%SFtV@v>}G|(M%*(RhJVla$#O2RH>%Z`7xaywn;{lw~TJ3MHCYmAR; z8Wp~QEFfsh(Gld*Tnd`HB%bji9rR7Ns-b7jbgrU%FOM9$aL~%uDi&i zRnaauI4ptgUVd+%M>b!bGrq(H;*;=9uiXQUgU_yNiT&c=q!XVR4|L-bYq<8WBeG$- zY?mXbRpXEd9VIsTG$9X-8ZIz3V;PcGv;$f>K5=0Gt-+mwo##HdATyRKh~O_T4AKfi zEbf-GGC}7|Zq#>m=~#^lC(CfgPPm!i6So=^&3thFEKs!brzBhy@rRaOT13(#^O|Y; zh;>i6MNGt%jzgg=?>g_|$k)|549g9+K;C;Hv6jBawOtpyDU`o>_|=Y|95qJlF^i9M zoc}zHjSex=6H6*Y)^^nHVs>fNOJC5V#a~OK+C#@f=lAxX%7O7N5%rjrBi0}H`?COw z02+^7N{tpw{)_~7FUauVJ^!8|FKM@FK8vtl0hUhz#=f@UZS z8ov`A;VMClA?P)63wc15m%8@~+R7%md2GLlxKBfU?d?Ubaby z+IbjFG(`XQkh>VFJ7aIe+jSt z!RfD^yb)-#YuSuYe~3U%RXE6ioZDZ~75m;qR5Ga%XGu^+yuuDgp6Ea%XrYVX|2-RYTTK+egA-yqZ{gueL(s@%!S@D diff --git a/asset/art/animation/c01_小小蝶_walking_l/1.png b/asset/art/animation/c01_小小蝶_walking_l/1.png index 31771a84859646af0330f5c27407e9b4c0de2cf9..00b0afa8260f5b9fe51d57558262bf7eeac64bcb 100644 GIT binary patch literal 1670 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 CX#+_B diff --git a/asset/art/animation/c01_小小蝶_walking_l/2.png b/asset/art/animation/c01_小小蝶_walking_l/2.png index bfac318f63ac84605d7a3d7c9bbec42f61a26df3..2c5527b48de50e3f20a06d1ff1cef834dd8df221 100644 GIT binary patch literal 1662 zcmchY`#aMM0LH&42_X_`%CQMcx49+v+q9)wyU3Z^%w^%@FO>hcM(VTH|da2FsgtX73Z)3x+ ze}@I>)$YPE;+>6y?$$i_PV;KxO`P1|*b^kl%=VmI`r#)SXpa9UQD`mEyqn9Uk{U61 zQ#Sva+q@4sX=(M|N*C&Y1#O}xX(7s)1nnhi^)6s4DRa5s$Ue6fz91c!KM9&^V;_^A z8uXe8d-#0KTwWj^3~yaDYBERuIX#@cvbn12x;q!Q(1plP>K0Cc z5gg1_%Av<;cP=NG`_q9Wd>MID(M@bKAkc0c1ytueP8m&#E*)))Dq!T8~Y60V>CJl4S zOnk!q8nm`#h${4=a|qC_MW)uo}SOuSNkh&enmgEYp70UtiLj7 z9MUZi73SbXCc9t?7HV8{z~YxznOMDOVJrluLH{W97ru(CD4ThkH7x(b^T1I%-n;Gc ziKZ<@Hwy*LYckItL+>m_ZMdq-+F&lRid=2oJQft1q)b)Ms^ku%9hqktf6W=n8l2WD z@pR=rzvdUf>v_VMua)jhCKWa{2&e1~DZxd2+R;^7)oQ3zg=3kSaw);?f_`X-T;u6g zJ&cTCeIaRdF-qum1npacx92M(wBgbnE|dz7HgOA+U+b7jM{$m*wGOOPs?We|ADo4_ zaK-AN296DsZrrV?{@gC?aT>AnWI$eEZl|!cZUhMU(9mI{e)H0?d2ou2Y}S6yF2B}Q zGgIlOANjOmpWVf$Ed&OaF59G1VYbHid2y0USTUmmeZ}cTLW%6gCVr%8Xta`|n{4Dm z>d%yd)CacxLs;RqUxoX8ACmQnQ1`B_TF1yNgA%kg2Tty0MWWsMUi_SnO6M^L{i;X6 z_fg%EHp7TS)shPl8v2PVr?C_ph~u5!`Gxv5PrI1i%*0~;S3{sJqNBy{)TMI1wNyMS zuVbLz&|+#VK9ig4+vB1>rhS7$taHU7cin@m51%^^#@FCy&70oNCQQp6XI1us(3r{b z`_q6h%XxGs8yJjw2~bM)wR#9PS0c@CQzO#pu(M|>mo~*$M#xg@X6?oJHBnOsi@!5x z8TUk_UWzT(WVIhQ9*!wL18YecelL3#IfOw?Drryagd?)eq2G{o0&mx3$S-D~ItBs( zGc|=JCNCYVU}f5UY9@O@~ literal 1646 zcmb`I`9Bj30LDicYAr|WZcL7a_2w+XNUqIVqtTMu`?^`L%9xnzCFM3}j)t`mR>WfE zXiJ!Q5t@2g$yseVM$WwchWGP+KF{-fe|estpLOJViluN(t3Zx8A<2jTCnDS)3kH5%}#V#{KV-RID&D zrNKfg2D`Cwx1o|R&o19Zr#hK(;o(k~d3%;NF2P$JwQPlS1ffa`y)*Dr&t~FMU3rll zl|s0gybHowW{5isLsecI;?6+#Yh4ZAPP|193+pLqH4EJn^S))pdLGR=OO8Kh--0a? zyBk1*?*2pzqi!2T&R#b4Wz6%S)X|=Fr~3T{=d&J`d!b$9t;}SQI^t0`&+&HcL{5(O z-brJ^6mCMw1_3|t+vvV z@aCvR2(vtNyb-aCZGAgCs#2L6SoG6!HFz>3daBScMYKC0$JFhOxM6OJKgjo1OR8gY zw~(eR_316n2NM(arb30@C;fH7UkHE+(#2id>k(6#2oy#EkMArFb0;_jnXwL?I{+u| zns9tq3QnHOrM@)3)m7Vs4@m$5aw-CKov5U%+a2nOTSq#N{X(_!G*jDv+BNr+#FpKy$1&R5! zwm=HcLfhYaI=k2Y<$mwB8k5MR(>q@nEu^?T=@1HwRwu-~A9tcE<}{HwJ2 zRr@PHf8^N6Yn%wtzROLJ4i$;oNBnmDGmgnqq8#aC z-l;isi7!oseQ)U^xOU!A)rga%KSI2f{oj`p$FP)Xxj$@a6E^x JW!YSd`xn%i7&ZU^ diff --git a/asset/art/animation/c01_小小蝶_walking_l/3.png b/asset/art/animation/c01_小小蝶_walking_l/3.png index fa369c37de1aaafaab5ebfde08f99ae9efeb0552..4c5bf44b0a4d671631943847c17fc194d88bc3a1 100644 GIT binary patch literal 1722 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 diff --git a/asset/art/animation/c01_小小蝶_walking_l/4.png b/asset/art/animation/c01_小小蝶_walking_l/4.png index 0821f0b82e0c622f86f780100f70058a69e08da1..1a0acc7f0b70489735005cbd71773f2bd810f852 100644 GIT binary patch literal 1675 zcmb`I{Xf$Q0LQ=F&Wvgu^0Zy1)jUP{8ZJ*|XU!OU;G8-_7_&?sBGs}NM`&Txx@DEf zN)M(yT_HUPn`cTkM2X3nzL{Q0I-?p?M2&Q zz(&q!Yi;y4Z|>9vG?Hlq98leh{0IPAc%qkQ;7Osf)GrnpZQP+QkzF;Z75F)|$6{^E zjcxrH13Mtr!P)u!N8B#rKKEBBUot)2^1_VV(`|zxAMtVDKFb;ixbgBwxL#G&D?MVV ze5dj(R%M^=-rdnV-%Gbp)-FE@xNf$)X?bCOX=zl!z7|7|!J0#iO>?5ilhn*;z2_h- zLhx%12^Wkp-(9kmPt@+(`Ro6!lO9_1=S5$EuYZqNb$Lc==tG+b_>AJOmZNwp0SKX# zbGtorNvaO2T}*q?2SbF`VFB)zbv-bC4vh zR0O`f4KXN|WsP|25@rYVPdAP^`#r4bc5K5=8Tp&Nkd^9=WQ0QwpbQkfA;iQu>O++N zVmWJ0kad)}`<*i279}kBDUYo>zCii}uVfbo69s11T9C5gR&b$u7Xa|XuvZib=wVf{LmKQvZ1)6fb72JM!El# zp)(ul1RQ_@Wcr@LkU6OY0tDK$Ofa!KO8N27fxO?EVK*%TtAr*L<3uxap@@?lwxdMZ|?n-+Ha3TOen8Ba!X6U}+c3bjvstRRF?4+dOSd-!(M)9`-yFYKM zLads)n)YhCPxu$|<0Dg@e$Xr4fpq|{u7VUK{scp|Z66&8${~^DeNKk_S$iw z$sVd4R!Hhxx!X`X$F3fjs(l>nca)2hsU1G{#5FFva_1W3;Mr_11c<+{|e5zE_c(5jE z>Qnd#_I_QAHp&KEmnw%6At`HOCU5+Y)eCiWLvsYE@iZ}fGdz-|zE<5hlVGRPjO;V5 z#EW$L#}LrR?K2q^h0D!(FAV2=>yb7EA!h8tC~IOLeDbZ_8k44Mmp=crggM8R+^fE? zB_^L?o8Yt!e5Wk=W4>D~(v*BhN5EP-|Jr%ZMW-^cS@p4Sfo=x{N|}v6=Ky6RaV$eo znp8D})RBfP-0n7q0QVcL_PX7C#;E5|dc#6OkaE|SS*is zH0p92+akpnEz}8t4Z4=_#Gn(w(ip@UAx}O(dz(-lez zraUa70(UB^*Y9Lk(wUeEHu|SAwBFTXDh9k2l+e~X5X!CFF0QQLlFEEzDdAstEv)fE z@fc6&A}(T)K=hG79;54~q7DvvUmRrm^a<>9Yx-T+N&$|%Ek(RuFO|ok_9PhByh*5U zJ%$S45+0Mng7)XAL-UWl!H6DIoU#E^6=(Ht*EbGrAy4zuX-DxnTlM&lS30@oLZirR zw|{~^Kpy6vXC+&%&nNU{PPX98_Tj^{*9Pd2pV1*sd z@_K}zsy?Hhzt}&5k_btc(xZ|^oBqQH7pZ}-ghv5Z`KSCg-UT4y{k^Jj;hFye2&V@O literal 1638 zcmbuA`#TeQ0LH&aE(^JhBb~BZ78aE{F-C03G|iaJ<&e{v+bHSK8tt5lu}FvIuH_Q) z)NwtMF=)BpLQnpC2p^8th_qjhED^OzhdRSt5 zO2X5k?RfqinFZ=@_UlgVnvbikXgf;u)SZ`;L;l>U?4ZD)!uoQ^K9oYWai!=?0EVKk z2|W=PuNme!u5JM@d zUgc8J3OZ@q>^*}?SgyFK@S2503(*FBr0Ydg?0~YyJ|VV=94^p3mOTy`@uz=}k}8AI zo94_vZ8%|VDV1lsrjp!u;>V*_y1A0KUBfbe-kZ;%7R=eAike2!!{^&CXYI9t?=oND*E#%5e1D}`*$1cG8{LX+<}3D@iR=?^ zWE@fMIa4hXk?4qXWXN8rjzSYG`nuqzJt{B{` zw=zW0w@-CNZy0qOYZa@+Y`jYsSEI8Oz@_EsW8YUkSflAOIA~rle+2+@ed5q4Hoy#t z6zQ1Y>1wD*=|b;?(xJ$pTa4E;g3m}D?wvU5TcHa!RW!pEwjODZxf`2h7-=4RQBGT_ z(R<=ydclDLy{X}LbtybQ>dmaSkK2sQiFQbYDv zOp{HA29D%bVLKjOM>yhkDzrFr1`>2xjZRxiCj|91&|N-|qK*-{HVo58Gqoi1qd*Qk z1K`+(*~@IvzWYLn0=tB?tLoY9Ipx~0hM8rU8#XJ!cGi~M?q>pJ@u>v!YS+k0ndT(u`>>>Mih@J7%}FwgO($yzMQqpPGvvd~Ubz4*}nYg7c3`g1i{yhi(j*?YSiNy;R^CC--=5 zff~z*?eTd$u|&-T?|goK`n74D!d=A=kLTxCN~O3@E905uQQm6*U4JA4Ss zw7>4BUy~P&qFCA4*;(*oK3;@Piq$s9_&{Q%_nOr|pVw8PHhAA`L|pm4?=DlvwoacI z*SF{!*@pTdIIGIso`ow4Hs*b0{M8g2+Czs1J=|DWfo=MG z?j#$V-Opc_l6KTVNY+>EMZe%f`JVCV=5cQQp$s>1C=TypBnWJ^-fzjPn|f5mFLFX4 zHRBI$&q>oZg-A?~&I3!}mw7(t{mPHk+yjeG>UFvQHWbx8NQ9JWeFDO;#Jcwo+7A}r zHpuuh!=~AllTY#_%hy{y`-2~Sn6kfmKZmq96wDZ|ACU*Wt3|*1T)KNDAld-@Nuh>AE_@%#xKM idjx{SN{j!58}fFc4N59&a*)mA0M1xfOu56EYySY;001xm diff --git a/asset/art/animation/c01_小小蝶_walking_l/5.png b/asset/art/animation/c01_小小蝶_walking_l/5.png index 835b2219261ecb369a2d33af3e942fd939d611d7..e3a7ac7fd28cbfe1171e771a1ffbbc2e8f953d93 100644 GIT binary patch literal 1732 zcmcIl{X5eM0RJ*Cv%KAT$vcfUnJrDY+%=k+m%KMAlDs?Za_4O^n)8+wGE8PhLztZ8 z?Q(=tjmCLdR`b$HPMI-M6jwWc!#&SE&*$ZNK0kbZ{CucBUM?ySJqQ2*DsHYgzdb*- z$273Qo@%+~zu7aH1V0xn(DJ9jG5{!Cal@S;T&`TL^v=`wH{kY{48y{s;6lq4!PHN5 zQI~r_*DV6%+HY9rM#bZ%Q}#N*4m~b{F61$e$~jNKsLX;m2`U}BfID6{qHwkWc_1t zyWR2m>TSa4EPP_HVgv-7<8VXBN{83}RI@m3?l&yHYQx}iG+bi~7Mu0zrScq#7O0Dr7dc0GH6d3a2*WpmibelmXv z_<3h>qwj5lk$nsjgG#FDZMXm>W76KVb>+5D;zpkJ$ zX=?y5&q?2v0s5r|-*&pa@ruY8DFwb&pPqh)T$4 zl6CC4oA?^Dsrs(;#l&oM^xN5Nh_gLo34d<|Tp4GZ>7cHu8}q6r#~p568b6Hj;0MnT z`E5Q(?R#mf7O|ash@Jm1GIA;O4t}FZSI|6%)612rf`K16tgx$|mi2f5;CC2TsE8?j zWZ&@6uNLYXvE(0$mz~CzusnG6OVj(XxyL8#n`#0%^KT_r2JXxV#HPQ<@7s(Q*K+F_ zH`7bD+S+yg5kxy2U>dvF#!(inM2XMf?ObF{m9a~AYhjT5uC+_tmG`E=t=2YWV8~Yg z&d!HI%3}iB;B!QBtz~dGQN~=>$^yBMf!o$eSf0F1?OrzA-glR!www$%7V>Q-y2jDI zXG5H#!X{Ci7vqUrnN9RIX`no?q}n^LRp~%hxPy?Y-hG5wDDp62Lre6XB9nyL74Bp$ z@6Ny&!9~{}w^MFPQ`Q22fwlB8N8Y=IrbA*@E)Gfq=gEmXP9q}sI`G8c?7o@R&@q9F z9~)j`7*ZjM*}_t@Jf_l%hYQ#pX@gg2@n-hveL`YQ;GwIk0AEdF5U=&qf(gHNiYV(C z)Oe%ANUYzPkLu``3xiqHJQU=QEqm1a#Ry`n2CS&iNnHd36^K{!Yye4^aazb)(8sEk zQZ|;f{5nfV>mFUnaYNz2OV0-h5o+O4dDy?19d@F*$k%)*c@<6XN;P{PG&9nSN|hhP zVHlwcdLPH%M{)8N8`+M&mZWQo_3eZ+ia>sVIOm&h3^@e!w)eY%F0R6Z+4HNdCCx`y zk`N3pl6wbWUV}H|M96~Umb_BhxlhYawUk0u1o{4trYWn29w+Bd=O&^X1b1bCvZti` z&Jcj-X#m9N&Xv4@BwsS^!T6cSJGt63P%VT{iE# w@8Sc7G!I_1uA31RSZ@=mj}iaFdKXD$DouAngMN)y-n%8h&Djgrg1wOWFVz1d%>V!Z literal 1703 zcmbW2`#;l*1I9nd8gtvG?1;>Kix?wLsv~tUj6%L*M&l#NmW@}82|uPoU?=HF3;{N z0Swx8Ov}KhUC70II@tl7UY%J000rV4e)S?2%NXY(4`4N4?R>h{lw%$7>b&y-XNd7L z#h+;|_gOAT0*y-RmQ$-rh3K4NHOH{`6l;K$l-&H2vS=O{4P&zu4eJ4v+N398gnGy8 z$Q5{Ht@vxOxIOSRukJd$HAr;!(FV?B^y9^(r5=WL^#8=#!79}6U0I)>huJF`u+pLD z+p>%T9d4PUToBMhxmhqrhaZl4sFne%+@0;8Rvm+ZQ>8Um41`v>H?u0+E*52-j-$ow zJEr2>v?FI1hnL@$fF7zgYbA5(aR_^I5QVDJmhO5VNf=@ZV8-}o=9<)xf}aj6zl`m> zI1BlJ+vzEz06;Z)vHAVI70L`aC#=Pzcs|^QJfu-gZ`qz_E*yD#r~CYts~-8C$m!ZG zgpGSay?R$s75JF1Jdi#_nd{42A-us3d=V8{b2q|VU! zJ4n9(2yt=9!m5|q?wYhdK9RkWM#TI_8NT*HQmtFPIu8c8X%xdnaY^CA2g|(x;66X9 z4t$jfF)4Z(y6yc|DxCiMX|BD~Y4^x=$^Ku6Lzqj|X3~^Zfmu^XjcXbMUe zf`A!71MHeM&DAViVP4%#dL8!4^=)05k-gnPg|9fc55>3a`~LO_3u4b>X4K<|zI|>0 z3VPYQqkQ(Z-vWRvQ~-$L{V!Lp=!R6S+~lw>=+%fbBas8oWDBwmRG}6Ry!X;fNA_& zp%3eDyLs94^;Hty7-w&OD|~d(MGtrrK2Vltxa5EUi1&8h*Kv1-$KbM!29q=0R~0c6 z*<6HoY0;4F#>~OqQ?ppxKz=@novGKlp@xa}UHe-YDin3aGCd#Z&vq#L7~;+U`1n@O z!zi!JV=0;f(+v$uuPFYEuZTT9xldxYwT^FE`!4y?Fh1C|lvlw9JYxK;*|Re8@~3bN z&!MP}xB*k}kP8rxsBGkdq<4vucxiZLjuysE=oa1TgU9I4JnBnJB2mv})=@^fk1oLr zZn)OSS>s2m#l39 zO<<@_2$NV+QOOBaV5s@akrwI1X4G}(!v(W6MPT)A8tL_m;S%!rs21m+JNcKN=1;)> z5hiYrlwFF?94oa7fj*$PFTJ$zD&%Zo;%-(UMI=rR={4>w|E>BwB2Ftg1iHUZE$pQ; zL8YB{@)F~BNZ8oiaCDKgA-dpoq6?UXX7s#>vO?i-ETRKFq0LU%bQ=*WH^&cwg^kJI zeHd{uyFbyl3;yapjer15UA`?)Lf3QY9liQ4@c-7=-EEHQI+W46cH0u~QjU!X-e5q^ zx0^!^&^Wip^r6q*CW8DCZL7SDNh~7tT|gJ9X{zMOvU8*)Lsr5~F;!o0Y;5JtIh9Wx zW1u4tQWgTp6QhwLn#zdu7DW5kMsL$k}T$+E%JK??b6S&{S^UpezZEn3V5R3 zXdE)dc0OZdas1F+gEV_uzV*#Js)tUHJWHUoyS; z#a0lTI7@abcIzHAnDAuSK(e+CR`wE(f)CWEK-{{~Hb96VP$9I42b@4fB31mn1P`E{ rt^!B!R_tKdB&R2^-SNj3`P<&~&Becdkz1VKeI5XZb#vg@1*HB9Apa$q diff --git a/asset/art/animation/c01_小小蝶_walking_l/6.png b/asset/art/animation/c01_小小蝶_walking_l/6.png index b80b111f2fbcadf266a774b13a706d18a658282d..f137f95309cb371b252be61d3ba0b281dec41359 100644 GIT binary patch literal 1704 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 F{{iZC`)U9H diff --git a/asset/art/animation/c01_小小蝶_侧面下蹲/1.png b/asset/art/animation/c01_小小蝶_侧面下蹲/1.png new file mode 100755 index 0000000000000000000000000000000000000000..0d7e13bc63201ee6e10ed74276c0c45caa2a83fe GIT binary patch literal 1508 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 Z@02kuMrjMZrMguBz_|IMn_Tgk{{V~XmtFt> literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_侧面下蹲/11.png b/asset/art/animation/c01_小小蝶_侧面下蹲/11.png new file mode 100755 index 0000000000000000000000000000000000000000..0d7e13bc63201ee6e10ed74276c0c45caa2a83fe GIT binary patch literal 1508 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 Z@02kuMrjMZrMguBz_|IMn_Tgk{{V~XmtFt> literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_侧面下蹲/3.png b/asset/art/animation/c01_小小蝶_侧面下蹲/3.png new file mode 100755 index 0000000000000000000000000000000000000000..7e8060475161d0b95239258d14f8ca803ac01f70 GIT binary patch literal 1538 zcmc(f`#aMM9LK-JVQxKzY`H9{t-`QHE)z;FVU=~EOc+C#jbs;Q9EVEcq+-m-^Gqv| zB=_6gHBB7MrMcz$XH}*BN&o<;y1F=e zN{N+gaHh%3c~d7m^(bZd?(IC`;Ke znkbU&VFSCI*wst4(ohb1@GC6dat{3rm!Rr!7al&5sjzZDakBp-Lc7^f&Xx+cQLI&r zr}i}6FvirW`1c=Q+J@g|ReG;RQP&8rtQtGC8{=rVmeU%{I7YH4si%$Sx30!OJ-8JF zapUE)X7X6~CJn4d}Bsk=&s=ls0VwXM3NC%$8^x%rn`1uo$SxZ~@< z&8#53aCWpLFoR2f=;r1(W)RqS10?uf0Qn_zP3e7Mw1O@sKa>~i<}XYC^{w!3q&TEg zJm#4>&bIVgFaN9DX!b>)Gi|P1tFS_5r$G<6lRLQF$H{1uqcTVUuIV?cRi|vg&@5)F(+({8jQ&sf9kr1pX4?D>uPU0zoI9n(PK#eZ^4O z`O|vnl{453OK>WvQs23wohD9s?p+h5865He`YE?qId-zZl-kP=?|)J-YQ(bas@oZoMw)5S!$qr0Ys|AXy40{%z~OiQyzH4 z3m4ksJ8ETMCgbGvL`Z3!)F2AvDs8NRBhy{hj*$D1a2>ljT84T`2D56^_x(dAvn1N* zR;}VYY8cx50LQdtCT5}_I6f`8?F3>a{h^3RIlU>yKoY$>S4)TI;kjNqNXU_GjeW=- zA?{us{U>|Rxs!f+T=@w{&NMP>9?rB-_F<09D^=i%SOXvDy3Og%3qcx$Pir4&dcGFP z%&y zO1Kv?ftaMGrIPU7CiFGr-%*Hy;E5D?{mjPAOHYjG~$-^T228q1-`uaMY;`pp_ zQ1hx9ih*2{(1jbH=atMVlhYHk1uwAe_VNBthnZj?j}jcvf|t;9m#eB--WFC_8w3e8pEmePORKZX_AzUFLt_-xB`Es{6h>Z!^QeW_Z`AwA2CDGZ@F> IQ-1OP0Hz7H4*&oF literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_侧面下蹲/4.png b/asset/art/animation/c01_小小蝶_侧面下蹲/4.png new file mode 100755 index 0000000000000000000000000000000000000000..e393ef4e37226786500669fee22bacb349cdde94 GIT binary patch literal 1486 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 literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_侧面下蹲/6.png b/asset/art/animation/c01_小小蝶_侧面下蹲/6.png new file mode 100755 index 0000000000000000000000000000000000000000..69c0da678950dda6b405724fa79356fc79648db2 GIT binary patch literal 1483 zcmd6n{Xf$Q0LQ;Yo-#V8!clZ0hjQ7aurYbsd6?#2!cJy4Pcicpqsh|gEDkF&**w(c zD2DEpc_)HdDuLhr`Tj{jE!4=!~JqUd>(%Mygom?$$q{bAPoZz002O6PgkTO z{S_jrsVMxQXWon=)Z;yak^o@;*I%>;xJT0ifPEQoSJ+PknqV9eRTgg8xw=vYPUD~1 z9c7@HQzK3jR?SOc!6(`+`ajbAPqY(8+>*`NHn0-KrE_$Cz7*n6UinsSBHSp5O$<@qRe(J}tYiV0i z-8jpb7*=1TuV}9C6nI?qGgAyq9?G?bKrY94ljgMorcPFzBfqGR)E7xpow#ePi25J; z^6AfkA>;0T0*f4bmmGVD)a2itM>n_xZB7jOjXr$x=$&t9wjCRbUom#5^TPtA&e1{- zMCOp_xE79dj`Ci_8lh^(6R<@wFY;_N<@SgP-OxOY=S_;Wp!s!P(;z}7v}hGqMD8OF?{FJ?N{k<%+De*y-hx@~Z_s8cQDVYPSXLM{uIbI> zWW1o*ky6*+vlWhW%aMSE5BZs*gvU2q;@rbjtXE3JIoXbEp{{T+HbnX<&c!`U3v}du zU~)o|m*1kdpkV$&OWJ;5r97<=tyhh6=$KeG&t25)ml&N52^rqrm{ zF~H>D`rS!3(o2O2Q*0{aVM;OV@N4O9DK;dr<9IEc$e))TKAbiywU{dlqP{EO=7 zq0R{KguNQt#Mf@I7&t&Y&zjO$D_ww4W`qe&~Jc>a33-FbYmC&Le@oK6Ea8K`#a zl1gOs=BQ05vD2AV2@G16D#;Rol+|9vW1)Tx7o3AUw1)cRT8x-C@ literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_侧面下蹲/7.png b/asset/art/animation/c01_小小蝶_侧面下蹲/7.png new file mode 100755 index 0000000000000000000000000000000000000000..3f62fa43386cdcebbd81ae1ea52b50cc12a21466 GIT binary patch literal 1487 zcmd6n`#aMM0LH(>&TNKLiaBQCxM$2I)i}&0DVI)DXGWfpO=0Y$T!%%7Mm2_{@w_f9t;2ggwF}j zGrLLH6$1*{_5CMU;BKhVPXxsS0DRxSQUdOAbpb&2nvW+wFp0Y`?iZs?(G{*J=3^2o zC9#dcFjXV@DUmo_bI7#7sUXSS^G?pqysj>&8Q4A9TbhR+gnMi1scVJPJy-?@LmeC; z`+Plqq~nb&9uB`tXq3@7D9zu;7T5Q5Im?n8lfSWdO03gX!L$j^`PU@8*8Se18>zsY zMYpyuR+Zo@(k9scZ}61Zh3P$TRi8Q3#_Fv}J8j7xVK~2VM48rlU|gtzts2Lg>f%>( zM{a#uBO?@+Pbx(W&)38#J&A%)p->)1QG*+@ia_zF<`I;s&}pg7J-DGl-kvB6OHbQ& zlhKT$qa<*%!ewc#&5#QOdiVoiezzad>Kqm2%hXxVrtA3Y8;){o-P<-r>=fQBlGVV| zEHq!~fFUSNlE@i+Im3V{s%TX=SP&QlH$4WWQN>I8g>^{Rt-p_A6oHd#)-qw=?e7XR z{#rKC@M9k3zFD20Bm-|pT!nG%8rbA1n17vOY9AeG!sJDF4n!>T$NL4%7r3nncN<;5NN!9~KHDXt%x31$ z!hr~LzW|Unk&_Xp*X)wziY7Nk&SWsm0G;-o!gW;hW3-f;PiqllR-tx%@7oY94h?J# zd~k;VoAJ||^3L2%%FKt+^*(cB_7@M=1x_hE?xt$P;u2-%6Mg&h&{SiE_k6*4`PpFO2B)vfHo&Q&_%+JsF>s4E9aCdSxDrr*j#Fu!gL zm)#6FUf&ilD}~~<=pSpJwXCmrZRaCv`(IN+O9`uJ*i#-)8?O4TDL(hX`=)p3Fj>pi zSG~ez5pqofDs0a{U(~RUzW-qY`MYSgHUCX4(86G=png)El9N+Mu1HDCr4HB*+#^-D#g&TRH0w`=9^JM#0q7wS^nE)) literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_侧面下蹲/8.png b/asset/art/animation/c01_小小蝶_侧面下蹲/8.png new file mode 100755 index 0000000000000000000000000000000000000000..e393ef4e37226786500669fee22bacb349cdde94 GIT binary patch literal 1486 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 IQ-1OP0Hz7H4*&oF literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_床上看书/1.png b/asset/art/animation/c01_小小蝶_床上看书/1.png new file mode 100755 index 0000000000000000000000000000000000000000..79d928ae51a82de0f7ae95627fe79a5ccc4b49b0 GIT binary patch literal 1804 zcmb_d={MU80{z8OPddsQOZ5@VGtpYg5gx&m(paLkS1eUaiKH5_grE%~Z(g;CrK%BI zbhA@iUrH)@h?b(ELeVNpV_s;jMIspUC(N1oaPK|mo_o&ycJEzJcV`9gPhbE56p$_m z?<4g&0_lfiN380Svv4Hxu`U4w064DvAAo?8GIanr#zrFSFDI9MExCFp2y=?eXfv}} zT9M#jQxQq^8TUiqKh<}_>8lhxk$HK>NkyMqN;%oJ=H2IjH`;Pq@1a;a5EjrT_hocl zeay35ue&_0Dy}NJ{X5Q@^=IU1x|tn@7%5JP6O@&=*_g3@vm~$|>|})9Ufp}Uv9XxS z;b^{A|MlnI%hMoIg(sa-bIJa4m5zarQjz|hH!27;_z_Ij>%X-l#!iH)R4nI`Voqb3 z<;Yj9ehq_{c!|UCg3;oGoe0Xb?!>@HLzcXUbbW*qCBDg$`0+f)*P-#A{FO)XO|)Ia z&^McWb&T?a@p*uAxSm98PhIspsi*ZiI1YDnDv?NJOyT4fgG|(}3kKsj1QvKjNyv}d z(NkN1HyCbaV|c(ru6@CW54X|L)BaFG8w6Nmg-AkIUeu(wLAbn0vM&teekehY#uai6 z=#1?M!uraodUprZ+4D+_s3GlO$$Y=*?7?UZaIL_el{&jHeH;}{eY6lZg14zyE;%ar z%a!4Bmx}1u$Q)A?sp;wqa_Qi_AYMH@mSCkE#KGs73f^t<)WdV+n?fvU73q3Hj~wQF zxG()y)1Ypird;T34+WI`nX6oe?dlC7gnWKu_bfIhT0sm=`%X1XZo1({uQuLnan_b| zFwHwBhVRiH^pLBnVqrdTd@fG!0+Xl+mc3N%Y`Z!tOaPT#TncuTP|aH$1R2j#RmC(l z2EX)@>L%-4RMyJ`bHic#H;Q$&*H>~ z>b2p6QCc+T8)#WI#nw^m=60!Hz|e5BWX%)^=15%IK0#N%WXqAqUs03vjZEy%n14Tq z5yECj6`vZxbQ9ZrtYS%`ZPbLQ=b_b69t_Y|5-RYSl>wQogWl_0n_NEHY3rLia zu}!;XYA%#v=lL1fKXgg4=vcy;f8e7~w(G7>^}&t+Z0{lvWWD2EXV|HFe5A6!m|YXq zh)l8YXdM4JylQe~Tc@tZ2?BP!$uy8*+f7ww=HH}CyEg~kbv(w-W5S!=qWHBaJd^D5 z_u$%g=rhK^Z(pD@7^&oJMR<1d5QDGVxzskMelcvgLVfQ#_mQFUjDkub9|rb!fur;nfjuLfHB^uvzi(R3KXsN zqx^EBO+@Qhvs>ug-c~2%r*UdC19Hu$&w#%AFaco~Dai1|eG%MRFP@602mbQX zt?oHxKg5=Z+sMfMqYh?ATCAa$ufIrLdOMP45(4O8Es7bXk0-!DS&<^%-MHV>zlaVD z51IFg9D&Y6M&*>t7A6~-)%RC7U?l|vTA9R1g`py|2Sg@UjJ%98W4cmAQoZ7~KJN`k ziAsx;z|*=kA?c9UN|nolFc9Xfd!0j;X?umcNz88-FodnSZuVQfnNDq6X~~x1*p4Ch zT==k5!fwBpbpFitHGAfa9@e4Autqj!CQ$G+H60)X;)?U1ty+UigoJ`=#UDB!oF$ zJaKE1@(W$G6vFx8pQkLdzNRV;^8+}~yi%qbZ-FC(H+s`5K8$s^HFQv literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_床上看书/10.png b/asset/art/animation/c01_小小蝶_床上看书/10.png new file mode 100755 index 0000000000000000000000000000000000000000..0a258e2183a31613fa6b8a60273573fac0e72dcb GIT binary patch literal 1628 zcmcIl`#;kQ0R3Xo6kvY_5gH@eG_L2UdCcpg60$_f?yxI8rg=4a zg-NNHwp3K!RxNqInODno|AzayKb&(upL2dVznzorj6*9aYAXT&poFnUxooQICgQis zZ?c9xUA!saaC-t30JcH?g$$5apalT(${5rsH(J3|{^PswSr8zKr}+!&;Z_^9VriOU zDIe=;W_HaaDbIe%t#En1uzSkd zM0YzrcVK%Nwc@<%RXJ0fL+~S}i1whb9S%@Hh;?ek`80g0elzxacTYM<%f#?_tsjRu z)^7bi9ns-ydhtA^GN3H1X#azrrZTb`9>y7{H-B);1#V?te9PrEE8jK0o4#E6KEsdP zmz&~_D{uqCCs&T@B+e^PqOET9_E&lMoNH~0ize7XEt!v4322$5gYEz@H?%zyX?eA9 zW=IZjb5IsClIhV0z$-ukC~NLud5 z&ez*DUGG7{SZ9))$jI)S+?<)Fw+2lf{KcH+jX(5LUOX%_*Bx~X=H`I!m?7;@83@>g zYH!3fkQ1}t`M{Z~K0OxOR+g@q)jYe|J(m?l8XHVp$(s8B|ApDG;-<-vg~|GwWn?2q zke($qUW=I@*IMG^EE|J*`XY0pKX;<&{}y!&ptQIGgj{WfIHQj#)ix zJnj?Pxh4YB?fe6_ zP`Ko>GIPh&WLlWKG*x96i?{nWVdL%kwhZ*aDa>^hl{0%I7Nlz}JjRetXTht#dYw_; z>aD4%&IBs2Hj14mX}HuDXWE*g%^(n{we-~0$)JV&_`A#3tsq$;YWHC7iBctNV_4)D z%+gX=px0qRWXX(_D%e;$xv*6C7BnPU`}ti0|M(#BvuP%;dI2{Dhy#bz+3UF^t?NR# z#E90WC-RhJdbfdbuP4|J7O!N85{VHqA(AU)T~9jAgy<#c$|YHLA1+;0XeK_fT8Ym- z2a7$H_F-w*kGOFP%Ufs8Ju;!QS6LGbnL9;WbrUMYAcOabWnc8wh>IzG{Lv?U{ex?+ zq15FOUo(?OMTRa0F&CG+Si> zE{$R5juw~cUB>K_Q%&!b2Z+Oke&NZEGO|gPJALq;H`!;6T8zJumhYF`t$EiepJo4b zMl{n35XlibDtbmCt3q6h0Ss-|CIbu?KjHmOw_~>&NqhzBNgimcW z3Bc@>{%Ukii=wJR5C4PUdGa(!-YpcJFpL5B{*7GJc&s&w15K|U%C+;ofDCWO^zeVo zWt0LX^DR9W%ZsA|Joh~d7lxpEI^I#Qb=NT(ZTz*W4wcUc>mYcq@J5!mE^}bVf8Nmf Y!VJmEFvT_N_97={Fmzo%1<59<5%t=EB(Q%nL zO|H3@M8jMsbzC0zxrG*roSnbnJm-h^=k+}A=l#Ry^E{vD9dCE}f*eQ*1OR}XH391& z;uVo1q$Nf37$Ip&1eqX$3l#tk$p0%bAS(w90Q|<3M;_M!{V?75iYR1v@gn8-; zX&|G*VQ0VorGTvNm0&c{JJj3c5_3Im+qp?Cmg{*)tvMofyLajBtusnsL|K9vV^3cD z%3-EnT&KcY3g`x6zacB;3DJW1r~3bC$Jg$=8b>sZZ0FBfkH(U;uQuJ}pyz8sE zMhPU%4d3aT@}>A$hlNEot>1fi{Bz(?U6tUcM279P(N3NFH61E=DK{PDN&8RORXD5Q zN2p1SvLDD0&p9pdN?952K45D;@;R_fuUJ7Qfuirs+4P5>uBX?KDB7bNFQq4d+hZ>^AA>7m;jHNQFFrlgoD2B)DmvRFVB)nws`%M$ z<%9_8))e^JuTUp6GRbvbliAB`+%ST*<_GTx70*BAs-IvAC0EX?29{!H z>#LyW!V=PY@wN0h%|Ua6SzSf^-vB5`YW-37r1+SljLE`ZE5mZ45PXHFpP0p!J@f|= zqlQMA@JGutNbo|h0=za>D%Hd(A!nnoKsS?;3yFVdqD(~6Ez7a3URMk=>GC8Osn0b&wjjGF>v%!q3*(BM(LRcyk z>ZSNr?54I2k3Zgbp(@{UHl}8rgK8M?5v|B|?uu%5OaZZuz-NYSjW5jb$AO)tLTZt&?cYSsgaso z`b?niahZfJ==E-%$^q5hZwu~t$>L6~fGZ2RKF#yMj8@8(3-@F8S`9yAIUA})mV=bp zkwfGAcqA}oTu~?N+p-}5htcnnwD*!vRX=~GjTD2+PhAQFY#T%39QVi#;mNl>?1WlU zUWl~{BW3r-lxzYwu?&eub$*?uY*;NC2ikALB#aO`?@|zJa}aMIxXRq!2NrY`YR_?f zQ(ni}v;mfn*WNnulo)uNQTH)X%i)#-8r?+rLa(^%nG|$K^qvE&atNZg$$v7eAninL`H%;F;%t|SkSF1RNGd@NTJ&>ZrGINhabJQRhw-_ashlYk9HH}LC0n<%KnM6iodzx8C z^fsy|3m`^_)P}tP8b4mz->V2|7!o`aL)P}Ch$pGi3f$n_s>0z9rn$Qk#p#g4VT@U> z0c|wA2=CY>t3UQ;kUi8>=Jas1s*Y5FTT%B4uk__li@}kVS5KyAn|_$!YAGvw85?(% zRpj_9sPQ&a!oWtWVit?-rRZLB>yoIFBbVF#!qb5W^v~3NcJs?FYg^^9UEGL`7PCSU zj{SY7U1`o>n6~w9$UJI5@I=EEdJnNDSWY&JW#gS#p=JU^W%hsXvUN4R?O>@4e}gqq PcLUbA%h+oNZTJ8`&v literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_床上看书/2.png b/asset/art/animation/c01_小小蝶_床上看书/2.png new file mode 100755 index 0000000000000000000000000000000000000000..22d819b3641277bc7d566a0237ab81cd6a7ba56d GIT binary patch literal 1654 zcmbtVSu~po82!W1T53%UWvccn?I4alRa=5INtYPK&{{$bwN*nWtDz-82^U^cteD}NO-0yq1Pxn%;VC=+26+{655O=V*y>`Ud zBis`{cC=;fQ>TweB*fk&3;@Ky{{jT$)8ql*n3jXBl_P<+lJ8D-^pTIF?~D|(xGYm9 zQ-P$~a6Zy=Ajft&`D+3WqB4&jXcu*NQYK)h(9+rc=m*C5Ik+bdqFr9Bnw)rc!Czfr zsc&&LeU)k&=6kE-WBanH`E+lkPGj#*D(|;88h5{?$6$>YVItkfy@Dero@zN1$vI2z zhS>UumOzEBQb|uyR*np1ZLHLH$qxv_pqe*Gb=O$`zaAko!#kiiRT(i#2DxveP!RrG z3GNOu_za?JQwXnFX*#yE#Sk$>YI4YnC};89%RH=@;wUw~N=&MSx7KX&eEGd@tY7qx z-1euOWt1~2$ISy#HdG+amdmQ$@0K^4iTpbLBN^yLborx!FoRQw&d1D2n zt5A>;vHE(AySYAcwlwH1Z*AOvpkv}CSZZK9yCM+&S_!*?Jdy9O>LAZEG&wiBF#k>Mf_b_59{OZ&GmZ+;7=A%6^#P7fluO<-j4~C z&t~+gfhz2{;;ETUDi-1UInGaE}kRDly z)tynTijH^VCN&d+FX<6vMwVp2DoDCTs~8cO1|+MgZ8EaXnMROX{g}l;dima64K{c8 zUmG9a6Eh%^MC4V%+8zb6;!zN!8!S4%ysc9{b@pgXBEQ9jP4}AQ^ln-!-;{rSB2R4~ zuO2b@%BV_+`eg*aF&?r3YkHZKl_UvBr9`M#WQP{Q#%t+fI-i{6RX#T1!2t_U(Y9Qd z!$riTGgKlVX}Bst(s(tM^+8)OWH6!6;zt3G&wi3gMD|JFVV0g(o(WpMqG(W#DK}Pj&9u3B{17w&sMV^##$`r^H^|26`2zc8$3VG zdJGG+-ka}BUk>5p`u#E~eS|Nz8|#QHPpZv#Ztx8> zFNxGD?tyXNA8(D(2)2oQhM(rMHy}BU?n~an#eG!W*ZVumZ+1itQ~M2AMFiD#dwlH3 zVDrJf+xizo5nZ>9F0wHo9jbrSK~d+uQK!^Q(>p8OG~II>4HU-Ax~=uiyEP>)b%tZv zyDO+}%rwq|Ok7+iqC2#xFB17B?U!8f`o84*p3vgDFW+p8=>@{+Sxl_(?0aNI{1POj z@D0s8E*#9a;96B<(&0Ch7#UxQb|0)J{BI@zV-9L?L&ExFN^h{WupLSjMm{?@OyfX}+*|p_yXem|ZrJhN8x~Wm7du3c( l+-w%`NZAA%MHB$u;Y;8jOO0yw}iwoGde(m!E_5Gnuw literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_床上看书/3.png b/asset/art/animation/c01_小小蝶_床上看书/3.png new file mode 100755 index 0000000000000000000000000000000000000000..79d928ae51a82de0f7ae95627fe79a5ccc4b49b0 GIT binary patch literal 1804 zcmb_d={MU80{z8OPddsQOZ5@VGtpYg5gx&m(paLkS1eUaiKH5_grE%~Z(g;CrK%BI zbhA@iUrH)@h?b(ELeVNpV_s;jMIspUC(N1oaPK|mo_o&ycJEzJcV`9gPhbE56p$_m z?<4g&0_lfiN380Svv4Hxu`U4w064DvAAo?8GIanr#zrFSFDI9MExCFp2y=?eXfv}} zT9M#jQxQq^8TUiqKh<}_>8lhxk$HK>NkyMqN;%oJ=H2IjH`;Pq@1a;a5EjrT_hocl zeay35ue&_0Dy}NJ{X5Q@^=IU1x|tn@7%5JP6O@&=*_g3@vm~$|>|})9Ufp}Uv9XxS z;b^{A|MlnI%hMoIg(sa-bIJa4m5zarQjz|hH!27;_z_Ij>%X-l#!iH)R4nI`Voqb3 z<;Yj9ehq_{c!|UCg3;oGoe0Xb?!>@HLzcXUbbW*qCBDg$`0+f)*P-#A{FO)XO|)Ia z&^McWb&T?a@p*uAxSm98PhIspsi*ZiI1YDnDv?NJOyT4fgG|(}3kKsj1QvKjNyv}d z(NkN1HyCbaV|c(ru6@CW54X|L)BaFG8w6Nmg-AkIUeu(wLAbn0vM&teekehY#uai6 z=#1?M!uraodUprZ+4D+_s3GlO$$Y=*?7?UZaIL_el{&jHeH;}{eY6lZg14zyE;%ar z%a!4Bmx}1u$Q)A?sp;wqa_Qi_AYMH@mSCkE#KGs73f^t<)WdV+n?fvU73q3Hj~wQF zxG()y)1Ypird;T34+WI`nX6oe?dlC7gnWKu_bfIhT0sm=`%X1XZo1({uQuLnan_b| zFwHwBhVRiH^pLBnVqrdTd@fG!0+Xl+mc3N%Y`Z!tOaPT#TncuTP|aH$1R2j#RmC(l z2EX)@>L%-4RMyJ`bHic#H;Q$&*H>~ z>b2p6QCc+T8)#WI#nw^m=60!Hz|e5BWX%)^=15%IK0#N%WXqAqUs03vjZEy%n14Tq z5yECj6`vZxbQ9ZrtYS%`ZPbLQ=b_b69t_Y|5-RYSl>wQogWl_0n_NEHY3rLia zu}!;XYA%#v=lL1fKXgg4=vcy;f8e7~w(G7>^}&t+Z0{lvWWD2EXV|HFe5A6!m|YXq zh)l8YXdM4JylQe~Tc@tZ2?BP!$uy8*+f7ww=HH}CyEg~kbv(w-W5S!=qWHBaJd^D5 z_u$%g=rhK^Z(pD@7^&oJMR<1d5QDGVxzskMelcvgLVfQ#_mQFUjDkub9|rb!fur;nfjuLfHB^uvzi(R3KXsN zqx^EBO+@Qhvs>ug-c~2%r*UdC19Hu$&w#%AFaco~Dai1|eG%MRFP@602mbQX zt?oHxKg5=Z+sMfMqYh?ATCAa$ufIrLdOMP45(4O8Es7bXk0-!DS&<^%-MHV>zlaVD z51IFg9D&Y6M&*>t7A6~-)%RC7U?l|vTA9R1g`py|2Sg@UjJ%98W4cmAQoZ7~KJN`k ziAsx;z|*=kA?c9UN|nolFc9Xfd!0j;X?umcNz88-FodnSZuVQfnNDq6X~~x1*p4Ch zT==k5!fwBpbpFitHGAfa9@e4Autqj!CQ$G+H60)X;)?U1ty+UigoJ`=#UDB!oF$ zJaKE1@(W$G6vFx8pQkLdzNRV;^8+}~yi%qbZ-FC(H+s`5K8$s^HFQv literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_床上看书/4.png b/asset/art/animation/c01_小小蝶_床上看书/4.png new file mode 100755 index 0000000000000000000000000000000000000000..1fb39746ba5cdf28a608b68be8d93610d9a48ebc GIT binary patch literal 1701 zcmbtV`#aMM82^$>CPj;6MMq51$S{|5JS+ERa+%wZWu(xGBe|SnQW1(Bm$9Z(TC`E_ z4ACj%eu=r?5)Q*ivtg~XbN++#^uy=GKX zs>(Zli!7mxWOMQzQ2#l}=7bB1^{$VJ(vo__!_-n2#Nf9xs1FXWgD2g46VcRbE7gj(&wO@-}Pbzn=u=cooW6l$aLKC6$znZ zAqweAJ9@%JK2!Ta`vJ=U&@;HC6PftG%kV2&z59A1cHUNl4OP02hI?wKg>qD2nx$Y! z;$-=!*cbiMNf@|4(sT$5*Ili4D8#^LstPIWh$H&+AqG3STqgM7(Kx-yXq?m7Lyj8c zma0zktM<-X)s0l32G$>P*deWZ(_|9L$dI`%SVP9?#_NAC7$suhv#$h#2KTI#hdZ;k zuy5?4P4UO_lUwBW)A5sw)&l-af?Mc#u~*lbA_nW$_$nv4dgjd%^8NzToIkA!utG-h0Co6>#18u)A5l#zx1h|iDuaQ&O^yrQ zUPfIm*;~WUW8$-NT2&`HMxBc?dwb=(*W}akjv1JvOd@4Lk|+c9d|sjPxxm}P=A_o< z#&jr)G4I&;t<016@x7E^kj5iY*L003%0MGU{dkIBt^yiyuHlfleCrs|2=1V)(6v4A zl6ET8lXmDc-oV_{b-wLSI2w^~IgU|1{pfWTZJSwFY)_ z$1V@1n9D>N=eKq(kT~>~79eBEyzKQy@+U3R@NEs7%}V^~kv-_ZoFLXkL4tM$vlIPl zK~MZbouS=IzeY^twOvoY3~EP30Gq4hSsx_bU%IrFtBKCxug@*g2GyPS!9?nN3@Wli zCo?`^dM*|?(Mwm;?@N=fIWmem|5|kpvn>DBRR^eF@2k~-n!a{hLlEp*M$Rr}dJg;8 zD?KVup(~0{EqqII3DI7e7Gf>LAH!CrMeOg2bdjS>*yV=WK&Q)urq9)?0O4G-L9b)v$tUZ5nTvQQd(uF_?TryF z^z{fc1u$Qzj+9H+WLp9|4EOo(@BX|IMNJCNon_<*!<%m&aj?}ZBGpZhLI69BTxfEyc<>H`gRce6CG$; zdYbxl8ym7twpfmd#f&+3IsTp2s5BiPy(Nw;Zs+D1i)Hk53v0IxMXH6%J_MN(a`>!b zmN&1M8JLzzFeayueL^t!5|vlKPIMgf7`BLrf^%U`DMoh&6V=7w$E>Wav4jTLfkV8p zyGHPseu|d&e15=~>hK09uFNxQAb`5VU-@Fr;P+BEYU3kA6hd1GzkB1wVEx90P2Ip+ zIHUHzJpfr!Pw8%|6tZ|Ucm9m8*=~p&P1n&(H0b?Q;}5eO{LbU(fSdj2S@zp;16ITU zc#MzQ7-l5A*>^SCEQpa_JFfK7nYuVaz2P&V!hP;u>EJ_MhFo@u@X`wZ#rJJ5_lkjA z+p_VX@pyI7lzcGF!~+WUl0} literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_床上看书/5.png b/asset/art/animation/c01_小小蝶_床上看书/5.png new file mode 100755 index 0000000000000000000000000000000000000000..46e35e0a8080549032499b9e5ed50794fac877a3 GIT binary patch literal 1645 zcmbuA`!~}K9LK-23FVrnn;28{XlPqjbID~#GmJ!pMLh1QXU&Y|mM2O?8I#+jp$l0^ zR@$Nz!ce5k=F)A-vx$e;w54aypYWW{`Mf{xb3Q+O&iS14KCe%%kGGrFT7$I!0BE`6 zU451Ar&OBy8fD*r&;O`2jg$Bw3IMFr|4$&Gg1H$0))>3Hx*Vc0XDbfm>-!t_c1Cck zW|GcL+!;{$3)1>11!Vx+&cx_?**tban$uuqS98Z->gQ_ofd6*EW4^fP&<^UOYYYi^ zhm)o-OHeJ`@{UK>^>tXTgdm*Z3@#$%4|Y$K|B38e-uG;-m=J9@_j*}WJeArhy^hY- z4U44_sA^ENKy#R7vF>Ge^?~i#QR}-<8sX*H%>?ZK9>)iONKwJjy3aJ+g}#Yi+Ovy(uWeW@<+aumGt zr>x*2`A$fW_)Gu_6gK5HRn)Vj&yIBbf>rS8KZ32s+k_y{HrXzy8gCm5)pf>J}EV=3Tn&r+=w$6Q9E z%85viTxSy$TH*>GfEKo9?bbcA>mV<&9et^RQ9n58z|3vIp9*JHu)6Iiv1zvetm(ic zSc53%j|LMI{ZSQJS@hSUTcdOs)0Hwg>tDLMw?C@K^mDIu+z@xO!Ia>MHZ|u8>M$!v z2S>%&>wgwF))erYH7(#5y`K=NNjpp9PQ3XYxN1v0e?AXS+=(NbR<^31viLeY{w2tX z>r#15FZ1FCUPztO;Y<+*e?ss^97-)1;g8D&Vs^YmcY>jeqIy+g6%#UqJ7)4Ntyc0l zfr+P&upYomR>a9uCTNMWAgF{rX|K<=g-3WEqHuJf{Z?svLqlotZ%KFi`07Yv&ooa+ zHkgklftqfxNc%}$5AF^o>m)>rK0M1YIE=<^0 zYpRHXK>d-9(rKddhy}rz69|adw(VKd)^!2{>Tg(aFM7pcqlX#r2s>tMN0SvgoA}#$ zRL6Au>}z>eTK!$(+1M9+pE4JEoQEz01F{lS4-VJtvqYYsXLW`KohA{9H(NfwyRmPE zvV)7X%=5!^ z@3qGKDtSQV0eQh56lsDv6KKivMJ{IuY}x{w!3KSdr%}Xl#AUKw)Qu#Rkj{mkdbNce zX|A>Of+{YatQpi*vnkeqsJdx~G#xsAV#g1Ub~LG9RCLrL`3UISR`z8aP}syk>~si= z^URnC%n)>h(43JpOxnF*w>X5cRImTJ`R=`>Eowl1w3?}OvBdY2C7ldzJ$8ChtJW)e zHDLjgY4WismL$Bgbn@PfhbahU#=OUWNS7Oss8;`)!AZrzcdTdp9Mxav;jcq=6%1mo VN+MYMFv|Y{xbOFNy^Re!^Dnm;_L%?x literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_床上看书/6.png b/asset/art/animation/c01_小小蝶_床上看书/6.png new file mode 100755 index 0000000000000000000000000000000000000000..19be157269ba708e9ba0937967643cffcb826b84 GIT binary patch literal 1594 zcmbtVc`(}v6#h9v-L^%w>S(Isz7iUDsa9x;y2(1)MzoF+p;~9uv2|@XB_%|sbSajS zkg78lbzh}a8q`r#iEJGSTdmFhzyEahkMDgm-}mOtn|U+e%W!tIlMp>A3IKqFJ;K(7 z$F4lY9}(hJSw!{{k3=F6-Z%gdJN7U5fI_l70Dv~^ZLQtzl39h;H&40C_Z~85(GW&) zITOZ2h!NjT<*L7wiTqrm33fwWyjAibP4ljslf`6_&71qjt@Sj)q7IX%Qs-hdg5=bGgP51W<|4K?iC~yk%ouVlJ%hegWQyBhTHAFO7wVk8++K%K?9VWe#Jg! z{+bQ?DA-WsCsOJIq>ZiGX>hJI!Tv#?s_hTSs<~0ZrTSDxpXU{Ftc7fl|CB=}bKPK8 z_3s7son*z85TX*K8Xaui=KU;$e0xsPbva~V0X%xSfe}+k5>9ucb3@S=rCgCAb8#|N^ za9*Lt5`#-eLnt{enaczg%Y9_>4+o7hUGhC&jk2BS#e^)=Y0OH=aY-#e-U6PPLR)_| z&4ugwwx*`F#C&0P!v{CekZsZuL3qB9UeA2bQ2Fu`UcbY|4|)D5akCZlam%kqqLDfbX{axV(H845^*Ded zU{EgGOnOe58W^=&^I`&T5iR_cs|a^w(03nI4AnSU$$G)aYvWsKbD-rd0;)f)zlgO^ z{DE>z;7kiW<3RW|kYxgmY!8u$a|?w(2Jv?2746YQ&IyhMIw_yY7$t4CrtQcqXWR}Kdoib zGXbEHalVq60Ms=(cU*6pX;0k$m?0lGQ*0Y(dH9~tvAg@lpVBniF|?tL!324BD||E2 zo^pt&l9dq_rg-6mfcZ}xkBv4E`7j*a^;Hp+WisJpG@BBSmET{~&;CA>$wAK9w!^c7 zn}tcOCWpJ8A3#dt%CoRawUH;8HT1-z3FDSnPG0920L+&`SNZNz4`5+pjo&wKW^vzxjZT;T){kjzQRv*e$bxCMJ$D)22V=PYlyg9dkNT$*#zXu~Kt`LB`nob=(^ zT(g)QbrpCu-&60}#?_%ZV*pX+QW>TD5S8SYQQ5el>eujfEsy4dQY*Sx@7GIjyqz8o zPV^GTU70?Z9vB#ty+_-J-Jb4i#l=xWL~i7-+OUJD-g0^>KsGwKlgb)l_4o0P-tUNk zGD?OS$0Blzkj2~}9 z%MKe5GXG`IjCL^bS}9NfHV39mXqqNt=&ysA0VVmp$uibSdc0qdG>BmAJVyY5%Fp|IWA{ fOT_=`?mH}4*~eM&NjC7F0bqa8(e{N+!2N#!K=R}h literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_床上看书/7.png b/asset/art/animation/c01_小小蝶_床上看书/7.png new file mode 100755 index 0000000000000000000000000000000000000000..e28b701de3ff7b89b24c907188781feb304b1f8b GIT binary patch literal 1499 zcmbu9`#aMM0LH%-F&jr)#GFzXr)-spl7uWVENzk)&0`ELmy~-9g(>w^n)78{=mq%Z$ zg388q*L1u#wjR)M$J3Dj07L#G1t6EB4FF16PIx=_7>+F0CP+7WGoM?98J4hDj1RC} zH$V&P?7eXNv|ZBS!PbhL{>=o{!XBQq4@+(+yfB4wd_=@nU(vGPn5ujnG6v6Yt4>Bi z)M~~IZzbGHs7hGDaT1HHJ{k&T&l30ib!oIhE+3wqOaCVSCO1ZBlQe>+%&eJW=uM}L z4nsT*p^t-Z0xxH{9Kjpy(7&zm-{wEV;s99%_K9py=TL}wudwohbIM@(=s_oV>xn57 z@5y1p47!vSVizowYZrA#B0C92JsNjvK6gCQ*=DK98dDsEssM>Ur^nd-_Y>Ba2$${b*080NYSV@KHiDx-fG!kHk4g<^#TUV5||8K z!=uE`o`OT623=(lbTsmdk`Fhw$X~RO7d^mI)NUq*FoY!M+EBbv{;R%2hgT+*qYxXi zNtpd6cRl3oX(U3)L^;=uu(K&Ffg!V~0b>{5aUe|4#H_ArZNG=I)FIS7{e72uzg}sj zh!};VZ_(21M8}vXQ3URgz8opRYH z2ld;W*lnJYhFe{AGdhpmQi7p%?Z!lH!(V$@5net@o%o=a1q*nKid9nf<$c^`0fyAU zss{G92ebzU)Kw?5OBt3U^265c#Uja-wx+eXvQy+Q_ZTPCKP34dG)rBYS5+U9$;YQa z>BWK@N_~=GuRz84a1C2~4@^E{{ieM}bH$iU7rYnsXIK&30=$dCJ@a9uUzzUqb>-dr z9e%xG(Ay^(Fjj+ss9KW3V&*E*8rGD8Y+S&1CY4X|%~~>Cd@{E#6Moh_ESwe#dl`%~ zI?XvHr2UJsKUVql-CP*ZQO0KGi~OVGKQ-QUS+euX&-d+%uTrWdC0m=a#)Gu_!hF8W zRIVPIKUvM!#ztZhK=bkiRrz9ny(5$DnS*kCd=(qInmRZ`_n)Cd3~)I!!>*UTIX{|R zskJJAfIS*V`I;qg+&L(D@oKmr>C$h~H!bOvB1%0syQ6G!Z_=V=c$}iGy_@A)%P)`V z)bsmvM|K4hZ%|i1M~-_$de(Dk3|?y6M^yGrje*XG?Pkm6f*v+pQZ`&kE1sh?|}>CM0PFh?SWdVnRtf*v=nPW(M6 zgXUWo^U-h4R2)$du$BBiXCyChuIGdM zEl_t>U;a!pKo-NS(n?zqPIYbEVi6NNO~V6R+_g)F5x#JT=z&D+P%OS|Lp^30naG^LZPqGdBg zu=E@_Q0ifDRi8o?)32ZW+Ofe__cX^?KMKcJCTX9_(p;b~n*+_`v&q>deixOjKrd-T wcLa0TZ0@834bd`b^+2p3_Ch{p8Xp1W1ZH3(@`S+=@Dwm-%^0B@&Et; literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_床上看书/8.png b/asset/art/animation/c01_小小蝶_床上看书/8.png new file mode 100755 index 0000000000000000000000000000000000000000..3653d1080cdcbb6c1e8e9e8cd8c02883af164ef1 GIT binary patch literal 1559 zcmbu9`9ISQ0LQ=N+T1sDJaQ(awvxtU4~ALJVJ}yXVvEE);W1B-+$~3FkC>b>60s2F zzR&d_%S}|29FuACTI2Ej1HpvX@(UCIfPdH)Y3>?bu$Aw4UD-`}u(RROA|(LN%52m`I+^w* zrl?ARFK2_X;uh6bS#qh%=1haVaq`k>)i${~AHLEAFuLTfpV%dSi$5ha8Opo~{tfoS z+W&0hj2^AC&Jr7797Cn=k!#btoUW`wVwg^t*#UQLew;_R@`>}Kwe6ZIE2s9T_N-Xy zAV`nm=`__C!=Bt)NUDDTI&T$duU8+GVl$w@HSTT#c)IE?ngyA#*Y`X7&F;tg%Thch zd(0R4$7QM_GUQ2q1|4K`2CBFFbG?OL`I_vEatUu{0++2%H&HCDyF5YnvU)Tpw zWkz4qaXGC`6@O!bziy1>V9-n*v!+m``JvlKWocjl{7Klj^XTG3!FN3)yI?k2%QU8K z1Pb>UZXr^2L@ri!2@%HEhY-L?U_d%hrS^gXq)Pr*csY`S%GWeg?_pX z1{RjA*Y~&V{4`h@&0~!StKSQ*M?{er2d^4J)}m^j5{aCk9gm}CZ=2F0aCinfZlav~ zV)~tHZ=%i}E5g<=BrQm?>lAd+Q#SM&WYf#?73z^n(HRwIU1lG&Db`;Drf*1(3+gel zS0nR71P{CI`-_ F{0jsz%#Q#7 literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_床上看书/9.png b/asset/art/animation/c01_小小蝶_床上看书/9.png new file mode 100755 index 0000000000000000000000000000000000000000..2a7d6bfa4150c0351613d1b2ab1acf115954d71c GIT binary patch literal 1575 zcmb_c`#aMM82`H4q}XKTnrm@FEtkXyQ|20TFHFslTP|(xM9QL+OUz|VRK$!ON{Ew+ zxfWt_Ero5Cqmo?aoSlE*{Bq6@pZD`TpZD^-&+|U-hj`BMtRz?t3;=*6$_DAeXEYy) z;-dVx-zIy3PoOI{UeN#`0sRL8Kym2-01%l(AuU{EOS#1kK?(r}dj6u9@NDp->Ka6l zZ~QGwNn?F+ij9bY80EdHjfk{q)dm>xqw47`v4)Hmm=jq0$TcNF_fVO=>d5~h3po=ipe)zg1^ONL=F8V73zLsOLzGWCR4U)G^keF; zdc+sea%)61&@3u924O_0!wQlgW3?4e>Ia?~68#XF#uXL@%v09|fv>P=;hVt9GzSV~SQc{mu>ID*YSoY%`7H7DvWpw>H0_MpOPVIl1 zawrU@S%)RZs0@XD9J1A%7k?hL;5cFE5kBpI7=n3LHdck!YEI;MV<7OK;MmnCt4vgk zvu&fP3!|#Z(5S%0wmxx_^lp!{F!H3;_7pFHu9wv!7f$U!L(&`klfo3mHcgex zK41=(tzdO^eLRj7VkSzHUqeM_OB00TJ9&EnS_pXUx&XGxvz1U-;A#k;<9$Yp0F5hB zE0x4w%QUpJZrp9S*V3sx$@ao5S6Mi$kV;rZ%3n+Vh=2Eroileh?4(6N#IbD72#yqB3*#sv!&z z815pVU)>?gjBUn8_YCIk6{Ar4$Na|lix3ndd$AqS%E=a6(^M_2Z~5BRjFf`1;*E~H z=qYOzeOFSJ-NZ~MOj!}HJ}x7>7+7Yh_pNqoTDSNswa5HEn|OGat>LPSezBn zQ4i>4_{d$Nm}k__DAX2!`4>NCR%HADH*%BNBsvqH#N&*2QcwZSK@*Vvj6g>VwZRhW zt*NNAFHl8NBmG5ID94>1yhrlH*7HBK;X3pjUaPO!`lun+lMzZ8oKYE~?t`~3BkyalH-JG z@)LX;+{^NiBXRYL#!Jm=D~KdH94z7G8BM8tW*!nU$*39S45XwEhR&j~+#{uTcJ?uQ zcS1P(x*Y;|>_@HHlnaJ%q2Hz5^hmR@3>kMgN8>xPiLK$AMR12orOvYYk98Q-snVy^ z$EaVC^b~PgE{m$=RKpAIw#A+B9?#>oJC6|N4t6`@I^Vs~(H6J?H@Sz4v3kJ&?cMJi z`1yy{4WNguNn^BJ&`CmO47d Ui@LZ&<~u)tvUWsLEiq|-1CJizpa1{> literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_床上看书/书.png b/asset/art/animation/c01_小小蝶_床上看书/书.png new file mode 100755 index 0000000000000000000000000000000000000000..41e0da15e1f219122f227431af14883326519b1a GIT binary patch literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^!9ZNY!3HEnJ$fDkDb50q$YKTtZeb8+WSBKaf`Nh2 z&(p;*q+-t7I~#cqIS4Q~+AB4*7~SF9da3WULgO1*M^g>&E7S*_LkXZSoOX-;3< zgZU!DT52IaD`o^3E=+Pd+S0`-N;iQLyDG+q`|drfs?@#x`&aGnGyQKZ>$bX2=j^T1 hEZH?MZbAx*vI&<2KHs*JEdd5MgQu&X%Q~loCIHY>ksts7 literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_拿鸡毛掸子/1.png b/asset/art/animation/c01_小小蝶_拿鸡毛掸子/1.png new file mode 100644 index 0000000000000000000000000000000000000000..2e015d7df47c374e2fc7c231794f63510fb41b30 GIT binary patch literal 1591 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 To7MU*r3+Y@-$GIlzA66&2T7Rr literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_拿鸡毛掸子/11.png b/asset/art/animation/c01_小小蝶_拿鸡毛掸子/11.png new file mode 100644 index 0000000000000000000000000000000000000000..4730bf512792dfef8f9e0892b48a7fdf00ede620 GIT binary patch literal 1601 zcmd6o=|9v96vltDFLP~`X6#IM@ln~0Z7hS7B}`koJ*kF)k<0hLsUMWFc>pt|;?k#Ec`ip3Qe?@s4@+ukmP=W{?y_C} zh7o86Yo&AyC*YW{hYO^-?v1frD*i%Nd9$}0fMg>y`Zy3a>nW;Na-wSiom5&`UhG8Q zJ^MBc0hmSha{(Ir8zz8_ANd1NXJ8t$QydPwt2t!$45}A2Ruk>u@yBL8T4GMr2Mnb_ zb!iUJta;0DdM{zRaY5pYiK&X5sN3oc#PUHp1k4^XKUw3IDTP@Rc=xQUdpXS&-xl29 zuI{C9b-en7vgMRtjJmK|j@m!-`Tf9^iSZKu`h_7IYOj#Q6$U30NfWwEvxFhTN}{Un zlsq2@<7k@5tto<=rBa!nL0iKUkqg%_<=M)pdUM+t>-70YV7y45_7*8tqv=tQlIZYU zYfMhp@|Y7WdJ-%B3_ndb);D2romLRH`JOz{*X#hxetOx`x3j7U2cwL#UO;qy83&Ja zYMJg=l3$s~C%)uIq!=wWgFhjwo+S9fA~N-c7ayL(yYy6Wr147JZe%=*4Y60RS!gNHO47Vh=fHqE;7sH&jTcR0ECBD`^9e z8y>>49r4@xQN!u|1DBGMT#EGx4=3B&6pgeOjcbEmoNtU}Kp@(a7^98haflqYO9WKkOIU=@j&!2AAfijC3EJ&*QVD;!(vyxdSY`LxrLk zhfT0f!PcyGPkP+ujLZ>g*UQEH!NdX99cBeU8nAyllEicG>yEP{5-k8|8@drDhfq## zialQ*N5S;v#DNt$t7mRn>JP8T!}Tv9An7_gZIl01ffH(Q8Gaj-h-wM?I9(rJFKSka z3D~K3926prNiTtyqI;X$x+o*>Mh;{QOIHMsg>wq}w*)tAlT}5;{68A5m}I@(Eou0< zB2lg|Tc;69Uh7&S(XX6o)wq@0NuTlgT41p&8q4^6|j9Ec6$%(T%yOJR8GI zaaZ1gfX1T*W0-8KCLO|%A}{;0D~H_6LVjwnA;{2>3@@W~O2)qtwj?*Ix7OBY1RVld zxQ)S@OzBv~W)#S)M%)g5u(zsr5Q%n{EY9LImd_SZ#$4M+xZ~(#)~0e6R`bmm(+>NK z8|bO4^5zt}=ut6CCnM*o+e?=w=^g+1Qhvq8w}Ol^!X;;pegc57a)eVYyi@)KQTy3! literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_拿鸡毛掸子/12.png b/asset/art/animation/c01_小小蝶_拿鸡毛掸子/12.png new file mode 100644 index 0000000000000000000000000000000000000000..2e015d7df47c374e2fc7c231794f63510fb41b30 GIT binary patch literal 1591 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 literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_拿鸡毛掸子/3.png b/asset/art/animation/c01_小小蝶_拿鸡毛掸子/3.png new file mode 100644 index 0000000000000000000000000000000000000000..90863044537c94b3d6e195c32f04d2a35b300b77 GIT binary patch literal 1954 zcmchY={wtr0)>CXwcW`ebVlh|g3#D^Y8fI3rBv;E)z%W)AR0Th6r&P~)S7FX3>6ir z+J#Q-QmRIAt;JP)iG*5u&Hr$p`{6z3dCsTv?aj2mWeMgN;|Bl$Y=uHPT=w7O@N!?K zEK>RIW$`^kxkUiLKZXB>11K&P1pppLE2OF82@V7W{EcsHKDLzc+4Xz5HlfOfSQ%zlNZKW>AA*0{W^(6TF6IE^mVGT zfkz;=!$2Z12pbr5O5ML#5wy?NA7dCcpE4)+4rj~YE$An>NWV(O{c1Wi)0cpJg@U@u z3Mu9B{$$0KEt_Hv>HR;>d`nDmuiUejQ7M&B4NZ;l0H1TT`6HhSF~=QUwt|U9IveIv zFd~U=US!S=1GgNDAzt}J@F%}_@Nb#|6R zGv=o~z@;NswCHe<9S7=9e2#dlUJ>BS38*YMljz(K^--nY$9?i=8cP;pJSy2^qzo#)%C4>{C0DcdfS}39jw$t zt)nyrO~G-_!**NNrepk+kMcjr9`sL3eoL$xzIgvWMwQjoI>4P2c4UmVImaF3!3TqyLR2j)S7QM2`HD9AxV`C)meID;wWxN zl!5&;Se=C68~^1G{-n^_a_dAfuL=Ds6%1B7{bC+~Pnr09k%vrH#H(&&j6a?SE2qgw z#%+7`7@ro!l08on3?skqo4A}ORB_c5B1Ppq$BgXz(;Z{aie>y{=kD&!Q|R`J3+JCF z3o)Bfzc(5k9)i|Bk{)!doDDQc84`-?!d#Qz4m`_9AO~X1Wg;_MUmyWuajD=UJ2V;f z@^zKe9pYd^^+fKrh74g)K~S6Uq1J&o_`DA7y&*LGri3i#;GUYP#aY4# z8M(hi3wU@((Li^hw)IB=#8F;bf6W(`cH7{B!kw7vyL{cd;v8WT7pV!W;HsGrr}7zBuu@EVmUMCx;e<*;$q5n zPWY-FJUQX^)|VsLQh~>zo|cAK`+(9uQ$E$Fvcv*NKEejH32s>G6HGUEUI#BFTzI!4 z-Px)A(d-*uNp}0m=R7;0QvqXEmhlhhIT|_s>(EKM>)V#ASr#U)ana$j&YB6cM!7$f zDeBw|B+>hYv2MZjDE8Lli(Z*7bVtMzzoOWY)?bVlX^2CL2{d)vlA`zyy|Pt3PPHND zC45F?oewtHgqPRJv5Ul~C8MJx`0ql!)C2zoDCa-&*QuUR5-}V)sWDhE(tslUd!6w< z?N81e-rg|yQhVt3_rmb3=6{fb?r#oPS z@|mdvo<%SB=hzHSSLka-D zLfzdH71j-!JIvfIW|;<5iI5}144l@1tAbXFvH8hq)VL0UADf4q-QGbXi{|Ya>6noR z8)|J>TAUEM4|dH?x!b(LxWm0)L0ju%-1+?nRB4ue$yDWZXwI2YxJDS|r)5@tNZ}P? z^+?t@Znb5~@Bn!AjI02@fiU0QK>1~OExzhHrO)i|u*?>Q|szb+~vL3Im-LJ$lH$p-?aaMkiJS1)#|jm To7MU*r3+Y@-$GIlzA66&2T7Rr literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_拿鸡毛掸子/4.png b/asset/art/animation/c01_小小蝶_拿鸡毛掸子/4.png new file mode 100644 index 0000000000000000000000000000000000000000..0a9eea6fd5b263fb21a7cc9cf01913e90c3b7209 GIT binary patch literal 2159 zcmb_e`#Tei7hlL_{_e4fv9&U2n~GJQ};X`mVq002n4xgyX)`=8`W ziVL+4!t}JzNS${*aS;I62l`L;07}bM007B@Zir+4iRCNhURaGW%@@R{PeUdtwEN@d zOzG(u<05epchFomThYWP?H@ZaoU4q@!6vmNMy1(L(nT!R+fZ>9e1@ZNUeZQI<3YvI za`=n!8ogU+o%>M~Ol!D_AS;OM0dp`&S$pUV~XtA8g zt2vM#JC$->-cSmPR&c4-$#Hd4DIi%ubWbDPUuKYR{11WII+)yn-n&z#E*kmeg`Z`| z7ELF*1p*_;MO1o~x53-uR95A800x1iss0-4#YE12-nANvRV&_+ih$|9l*wXvJg^c`xN_zA zHO*IbqjG?h3y;v{wR=^T%xx#Td1IvElU5t@cI!iA6}Gac38C&#O=Q^qv8uSl4?t)# zpFuXY2t^|1DHCd|X~44><2(Eca|~cekXj&mZKbzAfsxa~Xc}Ncs6md@JGlkZAz_Q% zmJHpu67ua0J#^|hZyj-j4Nd=RxJ)bYh#!IRom*ugNMXRh)|+Vk{Segx=}dq#@mt^b z4Zef;!_k}eU`}h4XN*1xqW&yA!c`=^@whffVjnXlxVdK|_5*8i?9(#DSWcp-Z{if0i(oPLA90}0bSmnAASdcncE<@tBo#4+8mv?A~J$;9FnIp z|JBh&&x6wBB4;SVfR?|&6I(j0^VQA&dn*l{mYDMvmii}-a+H50*L~V1R{!Hn{>}}-lfXY2%!i0 zhZ=*|MMGA0H57wJ*k9bg5Y9FxplSxm9_rH*sG66_kY`G8rOQ9K4Vk@$A_UaRM?}~5 z)+v#6HBMP(&*K)^GM`?C`cTM^H~r>q__!ZHBoYo%eN-X@4Ee+-LCrfKE}-M;Z$RSt z?-9}c0r<)#R;`;8S{Iq_${ z{gUc4E&@DSw+2}&Ptz^%>yF+1e%`s)1s_L5o=3(=x}7CdHg=$x_GgKFs6mInGVlz4 zp#-L*dHJ)mLC3g+IMg~X9aP|4V$>3Ae^&F`qdBePh~D%YOm#)JWOz<_XVRNGr1r-< zHK{G34lSSqVk9UWTj)i9e<-SW{EGL$CNV!<$X&=oIOu?5OHYeGZUwCy$YF3itL!J{ z*2@7?&nI%(<*TeIrW@q_aKy&fA{R>;wnyn!M-xUMqBkReVuekepC2&>KYBe#xG?zxs^7JU_iB3o0yPsmL1F7AFk|?3G`_Gh7kX3I$=k-WhQmEkZEE z{+OYnL?iDKjqGykuA_;JWAfqZ;8>Z3T50?+X)E>E3RjEedt^e9?i}GE>KG!4MP@P< z-$G$)H;8hQ(X17z$xE8RKj3aSE?J>EG2g(X$N^p2b)nLMR(S}X+*A*4w~b?uudc>O zg+oLwHziJYy>G?-1l~-a-)@)4O~xZK8P^;CrY67Oe@YwOcTS;fxz}@aDW*Z*y@%mR z8;l1df-Yv+-fLl!7N53l*f&R#qcl?3K3ki&pHFX3)d<#JweuowbyDzpto0KPML4^V z_34+|tMdUDHiMT8yjPwTrnz(bS&2q_Gv{%zTwlHB6Ep6$2w^57)Ps%~j4N?X2pp24 z$)6}0HW@f&WMc-KX17hEE|Qhzmvb+#ggsP+j@^rjiOGA1*IUldckDrF`W`4)vHqDf zHi~Ny{fegdy@otZ8OJv9MCQT!~C!FHk6uKa^JkYS{WEMWi_asurq~BWh2TJe)@7Mp)4E1AOLR8D8v(Z==FaA D-#-2x literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_拿鸡毛掸子/5.png b/asset/art/animation/c01_小小蝶_拿鸡毛掸子/5.png new file mode 100644 index 0000000000000000000000000000000000000000..8f1512d7e22a3d7c5b7bf5e7b122a58a89ce8534 GIT binary patch literal 2120 zcmb7GX*AReAO0g-x0#IPCay4}Vk*U8>|28&gy_9;2SsXZ5hg}mOQwc~F}y+ZZ#6REzUSvuGfbfnb%EU1=^Gl}9UD$2uu3v18^xE`| zcFgqXw3KhXu*uz!69&GRyeKLGzg{`p=`;vGg<4;AhJ4E<&O)~XAse%8Z99CEaeSs8sW%gm9x&3+MUvF5NoJt`JVBZg|n^*Yb)H@LP>A8*bjex1)<1_xjH zOIFA(+F!ED3zY}B1ER6UIr%?2<#|0H^3*v8I^1jzpiq;Y`W>n$PjNFa>bEL59IKF4 z)Yt|_73q3SrCW()*2@T=?SwH>@!B?Xtw+6%anqklN@;$f0;0`5d;4k0(Oi*f`D|}5 zR{3%$kct51G;RKM#HUdNI7z{LTXYg~lnt;+@lMOGba=F5{Lat9&Q@xe^>hI%iS|INt9Yi?4R1Sf2IIIQVyPaX+kd!r|a>b8OBQv#^8!z8b%z$ zm~vJ~IQ%g#l=UaZqXGAH{eI2D z0J<7s0C~LfU#<~O!Ku2Y4hv2D@0Wt&Re+Y&9jS7<8)TvYqnI*jU$<$vS#oyZ)xc*R zxsm}xMIAYD)#|J!g@iu5tuTW)2lPNnUl>Z3vVz$}B>Q0K(@lm${zzO)N3mFVE{UG7mN$lM4;^TVDUY#zaK!ZaVC2SbG{2!4`-lthBE8 zuQ!#~Z+CZ|cAH8j8-OK`#elE=AfR#^N-DOmpDy(_c&njMs2ChNJT}f?UpA=Vf&x~|XuCgG{=lkHXUM|b4yJkhKS6`|j1+FEkRc~rf&KXtC{0qe6I6s_bleZhC>$*xSC2&4odIME04L?HK0@QX8fT_4j% zC$q&&y%z$Qt9m$Uf5x2uzb7SQ$(*)N6ge6xV59Ex_)8fu=kMj`GuvKX$y{(_C6NT~ zy3r5P-Fofky;vRM`i$l^=(-|u^^3^`u;bJ{4!9I9mY^{OF;7FkY`M`$GI0ul4UVb) zQ8h`x{&M@R3WB}z-Adz`;8r!R3soZ*7-PeFP!`rI1NT|54fUoW;k0(OGDBQ(mL%kN zN-G54;GNJK_l6Q<)l+N%Ggdwf&t=ojB8}Dj zYj3*2pW}B)w7%%c`0iw9bVj{7t~ZO6(aE2w>wGTtQF3spNR~yyi5eEav9SHV#!|%H#mc0A_oASRqI-2!6IeHcS@B0p41HjVE7DYF8kNyv) C{rv#| literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_拿鸡毛掸子/6.png b/asset/art/animation/c01_小小蝶_拿鸡毛掸子/6.png new file mode 100644 index 0000000000000000000000000000000000000000..a15789643164d0b743e7b3704907326680d4e8bc GIT binary patch literal 2155 zcma);`#;l*AICrLxB1S@+%GYgIEo`wNX@NLZp$r|>*i9q-yExcJWa(cFR2l0vBH_3jlGrKc@@pJXgLNr8JSqQ8pA?`BM zByjD9esG-tbQ*g)n?l8}N+F-#^l&Tn z^6O7Q1p;(ON<9%+I;HojI1UxPGJ^(Bl|Z*=+;1z|IQ9kS5WUIJ}a1%D<}qw+w&mw+Y;vLJoStCpf9!{=eYD*rdSc*H{VoAL2!Aj z+PjyvTEL5(c8IO9d0_+$HF>xa0s^?nVInW8vin*wt4>E7mn)QpA4Nw8r(k-HF`LDk zFW$~$Ez(unennsrzGQtIibwYbjU3IQPY*92m?3gtOSyj-Z8;L*dCfV$Zu=Ri=nR(` zb4!L>aeu_8k3fqLW|Y$?G-v<%*6XTMM1o{Nl2)!<08sIWHPqfZa6&%VLhHxpiTgeiM$GcraWbvYBazH?!gyEiUR(4%gNA2$QWLeCrdQ@Q8nR4YzciGIo&R)HcFT%5UM3&M z4kMEott?tab<3;ccS`pqSkwy&zJqZ4fhhgWr!6%qR%kjePKZU;*dS@JLSqqN8t5st zMx3$v1kGK;QE+Io;af-N_WKv!`*z|<{^KV^mg%k4R5EdvI;eC?S0J{fa9Bf+)StpN z1|tuXrdimYXO8}pkKS_!v6SMakCGj>?QW|zpNlk*#5mY^IadU7d~F0!Mxz}g$vyjJ zik>a%nh-HDH>wxzvcZ*X_(=Z3xVb@9;|JU|dpeX%J3PvD4na>FrXUEK9RfK{vu)Pa z<9*19sro+lkT0jlGReD4Y+!(!?1Em9F+uUxYumIK8r}YqxM=pj9M8D7bElS8Tv$VXyJ>KJ(FH%1fKH4A5** zXEVFTwuRm2>6WQdsi15EXB@vWky{-k>G)aO$Fxl%AP+gx@n@$cg_gTCP6t+^THa{w z*lw0Ypb*u_54!R7E~E4?;3Ai=9{kty{8_fiBAfR`o5eCS)=MVt=SK#6?P1#^;q_Xv zA4_f_bt~dio6g&Id9x5O9Q#ZYe}anUR}-J9UW2Q`f2W?mJ|W7{VWgdYul=^uY-oVfU!1TrgmmkK$ME(W z#O1(pkMFnaMsRNJjBMRE7Q1|gwa!`Biwl#Jqo21jj$8c_F?;7%38(7}X%)7Q?Al&h ziGBw$RGzJ0z~88*kbbX?StYrs_n@K^*^b7VD%$Y3@Xct}ZqpN7Ydr(w^<~oZI+DE) z1Ub4I9@q4H9b{M`2s<56;5cZ7bFkW7YF>VrtxHPs{CVbC@Jz6-P|K6_Pv57$*_vtiXcoza#0T?Bc0CN^p_?bg3^g;Q&Sb0F!TKsCN1gY l)B)dQ)BmF9|IOQdm}T{sBH00TTcK literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_拿鸡毛掸子/7.png b/asset/art/animation/c01_小小蝶_拿鸡毛掸子/7.png new file mode 100644 index 0000000000000000000000000000000000000000..9bf4375d7c6708650d304de10dc2d59951268e53 GIT binary patch literal 2236 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 bc=rWn>i80=24~(Ld<}p-&Iwy@=biWuF$43J literal 0 HcmV?d00001 diff --git a/asset/art/animation/c01_小小蝶_拿鸡毛掸子/9.png b/asset/art/animation/c01_小小蝶_拿鸡毛掸子/9.png new file mode 100644 index 0000000000000000000000000000000000000000..d01c42ce7b06d8c1a7bbce52dd786485b94512b8 GIT binary patch literal 2158 zcmb_e_ct4g7f)@T5s9{nhsKH(tEHr*G!fcZ;f1~`tr?@Jky2Evv^F958nLxSQ6*7P zbRnp%W*;^^EvmNdpc?7MqoJSpo&{>55CeD7unw z@_zie;xnv#xfdBnbyrh{tM+bq@9k*9tC%C%g^MjVGa`aIaR0K-eikd7wdaA$0&;ws z1KTnllcPnI`Q@-6(=z!aGjnlbx+X;74)WT^I8x02keIE61J868OsktprRHb+5E)xk zpFpr!Dv%({r=?bE+a3FUTD!mfDr$eMhY}0l8OZ{s#j693@=gQN>%#I1EyVz~5W1 zDQZu->5&jDr;=A{dj<}HJUO>N)`|0+{c)l_>?e`M1;?P2X8t8R{3`pTE!@`_o;*7KFVw)CS zp^I0vskWoJ@UE3S4^o$+wCXNQjWV(gp>OV$YO*5faA}<#tdbz)98oA9fQtIrv$=JA zndjwbtbz0r)eGaRln#-6>+WI3;r`lQ7R>ucU!>EUj;% zbY&59UWk;5l0!l%sS8J3E0^R~&Fwa+6zr4Gq%L@3x4g*+L_5s^s@Ku3sYIg0rO+MU z%$F&0*|Jm+I$|fWY>nwRb@#>)O->MMkFY1*W9W=b^7JCXTp$P>Wd-~Qwrj-{!@NB=o##)5!_<&y)OBzu(9lda|jjT^t4( zjhI-zR)(Bp>O*Oj&4ZZ(YxLXe`IvI$Y~9v+GA4Ep8K4@YvbDJB3{JJ>TFsvy}Lh+f_r1cHjry_)aDbE%y={WzduT^h-uGV~TJ0ax!5c)<*OK~oPYAtgv6>@Pecm~JqBqZ3gRmm@iyRF1%i{S)b9^Le4<`r=oZMt7@`~6fOJ0dWdWF2{-0F%W8ncUTRmBJwW`Z{rU;- zL(;DA%yC-K)+Z5ay-#ZFn`DM8r7E*eNw}YEz|gYv3x!(8oPp2pZh>|KZ3XnoA67eV z+{<>tpVyX63uBh19)A@AURR`~nhsnkyYHX1Rf_uDXjsrrx;&)MwAb&RVVZAB{ua5` zLy}SFNR&D!*}2hwpuuTZm1RE={)s~j&2FMJ+$P(?AR#lRmPctYG#_+Qva8tn5PMoJpAXRiBt$7kk4%|7lts zgE0Z>M)J6Jr zUjtib+hUEsb=A$TwhY-6Ox{!C&D_Xq{ADKq>iSBMD8;zdzt6oBb)|MW`x$Omcg&(^|*01~oiBE|s~08I_RApxksAI73<~W?qkV zSn1AqH|;hw?W8wiH0GqDJ2Xm;8i97SltVsTYQm~e#8zk}4JlF%xt`KR&t5_;46dOz z)~~;|f8{rB#Hk%(r6@%?+eOI|SIDMyTda8okjIWXse9wvlWBGj1 zJzGi%Y@xJP39NLW(#U&GV1?LLs^`bjoZKsH;@hcfdH7JERi)Px1;|H D1-1=V literal 0 HcmV?d00001 diff --git a/asset/dialogue/item_description.csv b/asset/dialogue/item_description.csv index 98730bd7..a42b58e6 100644 --- a/asset/dialogue/item_description.csv +++ b/asset/dialogue/item_description.csv @@ -16,6 +16,22 @@ c02_获得火柴,火柴,,获得,,[#item] c02_1014钥匙,1014钥匙,,获得,,[#item] c02_老鼠洞1,一个老鼠洞,,,, c02_老鼠洞2,在这种楼里挺常见的,,,, +ui_新游戏,新游戏,,,, +ui_继续游戏,继续游戏,,,, +ui_退出游戏,退出游戏,,,, +index_新游戏,新游戏,,,, +index_继续游戏,继续游戏,,,, +index_退出游戏,退出游戏,,,, +setting_总音量,总音量,,,, +setting_音效音量,音效音量,,,, +setting_对话音量,对话音量,,,, +setting_全屏游戏,全屏游戏,,,, +setting_窗口置顶,窗口置顶,,,, +setting_自动保存,自动保存,,,, +setting_主界面,回到主界面,,,, +setting_退出,保存并退出,,,, +setting_日志,打开日志,,,, +ui_秒,秒,,,, ui_获得,获得,,,, ui_退出,退出,Exit,,, ui_阅读,阅读,Read,,, diff --git a/asset/dialogue/item_description.dialogue b/asset/dialogue/item_description.dialogue index e04e1e25..b8819233 100644 --- a/asset/dialogue/item_description.dialogue +++ b/asset/dialogue/item_description.dialogue @@ -1,9 +1,26 @@ # UI ~ UI +新游戏[ID:index_新游戏] +继续游戏[ID:index_继续游戏] +退出游戏[ID:index_退出游戏] + +总音量[ID:setting_总音量] +音效音量[ID:setting_音效音量] +对话音量[ID:setting_对话音量] +全屏游戏[ID:setting_全屏游戏] +窗口置顶[ID:setting_窗口置顶] +自动保存[ID:setting_自动保存] +回到主界面[ID:setting_主界面] +保存并退出[ID:setting_退出] +打开日志[ID:setting_日志] + +秒 [ID:ui_秒] + 获得 [ID:ui_获得] 退出 [ID:ui_退出] 阅读 [ID:ui_阅读] 收起 [ID:ui_收起] + => END ~ PropItems diff --git a/asset/dialogue/item_description.en.translation b/asset/dialogue/item_description.en.translation index 7172f48b17d6a39e78001d7a25c597d1d37dadb7..33b233ccfc1b6caf27adba91568d96c521ba73d2 100644 GIT binary patch literal 3442 zcmbW4e@sGHq3y9)K&UPKVWId0eKN9M(c7KuPifMS;eTlo%f``b&*PW?3$g zp2sY-e?1|1)=)ao8PJ%Z0UqagW^sCoCO1ptwTFm?`FWrO&`Qu+kO7nl$_DYg8GN3G z;XMB3l-mX43eZ8uYSdOMY1vGVl{q&$1l}z%qB9n$}>)ZUeCCJjj<*Zd^X4o z$^#XGib1~F8o5xJ2#-G*rZjHy9USNG5eg*mgP3D%yW6hJ= zpr_^`^xoc*6aeBiAtEBJrZsv(Q(pn>R0$x{MyE6qiz8+ANziU5`i7yfI z)c;o1KI9Paxv{6(<^#uj7Df5;)RcC9T;lIGSZqmx{E-z~LY`ywln?$UuIz0AZ@V!2 z{3HSIw&}m!Bj9md>s@z&?meDg_FYfPMnOLO%Z{(` zox!s>zSB7J(p1LjcRc7G$tYqxxw89VDf4ukE$6)MY-XJ5uRC*>&tkmdvlY1+%v0{v z2ZuvuGalPi*@N#hIzIKW{r7zW1pLLVNrT%2{IFNxxy1r*+cmIni-0Q~e(qcWukCWC zy(8dKe^-Sf;F0fNI#DLzbM%&u2mx>DjBxK1@EUXFvi_r-f(NLaY) z2y2tdKa@aociC85lVRM7l-ZvR$FOeBrr2~VX|>8kqA=1NJrBN5dzNpT@A&R{zMtRo zJon!F=XcmQ*$V{yh=v#iS^&BmRNAPyz3x`2X0uO}Rgb8-6&di&0}CDJQtnMI*}jU{ z?Zj9pN&@*LRcZ1$C5K0GiXMliI8>)3OF}$flSQv2ECk|}R8@3Ist^NazC#l3gtSgn z>l~U`?U97Lz*aXo8zfB!_(`hfbIY!qZK~7fZqxt@LIfxsG(TxgcDB(sb<{p0)_R2p zuojO0y&!niP$rNFn$r(R=dWZO#HFD7KxrUar)UP211wBsa@mGk`pjq8xZ6sWvSPi&I*{h*NU z?|}0&fsTTQzj-Mu_P42eP7GsG?gzhYGT>vf?W^sKN9y@o5%DMRKGFwZP$);4`PJCvg*?I*J*+t>JtF-g)$VD3x*QZU5-; zx+fT)Nbb9~k@>X^`I92^^f|+`=dD`}xHJ?KtTf=S_PXR8;P`ByXwDn9#K=14>AXyl zgMZ4yCjD#eYO!tYDt%`cC=l*D)U5yfJPY z^HjI`bhx;H@xh7Nbli*RJSg_eUA1mtocbs8Uk*IU_-~z|scPn_|EI0$_kpVb)f!+Q9L+KC=fNRWugSXNUhP{{hj!(8>S+ diff --git a/asset/dialogue/item_description.zh_CN.translation b/asset/dialogue/item_description.zh_CN.translation index a85eba52c4516b70e88342b4ef4276360361abf5..4c0306162b92cd517af831745f730c4399569f46 100644 GIT binary patch literal 5080 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 void: +func _ready() -> void: # 禁用默认退出行为,在 _notification 处理 NOTIFICATION_WM_CLOSE_REQUEST 时保存数据 get_tree().set_auto_accept_quit(false) if not _check_dirs_and_archives(): @@ -65,15 +66,21 @@ func _on_archive_id_changed(): archive_loaded.emit() -func _check_autosave_options(): - if archive and GlobalConfigManager.config.auto_save_seconds > 1: +func check_autosave_options(): + if not GlobalConfigManager.config.auto_save_enabled: + autosave_timer.stop() + elif archive and GlobalConfigManager.config.auto_save_seconds > 1: # reset left time autosave_timer.stop() autosave_timer.one_shot = false autosave_timer.wait_time = GlobalConfigManager.config.auto_save_seconds autosave_timer.start() - else: - autosave_timer.stop() + if GlobalConfig.DEBUG: + print( + "check_autosave_options:", + GlobalConfigManager.config.auto_save_enabled, + autosave_timer.wait_time + ) func _try_auto_save(): @@ -144,7 +151,7 @@ func save_all() -> void: if archive: ResourceSaver.save(archive) # reset autosave timer - _check_autosave_options() + check_autosave_options() func load_config() -> void: @@ -161,7 +168,8 @@ func load_config() -> void: GlobalConfigManager.config.resource_path = path # connect signals GlobalConfigManager.config.current_selected_archive_id_changed.connect(_on_archive_id_changed) - GlobalConfigManager.config.auto_save_seconds_changed.connect(_check_autosave_options) + GlobalConfigManager.config.auto_save_seconds_changed.connect(check_autosave_options) + GlobalConfigManager.config.auto_save_enabled_changed.connect(check_autosave_options) func load_archive() -> void: @@ -176,7 +184,7 @@ func load_archive() -> void: _handle_load_error(str(selected_id) + " 号存档", "加载") return archive.resource_path = path - _check_autosave_options() + check_autosave_options() func _handle_load_error(target, action) -> void: diff --git a/manager/config_manager/global_config.gd b/manager/config_manager/global_config.gd index 05f87731..ddd6ff69 100644 --- a/manager/config_manager/global_config.gd +++ b/manager/config_manager/global_config.gd @@ -7,16 +7,15 @@ const DEBUG = true const RES_FILE_FORMAT = ".tres" ## layers -const CANVAS_LAYER_DIALOG = 13 -const CANVAS_LAYER_UI = 12 -const CANVAS_LAYER_PROP_INSPECTOR = 11 +const CANVAS_LAYER_DIALOG = 23 +const CANVAS_LAYER_UI = 22 +const CANVAS_LAYER_PROP_INSPECTOR = 21 +const CANVAS_LAYER_SETTINGS = 20 +const CANVAS_LAYER_BAG = 11 const CANVAS_LAYER_SHADING = 10 const CANVAS_LAYER_FG = 2 const CANVAS_LAYER_HD_ENTITY = 1 -const AUDIO_BUS_SFX = "game_sfx" - - const CHARACTER_COLOR_MAP = { "default": Color.LIGHT_SEA_GREEN, "吕萍": Color.ORANGE, @@ -33,6 +32,7 @@ const CHARACTER_COLOR_MAP = { } signal current_selected_archive_id_changed +signal auto_save_enabled_changed signal auto_save_seconds_changed @export var game_total_seconds := 0 # 游戏总时长 @@ -41,7 +41,18 @@ signal auto_save_seconds_changed set(val): current_selected_archive_id = val current_selected_archive_id_changed.emit() +@export var auto_save_enabled := true: + set(val): + auto_save_enabled = val + auto_save_enabled_changed.emit() @export var auto_save_seconds := 60: set(val): auto_save_seconds = val auto_save_seconds_changed.emit() +# window +@export var window_fullscreen := false +@export var window_top := true +# sound +@export var db_master := 0.0 +@export var db_dialog := 0.0 +@export var db_game_sfx := 0.0 diff --git a/manager/config_manager/global_config_manager.gd b/manager/config_manager/global_config_manager.gd index fad3c614..5357504d 100644 --- a/manager/config_manager/global_config_manager.gd +++ b/manager/config_manager/global_config_manager.gd @@ -1,9 +1,12 @@ +@tool extends Node -var config: GlobalConfig +var config: GlobalConfig: + set = _set_config var timer = Timer.new() + func _ready() -> void: timer.wait_time = 5 timer.one_shot = false @@ -12,6 +15,20 @@ func _ready() -> void: timer.start() +func _set_config(val: GlobalConfig) -> void: + config = val + # set up window + if config.window_fullscreen: + get_window().mode = Window.MODE_FULLSCREEN + else: + get_window().mode = Window.MODE_WINDOWED + get_window().always_on_top = config.window_top + # set up sound + AudioServer.set_bus_volume_db(AudioServer.get_bus_index("Master"), config.db_master) + AudioServer.set_bus_volume_db(AudioServer.get_bus_index("game_sfx"), config.db_game_sfx) + AudioServer.set_bus_volume_db(AudioServer.get_bus_index("dialog"), config.db_dialog) + + func _on_timer_timeout(): var archive = ArchiveManager.archive if archive: diff --git a/manager/deploy/scene/scene_manager.gd b/manager/deploy/scene/scene_manager.gd index 097c50d1..66ea7fb7 100644 --- a/manager/deploy/scene/scene_manager.gd +++ b/manager/deploy/scene/scene_manager.gd @@ -7,25 +7,168 @@ enum VIBE { TOUCHING, } +@export var first_entered = true + +var prop_bag_instance = preload("res://scene/prop/prop_bag.tscn").instantiate() + + +func _ready() -> void: + add_child(prop_bag_instance) + prop_bag_instance.visible = false + + +#### Ground and Loader #### + + +func get_ground_loader() -> GroundLoader: + return get_node_or_null("/root/Main/GroundLoader") as GroundLoader + + +func get_ground() -> Ground2D: + var loader = get_ground_loader() + if loader: + return loader.ground + # 在 editor 编辑时,ground 在 Section 节点下 + var root = get_node("/root") + for child in root.get_children(): + if child.name.begins_with("S0") or child.name.begins_with("S1"): + return child.get_node_or_null("Ground") as Ground2D + return null + func get_camera_marker(): - return get_node_or_null("/root/Main/CameraFocusMarker") + var ground = get_ground() + if ground: + return ground.camera_focus_marker + return null func get_player() -> MainPlayer: - var player = get_node_or_null("/root/Main/GroundLoader/Ground/MainPlayer") as MainPlayer - # 在 editor 编辑时,可能会在 grounds 文件下获得 player - if not player: - var root = get_parent() - for child in root.get_children(): - if child.name.begins_with("S0") or child.name.begins_with("S1"): - player = child.get_node_or_null("Ground/MainPlayer") as MainPlayer - break - return player + var ground = get_ground() + if ground: + return ground.player + return null + + +func focus_nodepath(node_path: NodePath) -> void: + if not node_path: + printerr("Node path is empty") + return + var node = get_node_or_null(node_path) + if node: + focus_node(node) + else: + printerr("Node not found:", node_path) + + +func focus_node(node: CanvasItem) -> void: + var ground = get_ground() + if ground: + ground.focus_node(node) + + +func focus_player() -> void: + var ground = get_ground() + if ground: + ground.focus_player() + + +func focus_player_and_reset_zoom(duration := .5) -> void: + var marker = get_camera_marker() + if marker: + marker.tween_zoom(1.0, duration).tween_callback(focus_player) + + +# action_locked 用于设置界面等强制锁定,action_freezed 用于查看物品等锁定 +# action_locked 优先级高于 action_freezed +# action_locked 对应 lock 与 unlock 方法 +func lock_player(): + var player = get_player() + if player: + player.action_locked = true + + +func unlock_player(): + var player = get_player() + if player: + player.action_locked = false + + +# action_freezed 对应 freeze 与 release 方法 +# lock_time: the time to lock the player action. 0 means lock forever, thus the player will be locked until release_player is called. +func freeze_player( + lock_time: float, action := PlayerAnimationConfig.ACTION_NONE, auto_quit := false +) -> void: + var player = get_player() + if player: + player.freeze_player(lock_time, action, auto_quit) + else: + printerr("Player node not found") + + +func freeze_and_play(lock_time: float, animation := "", auto_quit := false) -> void: + var player = get_player() + if player: + player.freeze_and_play(lock_time, animation, auto_quit) + else: + printerr("Player node not found") + + +func release_player(): + var player = get_player() + if player: + player.release_player() + else: + printerr("Player node not found") + + +func set_camera_boundary(rect: Rect2) -> void: + var camera_marker = get_camera_marker() + camera_marker.limit_left = rect.position.x + camera_marker.limit_right = rect.position.x + rect.size.x + camera_marker.limit_top = rect.position.y + camera_marker.limit_bottom = rect.position.y + rect.size.y + + +func set_player_boundary(rect: Rect2) -> void: + var player = get_player() + if player: + player.player_movement_rect = rect + else: + printerr("Player node not found") + + +#### Prop #### + +var hud_path = "" func get_prop_hud() -> PropHud: - return get_node_or_null("/root/Main/UILayer/PropHUD") as PropHud + var hud = get_node_or_null("/root/Main/UILayer/PropHUD") as PropHud + if hud: + return hud + if hud_path: + hud = get_node_or_null(hud_path) as PropHud + if hud: + return hud + else: + hud_path = "" + # 如果在 debug 模式从其他场景启动,没有 HUD 但又要获取,就新建 hud 放进场景 + var ground = get_ground() + if ground: + var parent = ground.get_parent() + if parent: + var layer = CanvasLayer.new() + layer.layer = GlobalConfig.CANVAS_LAYER_UI + layer.name = "UILayer" + hud = preload("res://scene/prop/prop_hud.tscn").instantiate() + hud.name = "PropHUD" + layer.add_child(hud) + hud.inventory = ArchiveManager.archive.prop_inventory + parent.call_deferred("add_child", layer) + hud_path = str(parent.get_path()) + "/UILayer/PropHUD" + print("New HUD path:", hud_path) + return hud func get_current_prop(must_selected: bool) -> String: @@ -55,43 +198,6 @@ func pop_os(lines := []): printerr("Player node not found") -# lock_time: the time to lock the player action. 0 means lock forever, thus the player will be locked until release_player is called. -func freeze_player(lock_time: float, animation := "", loop := false, offset := Vector2(0, 0)) -> void: - var player = get_player() - if player: - player.freeze_player(lock_time, animation, loop, offset) - else: - printerr("Player node not found") - - -func release_player(): - var player = get_player() - if player: - player.release_player() - else: - printerr("Player node not found") - - -func set_camera_boundary(rect: Rect2) -> void: - var camera_marker = CameraFocusMarker - camera_marker.limit_left = rect.position.x - camera_marker.limit_right = rect.position.x + rect.size.x - camera_marker.limit_top = rect.position.y - camera_marker.limit_bottom = rect.position.y + rect.size.y - - -func set_player_boundary(rect: Rect2) -> void: - var player = get_player() - if player: - player.player_movement_rect = rect - else: - printerr("Player node not found") - - -func get_ground_loader() -> GroundLoader: - return get_node_or_null("/root/Main/GroundLoader") as GroundLoader - - func pop_notification(msg: String, number := 1) -> void: var notification_node = get_node_or_null("/root/Main/UILayer/Notification") if notification_node: @@ -126,58 +232,25 @@ func get_inspector() -> PropInspector: return get_node_or_null("/root/Main/PropInspector") as PropInspector -func focus_nodepath(node_path: NodePath) -> void: - if not node_path: - printerr("Node path is empty") - return - var node = get_node_or_null(node_path) - if node: - focus_node(node) - else: - printerr("Node not found:", node_path) +func checkout_index_page(): + ArchiveManager.save_all() + # get_tree().change_scene_to_file("res://scene/index_page.tscn") + get_tree().change_scene_to_packed(preload("res://scene/index_page.tscn")) -var camera_remote_transformer: RemoteTransform2D -var focus_mutex := Mutex.new() +func show_bag(): + freeze_player(0) + prop_bag_instance.visible = true -func focus_node(node: CanvasItem) -> void: - var rt := node.get_node_or_null("./camera_remote_transformer") as RemoteTransform2D - focus_mutex.lock() - if rt: - if camera_remote_transformer and rt != camera_remote_transformer: - camera_remote_transformer.queue_free() - camera_remote_transformer = rt - else: - if camera_remote_transformer: - camera_remote_transformer.queue_free() - camera_remote_transformer = RemoteTransform2D.new() - node.add_child(camera_remote_transformer) - _setup_camera_remote_transformer() - focus_mutex.unlock() +func hide_bag(): + release_player() + prop_bag_instance.visible = false -func _setup_camera_remote_transformer(): - if not camera_remote_transformer: - return - camera_remote_transformer.remote_path = "/root/CameraFocusMarker" - camera_remote_transformer.update_position = true - camera_remote_transformer.update_rotation = false - camera_remote_transformer.update_scale = false - camera_remote_transformer.name = "camera_remote_transformer" - - -func focus_player(player: MainPlayer = null) -> void: - if not player: - player = get_player() - if player: - focus_node(player) - else: - printerr("Player node not found") - - -func focus_player_and_reset_zoom(duration := 1.0) -> void: - CameraFocusMarker.tween_zoom(1.0, duration).tween_callback(focus_player) +func quit_game(): + ArchiveManager.save_all() + get_tree().quit() # func player_moved_delta_x(delta_x: float) -> void: # # fog effect offset diff --git a/project.godot b/project.godot index d806d44b..eb945023 100644 --- a/project.godot +++ b/project.godot @@ -26,7 +26,7 @@ config/name_localized={ "zh_Hans": "衔蝶", "zh_Hant": "衔蝶" } -run/main_scene="res://scene/main.tscn" +run/main_scene="res://scene/index_page.tscn" config/features=PackedStringArray("4.3", "Mobile") config/icon="res://icon.svg" @@ -40,8 +40,6 @@ DebugMenu="*res://addons/debug_menu/debug_menu.tscn" DialogueManager="*res://addons/dialogue_manager/dialogue_manager.gd" GlobalConfigManager="*res://manager/config_manager/global_config_manager.gd" ArchiveManager="*res://manager/archive_manager/archive_manager.gd" -CameraFocusMarker="*res://scene/camera/camera_focus_marker.tscn" -MainCamera="*res://scene/camera/main_camera.tscn" SceneManager="*res://manager/deploy/scene/scene_manager.gd" AudioManager="*res://manager/audio_manager/audio_manager.gd" EventManager="*res://manager/event_manager/event_manager.gd" @@ -151,6 +149,16 @@ toggle_journal={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null) ] } +escape={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} +bag={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":66,"key_label":0,"unicode":98,"location":0,"echo":false,"script":null) +] +} [internationalization] diff --git a/scene/camera/camera_focus_marker.tscn b/scene/camera/camera_focus_marker.tscn deleted file mode 100644 index 4e490196..00000000 --- a/scene/camera/camera_focus_marker.tscn +++ /dev/null @@ -1,16 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://cqkeegrcdjyg4"] - -[ext_resource type="Script" path="res://scene/camera/camera_focus_marker.gd" id="1_7t4e6"] - -[node name="CameraFocusMarker" type="Marker2D"] -script = ExtResource("1_7t4e6") -lock_horizontal = null -speed = null -half_screen_size = null -limit_left = null -limit_right = null -limit_top = null -limit_bottom = null - -[node name="Target" type="Node2D" parent="."] -unique_name_in_owner = true diff --git a/scene/camera/main_camera.gd b/scene/camera/main_camera.gd deleted file mode 100644 index 1977a393..00000000 --- a/scene/camera/main_camera.gd +++ /dev/null @@ -1 +0,0 @@ -extends Camera2D diff --git a/scene/camera/main_camera.tscn b/scene/camera/main_camera.tscn deleted file mode 100644 index e52a3773..00000000 --- a/scene/camera/main_camera.tscn +++ /dev/null @@ -1,6 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://ogyvstscr0kx"] - -[ext_resource type="Script" path="res://scene/camera/main_camera.gd" id="1_pwiuw"] - -[node name="MainCamera" type="Camera2D"] -script = ExtResource("1_pwiuw") diff --git a/scene/dialog/balloon.tscn b/scene/dialog/balloon.tscn index 14cefcba..f7de00b2 100644 --- a/scene/dialog/balloon.tscn +++ b/scene/dialog/balloon.tscn @@ -164,7 +164,7 @@ mouse_filter = 1 text = "Response example" [node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] -volume_db = -15.0 +bus = &"dialog" [connection signal="gui_input" from="Balloon" to="." method="_on_balloon_gui_input"] [connection signal="response_selected" from="Balloon/Responses/ResponsesMenu" to="." method="_on_responses_menu_response_selected"] diff --git a/scene/entity/ambush.gd b/scene/entity/ambush.gd index 9373a8a9..643c2e43 100644 --- a/scene/entity/ambush.gd +++ b/scene/entity/ambush.gd @@ -3,6 +3,11 @@ extends Node2D signal player_entered +@export_enum("enter", "interact") var trigger_mode := "enter": + set(val): + trigger_mode = val + if is_node_ready(): + _check_sign_display() @export var one_shot := true # 首次进入 tree 就直接启用 @export var on_first_enter_tree := false @@ -32,9 +37,10 @@ var played_time := 0.0 # ground_archive.set_pair(name, "played", played) # played = val -@onready var area2d = %Area2D as Area2D +@onready var sign_marker := %Sign as Sign +@onready var area := %Area2D as Area2D @onready var ground_archive := ArchiveManager.archive.ground_archive() -@onready var played = ground_archive.get_value(name, "played", false): +@onready var played: bool = ground_archive.get_value(name, "played", false): set(val): played = val ground_archive.set_pair(name, "played", played) @@ -48,13 +54,19 @@ func _ready() -> void: animation_player.animation_libraries_updated.connect(notify_property_list_changed) if Engine.is_editor_hint(): return + _check_sign_display() if one_shot and played: if GlobalConfig.DEBUG: print("Ambush already played, name=", name) return if on_first_enter_tree: _entered(null) - area2d.body_entered.connect(_entered) + sign_marker.interacted.connect(_interacted) + area.body_entered.connect(_entered) + + +func _check_sign_display(): + sign_marker.show_sign = trigger_mode == "interact" and (not one_shot or not played) func _get_animation_player() -> AnimationPlayer: @@ -64,7 +76,17 @@ func _get_animation_player() -> AnimationPlayer: var enter_mutex = Mutex.new() -func _entered(_body): +func _interacted(): + if trigger_mode == "interact": + _do_trigger() + + +func _entered(_body = null): + if trigger_mode == "enter": + _do_trigger() + + +func _do_trigger(): var time = Time.get_ticks_msec() # 确保只有一个线程进入该逻辑,因为有时 player 碰撞和首次进入 tree 都会触发该方法 if not enter_mutex.try_lock(): @@ -89,13 +111,14 @@ func _entered(_body): # hook_dialogue if hook_dialogue_title: if lock_player_on_playing_dialogue: - SceneManager.freeze_player(0.0, "") + SceneManager.freeze_player(0.0) DialogueManager.show_dialogue_balloon(dialogue_res, hook_dialogue_title) DialogueManager.dialogue_ended.connect(_on_dialogue_ended, CONNECT_ONE_SHOT) player_entered.emit() if GlobalConfig.DEBUG: print("ambush body_entered!") enter_mutex.unlock() + _check_sign_display() func _on_dialogue_ended(_res): diff --git a/scene/entity/ambush.tscn b/scene/entity/ambush.tscn index 0942f6de..c94e07a2 100644 --- a/scene/entity/ambush.tscn +++ b/scene/entity/ambush.tscn @@ -1,16 +1,20 @@ -[gd_scene load_steps=3 format=3 uid="uid://bnf3lkcbpx1ar"] +[gd_scene load_steps=4 format=3 uid="uid://bnf3lkcbpx1ar"] [ext_resource type="Script" path="res://scene/entity/ambush.gd" id="1_rxgbr"] +[ext_resource type="PackedScene" uid="uid://c4tipnj1cr1j3" path="res://scene/entity/ux/sign.tscn" id="2_n51wc"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_iwrfx"] resource_local_to_scene = true size = Vector2(10, 70) -[node name="Ambush" type="Node2D"] +[node name="Ambush" type="Sprite2D"] script = ExtResource("1_rxgbr") hook_dialogue_title = "" hook_animation = "" +[node name="Sign" parent="." instance=ExtResource("2_n51wc")] +unique_name_in_owner = true + [node name="Area2D" type="Area2D" parent="."] unique_name_in_owner = true diff --git a/scene/entity/hd_entity.gd b/scene/entity/hd_entity.gd index c4603d99..e872c391 100644 --- a/scene/entity/hd_entity.gd +++ b/scene/entity/hd_entity.gd @@ -102,7 +102,7 @@ func _on_interacted() -> void: _on_cancel() return interacted = true - CameraFocusMarker.tween_zoom(1.8, 1.5) + SceneManager.get_camera_marker().tween_zoom(1.8) SceneManager.focus_node(self) # DialogueManager.show_dialogue_balloon(dialog, "diyizhang_01_03_mimi3") diff --git a/scene/entity/interactable.tscn b/scene/entity/interactable.tscn index e86a30c5..eb4212d0 100644 --- a/scene/entity/interactable.tscn +++ b/scene/entity/interactable.tscn @@ -17,7 +17,7 @@ region = Rect2(480, 468, 63, 63) [sub_resource type="RectangleShape2D" id="RectangleShape2D_8d3b4"] resource_local_to_scene = true -size = Vector2(35, 70) +size = Vector2(10, 70) [node name="Interactable" type="Sprite2D"] script = ExtResource("1_6nrd3") diff --git a/scene/entity/local_inspectable.gd b/scene/entity/local_inspectable.gd index d009b2ad..5855fb13 100644 --- a/scene/entity/local_inspectable.gd +++ b/scene/entity/local_inspectable.gd @@ -73,10 +73,10 @@ func _on_interacted() -> void: sfx.play() inspected_time = Time.get_ticks_msec() SceneManager.focus_node(self) - CameraFocusMarker.tween_zoom(2.0, 1.5) + SceneManager.get_camera_marker().tween_zoom(2.0) status = STATUS_INSPECTING_COVER sign_mark.show_sign = false - SceneManager.freeze_player(0) + SceneManager.freeze_player(0.0, PlayerAnimationConfig.ACTION_LOOKUP_WALL) cover_rect.texture = texture_cover tip_label.text = tip_cover _blink_label(true) @@ -115,7 +115,7 @@ func _on_cancel(_body = null): if blinking_tween and blinking_tween.is_running(): blinking_tween.kill() tween.parallel().tween_property(tip_label, "modulate:a", 0.0, 0.15) - SceneManager.focus_player_and_reset_zoom(1.0) + SceneManager.focus_player_and_reset_zoom() SceneManager.release_player() sign_mark.show_sign = true diff --git a/scene/entity/local_inspectable.tscn b/scene/entity/local_inspectable.tscn index e2269d0b..3bc3675a 100644 --- a/scene/entity/local_inspectable.tscn +++ b/scene/entity/local_inspectable.tscn @@ -5,7 +5,7 @@ [ext_resource type="AudioStream" uid="uid://csdwhc83jshd3" path="res://asset/audio/sfx/ui/纸条.mp3" id="3_3ldx7"] [ext_resource type="Texture2D" uid="uid://t526pexw4ng4" path="res://asset/art/tool/neutral_point_light.webp" id="3_o562w"] [ext_resource type="PackedScene" uid="uid://c4tipnj1cr1j3" path="res://scene/entity/ux/sign.tscn" id="4_do8tr"] -[ext_resource type="SpriteFrames" uid="uid://bvypjkvdwysx8" path="res://config/animation/entity_sprite_frames.tres" id="6_e77p4"] +[ext_resource type="SpriteFrames" uid="uid://b7fhheih1hbvf" path="res://config/animation/entity_sprite_frames.tres" id="6_e77p4"] [ext_resource type="Script" path="res://scene/entity/ux/animated_sound_sprite_2d.gd" id="7_bhwlx"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_4fuic"] @@ -54,7 +54,7 @@ unique_name_in_owner = true shape = SubResource("RectangleShape2D_4fuic") [node name="InspectLayer" type="CanvasLayer" parent="."] -layer = 11 +layer = 21 [node name="Root" type="Control" parent="InspectLayer"] layout_mode = 3 @@ -63,8 +63,9 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +mouse_filter = 2 -[node name="Container" type="PanelContainer" parent="InspectLayer/Root"] +[node name="Container" type="MarginContainer" parent="InspectLayer/Root"] unique_name_in_owner = true modulate = Color(1, 1, 1, 0) layout_mode = 1 diff --git a/scene/entity/note.gd b/scene/entity/note.gd index 183a41f5..57fd4f29 100644 --- a/scene/entity/note.gd +++ b/scene/entity/note.gd @@ -78,15 +78,15 @@ func _show_os(res, title): else: break SceneManager.pop_os(lines) - SceneManager.freeze_player(1.0, "") + SceneManager.freeze_player(1.0, PlayerAnimationConfig.ACTION_LOOKUP_WALL) func _show_balloon(res, title): # SceneManager.focus_node(self) - # CameraFocusMarker.tween_zoom(1.1, 1.5) + # SceneManager.get_camera_marker().tween_zoom(1.1, 1.5) DialogueManager.show_dialogue_balloon(res, title) # TODO note viewing animation - SceneManager.freeze_player(0, "") + SceneManager.freeze_player(0) interacting = true DialogueManager.dialogue_ended.connect(_on_ballon_ended, CONNECT_ONE_SHOT) # var player = SceneManager.get_player() diff --git a/scene/entity/ux/sign.gd b/scene/entity/ux/sign.gd index b745ff37..5ab905ec 100644 --- a/scene/entity/ux/sign.gd +++ b/scene/entity/ux/sign.gd @@ -4,10 +4,11 @@ class_name Sign extends Control @export var show_sign := true: set(val): show_sign = val - if val: - modulate.a = 1.0 - else: + # 隐藏时强制设置透明度为 0,显示时需要根据激活状态设置透明度 + if not val: modulate.a = 0.0 + elif activated: + modulate.a = 1.0 @export var draw_shadow := false signal interacted @@ -124,16 +125,22 @@ func _unhandled_input(event: InputEvent) -> void: # 传送时会导致 is_inside_tree 为 false,此时也无需与 prop hud 抢占 focus focus_mode = FOCUS_ALL grab_focus() + _set_handled() elif event.is_action_pressed("cancel"): cancel.emit() + _set_handled() release_focus() - var viewport = get_viewport() - if viewport: - viewport.set_input_as_handled() + + +func _set_handled(): + var viewport = get_viewport() + if viewport: + viewport.set_input_as_handled() var shake_tween + # 使用无效道具,抖动提示 func invalid_shake(): if shake_tween: diff --git a/scene/camera/camera_focus_marker.gd b/scene/ground/camera/camera_focus_marker.gd similarity index 69% rename from scene/camera/camera_focus_marker.gd rename to scene/ground/camera/camera_focus_marker.gd index 859af1f7..b3c2f4ec 100644 --- a/scene/camera/camera_focus_marker.gd +++ b/scene/ground/camera/camera_focus_marker.gd @@ -1,5 +1,6 @@ -extends Marker2D +class_name CameraFocusMarker extends Marker2D +@export var camera: Camera2D @export_group("Status") @export var lock_horizontal = true @export_group("Config") @@ -19,12 +20,16 @@ extends Marker2D @export var limit_bottom := 316.0 @onready var target = %Target as Node2D -# @onready var camera = %MainCamera as MainCamera var zoom_ratio := 1.0 var zoom_tween: Tween +func _ready() -> void: + if not camera: + push_error("Camera2D node not found") + + func tweak_position(velocity, facing_direction): var ideal_x = facing_direction.x * min(50.0, 0.5 * abs(velocity.x)) var current_x = target.position.x @@ -39,9 +44,11 @@ func tweak_position(velocity, facing_direction): func _physics_process(delta: float) -> void: + if not camera: + return # set camera's position var target_position = target.global_position - var current_position = MainCamera.global_position + var current_position = camera.global_position # easing with speed var position_delta = (target_position - current_position) * speed * delta var new_position = current_position + position_delta @@ -50,11 +57,11 @@ func _physics_process(delta: float) -> void: margin.y += shaded_height new_position.x = clamp(new_position.x, limit_left + margin.x, limit_right - margin.x) new_position.y = clamp(new_position.y, limit_top + margin.y, limit_bottom - margin.y) - MainCamera.global_position = new_position - MainCamera.zoom = Vector2(zoom_ratio, zoom_ratio) + camera.global_position = new_position + camera.zoom = Vector2(zoom_ratio, zoom_ratio) -func tween_zoom(ratio: float, duration := 1.0) -> Tween: +func tween_zoom(ratio: float, duration := .7) -> Tween: if zoom_tween and zoom_tween.is_running(): zoom_tween.kill() zoom_tween = create_tween() @@ -68,3 +75,25 @@ func tween_zoom(ratio: float, duration := 1.0) -> Tween: . set_ease(Tween.EASE_IN_OUT) ) return zoom_tween + + +var exited := false +var exit_position: Vector2 +var enter_tree_tween: Tween + + +func _exit_tree() -> void: + exit_position = global_position + exited = true + + +func _enter_tree() -> void: + if exited: + if enter_tree_tween and enter_tree_tween.is_running(): + enter_tree_tween.kill() + exited = false + global_position = exit_position + enter_tree_tween = create_tween() + enter_tree_tween.tween_property(self, "position", Vector2.ZERO, 0.2).set_trans( + Tween.TRANS_CUBIC + ) diff --git a/scene/ground/camera/camera_focus_marker.tscn b/scene/ground/camera/camera_focus_marker.tscn new file mode 100644 index 00000000..5dceb2e0 --- /dev/null +++ b/scene/ground/camera/camera_focus_marker.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=2 format=3 uid="uid://cqkeegrcdjyg4"] + +[ext_resource type="Script" path="res://scene/ground/camera/camera_focus_marker.gd" id="1_7t4e6"] + +[node name="CameraFocusMarker" type="Marker2D"] +script = ExtResource("1_7t4e6") + +[node name="Target" type="Node2D" parent="."] +unique_name_in_owner = true diff --git a/scene/ground/ground.gd b/scene/ground/ground.gd index 322868fd..c8ec6679 100644 --- a/scene/ground/ground.gd +++ b/scene/ground/ground.gd @@ -24,6 +24,8 @@ var footstep_type: String = "concrete": @onready var directional_light := %DirectionalLight2D as DirectionalLight2D @onready var bg_sprite = %BGSprite2D as Sprite2D @onready var foreground = %ParallaxForeground as ParallaxBackground +@onready var camera_focus_marker = %CameraFocusMarker as CameraFocusMarker +@onready var camera = %Camera2D as Camera2D @onready var footstep_audio = %FootstepAudioPlayer as RandomAudioStreamPlayer @@ -47,10 +49,16 @@ func _ready() -> void: return _set_camera_and_player_boundary() _load_footstep_audio() + focus_player() # %ColorRectTop.visible = true # %ColorRectBottom.visible = true +func _enter_tree() -> void: + if camera: + camera.enabled = true + + func _reset_player_positon(): player.position.y = player_y player.position.x = $DeployLayer/portal_left.position.x @@ -86,3 +94,25 @@ func _load_footstep_audio(): func play_footstep_sound() -> void: if not footstep_audio.audio_collections.is_empty(): footstep_audio.play_random() + + +var focus_mutex := Mutex.new() + + +func get_player() -> MainPlayer: + return player + + +func focus_node(node: CanvasItem) -> void: + if node.is_ancestor_of(camera_focus_marker): + return + focus_mutex.lock() + var parent = camera_focus_marker.get_parent() + if parent: + parent.remove_child(camera_focus_marker) + node.add_child(camera_focus_marker) + focus_mutex.unlock() + + +func focus_player() -> void: + focus_node(player) diff --git a/scene/ground/ground.tscn b/scene/ground/ground.tscn index 78ca7d8d..4b91e3bd 100644 --- a/scene/ground/ground.tscn +++ b/scene/ground/ground.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=7 format=3 uid="uid://dayyx4jerj7io"] +[gd_scene load_steps=8 format=3 uid="uid://dayyx4jerj7io"] [ext_resource type="Script" path="res://scene/ground/ground.gd" id="1_0vrlo"] [ext_resource type="PackedScene" uid="uid://cjhw5ecygrqty" path="res://scene/player/main_player.tscn" id="3_atha7"] [ext_resource type="PackedScene" uid="uid://61pis75a8fdq" path="res://scene/entity/portal.tscn" id="3_t73yw"] +[ext_resource type="PackedScene" uid="uid://cqkeegrcdjyg4" path="res://scene/ground/camera/camera_focus_marker.tscn" id="4_mgk0a"] [ext_resource type="Script" path="res://config/audio/random_audio_stream_player.gd" id="5_7mb2q"] [ext_resource type="Texture2D" uid="uid://by8h2yuqve7fw" path="res://asset/art/scene/c02/s06_院子回忆版/fg_有人.png" id="5_i5hii"] @@ -52,6 +53,10 @@ portal_name = "right" unique_name_in_owner = true position = Vector2(26, 40) +[node name="CameraFocusMarker" parent="MainPlayer" node_paths=PackedStringArray("camera") instance=ExtResource("4_mgk0a")] +unique_name_in_owner = true +camera = NodePath("../../Camera2D") + [node name="ParallaxForeground" type="ParallaxBackground" parent="."] unique_name_in_owner = true layer = 2 @@ -94,3 +99,6 @@ height = 0.5 [node name="FootstepAudioPlayer" type="AudioStreamPlayer" parent="."] unique_name_in_owner = true script = ExtResource("5_7mb2q") + +[node name="Camera2D" type="Camera2D" parent="."] +unique_name_in_owner = true diff --git a/scene/ground/scene/animation_root.gd b/scene/ground/scene/animation_root.gd index 08c4ac9a..b8f859b3 100644 --- a/scene/ground/scene/animation_root.gd +++ b/scene/ground/scene/animation_root.gd @@ -20,6 +20,13 @@ func _default_data() -> Dictionary: func _ready() -> void: + # 等待 DeployLayer 先加载完成 + var deploy_layer = get_node("../DeployLayer") + if deploy_layer: + if not deploy_layer.is_node_ready(): + deploy_layer.ready.connect(_on_deploy_layer_ready) + else: + _on_deploy_layer_ready() if Engine.is_editor_hint(): # notify_property_list_changed() # 更新 oneshot_animation 的可选项 @@ -34,6 +41,10 @@ func _ready() -> void: data[key] = archive_data[key] +func _on_deploy_layer_ready() -> void: + pass + + func _notification(what: int) -> void: # 仅在首次进入场景时触发 if what == NOTIFICATION_READY: diff --git a/scene/ground/scene/c01/s05_animation.gd b/scene/ground/scene/c01/s05_animation.gd index c5e9f606..dde0ad10 100644 --- a/scene/ground/scene/c01/s05_animation.gd +++ b/scene/ground/scene/c01/s05_animation.gd @@ -1,6 +1,8 @@ @tool extends AnimationRoot +var frame_relocated = false + # 覆盖该方法 func _default_data() -> Dictionary: @@ -10,3 +12,12 @@ func _default_data() -> Dictionary: func _ready() -> void: super._ready() + +func _on_deploy_layer_ready() -> void: + var node = $"../DeployLayer/ambush鸡毛掸子" + # 画框 + if node.played and node.one_shot: + frame_relocated = true + $"../DeployLayer/画框".rotation_degrees = 0.0 + if GlobalConfig.DEBUG: + print("重置画框位置") diff --git a/scene/ground/scene/c01/s05_院长房间.tscn b/scene/ground/scene/c01/s05_院长房间.tscn index 6ca36a13..2b2932b8 100644 --- a/scene/ground/scene/c01/s05_院长房间.tscn +++ b/scene/ground/scene/c01/s05_院长房间.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=24 format=3 uid="uid://dlx5xxbg53rb8"] +[gd_scene load_steps=27 format=3 uid="uid://dlx5xxbg53rb8"] [ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_ff4yb"] [ext_resource type="Script" path="res://scene/ground/scene/c01/s05_animation.gd" id="2_j5oim"] @@ -15,11 +15,197 @@ [ext_resource type="PackedScene" uid="uid://jr1yd46wm5je" path="res://scene/entity/note.tscn" id="10_18v0g"] [ext_resource type="Texture2D" uid="uid://diw7l2qdwbyoc" path="res://asset/art/scene/c01/s05_院长房间/e_画框.png" id="11_6gq1s"] [ext_resource type="Texture2D" uid="uid://dx3ym8inpuj5b" path="res://asset/art/scene/c01/s05_院长房间/e_鸡毛掸子.png" id="12_jtglg"] +[ext_resource type="SpriteFrames" uid="uid://b7fhheih1hbvf" path="res://config/animation/entity_sprite_frames.tres" id="14_e1bmq"] [ext_resource type="PackedScene" uid="uid://cw3q5pvciumil" path="res://scene/entity/interactable.tscn" id="14_lq1ou"] [ext_resource type="PackedScene" uid="uid://bnf3lkcbpx1ar" path="res://scene/entity/ambush.tscn" id="15_1uixh"] [ext_resource type="Texture2D" uid="uid://ox0ctin85kbl" path="res://asset/art/scene/c01/s05_院长房间/l_墙.png" id="16_qh7fg"] [ext_resource type="Texture2D" uid="uid://bojbuuxwvlkkg" path="res://asset/art/scene/c01/s05_院长房间/l_窗户光源.png" id="17_qqw2v"] +[sub_resource type="Animation" id="Animation_c6mhi"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("DeployLayer/使用鸡毛掸子:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(261, 42)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("DeployLayer/使用鸡毛掸子:frame") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("DeployLayer/使用鸡毛掸子:visible") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [false] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("DeployLayer/ambush鸡毛掸子:visible") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("MainPlayer:visible") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("DeployLayer/画框:rotation") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [-0.179769] +} + +[sub_resource type="Animation" id="Animation_il8ov"] +resource_name = "使用鸡毛掸子" +length = 4.0 +step = 0.02 +capture_included = true +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("MainPlayer:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0.28, 3.48), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(261, 40), Vector2(261, 40)] +} +tracks/1/type = "method" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("MainPlayer") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0.28), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [3.5, -1, true], +"method": &"freeze_player" +}] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("DeployLayer/画框:rotation") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(1.2, 2.44), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [-0.179974, 0.0] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("DeployLayer/使用鸡毛掸子:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0.44, 3.18), +"transitions": PackedFloat32Array(1, 1), +"update": 2, +"values": [0, 11] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("DeployLayer/使用鸡毛掸子:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = false +tracks/4/keys = { +"times": PackedFloat32Array(0.28, 3.36), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(261, 42), Vector2(261, 42)] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("DeployLayer/使用鸡毛掸子:visible") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0.28, 3.36), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [true, false] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("MainPlayer:visible") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0.28, 3.36), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("DeployLayer/ambush鸡毛掸子:visible") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0.02, 0.72, 2.82), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_ifimj"] +_data = { +"RESET": SubResource("Animation_c6mhi"), +"使用鸡毛掸子": SubResource("Animation_il8ov") +} + [sub_resource type="RectangleShape2D" id="RectangleShape2D_6i5gw"] resource_local_to_scene = true size = Vector2(40, 60) @@ -28,29 +214,32 @@ size = Vector2(40, 60) resource_local_to_scene = true size = Vector2(10, 60) -[sub_resource type="RectangleShape2D" id="RectangleShape2D_dq2na"] +[sub_resource type="RectangleShape2D" id="RectangleShape2D_5s1ih"] resource_local_to_scene = true -size = Vector2(10, 60) - -[sub_resource type="RectangleShape2D" id="RectangleShape2D_40ng7"] -resource_local_to_scene = true -size = Vector2(35, 70) +size = Vector2(10, 70) [node name="S05院长房间" type="Node2D"] [node name="Ground" parent="." instance=ExtResource("1_ff4yb")] +position = Vector2(1, 0) [node name="AnimationPlayer" parent="Ground" index="0"] +libraries = { +"": SubResource("AnimationLibrary_ifimj") +} script = ExtResource("2_j5oim") oneshot_animation = "" [node name="BGSprite2D" parent="Ground" index="2"] -position = Vector2(23, -118) +position = Vector2(23, -115) scale = Vector2(0.333, 0.333) texture = ExtResource("3_3r1q2") +[node name="portal_left" parent="Ground/DeployLayer" index="0"] +position = Vector2(26, 1) + [node name="portal_right" parent="Ground/DeployLayer" index="1"] -position = Vector2(502, 9) +position = Vector2(502, 11) texture = ExtResource("4_gdhoy") target_scene = "c01_s05" target_portal = "left" @@ -58,22 +247,22 @@ default_texture = ExtResource("4_gdhoy") opened_texture = ExtResource("5_cddn7") [node name="座钟" parent="Ground/DeployLayer" index="2" instance=ExtResource("6_v72k7")] -position = Vector2(334, 16) +position = Vector2(334, 18) texture = ExtResource("7_3tetc") texture_cover = ExtResource("7_3tetc") editor_filter = "c01" content_key = "c01_院长座钟" [node name="床" parent="Ground/DeployLayer" index="3" instance=ExtResource("6_v72k7")] -position = Vector2(84, 45) +position = Vector2(84, 47) texture = ExtResource("7_xakd0") [node name="钢琴" parent="Ground/DeployLayer" index="4" instance=ExtResource("6_v72k7")] -position = Vector2(413, 47) +position = Vector2(413, 49) texture = ExtResource("8_mnduo") [node name="桌椅" parent="Ground/DeployLayer" index="5" instance=ExtResource("10_18v0g")] -position = Vector2(154, 42) +position = Vector2(154, 44) texture = ExtResource("9_x837o") title_filter = "c01" note_key = "c01_院长书桌" @@ -81,12 +270,14 @@ note_key = "c01_院长书桌" [node name="Sign" parent="Ground/DeployLayer/桌椅" index="1"] offset_top = -21.0 offset_bottom = 59.0 +metadata/_edit_use_anchors_ = true [node name="CollisionShape2D" parent="Ground/DeployLayer/桌椅/Area2D" index="0"] shape = SubResource("RectangleShape2D_6i5gw") [node name="画框" parent="Ground/DeployLayer" index="6" instance=ExtResource("10_18v0g")] -position = Vector2(277, -28) +position = Vector2(277, -26) +rotation = -0.179769 texture = ExtResource("11_6gq1s") title_filter = "notes" note_key = "notes_挂画" @@ -96,33 +287,33 @@ offset_left = 3.0 offset_top = -7.0 offset_right = 86.0 offset_bottom = 73.0 +metadata/_edit_use_anchors_ = true [node name="CollisionShape2D" parent="Ground/DeployLayer/画框/Area2D" index="0"] position = Vector2(11, -1) shape = SubResource("RectangleShape2D_6bim4") -[node name="鸡毛掸子" parent="Ground/DeployLayer" index="7" instance=ExtResource("10_18v0g")] -position = Vector2(269, 20) +[node name="ambush鸡毛掸子" parent="Ground/DeployLayer" index="7" instance=ExtResource("15_1uixh")] +unique_name_in_owner = true +position = Vector2(270, 23) texture = ExtResource("12_jtglg") -title_filter = "c01" -note_key = "c01_鸡毛掸子" +trigger_mode = "interact" +one_shot = false +hook_animation = "使用鸡毛掸子" -[node name="Area2D" parent="Ground/DeployLayer/鸡毛掸子" index="3"] -position = Vector2(-7, 0) +[node name="使用鸡毛掸子" type="AnimatedSprite2D" parent="Ground/DeployLayer" index="8"] +visible = false +position = Vector2(261, 42) +sprite_frames = ExtResource("14_e1bmq") +animation = &"c01_小小蝶_拿鸡毛掸子" -[node name="CollisionShape2D" parent="Ground/DeployLayer/鸡毛掸子/Area2D" index="0"] -shape = SubResource("RectangleShape2D_dq2na") - -[node name="Interactable" parent="Ground/DeployLayer" index="8" instance=ExtResource("14_lq1ou")] -position = Vector2(207, 30) +[node name="Interactable" parent="Ground/DeployLayer" index="9" instance=ExtResource("14_lq1ou")] +position = Vector2(207, 32) one_shot = false prop_key = "prop_1012钥匙" [node name="CollisionShape2D" parent="Ground/DeployLayer/Interactable/Area2D" index="0"] -shape = SubResource("RectangleShape2D_40ng7") - -[node name="Ambush" parent="Ground/DeployLayer" index="9" instance=ExtResource("15_1uixh")] -position = Vector2(113, 46) +shape = SubResource("RectangleShape2D_5s1ih") [node name="PointLight墙" type="PointLight2D" parent="Ground/AmbientLayer" index="0"] visible = false @@ -137,6 +328,7 @@ texture_scale = 0.33 height = 50.0 [node name="MainPlayer" parent="Ground" index="5"] +position = Vector2(261, 40) character = "小小蝶" [node name="FGSprite2D" parent="Ground/ParallaxForeground/FGParallaxLayer" index="0"] @@ -161,6 +353,5 @@ texture = ExtResource("3_7u4bh") [editable path="Ground"] [editable path="Ground/DeployLayer/桌椅"] [editable path="Ground/DeployLayer/画框"] -[editable path="Ground/DeployLayer/鸡毛掸子"] [editable path="Ground/DeployLayer/Interactable"] [editable path="Ground/DeployLayer/Interactable/Sign"] diff --git a/scene/ground/scene/c02/s01_animation.gd b/scene/ground/scene/c02/s01_animation.gd index 21cab6f3..4d0cdf80 100644 --- a/scene/ground/scene/c02/s01_animation.gd +++ b/scene/ground/scene/c02/s01_animation.gd @@ -15,6 +15,8 @@ func _ready() -> void: elif GlobalConfig.DEBUG: print("_give_letter 已发放") +func _on_deploy_layer_ready() -> void: + pass func _give_letter() -> void: set_data("received_letter", true) diff --git a/scene/ground/scene/c02/s01_街道.tscn b/scene/ground/scene/c02/s01_街道.tscn index 4f2f5574..4a3e646c 100644 --- a/scene/ground/scene/c02/s01_街道.tscn +++ b/scene/ground/scene/c02/s01_街道.tscn @@ -27,22 +27,18 @@ target_portal = "left" [node name="Note" parent="Ground/DeployLayer" index="2" instance=ExtResource("3_6lnxd")] position = Vector2(250, -22) -note_key = "c02_寻人启事" +mode = null [node name="Note门口" parent="Ground/DeployLayer" index="3" instance=ExtResource("3_6lnxd")] position = Vector2(311, -27) mode = "ballon" dialogue = "c02" -note_key = "c02_s01_门口" [node name="Ambush" parent="Ground/DeployLayer" index="4" instance=ExtResource("6_vgxa0")] position = Vector2(135, 56) -lock_player_on_playing_dialogue = null -hook_dialogue_res = null -hook_animation = null [node name="MainPlayer" parent="Ground" index="5"] -position = Vector2(78, 45) +position = Vector2(78, 40) [node name="FGSprite2D" parent="Ground/ParallaxForeground/FGParallaxLayer" index="0"] texture = null diff --git a/scene/ground/scene/c02/s02_animation.gd b/scene/ground/scene/c02/s02_animation.gd index 9a98d673..0cdc2957 100644 --- a/scene/ground/scene/c02/s02_animation.gd +++ b/scene/ground/scene/c02/s02_animation.gd @@ -1,6 +1,8 @@ @tool extends AnimationRoot +@onready var wind_blows = $"../DeployLayer/WindBlows" as AnimatedSprite2D + # 覆盖该方法 func _default_data() -> Dictionary: @@ -11,8 +13,20 @@ func _ready() -> void: super._ready() +func _on_deploy_layer_ready() -> void: + pass + func _oneshot_wind(): - SceneManager.freeze_player(0, "c02_吕萍_风吹过", false, Vector2(200, 0)) + SceneManager.freeze_player(0) + %MainPlayer.visible = false + wind_blows.visible = true + wind_blows.play() + wind_blows.animation_finished.connect(_on_wind_finished, CONNECT_ONE_SHOT) + + +func _on_wind_finished(): + %MainPlayer.visible = true + wind_blows.visible = false func _oneshot_dialog(): diff --git a/scene/ground/scene/c02/s02_走道.tscn b/scene/ground/scene/c02/s02_走道.tscn index 08bdad1d..762b6fa8 100644 --- a/scene/ground/scene/c02/s02_走道.tscn +++ b/scene/ground/scene/c02/s02_走道.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=12 format=3 uid="uid://brck77w81fhvc"] +[gd_scene load_steps=13 format=3 uid="uid://brck77w81fhvc"] [ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_wrr6r"] [ext_resource type="Script" path="res://scene/ground/scene/c02/s02_animation.gd" id="2_5p8ev"] [ext_resource type="Texture2D" uid="uid://c4647gof464ws" path="res://asset/art/scene/c02/s02_走道/bg_过道.png" id="2_cn1s8"] [ext_resource type="PackedScene" uid="uid://jr1yd46wm5je" path="res://scene/entity/note.tscn" id="3_fy0o1"] +[ext_resource type="SpriteFrames" uid="uid://b7fhheih1hbvf" path="res://config/animation/entity_sprite_frames.tres" id="4_wbif8"] [ext_resource type="PackedScene" uid="uid://wyj4qdjyn4ql" path="res://scene/entity/old/inspectable.tscn" id="5_nhtbp"] [ext_resource type="Texture2D" uid="uid://ds4yw1wqelhm1" path="res://asset/art/scene/c02/s02_走道/ux_进门鼠疫海报yz.png" id="7_wdwbi"] [ext_resource type="Texture2D" uid="uid://dd0sn5e4hwq5m" path="res://asset/art/scene/c02/s02_走道/e_纸人.png" id="7_xsghn"] @@ -58,16 +59,25 @@ position = Vector2(678, 6) target_scene = "c02_s03" target_portal = "left" -[node name="几张卫生宣传画" parent="Ground/DeployLayer" index="2" instance=ExtResource("3_fy0o1")] +[node name="WindBlows" type="AnimatedSprite2D" parent="Ground/DeployLayer" index="2"] +unique_name_in_owner = true +visible = false +position = Vector2(435, 9) +scale = Vector2(1.2, 1.2) +sprite_frames = ExtResource("4_wbif8") +animation = &"c02_吕萍_风吹过" + +[node name="几张卫生宣传画" parent="Ground/DeployLayer" index="3" instance=ExtResource("3_fy0o1")] position = Vector2(275, -30) +title_filter = "c02" note_key = "c02_卫生宣传画" -[node name="鼠疫海报" parent="Ground/DeployLayer" index="3" instance=ExtResource("12_0fckv")] -position = Vector2(440, -21) +[node name="鼠疫海报" parent="Ground/DeployLayer" index="4" instance=ExtResource("12_0fckv")] +position = Vector2(439, -18) texture_cover = ExtResource("7_wdwbi") content_key = "c02_鼠疫海报" -[node name="纸人" parent="Ground/DeployLayer" index="4" instance=ExtResource("5_nhtbp")] +[node name="纸人" parent="Ground/DeployLayer" index="5" instance=ExtResource("5_nhtbp")] position = Vector2(599, 44) texture = ExtResource("7_xsghn") flip_h = true diff --git a/scene/ground/scene/c02/s03_animation.gd b/scene/ground/scene/c02/s03_animation.gd index c5e9f606..48a3c043 100644 --- a/scene/ground/scene/c02/s03_animation.gd +++ b/scene/ground/scene/c02/s03_animation.gd @@ -10,3 +10,6 @@ func _default_data() -> Dictionary: func _ready() -> void: super._ready() + +func _on_deploy_layer_ready() -> void: + pass \ No newline at end of file diff --git a/scene/index_page.gd b/scene/index_page.gd new file mode 100644 index 00000000..73219aac --- /dev/null +++ b/scene/index_page.gd @@ -0,0 +1,81 @@ +extends Control + +@onready var settings = $Settings +@onready var animation_player = $AnimationPlayer as AnimationPlayer +@onready var animation_root = $AnimationRoot as Control +@onready var sfx = %Sfx as Sfx +@onready var newgame_btn = %NewGame as Button +@onready var resume_btn = %Resume as Button +@onready var quit_btn = %Quit as Button + +var main_scene = preload("res://scene/main.tscn") +var animation_finished = false + + +func _ready(): + if GlobalConfig.DEBUG: + print("Index Page Ready") + newgame_btn.pressed.connect(_on_newgame_pressed) + resume_btn.pressed.connect(_on_resume_pressed) + quit_btn.pressed.connect(_on_quit_pressed) + _check_resume_btn() + if SceneManager.first_entered: + SceneManager.first_entered = false + # 播放开始动画 + animation_player.play("intro") + animation_player.animation_finished.connect(_on_intro_finished) + else: + animation_finished = true + + +func _on_intro_finished(_a): + animation_root.visible = false + animation_finished = true + + +func _check_resume_btn(): + if not ArchiveManager.archives.has(1): + resume_btn.queue_free() + + +func _on_newgame_pressed(): + sfx.global_play() + # 覆盖使用 1 号存档 + ArchiveManager.create_and_use_new_archive(1) + _enter_main_scene() + + +func _on_resume_pressed(): + sfx.global_play() + # 继续一号存档 + if GlobalConfig.DEBUG: + print("Resume") + if ArchiveManager.archives.has(1): + GlobalConfigManager.config.current_selected_archive_id = 1 + ArchiveManager.load_archive() + else: + ArchiveManager.create_and_use_new_archive(1) + _enter_main_scene() + + +func _enter_main_scene(): + get_tree().change_scene_to_packed(main_scene) + + +func _on_quit_pressed(): + # 退出时点击音效将无法播放 + sfx.global_play() + SceneManager.quit_game() + + +func _unhandled_input(event: InputEvent) -> void: + if event.is_action_pressed("escape"): + get_viewport().set_input_as_handled() + if not animation_finished: + # 跳过开始动画 + animation_player.stop() + animation_root.visible = false + animation_finished = true + else: + # 设置菜单 + settings.visible = true diff --git a/scene/index_page.tscn b/scene/index_page.tscn new file mode 100644 index 00000000..b2333a64 --- /dev/null +++ b/scene/index_page.tscn @@ -0,0 +1,131 @@ +[gd_scene load_steps=11 format=3 uid="uid://c4ycvdsabi7lw"] + +[ext_resource type="Script" path="res://scene/index_page.gd" id="1_c7y7r"] +[ext_resource type="Texture2D" uid="uid://5xv603j8tuon" path="res://asset/art/ui/entrance/菜单背景1.png" id="1_jxn4k"] +[ext_resource type="PackedScene" uid="uid://c85t6stvytvjn" path="res://scene/entity/ux/sfx.tscn" id="2_cac5f"] +[ext_resource type="PackedScene" uid="uid://beok2r6fgburn" path="res://scene/settings/settings.tscn" id="4_5m37n"] + +[sub_resource type="Animation" id="Animation_8kiap"] +resource_name = "default" + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_0d65a"] +_data = { +"intro": SubResource("Animation_8kiap") +} + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_gu56a"] +content_margin_top = 4.0 +content_margin_bottom = 4.0 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_q8n5c"] +bg_color = Color(0.327299, 0.327299, 0.327299, 0.619608) +corner_radius_top_left = 4 +corner_radius_top_right = 4 +corner_radius_bottom_right = 4 +corner_radius_bottom_left = 4 +expand_margin_top = 4.0 +expand_margin_bottom = 4.0 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_scxsv"] +bg_color = Color(0.811765, 0.811765, 0.811765, 0.521569) +border_color = Color(0.336608, 0.336608, 0.336608, 0.517647) +corner_radius_top_left = 4 +corner_radius_top_right = 4 +corner_radius_bottom_right = 4 +corner_radius_bottom_left = 4 +expand_margin_top = 4.0 +expand_margin_bottom = 4.0 + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_vyh3d"] +content_margin_top = 4.0 +content_margin_bottom = 4.0 + +[node name="IndexPage" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_c7y7r") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_0d65a") +} + +[node name="AnimationRoot" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Sfx" parent="." instance=ExtResource("2_cac5f")] +unique_name_in_owner = true + +[node name="TextureRect" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("1_jxn4k") +expand_mode = 1 + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = 137.0 +offset_top = -39.0 +offset_right = 225.0 +offset_bottom = 80.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="NewGame" type="Button" parent="VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_styles/focus = SubResource("StyleBoxEmpty_gu56a") +theme_override_styles/hover = SubResource("StyleBoxFlat_q8n5c") +theme_override_styles/pressed = SubResource("StyleBoxFlat_scxsv") +theme_override_styles/normal = SubResource("StyleBoxEmpty_vyh3d") +text = "index_新游戏" + +[node name="Resume" type="Button" parent="VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_styles/focus = SubResource("StyleBoxEmpty_gu56a") +theme_override_styles/hover = SubResource("StyleBoxFlat_q8n5c") +theme_override_styles/pressed = SubResource("StyleBoxFlat_scxsv") +theme_override_styles/normal = SubResource("StyleBoxEmpty_vyh3d") +text = "index_继续游戏" + +[node name="Quit" type="Button" parent="VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_styles/focus = SubResource("StyleBoxEmpty_gu56a") +theme_override_styles/hover = SubResource("StyleBoxFlat_q8n5c") +theme_override_styles/pressed = SubResource("StyleBoxFlat_scxsv") +theme_override_styles/normal = SubResource("StyleBoxEmpty_vyh3d") +text = "index_退出游戏" + +[node name="Settings" parent="." instance=ExtResource("4_5m37n")] +visible = false + +[node name="ColorRect" type="ColorRect" parent="Settings"] +z_index = -1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +color = Color(0, 0, 0, 0.862745) diff --git a/scene/main.gd b/scene/main.gd index 58547ef9..d6965342 100644 --- a/scene/main.gd +++ b/scene/main.gd @@ -5,12 +5,25 @@ extends Node2D TranslationServer.set_locale(val) locale = val +@onready var settings = %Settings + func _ready() -> void: - if GlobalConfig.DEBUG: - get_window().always_on_top = true - $UILayer.layer = GlobalConfig.CANVAS_LAYER_UI + %UILayer.layer = GlobalConfig.CANVAS_LAYER_UI %ColorRectTop.visible = true %ColorRectBottom.visible = true + # focus_mode = Control.FOCUS_CLICK + # settings.exited.connect(grab_focus) - + +func _on_settings_hide(): + SceneManager.release_player() + + +func _unhandled_input(event: InputEvent) -> void: + if event.is_action_pressed("escape"): + settings.visible = true + get_viewport().set_input_as_handled() + elif event.is_action_pressed("bag"): + SceneManager.show_bag() + get_viewport().set_input_as_handled() diff --git a/scene/main.tscn b/scene/main.tscn index 1ec61be5..ac819ad9 100644 --- a/scene/main.tscn +++ b/scene/main.tscn @@ -1,24 +1,23 @@ -[gd_scene load_steps=9 format=3 uid="uid://dygvcmykn02n8"] +[gd_scene load_steps=10 format=3 uid="uid://dygvcmykn02n8"] [ext_resource type="Script" path="res://scene/main.gd" id="1_pks84"] [ext_resource type="PackedScene" uid="uid://3gk1gxwanw24" path="res://scene/shading/shading_layer.tscn" id="2_d1re1"] -[ext_resource type="PackedScene" uid="uid://dc778gsjfr3ky" path="res://scene/hud/prop_hud.tscn" id="4_t7gb2"] +[ext_resource type="PackedScene" uid="uid://dc778gsjfr3ky" path="res://scene/prop/prop_hud.tscn" id="4_t7gb2"] [ext_resource type="PackedScene" uid="uid://5g07x6q7wwr1" path="res://scene/notification/notification.tscn" id="5_3gg5t"] -[ext_resource type="PackedScene" uid="uid://cekhj65axie0p" path="res://scene/popup/prop_inspector.tscn" id="5_ux0rw"] +[ext_resource type="PackedScene" uid="uid://cekhj65axie0p" path="res://scene/prop/prop_inspector.tscn" id="5_ux0rw"] [ext_resource type="Environment" uid="uid://c6ri8tn5qt6fe" path="res://scene/ground/environment.tres" id="9_jsof5"] +[ext_resource type="PackedScene" uid="uid://beok2r6fgburn" path="res://scene/settings/settings.tscn" id="9_muu0b"] [ext_resource type="PackedScene" uid="uid://clxgkj80yin2" path="res://scene/ground/ground_loader.tscn" id="10_8rc5n"] [ext_resource type="PackedScene" uid="uid://cvbt5qm70cg7t" path="res://scene/journal/journal.tscn" id="10_durpa"] [node name="Main" type="Node2D"] script = ExtResource("1_pks84") -locale = "en" [node name="WorldEnvironment" type="WorldEnvironment" parent="."] environment = ExtResource("9_jsof5") [node name="GroundLoader" parent="." instance=ExtResource("10_8rc5n")] position = Vector2(1, 0) -ignore_archive = true current_scene = "c01_s05" entrance_portal = "right" @@ -26,8 +25,10 @@ entrance_portal = "right" [node name="PropInspector" parent="." instance=ExtResource("5_ux0rw")] unique_name_in_owner = true +layer = 21 [node name="UILayer" type="CanvasLayer" parent="."] +unique_name_in_owner = true layer = 12 [node name="ColorRectTop" type="ColorRect" parent="UILayer"] @@ -76,3 +77,7 @@ metadata/_edit_use_anchors_ = true [node name="Journal" parent="." instance=ExtResource("10_durpa")] visible = false + +[node name="Settings" parent="." instance=ExtResource("9_muu0b")] +unique_name_in_owner = true +visible = false diff --git a/scene/player/main_player.gd b/scene/player/main_player.gd index 5230da3f..c8d2d0cb 100644 --- a/scene/player/main_player.gd +++ b/scene/player/main_player.gd @@ -9,16 +9,25 @@ class_name MainPlayer current_animation_config = PlayerAnimationConfig.ANIMATION_CONFIG[val] current_status = PlayerAnimationConfig.MOVEMENT_IDLE if is_node_ready(): - var _scale = current_animation_config["scale"] - sprite.scale = Vector2(_scale, _scale) + sprite.scale = current_animation_config["scale"] # @export var shadow_color := Color(0.1, 0.1, 0.1, 0.7) # var shadow_y := 0.0 @export var player_movement_rect := Rect2(50, -500, 1400, 1000) @export var velocity_ratio := 1.0 + +# action_locked 用于设置界面等强制锁定,action_freezed 用于查看物品等锁定 +# action_locked 优先级高于 action_freezed +# action_locked 对应 lock 与 unlock 方法 @export var action_locked := false: set(val): action_locked = val _process_action_lock() +# action_freezed 对应 freeze 与 release 方法 +@export var action_freezed := false: + set(val): + action_freezed = val + _process_action_lock() + @export_enum("idle", "walking", "running") var current_status := 0: set(val): current_status = val @@ -42,12 +51,13 @@ var current_animation_config := PlayerAnimationConfig.ANIMATION_CONFIG[character func _ready() -> void: os_contaner.modulate.a = 0.0 # set up animated sprite - var _scale = current_animation_config["scale"] - sprite.scale = Vector2(_scale, _scale) + sprite.scale = current_animation_config["scale"] _play_animation() + if Engine.is_editor_hint(): + return footstep_timer.timeout.connect(_on_footstep_timer_timeout) footstep_timer.stop() - SceneManager.focus_player(self) + # SceneManager.focus_player(self) func _on_footstep_timer_timeout(): @@ -59,7 +69,7 @@ func _on_footstep_timer_timeout(): func _process_action_lock() -> void: # reset status to idle or stay - if action_locked: + if action_locked or action_freezed: velocity = Vector2.ZERO if ( current_status == PlayerAnimationConfig.MOVEMENT_WALKING @@ -94,6 +104,7 @@ func _play_animation() -> void: if not sprite: return sprite.offset = current_animation_config["foot_offset"] + sprite.scale = current_animation_config["scale"] # reset the os label position on animation changed. _reset_os_and_shadow_position() var config = current_animation_config[current_status] @@ -135,7 +146,7 @@ func _get_speed(direction: Vector2) -> Vector2: func _physics_process(_delta: float) -> void: - if action_locked or Engine.is_editor_hint(): + if action_locked or action_freezed or Engine.is_editor_hint(): velocity = Vector2.ZERO return var x_direction := Input.get_axis("left", "right") @@ -157,7 +168,7 @@ func _physics_process(_delta: float) -> void: # drag the camera marker against the player movement # so there will be a better vision in front of the player. func _tweak_camera_marker(): - CameraFocusMarker.tweak_position(velocity, facing_direction) + SceneManager.get_camera_marker().tweak_position(velocity, facing_direction) var lock_mutex = Mutex.new() @@ -165,15 +176,41 @@ var release_timer: SceneTreeTimer # lock_time: the time to lock the player action. 0 means lock forever, thus the player will be locked until release_player is called. -func freeze_player(lock_time: float, animation: String, loop: bool, offset: Vector2) -> void: +func freeze_player(lock_time: float, action_animation: int, auto_quit: bool) -> void: lock_mutex.lock() - if not action_locked: - action_locked = true + if not action_freezed: + action_freezed = true + if current_animation_config.has(action_animation): + # animation_name, scale, offset + var config = current_animation_config[action_animation] + var animation = config[0] + if not animation and config.size() >= 4: + animation = config[4] if facing_direction.x > 0.0 else config[3] + sprite.scale = config[1] if config.size() > 1 else Vector2.ONE + sprite.offset = config[2] if config.size() > 2 else Vector2.ZERO + if animation and sprite.sprite_frames.has_animation(animation): + sprite.sprite_frames.set_animation_loop(animation, false) + sprite.play(animation) + if auto_quit: + # reset animation after one play + sprite.animation_finished.connect(_play_animation, CONNECT_ONE_SHOT) + if lock_time: + if release_timer and release_timer.time_left > 0: + release_timer.time_left = max(lock_time, release_timer.time_left) + else: + release_timer = get_tree().create_timer(lock_time) + release_timer.timeout.connect(release_player) + lock_mutex.unlock() + + +func freeze_and_play(lock_time: float, animation: String, auto_quit: bool) -> void: + lock_mutex.lock() + if not action_freezed: + action_freezed = true if animation and sprite.sprite_frames.has_animation(animation): - sprite.sprite_frames.set_animation_loop(animation, loop) - sprite.offset = offset + sprite.sprite_frames.set_animation_loop(animation, false) sprite.play(animation) - if not loop: + if auto_quit: # reset animation after one play sprite.animation_finished.connect(_play_animation, CONNECT_ONE_SHOT) if lock_time: @@ -188,10 +225,10 @@ func freeze_player(lock_time: float, animation: String, loop: bool, offset: Vect func release_player(): release_timer = null lock_mutex.lock() - action_locked = false + action_freezed = false # velocity_ratio = 1.0 lock_mutex.unlock() - _play_animation() + # _play_animation() # func _draw() -> void: @@ -271,3 +308,19 @@ func pop_os(lines := []): func _os_load_line(line): os_label.dialogue_line = line + + +# func walk_to(pos: Vector2, duration: float, auto_unfreeze := true) -> void: +# var tween = create_tween() +# action_freezed = true +# velocity = Vector2.ZERO +# current_status = PlayerAnimationConfig.MOVEMENT_WALKING +# facing_direction.x = 1.0 if pos.x > global_position.x else -1.0 +# _play_animation() +# tween.tween_property(self, "global_position", pos, duration) +# if auto_unfreeze: +# tween.tween_callback(_after_walk_to) + + +# func _after_walk_to(): +# action_freezed = false diff --git a/scene/player/main_player.tscn b/scene/player/main_player.tscn index 1e6c3623..4eaf5e04 100644 --- a/scene/player/main_player.tscn +++ b/scene/player/main_player.tscn @@ -1,8 +1,7 @@ -[gd_scene load_steps=9 format=3 uid="uid://cjhw5ecygrqty"] +[gd_scene load_steps=8 format=3 uid="uid://cjhw5ecygrqty"] [ext_resource type="Script" path="res://scene/player/main_player.gd" id="1_3a78y"] [ext_resource type="SpriteFrames" uid="uid://b7fhheih1hbvf" path="res://config/animation/entity_sprite_frames.tres" id="2_3w63u"] -[ext_resource type="Texture2D" uid="uid://may55b2uerbw" path="res://asset/art/neutral_point_light.png" id="3_h4uja"] [ext_resource type="Texture2D" uid="uid://bucpmiscjaem0" path="res://asset/art/ui/对话框.png" id="4_0qo0c"] [ext_resource type="FontFile" uid="uid://coy0c115cjmv5" path="res://asset/font/MPLUS中文像素.TTF" id="4_4jk1c"] [ext_resource type="Script" path="res://addons/dialogue_manager/dialogue_label.gd" id="5_tclgd"] @@ -37,20 +36,12 @@ wait_time = 0.5 [node name="CollisionShape2D" type="CollisionShape2D" parent="."] shape = SubResource("RectangleShape2D_fno82") -[node name="PointLight2D" type="PointLight2D" parent="."] -position = Vector2(1, -44) -scale = Vector2(0.810547, 0.849609) -energy = 0.2 -texture = ExtResource("3_h4uja") -texture_scale = 2.0 -height = 20.0 - [node name="OSPivot" type="Control" parent="."] unique_name_in_owner = true layout_mode = 3 anchors_preset = 0 -offset_top = -50.0 -offset_bottom = -50.0 +offset_top = -60.0 +offset_bottom = -60.0 mouse_filter = 2 [node name="MarginContainer" type="MarginContainer" parent="OSPivot"] diff --git a/scene/player/player_animation_config.gd b/scene/player/player_animation_config.gd index f584e286..33a8d5b1 100644 --- a/scene/player/player_animation_config.gd +++ b/scene/player/player_animation_config.gd @@ -1,15 +1,19 @@ -class_name PlayerAnimationConfig extends Object +class_name PlayerAnimationConfig extends RefCounted enum { + # movement animation MOVEMENT_IDLE, MOVEMENT_WALKING, MOVEMENT_RUNNING, + # action animation + ACTION_NONE, + ACTION_LOOKUP_WALL, } const ANIMATION_CONFIG = { "吕萍": { - "scale": 0.6, + "scale": Vector2(0.6, 0.6), "speed_walking": 75.0, "running_locked": false, "speed_runnig": 120.0, @@ -22,16 +26,18 @@ const ANIMATION_CONFIG = { MOVEMENT_IDLE: [&"c00_吕萍_idle_left", &"c00_吕萍_idle_right"], MOVEMENT_WALKING: [&"c00_吕萍_walking_left", &"c00_吕萍_walking_right"], MOVEMENT_RUNNING: [&"c00_吕萍_running_left", &"c00_吕萍_running_right"], + # animation_name, scale, offset + ACTION_LOOKUP_WALL: [&"c00_吕萍_记笔记_right", Vector2(1.2, 1.2), Vector2(0, 0)], }, "吕萍爬行": { - "scale": 1.0, + "scale": Vector2(0.6, 0.6), "speed_walking": 50.0, "running_locked": true, "speed_runnig": 50.0, "walk_footstep": 0.7, "run_footstep": 0.7, - "os_height": 35.0, + "os_height": 10.0, # 人物脚底 offset,吕萍为 0,高 200px,足底在 100px 处 # 吕萍爬行高 59px "foot_offset": Vector2(0, 27.0), @@ -41,7 +47,7 @@ const ANIMATION_CONFIG = { }, "吕萍带小猫": { - "scale": 0.6, + "scale": Vector2(0.6, 0.6), "speed_walking": 75.0, "running_locked": true, "speed_runnig": 75.0, @@ -56,7 +62,7 @@ const ANIMATION_CONFIG = { }, "小蝶": { - "scale": 0.6, + "scale": Vector2.ONE, "speed_walking": 75.0, "running_locked": true, "speed_runnig": 75.0, @@ -71,20 +77,22 @@ const ANIMATION_CONFIG = { }, "小小蝶": { - "scale": 1.0, + "scale": Vector2.ONE, "speed_walking": 65.0, "running_locked": false, "speed_runnig": 100.0, "walk_footstep": 0.5, "run_footstep": 7.0 / 10.0 / 2.0, - "os_height": 30.0, + "os_height": 10.0, # 人物脚底 offset,吕萍为 0,高 200px,足底在 100px 处 # 小蝶高 124px,行走时 116px "foot_offset": Vector2(0, 20.0), MOVEMENT_IDLE: [&"c01_小小蝶_idle_l", &"c01_小小蝶_idle_r"], # 此处为[2][3]分别为 sprite 向左、向右时的 offset MOVEMENT_WALKING: - [&"c01_小小蝶_walking_l", &"c01_小小蝶_walking_r", Vector2(0, 4.0), Vector2(0, 4.0)], + [&"c01_小小蝶_walking_l", &"c01_小小蝶_walking_r"], MOVEMENT_RUNNING: [&"c01_小小蝶_running_l", &"c01_小小蝶_running_r"], + # animation_name, scale, offset, left, right + ACTION_LOOKUP_WALL: [&"", Vector2(1, 1), Vector2(0, 20.0), &"c01_小小蝶_抬头_l", &"c01_小小蝶_抬头_r"], }, } diff --git a/scene/prop/prop_bag.gd b/scene/prop/prop_bag.gd new file mode 100644 index 00000000..6e73d500 --- /dev/null +++ b/scene/prop/prop_bag.gd @@ -0,0 +1,5 @@ +extends CanvasLayer + + +func _ready(): + layer = GlobalConfig.CANVAS_LAYER_BAG \ No newline at end of file diff --git a/scene/prop/prop_bag.tscn b/scene/prop/prop_bag.tscn new file mode 100644 index 00000000..988084b5 --- /dev/null +++ b/scene/prop/prop_bag.tscn @@ -0,0 +1,109 @@ +[gd_scene load_steps=3 format=3 uid="uid://b6gbolo1o7wdf"] + +[ext_resource type="Script" path="res://scene/prop/prop_bag.gd" id="1_f3hpu"] +[ext_resource type="Texture2D" uid="uid://byhsxyikuvcfn" path="res://asset/art/ui/小蝶笔记.png" id="2_3s314"] + +[node name="PropBag" type="CanvasLayer"] +script = ExtResource("1_f3hpu") + +[node name="Control" type="Control" parent="."] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="TextureRect" type="TextureRect" parent="Control"] +layout_mode = 1 +anchors_preset = 14 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +offset_top = -120.0 +offset_bottom = 120.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("2_3s314") +expand_mode = 5 +stretch_mode = 2 + +[node name="GridContainer" type="GridContainer" parent="Control"] +custom_minimum_size = Vector2(270, 120) +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -20.0 +offset_top = -20.0 +offset_right = 20.0 +offset_bottom = 20.0 +grow_horizontal = 2 +grow_vertical = 2 +columns = 9 + +[node name="Panel" type="Panel" parent="Control/GridContainer"] +custom_minimum_size = Vector2(30, 30) +layout_mode = 2 + +[node name="Panel2" type="Panel" parent="Control/GridContainer"] +custom_minimum_size = Vector2(30, 30) +layout_mode = 2 + +[node name="Panel3" type="Panel" parent="Control/GridContainer"] +custom_minimum_size = Vector2(30, 30) +layout_mode = 2 + +[node name="Panel4" type="Panel" parent="Control/GridContainer"] +custom_minimum_size = Vector2(30, 30) +layout_mode = 2 + +[node name="Panel5" type="Panel" parent="Control/GridContainer"] +custom_minimum_size = Vector2(30, 30) +layout_mode = 2 + +[node name="Panel6" type="Panel" parent="Control/GridContainer"] +custom_minimum_size = Vector2(30, 30) +layout_mode = 2 + +[node name="Panel7" type="Panel" parent="Control/GridContainer"] +custom_minimum_size = Vector2(30, 30) +layout_mode = 2 + +[node name="Panel8" type="Panel" parent="Control/GridContainer"] +custom_minimum_size = Vector2(30, 30) +layout_mode = 2 + +[node name="Panel9" type="Panel" parent="Control/GridContainer"] +custom_minimum_size = Vector2(30, 30) +layout_mode = 2 + +[node name="Panel10" type="Panel" parent="Control/GridContainer"] +custom_minimum_size = Vector2(30, 30) +layout_mode = 2 + +[node name="Panel11" type="Panel" parent="Control/GridContainer"] +custom_minimum_size = Vector2(30, 30) +layout_mode = 2 + +[node name="Panel12" type="Panel" parent="Control/GridContainer"] +custom_minimum_size = Vector2(30, 30) +layout_mode = 2 + +[node name="Panel13" type="Panel" parent="Control/GridContainer"] +custom_minimum_size = Vector2(30, 30) +layout_mode = 2 + +[node name="Panel14" type="Panel" parent="Control/GridContainer"] +custom_minimum_size = Vector2(30, 30) +layout_mode = 2 + +[node name="Panel15" type="Panel" parent="Control/GridContainer"] +custom_minimum_size = Vector2(30, 30) +layout_mode = 2 + +[node name="Panel16" type="Panel" parent="Control/GridContainer"] +custom_minimum_size = Vector2(30, 30) +layout_mode = 2 diff --git a/scene/hud/prop_hud.gd b/scene/prop/prop_hud.gd similarity index 93% rename from scene/hud/prop_hud.gd rename to scene/prop/prop_hud.gd index b187817b..d416d5d7 100644 --- a/scene/hud/prop_hud.gd +++ b/scene/prop/prop_hud.gd @@ -14,7 +14,7 @@ signal current_item_changed(prop_key: String) @export var inventory: PropInventory: set(value): inventory = value - if inventory: + if inventory and not inventory.current_item_changed.is_connected(current_item_changed.emit): inventory.current_item_changed.connect(current_item_changed.emit) @export_group("UI-UX") @export var display_time := 2.5 # 不包含渐入渐出(约 0.6s)的时长 @@ -26,9 +26,9 @@ signal current_item_changed(prop_key: String) @export var selected := false: set(value): selected = value - if is_node_ready(): - %Mark.visible = value - mark.modulate.a = 1.0 + # if is_node_ready(): + # %Mark.visible = value + # mark.modulate.a = 1.0 @onready var sfx_click = %SfxClick as Sfx @onready var left_btn = %LeftButton as TextureButton @@ -58,6 +58,7 @@ func _ready() -> void: if Engine.is_editor_hint(): return focus_exited.connect(_on_focus_exited) + # 存档更新时,从存档加载 prop ArchiveManager.archive_loaded.connect(_load_from_archive) # tween timer timer.wait_time = display_time @@ -69,8 +70,8 @@ func _ready() -> void: left_btn.pressed.connect(on_left_pressed) right_btn.pressed.connect(on_right_pressed) panel.pressed.connect(_on_panel_pressed) - %Mark.visible = selected - mark.modulate.a = 0.8 + # %Mark.visible = selected + # mark.modulate.a = 0.8 title_label.modulate.a = 0.0 # _toggle_btn_ability(false) left_btn.modulate.a = 0.5 @@ -252,15 +253,15 @@ func toggle_details(display := true) -> void: display_tween.parallel().tween_property(title_label, "modulate:a", 1.0, 0.3) display_tween.parallel().tween_property(left_btn, "modulate:a", 1.0, 0.3) display_tween.parallel().tween_property(right_btn, "modulate:a", 1.0, 0.3) - display_tween.parallel().tween_property(mark, "modulate:a", 1.0, 0.3) - display_tween.parallel().tween_property(mark, "scale", Vector2(1.1, 1.1), 0.3).set_trans( - Tween.TRANS_CUBIC - ) - display_tween.tween_property(mark, "scale", Vector2.ONE, 0.2).set_trans(Tween.TRANS_CUBIC) + # display_tween.parallel().tween_property(mark, "modulate:a", 1.0, 0.3) + # display_tween.parallel().tween_property(mark, "scale", Vector2(1.1, 1.1), 0.3).set_trans( + # Tween.TRANS_CUBIC + # ) + # display_tween.tween_property(mark, "scale", Vector2.ONE, 0.2).set_trans(Tween.TRANS_CUBIC) timer.start(display_time) else: displaying = false - display_tween.tween_property(mark, "modulate:a", 0.8, 0.6) + # display_tween.tween_property(mark, "modulate:a", 0.8, 0.6) display_tween.parallel().tween_property(title_label, "modulate:a", 0.0, 0.6) display_tween.parallel().tween_property(left_btn, "modulate:a", 0.5, 0.5) display_tween.parallel().tween_property(right_btn, "modulate:a", 0.5, 0.5) @@ -305,8 +306,10 @@ func disable_prop_item(prop_key: String) -> void: # save to archive immediately ArchiveManager.save_all() + var shake_tween + # 使用无效道具,抖动提示 func on_toggle_invalid_prop(): if GlobalConfig.DEBUG: diff --git a/scene/hud/prop_hud.tscn b/scene/prop/prop_hud.tscn similarity index 97% rename from scene/hud/prop_hud.tscn rename to scene/prop/prop_hud.tscn index 3332b48e..0abb44f6 100644 --- a/scene/hud/prop_hud.tscn +++ b/scene/prop/prop_hud.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=10 format=3 uid="uid://dc778gsjfr3ky"] -[ext_resource type="Script" path="res://scene/hud/prop_hud.gd" id="1_bbv0a"] +[ext_resource type="Script" path="res://scene/prop/prop_hud.gd" id="1_bbv0a"] [ext_resource type="Texture2D" uid="uid://chyumeohdhwnh" path="res://asset/art/ui/hud/normal_left.png" id="2_bjc2b"] [ext_resource type="PackedScene" uid="uid://c85t6stvytvjn" path="res://scene/entity/ux/sfx.tscn" id="2_g6c03"] [ext_resource type="Texture2D" uid="uid://cvepj6u80c5wv" path="res://asset/art/ui/hud/pressed_left.png" id="3_fca7p"] @@ -19,14 +19,12 @@ offset_top = 4.0 offset_right = 608.0 offset_bottom = 504.0 scale = Vector2(0.3, 0.3) -mouse_filter = 1 script = ExtResource("1_bbv0a") [node name="VBoxContainer" type="VBoxContainer" parent="."] layout_mode = 0 offset_right = 40.0 offset_bottom = 40.0 -mouse_filter = 0 [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] layout_mode = 2 diff --git a/scene/popup/prop_inspector.gd b/scene/prop/prop_inspector.gd similarity index 100% rename from scene/popup/prop_inspector.gd rename to scene/prop/prop_inspector.gd diff --git a/scene/popup/prop_inspector.tscn b/scene/prop/prop_inspector.tscn similarity index 96% rename from scene/popup/prop_inspector.tscn rename to scene/prop/prop_inspector.tscn index 7a3afd7a..4ec8003c 100644 --- a/scene/popup/prop_inspector.tscn +++ b/scene/prop/prop_inspector.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=4 format=3 uid="uid://cekhj65axie0p"] -[ext_resource type="Script" path="res://scene/popup/prop_inspector.gd" id="1_2wpwe"] +[ext_resource type="Script" path="res://scene/prop/prop_inspector.gd" id="1_2wpwe"] [ext_resource type="Texture2D" uid="uid://ds4yw1wqelhm1" path="res://asset/art/scene/c02/s02_走道/ux_进门鼠疫海报yz.png" id="2_wr575"] [sub_resource type="LabelSettings" id="LabelSettings_5qe7a"] diff --git a/scene/hud/prop_inventory.gd b/scene/prop/prop_inventory.gd similarity index 100% rename from scene/hud/prop_inventory.gd rename to scene/prop/prop_inventory.gd diff --git a/scene/hud/prop_item.gd b/scene/prop/prop_item.gd similarity index 100% rename from scene/hud/prop_item.gd rename to scene/prop/prop_item.gd diff --git a/scene/settings/settings.gd b/scene/settings/settings.gd new file mode 100644 index 00000000..78596acb --- /dev/null +++ b/scene/settings/settings.gd @@ -0,0 +1,128 @@ +extends CanvasLayer + +signal exited + +@onready var master_bus_slider = %HSliderMasterBus as HSlider +@onready var sfx_bus_slider = %HSliderSfxBus as HSlider +@onready var dialog_bus_slider = %HSliderDialogBus as HSlider +@onready var autosave_box = %AutoSaveCheckBox as CheckBox +@onready var autosave_time_edit = %SaveTimeLineEdit as LineEdit +@onready var fullscreen_box = %FullscreenBox as CheckBox +@onready var top_box = %TopBox as CheckBox +@onready var index_btn = %IndexBtn as Button +@onready var exit_btn = %ExitBtn as Button +@onready var diary_btn = %DiaryBtn as Button + + +func _ready(): + layer = GlobalConfig.CANVAS_LAYER_SETTINGS + visibility_changed.connect(_on_visibility_changed) + # bus + master_bus_slider.value = db_to_linear( + AudioServer.get_bus_volume_db(AudioServer.get_bus_index("Master")) + ) + sfx_bus_slider.value = db_to_linear( + AudioServer.get_bus_volume_db(AudioServer.get_bus_index("game_sfx")) + ) + dialog_bus_slider.value = db_to_linear( + AudioServer.get_bus_volume_db(AudioServer.get_bus_index("dialog")) + ) + master_bus_slider.value_changed.connect(_on_master_bus_slider_value_changed) + sfx_bus_slider.value_changed.connect(_on_sfx_bus_slider_value_changed) + dialog_bus_slider.value_changed.connect(_on_dialog_bus_slider_value_changed) + # auto save + autosave_box.button_pressed = GlobalConfigManager.config.auto_save_enabled + autosave_time_edit.editable = GlobalConfigManager.config.auto_save_enabled + autosave_time_edit.text = str(GlobalConfigManager.config.auto_save_seconds) + autosave_box.toggled.connect(_on_autosave_box_toggled) + autosave_time_edit.text_submitted.connect(_on_autosave_time_edit_text_submitted) + autosave_time_edit.focus_exited.connect(_on_autosave_time_edit_text_submitted) + # window + fullscreen_box.button_pressed = GlobalConfigManager.config.window_fullscreen + top_box.button_pressed = GlobalConfigManager.config.window_top + fullscreen_box.toggled.connect(_on_fullscreen_box_toggled) + top_box.toggled.connect(_on_top_box_toggled) + # navigation + exit_btn.pressed.connect(_on_exit_btn_pressed) + index_btn.pressed.connect(_on_index_btn_pressed) + diary_btn.pressed.connect(_on_diary_btn_pressed) + + +func _on_visibility_changed() -> void: + if visible: + get_tree().paused = true + SceneManager.lock_player() + else: + get_tree().paused = false + SceneManager.unlock_player() + + +func exit_settings(): + visible = false + exited.emit() + + +func _on_master_bus_slider_value_changed(value: float) -> void: + var db_value = linear_to_db(value) + GlobalConfigManager.config.db_master = db_value + AudioServer.set_bus_volume_db(AudioServer.get_bus_index("Master"), db_value) + + +func _on_sfx_bus_slider_value_changed(value: float) -> void: + var db_value = linear_to_db(value) + GlobalConfigManager.config.db_game_sfx = db_value + AudioServer.set_bus_volume_db(AudioServer.get_bus_index("game_sfx"), db_value) + + +func _on_dialog_bus_slider_value_changed(value: float) -> void: + var db_value = linear_to_db(value) + GlobalConfigManager.config.db_dialog = db_value + AudioServer.set_bus_volume_db(AudioServer.get_bus_index("dialog"), db_value) + + +func _on_autosave_box_toggled(is_pressed: bool) -> void: + GlobalConfigManager.config.auto_save_enabled = is_pressed + autosave_time_edit.editable = GlobalConfigManager.config.auto_save_enabled + + +func _on_autosave_time_edit_text_submitted(_text = null) -> void: + var seconds = autosave_time_edit.text.to_int() + if seconds < 0: + seconds = 0 + autosave_time_edit.text = str(seconds) + GlobalConfigManager.config.auto_save_seconds = seconds + + +func _on_fullscreen_box_toggled(is_pressed: bool) -> void: + if is_pressed: + get_window().mode = Window.MODE_FULLSCREEN + else: + get_window().mode = Window.MODE_WINDOWED + GlobalConfigManager.config.window_fullscreen = is_pressed + + +func _on_top_box_toggled(is_pressed: bool) -> void: + get_window().always_on_top = is_pressed + GlobalConfigManager.config.window_top = is_pressed + + +func _on_exit_btn_pressed() -> void: + SceneManager.quit_game() + + +func _on_index_btn_pressed() -> void: + ArchiveManager.save_all() + SceneManager.checkout_index_page() + + +func _on_diary_btn_pressed() -> void: + pass # Replace with function body. + + +func _unhandled_key_input(event: InputEvent) -> void: + if not visible: + return + if event.is_action_pressed("escape"): + exit_settings() + # block the event + get_viewport().set_input_as_handled() diff --git a/scene/settings/settings.tscn b/scene/settings/settings.tscn index fe935303..21034e03 100644 --- a/scene/settings/settings.tscn +++ b/scene/settings/settings.tscn @@ -1,9 +1,149 @@ -[gd_scene format=3 uid="uid://beok2r6fgburn"] +[gd_scene load_steps=2 format=3 uid="uid://beok2r6fgburn"] -[node name="Settings" type="Control"] -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 +[ext_resource type="Script" path="res://scene/settings/settings.gd" id="1_7u4nq"] + +[node name="Settings" type="CanvasLayer"] +process_mode = 3 +script = ExtResource("1_7u4nq") + +[node name="PanelContainer" type="PanelContainer" parent="."] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -119.0 +offset_top = -84.0 +offset_right = 119.0 +offset_bottom = 78.0 grow_horizontal = 2 grow_vertical = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"] +layout_mode = 2 +size_flags_horizontal = 4 + +[node name="MarginContainer2" type="MarginContainer" parent="PanelContainer/VBoxContainer"] +layout_mode = 2 +theme_override_constants/margin_top = 6 + +[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/VBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 4 + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/HBoxContainer"] +custom_minimum_size = Vector2(50, 0) +layout_mode = 2 +text = "setting_总音量" + +[node name="HSliderMasterBus" type="HSlider" parent="PanelContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(100, 5) +layout_mode = 2 +max_value = 1.0 +step = 0.01 +value = 1.0 + +[node name="HBoxContainer2" type="HBoxContainer" parent="PanelContainer/VBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 4 + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/HBoxContainer2"] +custom_minimum_size = Vector2(50, 0) +layout_mode = 2 +text = "setting_音效音量" + +[node name="HSliderSfxBus" type="HSlider" parent="PanelContainer/VBoxContainer/HBoxContainer2"] +unique_name_in_owner = true +custom_minimum_size = Vector2(100, 5) +layout_mode = 2 +max_value = 1.0 +step = 0.01 +value = 1.0 + +[node name="HBoxContainer5" type="HBoxContainer" parent="PanelContainer/VBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 4 + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/HBoxContainer5"] +custom_minimum_size = Vector2(50, 0) +layout_mode = 2 +text = "setting_对话音量" + +[node name="HSliderDialogBus" type="HSlider" parent="PanelContainer/VBoxContainer/HBoxContainer5"] +unique_name_in_owner = true +custom_minimum_size = Vector2(100, 5) +layout_mode = 2 +max_value = 1.0 +step = 0.01 +value = 1.0 + +[node name="HSeparator" type="HSeparator" parent="PanelContainer/VBoxContainer"] +layout_mode = 2 + +[node name="HBoxContainer4" type="HBoxContainer" parent="PanelContainer/VBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 4 + +[node name="AutoSaveCheckBox" type="CheckBox" parent="PanelContainer/VBoxContainer/HBoxContainer4"] +unique_name_in_owner = true +layout_mode = 2 +text = "setting_自动保存" + +[node name="SaveTimeLineEdit" type="LineEdit" parent="PanelContainer/VBoxContainer/HBoxContainer4"] +unique_name_in_owner = true +layout_mode = 2 +max_length = 5 +caret_blink = true + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/HBoxContainer4"] +layout_mode = 2 +text = "ui_秒" + +[node name="GridContainer" type="GridContainer" parent="PanelContainer/VBoxContainer"] +layout_mode = 2 +columns = 2 + +[node name="FullscreenBox" type="CheckBox" parent="PanelContainer/VBoxContainer/GridContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 4 +text = "setting_全屏游戏" + +[node name="TopBox" type="CheckBox" parent="PanelContainer/VBoxContainer/GridContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 4 +text = "setting_窗口置顶" + +[node name="HSeparator3" type="HSeparator" parent="PanelContainer/VBoxContainer"] +layout_mode = 2 + +[node name="HBoxContainer3" type="HBoxContainer" parent="PanelContainer/VBoxContainer"] +layout_mode = 2 + +[node name="IndexBtn" type="Button" parent="PanelContainer/VBoxContainer/HBoxContainer3"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 6 +text = "setting_主界面" + +[node name="ExitBtn" type="Button" parent="PanelContainer/VBoxContainer/HBoxContainer3"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 6 +text = "setting_退出" + +[node name="HSeparator2" type="HSeparator" parent="PanelContainer/VBoxContainer"] +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/VBoxContainer"] +layout_mode = 2 +theme_override_constants/margin_bottom = 4 + +[node name="DiaryBtn" type="Button" parent="PanelContainer/VBoxContainer/MarginContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(100, 30) +layout_mode = 2 +size_flags_horizontal = 4 +text = "setting_日志" diff --git a/ui/button/item_list_modified.tscn b/ui/button/item_list_modified.tscn new file mode 100644 index 00000000..b0fa2d0d --- /dev/null +++ b/ui/button/item_list_modified.tscn @@ -0,0 +1,6 @@ +[gd_scene format=3 uid="uid://782ur70tsfi2"] + +[node name="ItemList" type="ScrollContainer"] +custom_minimum_size = Vector2(50, 0) +offset_right = 68.0 +offset_bottom = 20.0 diff --git a/ui/button/sound_button.gd b/ui/button/sound_button.gd index 49d9bb8c..f658df79 100644 --- a/ui/button/sound_button.gd +++ b/ui/button/sound_button.gd @@ -2,13 +2,12 @@ extends Button class_name SoundButton -@export var audio_collections: Array[AudioStreamCollection] +@export var audio_collections: Array[AudioStreamCollection] = [ + preload("res://config/audio/ui/ui_click.tres") +] + func _ready(): - if !audio_collections: - audio_collections.append(preload("res://config/audio/ui/ui_click.tres")) - #print("sound button loaded default ui_click.tres") - if audio_collections: #print("sound button load audio_collections into audio_player") var audio_player := RandomAudioStreamPlayer.new()