From d9c91b93d9595d0d0497127576d5d7813952eb08 Mon Sep 17 00:00:00 2001 From: Juan Linietsky Date: Fri, 19 Aug 2016 16:47:31 -0300 Subject: [PATCH] Added a simple multiplayer test --- 2d/rubegoldberg/engine.cfg | 2 +- misc/window_management/observer/observer.gd | 1 + misc/window_management/window_management.scn | Bin 3588 -> 3600 bytes networking/simple_multiplayer/bomb.gd | 35 ++ networking/simple_multiplayer/bomb.tscn | 156 +++++++ networking/simple_multiplayer/brickfloor.png | Bin 0 -> 8340 bytes networking/simple_multiplayer/charwalk.png | Bin 0 -> 10847 bytes networking/simple_multiplayer/engine.cfg | 21 + networking/simple_multiplayer/explosion.png | Bin 0 -> 2955 bytes networking/simple_multiplayer/gamestate.gd | 182 ++++++++ networking/simple_multiplayer/lobby.gd | 85 ++++ networking/simple_multiplayer/lobby.tscn | 215 +++++++++ networking/simple_multiplayer/montserrat.otf | Bin 0 -> 71380 bytes networking/simple_multiplayer/player.gd | 103 +++++ networking/simple_multiplayer/player.tscn | 158 +++++++ networking/simple_multiplayer/rock.gd | 14 + networking/simple_multiplayer/rock.tscn | 101 +++++ networking/simple_multiplayer/rock_bit.png | Bin 0 -> 191 bytes networking/simple_multiplayer/score.gd | 56 +++ networking/simple_multiplayer/tile_scene.tscn | 45 ++ networking/simple_multiplayer/tileset.tres | 28 ++ networking/simple_multiplayer/world.tscn | 427 ++++++++++++++++++ {misc => networking}/udp_chat/chat.gd | 0 {misc => networking}/udp_chat/chat.scn | Bin {misc => networking}/udp_chat/engine.cfg | 0 {misc => networking}/udp_chat/icon.png | Bin 26 files changed, 1628 insertions(+), 1 deletion(-) create mode 100644 networking/simple_multiplayer/bomb.gd create mode 100644 networking/simple_multiplayer/bomb.tscn create mode 100644 networking/simple_multiplayer/brickfloor.png create mode 100644 networking/simple_multiplayer/charwalk.png create mode 100644 networking/simple_multiplayer/engine.cfg create mode 100644 networking/simple_multiplayer/explosion.png create mode 100644 networking/simple_multiplayer/gamestate.gd create mode 100644 networking/simple_multiplayer/lobby.gd create mode 100644 networking/simple_multiplayer/lobby.tscn create mode 100644 networking/simple_multiplayer/montserrat.otf create mode 100644 networking/simple_multiplayer/player.gd create mode 100644 networking/simple_multiplayer/player.tscn create mode 100644 networking/simple_multiplayer/rock.gd create mode 100644 networking/simple_multiplayer/rock.tscn create mode 100644 networking/simple_multiplayer/rock_bit.png create mode 100644 networking/simple_multiplayer/score.gd create mode 100644 networking/simple_multiplayer/tile_scene.tscn create mode 100644 networking/simple_multiplayer/tileset.tres create mode 100644 networking/simple_multiplayer/world.tscn rename {misc => networking}/udp_chat/chat.gd (100%) rename {misc => networking}/udp_chat/chat.scn (100%) rename {misc => networking}/udp_chat/engine.cfg (100%) rename {misc => networking}/udp_chat/icon.png (100%) diff --git a/2d/rubegoldberg/engine.cfg b/2d/rubegoldberg/engine.cfg index 1f746c13..829133fd 100644 --- a/2d/rubegoldberg/engine.cfg +++ b/2d/rubegoldberg/engine.cfg @@ -6,5 +6,5 @@ icon="res://icon.png" [physics_2d] +default_linear_damp=0.01 default_gravity=500 -default_density=0.01 diff --git a/misc/window_management/observer/observer.gd b/misc/window_management/observer/observer.gd index f1008118..16032043 100644 --- a/misc/window_management/observer/observer.gd +++ b/misc/window_management/observer/observer.gd @@ -62,6 +62,7 @@ func _input(event): if(event.type == InputEvent.MOUSE_MOTION): r_pos = event.relative_pos + if(impulse(event, "ui_cancel")): if(state == STATE_GRAB): Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) diff --git a/misc/window_management/window_management.scn b/misc/window_management/window_management.scn index 91174669cd098483b72b1287d7bbd0b5225dd6a1..aea8451e077599956560fca991981a96d59660ab 100644 GIT binary patch delta 1811 zcmXAqe@t7~701te&*p(iW>z3hF~JAh!32{yKvI4rE$2SF7(!@%K+D#2vW;=T#rRp+ zl(ZTmX3?CWoVX6(k0 zZ6FXZr?QEKrxFVSs;vjI@ige@y7>Gt<*_%e-&OMLmYPV%+}}{9Bhe2EyMpbI#b0W< z_+l>J)q1#4jUPj9>h;2zm{PE5k)h-{?+kt^vC=`7>x)iOkMoya9 zWX|(htW|j`=Dq-Fp{~T7hF0i|{!2g?d#>Opd}NIT&Bb&s?h@8r>f*uzUYYu@(00Q? zwp*<+Q;X4Wg2PSx=UQ)mE%Y<%$b2T1n8#1{=2bHt@_wS2GckMYNiCU5=5B!k5PL&2 zGm9DTvKCJ*X1%|UyVRv*+WQYJkW1#!OPeqq9Z~|bd+&#c`+JHx7j08nJnoIJP7T>$ z!nh7C_!IKJa$-{nD3MIt(~xzmL#}ddSPKe`r!B7hM?!tJ*e2|IiroVC426YyWW|() zYixlo0WIusXcf|)lMwNBE3?_?6#{Bv`@GkOzED8JhT-p!gSvfXH64jh{YffKp+vbU zIwq8+VHY)#TUM*>wvx^j&cdVE8*a7$6b3<9Ks4G}V7RG@Cc^gGNF*_x%$W<3Olq<1 z7j3yv(07BkSs$-kxT*YMwF5G%Zun8uJrd+ESdS{7@(-;E`0I#Sk7oQlQgs7AN3P7DoTw&OMRYy!idDV_Kn<2&@><{Q=f zLy39QW*f#JH0Dg4O{6l|8Rr?jtN*-!It5dB7tdRAn43+s)`Ul*HaOc^025Cs zGuRon&YIKN0o&A1jkg~*)hrZT9g~?K8Z(CZIy#pVnYq~N~$Dnl6r|xQjHn`XkaA2>{im)5)qP|G$70-`Hwms&T z4(pLR8?ES_;y{tTSkYdtJnOG$`=w@RH2JPwX@x@3IB~Pq4sLW+yaVWLy|B?TE zZQT>KfQC6IZ4}aUR93(Y#ep5TA`H;Kh+!l4WA2+iifx{D6~8`UL|f^ zu0%g5wfF8(o?SCumRdd4-}J1h4^_h7GBoC+JaHzWK`xHhY?#`ZSeE)55_(J8=l2zTxxH=yuK!!sQLk2M<@QJPgT2`Z)dZ|6UlE<#aH-9X7IU zu`_rn%IS_#Iu<7VZ_f3QHna}Ma9K_~DvP$M9ESpjFi$TyUflX>`74-GOuoI*SEQ&_f?ae~k_x`xk0mnkbh z0vGAGYu9OwvP`EfIE}-URmWvR0k6*UL&2%~&?Wb?E^Rn~wvj^D-s8}oK z+h2CjKP61^pRz;#hz^w<%qpoVJN#^C*)e=xTECM*OrHNNAE^~;g#IptH_HLpsytG@ ZHugN9*}=5eLo58pJJyvYUfTKe{{Wm7C0GCe delta 1732 zcmXX{eQXow8Gr81=8_m{+B6)^2YF&Uc1QwFC}|++n&1|S}VbekdD8TZP)H)%cN*z^bMbi zcdh@5O8?t1z_vJ|JyWr`_M7=381Q^94C%J?tZ*R7b|f0+y*>wChZei^IcSa5JNjes z<|}I{HzUrAf+<+o&QR2%~mbo6$<0(S5oxn)ZGZs}o+2 zd5%HK7Ei{i*!^s?_IDdv)m>R7`+H|p)u&VG_*2`tL7bkN!cXFVu%(UA!ZwQf__X#5 zP(0PvZK*wTJ^a42Z(?#hIe~ZUkBE9I?7JlBBQbaEgfu!nnl8XSfY@b8pPZib4NHmf zX~XyH_)~FaH0AqB3Z_TX=%WH0)gnUhxbI&O^?V@cW13%NiG;6fJ|6lWhB!9iMe=>L zw;;HL=%oK37#^|vY2F1=jlITt*HN3fV2hvT{IrN>!i+VrMisub&a8QD=Uu><9vYC#hMRG) z11B2%fK54=Y3y}2V?34^qf)tyHDkB~jmE5aEQvk;5SsD58p|*DR$nXG5>8I&Wo3P7 z@-(h5J&I`^k0-|`vAN5dm0N{F))(>%wXcDW`-Kr~_BxO2M~#lM_@&VAx^>Y2#NWbC ztbfWo#QwipTT4R1to73pO8C*S=T)5247(~p1xk?2@u&#F3)wmFp-fMpp4%$~E@|bA z0Qk9g1h`p7aJaaC0VOEmsN`^RRB@DXRHH;zpfr#vCV~x|sprgI0+7goJP~IaP{Jv@ z!2ku@ZOMR*=;n@Y*lq(hW7CSpT%2O%MN?Je8||$I8!6uM(__#I*Hq*dX!z!Bp$@VJ zyTNXQhv(wcn=@EdcX+Ac2;C`8AEENRK{`p~CU_vJum#tzlnG_H99k}#xnkT_o-*`S z@mAr6U9nvTY)2h}yyZU&%j@`>TKEbaD5)~Zp~tEoI>-Io!g(qWwUbP5sn=P7eatc= ztV?R;8%4vgjYpO8s2BN86bNpPQ4ZR811E*$XHd4Aa$h#(b99Gtv>RT+L0YtHO=!m; z&e|;|>s*rDG(#qn?0^Y7=1r#3BHf}W$xBsp?6fVJH|N+XI!nWJcBy<$+zGI>J>y<* zbNVrJvnNXdH+0x9nUpK0%J5WA$i;@2Y8B|@^uiV1@p(2vCKY%I@#SLtIa*{&-sDft zgdgEB=jlc7D}|OWcm)k!61vb$ra)kCHfi@tr@&T~P*KT%itkT48Iu20UQib!8Q6seQ(!mBYLD0tpqVhhUsE%3 zu~2n~7T9+BG zZq`XX1T;v{UCui3XMX{myi`l_Lup1mM`N^1V{ib8#>7Eh_unwYyDWc9dtnWF9SJ>^ zGPIqno=t#+6|9@>2eBVrJmZ$U!VcvXV%(4B75?|w&PNp-0!K|=iM+}E|7Wqbywcyz iXa9$DmpMxL_y&}tWf^Ok^oAO;uCKi>=+@bFZ~hN9s18j4 diff --git a/networking/simple_multiplayer/bomb.gd b/networking/simple_multiplayer/bomb.gd new file mode 100644 index 00000000..faecd532 --- /dev/null +++ b/networking/simple_multiplayer/bomb.gd @@ -0,0 +1,35 @@ + +extends Area2D + +# member variables here, example: +# var a=2 +# var b="textvar" + +var in_area = [] +var owner +#called from the animation +func explode(): + if (not is_network_master()): + #but will call explosion only on master + return + + for p in in_area: + if (p.has_method("exploded")): + p.rpc("exploded",owner) #exploded has a master keyword, so it will only be received by the master + +func done(): + queue_free() + +func _ready(): + # Called every time the node is added to the scene. + # Initialization here + pass + +func _on_bomb_body_enter( body ): + if (not body in in_area): + in_area.append(body) + + +func _on_bomb_body_exit( body ): + in_area.erase(body) + diff --git a/networking/simple_multiplayer/bomb.tscn b/networking/simple_multiplayer/bomb.tscn new file mode 100644 index 00000000..f7119421 --- /dev/null +++ b/networking/simple_multiplayer/bomb.tscn @@ -0,0 +1,156 @@ +[gd_scene load_steps=8 format=1] + +[ext_resource path="res://bomb.gd" type="Script" id=1] +[ext_resource path="res://brickfloor.png" type="Texture" id=2] +[ext_resource path="res://explosion.png" type="Texture" id=3] + +[sub_resource type="RectangleShape2D" id=1] + +custom_solver_bias = 0.0 +extents = Vector2( 8, 96 ) + +[sub_resource type="RectangleShape2D" id=2] + +custom_solver_bias = 0.0 +extents = Vector2( 96, 8 ) + +[sub_resource type="ColorRamp" id=3] + +offsets = FloatArray( 0, 0.0233918, 0.80117, 1 ) +colors = ColorArray( 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0.922156, 0, 0, 0, 0 ) + +[sub_resource type="Animation" id=4] + +resource/name = "anim" +length = 4.0 +loop = false +step = 0.1 +tracks/0/type = "value" +tracks/0/path = NodePath("sprite:modulate") +tracks/0/interp = 1 +tracks/0/imported = false +tracks/0/keys = { "times":FloatArray( 0, 0.4, 0.6, 0.8, 1.1, 1.3, 1.5, 1.8, 1.9, 2, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 3 ), "transitions":FloatArray( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ), "update":0, "values":[ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 1 ), Color( 8, 8, 8, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 1 ), Color( 8, 8, 8, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 1 ), Color( 8, 8, 8, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 1 ), Color( 8, 8, 8, 1 ), Color( 1, 1, 1, 1 ), Color( 8, 8, 8, 1 ), Color( 1, 1, 1, 1 ), Color( 8, 8, 8, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ] } +tracks/1/type = "value" +tracks/1/path = NodePath("explosion1:config/emitting") +tracks/1/interp = 1 +tracks/1/imported = false +tracks/1/keys = { "times":FloatArray( 2.8 ), "transitions":FloatArray( 1 ), "update":1, "values":[ true ] } +tracks/2/type = "value" +tracks/2/path = NodePath("explosion2:config/emitting") +tracks/2/interp = 1 +tracks/2/imported = false +tracks/2/keys = { "times":FloatArray( 2.8 ), "transitions":FloatArray( 1 ), "update":1, "values":[ true ] } +tracks/3/type = "method" +tracks/3/path = NodePath(".") +tracks/3/interp = 1 +tracks/3/imported = false +tracks/3/keys = { "times":FloatArray( 2.8, 3.4 ), "transitions":FloatArray( 1, 1 ), "values":[ { "args":[ ], "method":"explode" }, { "args":[ ], "method":"done" } ] } + +[node name="bomb" type="Area2D"] + +input/pickable = true +shapes/0/shape = SubResource( 1 ) +shapes/0/transform = Matrix32( 1, 0, 0, 1, 0, 0 ) +shapes/0/trigger = false +shapes/1/shape = SubResource( 2 ) +shapes/1/transform = Matrix32( 1, 0, 0, 1, 0, 0 ) +shapes/1/trigger = false +gravity_vec = Vector2( 0, 1 ) +gravity = 98.0 +linear_damp = 0.1 +angular_damp = 1.0 +script/script = ExtResource( 1 ) + +[node name="sprite" type="Sprite" parent="."] + +transform/pos = Vector2( -2.92606, -2.92606 ) +texture = ExtResource( 2 ) +region = true +region_rect = Rect2( 144, 0, 48, 48 ) + +[node name="shape1" type="CollisionShape2D" parent="."] + +shape = SubResource( 1 ) +trigger = false +_update_shape_index = 0 + +[node name="shape2" type="CollisionShape2D" parent="."] + +shape = SubResource( 2 ) +trigger = false +_update_shape_index = 1 + +[node name="explosion1" type="Particles2D" parent="."] + +config/amount = 16 +config/lifetime = 0.4 +config/emit_timeout = 0.4 +config/emitting = false +config/half_extents = Vector2( 80, 14 ) +config/explosiveness = 0.2 +config/texture = ExtResource( 3 ) +params/direction = 0.0 +params/spread = 10.0 +params/linear_velocity = 0.0 +params/spin_velocity = 3.0 +params/orbit_velocity = 0.0 +params/gravity_direction = 0.0 +params/gravity_strength = 0.0 +params/radial_accel = 0.0 +params/tangential_accel = 0.0 +params/damping = 0.0 +params/initial_angle = 358.292 +params/initial_size = 0.8 +params/final_size = 1.0 +params/hue_variation = 0.0 +params/anim_speed_scale = 1.0 +params/anim_initial_pos = 0.0 +randomness/spin_velocity = 1.0 +randomness/initial_angle = 1.0 +color/color_ramp = SubResource( 3 ) + +[node name="explosion2" type="Particles2D" parent="."] + +config/amount = 16 +config/lifetime = 0.4 +config/emit_timeout = 0.4 +config/emitting = false +config/half_extents = Vector2( 14, 80 ) +config/explosiveness = 0.2 +config/texture = ExtResource( 3 ) +params/direction = 0.0 +params/spread = 10.0 +params/linear_velocity = 0.0 +params/spin_velocity = 3.0 +params/orbit_velocity = 0.0 +params/gravity_direction = 0.0 +params/gravity_strength = 0.0 +params/radial_accel = 0.0 +params/tangential_accel = 0.0 +params/damping = 0.0 +params/initial_angle = 358.292 +params/initial_size = 0.8 +params/final_size = 1.0 +params/hue_variation = 0.0 +params/anim_speed_scale = 1.0 +params/anim_initial_pos = 0.0 +randomness/spin_velocity = 1.0 +randomness/initial_angle = 1.0 +color/color_ramp = SubResource( 3 ) + +[node name="anim" type="AnimationPlayer" parent="."] + +playback/process_mode = 1 +playback/default_blend_time = 0.0 +root/root = NodePath("..") +anims/anim = SubResource( 4 ) +playback/active = true +playback/speed = 1.0 +blend_times = [ ] +autoplay = "anim" + +[connection signal="body_enter" from="." to="." method="_on_bomb_body_enter"] + +[connection signal="body_exit" from="." to="." method="_on_bomb_body_exit"] + + diff --git a/networking/simple_multiplayer/brickfloor.png b/networking/simple_multiplayer/brickfloor.png new file mode 100644 index 0000000000000000000000000000000000000000..f863169b0334608f08ee2a92982b1b5bc15d6fa9 GIT binary patch literal 8340 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%0DbUMXYM*G{WLhfJ9vS z4-%Ky-D#_!kcsZZjQAt2fsR)fu_9Izty|v#*{0=jUcZCNNJ#^{GW8n&gpU;6xz~O) z@EFYFWUBOz{^)vqKc_mU{)6YUK2v&0G>QPFAp4+8mRKDF7uep)?qGg1I2o5Sy*>*a zg#>mqkN~jkY#!3Rme=whzz;mWQ?{lC(5s*#{qdQf)4a3r9rD%uD;u@6i&o5iFP97%F~ zc;FMN@TJhThmy7A)P4Z&pAwM8^w9T+-4 zHomip$XrUD_OlCX-ON12lARcmwOT0~tvx?lB#cFru&P~tGU80LerCAq$?cxu6yPb^ ztYHcp?K+py1JPOTRZ`6 zs+KvH=JSgeVe+OCwtl4Cc2Qd*^&xji?$nn*Cnb$PWdqfM zIIXc`uJ6%7c7y+}*uQ_*XEOi_h&*awb#1s6Gl;A5r|H1s?;8q3#^$8Ue>FxM!YdIFI2u|dE zmCSCp7i3YdgK2d~sAf&rQ&sb{EM2k}|_IZ!9&(bRc9Yxmm8DvM24 z9}MJ1nw^MCMwM(o@4g*ay`En9Sujg(EmWRQ5XRqXyD4A#0Y>a@A5dvJU=CKjW2EwH z+uril9*Ih+lF10X#O*bH^SCFNl)ss`Vt!EJ%L7rLzjK=wSj!M4I{Pvnv59yxSYF%&Po}e!a#t%47F%Vp;F%Vr$bqpe4Ut zdQ|2m&GW-!3pYIiR0!40@nfJdmxfhUk(%OAwY&!qTmjvjQQCaA$T04quVLUnE~i8W zas>-**Y#uMTko31%hYUIf{KZQw?K>`fAp1=d(F{45XIOAylKWe8 zODPpcNv55-%r~^<3<96zBTXhQW`MQ89oup)lmQJwBZ_X}-kRDC%jLzN(=x>dCKuQ$ zljRdhrfu-f!&xxb9^BU4WkLc2?*x5!nys6?UY@oDJClR zjhZccuvA_QNLlo>*0>27ybbd03b#+}P2kT@r<(5vaq0duDbUuN*WQLWOuX^r_mepX zhuF>?|GTBy?PSmpK$5QkP!7~KO9H$E`Vgqw#Li>=I3!>mfB|_#72dk*^n1CMu~m)3 zH5VvI;1cO^GdYD;JN`$4QHHGEmH{X>*u4z={r=lWn#Vi95eC;+BK;sw2a>Ub1%HY< zDR~}EpK^oM0=AGco+Q&9{V+yGDLuIJe?u#7>JEgrd|iFiL^pgFj(VJC5(xCCjL9QO zGq2R?_Vome)0n?I5qwUwCxN+MWEcaVF^;9Fin&_>aK2#)Al+zD>kcRor&OpD5-?*4 znAV)vK!+i|b|o2mglfzX!+XTQSiY*kwky~4;A2230oFubK{{(WH#!09+S!fjbk0&} z5G+Rs{eFC)8$4bCCUI_)v=sngs}jOYjG}26Q>Wnpz)|1Z4kqrE*cF2dJJyNV8jrVe z39czEBzO~Zvv)M^!zhf0q@F`VEK_gH}(+PC*E8ay`&6{BiV zh}%D&5z+K0o^yvvV%cmPRXmClDyeZr71uDY4UT5E)_dhB31+5@Jt!u!eAy{4wzqsKF_>HJ%L;__q#EQVaw|w8c}QyVKz>}?JV&u;(j~9jWx1DVqfy1ak)Jqc zwOsiQYG*pTX-=HO^@R)?c!HO=g}l{q5iC|^hY_3$~Z?2-WP3kVYU{%4P% z6C7#(hpmgtinvvNR(yGb+H3)3a}<##q1rc0qtbN~S#oD7J>^%#rX{0CXI@HtiRqND zx)uyZq0$xH)nA`iK$k+z){ybf-E&jv2e&d8;`^^s59?nlF-b^Ja{$`J4^((mun+bX zG~Vw8@Vr#Y#~!h!V8i(lcM6={v@dHZcl>>pZO-i}VDQ0m4Q;&^ssG_9xs3ZB63Da* z+-}WL4r?;HtSye9I&=~UbnlqN9JOipAu@T#ls+5An^FA|{g}8TyA-R|veepQ?F&8& z2><4K`uB`oKT8?9xYX>HiSCVV^Lk;zeOHet95UZ+j1su)`$S3p@=v5AQW#YabW@_a@e5x)v8bQ@-H`u>dso1BkyzK8v5zGc4qK|lJ0 z!bqZ@Wf?;}T*Bz<$cn^U*=Lj1$@pshPX27wf%#Imy zS4IF`IRlcyR+G|F)jZj8N7mCMwmZ4HFaIi)8RQ;O!#QDI=&uN9Mlrr@r&&tcz=da* z)!=67w)5H^su<|vKp@+haJ0l1$f=dAG<|G|eHrD3H`wBD1@q`{=!>|`O}J)g zq(1`6k4CD3SZ$0?r;v@fW`8BnO_V`%2)YQEAY}BU&np9i-)$B8mN&tHr0QjQSry2n5*a~v;MF}qs z5ymBn=(zZP-R{|sz<~|TZ+61gNr9O)^%Tr2aS%qb*4FT%M+Wh4=;RlOTy0-0y7b`w zzP`p&qw@S6aPAq2H=_ZBVjN`Gn84;O$A;PSf7ZHJYWMCh{9!ityH_<5AfX4rJF25w z+w4?Dz6>lt*UW?18YIOY)j5hitxY_|9N}@4)KuZg!h}&f$OkeYQ05lP6gFbBK%4lX z>iejp1%>*z_Fy0__n(dDt$E|&zX5Um&jM;{Xn{;c0I#D?Nf4lU`VJlK2GE?zg#TN4 zGMtw}#4AVRtwc7g{7(uqpi2@g+^wgMvKmiqYQD`cqf(5YZ<+WPtjlvdb#V;J;8Ob) z=EtAZ`Ow5XYZ@t#YyUodP}lzNr%A~HixW55O`?AYrK|kpg6}SSkGzhK&R*5zJ@QEs zIhb1r6zfg5<9>XX7VYEUC~0p>C0BG?9(zzYFY zB+wJk#9Eo;nQvZ8_HrBq)sRn5==R@K|B%YuKB+2#g0vV3GJCgo*QZ~j^u!Bz&U2Hy zJ$bY2OV(3%PiR1Vb@d<;P)%xPhnMHPjC8N{=z`SwuPzYuz9V{@QuMs^B7e`0g81&q zGG*8=2rlkV9B}J{1Kd{|$foBBlJK9p}2+e20-)|`?5?eDf3K1 z=q#Bab(P-gU`wd{-N38*9qh+(yrq%`cp8qny4o~a4V(PT_Teg2`P-8qbFewiyT#ZpwfzdqzqsJzS&#;@oF~2H*dlC+~={y!JgA#xnea z2cCnc6frO~K0UQ-0QVpbkEaOBR!MNa_0hTGt6b1>S;Mk!Co%AP2twz_Z&(s2LK(Oe z?JrH-e93@-OJnhm)4Dm@suW54?l~S#XLVQKhi;*j7}m!ScH6%#u1Pk=IeGIw`QDfV zu}&vS5Ie$@r*)Z{FmSuW?yf+bG*zd=U!iXFy7=a_R>>jG)0r~_w8dY7`V(AM+azZw zCxD@18i}H^x-cLQCS#PoIQW2`ykg5G34R~D*Dkj3o9~^g9Lrfr@ z52W{z_&eynQQ)@c4MA(k!1Q=?CiU9+DP%m2{%n1s`unuAR>XCK<}H1Eu&qztFV*|* z>*aZ(H!0DWbnh%jj=;7BX4q=Vml!+#6wl*6!XZAhU7jf zASPknZXFeaJnSeHr9!svt2hP?UCzy22yGF596a)zar|2RuiX(;$AjfTxA{au?iBsH zF&CIx%(6b+Cl36aJqoF)%O0vHJb_Mt#u_~rsNP^Nh(ih@N0_^Buwph(gHOra(Pk~;2# zoVc)KrL|PrG;NC#MXn@X_Qvlrrw`vOxg>Xau~DE89$>J$-^|W;F8}jCXJ+92_I`W6 z9opu{E5q~SmEr%7vdJNWpN(_HuNs@)uVU`{QS*lr3)Sc6rl!9RoO08?JvlpbYtR4k zfSp*VM)Ttp-Mj9@LRIF+D*~8_g=#uCHQfh%*bQ$^&d&Vjdsg7J3unG&Z2IRWO-2Bk z<;uOdRK6OO%D>^$9BMuCYYeUaH@T}Ts4C{;Ipl)@TuacGBJ5&v(0gA5rlUgNt;LT$ zQMN(&Mc@%PRs((vd~b4g=H_7v_+5p+c>gz0`%RN3{q1Lkjp~W8x&HB7T0%<7(DGZ@ z=UcSRYro%w?>CQXxRbz>S_odxnf1veU;KoMps|OIJyhklK`OvA@5%!&Kl+d$^Yc;kOg9!sPW@aw=?;KZJ>zu!Myp{XU`*zr75mNdr_HgH%kIjag# zF~|iU8S)`9S&;W4=VFI9j+~8H?Ve5fHqU? zT8wTa5LxyabOgB3!;IZSwFNYel?V2;2;oa>VAbY(?#>+6@Ox(n!Gy&D!_T?{s8a{=6twY_zpOT5kv*ua`sav##)b1 z^qgU$t}*lhXF9*zsM%YibjAHJ(6@to889&5bq8}QP#35QED5{~yal|Oy*~JMmzppy zNX2AI>~DR*MMv1ZAv8BNJqA3(<>&S%sG%bSoo2L1U13#WN#PdI1gz_KA^!56Z2nUn zHu~K`l7FhhMw)p@-Ta;QDF@`WgCO*E;49ZIJ>90$?CHn$XI5=mXrwS4>OysYOSCIobR{9( zYG6h~D0xsli6GAc5UJdTwpA&@0^nq_$i^hJyXUnmT%H0(UI> zc7nd0z^3DI;{+^s^tRC6p_#X9oOET#4h0s0m-Y_cc;R6-HpgKo+>ImaTzuE5-RAd} z8#B(IAy9C_w@VK>qG<;N9t_~&0C_O5i&rjm{ig@;onQRN+Ls@FJa&9LicRt27KLV& zqN&~uy;{tc&7+zLV1Z4?EbARm@tvS~XYHI*rfqd^r^}#^83~X9hvKcBj4inU^T8bE zLm}pzpPEO*s=k`M^Vk2j_Fo6l=)b$qKj;r`{8nM{RynlmaX!A6G8ms0A2jHQl$U&L>hehV;l(Q# zel+&j^|h`FOwP`%0YA9%$=_c+`JwrrB)5_!B(0fL%d#b*mNZLhbO_t;;FEXVbR@0R zQD@+uJB8#_h#4znwNEFO&*st97#R+bvX5Ft`U0#5UTbq;G+hn*2TC`?Lu;YogZOy<5C}hcJ#0e`MtHo}P*HJ%(V9w?6&g~Z-Kth8V&qFN8x}pUS z>-ofSf!4-Av9>(&+1m2Rx8VB9Va1#P2CIE|5)f-htY$kis_Wu--4_TYvvR80cD)8{ zxZnPXQsP zW;;W+12O~#J)~@qJ};yCmPI$xtc0j*ra+^kC|o~;g_@vmr09(Vn-kJ}NKynVf=xYR zQ}3e(DzJ-QJ%m1#KA?0HJlp+IEOx}OIBlK#7E~jY0B7tB^AzptS8BCN=Ye(M?ScK3Ovqks4jq@Q7Z=#5l{R~2?4oU_B zvt8V2Bgv>X%^)P_J#-^Q%DYQ(y_KS`C#2tPWbp%NQxSg)e{+Md5#r@f5eI$m9H@Xh zv&>)=0WAct!}9LE=1dM5?#R$0UzR=yiNTY5Q`JgL1);{EZ^&x%$FVRZ(%YN%}?;`$`jiErRuQ*LG3>H9k@Q3D)kvNRlrCeA-pcy%lgZM>a{b-IaKmwYHha z9-y>Uv|-U^3chB!qOd1VY^3OFl=WJ|c81?uCL|I0wN*-YZcXKa3)l?DPHuJmV#2Ccd z!%rpVrlv0f&jKH5-5VGvpIb%}$@aBA=<5k8F`Ny$zo@S0QVPqO#Z1xV0N+8X^FXWN zYO2(I9<41N#zM~mp9g%k21=4K%ccur1^d%2q--$1vwI7n8y3A5qrXaET{GwmxGv5U ziDNeFEZ?qJyLce=LmI=USU)pCV`vl`giOxPe5I!Xb5qk_06x-wzVhk=?lAx5>}BnC z(~|yO9s9x-@?hY$loo0!x@0rqBezN&Sm|J+$SE@D`c<~6bC)qhNP`?nu1Fe$s2G4R z9R{J19kT2QlqU+AMZVkEy{-IJl3BaGQl2cSc>;X~>Ncxw20S!YXgCZfSv<+6pn02} zi@G&5HN^Q6t$_-gqhmBrjFRLEtBASO?XKX^gRQm~M$W!^@Wggdrke48UXXqdIqxH9 zJk*e#R75+uLr!@ubKYOqVXqSZ$z88$N2m{lAN!ATwD`}!H##ox zwv|}n0l37aicwKkTSceSOf{>CV~9bweNlUqsgPWFQLM5 z+b$ZNoSj*5LHuTyxqsm<=MLdJhv^N4k|1XdQZdM&hYWkjNe?;cHKk&1QI?-k;MFt= z{^1bef8K4&+Y3UMf$PANE+*QZc@bD|Z?1cuWOpdyKUG3b`&EK{B)JT{4E!sw__@FN z*4uMa({sRNmzCZD{&I45rgkI+CTC~rz}2~_>DwIvy)rpFlOFpLdctpCsm{A%+IA># z)fuXN-211%8^C8e@ct6;O*i-W7u`p^#n)a(Ad6QnoN}Ig#RX#fq;v^rj6HTe>5@o4 z<1z!lk0)nmHsAG4{r^Qzi83xf;JW2LX* zc_%op5*8Vs>|V3!B!r#}f_LI0b;&VoMIX4u)PP^IC|#uC?izkCoX>*O^qA6+}9!oeoK(&itD~Zhn8&f21z7O;0n4tV3n8U@4tWjdsuoxaz%KOrB~q}yeB#R zpA;eKL%9D!dP0CC-V=Va6%q15^f!{QQ4%eJXW6N2Ae{FU|1v{RBc=;|*oFQQ|H&-} z^lw1VeqP7}X$dRhlAK0Fi_lzpkJYjV;ExulN2mhR*NVRzoKvpo?_#K%`Iv>{KIUTy z(x5@+V<)6Uqs+%rczTxkScb}=TjpbDR2n@qAG_Ec7f0pMJM;AtcE?|#Sxi~;bp>)` z)&q@<6J>H1bJ%>$pjxbt`ItotHr0GALG9Sd=3^(jXQXHrd(wPehH6Oqnvb24yJW2S z*v0O+IBFzWWxig*?)WQ43oR+qqd-lZUYd_fp)%5H=Ht?E+^S=AOiFBcXjr_qMsQ7S zqXrEd)`ee9>u7r@dI^?G9-)!C@Q8ZB(UCQKM@PlS z8De8~@tu?7V|CgN(GmK_^%^v2*qXL(YuoL*!hL$%c1>%0r>`M4E<8F)E57UFr)|(c zJPeDD4~~vX)HbZwpkDI^ts`|K4AJo+^&-NDHLBONUegwh8@1GS>fE<;FK?gToxS{R zz-f&2z&E&)d$A-tm$JL7i(MHFH*7xqxtKd7RBZ@{bCy+R6XG= z?^7OtFB0Aihxh9N#%MUJiF(7|D1aOX@MGb>PN1kWN`}AmOp7|e6A?%c{nP*uC@ng; z(->eh5a?|U6!k>?kQZw05L#VigJyx%SHKnrv{3BYJkWfQA6%iZ?Qw*`lko!8QNXtr zq(t%8L(SoLYk{v30Fyow0#~WLhJh68p{Bx53xL%KwS@ON0X2Q$rx)@DL)aURypVs9 z=`Or2Xp6=}3%5e`;eV3wzaB~z+DU9Ji|p$Oa;y*7!+_d2pskA_4XP1-a1;V?l7wdr za7BEA@)ZnxMhWeuhwBM&tQVxIh3CWIh`!w&_|pQ1F~YOG|eh>q1!~sUC4^%g! z;c6&I&l}$F^-1qI(rTL)+H@L$Z54jlGUkz?0=2d&PzGMAYn%qeCP^9}PY^BpspnZitErZLl*8O(m> zB=ds#gL%drWf{O<7JZE>qDr8>%|U{l&;T?T4F&mzf{ez3k23*%i>9LmXe-)=_MpA! zD07b4%baJ6GpAW4I*Wcn57BSv5A+|yFvS@KQ=X~7XqakDb*3)Ul4;GfVLX_wj4v~Y z8O($-VN5J@hWU><%lrmh(XrGGRYoI0`&NK|a}8ZWSI|9l2R%Z6A|rZ*-Y}(@GK?$3 zF?E=FOe3ZN(~xP#^kMok{!9Q{f^}vdFppRnlfz1wF07PwV&$xY<(M~gRA>HT-ZFnP ze=?7m3CustJBBb5ndi({W*jpf{m3+BjxmRrmyC(|h4~d^ewDe#9AJJ##Sw=_qcKc# z<`Q#}xy9UO?l58pxe2W&2m2;LwLz1*fgX8* z1&arbMPS<&p=D?lQ<8OM-Po_$l582aJX@MA%a&tHAt$G@@JwIuaHP-<^}%Y4Wx4@< zb66GIoIS;!Ved<-N#;p5Ne-*OQNPlb(Yk5XT6b+VZ3As9Z71#4N?axPO7$uYacA92 zy1Tk7-QC>P?zP>!xd*u$s-7k6fByk|YT;S|4LtyEIe>c-;NG&rO;f+ra@um*3R
  • yTi=^jjJ)R*}h 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 YDpF@EQd=rgPbyMFDk#~jka_Zd0GK9$b^rhX literal 0 HcmV?d00001 diff --git a/networking/simple_multiplayer/player.gd b/networking/simple_multiplayer/player.gd new file mode 100644 index 00000000..31dcf033 --- /dev/null +++ b/networking/simple_multiplayer/player.gd @@ -0,0 +1,103 @@ + +extends KinematicBody2D + +const MOTION_SPEED = 90.0 + +slave var slave_pos = Vector2() +slave var slave_motion = Vector2() + +export var stunned=false + +#use sync because it will be called everywhere +sync func setup_bomb(name,pos,by_who): + var bomb = preload("res://bomb.tscn").instance() + bomb.set_name( name ) #ensure unique name for the bomb + bomb.set_pos( pos ) + bomb.owner=by_who + get_node("../..").add_child(bomb) + +var current_anim="" +var prev_bombing=false +var bomb_index=0 + +func _fixed_process(delta): + + var motion = Vector2() + + if ( is_network_master() ): + + if (Input.is_action_pressed("move_left")): + motion+=Vector2(-1, 0) + if (Input.is_action_pressed("move_right")): + motion+=Vector2( 1, 0) + if (Input.is_action_pressed("move_up")): + motion+=Vector2( 0,-1) + if (Input.is_action_pressed("move_down")): + motion+=Vector2( 0, 1) + + var bombing = Input.is_action_pressed("set_bomb") + + if (stunned): + bombing=false + motion=Vector2() + + if (bombing and not prev_bombing): + var bomb_name = get_name() + str(bomb_index) + var bomb_pos = get_pos() + rpc("setup_bomb",bomb_name, bomb_pos, get_tree().get_network_unique_id() ) + + prev_bombing=bombing + motion*=delta + + + rset("slave_motion",motion) + rset("slave_pos",get_pos()) + else: + set_pos(slave_pos) + motion = slave_motion + + var new_anim="standing" + if (motion.y<0): + new_anim="walk_up" + elif (motion.y>0): + new_anim="walk_down" + elif (motion.x<0): + new_anim="walk_left" + elif (motion.x>0): + new_anim="walk_right" + + if (stunned): + new_anim="stunned" + + if (new_anim!=current_anim): + current_anim=new_anim + get_node("anim").play(current_anim) + + + var remainder = move( motion * MOTION_SPEED ) + + if (is_colliding()): + #slide through walls + move( get_collision_normal().slide( remainder ) ) + + if ( not is_network_master() ): + slave_pos = get_pos() # to avoid jitter + +slave func stun(): + stunned=true + +master func exploded(by_who): + if (stunned): + return + stun() + rpc("stun") +func set_player_name(name): + get_node("Label").set_text(name) + +func _ready(): + stunned=false + slave_pos=get_pos() + set_fixed_process(true) + pass + + diff --git a/networking/simple_multiplayer/player.tscn b/networking/simple_multiplayer/player.tscn new file mode 100644 index 00000000..099455d9 --- /dev/null +++ b/networking/simple_multiplayer/player.tscn @@ -0,0 +1,158 @@ +[gd_scene load_steps=12 format=1] + +[ext_resource path="res://player.gd" type="Script" id=1] +[ext_resource path="res://charwalk.png" type="Texture" id=2] +[ext_resource path="res://montserrat.otf" type="DynamicFontData" id=3] + +[sub_resource type="CircleShape2D" id=1] + +custom_solver_bias = 0.0 +radius = 20.0 + +[sub_resource type="Animation" id=2] + +resource/name = "standing" +length = 0.8 +loop = true +step = 0.1 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/imported = false +tracks/0/keys = { "times":FloatArray( 0, 0.2, 0.4, 0.6 ), "transitions":FloatArray( 1, 1, 1, 1 ), "update":1, "values":[ 0, 4, 8, 12 ] } + +[sub_resource type="Animation" id=3] + +resource/name = "stunned" +length = 1.2 +loop = false +step = 0.1 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/imported = false +tracks/0/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":1, "values":[ 0 ] } +tracks/1/type = "value" +tracks/1/path = NodePath("Sprite:transform/rot") +tracks/1/interp = 1 +tracks/1/imported = false +tracks/1/keys = { "times":FloatArray( 0, 1, 1.1 ), "transitions":FloatArray( 1, 0, 1 ), "update":0, "values":[ 0.0, 720.0, 0.0 ] } +tracks/2/type = "value" +tracks/2/path = NodePath(".:stunned") +tracks/2/interp = 1 +tracks/2/imported = false +tracks/2/keys = { "times":FloatArray( 1 ), "transitions":FloatArray( 1 ), "update":1, "values":[ false ] } + +[sub_resource type="Animation" id=4] + +length = 0.8 +loop = true +step = 0.1 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/imported = false +tracks/0/keys = { "times":FloatArray( 0, 0.2, 0.4, 0.6 ), "transitions":FloatArray( 1, 1, 1, 1 ), "update":1, "values":[ 0, 4, 8, 12 ] } + +[sub_resource type="Animation" id=5] + +length = 0.8 +loop = true +step = 0.2 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/imported = false +tracks/0/keys = { "times":FloatArray( 0, 0.2, 0.4, 0.6 ), "transitions":FloatArray( 1, 1, 1, 1 ), "update":1, "values":[ 1, 5, 9, 13 ] } + +[sub_resource type="Animation" id=6] + +length = 0.8 +loop = true +step = 0.2 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/imported = false +tracks/0/keys = { "times":FloatArray( 0, 0.2, 0.4, 0.6 ), "transitions":FloatArray( 1, 1, 1, 1 ), "update":1, "values":[ 3, 7, 11, 15 ] } + +[sub_resource type="Animation" id=7] + +length = 0.8 +loop = true +step = 0.2 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/imported = false +tracks/0/keys = { "times":FloatArray( 0, 0.2, 0.4, 0.6 ), "transitions":FloatArray( 1, 1, 1, 1 ), "update":1, "values":[ 2, 6, 10, 14 ] } + +[sub_resource type="DynamicFont" id=8] + +font/size = 14 +font/use_mipmaps = false +font/use_filter = false +font/font = ExtResource( 3 ) + +[node name="player" type="KinematicBody2D"] + +input/pickable = false +shapes/0/shape = SubResource( 1 ) +shapes/0/transform = Matrix32( 1, 0, 0, 1, 0, 0 ) +shapes/0/trigger = false +collision/layers = 1 +collision/mask = 1 +collision/margin = 0.08 +script/script = ExtResource( 1 ) +stunned = false + +[node name="Sprite" type="Sprite" parent="."] + +transform/pos = Vector2( 0.0750351, 6.23615 ) +texture = ExtResource( 2 ) +offset = Vector2( -0.0750351, -6.23615 ) +vframes = 4 +hframes = 4 + +[node name="shape" type="CollisionShape2D" parent="."] + +shape = SubResource( 1 ) +trigger = false +_update_shape_index = 0 + +[node name="anim" type="AnimationPlayer" parent="."] + +playback/process_mode = 1 +playback/default_blend_time = 0.0 +root/root = NodePath("..") +anims/standing = SubResource( 2 ) +anims/stunned = SubResource( 3 ) +anims/walk_down = SubResource( 4 ) +anims/walk_left = SubResource( 5 ) +anims/walk_right = SubResource( 6 ) +anims/walk_up = SubResource( 7 ) +next/walk_down = "" +playback/active = true +playback/speed = 1.0 +blend_times = [ ] +autoplay = "" + +[node name="Label" type="Label" parent="."] + +visibility/opacity = 0.7 +focus/ignore_mouse = true +focus/stop_mouse = true +size_flags/horizontal = 2 +size_flags/vertical = 0 +margin/left = -82.0 +margin/top = -35.0 +margin/right = 85.0 +margin/bottom = -14.0 +custom_fonts/font = SubResource( 8 ) +text = "Player 1" +align = 1 +percent_visible = 1.0 +lines_skipped = 0 +max_lines_visible = -1 + + diff --git a/networking/simple_multiplayer/rock.gd b/networking/simple_multiplayer/rock.gd new file mode 100644 index 00000000..252638ec --- /dev/null +++ b/networking/simple_multiplayer/rock.gd @@ -0,0 +1,14 @@ + +extends KinematicBody2D + +#sent to everyone else +slave func do_explosion(): + get_node("anim").play("explode") + +#received by owner of the rock +master func exploded(by_who): + rpc("do_explosion") #re-sent to slave rocks + get_node("../../score").rpc("increase_score",by_who) + do_explosion() + + \ No newline at end of file diff --git a/networking/simple_multiplayer/rock.tscn b/networking/simple_multiplayer/rock.tscn new file mode 100644 index 00000000..92e99c9b --- /dev/null +++ b/networking/simple_multiplayer/rock.tscn @@ -0,0 +1,101 @@ +[gd_scene load_steps=7 format=1] + +[ext_resource path="res://rock.gd" type="Script" id=1] +[ext_resource path="res://brickfloor.png" type="Texture" id=2] +[ext_resource path="res://rock_bit.png" type="Texture" id=3] + +[sub_resource type="RectangleShape2D" id=1] + +custom_solver_bias = 0.0 +extents = Vector2( 24, 24 ) + +[sub_resource type="ColorRamp" id=2] + +offsets = FloatArray( 0, 0.860465, 1 ) +colors = ColorArray( 1, 1, 1, 1, 0.860465, 0.860465, 0.860465, 1, 1, 1, 1, 0 ) + +[sub_resource type="Animation" id=3] + +resource/name = "explode" +length = 1.0 +loop = false +step = 0.1 +tracks/0/type = "value" +tracks/0/path = NodePath("explosion:config/emitting") +tracks/0/interp = 1 +tracks/0/imported = false +tracks/0/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":1, "values":[ true ] } +tracks/1/type = "method" +tracks/1/path = NodePath(".") +tracks/1/interp = 1 +tracks/1/imported = false +tracks/1/keys = { "times":FloatArray( 1 ), "transitions":FloatArray( 1 ), "values":[ { "args":[ ], "method":"queue_free" } ] } +tracks/2/type = "value" +tracks/2/path = NodePath("sprite:visibility/visible") +tracks/2/interp = 1 +tracks/2/imported = false +tracks/2/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":1, "values":[ false ] } + +[node name="rock" type="KinematicBody2D"] + +input/pickable = false +shapes/0/shape = SubResource( 1 ) +shapes/0/transform = Matrix32( 1, 0, 0, 1, 0, 0 ) +shapes/0/trigger = false +collision/layers = 1 +collision/mask = 1 +collision/margin = 0.001 +script/script = ExtResource( 1 ) + +[node name="sprite" type="Sprite" parent="."] + +texture = ExtResource( 2 ) +region = true +region_rect = Rect2( 96, 0, 48, 48 ) + +[node name="shape" type="CollisionShape2D" parent="."] + +shape = SubResource( 1 ) +trigger = false +_update_shape_index = 0 + +[node name="explosion" type="Particles2D" parent="."] + +config/amount = 32 +config/lifetime = 0.8 +config/emit_timeout = 0.8 +config/emitting = false +config/half_extents = Vector2( 15, 15 ) +config/explosiveness = 0.1 +config/texture = ExtResource( 3 ) +params/direction = 0.0 +params/spread = 180.0 +params/linear_velocity = 100.0 +params/spin_velocity = 4.0 +params/orbit_velocity = 0.0 +params/gravity_direction = 0.0 +params/gravity_strength = 90.0 +params/radial_accel = 0.0 +params/tangential_accel = 0.0 +params/damping = 0.0 +params/initial_angle = 0.0 +params/initial_size = 2.0 +params/final_size = 2.0 +params/hue_variation = 0.0 +params/anim_speed_scale = 1.0 +params/anim_initial_pos = 0.0 +randomness/spin_velocity = 0.95 +color/color_ramp = SubResource( 2 ) + +[node name="anim" type="AnimationPlayer" parent="."] + +playback/process_mode = 1 +playback/default_blend_time = 0.0 +root/root = NodePath("..") +anims/explode = SubResource( 3 ) +playback/active = true +playback/speed = 1.0 +blend_times = [ ] +autoplay = "" + + diff --git a/networking/simple_multiplayer/rock_bit.png b/networking/simple_multiplayer/rock_bit.png new file mode 100644 index 0000000000000000000000000000000000000000..f497181566c2a4a203ba96f15e3f39eee66e99e6 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61|)m))t&+=&H|6fVxatW5N34Jm|X!BWH0gb zb!C6RA;irhD}7%1G*C#g#5JPCIX^cyHLrxhxhOTUBsE2$JhLQ2!QIn0AiR-J9H_|B z)5S4_<9ck@K~4q*o+FnYS#AHX@ckvz+{JYwNA@^*gow7k%xj1^@L^*3xz@KQzi;SO g5$cduWjw;B_FCZ6@AFeP0}WyDboFyt=akR{052jus{jB1 literal 0 HcmV?d00001 diff --git a/networking/simple_multiplayer/score.gd b/networking/simple_multiplayer/score.gd new file mode 100644 index 00000000..06fe94e8 --- /dev/null +++ b/networking/simple_multiplayer/score.gd @@ -0,0 +1,56 @@ + +extends HBoxContainer + +# member variables here, example: +# var a=2 +# var b="textvar" + +var player_labels={} + +func _process(delta): + + var rocks_left = get_node("../rocks").get_child_count() + if (rocks_left==0): + var winner_name = "" + var winner_score = 0 + for p in player_labels: + if (player_labels[p].score > winner_score): + winner_score=player_labels[p].score + winner_name=player_labels[p].name + + get_node("../winner").set_text("THE WINNER IS:\n"+winner_name) + get_node("../winner").show() + + + + +sync func increase_score(for_who): + assert( for_who in player_labels ) + var pl = player_labels[for_who] + pl.score+=1 + pl.label.set_text( pl.name+"\n"+str(pl.score) ) + + +func add_player(id,name): + var l = Label.new() + l.set_align(Label.ALIGN_CENTER) + l.set_text(name+"\n"+"0") + l.set_h_size_flags(SIZE_EXPAND_FILL) + var font = DynamicFont.new() + font.set_size(18) + font.set_font_data( preload("res://montserrat.otf" ) ) + l.add_font_override("font",font) + + add_child(l) + + player_labels[id]={ name=name, label=l, score=0 } + +func _ready(): + get_node("../winner").hide() + set_process(true) + + + +func _on_exit_game_pressed(): + gamestate.end_game() + diff --git a/networking/simple_multiplayer/tile_scene.tscn b/networking/simple_multiplayer/tile_scene.tscn new file mode 100644 index 00000000..604e4c31 --- /dev/null +++ b/networking/simple_multiplayer/tile_scene.tscn @@ -0,0 +1,45 @@ +[gd_scene load_steps=3 format=1] + +[ext_resource path="res://brickfloor.png" type="Texture" id=1] + +[sub_resource type="RectangleShape2D" id=1] + +custom_solver_bias = 0.0 +extents = Vector2( 24, 24 ) + +[node name="Node2D" type="Node2D"] + +[node name="wall" type="Sprite" parent="."] + +transform/pos = Vector2( 24, 24 ) +texture = ExtResource( 1 ) +region = true +region_rect = Rect2( 0, 0, 48, 48 ) + +[node name="col" type="StaticBody2D" parent="wall"] + +input/pickable = false +shapes/0/shape = SubResource( 1 ) +shapes/0/transform = Matrix32( 1, 0, 0, 1, 0, 0 ) +shapes/0/trigger = false +collision/layers = 1 +collision/mask = 1 +constant_linear_velocity = Vector2( 0, 0 ) +constant_angular_velocity = 0.0 +friction = 1.0 +bounce = 0.0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="wall/col"] + +shape = SubResource( 1 ) +trigger = false +_update_shape_index = 0 + +[node name="floor" type="Sprite" parent="."] + +transform/pos = Vector2( 72, 24 ) +texture = ExtResource( 1 ) +region = true +region_rect = Rect2( 48, 0, 48, 48 ) + + diff --git a/networking/simple_multiplayer/tileset.tres b/networking/simple_multiplayer/tileset.tres new file mode 100644 index 00000000..e75615ca --- /dev/null +++ b/networking/simple_multiplayer/tileset.tres @@ -0,0 +1,28 @@ +[gd_resource type="TileSet" load_steps=3 format=1] + +[ext_resource path="res://brickfloor.png" type="Texture" id=1] + +[sub_resource type="RectangleShape2D" id=1] + +custom_solver_bias = 0.0 +extents = Vector2( 24, 24 ) + +[resource] + +0/name = "wall" +0/texture = ExtResource( 1 ) +0/tex_offset = Vector2( 0, 0 ) +0/region = Rect2( 0, 0, 48, 48 ) +0/occluder_offset = Vector2( 24, 24 ) +0/navigation_offset = Vector2( 24, 24 ) +0/shape_offset = Vector2( 24, 24 ) +0/shapes = [ SubResource( 1 ) ] +1/name = "floor" +1/texture = ExtResource( 1 ) +1/tex_offset = Vector2( 0, 0 ) +1/region = Rect2( 48, 0, 48, 48 ) +1/occluder_offset = Vector2( 24, 24 ) +1/navigation_offset = Vector2( 24, 24 ) +1/shape_offset = Vector2( 0, 0 ) +1/shapes = [ ] + diff --git a/networking/simple_multiplayer/world.tscn b/networking/simple_multiplayer/world.tscn new file mode 100644 index 00000000..959ff811 --- /dev/null +++ b/networking/simple_multiplayer/world.tscn @@ -0,0 +1,427 @@ +[gd_scene load_steps=6 format=1] + +[ext_resource path="res://tileset.tres" type="TileSet" id=1] +[ext_resource path="res://rock.tscn" type="PackedScene" id=2] +[ext_resource path="res://score.gd" type="Script" id=3] +[ext_resource path="res://montserrat.otf" type="DynamicFontData" id=4] + +[sub_resource type="DynamicFont" id=1] + +font/size = 44 +font/use_mipmaps = false +font/use_filter = false +font/font = ExtResource( 4 ) + +[node name="world" type="Node2D"] + +[node name="map" type="TileMap" parent="."] + +mode = 0 +tile_set = ExtResource( 1 ) +cell/size = Vector2( 48, 48 ) +cell/quadrant_size = 16 +cell/custom_transform = Matrix32( 1, 0, 0, 1, 0, 0 ) +cell/half_offset = 2 +cell/tile_origin = 0 +cell/y_sort = false +collision/use_kinematic = false +collision/friction = 1.0 +collision/bounce = 0.0 +collision/layers = 1 +collision/mask = 1 +occluder/light_mask = 1 +tile_data = IntArray( 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0, 10, 0, 11, 0, 12, 0, 13, 0, 14, 0, 15, 0, 16, 0, 17, 0, 18, 0, 19, 0, 20, 0, 21, 0, 65536, 0, 65537, 1, 65538, 1, 65539, 1, 65540, 1, 65541, 1, 65542, 1, 65543, 1, 65544, 1, 65545, 1, 65546, 1, 65547, 1, 65548, 1, 65549, 1, 65550, 1, 65551, 1, 65552, 1, 65553, 1, 65554, 1, 65555, 1, 65556, 0, 65557, 0, 131072, 0, 131073, 1, 131074, 0, 131075, 1, 131076, 0, 131077, 1, 131078, 0, 131079, 1, 131080, 0, 131081, 1, 131082, 0, 131083, 0, 131084, 0, 131085, 0, 131086, 0, 131087, 1, 131088, 0, 131089, 1, 131090, 0, 131091, 1, 131092, 0, 131093, 0, 196608, 0, 196609, 1, 196610, 1, 196611, 1, 196612, 0, 196613, 1, 196614, 1, 196615, 1, 196616, 1, 196617, 1, 196618, 0, 196619, 1, 196620, 1, 196621, 1, 196622, 1, 196623, 1, 196624, 1, 196625, 1, 196626, 1, 196627, 1, 196628, 0, 196629, 0, 262144, 0, 262145, 1, 262146, 0, 262147, 1, 262148, 0, 262149, 1, 262150, 0, 262151, 1, 262152, 0, 262153, 1, 262154, 0, 262155, 1, 262156, 0, 262157, 1, 262158, 0, 262159, 1, 262160, 0, 262161, 1, 262162, 0, 262163, 1, 262164, 0, 262165, 0, 327680, 0, 327681, 1, 327682, 1, 327683, 1, 327684, 1, 327685, 1, 327686, 0, 327687, 1, 327688, 1, 327689, 1, 327690, 1, 327691, 1, 327692, 1, 327693, 1, 327694, 1, 327695, 1, 327696, 1, 327697, 1, 327698, 0, 327699, 1, 327700, 0, 327701, 0, 393216, 0, 393217, 1, 393218, 0, 393219, 1, 393220, 0, 393221, 1, 393222, 0, 393223, 1, 393224, 0, 393225, 1, 393226, 0, 393227, 1, 393228, 0, 393229, 0, 393230, 0, 393231, 0, 393232, 0, 393233, 1, 393234, 0, 393235, 1, 393236, 0, 393237, 0, 458752, 0, 458753, 1, 458754, 1, 458755, 1, 458756, 1, 458757, 1, 458758, 1, 458759, 1, 458760, 1, 458761, 1, 458762, 1, 458763, 1, 458764, 1, 458765, 1, 458766, 1, 458767, 1, 458768, 1, 458769, 1, 458770, 1, 458771, 1, 458772, 0, 458773, 0, 524288, 0, 524289, 1, 524290, 0, 524291, 0, 524292, 0, 524293, 1, 524294, 0, 524295, 1, 524296, 0, 524297, 1, 524298, 0, 524299, 1, 524300, 0, 524301, 0, 524302, 0, 524303, 1, 524304, 0, 524305, 1, 524306, 0, 524307, 1, 524308, 0, 524309, 0, 589824, 0, 589825, 1, 589826, 1, 589827, 1, 589828, 1, 589829, 1, 589830, 1, 589831, 1, 589832, 0, 589833, 1, 589834, 1, 589835, 1, 589836, 0, 589837, 1, 589838, 1, 589839, 1, 589840, 1, 589841, 1, 589842, 1, 589843, 1, 589844, 0, 589845, 0, 655360, 0, 655361, 1, 655362, 0, 655363, 1, 655364, 0, 655365, 1, 655366, 0, 655367, 1, 655368, 0, 655369, 1, 655370, 0, 655371, 1, 655372, 0, 655373, 1, 655374, 0, 655375, 1, 655376, 0, 655377, 1, 655378, 0, 655379, 1, 655380, 0, 655381, 0, 720896, 0, 720897, 1, 720898, 1, 720899, 1, 720900, 1, 720901, 1, 720902, 1, 720903, 1, 720904, 1, 720905, 1, 720906, 1, 720907, 1, 720908, 1, 720909, 1, 720910, 1, 720911, 1, 720912, 1, 720913, 1, 720914, 1, 720915, 1, 720916, 0, 720917, 0, 786432, 0, 786433, 0, 786434, 0, 786435, 0, 786436, 0, 786437, 0, 786438, 0, 786439, 0, 786440, 0, 786441, 0, 786442, 0, 786443, 0, 786444, 0, 786445, 0, 786446, 0, 786447, 0, 786448, 0, 786449, 0, 786450, 0, 786451, 0, 786452, 0, 786453, 0 ) +__meta__ = { "_edit_lock_":true } + +[node name="spawn_points" type="Node2D" parent="."] + +editor/display_folded = true + +[node name="0" type="Position2D" parent="spawn_points"] + +transform/pos = Vector2( 72, 72 ) + +[node name="1" type="Position2D" parent="spawn_points"] + +transform/pos = Vector2( 264, 216 ) + +[node name="2" type="Position2D" parent="spawn_points"] + +transform/pos = Vector2( 72, 456 ) + +[node name="3" type="Position2D" parent="spawn_points"] + +transform/pos = Vector2( 360, 552 ) + +[node name="4" type="Position2D" parent="spawn_points"] + +transform/pos = Vector2( 840, 360 ) + +[node name="5" type="Position2D" parent="spawn_points"] + +transform/pos = Vector2( 456, 264 ) + +[node name="6" type="Position2D" parent="spawn_points"] + +transform/pos = Vector2( 696, 264 ) + +[node name="7" type="Position2D" parent="spawn_points"] + +transform/pos = Vector2( 744, 456 ) + +[node name="8" type="Position2D" parent="spawn_points"] + +transform/pos = Vector2( 312, 456 ) + +[node name="9" type="Position2D" parent="spawn_points"] + +transform/pos = Vector2( 696, 72 ) + +[node name="10" type="Position2D" parent="spawn_points"] + +transform/pos = Vector2( 504, 72 ) + +[node name="11" type="Position2D" parent="spawn_points"] + +transform/pos = Vector2( 936, 72 ) + +[node name="rocks" type="Node2D" parent="."] + +[node name="rock" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 120, 72 ) + +[node name="rock1" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 264, 168 ) + +[node name="rock2" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 264, 120 ) + +[node name="rock3" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 216, 72 ) + +[node name="rock4" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 264, 72 ) + +[node name="rock5" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 312, 72 ) + +[node name="rock6" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 552, 168 ) + +[node name="rock7" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 600, 168 ) + +[node name="rock8" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 552, 216 ) + +[node name="rock9" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 264, 312 ) + +[node name="rock10" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 120, 360 ) + +[node name="rock11" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 168, 360 ) + +[node name="rock12" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 216, 360 ) + +[node name="rock13" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 120, 264 ) + +[node name="rock14" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 168, 216 ) + +[node name="rock15" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 72, 360 ) + +[node name="rock16" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 72, 312 ) + +[node name="rock17" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 72, 264 ) + +[node name="rock18" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 360, 360 ) + +[node name="rock19" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 408, 360 ) + +[node name="rock20" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 504, 360 ) + +[node name="rock21" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 600, 360 ) + +[node name="rock22" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 648, 360 ) + +[node name="rock23" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 504, 456 ) + +[node name="rock24" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 552, 456 ) + +[node name="rock25" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 552, 408 ) + +[node name="rock26" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 360, 456 ) + +[node name="rock27" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 360, 504 ) + +[node name="rock28" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 264, 504 ) + +[node name="rock29" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 264, 552 ) + +[node name="rock30" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 168, 456 ) + +[node name="rock31" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 168, 504 ) + +[node name="rock32" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 72, 552 ) + +[node name="rock33" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 120, 552 ) + +[node name="rock34" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 504, 552 ) + +[node name="rock35" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 600, 552 ) + +[node name="rock36" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 648, 552 ) + +[node name="rock37" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 648, 504 ) + +[node name="rock38" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 456, 216 ) + +[node name="rock39" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 360, 216 ) + +[node name="rock40" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 360, 168 ) + +[node name="rock41" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 456, 120 ) + +[node name="rock42" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 456, 408 ) + +[node name="rock43" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 456, 456 ) + +[node name="rock44" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 456, 504 ) + +[node name="rock45" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 600, 264 ) + +[node name="rock46" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 600, 72 ) + +[node name="rock47" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 408, 72 ) + +[node name="rock48" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 792, 168 ) + +[node name="rock49" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 744, 168 ) + +[node name="rock50" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 744, 264 ) + +[node name="rock51" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 792, 264 ) + +[node name="rock52" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 744, 360 ) + +[node name="rock53" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 744, 408 ) + +[node name="rock54" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 792, 552 ) + +[node name="rock55" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 840, 552 ) + +[node name="rock56" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 840, 504 ) + +[node name="rock57" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 840, 312 ) + +[node name="rock58" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 840, 264 ) + +[node name="rock59" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 840, 216 ) + +[node name="rock60" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 840, 120 ) + +[node name="rock61" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 792, 72 ) + +[node name="rock62" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 840, 72 ) + +[node name="rock63" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 936, 216 ) + +[node name="rock64" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 936, 264 ) + +[node name="rock65" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 936, 408 ) + +[node name="rock66" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 888, 456 ) + +[node name="rock67" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 936, 456 ) + +[node name="rock68" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 792, 456 ) + +[node name="rock69" parent="rocks" instance=ExtResource( 2 )] + +transform/pos = Vector2( 840, 456 ) + +[node name="players" type="Node2D" parent="."] + +[node name="score" type="HBoxContainer" parent="."] + +focus/ignore_mouse = false +focus/stop_mouse = false +size_flags/horizontal = 2 +size_flags/vertical = 2 +margin/left = 0.0 +margin/top = 0.0 +margin/right = 1024.0 +margin/bottom = 40.0 +alignment = 0 +script/script = ExtResource( 3 ) + +[node name="winner" type="Label" parent="."] + +focus/ignore_mouse = true +focus/stop_mouse = true +size_flags/horizontal = 2 +size_flags/vertical = 0 +margin/left = 0.0 +margin/top = 0.0 +margin/right = 1031.0 +margin/bottom = 617.0 +custom_fonts/font = SubResource( 1 ) +custom_colors/font_color_shadow = Color( 0, 0, 0, 1 ) +custom_constants/shadow_offset_x = 2 +custom_constants/shadow_offset_y = 2 +custom_constants/shadow_as_outline = 1 +text = "THE WINNER IS:\nYOU" +align = 1 +valign = 1 +percent_visible = 1.0 +lines_skipped = 0 +max_lines_visible = -1 + +[node name="exit_game" type="Button" parent="winner"] + +process/pause_mode = 2 +focus/ignore_mouse = false +focus/stop_mouse = true +size_flags/horizontal = 2 +size_flags/vertical = 2 +margin/left = 384.0 +margin/top = 408.0 +margin/right = 649.0 +margin/bottom = 469.0 +custom_fonts/font = SubResource( 1 ) +toggle_mode = false +enabled_focus_mode = 2 +shortcut = null +text = "EXIT GAME" +flat = false + +[connection signal="pressed" from="winner/exit_game" to="score" method="_on_exit_game_pressed"] + + diff --git a/misc/udp_chat/chat.gd b/networking/udp_chat/chat.gd similarity index 100% rename from misc/udp_chat/chat.gd rename to networking/udp_chat/chat.gd diff --git a/misc/udp_chat/chat.scn b/networking/udp_chat/chat.scn similarity index 100% rename from misc/udp_chat/chat.scn rename to networking/udp_chat/chat.scn diff --git a/misc/udp_chat/engine.cfg b/networking/udp_chat/engine.cfg similarity index 100% rename from misc/udp_chat/engine.cfg rename to networking/udp_chat/engine.cfg diff --git a/misc/udp_chat/icon.png b/networking/udp_chat/icon.png similarity index 100% rename from misc/udp_chat/icon.png rename to networking/udp_chat/icon.png