From b6ce9fd29aff1b3989a574e4ec4ca28ab491119f Mon Sep 17 00:00:00 2001 From: Jakob Feldmann Date: Sun, 6 Aug 2023 17:19:21 +0200 Subject: [PATCH] feat: smaller platforms, platform&mine anims, flyer fix --- assets/contraption/3xFloatingPlatform.png | Bin 0 -> 1814 bytes .../contraption/3xFloatingPlatform.png.import | 35 ++ assets/contraption/5xFloatingPlatform.png | Bin 0 -> 2338 bytes .../contraption/5xFloatingPlatform.png.import | 35 ++ .../environment/blocks/BasicTileSet.aseprite | Bin 16389 -> 16421 bytes assets/environment/blocks/BasicTileSet.png | Bin 10559 -> 10560 bytes assets/obstacle object/SpikyMinePlant.png | Bin 0 -> 2531 bytes .../obstacle object/SpikyMinePlant.png.import | 35 ++ src/Actors/Enemies/Beings/Enemy.gd | 2 +- src/Actors/Enemies/Beings/Flyer.tscn | 5 +- .../Beings => legacy}/ChasingFlyer.tscn | 0 src/Levels/1 Tutorial Level.tscn | 4 +- src/Levels/2 Tutorial Level.tscn | 11 +- src/Levels/3 Tutorial Level.tscn | 42 +- src/Levels/4 Tutorial Level.tscn | 4 +- src/Levels/5 Tutorial Level.tscn | 402 ++---------------- src/Levels/Actual Level 1.tscn | 8 +- src/Levels/Actual Level 2.tscn | 2 +- src/Levels/Actual Level 3.tscn | 4 +- src/Levels/Legacy/2 Tut Level.tscn | 2 +- src/Levels/Legacy/3 Tut Level.tscn | 4 +- src/Levels/Level 4.tscn | 4 +- src/Levels/x03 Level.tscn | 6 +- src/Levels/xFroggy Test Level.tscn | 2 +- src/ObstacleObjects/Mine.gd | 9 +- src/ObstacleObjects/Mine.tscn | 109 +++-- src/Platforms/FlyingPlatform.tscn | 62 ++- src/Platforms/FlyingPlatformSmol.tscn | 93 ++++ src/Platforms/{ => Spring}/Spring.tscn | 4 +- src/Platforms/{ => Spring}/SpringPhysics.gd | 0 .../{ => Spring}/SpringPlatform.tscn | 8 +- .../{ => legacy}/DropThroughPlatform.tscn | 12 +- .../{ => legacy}/FlyingPlatformClean.tscn | 8 +- 33 files changed, 415 insertions(+), 497 deletions(-) create mode 100644 assets/contraption/3xFloatingPlatform.png create mode 100644 assets/contraption/3xFloatingPlatform.png.import create mode 100644 assets/contraption/5xFloatingPlatform.png create mode 100644 assets/contraption/5xFloatingPlatform.png.import create mode 100644 assets/obstacle object/SpikyMinePlant.png create mode 100644 assets/obstacle object/SpikyMinePlant.png.import rename src/Actors/{Enemies/Beings => legacy}/ChasingFlyer.tscn (100%) create mode 100644 src/Platforms/FlyingPlatformSmol.tscn rename src/Platforms/{ => Spring}/Spring.tscn (97%) rename src/Platforms/{ => Spring}/SpringPhysics.gd (100%) rename src/Platforms/{ => Spring}/SpringPlatform.tscn (90%) rename src/Platforms/{ => legacy}/DropThroughPlatform.tscn (92%) rename src/Platforms/{ => legacy}/FlyingPlatformClean.tscn (92%) diff --git a/assets/contraption/3xFloatingPlatform.png b/assets/contraption/3xFloatingPlatform.png new file mode 100644 index 0000000000000000000000000000000000000000..17bad9b1aa87ccb1a6bd480ac34eeb8441f69082 GIT binary patch literal 1814 zcmV+x2kH2UP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2CGR#K~#8N?VW9i zR8<_t&jyCC8KRX%o2?NBN^KBIFNhkHs|F%vkU@~xhYU(9P)jk%50w%mL}Ji~q!$sP zbS+RrDlr0=N@xpKY=bO|V#7D+!{l>kp4l_Ub6;leoxOL~=O=nz?*IJH?;P(AXJ)S0 zW-3gd)={cdTY}@gC#vp1{zHrW^F{voBL94mf4;~+U*w-J^3NCg2Y*0*_s8#}TElgd zCRA#J{Ql?Pm0I~a+Kgk}Er~srFpk*q#5ZoqBg?9bkiYzi9Z!7YyBcWm2i{yq0!hd2%{$=D}M*i~mA%8#eFC+gl@|V94`TH4a|KJVG zvn!u8hrc{(rq8&;%wG4H>0bMe88c?AIkS4IX?x|np#DkMA7b^Fpm)75I#%}2g>Rp?kGKXK?8PwZvm}uVI_HHm< z{^^jv{L>(R`KLkt@&`%B!qcWG{&s&<9=O>Q#Xl^@%?TfyqWFi6b=Lw1o1*)>V~cwK z=iwi`fw^%?hgq_4POykpVD^2p%EY1 z$UVnal+K+RsI;OPJ$bxAEJ`r~hzWzr`y`^zx zl$m6%zW8gjnc2O}eBQO)JkY(O5-~^-{gdqf+g%&Y1T*g9`o;!poYV8P+0*&DdF#TS zmhdN>6D6S2md;f*>)Ui;r+H@N;$VHC=>AFff5FIEHS3JJS8a;opJe~tdzEXvrfqyn z`1?R?tL(pz;q1?Y5WpKUFme1S^Vh)npbqRd-UPYSI}Y)g9cYgJS58$w~@50fV7fu`u(1+57eJBCPpl@~0)}RldZ||Y~HS^M? zXTe8aUl;l3>wmg5P_hq9i+f&ZDgUVb$9z!-{G$6O*?)U|$4sB;Fq4DzwTeIY+J=4f zN8Mhh{YG@S{QM%ny~ZosMzoYapaaTQ+kbF5`Zod&PdLnMcz(I*KKPCKw&#cHAqM?- zbSGp zr%j{&N%tx&F3HaZVUA|_`*Oy)T~R585JCtcGJ}T_enZ5P;QGL+UhlyMpVabGTpPq< zjC=5L=dce%v)ZP`e&TD#B*_WTPU}yS&KX6$InbY#KS|=?{(ZcB{=L{SHta{4)<4XP z{jL*TZQNM4-F5on()uUetFSoVnqAx+&G7g6#kuJXj1WQyAsU8HxR~H>glg?>}?!T3AjuE{pxI zcTTne*TA2Nq&e(dY4_ik6NEX?74CWiBZLq_h`QkcXw#@Cf`bYVRXl9)-`u#cpNAH( z^MhU0=jZo-cA$FjK^=X#h8V)JadXgxZghn^KjGz}$UPLgFel^ex$E_h%4I_r#?ck- z-2b>7?p*HS5j490?*1lqu=hXd+THug9@pspvvk)HcMsV6Z+if?!@Nlr`%l8w5$0y^ zKS}CM?EXgg--Z2g>u}wL5JCtcQo%zuKRspJ?MKN+Q24w&`hD=a`v^+h9BkJ^Tuy>^ zT7Qys&M1=Ru=~^cGZ#tfV3Tx=+mAA>zdJW^`@@`o8|%in{dPO6{de0WEY62}EiAX) zpOt^uT*P$~LI@#*XevB>xMh|!BX=`>!)RnqeiK0Q@OEj$p$OhC^*AN<&T@T2IVW>8 z!#~TMLI@#*5Ov`mrbTvK&U>r-Dmhv1Rgw0+*2S3r0fC70ltFncI{*Lx07*qoM6N<$ Ef~c9kl>h($ literal 0 HcmV?d00001 diff --git a/assets/contraption/3xFloatingPlatform.png.import b/assets/contraption/3xFloatingPlatform.png.import new file mode 100644 index 0000000..b94133a --- /dev/null +++ b/assets/contraption/3xFloatingPlatform.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/3xFloatingPlatform.png-a13f2c7c76bd3adae7076cf38d621b7d.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/contraption/3xFloatingPlatform.png" +dest_files=[ "res://.import/3xFloatingPlatform.png-a13f2c7c76bd3adae7076cf38d621b7d.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/assets/contraption/5xFloatingPlatform.png b/assets/contraption/5xFloatingPlatform.png new file mode 100644 index 0000000000000000000000000000000000000000..afb9e1a98f7d5d79b094946cc67a2fbc00fcd7d2 GIT binary patch literal 2338 zcmcIkX;f257LKAIK};(e7Fl{g1VlhYKtYMJ2#Ua{Y%S3Mu|df|SVV#izE)Zh5U^!b zT0j((VGAKG39^KzhNWdSA_fRsh!|OufQE#;yma)8=k%YM`89P;Ro$w(b?-gj_nn*Z zcVACUq#hE1KxiKEazBAUs2)_>sCBB!wfT+8Hs!V|;e@9vqNZ1WT6tI#dC2Dw0zu8y zfWp=)&+4&WKO`U!8<=0_st#iLSp;HT{So&={-iVWMbYIy2IzLM*Iii(*DA^P$m_YG zW1g56`*E$VW@VMCal}K{TZ3wvM=f>8y4zo&ro3)_r>UBH&RlC_N`qdxZT@a!5^IfF zm}8X)a7cVn{{I> zFLdx4y17yC{I;_Sz`FwO7v58Y7oXz{C0!~&@`Mcvn)=U|>ChI1T{228N_uC&Wkwe7 zn=|0|)Q{_mJK518aWk^O)&|?W?x4aOJdYiM`;_t8Z5x47{Nm$9VNl85jU8G3hVaqN zW|O2}JDIqQNq2pl6Uh?G<6qrTfN7>yT(j2{m*O60oTFW_AG%}i+bS}?lMZfb%h-G7 z{}m(;4A?G!WeXb=2Ub9?cWDaL>|<8=I0po&z@T%EL8(<o$~$2g;@g+ zBf#t`$eTa`(JzePaA7(I;!><6Ox$|-i%nY#NV1d+tN@(UxFr}{A=mPU7~GO9 zjDa;{X{9!{gTfr9&Ax1^CnBpZFUGTgvoMaksK!RiG2INqnw2ikOn7JP`#+kvEE~u! z1uwc~QJ(&>c~kXssg4L7n}U~B|Px>o%+B5f_< z;Rl@dA=9UmHZC!z4IJp!zij~m_(J<3Qsdb`h_QH3MhzPNjKkdpg$qr%CzFmlh7US20fuL>JX_{j8z z);mC4KP3gL0SVIxUh@_CC(m)}u+YqR3-E5Zs2Q!D2C_&A<<7+-MEo7TSX@7iojAo6r{|CX?N46Fa;fT}sL3g(vr=MzC)< zUI8O^q5w-CQ4l&lakJK`(7@#r3=m$LYB>Ia=@B4tXPzbN9QUboARO?)*V8w&y)`gt zdnIH?!1Aceo_p;IMJ?lrCOMQd&??x8q__lzpo!|JK6$f{uqS(T*lF|0q??=jCv6r& zW?4E(y`v73(i(gdGszcpf))pv%s=)>s*IXwlbQXFK~6Q!hmiw3g1&ZF0UEH_%v*v| z#282aTuK~vClM`|ws?Lf_3={Lcljm)E$usITp}kZL%1z>mEs&QFu67(vd_ty3Xt}@ z-VMW<>qe4s25_o`Q9^9xh)pvi8wkm~f*WRPm z|G~y0enB*=3cGm?sNL3)b+P8NmeJ&}R4xX4jx($ivWEl>j+JDyTnP9JH{Vh{u(?sy zCiXD|Z3^l8>8>;k+9~Fs0F7vg<*Q_co&_i>p-JyF{w(eA!|SwUyamg4@ld6f9F1fy)U)&vA}|@g04ufzR+{wmBTx6M7{!{NYy z@kj;oFP#vjY~o+X_DuOj-^%O;QDc=V@Y9s^1)V&;HRZDBojs>C_p9aSF z3f5+anL$Jl%X!S=l>ZxIr(`^z%0?Lt-^1qr?wpvYO}yE5DhKy$k$*$G z&VkZcyPO2I+tYRP!Z;1EJ10T>TU9FQyfw-OXxlJpVU(aKPTx_9nL17KSpO@ zfeO4XTv&1K5dMiE$1uIjRzj_u4~M0AI{6Xmqu$D?0f%hX@Q9SpC?{V+mCyG>{W|_3 z1NkXf?Iq$!LR6E|X(lqBW7~>jPpkH_CQ6e@5Qh3c%y%^dUzW=9( zeoHpu&~r_l1s}uVj2*cFw9n_^4EmURGtjWqS1R{0l&uJSfqcOHlciE7vt|DFo&Dm+`K|e7tWvOm zfx_n>&P}aOzQ3PNrgl+}O%~?4;)B(JrxR-5zWJ_BCDkFT*JC*+wQJ;`c6qZa{qWQD cyWhd68}%R7|G0Xz|CY+W-In literal 0 HcmV?d00001 diff --git a/assets/contraption/5xFloatingPlatform.png.import b/assets/contraption/5xFloatingPlatform.png.import new file mode 100644 index 0000000..0b7de2d --- /dev/null +++ b/assets/contraption/5xFloatingPlatform.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/5xFloatingPlatform.png-c8154094c5709787badb6bf61c4f7ac3.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/contraption/5xFloatingPlatform.png" +dest_files=[ "res://.import/5xFloatingPlatform.png-c8154094c5709787badb6bf61c4f7ac3.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/assets/environment/blocks/BasicTileSet.aseprite b/assets/environment/blocks/BasicTileSet.aseprite index a7ddb95db300b1481abcecd371d6bc6aedd77c49..34ef8ef160c085cefedcb9fb3b536f2ee52793f7 100644 GIT binary patch delta 5449 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 delta 10195 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 void: player_entered_stomp = true var incoming_vel_vector: Vector2 = body.velocity.normalized() print(rad2deg(abs(incoming_vel_vector.angle_to(Vector2.DOWN.rotated(rotation))))) - if abs(incoming_vel_vector.angle_to(Vector2.DOWN.rotated(rotation))) > deg2rad(90): + if abs(incoming_vel_vector.angle_to(Vector2.DOWN.rotated(rotation))) > deg2rad(95): print("too shallow entry") body.die() player_entered_stomp = false diff --git a/src/Actors/Enemies/Beings/Flyer.tscn b/src/Actors/Enemies/Beings/Flyer.tscn index 3865386..f08dd4f 100644 --- a/src/Actors/Enemies/Beings/Flyer.tscn +++ b/src/Actors/Enemies/Beings/Flyer.tscn @@ -290,8 +290,9 @@ shape = SubResource( 2 ) scale = Vector2( 0.7, 0.7 ) [node name="Area2D" type="Area2D" parent="DangerousBlockArea" groups=["harmful"]] -collision_layer = 8 -collision_mask = 3 +collision_layer = 2 +collision_mask = 0 +monitoring = false [node name="CollisionShape2D" type="CollisionShape2D" parent="DangerousBlockArea/Area2D"] position = Vector2( 5.10897e-07, -0.714285 ) diff --git a/src/Actors/Enemies/Beings/ChasingFlyer.tscn b/src/Actors/legacy/ChasingFlyer.tscn similarity index 100% rename from src/Actors/Enemies/Beings/ChasingFlyer.tscn rename to src/Actors/legacy/ChasingFlyer.tscn diff --git a/src/Levels/1 Tutorial Level.tscn b/src/Levels/1 Tutorial Level.tscn index 182dbbe..8b088c5 100644 --- a/src/Levels/1 Tutorial Level.tscn +++ b/src/Levels/1 Tutorial Level.tscn @@ -42,10 +42,10 @@ unique_name_in_owner = true process_mode = 1 [node name="AnimatedSprite" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="4"] -frame = 11 +frame = 6 [node name="AnimatedSprite2" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="5"] -frame = 10 +frame = 5 [node name="Blobby" parent="." instance=ExtResource( 7 )] unique_name_in_owner = true diff --git a/src/Levels/2 Tutorial Level.tscn b/src/Levels/2 Tutorial Level.tscn index ef48bec..0bc1ee1 100644 --- a/src/Levels/2 Tutorial Level.tscn +++ b/src/Levels/2 Tutorial Level.tscn @@ -14,7 +14,7 @@ [ext_resource path="res://src/Contraptions/Triggers/ElevatorButton.tscn" type="PackedScene" id=12] [ext_resource path="res://src/ObstacleObjects/PitArea.tscn" type="PackedScene" id=13] [ext_resource path="res://src/BenefitialObjects/Coin.tscn" type="PackedScene" id=14] -[ext_resource path="res://src/Actors/Enemies/Beings/Caterpillar.tscn" type="PackedScene" id=15] +[ext_resource path="res://src/ObstacleObjects/Mine.tscn" type="PackedScene" id=15] [sub_resource type="AnimationNodeStateMachinePlayback" id=4] @@ -65,10 +65,10 @@ drag_margin_top = 0.1 drag_margin_bottom = 0.1 [node name="AnimatedSprite" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="4"] -frame = 11 +frame = 4 [node name="AnimatedSprite2" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="5"] -frame = 10 +frame = 3 [node name="Blobby" parent="." instance=ExtResource( 8 )] unique_name_in_owner = true @@ -154,8 +154,9 @@ position = Vector2( 788, 100 ) [node name="Coin" parent="." instance=ExtResource( 14 )] position = Vector2( 6, 0 ) -[node name="Caterpillar" parent="." instance=ExtResource( 15 )] -position = Vector2( -96, 105 ) +[node name="Mine" parent="." instance=ExtResource( 15 )] +position = Vector2( -96, 96 ) +z_index = -1 [connection signal="body_exited" from="Blobby/BlobbySkin" to="Blobby" method="_on_BlobbySkin_body_exited"] diff --git a/src/Levels/3 Tutorial Level.tscn b/src/Levels/3 Tutorial Level.tscn index 12771d2..8356208 100644 --- a/src/Levels/3 Tutorial Level.tscn +++ b/src/Levels/3 Tutorial Level.tscn @@ -16,6 +16,7 @@ [ext_resource path="res://src/Platforms/FlyingPlatform.tscn" type="PackedScene" id=14] [ext_resource path="res://src/Actors/Enemies/Beings/Caterpillar.tscn" type="PackedScene" id=15] [ext_resource path="res://src/BenefitialObjects/Coin.tscn" type="PackedScene" id=16] +[ext_resource path="res://src/Platforms/FlyingPlatformSmol.tscn" type="PackedScene" id=17] [sub_resource type="AnimationNodeStateMachinePlayback" id=4] @@ -42,23 +43,6 @@ 0/shapes = [ ] 0/z_index = 0 -[sub_resource type="Animation" id=6] -resource_name = "Path" -length = 6.0 -loop = true -tracks/0/type = "value" -tracks/0/path = NodePath("KinematicBody2D:position") -tracks/0/interp = 2 -tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/keys = { -"times": PoolRealArray( 0, 3 ), -"transitions": PoolRealArray( 1, 1 ), -"update": 0, -"values": [ Vector2( 0, 0 ), Vector2( 0, -64 ) ] -} - [node name="LevelTemplate" type="Node2D"] script = ExtResource( 11 ) __meta__ = { @@ -80,11 +64,8 @@ wait_time = 20.0 [node name="BlobbyCam" parent="." instance=ExtResource( 9 )] unique_name_in_owner = true -[node name="AnimatedSprite" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="4"] -frame = 3 - [node name="AnimatedSprite2" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="5"] -frame = 2 +frame = 12 [node name="Blobby" parent="." instance=ExtResource( 10 )] unique_name_in_owner = true @@ -168,17 +149,9 @@ position = Vector2( 692, 100 ) [node name="FlyingPlatform2" parent="." instance=ExtResource( 14 )] position = Vector2( -40, -128 ) - -[node name="anim" parent="FlyingPlatform2" index="0"] -autoplay = "Path" - -[node name="FlyingPlatform3" parent="." instance=ExtResource( 14 )] -position = Vector2( 688, -32 ) -scale = Vector2( 0.75, 1 ) - -[node name="anim" parent="FlyingPlatform3" index="0"] -autoplay = "Path" -anims/Path = SubResource( 6 ) +x_target = -32 +y_target = -48 +speed = 16 [node name="Coin" parent="." instance=ExtResource( 16 )] position = Vector2( 383, -31 ) @@ -186,6 +159,10 @@ position = Vector2( 383, -31 ) [node name="Coin2" parent="." instance=ExtResource( 16 )] position = Vector2( 496, -337 ) +[node name="FlyingPlatformSmol" parent="." instance=ExtResource( 17 )] +position = Vector2( 680, -128 ) +y_target = 112 + [connection signal="body_exited" from="Blobby/BlobbySkin" to="Blobby" method="_on_BlobbySkin_body_exited"] [editable path="SignalManager"] @@ -195,4 +172,3 @@ position = Vector2( 496, -337 ) [editable path="BlobbyCam"] [editable path="Blobby"] [editable path="FlyingPlatform2"] -[editable path="FlyingPlatform3"] diff --git a/src/Levels/4 Tutorial Level.tscn b/src/Levels/4 Tutorial Level.tscn index 351dbfa..f0df66c 100644 --- a/src/Levels/4 Tutorial Level.tscn +++ b/src/Levels/4 Tutorial Level.tscn @@ -68,10 +68,10 @@ unique_name_in_owner = true drag_margin_bottom = 0.3 [node name="AnimatedSprite" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="4"] -frame = 0 +frame = 9 [node name="AnimatedSprite2" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="5"] -frame = 13 +frame = 8 [node name="Blobby" parent="." instance=ExtResource( 8 )] unique_name_in_owner = true diff --git a/src/Levels/5 Tutorial Level.tscn b/src/Levels/5 Tutorial Level.tscn index afba8ab..b0e6c34 100644 --- a/src/Levels/5 Tutorial Level.tscn +++ b/src/Levels/5 Tutorial Level.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=42 format=2] +[gd_scene load_steps=19 format=2] [ext_resource path="res://src/Environment/GreenHouseTiles.tres" type="TileSet" id=1] [ext_resource path="res://src/Environment/DropThroughPlatforms.tres" type="TileSet" id=2] @@ -11,204 +11,13 @@ [ext_resource path="res://src/Actors/Blobby/Blobby.tscn" type="PackedScene" id=9] [ext_resource path="res://src/Actors/BlobbyCam.tscn" type="PackedScene" id=10] [ext_resource path="res://src/Contraptions/Portal/Portal.tscn" type="PackedScene" id=11] -[ext_resource path="res://src/Platforms/FlyingPlatform.gd" type="Script" id=12] -[ext_resource path="res://assets/contraption/floating_platform_test.png" type="Texture" id=13] +[ext_resource path="res://src/Platforms/FlyingPlatformSmol.tscn" type="PackedScene" id=12] +[ext_resource path="res://src/Actors/Enemies/Beings/Flyer.tscn" type="PackedScene" id=13] [ext_resource path="res://src/BenefitialObjects/Coin.tscn" type="PackedScene" id=14] -[ext_resource path="res://src/Actors/Enemies/Beings/Flyer.gd" type="Script" id=15] -[ext_resource path="res://src/StateMachines/FlyerStateMachine.gd" type="Script" id=16] -[ext_resource path="res://assets/meta/new_dynamicfont.tres" type="DynamicFont" id=17] -[ext_resource path="res://assets/enemy/flyer-sheet.png" type="Texture" id=18] [ext_resource path="res://src/Contraptions/VendingMachine.tscn" type="PackedScene" id=19] [sub_resource type="AnimationNodeStateMachinePlayback" id=4] -[sub_resource type="Animation" id=33] -length = 0.001 -tracks/0/type = "value" -tracks/0/path = NodePath(".:frame") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/keys = { -"times": PoolRealArray( 0 ), -"transitions": PoolRealArray( 1 ), -"update": 0, -"values": [ 0 ] -} - -[sub_resource type="Animation" id=36] -resource_name = "hunting" -length = 1.62 -loop = true -step = 0.01 -tracks/0/type = "value" -tracks/0/path = NodePath(".:frame") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/keys = { -"times": PoolRealArray( 0 ), -"transitions": PoolRealArray( 1 ), -"update": 1, -"values": [ 0 ] -} -tracks/1/type = "value" -tracks/1/path = NodePath(".:scale") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/keys = { -"times": PoolRealArray( 0 ), -"transitions": PoolRealArray( 1 ), -"update": 1, -"values": [ Vector2( -1, 1 ) ] -} - -[sub_resource type="Animation" id=38] -resource_name = "huntingLeft" -length = 0.042 -loop = true -tracks/0/type = "value" -tracks/0/path = NodePath(".:frame") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/keys = { -"times": PoolRealArray( 0 ), -"transitions": PoolRealArray( 1 ), -"update": 1, -"values": [ 0 ] -} -tracks/1/type = "value" -tracks/1/path = NodePath(".:scale") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/keys = { -"times": PoolRealArray( 0 ), -"transitions": PoolRealArray( 1 ), -"update": 1, -"values": [ Vector2( 1, 1 ) ] -} - -[sub_resource type="Animation" id=35] -resource_name = "searching" -length = 1.62 -loop = true -step = 0.01 -tracks/0/type = "value" -tracks/0/path = NodePath(".:frame") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/keys = { -"times": PoolRealArray( 0.02 ), -"transitions": PoolRealArray( 1 ), -"update": 1, -"values": [ 1 ] -} -tracks/1/type = "value" -tracks/1/path = NodePath(".:scale") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/keys = { -"times": PoolRealArray( 0 ), -"transitions": PoolRealArray( 1 ), -"update": 1, -"values": [ Vector2( -1, 1 ) ] -} - -[sub_resource type="Animation" id=34] -resource_name = "searchingLeft" -length = 1.62 -loop = true -step = 0.01 -tracks/0/type = "value" -tracks/0/path = NodePath(".:frame") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/keys = { -"times": PoolRealArray( 0 ), -"transitions": PoolRealArray( 1 ), -"update": 1, -"values": [ 1 ] -} -tracks/1/type = "value" -tracks/1/path = NodePath(".:scale") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/keys = { -"times": PoolRealArray( 0 ), -"transitions": PoolRealArray( 1 ), -"update": 1, -"values": [ Vector2( 1, 1 ) ] -} - -[sub_resource type="AnimationNodeAnimation" id=52] -animation = "huntingLeft" - -[sub_resource type="AnimationNodeAnimation" id=39] -animation = "hunting" - -[sub_resource type="AnimationNodeBlendSpace1D" id=23] -blend_point_0/node = SubResource( 52 ) -blend_point_0/pos = -1.0 -blend_point_1/node = SubResource( 39 ) -blend_point_1/pos = 1.0 -min_space = -1.18 -max_space = 1.15 - -[sub_resource type="AnimationNodeAnimation" id=40] -animation = "searchingLeft" - -[sub_resource type="AnimationNodeAnimation" id=41] -animation = "searching" - -[sub_resource type="AnimationNodeBlendSpace1D" id=9] -blend_point_0/node = SubResource( 40 ) -blend_point_0/pos = -1.0 -blend_point_1/node = SubResource( 41 ) -blend_point_1/pos = 1.0 -min_space = -2.0 -max_space = 2.0 -snap = 1.0 - -[sub_resource type="AnimationNodeStateMachineTransition" id=27] - -[sub_resource type="AnimationNodeStateMachineTransition" id=32] - -[sub_resource type="AnimationNodeStateMachine" id=50] -states/hunting/node = SubResource( 23 ) -states/hunting/position = Vector2( 184.952, -12 ) -states/searching/node = SubResource( 9 ) -states/searching/position = Vector2( -52.0952, 102.762 ) -transitions = [ "searching", "hunting", SubResource( 27 ), "hunting", "searching", SubResource( 32 ) ] -start_node = "searching" -graph_offset = Vector2( -333, -104 ) - -[sub_resource type="AnimationNodeStateMachinePlayback" id=51] - -[sub_resource type="RectangleShape2D" id=1] -extents = Vector2( 10, 7.5 ) - -[sub_resource type="RectangleShape2D" id=2] -extents = Vector2( 15, 5.12039 ) - -[sub_resource type="RectangleShape2D" id=3] -extents = Vector2( 18.2143, 14.3338 ) - [sub_resource type="TileSet" id=5] 0/name = "platform-plants.png 0" 0/texture = ExtResource( 3 ) @@ -232,37 +41,7 @@ extents = Vector2( 18.2143, 14.3338 ) 0/shapes = [ ] 0/z_index = 0 -[sub_resource type="Animation" id=6] -resource_name = "Path" -length = 8.0 -loop = true -tracks/0/type = "value" -tracks/0/path = NodePath("KinematicBody2D:position") -tracks/0/interp = 2 -tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/keys = { -"times": PoolRealArray( 0, 4 ), -"transitions": PoolRealArray( 1, 0.965936 ), -"update": 0, -"values": [ Vector2( 0, 0 ), Vector2( 0, 72 ) ] -} - -[sub_resource type="Animation" id=7] -length = 0.001 -tracks/0/type = "value" -tracks/0/path = NodePath("KinematicBody2D:position") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/keys = { -"times": PoolRealArray( 0 ), -"transitions": PoolRealArray( 1 ), -"update": 0, -"values": [ Vector2( 0, 0 ) ] -} +[sub_resource type="AnimationNodeStateMachinePlayback" id=6] [node name="LevelTemplate" type="Node2D"] script = ExtResource( 4 ) @@ -287,10 +66,10 @@ unique_name_in_owner = true drag_margin_bottom = 0.3 [node name="AnimatedSprite" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="4"] -frame = 6 +frame = 4 [node name="AnimatedSprite2" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="5"] -frame = 5 +frame = 3 [node name="Blobby" parent="." instance=ExtResource( 9 )] unique_name_in_owner = true @@ -300,130 +79,6 @@ scale = Vector2( 0.878906, 0.936025 ) [node name="AnimationTree" parent="Blobby/BlobbySprite" index="0"] parameters/playback = SubResource( 4 ) -[node name="Flyer" type="KinematicBody2D" parent="." groups=["frogfood", "harmful"]] -position = Vector2( 144, 27 ) -collision_layer = 258 -collision_mask = 25 -script = ExtResource( 15 ) -vision_distance = 10.0 -loose_target_seconds = 5.0 -patrolling = true -acceleration = 70 -max_speed = 80 -weight = 0.3 - -[node name="Statemachine" type="Node2D" parent="Flyer"] -script = ExtResource( 16 ) - -[node name="StateLabel" type="Label" parent="Flyer"] -visible = false -show_behind_parent = true -margin_left = -36.0 -margin_top = -30.0 -margin_right = 37.0 -margin_bottom = -16.0 -custom_colors/font_color = Color( 1, 1, 1, 1 ) -custom_colors/font_outline_modulate = Color( 0, 0, 0, 1 ) -custom_fonts/font = ExtResource( 17 ) -text = "Ihre Werbung" -align = 1 -valign = 1 - -[node name="FlyerSprite" type="Sprite" parent="Flyer"] -scale = Vector2( -1, 1 ) -texture = ExtResource( 18 ) -hframes = 2 - -[node name="AnimationPlayer" type="AnimationPlayer" parent="Flyer/FlyerSprite"] -anims/RESET = SubResource( 33 ) -anims/hunting = SubResource( 36 ) -anims/huntingLeft = SubResource( 38 ) -anims/searching = SubResource( 35 ) -anims/searchingLeft = SubResource( 34 ) - -[node name="AnimationTree" type="AnimationTree" parent="Flyer/FlyerSprite"] -tree_root = SubResource( 50 ) -anim_player = NodePath("../AnimationPlayer") -active = true -root_motion_track = NodePath(".") -parameters/playback = SubResource( 51 ) -parameters/hunting/blend_position = -1.04288 -parameters/searching/blend_position = 1.2903 - -[node name="VisibilityEnabler2D" type="VisibilityEnabler2D" parent="Flyer"] -visible = false -position = Vector2( 954, 0 ) -scale = Vector2( 10.84, 0.899 ) -rect = Rect2( -89, -10, 2, 20 ) -process_parent = true -physics_process_parent = true - -[node name="FeelerRayCast" type="RayCast2D" parent="Flyer"] -visible = false -enabled = true -cast_to = Vector2( 0, -1 ) -collision_mask = 56 -collide_with_areas = true - -[node name="EnemyBody" type="CollisionShape2D" parent="Flyer" groups=["harmful"]] -position = Vector2( 0, -0.5 ) -shape = SubResource( 1 ) - -[node name="NavigationAgent2D" type="NavigationAgent2D" parent="Flyer"] -path_desired_distance = 8.0 -target_desired_distance = 8.0 - -[node name="cshape" type="Node2D" parent="Flyer"] -visible = false -position = Vector2( 0, -3.8147e-06 ) -scale = Vector2( 0.1, 0.1 ) - -[node name="pjoint" type="PinJoint2D" parent="Flyer/cshape"] -scale = Vector2( 0.3, 0.3 ) -bias = 0.108 -softness = 0.1 - -[node name="StompDetector" type="Area2D" parent="Flyer" groups=["weakpoint"]] -visible = false -modulate = Color( 0, 0.0392157, 1, 1 ) -position = Vector2( 0, -1.90735e-06 ) -scale = Vector2( 0.7, 0.7 ) -collision_layer = 2 -input_pickable = false - -[node name="CollisionShape2D" type="CollisionShape2D" parent="Flyer/StompDetector"] -position = Vector2( -4.76837e-07, 1.56134 ) -shape = SubResource( 2 ) - -[node name="EnemySkin" type="Area2D" parent="Flyer"] -process_priority = -1 -visible = false -scale = Vector2( 0.7, 0.7 ) -collision_layer = 2 -collision_mask = 126 - -[node name="CollisionPolygon2D" type="CollisionShape2D" parent="Flyer/EnemySkin"] -shape = SubResource( 3 ) - -[node name="PatrolPath" type="Node2D" parent="Flyer"] - -[node name="Position2D2" type="Position2D" parent="Flyer/PatrolPath"] -position = Vector2( 0, -36 ) - -[node name="Position2D3" type="Position2D" parent="Flyer/PatrolPath"] -position = Vector2( 0, 8 ) - -[node name="Orientation" type="RayCast2D" parent="Flyer"] -cast_to = Vector2( -1, 0 ) -collision_mask = 0 -collide_with_bodies = false - -[node name="VisionRayCast" type="RayCast2D" parent="Flyer"] -enabled = true -cast_to = Vector2( 0, -1 ) -collision_mask = 9 -collide_with_areas = true - [node name="VendingMachine" parent="." instance=ExtResource( 19 )] position = Vector2( 48, 100 ) @@ -458,37 +113,31 @@ position = Vector2( 0, 56 ) scale = Vector2( 0.5, 0.5 ) next_scene = "res://src/Levels/6 Tutorial Level.tscn" -[node name="FlyingPlatform4" type="Node2D" parent="."] -position = Vector2( 248, 0 ) -script = ExtResource( 12 ) - -[node name="anim" type="AnimationPlayer" parent="FlyingPlatform4"] -autoplay = "Path" -playback_process_mode = 0 -anims/Path = SubResource( 6 ) -anims/RESET = SubResource( 7 ) - -[node name="KinematicBody2D" type="KinematicBody2D" parent="FlyingPlatform4"] -collision_layer = 8 -collision_mask = 0 - -[node name="Sprite" type="Sprite" parent="FlyingPlatform4/KinematicBody2D"] -position = Vector2( 0, 8 ) -texture = ExtResource( 13 ) -vframes = 8 -frame = 1 - -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="FlyingPlatform4/KinematicBody2D"] -position = Vector2( 0, 4 ) -scale = Vector2( 4, 0.4 ) -polygon = PoolVector2Array( -10, -10, 10, -10, 9.5, 0, 9.25, 5, -9.25, 5, -9.5, 0 ) +[node name="FlyingPlatformSmol" parent="." instance=ExtResource( 12 )] +position = Vector2( 256, 0 ) +y_target = 80 +speed = 24 [node name="Coin3" parent="." instance=ExtResource( 14 )] position = Vector2( 144, 30 ) z_index = -1 +[node name="Flyer" parent="." instance=ExtResource( 13 )] +position = Vector2( 144, 9 ) +acceleration = 100 +patrolling_slowdown = 0.2 +max_speed = 100 + +[node name="AnimationTree" parent="Flyer/FlyerSprite" index="1"] +parameters/playback = SubResource( 6 ) + +[node name="Position2D2" parent="Flyer/PatrolPath" index="0"] +position = Vector2( 0, 23 ) + +[node name="Position2D3" parent="Flyer/PatrolPath" index="1"] +position = Vector2( 0, -25 ) + [connection signal="body_exited" from="Blobby/BlobbySkin" to="Blobby" method="_on_BlobbySkin_body_exited"] -[connection signal="body_entered" from="Flyer/StompDetector" to="Flyer" method="_on_StompDetector_body_entered"] [editable path="SignalManager"] [editable path="LevelState"] @@ -496,3 +145,4 @@ z_index = -1 [editable path="UserInterface/HUD"] [editable path="BlobbyCam"] [editable path="Blobby"] +[editable path="Flyer"] diff --git a/src/Levels/Actual Level 1.tscn b/src/Levels/Actual Level 1.tscn index 46f2bba..13cccc6 100644 --- a/src/Levels/Actual Level 1.tscn +++ b/src/Levels/Actual Level 1.tscn @@ -6,12 +6,12 @@ [ext_resource path="res://src/Actors/Enemies/Beings/Flyer.tscn" type="PackedScene" id=4] [ext_resource path="res://src/Contraptions/Triggers/GateButton.tscn" type="PackedScene" id=5] [ext_resource path="res://src/Contraptions/GateBlock.tscn" type="PackedScene" id=6] -[ext_resource path="res://src/Platforms/DropThroughPlatform.tscn" type="PackedScene" id=7] +[ext_resource path="res://src/Platforms/legacy/DropThroughPlatform.tscn" type="PackedScene" id=7] [ext_resource path="res://src/Contraptions/Triggers/FrogFreeButton.tscn" type="PackedScene" id=8] [ext_resource path="res://src/Actors/BlobbyCam.tscn" type="PackedScene" id=9] [ext_resource path="res://src/Actors/Enemies/Beings/BoundFrog.tscn" type="PackedScene" id=10] [ext_resource path="res://src/Utilities/LevelState.tscn" type="PackedScene" id=11] -[ext_resource path="res://src/Platforms/Spring.tscn" type="PackedScene" id=12] +[ext_resource path="res://src/Platforms/Spring/Spring.tscn" type="PackedScene" id=12] [ext_resource path="res://src/UserInterface/UserInterface.tscn" type="PackedScene" id=13] [ext_resource path="res://src/Contraptions/Triggers/ElevatorButton.tscn" type="PackedScene" id=14] [ext_resource path="res://src/Actors/Blobby/Blobby.tscn" type="PackedScene" id=15] @@ -44,10 +44,10 @@ wait_time = 20.0 unique_name_in_owner = true [node name="AnimatedSprite" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="4"] -frame = 6 +frame = 4 [node name="AnimatedSprite2" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="5"] -frame = 10 +frame = 8 [node name="Blobby" parent="." instance=ExtResource( 15 )] unique_name_in_owner = true diff --git a/src/Levels/Actual Level 2.tscn b/src/Levels/Actual Level 2.tscn index 97ec6c0..587836e 100644 --- a/src/Levels/Actual Level 2.tscn +++ b/src/Levels/Actual Level 2.tscn @@ -15,7 +15,7 @@ [ext_resource path="res://src/ObstacleObjects/Spikes.tscn" type="PackedScene" id=14] [ext_resource path="res://src/Contraptions/Triggers/ElevatorButton.tscn" type="PackedScene" id=15] [ext_resource path="res://src/Platforms/FlyingLaserCutter.tscn" type="PackedScene" id=16] -[ext_resource path="res://src/Platforms/FlyingPlatformClean.tscn" type="PackedScene" id=17] +[ext_resource path="res://src/Platforms/legacy/FlyingPlatformClean.tscn" type="PackedScene" id=17] [ext_resource path="res://src/BenefitialObjects/Coin.tscn" type="PackedScene" id=18] [ext_resource path="res://src/Environment/Grass/ShaderGrass.tscn" type="PackedScene" id=19] [ext_resource path="res://src/Environment/Legacy/Greenhouse.tscn" type="PackedScene" id=20] diff --git a/src/Levels/Actual Level 3.tscn b/src/Levels/Actual Level 3.tscn index bb74977..60df3ba 100644 --- a/src/Levels/Actual Level 3.tscn +++ b/src/Levels/Actual Level 3.tscn @@ -8,10 +8,10 @@ [ext_resource path="res://src/UserInterface/UserInterface.tscn" type="PackedScene" id=6] [ext_resource path="res://src/Levels/Templates/LevelTemplate.gd" type="Script" id=7] [ext_resource path="res://src/Contraptions/Portal/Portal.tscn" type="PackedScene" id=8] -[ext_resource path="res://src/Platforms/FlyingPlatformClean.tscn" type="PackedScene" id=10] +[ext_resource path="res://src/Platforms/legacy/FlyingPlatformClean.tscn" type="PackedScene" id=10] [ext_resource path="res://src/ObstacleObjects/Mine.tscn" type="PackedScene" id=11] [ext_resource path="res://src/Platforms/FlyingLaserCutter.tscn" type="PackedScene" id=12] -[ext_resource path="res://src/Platforms/DropThroughPlatform.tscn" type="PackedScene" id=13] +[ext_resource path="res://src/Platforms/legacy/DropThroughPlatform.tscn" type="PackedScene" id=13] [ext_resource path="res://src/Contraptions/GateBlock.tscn" type="PackedScene" id=14] [ext_resource path="res://src/Contraptions/Triggers/ElevatorButton.tscn" type="PackedScene" id=15] [ext_resource path="res://src/Contraptions/Triggers/GateButton.tscn" type="PackedScene" id=16] diff --git a/src/Levels/Legacy/2 Tut Level.tscn b/src/Levels/Legacy/2 Tut Level.tscn index 22659c6..a26d9a6 100644 --- a/src/Levels/Legacy/2 Tut Level.tscn +++ b/src/Levels/Legacy/2 Tut Level.tscn @@ -13,7 +13,7 @@ [ext_resource path="res://src/Actors/Enemies/Beings/WhatAreFrog.tscn" type="PackedScene" id=11] [ext_resource path="res://src/BenefitialObjects/SavePoint.tscn" type="PackedScene" id=12] [ext_resource path="res://src/Contraptions/Triggers/ElevatorButton.tscn" type="PackedScene" id=13] -[ext_resource path="res://src/Platforms/DropThroughPlatform.tscn" type="PackedScene" id=14] +[ext_resource path="res://src/Platforms/legacy/DropThroughPlatform.tscn" type="PackedScene" id=14] [ext_resource path="res://src/Environment/Legacy/AlienShipTileSet.tres" type="TileSet" id=15] [ext_resource path="res://src/Levels/Level 2.gd" type="Script" id=16] diff --git a/src/Levels/Legacy/3 Tut Level.tscn b/src/Levels/Legacy/3 Tut Level.tscn index eebcf45..b24992d 100644 --- a/src/Levels/Legacy/3 Tut Level.tscn +++ b/src/Levels/Legacy/3 Tut Level.tscn @@ -6,9 +6,9 @@ [ext_resource path="res://src/Utilities/SignalManager.tscn" type="PackedScene" id=36] [ext_resource path="res://src/Utilities/LevelState.tscn" type="PackedScene" id=37] [ext_resource path="res://src/Actors/BlobbyCam.tscn" type="PackedScene" id=38] -[ext_resource path="res://src/Platforms/FlyingPlatformClean.tscn" type="PackedScene" id=40] +[ext_resource path="res://src/Platforms/legacy/FlyingPlatformClean.tscn" type="PackedScene" id=40] [ext_resource path="res://src/Contraptions/Portal/Portal.tscn" type="PackedScene" id=41] -[ext_resource path="res://src/Platforms/DropThroughPlatform.tscn" type="PackedScene" id=42] +[ext_resource path="res://src/Platforms/legacy/DropThroughPlatform.tscn" type="PackedScene" id=42] [ext_resource path="res://src/Actors/Enemies/Beings/Flyer.tscn" type="PackedScene" id=45] [ext_resource path="res://src/Actors/Blobby/Blobby.tscn" type="PackedScene" id=46] [ext_resource path="res://src/UserInterface/UserInterface.tscn" type="PackedScene" id=47] diff --git a/src/Levels/Level 4.tscn b/src/Levels/Level 4.tscn index c469b32..9c3540d 100644 --- a/src/Levels/Level 4.tscn +++ b/src/Levels/Level 4.tscn @@ -12,8 +12,8 @@ [ext_resource path="res://src/Contraptions/Triggers/FrogFreeButton.tscn" type="PackedScene" id=10] [ext_resource path="res://src/Contraptions/Portal/Portal.tscn" type="PackedScene" id=11] [ext_resource path="res://src/Levels/Level 4.gd" type="Script" id=12] -[ext_resource path="res://src/Platforms/SpringPlatform.tscn" type="PackedScene" id=13] -[ext_resource path="res://src/Platforms/DropThroughPlatform.tscn" type="PackedScene" id=14] +[ext_resource path="res://src/Platforms/Spring/SpringPlatform.tscn" type="PackedScene" id=13] +[ext_resource path="res://src/Platforms/legacy/DropThroughPlatform.tscn" type="PackedScene" id=14] [ext_resource path="res://src/Contraptions/GateBlock.tscn" type="PackedScene" id=15] [ext_resource path="res://src/Contraptions/Triggers/GateButton.tscn" type="PackedScene" id=16] diff --git a/src/Levels/x03 Level.tscn b/src/Levels/x03 Level.tscn index 298d1c4..8a6e614 100644 --- a/src/Levels/x03 Level.tscn +++ b/src/Levels/x03 Level.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=54 format=2] -[ext_resource path="res://src/Platforms/SpringPhysics.gd" type="Script" id=1] +[ext_resource path="res://src/Platforms/Spring/SpringPhysics.gd" type="Script" id=1] [ext_resource path="res://src/Environment/Legacy/AlienShipTileSet.tres" type="TileSet" id=2] [ext_resource path="res://assets/contraption/SpringHolder/SpringHolder10.png" type="Texture" id=3] [ext_resource path="res://assets/contraption/SpringHolder/SpringHolder25.png" type="Texture" id=4] @@ -39,9 +39,9 @@ [ext_resource path="res://src/Utilities/LevelState.tscn" type="PackedScene" id=37] [ext_resource path="res://src/Actors/BlobbyCam.tscn" type="PackedScene" id=38] [ext_resource path="res://src/Actors/Enemies/Beings/BoundFrog.tscn" type="PackedScene" id=39] -[ext_resource path="res://src/Platforms/FlyingPlatformClean.tscn" type="PackedScene" id=40] +[ext_resource path="res://src/Platforms/legacy/FlyingPlatformClean.tscn" type="PackedScene" id=40] [ext_resource path="res://src/Contraptions/Portal/Portal.tscn" type="PackedScene" id=41] -[ext_resource path="res://src/Platforms/DropThroughPlatform.tscn" type="PackedScene" id=42] +[ext_resource path="res://src/Platforms/legacy/DropThroughPlatform.tscn" type="PackedScene" id=42] [ext_resource path="res://src/Contraptions/Triggers/FrogFreeButton.tscn" type="PackedScene" id=43] [ext_resource path="res://src/Contraptions/Triggers/ElevatorButton.tscn" type="PackedScene" id=44] [ext_resource path="res://src/Actors/Enemies/Beings/Flyer.tscn" type="PackedScene" id=45] diff --git a/src/Levels/xFroggy Test Level.tscn b/src/Levels/xFroggy Test Level.tscn index f28f7a0..0a7cc48 100644 --- a/src/Levels/xFroggy Test Level.tscn +++ b/src/Levels/xFroggy Test Level.tscn @@ -13,7 +13,7 @@ [ext_resource path="res://src/Actors/Blobby/Blobby.tscn" type="PackedScene" id=12] [ext_resource path="res://src/UserInterface/UserInterface.tscn" type="PackedScene" id=13] [ext_resource path="res://src/Actors/Enemies/Beings/Flyer.tscn" type="PackedScene" id=14] -[ext_resource path="res://src/Platforms/SpringPlatform.tscn" type="PackedScene" id=15] +[ext_resource path="res://src/Platforms/Spring/SpringPlatform.tscn" type="PackedScene" id=15] [ext_resource path="res://src/Utilities/SignalManager.tscn" type="PackedScene" id=16] [ext_resource path="res://src/Utilities/LevelState.tscn" type="PackedScene" id=17] diff --git a/src/ObstacleObjects/Mine.gd b/src/ObstacleObjects/Mine.gd index b42731d..386da3d 100644 --- a/src/ObstacleObjects/Mine.gd +++ b/src/ObstacleObjects/Mine.gd @@ -9,7 +9,7 @@ export var is_locked = true func _ready() -> void: $Area2D.remove_from_group("harmful") - $Sprite/AnimationPlayer.play("locked") + $Sprite/AnimationPlayer.play("unarmed") func _on_Area2D_area_exited(area: Area2D) -> void: @@ -19,4 +19,9 @@ func _on_Area2D_area_exited(area: Area2D) -> void: func _on_Timer_timeout() -> void: is_locked = true $Area2D.add_to_group("harmful") - $Sprite/AnimationPlayer.play("unlocked") + $Sprite/AnimationPlayer.play("arming") + + +func _on_AnimationPlayer_animation_finished(anim_name: String) -> void: + if(anim_name == "arming"): + $Sprite/AnimationPlayer.play("armed") diff --git a/src/ObstacleObjects/Mine.tscn b/src/ObstacleObjects/Mine.tscn index 7ca451d..29b356f 100644 --- a/src/ObstacleObjects/Mine.tscn +++ b/src/ObstacleObjects/Mine.tscn @@ -1,6 +1,6 @@ -[gd_scene load_steps=7 format=2] +[gd_scene load_steps=8 format=2] -[ext_resource path="res://assets/obstacle object/mine.png" type="Texture" id=1] +[ext_resource path="res://assets/obstacle object/SpikyMinePlant.png" type="Texture" id=1] [ext_resource path="res://src/ObstacleObjects/Mine.gd" type="Script" id=2] [sub_resource type="Animation" id=2] @@ -30,9 +30,10 @@ tracks/1/keys = { "values": [ 4.0 ] } -[sub_resource type="Animation" id=3] -resource_name = "locked" -length = 0.1 +[sub_resource type="Animation" id=8] +resource_name = "armed" +length = 1.6 +loop = true tracks/0/type = "value" tracks/0/path = NodePath(".:frame") tracks/0/interp = 1 @@ -40,10 +41,67 @@ tracks/0/loop_wrap = true tracks/0/imported = false tracks/0/enabled = true tracks/0/keys = { +"times": PoolRealArray( 0, 0.2, 0.4, 0.6, 0.8, 1, 1.2, 1.4 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 22, 23, 24, 25, 26, 27, 28, 29 ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("../Area2D/CollisionShape2D:shape:radius") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { "times": PoolRealArray( 0 ), "transitions": PoolRealArray( 1 ), "update": 1, -"values": [ 0 ] +"values": [ 7.0 ] +} + +[sub_resource type="Animation" id=6] +resource_name = "arming" +length = 1.4 +tracks/0/type = "value" +tracks/0/path = NodePath(".:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.802038, 0.902195, 1.00219, 1.10219, 1.20219, 1.3 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21 ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("../Area2D/CollisionShape2D:shape:radius") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0.00519588, 0.698901 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 1, +"values": [ 4.0, 7.0 ] +} + +[sub_resource type="Animation" id=3] +resource_name = "unarmed" +length = 0.9 +loop = true +tracks/0/type = "value" +tracks/0/path = NodePath(".:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ] } tracks/1/type = "value" tracks/1/path = NodePath("../Area2D/CollisionShape2D:shape:radius") @@ -58,34 +116,6 @@ tracks/1/keys = { "values": [ 4.0 ] } -[sub_resource type="Animation" id=6] -resource_name = "unlocked" -length = 0.1 -tracks/0/type = "value" -tracks/0/path = NodePath(".:frame") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/keys = { -"times": PoolRealArray( 0 ), -"transitions": PoolRealArray( 1 ), -"update": 1, -"values": [ 1 ] -} -tracks/1/type = "value" -tracks/1/path = NodePath("../Area2D/CollisionShape2D:shape:radius") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/keys = { -"times": PoolRealArray( 0 ), -"transitions": PoolRealArray( 1 ), -"update": 0, -"values": [ 7.0 ] -} - [sub_resource type="CircleShape2D" id=7] resource_local_to_scene = true radius = 4.0 @@ -94,14 +124,16 @@ radius = 4.0 script = ExtResource( 2 ) [node name="Sprite" type="Sprite" parent="."] -position = Vector2( 0, -0.5 ) +position = Vector2( -0.5, 0 ) texture = ExtResource( 1 ) -hframes = 2 +hframes = 30 [node name="AnimationPlayer" type="AnimationPlayer" parent="Sprite"] +autoplay = "unarmed" anims/RESET = SubResource( 2 ) -anims/locked = SubResource( 3 ) -anims/unlocked = SubResource( 6 ) +anims/armed = SubResource( 8 ) +anims/arming = SubResource( 6 ) +anims/unarmed = SubResource( 3 ) [node name="Area2D" type="Area2D" parent="."] collision_layer = 64 @@ -113,5 +145,6 @@ shape = SubResource( 7 ) wait_time = 0.1 one_shot = true +[connection signal="animation_finished" from="Sprite/AnimationPlayer" to="." method="_on_AnimationPlayer_animation_finished"] [connection signal="area_exited" from="Area2D" to="." method="_on_Area2D_area_exited"] [connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"] diff --git a/src/Platforms/FlyingPlatform.tscn b/src/Platforms/FlyingPlatform.tscn index 2506d54..f930fb4 100644 --- a/src/Platforms/FlyingPlatform.tscn +++ b/src/Platforms/FlyingPlatform.tscn @@ -1,7 +1,56 @@ -[gd_scene load_steps=3 format=2] +[gd_scene load_steps=6 format=2] [ext_resource path="res://src/Platforms/FlyingPlatform.gd" type="Script" id=1] -[ext_resource path="res://assets/contraption/floating_platform_test.png" type="Texture" id=2] +[ext_resource path="res://assets/contraption/5xFloatingPlatform.png" type="Texture" id=2] + +[sub_resource type="Animation" id=1] +length = 0.001 +tracks/0/type = "value" +tracks/0/path = NodePath(".:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0 ] +} + +[sub_resource type="Animation" id=2] +resource_name = "v1" +length = 1.1 +loop = true +tracks/0/type = "value" +tracks/0/path = NodePath(".:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 13 ] +} + +[sub_resource type="Animation" id=3] +resource_name = "v2" +length = 0.6 +loop = true +tracks/0/type = "value" +tracks/0/path = NodePath(".:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.1, 0.2, 0.3, 0.4, 0.5 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 14, 15, 16, 17, 18, 19 ] +} [node name="FlyingPlatform" type="Node2D"] script = ExtResource( 1 ) @@ -14,8 +63,13 @@ motion/sync_to_physics = true [node name="Sprite" type="Sprite" parent="PlatformBody"] position = Vector2( 0, 8 ) texture = ExtResource( 2 ) -vframes = 8 -frame = 1 +hframes = 20 + +[node name="AnimationPlayer" type="AnimationPlayer" parent="PlatformBody/Sprite"] +autoplay = "v2" +anims/RESET = SubResource( 1 ) +anims/v1 = SubResource( 2 ) +anims/v2 = SubResource( 3 ) [node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="PlatformBody"] position = Vector2( 0, 4 ) diff --git a/src/Platforms/FlyingPlatformSmol.tscn b/src/Platforms/FlyingPlatformSmol.tscn new file mode 100644 index 0000000..6b77eec --- /dev/null +++ b/src/Platforms/FlyingPlatformSmol.tscn @@ -0,0 +1,93 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://src/Platforms/FlyingPlatform.gd" type="Script" id=1] +[ext_resource path="res://assets/contraption/3xFloatingPlatform.png" type="Texture" id=2] + +[sub_resource type="Animation" id=1] +length = 0.001 +tracks/0/type = "value" +tracks/0/path = NodePath(".:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0 ] +} +tracks/1/type = "value" +tracks/1/path = NodePath(".:frame_coords") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, 0 ) ] +} + +[sub_resource type="Animation" id=2] +resource_name = "v1" +length = 1.1 +loop = true +tracks/0/type = "value" +tracks/0/path = NodePath(".:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] +} + +[sub_resource type="Animation" id=3] +resource_name = "v2" +length = 0.5 +loop = true +tracks/0/type = "value" +tracks/0/path = NodePath(".:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.1, 0.2, 0.3, 0.4 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 11, 12, 13, 14, 15 ] +} + +[node name="FlyingPlatformSmol" type="Node2D"] +script = ExtResource( 1 ) + +[node name="PlatformBody" type="KinematicBody2D" parent="."] +collision_layer = 16 +collision_mask = 0 +motion/sync_to_physics = true + +[node name="Sprite" type="Sprite" parent="PlatformBody"] +position = Vector2( 0, 8 ) +texture = ExtResource( 2 ) +hframes = 17 + +[node name="AnimationPlayer" type="AnimationPlayer" parent="PlatformBody/Sprite"] +autoplay = "v2" +anims/RESET = SubResource( 1 ) +anims/v1 = SubResource( 2 ) +anims/v2 = SubResource( 3 ) + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="PlatformBody"] +position = Vector2( 0, 4 ) +scale = Vector2( 4, 0.4 ) +polygon = PoolVector2Array( -6, -10, 6, -10, 5.5, 0, 5.25, 5, -5.25, 5, -5.5, 0 ) + +[node name="FlyTween" type="Tween" parent="."] + +[connection signal="tween_completed" from="FlyTween" to="." method="_on_FlyTween_tween_completed"] diff --git a/src/Platforms/Spring.tscn b/src/Platforms/Spring/Spring.tscn similarity index 97% rename from src/Platforms/Spring.tscn rename to src/Platforms/Spring/Spring.tscn index 5483154..8cd59be 100644 --- a/src/Platforms/Spring.tscn +++ b/src/Platforms/Spring/Spring.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=35 format=2] -[ext_resource path="res://src/Platforms/SpringPlatform.tscn" type="PackedScene" id=1] +[ext_resource path="res://src/Platforms/Spring/SpringPlatform.tscn" type="PackedScene" id=1] [ext_resource path="res://assets/contraption/SpringHolder/SpringHolder24.png" type="Texture" id=2] [ext_resource path="res://assets/contraption/SpringHolder/SpringHolder2.png" type="Texture" id=3] [ext_resource path="res://assets/contraption/SpringHolder/SpringHolder17.png" type="Texture" id=4] @@ -51,5 +51,5 @@ scale = Vector2( 1.5, 1 ) position = Vector2( 0, 1.5 ) z_index = -1 frames = SubResource( 1 ) -frame = 24 +frame = 19 playing = true diff --git a/src/Platforms/SpringPhysics.gd b/src/Platforms/Spring/SpringPhysics.gd similarity index 100% rename from src/Platforms/SpringPhysics.gd rename to src/Platforms/Spring/SpringPhysics.gd diff --git a/src/Platforms/SpringPlatform.tscn b/src/Platforms/Spring/SpringPlatform.tscn similarity index 90% rename from src/Platforms/SpringPlatform.tscn rename to src/Platforms/Spring/SpringPlatform.tscn index 1672012..2c6dad8 100644 --- a/src/Platforms/SpringPlatform.tscn +++ b/src/Platforms/Spring/SpringPlatform.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=6 format=2] -[ext_resource path="res://assets/contraption/SpringPlatform.png" type="Texture" id=1] -[ext_resource path="res://src/Platforms/SpringPhysics.gd" type="Script" id=2] +[ext_resource path="res://src/Platforms/Spring/SpringPhysics.gd" type="Script" id=1] +[ext_resource path="res://assets/contraption/SpringPlatform.png" type="Texture" id=2] [sub_resource type="RectangleShape2D" id=2] extents = Vector2( 11.4863, 2.10568 ) @@ -13,10 +13,10 @@ extents = Vector2( 11.925, 0.0109166 ) extents = Vector2( 11.9158, 2.06284 ) [node name="SpringPlatform" type="Node2D"] -script = ExtResource( 2 ) +script = ExtResource( 1 ) [node name="Platform" type="Sprite" parent="."] -texture = ExtResource( 1 ) +texture = ExtResource( 2 ) [node name="SpringSkin" type="Area2D" parent="."] collision_layer = 32 diff --git a/src/Platforms/DropThroughPlatform.tscn b/src/Platforms/legacy/DropThroughPlatform.tscn similarity index 92% rename from src/Platforms/DropThroughPlatform.tscn rename to src/Platforms/legacy/DropThroughPlatform.tscn index 8552576..8e152af 100644 --- a/src/Platforms/DropThroughPlatform.tscn +++ b/src/Platforms/legacy/DropThroughPlatform.tscn @@ -1,8 +1,8 @@ [gd_scene load_steps=8 format=2] -[ext_resource path="res://assets/environment/blocks/DropThrough-Vine-Block.png" type="Texture" id=1] -[ext_resource path="res://assets/environment/blocks/DropThrough-Vine-BlockEnd1.png" type="Texture" id=2] -[ext_resource path="res://assets/environment/blocks/DropThrough-Vine-BlockEnd2.png" type="Texture" id=3] +[ext_resource path="res://assets/environment/blocks/DropThrough-Vine-BlockEnd1.png" type="Texture" id=1] +[ext_resource path="res://assets/environment/blocks/DropThrough-Vine-BlockEnd2.png" type="Texture" id=2] +[ext_resource path="res://assets/environment/blocks/DropThrough-Vine-Block.png" type="Texture" id=3] [sub_resource type="ConvexPolygonShape2D" id=3] points = PoolVector2Array( 24, 0, 0, 0, 0, 0, 24, 0 ) @@ -15,7 +15,7 @@ points = PoolVector2Array( 0, 0, 5, 0, 0, 0, 0, 0 ) [sub_resource type="TileSet" id=2] 0/name = "DropThrough-Vine-Block.png 0" -0/texture = ExtResource( 1 ) +0/texture = ExtResource( 3 ) 0/tex_offset = Vector2( 0, 0 ) 0/modulate = Color( 1, 1, 1, 1 ) 0/region = Rect2( 0, 0, 24, 12 ) @@ -36,7 +36,7 @@ points = PoolVector2Array( 0, 0, 5, 0, 0, 0, 0, 0 ) } ] 0/z_index = 0 1/name = "DropThrough-Vine-BlockEnd1.png 1" -1/texture = ExtResource( 2 ) +1/texture = ExtResource( 1 ) 1/tex_offset = Vector2( 0, 0 ) 1/modulate = Color( 1, 1, 1, 1 ) 1/region = Rect2( 0, 0, 12, 12 ) @@ -57,7 +57,7 @@ points = PoolVector2Array( 0, 0, 5, 0, 0, 0, 0, 0 ) } ] 1/z_index = 0 2/name = "DropThrough-Vine-BlockEnd2.png 2" -2/texture = ExtResource( 3 ) +2/texture = ExtResource( 2 ) 2/tex_offset = Vector2( 0, 0 ) 2/modulate = Color( 1, 1, 1, 1 ) 2/region = Rect2( 0, 0, 12, 12 ) diff --git a/src/Platforms/FlyingPlatformClean.tscn b/src/Platforms/legacy/FlyingPlatformClean.tscn similarity index 92% rename from src/Platforms/FlyingPlatformClean.tscn rename to src/Platforms/legacy/FlyingPlatformClean.tscn index 71b8cb3..a63efb0 100644 --- a/src/Platforms/FlyingPlatformClean.tscn +++ b/src/Platforms/legacy/FlyingPlatformClean.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=5 format=2] -[ext_resource path="res://assets/contraption/FlyingPlatformClean.png" type="Texture" id=1] -[ext_resource path="res://src/Platforms/FlyingPlatform.gd" type="Script" id=2] +[ext_resource path="res://src/Platforms/FlyingPlatform.gd" type="Script" id=1] +[ext_resource path="res://assets/contraption/FlyingPlatformClean.png" type="Texture" id=2] [sub_resource type="RectangleShape2D" id=1] extents = Vector2( 24, 6 ) @@ -24,7 +24,7 @@ tracks/0/keys = { } [node name="FlyingPlatformClean" type="Node2D"] -script = ExtResource( 2 ) +script = ExtResource( 1 ) [node name="KinematicBody2D" type="KinematicBody2D" parent="."] collision_layer = 16 @@ -32,7 +32,7 @@ collision_mask = 0 motion/sync_to_physics = true [node name="Sprite" type="Sprite" parent="KinematicBody2D"] -texture = ExtResource( 1 ) +texture = ExtResource( 2 ) [node name="CollisionShape2D" type="CollisionShape2D" parent="KinematicBody2D"] shape = SubResource( 1 )