From 4d949e3be118027619023b0ef74dc614a2fc1c15 Mon Sep 17 00:00:00 2001 From: Regalis Date: Tue, 10 Nov 2015 22:22:26 +0200 Subject: [PATCH] Spectating, fire, damaged limb sprites, water detector, engineer jumpsuit, new signal comp sprites, resharper cleanup (god knows what else, commit more often) --- Subsurface/Barotrauma.csproj | 23 ++ .../Content/Characters/Coelanth/coelanth.xml | 4 +- .../Content/Characters/Crawler/crawler.xml | 4 +- .../Content/Characters/Human/damagedhead.png | Bin 0 -> 1100 bytes .../Content/Characters/Human/damagedlegs.png | Bin 0 -> 4925 bytes .../Content/Characters/Human/damagedtorso.png | Bin 0 -> 3651 bytes Subsurface/Content/Characters/Human/human.xml | 19 +- .../Content/Characters/Mantis/mantis.xml | 4 +- .../Content/Characters/Moloch/moloch.xml | 4 +- .../Content/Characters/Scorpion/scorpion.xml | 4 +- .../TigerThresher/damagedtigerthresher.png | Bin 0 -> 91690 bytes .../TigerThresher/tigerthresher.xml | 13 +- Subsurface/Content/Items/Clothes/clothes.xml | 33 +- Subsurface/Content/Items/Clothes/engigear.png | Bin 0 -> 12890 bytes .../Content/Items/Electricity/signalcomp.png | Bin 0 -> 6828 bytes .../Content/Items/Electricity/signalitems.xml | 40 +- .../Content/Particles/ParticlePrefabs.xml | 33 ++ Subsurface/Content/Particles/fire.png | Bin 0 -> 24784 bytes .../Source/Characters/AI/EnemyAIController.cs | 29 +- Subsurface/Source/Characters/AI/PathFinder.cs | 2 +- .../Source/Characters/AnimController.cs | 2 +- .../BackgroundSpriteManager.cs | 4 +- Subsurface/Source/Characters/Character.cs | 35 +- Subsurface/Source/Characters/CharacterHUD.cs | 2 - Subsurface/Source/Characters/CharacterInfo.cs | 2 +- .../Source/Characters/FishAnimController.cs | 2 +- .../Characters/HumanoidAnimController.cs | 6 +- .../Source/Characters/Jobs/JobPrefab.cs | 2 +- Subsurface/Source/Characters/Limb.cs | 42 ++- Subsurface/Source/Characters/Ragdoll.cs | 6 +- Subsurface/Source/Characters/StatusEffect.cs | 8 +- Subsurface/Source/ContentPackage.cs | 2 - Subsurface/Source/DebugConsole.cs | 14 +- Subsurface/Source/EventInput/EventInput.cs | 2 +- Subsurface/Source/Events/Task.cs | 4 +- Subsurface/Source/GUI/GUITextBox.cs | 4 +- Subsurface/Source/GameSession/CargoManager.cs | 4 +- Subsurface/Source/GameSession/CrewManager.cs | 78 +++- .../Source/GameSession/GameModes/GameMode.cs | 5 + .../GameSession/GameModes/SinglePlayerMode.cs | 14 +- .../GameSession/GameModes/TutorialMode.cs | 3 +- Subsurface/Source/GameSession/GameSession.cs | 47 +-- Subsurface/Source/Items/Components/Door.cs | 2 +- .../Items/Components/Holdable/Holdable.cs | 4 +- .../Items/Components/Holdable/MeleeWeapon.cs | 4 +- .../Items/Components/Holdable/RepairTool.cs | 4 +- .../Items/Components/Holdable/Throwable.cs | 10 +- .../Source/Items/Components/ItemComponent.cs | 12 +- Subsurface/Source/Items/Components/Label.cs | 8 +- .../Components/Machines/OxygenGenerator.cs | 3 +- .../Source/Items/Components/Machines/Radar.cs | 5 +- .../Items/Components/Power/PowerTransfer.cs | 1 - .../Source/Items/Components/Projectile.cs | 2 +- .../Items/Components/Signal/Connection.cs | 10 +- .../Items/Components/Signal/WaterDetector.cs | 38 ++ .../Source/Items/Components/Signal/Wire.cs | 2 +- Subsurface/Source/Items/Inventory.cs | 6 +- Subsurface/Source/Items/Item.cs | 10 +- Subsurface/Source/Items/ItemPrefab.cs | 4 +- Subsurface/Source/Map/FireSource.cs | 186 ++++++++++ Subsurface/Source/Map/Gap.cs | 2 +- Subsurface/Source/Map/Hull.cs | 55 ++- Subsurface/Source/Map/Levels/Level.cs | 3 - .../Source/Map/Levels/VoronoiElements.cs | 4 - Subsurface/Source/Map/LocationType.cs | 2 +- Subsurface/Source/Map/MapEntity.cs | 2 +- Subsurface/Source/Map/WaterRenderer.cs | 2 +- Subsurface/Source/Map/WayPoint.cs | 4 +- Subsurface/Source/Networking/GameClient.cs | 29 +- Subsurface/Source/Networking/GameServer.cs | 341 ++++++------------ .../Source/Networking/GameServerSettings.cs | 2 +- Subsurface/Source/Networking/NetConfig.cs | 2 +- Subsurface/Source/Networking/NetworkMember.cs | 84 +---- Subsurface/Source/Particles/Particle.cs | 148 ++++---- .../Source/Particles/ParticleManager.cs | 20 +- Subsurface/Source/Particles/ParticlePrefab.cs | 13 +- Subsurface/Source/Physics/PhysicsBody.cs | 2 +- Subsurface/Source/PlayerInput.cs | 6 +- Subsurface/Source/Properties.cs | 2 +- Subsurface/Source/Screens/EditMapScreen.cs | 2 +- Subsurface/Source/Screens/GameScreen.cs | 13 +- Subsurface/Source/Screens/LobbyScreen.cs | 19 +- Subsurface/Source/Screens/NetLobbyScreen.cs | 18 +- Subsurface/Source/Screens/NetLobbyVoting.cs | 4 +- Subsurface/Source/Screens/ServerListScreen.cs | 2 +- Subsurface/Source/Sounds/SoundPlayer.cs | 2 +- Subsurface/Source/Utils/MathUtils.cs | 4 + Subsurface/Source/Utils/ToolBox.cs | 1 - Subsurface_Solution.v12.suo | Bin 737280 -> 744960 bytes 89 files changed, 977 insertions(+), 622 deletions(-) create mode 100644 Subsurface/Content/Characters/Human/damagedhead.png create mode 100644 Subsurface/Content/Characters/Human/damagedlegs.png create mode 100644 Subsurface/Content/Characters/Human/damagedtorso.png create mode 100644 Subsurface/Content/Characters/TigerThresher/damagedtigerthresher.png create mode 100644 Subsurface/Content/Items/Clothes/engigear.png create mode 100644 Subsurface/Content/Items/Electricity/signalcomp.png create mode 100644 Subsurface/Content/Particles/fire.png create mode 100644 Subsurface/Source/Items/Components/Signal/WaterDetector.cs create mode 100644 Subsurface/Source/Map/FireSource.cs diff --git a/Subsurface/Barotrauma.csproj b/Subsurface/Barotrauma.csproj index 95e215df9..370f034f5 100644 --- a/Subsurface/Barotrauma.csproj +++ b/Subsurface/Barotrauma.csproj @@ -91,11 +91,13 @@ + + @@ -288,6 +290,15 @@ Designer PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -333,6 +344,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -348,12 +362,18 @@ PreserveNewest + + PreserveNewest + PreserveNewest PreserveNewest + + PreserveNewest + PreserveNewest @@ -552,6 +572,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/Subsurface/Content/Characters/Coelanth/coelanth.xml b/Subsurface/Content/Characters/Coelanth/coelanth.xml index 0de557050..1f9407652 100644 --- a/Subsurface/Content/Characters/Coelanth/coelanth.xml +++ b/Subsurface/Content/Characters/Coelanth/coelanth.xml @@ -1,5 +1,5 @@  - + @@ -55,4 +55,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/Subsurface/Content/Characters/Crawler/crawler.xml b/Subsurface/Content/Characters/Crawler/crawler.xml index 7d2b58e22..da7669615 100644 --- a/Subsurface/Content/Characters/Crawler/crawler.xml +++ b/Subsurface/Content/Characters/Crawler/crawler.xml @@ -1,5 +1,5 @@  - + @@ -77,5 +77,5 @@ - + diff --git a/Subsurface/Content/Characters/Human/damagedhead.png b/Subsurface/Content/Characters/Human/damagedhead.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f0c83a8edc95b1b1bafb801cd1909d58e8b42b GIT binary patch literal 1100 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 VJXA(E=}rIu002ovPDHLkV1hip(;5H( literal 0 HcmV?d00001 diff --git a/Subsurface/Content/Characters/Human/human.xml b/Subsurface/Content/Characters/Human/human.xml index 1494045b1..b94ee1a85 100644 --- a/Subsurface/Content/Characters/Human/human.xml +++ b/Subsurface/Content/Characters/Human/human.xml @@ -1,5 +1,5 @@  - + @@ -13,53 +13,66 @@ + + + + + + + + + + + + - + + @@ -88,5 +101,5 @@ - + diff --git a/Subsurface/Content/Characters/Mantis/mantis.xml b/Subsurface/Content/Characters/Mantis/mantis.xml index 1d1502524..e8657ac5b 100644 --- a/Subsurface/Content/Characters/Mantis/mantis.xml +++ b/Subsurface/Content/Characters/Mantis/mantis.xml @@ -1,5 +1,5 @@  - + @@ -88,5 +88,5 @@ - + diff --git a/Subsurface/Content/Characters/Moloch/moloch.xml b/Subsurface/Content/Characters/Moloch/moloch.xml index 18d51ad96..aa257707d 100644 --- a/Subsurface/Content/Characters/Moloch/moloch.xml +++ b/Subsurface/Content/Characters/Moloch/moloch.xml @@ -1,5 +1,5 @@  - + @@ -59,4 +59,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/Subsurface/Content/Characters/Scorpion/scorpion.xml b/Subsurface/Content/Characters/Scorpion/scorpion.xml index f6b2ebf02..3629067c0 100644 --- a/Subsurface/Content/Characters/Scorpion/scorpion.xml +++ b/Subsurface/Content/Characters/Scorpion/scorpion.xml @@ -1,5 +1,5 @@  - + @@ -44,5 +44,5 @@ - + diff --git a/Subsurface/Content/Characters/TigerThresher/damagedtigerthresher.png b/Subsurface/Content/Characters/TigerThresher/damagedtigerthresher.png new file mode 100644 index 0000000000000000000000000000000000000000..3e2fd7e63f227f28272db660cb280762347ca43a GIT binary patch literal 91690 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�r1XCbCL8hqOj3fgFd%fy!zJzX@$Z*0vfrZ? z);+LA{`2vO4%2+qv%<40=R0suh_2rFE~`~70Y@*vyZ5`-7! zL&rw%;2{Qyopj+~!IwyO_k1_uz2 z$Ki$!3VsoO;3ITgc&=+e!!Se`gh<7c030Md7j76LKnRnL86uTPAqX5K!#uLZA_~3_ z&vB86#Sl6UvV{U1*Fn-r01n{5f$KPM;J|SlBoj$whl>aTA8y=3y0QX8J^hHsUE~Tr ziU<&MeAL&~g@wVPTy@@WUj+YHjT81KUB^clUJwazvs$S!Zczo3AR?`Z7Q-Yp^ulIT z9fnEM-$}-hZqZ4YQ4J@Qf;*zFBNkqUpOtvpg|hKdChQbr(o^LW10R~3qhA_z?b;^pq5WS406v{v58f>L- z$Srtj<0_b-c}G(x?392UM#saXW-DLf^`)f87ZuDlSw%1#4JAaN!>F>8gqU)Wq+do+ zR-sH!%{v0)t$ol%p*KWsiG#i&pgM5i#DZWTpDiHpeT04yxp*9l*DOcR;p2!00Rn`` zhCmV_>eC6hZXCIM2H9K@2twpD!w7?-=^q!1A+}@@{J|`W{e8$5^6r`8<-b zBplB{5I6{65;~F|6F|byWKsqNq?1X+f&j&kz0Vv6VHm;%5QZjx=D`2IGS1c`<@rr66J<(f5L zK}9}U#a*srOY{gYb1~op!_^M%s&VnPOJc#d5(x5s5MVf;M`KkL8Y|=2a_J>-T;t+7 zj@iIMAwW;}8RRk<__-|d#XJgy0{VxC5sN1f^Wvxp6Yw)b$Q1HMQ20go`5cmoBx0U} z#Y^fDdLca5AyI^gIU%z7Ec!EpKoDY4Du!e{j$|^9WFmoNJb}39q9Rp+bUcX=4t(E7 z!t)S!V?Y=n=DA2F5{Sh;^k;@KoEb(wGmKPNK7Mq! zySzyk5%>M$oZE3bC(CqqRdty-pHFsmWkqI2M%;Uz^Bik2Mp}q;MTNM69jt_AxFZb4 zLX9`FLh5gq3aB|issisphJUU?0?MI++K9T)-lYnAo3gf0LGjy>?6gTF5#m2osk=B_ z1<8c$S?;bkWnc-CGCiW#r&GavM6ZikpaSOQAa)unxTx25BUugF4zdDdn%0Mkw&x8Xky*u zgPf@?B2a4}H9bcVpL-E$Tzmu4Ddce^<8eI_JKL$p-KdW{RAKx-B&C17Dv{#~g4ZLR zt^)-!cwQ5azq46nUpJza$& zCTWl+G4)!Vc(O*^h%q+BHk-t0O0ig=QYsNf1qx9_Au6zb%SL*;Itj1@Hl+|r)?~3% zrW6$f+>%%tGXtcSLJ&|40y-jt2@H{e(=jwHlnaHV9ERfs>{y7Mh+wiT*D{Z%U4YDo z>n=swH;t>3s3}|9tAMpd|9>l4qK8G&)4vtTZ2S!*JMGO#;>nwkxLd5R+onq8h{tA@ zD^v3oa;i+?QsDi1{R+8NHz(p)#}h3IeZ>2Ff=rn3mG_dExIW8i0siP6zXzrdW(^OR zZq{QTLK=*N#L^tIoeC6t$O_g+k@#iSb|z1E7dbW>MAuBljUDAMXv7^9 zo{Ngt9BG;jNo0(*0h6^ll~S275g41yY-mqzSe0Q5tbV*Q#E+t2L^rWzCwkOiWf;wRsbR zCytSfPf%;rC)U`OEtgNDcPm#Gpp}K{xQR}!+|k!!D3fJ&M2BiFUm&CcT1*WZTrYFk{uYj znD>t%Se4uZ2C04v^u~YYC zxdjj(Qg6&uEX`f_vbrE`6`F^jbO63-6ly~-(w~y46<#d@xO#sj(IkOEYeeqzNVnvDQ*=)S0YJ(rnhLHJjAqIzhoOIx@ykbpirI5E;Tk zf$I1Klap1#Fr=O&G~$FfO{tViM8%>2U=T{2EQkmu#yNF#KN~i0mS&jcBHfivNl+<9 z*vNn}RJu9{qY!HiN!%n&W6H$}#X>0#(licfG}o?OJyHpS;Yjv$9#30jOs%PpJCV50 z&*}np9T^7nhJ7cJ2y#8}4R4XVApRw~d4^Phhw65`M%jsTTa2@EGXK^h2{(uJdfcT3 z#AN@jKAXqXW(RCq$X@c?WD^Q#U8p;o>5HygV@DfwJ)T^KjJaKjL+F9q^+@HET`%lP#TQ{YHaj1u~`B&B9U+wb|^O6>y~ngp@=253D!WhS;uN^n*nN#CKFX!!<69@M`hm(B1Un1ITpQ!IfauXd=vdbUbJ$B8ZAX2(@ONIJE?ZGoS{BG*0NKbP%N}AcfGCo(|H~5(S2|-XKXW zNi)V6gA57~P^%>|aT;SS6pAGpVStTOLStyuo00)(Q^so(V4zTv%t=y95QKzbfpTau zfgx!mHYEvY+VRvhhYQx$$l_`FUOqqknHQ!OC~!SRHqg?!FfP}H{}KKB1HgX<-l#6f z`+;v(MSUOA1o>%I;6JKB_-TFrzgDFbu>yJ?YD3=Ls!R;hzwq@)f6W8=dOl~VtMTQO z>L6#&Q=3WLF)3%)6)kok^W$oE8uqypadV%T2AG_odO)w;=XK9>4%e^U`<_lE#PBW7 zgJa<#17p_EG%#l1sZJa3*_^~jM{MC>5=0ZLiafv7+RFz>E;*8#D=6wyc%k|d=N1jIHaDikF3KTesfP0~@UK%kMHG$C#@Y+$V|1g07qMop4Vgn{*4 zkIMqoyc%2M?U(sX?6Y&t)bPGQpkQ-?EQ{(!q*(f9RU)T6MRL8mFpeSpD|u_EU4e0zuH8YVNt#$HZpSur)goOx zE&;}6Ebe3Ku03u%O~X5;flM+;rZ|418mkjz^_DKdq+J30r0S1Eul?T`*b_+ZMWxqp z)I$A)C8;LO!L>>A%bVemPD2Uk9t@((50#^v_SooU2kXtPsliMnh9n4C-P6tHZI^N4 z@G%-`OlKI8#7&xMlgYs*#V91Mr&wdOyT4>BlGI2nRLUJxibck&lhhk^3SmT8ERv*6 zs&P!5#6*RF)LN3%vU<~IMotf6tK%f8C5#FL*4oG>X?GBwEZX=)2or&P-z5)d-u%Kq zb+lV!3)Xojn!^oa`*-yvswi$i(#{_yi&Kmt2_HXz^nUz+f>of$UZ)^v>> z()Zn{`H`hy9nX`+Gp-9|uY&soFqy~G&P&G0y4Os1Ok*bY=73@`Cy7jPZmF)TOLSfJ zd*6FH_u(3EAHoYWB}0$(cB!Z3tw=oh6TpX&kb(oYbx7RZys1QW#317D90x z8jq!fDU>EGx2!Wfy$*&-hT4Q>?L->WVdF-R;nh1!V8Av~s$-SHP|(@A<@lk4CQU3s zSR^SWl#L;-)-Xv-&Bhokr9z1yFicb@NzxRgu1vc77ektH6D$-91(L*4Z#J;jV$+0X zBN0trud%vg0|U*vFf?mvrU@NUfl3rryF)u%fx)8e<0a{O^h-rr>V>VxJPoiAaes># zK67sUZbE9!u0Y~oMI^~#4dNTW3>gmEt()k$TFcuM5HAIOUEPm6mBqQmeu-{?4Y~kukO_U ze_TB+F9LoA=`{3KWpP&_ZSXGlK6@XM`TR%v=x`vJz^QTAJOCRfp%xnsHQ{g-jvcU! zPr~6Co*RQB^?;sc2ysBNs$jo#j~)HpyM_+^pRM)kqaidfmO>a%t=DPBP3rX;)rkp= z35m*`)Z>^&l8{&h&qt|lh6pDGa?v~|n9j+ytL@?9$4}rHJ8OiPb)=*YG!R>Ww#JaY3mm&?$we}LoAHiS_0j$JGzNeBHdFn~syH4t#?VnI5fzG< zAfS$AuwG~Vs!nNlVj;m0Cn?Q(gJ!LUNmC*N*p#?YC$ibF!!QUbL`5ovBE=x0SS-mX z9AhX3hQJtWle7?G8xeN0WT;2jMc?nSe^=iN+VS=8>Wlh!_4Vj|b(30dMB2+;t@raP z)%gVlyteN(N5Gaw^YErF#SEZaU;aAazbe=bs9U0l z3SIf~VFQs!yg|XAKWFpesn@CtuVUefG}4 zeCWBZRWCca>C#s`^8BGo!(y2=t128D9A`2Out7k zm7zG+8p_2Il~RXv@Hdt;PU$RGXxfx8X_6)>Q5Yp5wi#fXVPG05Mkbjq5!YkO?8Y87 zLiXu;S&igPyiRp_0DM^ulv6<5zpHO#9`??e8GZ9nd>td1Q(yBG?lbzF0ltEyvig4D0?o)?@=Fnsx;QsXnh9wpuR3fCO$8>E)MM!W)(@6 ziS&9LR|}{|nQSf>wq~btwfUKT%l#U(W_QlE0R0SJDl_w$-3g>6)?KRHCXfV^QN8B> zSNA#k+=O}{J`8-x1Iwbv*v9qwn~|ySC&-d{y49O;v+fTIG!saNAlzqZHejL*jiO=f zm}RYj^rRTq#bTq@e|J!O;zV=o_D4ed&ckt992prmDTWk7(*y*@lGJPTbW{LoY8(X- zCI~5)$|M007)YhV$wa+IoW!KY>F>Z+N?}61nwlW3hhb2|raq|IMW}~N8{^1&hGDAr zBvRvJuj=Om>QQs|HB}|2kd@PA%Ub`@v0<4IdkdfAEB0mC&hF6cGgtI8v0W%a(C%j=3>yNa@f z)4Xs7*h(2jTV(2ipHs;i{dvlB39cf`7ZX(E@@U?>%eG~?J#Hfv^8M7YqUOO6-hn-9t|IIFd00d`NZn znEqZw@*h&NM8Kl5_SzikuXzJC2R4yfP!&D#f`Z-G^!Z;<(EE};|5CjG52+jBXOWD_ zlVmfix^*#sJMbx_FdHPRW?8!6bkP)$INJ9kqk4`baiIIv6`8vp&z}KXU7yF*u$oTX ztiOh5P%Swxf%n~wcMZ;miC%*wm;4=BmymXB&N1OojfQbuyVoM^vMxgs$R0)FF}u`= zb8+_{M>46O)W4zLoiftEq2aN)87=%cigKWgmu$H1V zY)s+c5DcdQ&nA{q7xBQYLA)<16z%hA?Ya}E8*2k#yjH^mh9HP&CJmxe36rMS$dEJ= ztOXOulB6c7_wvSI*-A;7L_;_KN04l=8j$84`p=!Ec|V;|SDOW( zZAP-WO3UH<>)x4Z{}*YWwqI1G^l=Zox_Du$E&uwtnA>Uvsb5jRdNWeT_AAIR;8UtQ znn(wtP09+p6v$o-{Qs2Ut)!p@{NVlR#Rag9ozSlhps<$PurVdv%;fe$v zNey2}4W}Bg=_I_aBjA4(1O6-u_}J!%KUq)X)7LQh=uPRw@VdCs2%<1)#wpE4gVY2J z4-POeG(xprr=B#h#$bYwO1X00#%GBcd=qOUr1-3<%fV1Sj z%>%N-NKpEu0@-GyZsl1;an}L-RwN*NM6G~_fk#xiJ61SXXulZ6_2)Z+#1bO~cW3o1 zTb8;&5~{N7)s1;rJqBSL*W(7H&g#HYc1yM>kJ%*0w8};`Hm_H=;sotyr}@9Twpup= zzlek$9!BOYemjx@xf;oAb}`IhB(@f-lKgihbNU9oPrKC^3B7ySXaUixGQr!FO@yjP z?$do#1P-V2`2p~C3`q<(48V65;Ncj`N5NEKMhH|7+j}kqHwoZ=<05Rf$)Zs_XGQ&beKj?K0q(kre$uM#^&hVWQK? zdL-;{rFvt23(2571$-81wdHzGzDrs01IQ$gm#N|LIi!Z|HU+qfo|CJKy$*@tI|I6= z26Rnz%tzFf86s`@9@29=2KIXR-=p^TJbeIEE#B%6Jc8WUv?fKc5%7rlF}M{pYR6;m72 zg=!Vxj;KF;RFy;Mxhy&rz}D)*a}AK+2z;-yvVD3%en1!WC&_}0%Xy|+O4hJB)@x-I z%xYwl!*epPAlEqq-)1-o^fwo1+O5G)soJf$$(B#}FiV1J0j)xH~XhmXwSwWrk6 zvQdHRC=yrOh$KH16o{@*OFg2;hVy%nnErPCtf8i1O%q;Ov#ha(8!>c@TI?Z9v5GaDZ2i+OE$~+- z!_pPcrO_?VC+Ss(<8)i2*$A7(5}m~gg@R@M>fY3j48-Lmo+uZBQ&F4@70p?LK^LPD zWLvkkB4A9#Um)Pa@gs-=Rjw2b5{I^&HHBfp`XVqj^vg6P|@vRtxJiS-Nki zK-c44l=b?5r!;QTi*b#j{0;j29tF(R9x|U``Hr7)tktS(<}x)3`W4WU-1T^VY^8r! zpL6T}4OwI3s^^ld&LQJjtde*xpwQd5UDGhHXLKL0(|vb<*>&d+6(oK~0Wcv;%TIKl z59oFOyeh>BRgkL`NT1MSKZhipyNgai8@_0fVAFoUZKs(y4^fH)ZIA= zyjI!cu%pOddn(iid%kCYQ|h{_)+9_4#0GMggls-3%wlrr@s8McYu<;gw{w!3w(gMpeNa zL%RAuqE^$B>W-`-1)OzVe5W-dXE`c&7pRSp_@v9yE0Pyo&y`Z2^Z?8$^}!YL{cQ_N zbHG-d<~2_s1-8GVYxCpGoH^>`rAUjczd({W5;ai2M-|{dAW0sly>q$GGnhB1Uif=u zTL}`H7*sdq?MUZ}RSIyQQ$`0_fpE7P$L{+U6sV8ud;b?TqQ8P9t91kaVIi<^Du6FU zhQS&H&snxc(6QQZ>~PAftmV>c13uDiV1JUn3Y*@(EuymBCP`qDuMLmH)i^2?NWb}rGBs!Qxes|g@KIfi zYsoSk3rH5z&#JZjn@C%g^=d&KL453okf88{Zk}Vx-fq`L_$XkOv2u5VReP1`?$;Yv z%<*VWmHJ9#szDo2bLsa}f%*;wp$CwTKQ1mc+r*j83TzJ`v8<|kAZ|sv2E9fN*B%AA zV`{iol?_D73a=xZBY0SUmX)QgQ~mN^)fhgZ`)0N7n*$1XF7)vxWqPAzHM1_m)wxtV z)ex_y5H#RzP0?kyMevUXPS*|l3b1#~aAdWi-VAsqwd_kR*9I`wWs*nMn(Dz~T0L0~ zf`g$APBe}6r$E>xq?4*1YpanBh5iCr=coqodrDZ=>M^k^1DJ=b?RjTvD3khq1**#w zj11xjcayCQ0+wUX&*<}2 zB(8p?g48|*!5ff7A2&#MGZIJphO)hqvWcgW_}kYNG*e|1A5q}@l(IS(SG@rlSo*7~ zYr25fT5->=Zo-|T&@^zeWO#1W5lTF0E z7O7?UO?3<0r;KbsAH!tvwI4;=>y(wveMxC;x3a#k=|VoZ+%0Vlq`Fv-dyMDxX*rR$XhSsboc4ch;% zO7rIxf$2^?$0MqHLOsvlQ6qgD z@KOuUSa@y(CMTejz;_1Fe?`Ct#w{N&Log0&CM-8rEjz~H$SRmzZ#XmUdWnsj@q0ho zo%i-N`gip;)Npt?lDOl@$!CDSRFdOjxO4qo7bN>}SbsjJ)=?dar@11%&w1{HBH5JN z)w*c@O)aGUknW#A@h4jtE?dkp??wvdkqsk%F>n+ptZ6#-`LY3(c^lp%BrvaL0NX)f#E!b zi_UZunGaBFs!JeHAX=wCAJE0|pi=tB)B+22(S5U8KA%)zbB!|hAju-mf-LCstAV-} zA1_N_^Q@sr6~=&G%N)=a&X}k$`$UMP#QxE>^c7_!E(v2M7o;z(Y5X@LSOJ!jiC}lbB`r1 z{`B(ETdJ#4)z$m-I!uyHQ?c#9a4CSA>!lYVO-uU~gj~P3nl6;9lxexFm;kYGsz_>Y zRX4|GB-3f5T2)`u#eI)1#!leL{#||bo%i-F=lD{SEPKncyle9=mK57Ck@02fdi3|} zknXFJvXchq-!Wwm5^gv;1u(8r9pF0l`>xKSg3|9QAihWS!XaJ%uRyY)w<#e0iN5AC zqy*^I$_RFnB~lqA2_;ZnbEO*BJCxZyrsq-dzY(U zmeWDcA{sz^==bZ1U9Euj??^>@Ni83jZhbeBE%`ciMHCj>^ymIvXF9=O(3DrTY^+*5 zC1yF1IhS*mV5NM~mi~{4GPY5&cvdUe_bMRyYp=_5KROn6Lig-}DM0Nq1&b3348@ku z`8EZV8+HGe^=BuNE&Vp#`}ZJ4+ppGh`$c{J8nQ$x2Ws8=w>Np8c_re`ucQY0wqCnMyB(WV;=60!G1EYrc*Oh^GD#NQG{cOJi{Hp?@D_(bv zdeO-RQC1&S=~yc@7bXXZj40~(4S-GSW!T0kktVu&jTJ(?)YyjV-=k zr@H8*g7e*~lRm7ky-ly(zvz3ORG^zshW1h{ZWuwv%v6vr{jPrOs9N}Y$hwN4K=2eYB_Z_gSB0$iVCM|qBSpFr zJ*hzGCIh(skC&(}c~05qHDt{XTtdjFm4&@n+1(~Jv~NP1MYxXiu7SJLXC+V3M=Zmb zxTmZ9N!TvFwh-UdF*O^_b$FK$pvWfI9A+ONR31M#K5R~OG4)Z+R_#5W%z zzU?RUy}qjN)u}FtR9zTufa7vnEY58b=(RYZ8^4wV+MHcqL)J7pVEOhDoefKCy*A_O zarrsjZ=d4qV(Ozvr+$|L?=lD*x?kJH=bX}a@w?9{sJO`!PpV7rS+e@K1Hf+}?YXW| z))aa_L(lbST9}$2lm1Nw)ZKVpLR6=?p0s6eudPGE9Y3cYq9@2Yl2n!HozUN#WPK!E zpG(*O_DkY23HWIw!)Tp;i7z9GCMQ{bHAR71l&M<9E_RR?UeArhWSuqKb*}n` z(F%@T7Coi^Vb7J+y3hUW#Vu;cj<-2B^xiY^ejipqc)2pCeg&CEiwnzj_1}&(N&gXL zZXeXYe@2bmb_qXwkE=OQ%DadyEX(RB&0vq5qn2#?<7V{~pCF4@jzfBj`FRANr ztuCs=YB{CK*q%Xr(BGo~)~)PrqaIUGuv?>+)E3W0u-x2ZJ^H)n{=tjE^9Jg;fY6}5hE*G2d~B*6M&wag~; zF`}TfLl+oi{(0wruB)~55>kDHlW*ITOB z_6S)K?y{Gi_s-ZYJ(&Wa!fBMV&%%6Jqx<_(vYIed5A0Q@Gohe&NMG;55-%ciRo;rU z(7P6yk>-ZB7F9PqiX^kVPXTWNaT$I<4d*xO=kG&e@((KWa!kFbK;`6RNGZU($p(u4 zGSZ@}TUpxskh;5GeeEx*&RT=S+I|p8ifOWh`aE6;sCet+VaM9$+d%ZXvdn8t&FZ51 zj4F*D#J~C?wUGXXtfRngT_k0-hFps9Q)oOPqm~Gc;jEJ<5c7+W>tygGZ#DQBYO4T%t^@;T`*@3M%W!nlTg=2;Plk z6YkOXcurs6q0FbD_bo-z^aEvGS1NcNKoU6q0tt0|U7vH^`nwgl9x(9xMn2eK{%yy7gDq4y72#R-BhnqtEi;FbwmO2TNKP<-He6h z;+|6Vh5xxsaW_g8yu7csYEifL#ek)+s5o$uwxLm6*==rQwkgbws`?)y(m3sY} zNX-8<3zrSJ&}%7F0#C3T}bbTolp0po43=cfOSl%{=Xq<`W3whZ$tdj+jIdx zh%{JDkmBui`nvsU4SgI5$o{f!1Xn=WOIFXdT-=YYm~o8)eSo-F^R6OuCx#W&O{B$e zYR9e)BN>Se#MNJ&f|(^P)_E&4^IMFSbuT+vuls$6zR$Brvc{0-_WOP$3^Cv_y-)#S zTtOv4((tz{klmziNN21Eo=!OKjO7ppi_jCo8Z7TNmhbO`^-as0ik8in8U}kTn+8&T zxBxrW8oDi9Hw3>@g`X~DZMIhHb-I$QQS&xsnLmouy$va-cIji;#l$^bHLjke*z?Xs z3;msgc~leyz42Ee$sU_^5j>~vfM?a>`cb52tygdUexx%00ky=A>HED+tpLahJKa?1 zZrv!|>Yg*pMA>$#GI)(X*NMarD>)X;sqwWUvq`-!5J?MIjeF0Hx44(uNn;xKWJ4KB zRdvC3B$47@kq+)X`nOZwXSo>KTJM}(2I3Q{IIHUZ`%R?y`%1C~x_FAz&HE}CI9!Cm zbjW!+{&?^?r#jm8XZgzmCsOJeyJEN{i~@&x{~kycti z41BMC=G&37gTK|so79u!rVO}8X}JNLmmJv8d(h<>5)0Pp$;H*?3)EcT)h+T%kPN;L zBdO^J)FQlES==`i-M5gX$9AaeU^5bj+o+b^E&3kT`>cZJnp`ecw_g}MO4cu~N>*2u z%lxsImGpfBeYkqFN*h*IYy)b}1(~#AaIK*C7?Q}*p)R<(8m&p2_beh=h^LS&#dnew zHW!tZ-HT+bZb00Kzm0@0*0zAgAW$~Y8^Eg7FkXhVUf$bq&8^Wpptbt7i zdJP2nFzO005d_^3?lc720b|KCw3Y@DcqF5EvG&w_CW@4GgOm|p_y0qD&Aw0G1zE?C znAs_$OZT-3a#!o(epK09tdB1sskxEoju=#cTrSybsalx#d)8~9izMye)t8T+xj^8` zXVRUy1}WJ{m*y0E$gfAk13p)5JsV(akR^W&^TMH{PL7i$8Qg=!%Rb?~k83<^T9oM< z)%f+L2m~Pv6~V-CRn4+Fwd_nSZ|Jc+A7R2F8*KY3oj-ge>e|}VyC!PZ2NLO4ey(1Q{G^mx1E7K+?afuimn7R=gt4S=rouf3E|? z)e2N!qy6X^H@EEV`uCGaE$MwotlM`}I#$)I%*n4ia|s^<3SP}N;P++q+FXUC&!12) z%oZd@^^h9Cn>oA3;|5+>%emUXB?Ty1%gq6dc7yFUX7I2Lo;hTro9xDo8&3@l2erut zrL;!<rkyH`ig#2qg>X3ds682d^s_<0?=w-V2 zE>+jVxGubZ(u)v!E`&&}w{AUly}sXiWERnof*wc)hG>b=oVe*A6Kw?sk$ltQ7_y}^}TK) zE8rgTS=u54w1WP>dA{IAHhsCQ-_f}q^R)h4=0aRdx^*~c2)q(09{vj?l|DhTlU=us zhmew;(`4=N9^>q;{OwrZNE;WSulzby7ra$L%zgIb`Wa(L2KD!mC730&6onfwSR&x< zRZH)Yl+nuqo;_fTHy>+odt}0*B_WQRbc7MsghYWMZq`XGjGj8ljty%W9v-0-Rv2lF zR~}7+;<{4zo$J>1-hS%D>7Z2-yj@9DEk%>}8t&5*Sb3sv{7Q!;YaJiUeRhYSQp^8lcjb# z=5Z5}vO9znSQgX;(t)Jx{{_-AtA?cfA5_=JOY~URZDW{h=-{I0w$YM(>Ath=-_>Vk zdwyQr$8|ODR&cBDytgk;6v<_-joWqx;p>pt^&nEX>8oGeJ1}{eZpb_=uT5!U$fM|o)%tzGAONWq-hD; zgft-tLP85sR3tTq&_JzLBMA&6g9Fq?$B6<%U_vIX4F?*@seY61z{)DN_6gs#X{#@ zHd#y-A8eir;I?EHrFt!U(Ozl`WdSW>Yq6~nkjpts%Gm=_JISV6e@dVGY#VTDkWHr^ zRTp8{hIO^dbf6b{kAG5ddrm*&7P4@|Dm8{()ATb&q_G*g84H0v!j#U5gwA7WVyjVX zDnUeyB>+lcNEn3#QHcOUJ#K)pgf^fyHcq29P7p;DqKG7kF<1&DjMS>wIA(Ln&`fGX zCL#$^($t=@63%RRV+x@$9oE>6*iytS-9E0Kes_A#5tTzoMr-Qb&jdJUWBxp4USn!* zvseYAaU{{B8;ObSL|R|PNV@(F>c$w*=T7Oy8dqyEM3P3jy!URXHE@7zPTOJuHS5vx z(7WL0$|6g;frs_`4eJ8Q!7K-}Ia5$T>=pEHN7_?$Arqc|ju)owJD1^Iy1oyRC5CKJ zkaHPuI~4FLs`T2q9TRV_B+3Byc}DRT_56fLZ2n!k_njNFY#_vH`n=5mEwqrNm=iG^ zO`vL1Qwm}z6o_jvCqW#UG@yO_Z>a%WldRNeHxh3(N?_LNT6$Ey zR11~;Xy&`4h;u2v3+WJWms(q81-7@Sn_)ZBHRK^A^XXMc{Oq+zD*u%VZf+Ae|NjZy zC<8!a5yhDtsJVwfT=85aCK~}Cc<-GnV-L(0r~~+NHWVVH2)YBQ3Hw20LdJiY#(mfT zKBN!lKHP*f8h(#@SjtGEN2l(4SAguScvocY7~V#Gobmvzs35r?31tkbq5Mug=feg* z7+C&3fLdU&fyG7^YZKUAhbQZBB!#Ngsh>&0WV1=BT)_k(6SW47Mw5}T36f@l4MJ*h zgR$y3)~19($V7FL#9GC8Q( z?!`U&p045QlX&s8MR?y658#6HxHo0ao)NbWnCRctx1#$$YAU*MLkV-XcEM6a8YIMs z%YPWDB^znkSH0d|b4eg;$U5Z@BlToIMV8KgOy6gRu3vwmb?6ycd+q{NXIyn7QI#TSaqz14GYzXJz9WkV7xEyQ*P&OxE0BQ{Hy}k zsunB8S#YjSW=O3ygQWGJCL7DLn5enmQ*h)w&M)<-y^|{W=o#Ni%w=xGC1-2~zNqfR zD|Ju$@h-O?t1X6``+E(EpI3EHKJBqMmnB(MAnVk<>=;{!)X3eYOtFF#T|cM*cSJ3J zfWK5Qy$BcIQ|EO=V_*QyvClDVQcGmZ%eQSy#xhVPRpStPIIy zl{kq-X$6MFTFM0|hb1oAb{Tv39i~26r5HwpQGsTf&`eXB%?8F;*|1jHi===}Qxm5q zv;>g`p_a?q4UiB?>fPrqT}vmGaJb0?cA<>W`EDs?reSb?o2w3_2IUc*aA`XP)fg{8H1L*{bc(m-7JZu;}5fdAtxYz4BN zNOs%nIXiXUvAKq_xN&7#4|re|BC+p=_jyiSC;v_b)psLhI{^}(yH>$$6%to>rXMx@bE-&ktb7R1K+Bh|y||1bar|G?JJUOBjZf z3MIm*L_Lm)>rKWcYwX^=j{xYZbP|Rkq$!O!X1r0OktWzQB?>I1D05R8z*-w5mP*~) zO1cDx{rVZ*-YmXEnOGTVtl{pbYeIce3CNi)NXy0j=;BIt3b0E(1{Zp-b3dzU4fw(2 z&nl?ZSlly;&SWs|yti-G=h&jCU18&-=W|@hB4F|DV;$;Y)Y&uH5qNh1SZ64 zihrR{z*>kpN;GYg(eWk)V?dKc!Z4sx>>!O3jI|gmnUt}Gl7&Pcfq}$Yti`03Leo-? z4PnXC4J>lz=IYYCZv4J}YmzlzciyDd+QeW1Gq&w~Gqsd#41o_mwq+wscT)?VMNlJ~ zlKT)6Q>!h~Mc{(mVXLJx%lB}l06rLYvW%vC=dyT!P50>MbbqyW+8;%lh(Co4>8!T# zqU=CA)2~yHOVb0d2lb}|y^6>7Hmdg}QLoF_kp!`yLlQ$irhoeubxm$ZVl@$v82Dn@ z@QY*CUNT1GhBCD^Yl4IuD`x!8vKhR)BN)29h%LwB=81uNYB_rJ7`56Y##-uWfF+=j zCd3#_p-3Z%sWs|092*+nlGFySFPi$*MMe!K#XvENsMRN_Ck<>G<7a+Mq%fYUVzXyZ z%Op^YjVZ^*ge<-6$5!u}8|v)X`ty2U-H4qvdS4w5ECf5X3&GS9Wf;R`e)ci7$~Me` zE&8<(ZjfOe_$DOn*L5CQY)s8~iXpv#_wXlqhpgZ+DY-0&(yDq!q%+96biaO7U5aCE zn4C++ckS**TUZ+&m^IYJSyQ0%U7252<@j?*(%62abI8p|@7Tkf9dl2C(PD5E!`=by$85Ky&5ZqdT$rLk^SYlhZ&BUY@LoKyo2ap)c>VRYuwNsrzG8hz+ zE(>8H;Ajw1t6O_zPnuRH6X>s|1``-;N}8rbE`DY+t?#?25{pT!EyV=oCTWqSo6_&} z(Zm#g-;Bg#4SB3@ztxip|SUzzWe{#ZA`Y5mzmW+*+}W@8xICzB*CtZkcG05_?X zXV1m8w}1*F(eHb{?on41+awzW56h%sb1sWR+PH&8z5m~gr0Bm!*Yjb#P7y7j)&qPS za0ikgQf*;mp(?x(2_3lZB-NI^zE|Ch{~t2dx`<>`UaGHijA0ZwVBw1~G^}A`3hPos zB{i7TVB&yMBVctiAczA@9AHWjY%Ian5@vhJ20Kb=aDBzv>nqmYRKZ?avP5ZPeS>66 z9B?uU_;eER?3iI))zD)?qV9;`=3+`@6Wg?wFbWC7kYW^J!hoJqfkGhF)iQg=U;|@P zf?^CEO-r#R-JF&xu!WrMHr)h#H&P&f9g@ZR4y2sx&1&q-tIqOUjV%OI^FhrZe)7+% z)wdl9{+cN)0@Gs2IUwGz>@Q^M7C#qLQMiKE-~s{HU-WT{!pS9<`7mU$3W ze-1pAN}|~(F}z!Au0iLRxm{$y8vBAaTBeOP8UofDdK++S6?zMXPd5z>YbhElb8LzR zZZ27#X~2Y)OJ;(I?m~buhDsqMXvSC*P%f2iA)pc4xYSJPNDM_|STeP0z7g#WmUSf5 zs4jN#(kGE_FwUS~r>@E&7ADDU{$grwbc(tkU7cB~?t^zC{T(+=!E*eE&-(mXPp5PP z*~J=TxUvpr6LWJ}bd0Un^WHR&zKfqlI*ZKI`f3oVBYPf+t-YPI>(N|> zWD!aH_z`7ptJSdGj12u;?E#)+hi)Rr1n{5qvo@NUv(g2$T*wkPWLl7ITtiq4QaD8Hk^ffjKz=Uvp3A-_{U@gX`G*d{@ zlqd-4sC3ZN(@odv-n7)w(Xe4iYD@=#iSSxXEtP?xu95oAd;4O}4vT<u*Bp z(0&k^R{d?tx?ZQxx%aCmkTsBbiq9(G)%0(Zsw-Xr?9j#?pH|k8=+8mmw1p=uBo64# z0=>X{WPdjbh7KS@eVln+Vu({iBMnHl7f7~**aRpPN?2>CHe;HprO{|IIx-d{X;LT@ z3N?ZtNUgT@T4F}3*JRyz`pGe}HOQm}kUWRAo*|QZhC1_2LgpLP98HaBKM=15{FQDX zM`Z_*8kvKhThRfboA-2rETunPqzm9efi_WPa0D6Wv8Y*TE=!)JO||}xdf?>1Yl~-; z?jWll-HOaW8_+cy0+*}Huvfvz%{@DX)S%s|@A-&=*92MXEZ0Y}4tx@Lzn)8^O7y1{ z6yF5AK^b3%_kO>FbS&E71BjjaVeJ{uWc#En%NbBKNq|WL;y57LQe^a+$R0Pwq=ixm z8y2u}OtV&_(WnQFBrQ}E+hH&!HKrVA-IeBiKhLL*@G`so>$6HdZ$AP2klz2Vk{#|{ONc%AB zzH6Q&lFK}av%DKq0Guxq9;3Pjsb9MvXO{2TlBML(or=e=64y{n5=M$gDr-p zm2Ue58<1j2SDSROluXzI#jdr5&W>Uf7$(NXh|`2PjtkAu6q}fy1XD=mGyG0Vc8+w1 zLF&TJBw)_5&MQKF9;ki-p zCv^ifmaCH2#hK`4cZ}5L&3kj1FC%IO#p-vs8SyOe0}5Vik=V&-%kcvW7H>vUy|*cA zD=ORiKHx`@LBQXox?rux1Ye`ZZ=gUIsS#{E4^E)3@#ieAMzS}%+8EgFfiDdPift+G*qQj?ON+x_c-T3N+(5OsuUW#uS@|PAj!) zbIR0O##NP_4(;F77tA4hbL8R*WWtIYJ2R+E`_I&%a4pds>vjo!o!UTqUgY}s^qGYM zHNUe+E9!Tu3&T(2pXy7y7~Qa5uy{Et8P6T$2b2q}@Ub(w%rCH!m5od%&eiCWKlUk8 z`#;K-4lB^10QXP8A1Gsc%yUV({eDOl@KFV;Yt_AZgQpMPtzZ};Mc`Xo0Lrghb1n29 zK(g-qrn~7hptb{<4DwYy&+0Tx#j%xwHD^Z51hK)!0h2bcJzMLeadBegxHTz-Fr-w7 zY@8&eCiEl(#ij|$a|LSsyZVd*MUk^zr*4qy8lYn?fXyQjEUN29 z6`acgi`$*qB5wKSF143=EYq~{6t&fF z*2rk6R2Yj*rLkT2`s#2kjXFlgOQqfrY&oC_mN-p25@QN=6BJ4|y`Wk(52&2Gu}iPP zPQ)b~DUh5}qoFYex~WXo9&3jhHZB>+@Av7NUl)Nl>e~3y`F!7VFy_rdB#OjHrqYOh zLBB1Qa}~hs{K_urB%Z=F~GVgVJzw(8@>=^hQ;pF0;9; z0Q6sh|Axf95;e*WBH@A%_znf8-v)jQ_+{X4)zbe_B>QnQl1$=s(-1P7t*C(d6Z)P{ z==)9}vARPFfbUV@e5V4Nzh4Sut)1HKIp-CLrtmCHsPeA2yao%#8X7KxGByM?!^So7 zWJfqQ8doPL!!%B!YMiXCVY*`o4ff3I&o`~#V@`exvQ>JXJAt1;GDJJ)LVxJzrRs9L z9+`c)gDerqB?Gxqjg1O`kE-Eu8c1h*9*&(krshA|urvcw)xHo+&9%y!r{FF5%6j?27?yeQa*?8yj#KT zD$mXKfd2nlvaa-J8bnwKF&qUh*F+FwA=(@z9BQU^a3bjlONHLah_0G31sx7>!Cgf( zsVpUHtLOT6Ug>$ZK*zt#!Fs4GD}F-n)ui5&1b8Kq0l5!}rB3Q`JJr~j;5??5%#yVk zAXtc)nsYxm3#T;*TbRX7^$WR2JaAmj3f?tu{ut8a6;^n6{#@oyW{6kR5cl_w0)1qS zYMq=wk^^cA2A}2Z)cjCc)yEX%$9;p4AxeYv^0_0%7mrR zm_tvQf>l$Q?J3o__XEEV{4?+ja~HZu$r@EZNjBHAf%NbETfH9l>picju~Q&R5;|8o zEB@%OSD&RVB&anN(JzEyrTQMe8*{meTcB1K!K!5r;JGYr8B}1pOWBd@>*zY{52-8h zr-A>XMwpAOIG5OvD%h{;`#i30MF)xxs!}|GB$xa-l00&!KCV?Ddmj?Bd#@VFPMM9V zd+ViS&C>n-bguiSTLH{Zo+*>n*|i$tt`woe%B)c|Gm=D{jNv6wIyspnh4C~kkES-P z8)IkTp*j~}a~Y>2dhLc4aE>Ywuygb|ekQt03~^zhK{Y&nMU9qW)!jv;mhBcKaV0p% z&rD}9z|J)Fh!$v5xY03=UBzTcDzm+zuA9gN%d|di3U`7Vxs!uhE(;|tuGH}M?;fOk z{-grWP9z2YSyf{DRe|~n{+Nm*{CIi}VMj?384Lx z9;ByWQNiVIvKX250CKA4=)N9mAnw%ZT2-|cU(Yu7<##SgjlozejLiULlMIC>JT;jb zJ8sNOWd?H%c5|Vd+;v%vxHzvxVxLziSRK;q8|ib~5O=Ygl~+*Uv*&Q`XV{w7R8F;K zL!b~Wz=d?~$GR?Ds|&g8xe#s3&*=biIcGikH_-*BhjT#7Wq~DDAaQfmDs7H=8W|Du zJ|x!kkHD`XS&-KuS&aAT-go6GF9E(8Nxs;Ow6^Nf&pM@w=@EVZlM0590lO6F29c(@ zy-2+INqucPOZK$~aZ!Fs&)-g?XBwQ{d-hy)js+T4U#;{hO~96D>?5E$X2Ns{8tAUw zRZ)$M(|TVv=sIwTe`RIrzly}zUWH6;__*HV(ewGAtt)p(mwrRNe0Tx{&yR4Ja)&-u9it*YSo14t}wCI)r2eunE) zIUP%D4Ue3w`_5%sS_L+X_R&lrF3}vQ*{Hb$jdZt0R;iKlsOqSHB^xi}K<{}ZHu`2H zTeU~8K|&T3*zpcCgZ4IBwBD>A48*K!UYaPk5y%a|hxbx zo|XPxXSu1SO2%@`&BaXi0KbW3Dt04o!yd8;*sk#TS$#NH;h!L}x&35Cx`X<2E#j7Z z1}Pd|t$X47^z%+3F3-z6RymVCa~YBy%W)1Gyp6NtZUIYoTI{(>L$5)&f`L7k1(Y^fWns%>+b>hea*ZCdLjmgn-TS=?gbf9r0cB+Ckk(sQ0N;wVTN(m>14$U^M#=lqN2DM$_K{VOPVU83t_FH*0z9!V~8*{ZIyOLLB5 zeJ;+o;GpILv`w|Fo>mt^uP)$m1-ZNR;<$PfGsl+GQc*6cTDk>Q3Z0%($t9Qhkic7O z4fU)Pku?1Wk$Ghf)b2$(N+d{a+Bj#Y@h9GUx!H)$lJ7*^f4jZ+t9op$Q<>Tk1+`uz z#un+Z-AFUtJxJW<79Ud?+}nAP)H!?w^)99Ni|e(26l-o6WvKs z4U@}(x9I(G{XU2E5vl<)%G{P^x&FANg#rrKTyvZ(4YXG+vA;q5tWW4-ts<$p$MksL z=e$y4YtHiMK;i&h9=*;bm-&(+67#yX1>l}W+=f1b>miGa6!iHjXAcuiRC$efzdx(% z`Wqg5yH#1&x01!$2gvH6I#pj-&)wCHWZtbqI*N=aqqC|voBYyRpJ$ABMPw)w~23L8DYuRT%lC|E6$i~jpSi#MV{e|yb z7Sp8n=5l`5*STjh=H{!dQ-ya-_wzyhTg3ys3X)(j zjATEK0v}OOx>Aoh;eqU1^)-Kw6j=WZQopuUkE<%^ZALnoyatK)d`{WKUHT}_V$YQn z)Z4i-XDT_G&7LkGt-KypLt#PojJIDdctEGts1@~I47C_UtB{19x2Pc=>b<*yEKa&r zS^p`rjQAN_XSD)f%l9}_c+CQ3KRTvX*9%eA-(A4=5^vGC8B6Hj*0d}te}v6)1~xxQ zWKgeLs)77vtH|AVo2J*BL7K9$oPT|C;5#RY6}(2sM!hsV*Wwx^6Y(vGOY+~^ zxRA<4Qf5E*Xt3zcCiwf_bZSc&|{_? zA=ZYCnHk)V3)WEtvS!3%-o`kr7FLO@b(ZlKR87BhuUcW&1GSY>v)1$!hgohN`hBo* zprqEBo#I&A$_)B<^>ukh(d1MHPtMq8?IEbCYv=%3cXuZZBt!W>bpPVHn65+Ozn|7U zekobv#oHBd-s|aurxf76;<*VgQDwhH0d2iLcdb6Z21x~XS#)J}hq{>EYJH#Qk;3m& z3ZCoqwNsVEL@nR3t^n-js_j9F%r94c^d_=|wwVCU=`Aq822T|?w2kwg&}+j@<c}t4={haIU8fHJW+Nuk5l^(xc-F6c!&C(?6vFnN&9f7iAtHw$nQnGQk z-ow*KT=rFAFYBzXt-8S7-`64m=VJC}iclDnB9a4|xjM%+;%=Jh;(+SlLC9-MOA5g~TI{4qLEbXKM z&kvH#Uki{#5eIONalM+Xd&LOZBy4}2jQibzz<{Qbb^)i?>fYaS|FYZptm zv&@V>kpE^OO4gU+YDyvNEy&P0ROO@+@tN*p?;h z16Nmu<^s=isi@nYOAc-?xF*iUyP9ljy_0po|ED1FTe?TTtN^!xY;M{KRb;N-Z8cK5 z^J3lW--pD|UZz0PR3+$u;4)=)Lr7b!PGx70se5x9(gX5EWDOi51sxwyCY4EqoIM~k zn8N6BS;wzI5+GJ96TOuz?9rj@&yZ#HO||C6)hHiC#;&+ToRVj}Ej67~)cf!HV~zly z)a$bmiK)8zaznbe12r%%S5Uh}@5vKD)#}UUgL-M!IAiRwdU!k~!S}H|X)FfNueQNsZVI-u~XIz}8TP^fL-5+mPOl zYmhGRpVgngpiJ=VWF0PIeZ6xTZd1@aO*YT5)#d0U_JD0O635#><`Unak1k}o^EPJg z@>5Z^xlP~Kfk0g!@e(ss9UEGs*ZWCzDW1@uk10^Qq#(DC2laIu$VL*q)iXHe^4x-j zEar{XqC25q{AzVyJVQ1HB35dDNG&o~e7s6QuL}vFBPD$Yo?%iJ>aE zKTX+NA8|7!zm9Y!y z4Db%bKf6`G^nWL7f#TZfG**C8iFKpDSQX5}{k!^3@4UBfsrlh&b6A%unzC*ZXIZz( zZ14N{3?Nz}%cLa-wzh7ZE?sxd&~Tk2jab%lP$->W_uR3PbA&(IH$&55&~ zF6s6F>I7LKxI3<cg_@_Hma_N~AlD0*-5+z}(HpdutVJmk3^ z=NjP`lbg;>zIMY5UA6vj|E|7dseI=)fL0>&$2UEY8X;?Ny%18J>U?uxI|E`P(_FKw z6nI>Bkex{Az||~)r0S!tIyVS(lXs6}Z!L_e_1>vU|38p0#1E@0a<{rUpHb!&Aqgh0 zSMc@w!(NH>rL3#YaAg2j>3hCPKids0cJbV9J^vAPZ#sqCtpN6%o=bofkJr>Fzf1RK zQI)r80|I4z-%&N#Mwz>2z6-UN9e`b?_iaDfcp{hJ=M0_CBC#`*2_&92 zm+n_{F+j~(b*Z`*yL3SuKz!Dl^~)d8V@@OKuP@V!)q#w3kJ`AUmZP{}vK!+8OM5zj zn}mBU5@Yyxb!Rzd<#%>3wplmH0&U(E3v6Dk;8c6p{Txuk^irfVNUs9UF}-(>AvLCZ z6)<)HKcpb>MI=T4a%Et#0?;_{4|<=sB3(mXulrz|8oZxUSLUty`ii$NthaX7ATjs} z1(j9m&U}-e<9^jYJJcJD5Jf+`tZZN7KmU3$_=d#$V*4_=eF?y7JS5+}K zXzyO03qYGSFy@Ty3`j(tYpIv4%%-7x@%8Eoj8vgNqKw2DC1Yx|ey6(OPO4)2lxNAm zPXE5yGh(;vdppr$_X- zE>(c9(SR0d)`mfaPh8Q zHGcc`_)jC*nCtcaeo(>aUHTr!6wrQJ&tXgrtG`z;eol?WkZg$ME6LK$kE*^og7lqy zl^*8?VwP1`y;Q;Q4v!J8BCEfBOd0Ce)Nrq}^pZr}oXe6vZq{q@4YIaj;~v1A*86pj zx*NZsI&8i=LYW0;YF;5-6-fm>r9Zz{mG>X&&n>#(_UQtc(8c7kAlI`3CO~^}wW3n_ zrDomvNdU3lZ^y#i9If5n@z1LAOr~K~Meq3>q~_lkIYgGe|DZB4m;LrRRnq^eU~zH^ zL*f`xYqm>|d(3lH6;;9ih8jI?D#Zv{Y|dXxC?ot4b^AS}iZoVcb~oAh7{|^h)OA?V z$AkJ<2fR^_8&&sXmn!VHC>Z@;)klX^seeO_vZwU-)vCOE6d-?_Y$VHfDDXG+J=|=u z-7SX0Qqe_;ci+~lOEFMm^mvOW&eh=66v*z=?+;RMJ2_AJ5C#@_@TT`Ah848FfQ)p1 zPA`UYKaT1DS0h2k59;D@W7rEU^P!<$+oondUL53N5+V zY-^>~ueEWzI@eO8g@q+Z-O={}|I1@IAn~^K3KDB{?K&%c2NGL-o3g)c`kn_>5BwsM z;4#Pxn+3Z>vmLrOT%Fu8B<+8rva|~Dm&&&GsPTMU0p(d`SkLO`ZdDffHU0fK(%W#e z8qgN`a1c`Kst&3DWEGN{E z_+H?DBME-Lp@znG&QA8KtL{EU)^g0YV8NUl)6qpxcFs2&t9AFUx&gMS()+ajeu^xG z_MK$&c^vHzmbta=nuTs6s|i~4i6X9}z874!Oz%H;7W?=t?x#P1(r0fgp~T~2fVp$c zxp`=z?!&TL;ddjWXu9?H$Mv`#{e1|@WDN8kRrEbyq>BDw1&AL}2DT9?sQyQN?RP0- zbL(hG!OG3yTBq#k0dC}?yeaj-}9Gyj$>>`~YAe@+4DGJX9M%Fu=t*nSF$_kBb` z+11ItS=rhevTh+0NNnwh>b6eroCD82cc~illS_16xDjF}^#1NZT*)p|`@50OPajod zsH#TB<-k9wu~O^b)o14^W^Dj-G1!g+qb+2C#co|VHN7}{$R?@o)CKyWx;*+hJAHJy zimL@VO4gYnT?z`(YqwON1>jU#SXk&irUEwq-sgZezmj->=3-j!QRd>@k^j_NsFrsvwL zpZ6!~o*dKnbFxku zIaw^MuEuUdb;+HoJYA#XYg7p*`Wb<;$@ThODr!6*Qr2~yg56J(Wk~*zp5rkEzpr|X z)RiK=S()Be{j7i2?|ekh@izU8(=6?*ZL8p&=y!=#N4;CGv(xF{rAE!ikoe=ndXMIF zDC(I+k&D695~cVD6vSSt3wJ^<&QBr!_Um-P9Mpw$T-_GibwRC!d1{fmd#XzW)Z7r$ zidu7TRf~L`K8l{ga!DV99@}!RuGZdh=PKbW7$39v`-+s-p{siDD#|kIWQD{9-LG#{ z_BPUTynmeo&w$ylhUt0*rT6KhgrwK6)#GsKMMwkP%fw~@8-JED8;R@FsiBm;XZ5_fY2hnSyq@5Q!wT(*(xtLEkn*(Gq^Zo0r}#BIC<_;Dm|@i5tN$yR3O zk`Y3(iO0z_Ae1n*3p&)bR95$g|5=ST?^n&CECaNbxLTm>9^*X#mL9RnxnWt4h4IuTj=-NN3 zOl@?jdYQc1O$S_V0>hJJ9imbsbo4PbXzx^`=ePCwh0tFnx=2dTWjJnBTE9at%D?M{ zcpmXjUxO53r${}D(G3(Y^TKO4u+dp|O=lD==I`yr(weF?{*f#N_zJaz|4lc(V`UCh z63>#~JHNNk5tPpmqe)ds)Eo}fUm#Jm1UdLPX`h7#eV$9B#|T;X9S3M* zNb*^r9-=Z*Q}=|f(fbu_iu(6Q^c==?txf3vT~=d@^ z^8e&n>zmXfcs&v{-mfl(5A^Tq8(69fJhNAklX$~|Jr111Bo)UB2LpG~L z{64ZKs4#U}|A=0XTgcM08*Nx$LzR|$?uaU=Npd+KaSeUHO4b+Bb<%L{k8VMlZ+}?b ze7}V>t$n}Vv%{Y861Lp45J}E>Dbii!Sp~U&LAsBm%9;XoeO<0=XtSQne<-MJ=Irhg zsQwsMSJ;b{VGigy-G;>S|3-DqW(A)E>Q#8mWBi9z_cXkioh#HE zB5R%W6ymdf36ddMR>il0WnQP&vWS)%D|Mv^E5gGdAenJB&ycx_to2d5 zYw?I$-g~BSJGQzr8~SYs>=%cS%dny%SEiR z^{14XStMy@6XHI8hu+g?)EF39C_uYdOwE0GNr7sEE{+ksFm)uY_ZGFb2Xw=@cuP?i zV}X@10h^@&YM$%SG0YM&>f;(!j5i@^(0{K$<`mh4XZ;>fh2rjY*y18gID2U2xmuU) z05I{4thkN4Wu*d|e?Mzvoj`mx>`O(J{WVAi;%_M{x}2=3La%~Ji7aO7yCMHjS>8`8 z!+J>9kTZt<9I0mosXhCk{{P325XQ$9FbCE6d5eDjS|lF!6}`s?)$qDW0rR8k0!2Z! zQ-QI7B&P*x6glH-P|xSf`ks>tzI6q_akBPbPmv``EEjPJTz^kC$)J<0F~(b!y?sG- z_kz~fUQAG1g%mfs?50&}Nq?&@lCOHluhvB|p^L2q6m)RrN|=DnQgF3ul7U;mqewEq z%gJJ)ZcyMQs(c<*1yJ#T#&tu7`HgwCg4}XZ~daXYG zOci#`yB7P9IMUOqk6a`65tdm}nj(w&1PvN0mHdS9xG`y2Xrn5;8}KOMK#&^bny zDCFW{uBNTp2E?Xnk(IRhJ!F`1lW`Ap4kS zVBDmj_YQT_{i0{c6!bGjIXl*RjVety#lyw0p4DS}lo8#5WKI92x*4mUcju4weID1( z-Ky`i5h($1UFC~NGTIkaK^N7NP*E^_TAAEhb(_9jKhpv0i*>y}OE&O!av8cE-TsLC zcl8Y`aP3!*+d;ApDz3psa1oMYOmva2PfZuQi>1|dk(}1QxkjkRbuqfJGYzsCUCR>K zyn&5NX}Wi+ief#|ePLLcwR11|ZpNwyUVb{iOAGfc_hcFuSi6q?Yjk~_=7pUtR>FYU zIr9`KwCPzTQ4;Q z%P*1D!#TI!dVP;K>H0gVI;5fcp{B0NkLdeeO;#Q>phom3)xh4b=jcjlPU`1wP_P^I z)=;N1yg$(I5vwQSH;^z&o#pLCs_VUU`>a!q*-w#`E?ks-b}>OM&;>cBn`6IPHw|?g zIK@`*tn_c_#&HVIEHR~jE=M5&@oTy_Z_{<|`d?n7tYx1n z{pvCYjt!-E5@_Npmn}sTbL%gt%x>bruclZCQR{wfW ziB|O-#>rC3-TSyWPH`H5&H+t~6lWB)PQ*x*oqUffHQHQH2Rxk$3L|>|N0GScEA*b- zj${~yx<>BQWB(Z`Zg$y)KMDLCQs}%<@BRNo#={g9C^wQdC*Fa?W&at8`wgi6_=rCL z74-l$m2sr{T{kFDZBuvWTal!ZcOaRPw=1x9>gxxUr8)N4sqa%?u11uujgsE8$CbrS z>b1P+4Gk`~`*DP<7`s50CDf^kX~%L| z5-WRFT{AvNk9!8osabr6Qd0`SwNY?db*t^~@Ly~R+sNSL9hOlCEbY;ltU&R58q-m^L|2umwVRRV3b%WC zVRK`bD*f-sti3-|MfrVdxmTuOc+M^5&e6FfduUVez0w&QSvVkV0kkevX7}q)cP)=A zSh;)H)aU%d;|GuqGT)|d$Dcvm)Gpjm_3o9s*L(He{wR{D@!hI7jOvXd5)<31K;`OR zd-U^N9hEa+3JPu?(Vusyany-qTkc0PBhfXMAhESid+e@5!S2uXJAD8dn)yXF*3)IK zpHjq?Jm49c-FmO<7xTME7f}J){#|{ko>AS4bl3x#O`ehBG8aRSl~-F_gl-nq!I2AjwIC`uwuYdTd!6vF<(RnX!w7onBO?rsVYIJOwlRU9m*=rEC72YN~@CUQZ{zXyOvJIz299ctDjU5 z!82AJBXh|mMI_0hi>$pCZPtYA)bTMS8EKaqx>xF&`g>(fPbt`~Q!mhJ1)w5XR`psv zuSXQ159;4K_2)6N_E-fyhi*N;PFpg3OEuN~vnU#b2aDta z)sb4J{hmd14-%a1CCg+BJr~E=a@Qt4J7_cGYOz{yCAFMgGisNtG2*c;H=g5FYW34b ziB&xyo2~%6;;oI=4i%?8Hz!kk&H+7_?aVO0Z6yJl?#s9h*jLqn7;kegd?~Ao?kZgi zQzbeLDQNVPbtS2I0E))~k9xpa)^#?BBrDv5r0V}0(*0wPx+~W!K66 z(hzy4dIesKWa&;I(x9_3@db9`> zVMG?FZF&~;BS?nTda}v2V`_=H#a~|mi)SgFuFIIaU6t9BWZ90bJsj^xN;DeGKB(+> z262A;SLr&~t4go+b7m4Z#PI~P$S_@D2_$xk>(x$fQQ&Y!=>Rf6ZIj-Y=~``dB5|$L zoIRHf&Q9M?y!(Gbb%uM+O`!gm{(S&(b>6Lie}}HmpVGC`sRoT3QS`X}e?T9XD_{+J z=lQrke;HZ-$dVqnR3>T6DX?iWQKAOWqDW-BsGz2neHqDKTZ6Q&DXI0gM;DG;*oPJL zx{<_#1O2=Dj;(<4GfPbgy6MO_A|1QC^*%n)qO5$^RXc^(u9HZp7QNrWqJpG(Uxv6J z4^5#wrvtd;96)f{%M^@ss%|V!;U8{c#I6QxIs;{$0@DE`jy1#!>keIwWoONZ)~z4~z3m(K0krL6L>{%umv39{JI ziV_dR7tP*T3~?#PxVGqm3p}OgyBhW)buLEPTPG`L{LE5X;FE}Z_X3(Wj`G2&f!zuj1)g$?_Eo66`Gl{qxk58k-oH!;BA?;YqO7deb0k)Q^l5}alhsa_dz5={l70R=1 z7};#s%{bCjcftBOF4uUPb`hD)p+yCgn|05&mPhQ={~w&fpctP9z}m?=;1`h2ApgEX+xyclZa0La>K`PFZJm)W zNLLx+lNJ)o!@%_s3|J}ENV*KY34~p6Y66B+uokKTbeCarhv8(u<&s#Ygj~@H2iC#K zwTAj}NKRUwNZ|1`hT18M)$jE#;Jt|JJ7#$|E?#o7C}L7O@9k@-<r8_VD1M`-WkzZha?brUmkUel-__STGtITCn~gN}o_+?2 znXcpP)O%Nhwnra+_9A4xH<^W3#y$5a;$jA2TOq(Z1Dcl^Y{AkQSyo+c_=ENE`Hx^@Rb0rDv1lSL>}AEnOeI|rtvj5V6W8@cVOn+0xoN^#sZHD z&t=x)j|FPS!uBD>^q1?sbXkqF0i$zeW~~e$L=p^KX66txbn#yffY$0>)Zg8Awlgp$ zCr9;q-RJGib~4iD??t4x3|`o@dN%hvA)BULe8^(!maYW0tT7zA%)oe|G@2yInxoC+ zj+(VEDj6Qz67bohmY1fM&1(bxB(bC;mQ_v5cOEf(WqZK>6naK2S9TiWp_Cg3EI*jQ zrb*b}5%7BzICuckI|If}S-v`Cp<+mCkd$+#mV??1iqQF~{nXxKi*oGGDgUCEneNXB zlCk(`3v-%D(M?x~J=HOdmiMkGkY0~W3izL?&nUZj- z9-wuR&A97AT+sWcd2I!W-<|NzZAf2x?V#nUI=mvXY`;6;ixXjS$BCf)nmsXZ8iGqY znqw1}Ms#)s=`%YFPY+p+uY<0@kgS2H#x0li!p1U~9@si*xjwQ~L(2w}a$}&41V-Vz ztl^(xy-PS(9X2e+jy zvx$p27uHl|03p&%{hN@?H&;hARUvkwhS45fXQ?XBE#7)t@+|EFI-ne8?k8Y0IJ-lP z%UqpO-WgDP$P&NEoEZq50LiCPDr4}n6b3iK^WBEwl3~rkuz1@u6o0I4;~)$y&F=Nx zr@PBt2Hv@C=;#-&3z~-#%Vxl?GDOuNiuah(oe!ts)f2{SXxJp!-PLus9UC1@8nvKe zY*Yzs7{b+~aIFpaiVc_qP9+d-FpQ&JSFV3gpLy!1^7wuZYVEB?H(Dmq^Ybn2vOXpp zsO5cc^gnOgA7Id5u}H2d8NL&KAp}OU(sb`{Wz|%^8~G zGhA;MK4^6>Pqbs_?+h@2dB{?pu=MVO>UJXq*rO0#VJHt-KGJPSw;Ad{8o~NKw)mEM zk_JH#QYaSb?%c?RYj&9Kj`+q$AFJH(^w7!2Lu2X_Nzzfi?D9*7Y}h+-_^?TgB?ut3 z3FD2FI;E}EAYh_V#TY|(vHY@%jVHUJVB0YhU9yh&{;jt0;3ks85w=PDrq8*oWKi=I zVG)^J>&Amja(0WHQGIOHjW>`pwMD5=%@nS!3sJNKo?%mLQM_&z*C#l8#K^g_#nI_N zdYJ;+`IbY3NPKK9lJPj56!pH1w7kAC1)v2$)B!ywEpM;G{o{to0tBh0G;X={rhvVg zsL=zgKWz%v+9WBNG@@84(zU9Wv1*NST48cxgrT8fQ!K8!d1zvc;-;A=K4FBn5?t=$){*G>XgEOTBC|d69NO}Vv!~d3?YTk5ELp@ zYjvzOHZ&%UY+COy$=GU>R(nX&B6*j-9MopEn4eecZwt~E%kO4T(~WUV7r$$SOb%>| zO8jZ&=Tf888ZYx(88v25pp_QO|AGs$m&$sYEi?179o;nR%aADv51$81TZgz0-7wDG z?XLYh0|MQv?mkAV45ihUiux|sK5OZ!Ky$sJTFKTzr2^eIgftr_xZ?9c&)e%ZSl1b) zBe&U!uQmxT1zW0OI!>?Mbm`tzSG_tseYCSMbb=&q5T_}{D8iOP8r25nasg{YCQhBE z(cQtSo*wG82_^=I2&{z^;xwVws1X8%&=6TeGfgOjArvfOnl=kIt#_npwIfU$C7b4m zmV?@iO2ld*_IoB!2lPz$bxU_l{o&jJ`9V<})w7FO?#6+z~Kl zpfF_Fek$R06~oC5;Tdo(0i6k~d91SbbWj?iCDkm5*kAT4DOpCNm80gjKNar z>ckK;HZ)3CM<;@HsWa2kLJ%~INn9;sCn}`10@e-1bdOvXfh@+NK{umlf^4=@#oK7k zD(_XMme;8*Qeg9pjoGZTDi@Y<=lbwnjTCfW%QEi|>Uk&3d9uoOO{1BC5&JB90{AL2 z!_0RHUj~E^S)xOhf`Xb$&tF%9O$E3#f^Dk|TW<~7e_cSeAhm85e7opq{2hOBfcLjcCJxL(#-o4ck%S#uwefzK0%VGJq>D*~G)2{uDtS zc29nVbmLlXd-*GP^iv-ti3~lfS2KF_I1OuQHtSq_<87?JY8ywM*-aFc+4tnr6r%!R z2w@>44obweCP~r|P%{B>oYH7EDRg()=46~k#jxHTH-|e&PnV6IjIa$|Gd54>&zahE zVp=xNpaL35W}9<;99Mu#&(jT)%i?m2F^wB+w&I3Iei^Aj;~dyp?!rDlU~8Ao-vEj+ zyrd34b~xqslTm5a5lXKKjOlD*HXW-cHy>*xJ5DCSjsa`8499l!Si;)jBwam`+RoSn z<*?EbO%9FFSt`=i*}=g>M~H!!z2kGtRSdJgvY(;S^33@xQ%fkGjqXbe#p5QRm8V);xiW9KE8aMP`~ zlBThtUJHvsFjBz|Mv|Ew=S(dJwOP5XTAnJ9^^-g5{eM0cX)YIjALmkWp6l_AmdC|9 z_jxfEW|QSOgOSiR$H3P1c_YT>L5#+9Yz&5UzUo86|>O*!4U70=Ov&t>^aWsa5fl4ZX;@9k?h zLdHzNXy;q1Av{rnzq}&gk+n&E^jqsE-gAX%ekM(^5J-e9iAk}`A?~>CCa$~l#Zc+Ml*_~hYzRRZVk{H` z%kbn$Hf&r^@7m4SEt}YK-Q83+@1Po$=vccR8$zYCOlT~PdX-wE!T87s9UY}~?Ya%s zN)QZ3X*w2SCxa~0Hm^@xWU}aDYTl-F3#Cc>wn#qkx;$X-PDd1teqh1QJVu=4r;R&JB@pzstRn2{(lr`<}I^Ur1-UM=L={X zfYJV4ebuF;q-Fp#cRi|Yp1V+)Zo2iEy24i(>KK}yo*4#gPtr(UK6(1Rw?>7JJ<`$p zmggG5O{bc6eUey$IEB<=f`BBDIF~U78y7G^K&9MC+N=`Tl*Be6g{0Kv=)vb`#xW%W zCV_gb1{OjLX_}HoQgas7#|S%nxbN@(nG+KyX`DDgm^LUBDm2DYl3Gk^QwkxJO@XLT zpcEQgfo3^OM#?F}1*lmemnpzXN)mD1f)=x`UCf|n^x*>iwKkjcs4Af~NY-1GTyi-# zNs$&@K|7#W%pf)cpuy~V63)bKTmK#+srhd}W~!Z<0@T6}q$KYQNWJs0WHHb2uDCh; z^7!UEO`D{~kP=~2OKMXZNlKE$G{Yj-zvxa*KlcoyC-*aQYA+q-0@Npnla!=Ur%@?=f`gP?f2?$C>OtTRulasaj#Aq4>NueA!;=m?x#oE(>G1e3! zQk$6ZFx)uUNH->=QEH*ytkYet5Efu~Y=pA0Byr4SQU{yL2!Oz_X45*39y~}PjHt&c zNnq&Ryg7|(qfJw*HHz4wf=$OFY2CLXL2W5`!xp>yu`z=M>AP6+BJ4%VF6J>#b-}H$ zd|+4s&5M2MV(M9Fq4)O_ZJ2G!%-vc-WJ>kE52Vs@G)+ zE~oxgpv=jkg1%RvI>9DjCIZUOS9wta<((0q>oC+wiGXsFnAJ}Nl{@w%(ayuEy{1y` zh_LYNefLo+mx-;EaW~U|xLK!}CX@;VY6lO|Y{WE;B_(2_R--X8o_39oRo9q!s2Iej ziq?)5uyyiO{v6ciND=x<%mH3mH%XkQ^shMJYX!6-3zGz~9HctKbsf3D_iq3n^zV^^ zn{!Df%HABf74-g<$R;rqfhdN;fTd@xVKjmy1lwUSYeNnv5EKo^6ktN29AbNJNUMX* zpkhXg#r0#c-H^mhLSv{mn$*)6(v&a^2~9v88cd-`S5(HPRcf(#NyF|=d-aR&h$}}A zO$1LrcA{*|$)dGmp-o-pV_tNfgW9}U>Z^1E<};0QSy5#kZBqBoMZwPZB!em6-!V5J zeP?hMxP_{dA|RT8l7V2tQW~*Lb{hs8Lg(TL>}3H5$@(t34*w;fE5eRnomM|%3qkyZ zjb1aJ#Oo7lj0qqJ1L8tRdD8}(hmRA70qd@~lKQceG#U*i3zjHJ2&#$QbKe8aZL2#c zHwM9}Fl`K$!=Or>XFi_CS~cE1I@2$6KHQnn5>;A>XPIAvOzM4psk@R^DifOpOKaD` z|6JL}at1V(s)C&Y-~zxrm(qCb=IsSJ*~! zs;lergQK-l-J0GsX|k?ZI<~`3JX)SS#r<6!-&E{b6|P;kjy=!prWhJ-y6t9;A3a9x z*r~Kwuh#6z(Xk@w=}O3GkS0}DXguvaK@2rC+@RP{ub=DnI_KqBix$+TP=t*(%I*k~ zD3Z(45|?c_n>J@|!t$y7vdyVDDei2Is+(O zn>3p1Efjn-;dvJaA=mWIq7I6UFO;@T<>P;@dy@@W4GLN=<4*4m|!O6O9@j zHcX17^@>f$$|M6Nn~qy+UEOTnR&8oPbBwtJbR(r#>-7JD-q+*6-u_*EgRVYwu87D| zcRyBRH@oJ6iYxkO?s{$IC`uabT+?E=i8DbG0ill zWR0~Xsj+FJVB^6;U`N9wsYND_r_F+)IZ(R}8Beqw*s6wUfYd8KtVZf^|E|7tF5Qs9 z61rYpx+p_$gEkb@a;COKfX%bDi%5N8hgx>6$Fx&$ivmz)(|>W10UFbD9BRC<>&SHX zZ!V>%%I;jjZaTK-fNin~BMmr>WNRJ<4vxXGM-saBTgHKX!1K4K6CZl99e;nCG!m=< z3qhQw#@a??>`1|;qoJXmv$Uz#qym~-V>bZrK;~Y)0eCqwkoHdf{~fyji$FyU-4(~w z+@$Lc#3!4(qLwbhNL87vcZN#;u0FfiYhYRdWxiv#a}1n|jfFY3wF9^n_~%)kql>Rj z)zJixb=n@$6_ctzj9S7$)v$L$63kqK^v2ccZolF<-55E(lb zoSn*_vovoHcri4qM#|fO*8&@n=_--lGlRs@E(NYY431%7ZU3&mqdV{IyWn-Yl$hF> zJ_5Z+c|+r+%hW(z#wYL+1NwLMnf_gU#x>@>i03wIfLSDEB;kBtn|Zh&&f_vlHYTXu zG21x1VRb`+?Nz{Cyl}Ko@dGIvK9HU%8*nvoRbcWVOMNYjzdE4*dMO1M1qNzx@~MQ& zHl>qayE~Zp!*W2aQVb``Aty_rIZ-f-g^<^$O;3=@3RK(gyvL#TKulWCX-PVoQ_g6YE$xfTAO|0HK4DMwJltSc-2DAF1xV0-z#d=R*|-A zvA_Ry4W8FEUMlWK|6(Lg!o`qSA5sFCF`=N-z9Y2&`F7m2|?@kd`m^Y%}ETh`7Qr) z_bJT512Cja!(|BvYZ}jI1}O4fmQjLA&+MgfARNMtWJ2G+aqknHwK2^N`cD#C4#5o{ zXi!W5^3D0Vb*|-1((YXY@(l|7c`F^xtklZ}B@-bNU@R1C#;b$A{Ne=+D(BF>OxxJl zP!8b5AIHnp7NeikaOKHj8@E|YjOW>}Dgiy{#&(}u)=x5VDBirJ-7#9Bky5dWYpjlO z%L9DNOq#+0RQstiYltu-a?}L}~|Fy9xz@JswXtb$d-1qq;@31XcyfeIR1eRnkfpI=q5HY|A=&I;4ka2Re>5!v{2y|n5eVMnk3_=+=)NwAm!SH@#56x9YeO! zGffHuEbQo9#Zkg+<1cGg%0g`EcJ&?26Kq@A8GBj>b*1Mrq|SANUaO5Fo`@b?@vjYrV#c%)<>^@uulr;nP>QtpS?92^^G3GrlKcK48We6Z^*8Mm-9w#7JhVowRk*w)^J#pEujr^tIjw;6$}cjOMz0BLzZuKg*6y?- zFzdhONRm|hCZJLAQ*Q6FDFd+w}61u?DXzc&SMF;qB*HK;<)SpiNx+^db&6C&wh66WB*e7OwTK< zM()PLth}{aIrJOD=jYoDcnB6P$?nB|cn@`wmfXjd7wjx;Q*_%LUfbXT3EW0Sh&pfE zWj-e@TGvG6oY9W^Jyg`#K4;Jtlnm<>(wf-*H=_zGxabhtYd`zrj)-glp|mqz9Hyup zDU&HjrD>C(>9gZ=g6%3{9M}$g;d>=t5q^9#WbQ7!vi->~6nj1RJ=h?#$oyYS;GvD6 z7Z9grFETfQjNL-&??UTuK=IJ8K=1)e%5!%L6%0Szl;RE$Z7oD~1HS|B3Lnt4ySPd< zx50xu+u<>hX~54TYY!`ekfm7jdb8D~$J#fin`hCc zeT_rvjY6*ECqdDbe+o)xF4>07s3quy4Z^4e^|XXNHr5i_vT!BI;PMTapkM`cj zm?8|-@=}7n6Lc0|`ShE808eC|=Rp2=TBg_FhgN>}8~WMW!giVr+S7cQ1q6>(n8OW2 zj|#$Oy#exYW1{p#))+PxM#bPKzNzbjFjqW^zw8xX2iEoPe2Gv zYBzM&5{{)CL0hv{7*^7xwUOm2M|dtFp{H(rDs6)O)!0=_+0bVZh6Bf%>k;uA5s@AawDP2i;l5_jg?XkMD*)u~jLq`52-@(+PTCD;t`?HV7Fh}? zaZR3Fo-lM-9{K0c&MGCv%s;>;@17z(CG>C>ihD$=A-is!xXPg$`X}^?a1MRV!lBo| zyp(oz=(rF2-k(`TpAcTME3-Hvl8Iu;`G$h@!I=^&m#_iZBIbSFXhP(wwuw zXRK~^2PQuz^V?KIJlsoG0=uM2L?uLgzR0CN7kUy%f&XxebHZmO*r<8ePT%1l%}b6n zM>;OERy%5qQvdk7tU&D=xNdQ{HJs%ac)Wy|2p1i^SxVlH<{6U?&gBNz>vUqF_D#eE zsGs{_S3u^_Tyw8#FoLnTI_{l|TKqAQ`ZFdQGQG~-@U{#V=TR-$;|`j?DL9R*jA@uF zyld>B53vLP=GyIqgc6S>bq`?Sjuq}(xuc$fK4Poxo_n1^-jVbJHaJh*>XEA_b8vV) z(Y4XS)D<~UC)#o}q1A~qJ3Xkmi~rSIt@_p*!3+*U$9n8$RMAJgT5_n6Dtzsi7Ms~1 zQjSK+bMreF<4J&#ff-};sh6N+bQ!vTPm=<|Y=#>&k0`#IxW7r7g$A z{fF2+HzsdGsFCUW-0+pw+9ojQ6BgeXA)ww_;Q{pH;MG3BPyVb4DyVT$s%T*)&%~35 zb&qjnY~{Q>$)1^98H!4m#wK464%C3=7XYDBSLv;E3F<)i%`Am~cO%xX(Ts@=cvQdH ze>PkE_QW``${%)+HZriOj!^g|-g;<%Cyc7yl}THdeONi~Q-_FafI0gFeXHDcDNxUj%Gm3yjD7&^M5th~wiaNyjwipYYGI=YxGRI1oD5YOplp|FbC^{id$xth!Rg3b^wo zR2st>_nz~_9lK8t_~9Q9w3;yUxN){ey_AfG)d`PC9Rb4Tjr^HCU&fqDjD%fhaD ze?%M}rySlwlRte)t0bf)peK5Vwq?Iru&jnx zF;C%oSj%5xp4xHGPLs?yS)IQRL|2+YHFQX_eM10Ok$n6ImAe)HBIiSHYv1glww8Bi zl9jrGs<>sPPj*G+m)VbBQ|)AnWq{MG3XOhB*3o3qF=L`g>#c@UXjWV2pxf6zW);BO z!BB9aOmkk^G{YK;U^OFfAu&j|?j?zqTqmg7Rs3(T^23Aqru}g%E~$QTK>VotYQ?4x zMGH1pyKmO74?R@SEw0!g0y;6eE&k6#y4NTIKw8XYf|o}XJ$)4~#khF_$lQbnqDS{3 zOfx;YJ>h)3R&q<=4h)&`-;MM#4kI?)*{*RC3dS*9?f&(qH{vIxh&vkgm^bBJ50w-h z+&z~(l>t;-Q|knQZ&DD#ChB|&;EYP>bZYu`--{*dzX@!uKi~(n%LJbk(mYAa6$AKe zOLIBvvC5wr5?sR%XKPe+LFjw30O1Bf4PKr(W$a%A(qEuIWk$!ea2YV zKNoI7DVn|`N_s}-vTw61Rprdq<6TgS{yo}8c2^xm<(QrsHWEtoiID+4c;)6Uu*WSW z(^74;mqw^9*d`zs7B=Y>{iZp(h3LW1@EE^nsEs=FD@bqNm>t4&XKp&D|CTyw_Q4k?{A+o>8$~o~u4%iL)C6`% z(NKAS0(lfLsP^6+w~9s_s4Ho!$$FQ?aiaw@T-hV~4RDX-9I$bdUhNe4Fq*u9>2rnO zbdQ`p3w2SlfLx{)pC@X#F?j(rjb6-X_<0E;w(RB$lKUjstNs zL`L$W(lRAWLd?R84$Kl-2-hP1;GEzgXRpW**#9VyK|ibs+_w+6{I7F1=tldsP_;1! z%9;^uou83bw45z42Y9YFs#X}v~_rISe>JAVy$m<`Dl2}SfVyz0X9Wfr=-rr3hV4Y#GK+n=D$Y@rDB zGf)!)_u-vFOuA@e2SQsh)-Ez%YFjbdytgvBnuTdu(3$Q^0R`lq7*{L-MKnec$5ODh z=_L2hG|E|LQ0;QTrdTN8gC~p1v#-~;_Cej~o6MxmKk!n%zskK@Q>P+oM3pyScl=NY zss1O3N*db{jFajogR1b)K2Pky8E|_=s#X1@coJ+7MIpfzR{bl;ID9s-HQ-;8kVsNd z(gz9_W$1?1z=fp@^N9w~$()3*4i3_`v9bRZn9|OS+U=SVJC2lruU<4u=*zc-kNI4D z*{5Bq{J3KMGc8R6asL|jX*T#RuTJ6xV^1lxhK1{@)8Fai^-ODAB1TBe88k;Bi-Ot7 z+@Li1M{+x=<1WwZ>1Q`=DMuYMfEKXEe+lCp8I-);7m#l6I&>nvDAt+F>+JYXdiJ6d zf4oAaa@bcnS?+ixIO!KDAgt$|Z(ccKATy!t@ z<&>CiO#a$tvUc(cI&?50(HM7^u-ylshGKZf0%I8r?~F3K+T*Fib#DZ18gsdcSle4$ z!zckb7jf{iuzQI}#Kd~E6Y58=d` z#sZ?BplaA^`C*Uf03^CCvBM)Yz^&}jw~!TOg;jsPwHOM;=Z)^KP8=G&(NdG>@ymtR zOmajh9xvSFLG=(yx^mec8|vpdt+Gv5w^D|YPOD2yFCYsWniMpoQM z-?pxc^-y!dFs-7x=gbTe8p^SG%YWLEB?}JSCXn*F^W!?9Ls%Qgw4HQ+hDA*=Gqhzn zHW_Ki?tdDbCuU0>R6f779j0TXw{}UTh8sL$4VX$;O-*k&R{l9K_yjd`jSm<96w+8zoWxzA?T2MobE4RVm#qizU~5DnRdD zl6#LYhRWevNz48@Y|&()k69Ss{Z#VqK0iK*GG;hReOD0vFBu9;9jpQdEhnOFB(y*| z&-N}^uxB_wwY~<;g?cWbG@zE7_^lYmxe<*mv~I@LIxk|AvYLFJL-x_zN*ruZt51)n zt2W3|Ycz%FjM1*<)Nb_zfXf{Z-TPxnSow!g0vpw5L&=uDjHse;r>Evu8?6$V3U@R; z9O_BphBIQE#Lt0}Kgd?Y8_6_6;i*s!89$20+dbFYywDPy^IfPKb#9x*Gcs&~1?hXm z6(sfJfLHPB<(C5W!}Dm!v|t;JicqVG^w$UqhY*UGW};uVIbw5Tk7$xEn%$S8I5GRo z5M8%|8b}8u8Q7zI|C<1mOQ68~PRUx5rJl*sBXRU8wI$~k=s;`LkM`slATs1>ruW@T zq+SUD;_zC0_dmRn%p1w(Mnld%o=h#%68PptVpIx zTp|03+b*7se}DhPiR`HG&-=a=CKll{_Q6_?~T1j+c zc~}%JqRRg5=Dt6#<{%HE&L!Z8l`B?q`SCDCtPtbJWDPy*pVO*ZF&RDz@r=aMF2 zs&R;oRmY~B|H4r%^>F-spo_uohMS-oZpzr7hfiLwGb{y8{5CJ4Z`oAUM4)i_@X66*$f&SUWS) z_1kJqT9cjYev+lS--mUW!%WLttgz>j(n_lgQs))Rbg7Mq{I$TK$qn^BK%FB08%VAB z_-^q2Vl#n~Q+tsX<<9Qc`U|bUYlw?Zd~)xlZJmUpZCDbX15L0yKJl)fD;9kn65}#% z$MxkrakjREP@Z%}05abte_rxFKA&WlT z1-WuYUrH!Fv~u##DH{U&q7Nt*=R{rc07`m;WOME}$khL^&MY=H6RJbnf}%y%$qB+I zQ{zDmEP7|DKF?5M4+Hi=Iu zPM@Tj`UupRg(MyQY2LX$&RH}nbaZ-3D|<>z5-plCuHvCI%w=s{dL}NGl+~y=R21o= zjTTTz_p1HeYrhkvZGgM@_w#?jLEkUB@MH(^BqaYG$L~*8W%GBSO<@8D`&fPtMnxmx zJ+SpYy8UWFS9|smk|M_Z0D>nQ!PQ%g=fXwC3j$u)fm_0flwQYcy5c0=% z&KjoBIrMC!b1!x#Ft|X*NQ=XJPz$z2dB9-|FI)**5*Zp zoKq)`H)>W){NsK;c2ngy3Q;z)& zA|!CwC(X#vOHXPFd>aek>)71XlF9XxNjtQpX*@9@a|+e zJTB9)crc_UY-exyTD7e!`TrvnP~?^e-Mz+YnlY}vxpCYO(|)=V<(b@#YamA6Q=`@V zRY1h5;+zR^*Chg(e}2kxeyUC}Ec+N}nYv11 zZ*>#~K6fM&!URucP8x)wx2?!O+x8iZ6LdcCSHCKe@zUw#wnrE7sp-;X_ThFliJvX| zXIK*wiTFte9PVF9GWv!FocutvcQp8z;B!I`*=FrTlGIye(Cw-X2JzubCf=eO5bQQa zL_ob}+ZO6|=T_Mz0QnJJXm z++q}Grv!ErUV#ku{giK##?}%aW3@x5A@+%DUFnGp64J|?prY3sbrhhnV=-=NFVI5L z2PA|AIoKg`Bwx&ic(N*F)Z3p#9DDlMV`4xtbUufGj~!%9A2FQ;ge3l5BK^kxhkgRm;0)l z-a#gKiyfMegJ4LE!~{!W)@l?_R$~RDmFH)vbhj?^?4xJo@>!bn!q$pc2Z8#@H>6?~ z?GW3cfmu&Bd(@N2>q3}g8rOOr@;mE)#qaa>oro|C+Q%xeQXoNT7-S|z1v)X75oUp5Ke78P%6KEhkv3DoT|22V4F4{vOV@YXzc39|77h?F1 zmmDsfTOO(Y&AWvaSbN&&vlb&MEUU|e-rbA53OUM7d_i$Wxyh7{e6S4}AMb>7fWl5c*6%L)H4z4Y)u7EG+95YF&wjVX>vM>Janz} za2o7aJ`?>TE**G5oL;ffo2B|dQ)vci;kiK@4Sqr&pE)WDaFB~G3v2EvKkA>j+rR$| zK3T38dRbR%NyD(*OHiNR|9b)F{&uvdCX}RZY?#@cb&L8|>a0$@k=kU+dAw~YsSKaB z@UJFHO3wFg1WfN$v|eQJ>6WRE7fDQIaf^N;PYp}zkA73DUpspr!TS<_Ub_hUmh_4T z^jY%snS9~1i0FawY%%IJy@>MV4+%PZw#77U_5ME>n7p06W4;bEo#)``T>T5+k9&Kw zcNe~$N>if5bte}c%VPK5en+iMcRJT-68q2tu4Un-1rgs03e^f|!2aF+S?x40p5E)rOsE*VwIN0x!Iuvt^H+8LC#iF+%!-I~wF~FE z4+e+z5)UdDgNK+Bl4&jW-sfYupm+CYy*<`swG-JWE8>qcS05kCCdn9m0(U8p?gCme9VSP zJF_FngtE@pyWjCc9P>8ITv{sweuf;i7M%Y;_1vPvl8|s$#!SsRqI|oz@x1oQP#+f_ zb~BaIgQJB;a!qT&p-01Zw}J+qpjmoG21$ri-;<%KbS{|v+PAQq_hBYM74h1>6M7YJ)y&`??sJ91Pdi6oxFz6v}N*?E(m zqZBX5zeUALkSj#Q$6eq(Ic>GM`IZj925QJ&3B0U5nKRL(wVBN{dKqQ#^A90)BPNV- zz8+gy?03-0Vqg=IYE%pd%C+ox1q7J!l_z?TPxf`fIOuPC6%S_<)W1224ZK07|$N#*v2C7t0FP;{?5_cf%hxZd;{zl_Nuy%Y|q})M(0ohP5esB7kwRvhtYD1$Racg8pQDzy#AwNG(=w=QT}^sPacE%cPj^j8qS=emB0&-6}=BS|N! z_c2-&BZRdhnIoSj##D*1{W~B-}@qf-rZATB<8+Fof6>f zQCPYKVMT0d_tMh8)}~kgv-*lUIqA)$eN6+gfHu=xD%v)!svD&(GOFv&9~(hNEk55H z+uc!v68qe-)Nmt@zuIFP+0WsqZQ`||SaHk-+Vd^Fe_FBHE7xbDT5=jbff@@+(pC~H za1Qj>I@sJ=9L`uk!g{`YLoOuV;G?w4)EruCp7m0+&$fYJl zj|EN_beEARFD=yC^Tl&m%ikyh`&QrtHg_Vg$EcV4PDNr2 zIW(OXj+e?{10AV^#Z-L;522{w(FP7kPzy1P=Cw-voixD6v#V*K>#d6^iwI6IeqEaG znv~nC9W2qUqBW zHV1QRDf4=KS3*8VTY$5dWAH*{9Frxvzv|Hrm9cjG_ED?B`LMqX4(Gg2uW_G|gW~>K zp)d-a{n*uY?xVjRHvA<#`u^HT&`?2PyGM-J{I6HnmH%epg>;As8T;9DR6lZ*Kb-h< zKl3h~dTmr(gxxGU^!nEq>4!+OmAb07r*iMUJz*X4j~Mq(gh^@8U)Ga1O3gpGrNOX4 zrU&!4AL($?QP!o36bFItc7XZke7qFpUd|J~&+8J?EMXQ)@j)<-`7G%TR)|#&;(Bel z9}m?Si%?NxWwy!C*XeUQd!omB)I`N)h*y&4D#92)L z%(FOb3*(@}szwvQ%(qxmo(I_3cBw3(Jo!FSBqNyEmzk&PiUd?iC4#Bf1jhUGO6WPB z5&0GE365(T*Ed75hE~_5wI$r1fF8b0Vycf%Y@Jlb%$}D%izxe)#H&-tX;mh+pSwwL zj};gl*@#%uW#7k1ZG!}?M^a-b&NU*z^*6E1gcv^&8VK~p(;KK9d!8sAaK zUzqx7ae4vzPEItWdc&^xFbzbqPlNO<_1@@r-n)(maqx|xQYF}x`*VmW`LQRGTS|0} zQOctk#QsMA%?VHWZ)#PPU&y^XY`_e9PxI!r0xJBUTI4zNf!}f2p%OF-*1qpK3`-z* zwbXPYb0VM0<&b - + @@ -10,37 +10,44 @@ + - + + + + + + + @@ -64,4 +71,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/Subsurface/Content/Items/Clothes/clothes.xml b/Subsurface/Content/Items/Clothes/clothes.xml index 9586f6b69..27f4328e0 100644 --- a/Subsurface/Content/Items/Clothes/clothes.xml +++ b/Subsurface/Content/Items/Clothes/clothes.xml @@ -4,7 +4,7 @@ pickdistance="150" tags="smallitem"> - + @@ -18,7 +18,7 @@ pickdistance="150" tags="smallitem"> - + @@ -38,7 +38,7 @@ pickdistance="150" tags="smallitem"> - + @@ -57,7 +57,7 @@ pickdistance="150" tags="smallitem"> - + @@ -73,7 +73,7 @@ pickdistance="150" tags="smallitem"> - + @@ -82,5 +82,28 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/Subsurface/Content/Items/Clothes/engigear.png b/Subsurface/Content/Items/Clothes/engigear.png new file mode 100644 index 0000000000000000000000000000000000000000..11ac9854a2a2e1ff46b5893b2a11ca1781982e16 GIT binary patch literal 12890 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 vd_S - + @@ -129,7 +129,7 @@ linkable="true" price="10"> - + @@ -155,7 +155,7 @@ linkable="true" price="10"> - + @@ -182,11 +182,11 @@ linkable="true" price="10"> - + - + @@ -199,6 +199,30 @@ + + + + + + + + + + + + + + + + + + - + @@ -233,7 +257,7 @@ linkable="true" price="10"> - + @@ -258,7 +282,7 @@ linkable="true" price="20"> - + diff --git a/Subsurface/Content/Particles/ParticlePrefabs.xml b/Subsurface/Content/Particles/ParticlePrefabs.xml index 86b65da6a..e89939ca4 100644 --- a/Subsurface/Content/Particles/ParticlePrefabs.xml +++ b/Subsurface/Content/Particles/ParticlePrefabs.xml @@ -86,6 +86,7 @@ growtime ="0.1" deleteoncollision="true" rotatetodirection="true" + blendstate="additive" velocitychange="0.0, -5.0"> @@ -102,6 +103,35 @@ + + + + + + + + + @@ -123,6 +154,7 @@ colorchange="0.0, 0.0, 0.0, -4.0" lifetime="0.25" drawtarget="both" + blendstate="additive" velocitychange="0.0, 0.0"> @@ -134,6 +166,7 @@ colorchange="0.0, 0.0, 0.0, -4.0" lifetime="0.25" drawtarget="both" + blendstate="additive" velocitychange="0.0, 0.0"> diff --git a/Subsurface/Content/Particles/fire.png b/Subsurface/Content/Particles/fire.png new file mode 100644 index 0000000000000000000000000000000000000000..4675dd8d1c2c9b2cc9508d97803ad5cbae87d535 GIT binary patch literal 24784 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 literal 0 HcmV?d00001 diff --git a/Subsurface/Source/Characters/AI/EnemyAIController.cs b/Subsurface/Source/Characters/AI/EnemyAIController.cs index 9206871df..87ec7a3b8 100644 --- a/Subsurface/Source/Characters/AI/EnemyAIController.cs +++ b/Subsurface/Source/Characters/AI/EnemyAIController.cs @@ -37,13 +37,13 @@ namespace Barotrauma //the duration is determined by the attackDuration of the attacking limb private float attackTimer; - //a "cooldown time" after an attack during which the character doesn't try to attack again + //a "cooldown time" after an attack during which the Character doesn't try to attack again private float attackCoolDown; private float coolDownTimer; - //a point in a wall which the character is currently targeting + //a point in a wall which the Character is currently targeting private Vector2 wallAttackPos; - //the entity (a wall) which the character is targeting + //the entity (a wall) which the Character is targeting private IDamageable targetEntity; //the limb selected for the current attack @@ -226,7 +226,7 @@ namespace Barotrauma private void GetTargetEntity() { targetEntity = null; - //check if there's a wall between the target and the character + //check if there's a wall between the target and the Character Vector2 rayStart = Character.AnimController.Limbs[0].SimPosition; Vector2 rayEnd = selectedAiTarget.Position; Body closestBody = Submarine.CheckVisibility(rayStart, rayEnd); @@ -313,7 +313,7 @@ namespace Barotrauma } else { - //limb.body.ApplyTorque(limb.Mass * -20.0f * character.animController.Dir * dir); + //limb.body.ApplyTorque(limb.Mass * -20.0f * Character.animController.Dir * dir); } Vector2 diff = attackPosition - limb.SimPosition; @@ -341,7 +341,7 @@ namespace Barotrauma } //goes through all the AItargets, evaluates how preferable it is to attack the target, - //whether the character can see/hear the target and chooses the most preferable target within + //whether the Character can see/hear the target and chooses the most preferable target within //sight/hearing range public void UpdateTargets(Character character) { @@ -370,7 +370,7 @@ namespace Barotrauma Character targetCharacter = target.Entity as Character; - //ignore the aitarget if it is the character itself + //ignore the aitarget if it is the Character itself if (targetCharacter == character) continue; if (targetCharacter!=null) @@ -381,7 +381,7 @@ namespace Barotrauma } else if (target.Entity!=null && attackRooms!=0.0f) { - //skip the target if it's the room the character is inside of + //skip the target if it's the room the Character is inside of if (character.AnimController.CurrentHull != null && character.AnimController.CurrentHull == target.Entity as Hull) continue; valueModifier = attackRooms; @@ -407,7 +407,7 @@ namespace Barotrauma //if (targetCharacter != null) //{ - // //if target is a character that isn't visible, ignore + // //if target is a Character that isn't visible, ignore // if (closestStructure != null) continue; // //prefer targets with low health @@ -542,11 +542,6 @@ namespace Barotrauma AiState newState = AiState.None; Vector2 newWallAttackPos = Vector2.Zero; float wanderAngle; - float updateTargetsTimer, raycastTimer, coolDownTimer; - - Vector2 newVelocity = Vector2.Zero; - - Vector2 targetPosition = Vector2.Zero; ushort targetID; @@ -590,10 +585,10 @@ namespace Barotrauma } } - //the "memory" of the character + //the "memory" of the Character //keeps track of how preferable it is to attack a specific target - //(if the character can't inflict much damage the target, the priority decreases - //and if the target attacks the character, the priority increases) + //(if the Character can't inflict much damage the target, the priority decreases + //and if the target attacks the Character, the priority increases) class AITargetMemory { //private AITarget target; diff --git a/Subsurface/Source/Characters/AI/PathFinder.cs b/Subsurface/Source/Characters/AI/PathFinder.cs index 3172407ab..692b83e3c 100644 --- a/Subsurface/Source/Characters/AI/PathFinder.cs +++ b/Subsurface/Source/Characters/AI/PathFinder.cs @@ -141,7 +141,7 @@ namespace Barotrauma if (startNode==null || endNode==null) { DebugConsole.ThrowError("Pathfinding error, couldn't find matching pathnodes to waypoints"); - return new SteeringPath();; + return new SteeringPath(); } } diff --git a/Subsurface/Source/Characters/AnimController.cs b/Subsurface/Source/Characters/AnimController.cs index 326321440..2c6b911b6 100644 --- a/Subsurface/Source/Characters/AnimController.cs +++ b/Subsurface/Source/Characters/AnimController.cs @@ -17,7 +17,7 @@ namespace Barotrauma protected float walkSpeed, swimSpeed; - //how large impacts the character can take before being stunned + //how large impacts the Character can take before being stunned //protected float impactTolerance; protected float stunTimer; diff --git a/Subsurface/Source/Characters/BackgroundSprite/BackgroundSpriteManager.cs b/Subsurface/Source/Characters/BackgroundSprite/BackgroundSpriteManager.cs index 0f6dbe27b..410b119c2 100644 --- a/Subsurface/Source/Characters/BackgroundSprite/BackgroundSpriteManager.cs +++ b/Subsurface/Source/Characters/BackgroundSprite/BackgroundSpriteManager.cs @@ -25,7 +25,7 @@ namespace Barotrauma prefabs = new List(); XDocument doc = ToolBox.TryLoadXml(configPath); - if (doc == null) return; + if (doc == null || doc.Root == null) return; foreach (XElement element in doc.Root.Elements()) { @@ -78,7 +78,7 @@ namespace Barotrauma } if (amount > 0) { - Swarm swarm = new Swarm(swarmMembers, prefab.SwarmRadius); + new Swarm(swarmMembers, prefab.SwarmRadius); } } } diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index c3a62accf..ab78afe27 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -5,12 +5,10 @@ using FarseerPhysics.Dynamics.Joints; using Lidgren.Network; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; -using Microsoft.Xna.Framework.Input; using Barotrauma.Networking; using Barotrauma.Particles; using System; using System.Collections.Generic; -using System.Diagnostics; using System.Linq; using System.Xml.Linq; @@ -27,7 +25,7 @@ namespace Barotrauma public static bool DisableControls; - //the character that the player is currently controlling + //the Character that the player is currently controlling private static Character controlled; public static Character Controlled @@ -43,7 +41,6 @@ namespace Barotrauma } public readonly bool IsNetworkPlayer; - private int importantUpdateTimer; private CharacterInventory inventory; @@ -116,7 +113,7 @@ namespace Barotrauma { get { - return (info != null && !string.IsNullOrWhiteSpace(info.Name)) ? info.Name : SpeciesName; + return info != null && !string.IsNullOrWhiteSpace(info.Name) ? info.Name : SpeciesName; } } @@ -334,7 +331,7 @@ namespace Barotrauma Info = characterInfo==null ? new CharacterInfo(file) : characterInfo; XDocument doc = ToolBox.TryLoadXml(file); - if (doc == null) return; + if (doc == null || doc.Root == null) return; SpeciesName = ToolBox.GetAttributeString(doc.Root, "name", "Unknown"); @@ -516,7 +513,7 @@ namespace Barotrauma if (IsKeyDown(InputType.Down)) targetMovement.Y -= 1.0f; //the vertical component is only used for falling through platforms and climbing ladders when not in water, - //so the movement can't be normalized or the character would walk slower when pressing down/up + //so the movement can't be normalized or the Character would walk slower when pressing down/up if (AnimController.InWater) { float length = targetMovement.Length(); @@ -693,7 +690,7 @@ namespace Barotrauma } /// - /// Control the character according to player input + /// Control the Character according to player input /// public void ControlLocalPlayer(float deltaTime, Camera cam, bool moveCam = true) { @@ -753,7 +750,7 @@ namespace Barotrauma } - //find the closest item if selectkey has been hit, or if the character is being + //find the closest item if selectkey has been hit, or if the Character is being //controlled by the player (in order to highlight it) if (findClosestTimer <= 0.0f || Screen.Selected == GameMain.EditMapScreen) @@ -921,13 +918,13 @@ namespace Barotrauma aiTarget.SightRange = 0.0f; - //distance is approximated based on the mass of the character + //distance is approximated based on the mass of the Character //(which corresponds to size because all the characters have the same limb density) foreach (Limb limb in AnimController.Limbs) { aiTarget.SightRange += limb.Mass * 1000.0f; } - //the faster the character is moving, the easier it is to see it + //the faster the Character is moving, the easier it is to see it Limb torso = AnimController.GetLimb(LimbType.Torso); if (torso !=null) { @@ -1060,6 +1057,8 @@ namespace Barotrauma foreach (Limb limb in AnimController.Limbs) { + limb.AddDamage(limb.SimPosition, DamageType.Blunt, 500.0f, 0.0f, false); + Vector2 diff = centerOfMass - limb.SimPosition; if (diff == Vector2.Zero) continue; limb.body.ApplyLinearImpulse(diff * 10.0f); @@ -1138,7 +1137,7 @@ namespace Barotrauma if (GameMain.NetworkMember != null) { - //if the character is controlled by this client/server, let others know that the character has died + //if the Character is controlled by this client/server, let others know that the Character has died if (Character.controlled == this) { string chatMessage = "You have " + DeathMsg[(int)causeOfDeath] + "."; @@ -1149,12 +1148,12 @@ namespace Barotrauma new NetworkEvent(NetworkEventType.KillCharacter, ID, true, causeOfDeath); } - //if it's an ai character, only let the server kill it + //if it's an ai Character, only let the server kill it else if (GameMain.Server != null && this is AICharacter) { new NetworkEvent(NetworkEventType.KillCharacter, ID, true, causeOfDeath); } - //otherwise don't kill the character unless received a message about the character dying + //otherwise don't kill the Character unless received a message about the Character dying else if (!isNetworkMessage) { return; @@ -1350,9 +1349,9 @@ namespace Barotrauma case NetworkEventType.KillCharacter: if (GameMain.Server != null) { - Client sender =GameMain.Server.connectedClients.Find(c => c.Connection == message.SenderConnection); - if (sender ==null || sender.character != this) - throw new Exception("Received a KillCharacter message from someone else than the client controlling the character!"); + Client sender =GameMain.Server.ConnectedClients.Find(c => c.Connection == message.SenderConnection); + if (sender ==null || sender.Character != this) + throw new Exception("Received a KillCharacter message from someone else than the client controlling the Character!"); } CauseOfDeath causeOfDeath = CauseOfDeath.Damage; @@ -1505,7 +1504,7 @@ namespace Barotrauma catch { - //failed to read position, character may be further than NetConfig.CharacterIgnoreDistance + //failed to read position, Character may be further than NetConfig.CharacterIgnoreDistance pos = SimPosition; } diff --git a/Subsurface/Source/Characters/CharacterHUD.cs b/Subsurface/Source/Characters/CharacterHUD.cs index b718da8cb..d57d1e94c 100644 --- a/Subsurface/Source/Characters/CharacterHUD.cs +++ b/Subsurface/Source/Characters/CharacterHUD.cs @@ -45,8 +45,6 @@ namespace Barotrauma if (character.Inventory != null) character.Inventory.DrawOwn(spriteBatch); - Color color = Color.Orange; - if (character.SelectedCharacter != null && character.SelectedCharacter.Inventory!=null) { character.SelectedCharacter.Inventory.Draw(spriteBatch); diff --git a/Subsurface/Source/Characters/CharacterInfo.cs b/Subsurface/Source/Characters/CharacterInfo.cs index 1ee00a41e..297d8c7b5 100644 --- a/Subsurface/Source/Characters/CharacterInfo.cs +++ b/Subsurface/Source/Characters/CharacterInfo.cs @@ -274,7 +274,7 @@ namespace Barotrauma public virtual XElement Save(XElement parentElement) { - XElement charElement = new XElement("character"); + XElement charElement = new XElement("Character"); charElement.Add( new XAttribute("name", Name), diff --git a/Subsurface/Source/Characters/FishAnimController.cs b/Subsurface/Source/Characters/FishAnimController.cs index c27c42c37..333c27fb3 100644 --- a/Subsurface/Source/Characters/FishAnimController.cs +++ b/Subsurface/Source/Characters/FishAnimController.cs @@ -178,7 +178,7 @@ namespace Barotrauma //headMovement *= movement.Length(); //the movement angle is between direction of the head and the direction - //where the character is actually trying to go + //where the Character is actually trying to go //current * (float)alpha + previous * (1.0f - (float)alpha); diff --git a/Subsurface/Source/Characters/HumanoidAnimController.cs b/Subsurface/Source/Characters/HumanoidAnimController.cs index 8989b719d..23f622cc1 100644 --- a/Subsurface/Source/Characters/HumanoidAnimController.cs +++ b/Subsurface/Source/Characters/HumanoidAnimController.cs @@ -685,7 +685,7 @@ namespace Barotrauma leftLeg.body.ApplyTorque(Dir * -8.0f); rightLeg.body.ApplyTorque(Dir * -8.0f); - //apply forces to the head and the torso to move the character up/down + //apply forces to the head and the torso to move the Character up/down float movementFactor = (handPos.Y / stepHeight) * (float)Math.PI; movementFactor = 0.8f + (float)Math.Abs(Math.Sin(movementFactor)); @@ -727,7 +727,7 @@ namespace Barotrauma // Limb rightHand = GetLimb(LimbType.RightHand); // Limb head = GetLimb(LimbType.Head); - // Vector2 diff = Vector2.Normalize(character.CursorPosition - RefLimb.Position); + // Vector2 diff = Vector2.Normalize(Character.CursorPosition - RefLimb.Position); // rightHand.body.ApplyLinearImpulse(diff * 20.0f); // head.body.ApplyLinearImpulse(diff * 5.0f); @@ -863,8 +863,6 @@ namespace Barotrauma transformedHoldPos += Vector2.Transform(itemPos, torsoTransform); } - Vector2 bodyVelocity = torso.body.LinearVelocity / 60.0f; - item.body.ResetDynamics(); Vector2 currItemPos = (character.SelectedItems[0]==item) ? diff --git a/Subsurface/Source/Characters/Jobs/JobPrefab.cs b/Subsurface/Source/Characters/Jobs/JobPrefab.cs index 01a4c8600..677635c36 100644 --- a/Subsurface/Source/Characters/Jobs/JobPrefab.cs +++ b/Subsurface/Source/Characters/Jobs/JobPrefab.cs @@ -29,7 +29,7 @@ namespace Barotrauma private set; } - //names of the items the character spawns with + //names of the items the Character spawns with public List ItemNames; public List EquipItem; diff --git a/Subsurface/Source/Characters/Limb.cs b/Subsurface/Source/Characters/Limb.cs index 5c0abc64a..1a26e55b4 100644 --- a/Subsurface/Source/Characters/Limb.cs +++ b/Subsurface/Source/Characters/Limb.cs @@ -34,7 +34,7 @@ namespace Barotrauma protected readonly Vector2 stepOffset; - public Sprite sprite; + public Sprite sprite, damagedSprite; public bool inWater; @@ -50,6 +50,8 @@ namespace Barotrauma public readonly float impactTolerance; + private float damage; + private readonly Vector2 armorSector; private readonly float armorValue; @@ -142,7 +144,7 @@ namespace Barotrauma // set // { // damage = Math.Max(value, 0.0f); - // if (damage >=maxHealth) character.Kill(); + // if (damage >=maxHealth) Character.Kill(); // } //} @@ -246,7 +248,7 @@ namespace Barotrauma foreach (XElement subElement in element.Elements()) { - switch (subElement.Name.ToString()) + switch (subElement.Name.ToString().ToLower()) { case "sprite": string spritePath = subElement.Attribute("texture").Value; @@ -260,6 +262,18 @@ namespace Barotrauma sprite = new Sprite(subElement, "", spritePath); break; + case "damagedsprite": + string damagedSpritePath = subElement.Attribute("texture").Value; + + if (character.Info != null) + { + damagedSpritePath = damagedSpritePath.Replace("[GENDER]", (character.Info.Gender == Gender.Female) ? "f" : ""); + damagedSpritePath = damagedSpritePath.Replace("[HEADID]", character.Info.HeadSpriteId.ToString()); + } + + + damagedSprite = new Sprite(subElement, "", damagedSpritePath); + break; case "attack": attack = new Attack(subElement); break; @@ -313,10 +327,9 @@ namespace Barotrauma damageSoundType = DamageSoundType.LimbArmor; amount = Math.Max(0.0f, amount - totalArmorValue); - bleedingAmount = Math.Max(0.0f, bleedingAmount - totalArmorValue); ; + bleedingAmount = Math.Max(0.0f, bleedingAmount - totalArmorValue); } - if (playSound) { SoundPlayer.PlayDamageSound(damageSoundType, amount, ConvertUnits.ToDisplayUnits(simPosition)); @@ -342,6 +355,9 @@ namespace Barotrauma GameMain.ParticleManager.CreateParticle("waterblood", Position, Vector2.Zero); } + damage += Math.Max(amount,bleedingAmount) / character.MaxHealth * 100.0f; + + return new AttackResult(amount, bleedingAmount, hitArmor); } @@ -362,6 +378,9 @@ namespace Barotrauma public void Update(float deltaTime) { + + if (!character.IsDead) damage = Math.Max(0.0f, damage-deltaTime*0.1f); + if (LinearVelocity.X>100.0f) { //DebugConsole.ThrowError("CHARACTER EXPLODED"); @@ -454,6 +473,19 @@ namespace Barotrauma 1.0f, spriteEffect, depth); } + if (damage>0.0f && damagedSprite!=null) + { + SpriteEffects spriteEffect = (dir == Direction.Right) ? SpriteEffects.None : SpriteEffects.FlipHorizontally; + + float depth = sprite.Depth - 0.0000015f; + + damagedSprite.Draw(spriteBatch, + new Vector2(body.DrawPosition.X, -body.DrawPosition.Y), + color*Math.Min(damage/50.0f,1.0f), sprite.origin, + -body.DrawRotation, + 1.0f, spriteEffect, depth); + } + if (!GameMain.DebugDraw) return; if (pullJoint!=null) diff --git a/Subsurface/Source/Characters/Ragdoll.cs b/Subsurface/Source/Characters/Ragdoll.cs index 7e17cf90b..d22e94010 100644 --- a/Subsurface/Source/Characters/Ragdoll.cs +++ b/Subsurface/Source/Characters/Ragdoll.cs @@ -41,7 +41,7 @@ namespace Barotrauma private Vector2 targetMovement; //a movement vector that overrides targetmovement if trying to steer - //a character to the position sent by server in multiplayer mode + //a Character to the position sent by server in multiplayer mode protected Vector2 correctionMovement; protected float floorY; @@ -616,7 +616,7 @@ namespace Barotrauma { //create a splash particle - Barotrauma.Particles.Particle splash = GameMain.ParticleManager.CreateParticle("watersplash", + GameMain.ParticleManager.CreateParticle("watersplash", new Vector2(limb.Position.X, limbHull.Surface), new Vector2(0.0f, Math.Abs(-limb.LinearVelocity.Y * 10.0f)), 0.0f); @@ -633,7 +633,7 @@ namespace Barotrauma - //if the character dropped into water, create a wave + //if the Character dropped into water, create a wave if (limb.LinearVelocity.Y<0.0f) { //1.0 when the limb is parallel to the surface of the water diff --git a/Subsurface/Source/Characters/StatusEffect.cs b/Subsurface/Source/Characters/StatusEffect.cs index 384c431e9..53e537572 100644 --- a/Subsurface/Source/Characters/StatusEffect.cs +++ b/Subsurface/Source/Characters/StatusEffect.cs @@ -162,9 +162,9 @@ namespace Barotrauma } - //public virtual void Apply(ActionType type, float deltaTime, Item item, Character character = null) + //public virtual void Apply(ActionType type, float deltaTime, Item item, Character Character = null) //{ - // if (this.type == type) Apply(deltaTime, character, item); + // if (this.type == type) Apply(deltaTime, Character, item); //} private bool HasRequiredItems(Entity entity) @@ -225,7 +225,7 @@ namespace Barotrauma } } - //protected virtual void Apply(float deltaTime, Character character, Item item) + //protected virtual void Apply(float deltaTime, Character Character, Item item) //{ // if (explosion != null) explosion.Explode(item.SimPosition); @@ -235,7 +235,7 @@ namespace Barotrauma // { // ObjectProperty property; - // if (character!=null && character.properties.TryGetValue(propertyNames[i], out property)) + // if (Character!=null && Character.properties.TryGetValue(propertyNames[i], out property)) // { // ApplyToProperty(property, propertyEffects[i], deltaTime); // } diff --git a/Subsurface/Source/ContentPackage.cs b/Subsurface/Source/ContentPackage.cs index 826a376a7..d923e6a9c 100644 --- a/Subsurface/Source/ContentPackage.cs +++ b/Subsurface/Source/ContentPackage.cs @@ -130,8 +130,6 @@ namespace Barotrauma private void CalculateHash() { - StringBuilder sb = new StringBuilder(); - List hashes = new List(); //foreach (ContentFile file in files) diff --git a/Subsurface/Source/DebugConsole.cs b/Subsurface/Source/DebugConsole.cs index 7502c5707..494f40452 100644 --- a/Subsurface/Source/DebugConsole.cs +++ b/Subsurface/Source/DebugConsole.cs @@ -167,8 +167,8 @@ namespace Barotrauma { SinglePlayerMode mode = GameMain.GameSession.gameMode as SinglePlayerMode; if (mode == null) break; - mode.CrewManager.AddCharacter(Character.Controlled); - mode.CrewManager.SelectCharacter(null, Character.Controlled); + GameMain.GameSession.CrewManager.AddCharacter(Character.Controlled); + GameMain.GameSession.CrewManager.SelectCharacter(null, Character.Controlled); } } else @@ -232,10 +232,12 @@ namespace Barotrauma break; case "editwater": case "water": - if (GameMain.Client== null) - { - Hull.EditWater = !Hull.EditWater; - } + if (GameMain.Client == null) Hull.EditWater = !Hull.EditWater; + + break; + case "fire": + if (GameMain.Client == null) Hull.EditFire = !Hull.EditFire; + break; case "generatelevel": GameMain.Level = new Level("asdf", 50.0f, 500,500, 50); diff --git a/Subsurface/Source/EventInput/EventInput.cs b/Subsurface/Source/EventInput/EventInput.cs index d6818366e..e28362515 100644 --- a/Subsurface/Source/EventInput/EventInput.cs +++ b/Subsurface/Source/EventInput/EventInput.cs @@ -101,7 +101,7 @@ namespace EventInput public static class EventInput { /// - /// Event raised when a character has been entered. + /// Event raised when a Character has been entered. /// public static event CharEnteredHandler CharEntered; diff --git a/Subsurface/Source/Events/Task.cs b/Subsurface/Source/Events/Task.cs index acea30f10..f146a0475 100644 --- a/Subsurface/Source/Events/Task.cs +++ b/Subsurface/Source/Events/Task.cs @@ -41,9 +41,9 @@ namespace Barotrauma public Task(float priority, string name) { - if (GameMain.GameSession==null || GameMain.GameSession.taskManager == null) return; + if (GameMain.GameSession==null || GameMain.GameSession.TaskManager == null) return; - taskManager = GameMain.GameSession.taskManager; + taskManager = GameMain.GameSession.TaskManager; musicType = "repair"; this.priority = priority; this.name = name; diff --git a/Subsurface/Source/GUI/GUITextBox.cs b/Subsurface/Source/GUI/GUITextBox.cs index cf31ade77..427faf303 100644 --- a/Subsurface/Source/GUI/GUITextBox.cs +++ b/Subsurface/Source/GUI/GUITextBox.cs @@ -85,9 +85,9 @@ namespace Barotrauma if (textBlock.Text != "") { - //if you attempt to display a character that is not in your font + //if you attempt to display a Character that is not in your font //you will get an exception, so we filter the characters - //remove the filtering if you're using a default character in your spritefont + //remove the filtering if you're using a default Character in your spritefont String filtered = ""; foreach (char c in value) { diff --git a/Subsurface/Source/GameSession/CargoManager.cs b/Subsurface/Source/GameSession/CargoManager.cs index 9167814ed..3e106d654 100644 --- a/Subsurface/Source/GameSession/CargoManager.cs +++ b/Subsurface/Source/GameSession/CargoManager.cs @@ -32,7 +32,7 @@ namespace Barotrauma Hull cargoRoom = Hull.FindHull(wp.Position); - if (wp == null) + if (cargoRoom == null) { DebugConsole.ThrowError("A waypoint marked as Cargo must be placed inside a room!"); return; @@ -44,7 +44,7 @@ namespace Barotrauma Rand.Range(cargoRoom.Rect.X + 20, cargoRoom.Rect.Right - 20), Rand.Range(cargoRoom.Rect.Y - cargoRoom.Rect.Height + 20.0f, cargoRoom.Rect.Y)); - new Item(prefab as ItemPrefab, wp.Position); + new Item(prefab as ItemPrefab, position); } purchasedItems.Clear(); diff --git a/Subsurface/Source/GameSession/CrewManager.cs b/Subsurface/Source/GameSession/CrewManager.cs index 67cd1b81f..279260332 100644 --- a/Subsurface/Source/GameSession/CrewManager.cs +++ b/Subsurface/Source/GameSession/CrewManager.cs @@ -20,6 +20,10 @@ namespace Barotrauma private GUIFrame guiFrame; private GUIListBox listBox; + private bool crewFrameOpen; + private GUIButton crewButton; + protected GUIFrame crewFrame; + public int Money { @@ -34,10 +38,13 @@ namespace Barotrauma guiFrame = new GUIFrame(new Rectangle(0, 50, 150, 450), Color.Transparent); - listBox = new GUIListBox(new Rectangle(0, 0, 150, 0), Color.Transparent, null, guiFrame); + listBox = new GUIListBox(new Rectangle(0, 30, 150, 0), Color.Transparent, null, guiFrame); listBox.ScrollBarEnabled = false; listBox.OnSelected = SelectCharacter; + crewButton = new GUIButton(new Rectangle(0, 00, 100, 20), "Crew", GUI.Style, guiFrame); + crewButton.OnClicked = ToggleCrewFrame; + money = 10000; } @@ -100,6 +107,8 @@ namespace Barotrauma public void Update(float deltaTime) { guiFrame.Update(deltaTime); + + if (crewFrameOpen) crewFrame.Update(deltaTime); } public void KillCharacter(Character killedCharacter) @@ -113,6 +122,71 @@ namespace Barotrauma //} } + + public void CreateCrewFrame(List crew) + { + int width = 600, height = 400; + + crewFrame = new GUIFrame(new Rectangle(GameMain.GraphicsWidth / 2 - width / 2, GameMain.GraphicsHeight / 2 - height / 2, width, height), GUI.Style); + crewFrame.Padding = new Vector4(10.0f, 10.0f, 10.0f, 10.0f); + + GUIListBox crewList = new GUIListBox(new Rectangle(0, 0, 280, 300), Color.White * 0.7f, GUI.Style, crewFrame); + crewList.Padding = new Vector4(10.0f, 10.0f, 10.0f, 10.0f); + crewList.OnSelected = SelectCrewCharacter; + + foreach (Character character in crew) + { + GUIFrame frame = new GUIFrame(new Rectangle(0, 0, 0, 40), Color.Transparent, null, crewList); + frame.UserData = character; + frame.Padding = new Vector4(5.0f, 5.0f, 5.0f, 5.0f); + frame.Color = (GameMain.NetworkMember != null && GameMain.NetworkMember.Character == character) ? Color.Gold * 0.2f : Color.Transparent; + frame.HoverColor = Color.LightGray * 0.5f; + frame.SelectedColor = Color.Gold * 0.5f; + + GUITextBlock textBlock = new GUITextBlock( + new Rectangle(40, 0, 0, 25), + character.Info.Name + " (" + character.Info.Job.Name + ")", + Color.Transparent, Color.White, + Alignment.Left, Alignment.Left, + null, frame); + textBlock.Padding = new Vector4(5.0f, 0.0f, 5.0f, 0.0f); + + new GUIImage(new Rectangle(-10, 0, 0, 0), character.AnimController.Limbs[0].sprite, Alignment.Left, frame); + } + + var closeButton = new GUIButton(new Rectangle(0, 0, 80, 20), "Close", Alignment.BottomCenter, GUI.Style, crewFrame); + closeButton.OnClicked = ToggleCrewFrame; + } + + protected virtual bool SelectCrewCharacter(GUIComponent component, object obj) + { + Character character = obj as Character; + if (character == null) return false; + + GUIComponent existingFrame = crewFrame.FindChild("selectedcharacter"); + if (existingFrame != null) crewFrame.RemoveChild(existingFrame); + + var previewPlayer = new GUIFrame( + new Rectangle(0, 0, 230, 300), + new Color(0.0f, 0.0f, 0.0f, 0.8f), Alignment.TopRight, GUI.Style, crewFrame); + previewPlayer.Padding = new Vector4(5.0f, 5.0f, 5.0f, 5.0f); + previewPlayer.UserData = "selectedcharacter"; + + character.Info.CreateInfoFrame(previewPlayer); + + if (GameMain.NetworkMember != null) GameMain.NetworkMember.SelectCrewCharacter(component, obj); + + return true; + } + + private bool ToggleCrewFrame(GUIButton button, object obj) + { + if (crewFrame == null) CreateCrewFrame(characters); + + crewFrameOpen = !crewFrameOpen; + return true; + } + public void StartShift() { listBox.ClearChildren(); @@ -161,6 +235,8 @@ namespace Barotrauma public void Draw(SpriteBatch spriteBatch) { guiFrame.Draw(spriteBatch); + + if (crewFrameOpen) crewFrame.Draw(spriteBatch); } public void Save(XElement parentElement) diff --git a/Subsurface/Source/GameSession/GameModes/GameMode.cs b/Subsurface/Source/GameSession/GameModes/GameMode.cs index 02e207d05..169d28285 100644 --- a/Subsurface/Source/GameSession/GameModes/GameMode.cs +++ b/Subsurface/Source/GameSession/GameModes/GameMode.cs @@ -47,6 +47,11 @@ namespace Barotrauma get { return endMessage; } } + public GameModePreset Preset + { + get { return preset; } + } + public GameMode(GameModePreset preset) { this.preset = preset; diff --git a/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs b/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs index 217b7e7a1..9b5e727af 100644 --- a/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs +++ b/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs @@ -12,7 +12,7 @@ namespace Barotrauma { //private const int StartCharacterAmount = 3; - public readonly CrewManager CrewManager; + //public readonly CrewManager CrewManager; //public readonly HireManager hireManager; private GUIButton endShiftButton; @@ -36,14 +36,18 @@ namespace Barotrauma public int Money { - get { return CrewManager.Money; } - set { CrewManager.Money = value; } + get { return GameMain.GameSession.CrewManager.Money; } + set { GameMain.GameSession.CrewManager.Money = value; } + } + + private CrewManager CrewManager + { + get { return GameMain.GameSession.CrewManager; } } public SinglePlayerMode(GameModePreset preset) : base(preset) { - CrewManager = new CrewManager(); CargoManager = new CargoManager(); @@ -86,7 +90,7 @@ namespace Barotrauma { if (subElement.Name.ToString().ToLower() != "crew") continue; - CrewManager = new CrewManager(subElement); + GameMain.GameSession.CrewManager = new CrewManager(subElement); } savedOnStart = true; diff --git a/Subsurface/Source/GameSession/GameModes/TutorialMode.cs b/Subsurface/Source/GameSession/GameModes/TutorialMode.cs index 80994a91a..415a456ac 100644 --- a/Subsurface/Source/GameSession/GameModes/TutorialMode.cs +++ b/Subsurface/Source/GameSession/GameModes/TutorialMode.cs @@ -23,7 +23,7 @@ namespace Barotrauma GameMain.GameSession.StartShift("tuto"); - GameMain.GameSession.taskManager.Tasks.Clear(); + GameMain.GameSession.TaskManager.Tasks.Clear(); GameMain.GameScreen.Select(); } @@ -255,7 +255,6 @@ namespace Barotrauma infoBox = CreateInfoFrame("You can see the equipped wire at the middle of the connection panel. Drag it to the power connector."); var steeringConnection = steering.Item.Connections.Find(c => c.Name.Contains("power")); - var junctionConnection = junctionBox.Item.Connections.Find(c => c.Name.Contains("power")); while (steeringConnection.Wires.FirstOrDefault(w => w != null) == null) { diff --git a/Subsurface/Source/GameSession/GameSession.cs b/Subsurface/Source/GameSession/GameSession.cs index 30d7433aa..ae784e255 100644 --- a/Subsurface/Source/GameSession/GameSession.cs +++ b/Subsurface/Source/GameSession/GameSession.cs @@ -12,23 +12,17 @@ namespace Barotrauma { class GameSession { - public readonly TaskManager taskManager; - - - //protected DateTime startTime; - //protected DateTime endTime; - - public readonly GameMode gameMode; + public readonly TaskManager TaskManager; + public readonly GameMode gameMode; + private GUIFrame guiRoot; - - //private GUIListBox chatBox; - //private GUITextBox textBox; - + private string saveFile; private Submarine submarine; + public CrewManager CrewManager; public Quest Quest { @@ -65,28 +59,29 @@ namespace Barotrauma get { return saveFile; } } - public GameSession(Submarine submarine, string saveFile, GameModePreset gameModePreset) - :this(submarine, saveFile, gameModePreset.Instantiate()) + public GameSession(Submarine submarine, string saveFile, GameModePreset gameModePreset = null) { + GameMain.GameSession = this; - } + CrewManager = new CrewManager(); - public GameSession(Submarine selectedSub, string saveFile, GameMode gameMode = null) - { - taskManager = new TaskManager(this); + TaskManager = new TaskManager(this); this.saveFile = saveFile; guiRoot = new GUIFrame(new Rectangle(0,0,GameMain.GraphicsWidth,GameMain.GraphicsWidth), Color.Transparent); - this.gameMode = gameMode; - this.submarine = selectedSub; - + if (gameModePreset!=null) this.gameMode = gameModePreset.Instantiate(); + this.submarine = submarine; } - + public GameSession(Submarine selectedSub, string saveFile, string filePath) : this(selectedSub, saveFile) { + GameMain.GameSession = this; + + CrewManager = new CrewManager(); + XDocument doc = ToolBox.TryLoadXml(filePath); if (doc == null) return; @@ -131,7 +126,7 @@ namespace Barotrauma if (gameMode!=null) gameMode.Start(); - taskManager.StartShift(level); + TaskManager.StartShift(level); } public void EndShift(string endMessage) @@ -149,7 +144,7 @@ namespace Barotrauma GameMain.LobbyScreen.Select(); } - taskManager.EndShift(); + TaskManager.EndShift(); //gameMode.End(); //return true; @@ -158,9 +153,7 @@ namespace Barotrauma public void KillCharacter(Character character) { - SinglePlayerMode singlePlayerMode = gameMode as SinglePlayerMode; - if (singlePlayerMode == null) return; - singlePlayerMode.CrewManager.KillCharacter(character); + CrewManager.KillCharacter(character); } public bool LoadPrevious(GUIButton button, object obj) @@ -174,7 +167,7 @@ namespace Barotrauma public void Update(float deltaTime) { - taskManager.Update(deltaTime); + TaskManager.Update(deltaTime); guiRoot.Update(deltaTime); diff --git a/Subsurface/Source/Items/Components/Door.cs b/Subsurface/Source/Items/Components/Door.cs index 922236ad0..23b0a0604 100644 --- a/Subsurface/Source/Items/Components/Door.cs +++ b/Subsurface/Source/Items/Components/Door.cs @@ -336,7 +336,7 @@ namespace Barotrauma.Items.Components } //opening a partially stuck door makes it less stuck - if (isOpen) stuck = MathHelper.Clamp(stuck-30.0f, 0.0f, 100.0f); ; + if (isOpen) stuck = MathHelper.Clamp(stuck-30.0f, 0.0f, 100.0f); } } } diff --git a/Subsurface/Source/Items/Components/Holdable/Holdable.cs b/Subsurface/Source/Items/Components/Holdable/Holdable.cs index 6b2087ac9..e381d9b36 100644 --- a/Subsurface/Source/Items/Components/Holdable/Holdable.cs +++ b/Subsurface/Source/Items/Components/Holdable/Holdable.cs @@ -7,7 +7,7 @@ namespace Barotrauma.Items.Components { class Holdable : Pickable { - //the position(s) in the item that the character grabs + //the position(s) in the item that the Character grabs protected Vector2[] handlePos; private List prevRequiredItems; @@ -24,7 +24,7 @@ namespace Barotrauma.Items.Components private bool attachable, attached, attachedByDefault; private PhysicsBody body; - //the angle in which the character holds the item + //the angle in which the Character holds the item protected float holdAngle; [HasDefaultValue(false, true)] diff --git a/Subsurface/Source/Items/Components/Holdable/MeleeWeapon.cs b/Subsurface/Source/Items/Components/Holdable/MeleeWeapon.cs index 56d0b7f97..e4252a6cd 100644 --- a/Subsurface/Source/Items/Components/Holdable/MeleeWeapon.cs +++ b/Subsurface/Source/Items/Components/Holdable/MeleeWeapon.cs @@ -115,13 +115,11 @@ namespace Barotrauma.Items.Components AnimController ac = picker.AnimController; - Limb rightHand = ac.GetLimb(LimbType.RightHand); - if (!hitting) { if (picker.IsKeyDown(InputType.Aim)) { - hitPos = (float)System.Math.Min(hitPos+deltaTime*5.0f, MathHelper.Pi*0.7f); + hitPos = Math.Min(hitPos+deltaTime*5.0f, MathHelper.Pi*0.7f); ac.HoldItem(deltaTime, item, handlePos, new Vector2(0.6f, -0.1f), new Vector2(-0.3f, 0.2f), false, hitPos); } diff --git a/Subsurface/Source/Items/Components/Holdable/RepairTool.cs b/Subsurface/Source/Items/Components/Holdable/RepairTool.cs index e7a9c7e5b..05d4f12bf 100644 --- a/Subsurface/Source/Items/Components/Holdable/RepairTool.cs +++ b/Subsurface/Source/Items/Components/Holdable/RepairTool.cs @@ -104,7 +104,7 @@ namespace Barotrauma.Items.Components if (character == null) return false; if (!character.IsKeyDown(InputType.Aim)) return false; - //if (DoesUseFail(character)) return false; + //if (DoesUseFail(Character)) return false; IsActive = true; @@ -181,7 +181,7 @@ namespace Barotrauma.Items.Components //ApplyStatusEffects(ActionType.OnUse, 1.0f, null, targ); } - //if (character.SecondaryKeyDown.State) + //if (Character.SecondaryKeyDown.State) //{ // IPropertyObject propertyObject = targetBody.UserData as IPropertyObject; // if (propertyObject!=null) ApplyStatusEffects(ActionType.OnUse, 1.0f, item.SimPosition, propertyObject); diff --git a/Subsurface/Source/Items/Components/Holdable/Throwable.cs b/Subsurface/Source/Items/Components/Holdable/Throwable.cs index 814fe1c2b..70d1eddf3 100644 --- a/Subsurface/Source/Items/Components/Holdable/Throwable.cs +++ b/Subsurface/Source/Items/Components/Holdable/Throwable.cs @@ -30,18 +30,18 @@ namespace Barotrauma.Items.Components if (character == null) return false; if (!character.IsKeyDown(InputType.Aim) || throwing) return false; - //Vector2 diff = Vector2.Normalize(character.CursorPosition - character.AnimController.RefLimb.Position); + //Vector2 diff = Vector2.Normalize(Character.CursorPosition - Character.AnimController.RefLimb.Position); - //if (character.SelectedItems[1]==item) + //if (Character.SelectedItems[1]==item) //{ - // Limb leftHand = character.AnimController.GetLimb(LimbType.LeftHand); + // Limb leftHand = Character.AnimController.GetLimb(LimbType.LeftHand); // leftHand.body.ApplyLinearImpulse(diff * 20.0f); // leftHand.Disabled = true; //} - //if (character.SelectedItems[0] == item) + //if (Character.SelectedItems[0] == item) //{ - // Limb rightHand = character.AnimController.GetLimb(LimbType.RightHand); + // Limb rightHand = Character.AnimController.GetLimb(LimbType.RightHand); // rightHand.body.ApplyLinearImpulse(diff * 20.0f); // rightHand.Disabled = true; //} diff --git a/Subsurface/Source/Items/Components/ItemComponent.cs b/Subsurface/Source/Items/Components/ItemComponent.cs index 15d47344d..d60813aaf 100644 --- a/Subsurface/Source/Items/Components/ItemComponent.cs +++ b/Subsurface/Source/Items/Components/ItemComponent.cs @@ -373,7 +373,7 @@ namespace Barotrauma.Items.Components public virtual void Move(Vector2 amount) { } - /// a character has picked the item + /// a Character has picked the item public virtual bool Pick(Character picker) { return false; @@ -384,7 +384,7 @@ namespace Barotrauma.Items.Components return CanBeSelected; } - /// a character has dropped the item + /// a Character has dropped the item public virtual void Drop(Character dropper) { } public virtual void Draw(SpriteBatch spriteBatch, bool editing = false) { } @@ -475,7 +475,7 @@ namespace Barotrauma.Items.Components } /// - /// Returns 0.0f-1.0f based on how well the character can use the itemcomponent + /// Returns 0.0f-1.0f based on how well the Character can use the itemcomponent /// /// 0.5f if all the skills meet the skill requirements exactly, 1.0f if they're way above and 0.0f if way less protected float DegreeOfSuccess(Character character) @@ -496,14 +496,14 @@ namespace Barotrauma.Items.Components return (average+100.0f)/2.0f; } - //public bool CheckFailure(Character character) + //public bool CheckFailure(Character Character) //{ // foreach (Skill skill in requiredSkills) // { - // int characterLevel = character.GetSkillLevel(skill.Name); + // int characterLevel = Character.GetSkillLevel(skill.Name); // if (characterLevel > skill.Level) continue; - // item.ApplyStatusEffects(ActionType.OnFailure, 1.0f, character); + // item.ApplyStatusEffects(ActionType.OnFailure, 1.0f, Character); // //Item.ApplyStatusEffects(); // return true; diff --git a/Subsurface/Source/Items/Components/Label.cs b/Subsurface/Source/Items/Components/Label.cs index 97e086077..1bd5363ab 100644 --- a/Subsurface/Source/Items/Components/Label.cs +++ b/Subsurface/Source/Items/Components/Label.cs @@ -30,7 +30,7 @@ // } -// public override bool Select(Character character) +// public override bool Select(Character Character) // { // if (textBox == null) // { @@ -47,10 +47,10 @@ // textBox.Select(); -// return base.Select(character); +// return base.Select(Character); // } -// public override void DrawHUD(SpriteBatch spriteBatch, Character character) +// public override void DrawHUD(SpriteBatch spriteBatch, Character Character) // { // //isActive = true; // GuiFrame.Update((float)Physics.step); @@ -61,7 +61,7 @@ // //int y = Game1.GraphicsHeight / 2 - height / 2 - 50; // //GUI.DrawRectangle(spriteBatch, new Rectangle(x, y, width, height), Color.Black, true); -// if (!textBox.Selected) character.SelectedConstruction = null; +// if (!textBox.Selected) Character.SelectedConstruction = null; // } // private bool TextChanged(GUITextBox textBox, string text) diff --git a/Subsurface/Source/Items/Components/Machines/OxygenGenerator.cs b/Subsurface/Source/Items/Components/Machines/OxygenGenerator.cs index 791ad8373..3c9834d64 100644 --- a/Subsurface/Source/Items/Components/Machines/OxygenGenerator.cs +++ b/Subsurface/Source/Items/Components/Machines/OxygenGenerator.cs @@ -42,8 +42,7 @@ namespace Barotrauma.Items.Components ventList = new List(); - item.linkedTo.CollectionChanged += delegate(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) - { GetVents(); }; + item.linkedTo.CollectionChanged += delegate { GetVents(); }; } public override void Update(float deltaTime, Camera cam) diff --git a/Subsurface/Source/Items/Components/Machines/Radar.cs b/Subsurface/Source/Items/Components/Machines/Radar.cs index e494a8a19..033db2468 100644 --- a/Subsurface/Source/Items/Components/Machines/Radar.cs +++ b/Subsurface/Source/Items/Components/Machines/Radar.cs @@ -78,9 +78,8 @@ namespace Barotrauma.Items.Components return (pingState > 1.0f); } - public override void DrawHUD(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch, Character character) + public override void DrawHUD(SpriteBatch spriteBatch, Character character) { - int width = GuiFrame.Rect.Width, height = GuiFrame.Rect.Height; int x = GuiFrame.Rect.X; int y = GuiFrame.Rect.Y; @@ -120,7 +119,6 @@ namespace Barotrauma.Items.Components if (Level.Loaded != null) { List cells = Level.Loaded.GetCells(-Level.Loaded.Position, 7); - Vector2 offset = Vector2.Zero; foreach (VoronoiCell cell in cells) { @@ -174,7 +172,6 @@ namespace Barotrauma.Items.Components end.Y = -end.Y; Vector2 diff = end - start; - Vector2 normalizedDiff = Vector2.Normalize(diff); for (float x = 0; x < diff.Length(); x+=4.0f ) { GUI.DrawLine(spriteBatch, center + start, center + end, Color.Green); diff --git a/Subsurface/Source/Items/Components/Power/PowerTransfer.cs b/Subsurface/Source/Items/Components/Power/PowerTransfer.cs index 22fdcfc64..9dbde12e1 100644 --- a/Subsurface/Source/Items/Components/Power/PowerTransfer.cs +++ b/Subsurface/Source/Items/Components/Power/PowerTransfer.cs @@ -141,7 +141,6 @@ namespace Barotrauma.Items.Components public override void DrawHUD(SpriteBatch spriteBatch, Character character) { - int width = GuiFrame.Rect.Width, height = GuiFrame.Rect.Height; int x = GuiFrame.Rect.X; int y = GuiFrame.Rect.Y; diff --git a/Subsurface/Source/Items/Components/Projectile.cs b/Subsurface/Source/Items/Components/Projectile.cs index 68057f21e..3489cba01 100644 --- a/Subsurface/Source/Items/Components/Projectile.cs +++ b/Subsurface/Source/Items/Components/Projectile.cs @@ -79,7 +79,7 @@ namespace Barotrauma.Items.Components { if (character != null && !characterUsable) return false; - //ApplyStatusEffects(ActionType.OnUse, 1.0f, character); + //ApplyStatusEffects(ActionType.OnUse, 1.0f, Character); Launch(new Vector2( (float)Math.Cos(item.body.Rotation), diff --git a/Subsurface/Source/Items/Components/Signal/Connection.cs b/Subsurface/Source/Items/Components/Signal/Connection.cs index 685197230..3b79d54c3 100644 --- a/Subsurface/Source/Items/Components/Signal/Connection.cs +++ b/Subsurface/Source/Items/Components/Signal/Connection.cs @@ -191,7 +191,7 @@ namespace Barotrauma.Items.Components bool mouseInRect = panelRect.Contains(PlayerInput.MousePosition); Wire equippedWire = null; - //if the character using the panel has a wire item equipped + //if the Character using the panel has a wire item equipped //and the wire hasn't been connected yet, draw it on the panel for (int i = 0; i < character.SelectedItems.Length; i++) { @@ -246,7 +246,7 @@ namespace Barotrauma.Items.Components } } - //if the character using the panel has a wire item equipped + //if the Character using the panel has a wire item equipped //and the wire hasn't been connected yet, draw it on the panel if (equippedWire!=null) { @@ -262,9 +262,9 @@ namespace Barotrauma.Items.Components } } - //for (int i = 0; i < character.SelectedItems.Length; i++ ) + //for (int i = 0; i < Character.SelectedItems.Length; i++ ) //{ - // Item selectedItem = character.SelectedItems[i]; + // Item selectedItem = Character.SelectedItems[i]; // if (selectedItem == null) continue; @@ -281,7 +281,7 @@ namespace Barotrauma.Items.Components if (!PlayerInput.LeftButtonDown()) { panel.Item.NewComponentEvent(panel, true, true); - //draggingConnected.Drop(character); + //draggingConnected.Drop(Character); draggingConnected = null; } } diff --git a/Subsurface/Source/Items/Components/Signal/WaterDetector.cs b/Subsurface/Source/Items/Components/Signal/WaterDetector.cs new file mode 100644 index 000000000..8aab2f40f --- /dev/null +++ b/Subsurface/Source/Items/Components/Signal/WaterDetector.cs @@ -0,0 +1,38 @@ +using System.Xml.Linq; + +namespace Barotrauma.Items.Components +{ + class WaterDetector : ItemComponent + { + private Hull hull; + + public WaterDetector(Item item, XElement element) + : base (item, element) + { + hull = Hull.FindHull(item.Position); + + IsActive = true; + } + + public override void OnMapLoaded() + { + hull = Hull.FindHull(item.Position); + } + + public override void Move(Microsoft.Xna.Framework.Vector2 amount) + { + hull = Hull.FindHull(item.Position); + } + + public override void Update(float deltaTime, Camera cam) + { + if (hull == null) return; + + float waterDepth = hull.Volume / hull.Size.X; + + bool underWater = (hull.Rect.Y-hull.Rect.Height + waterDepth)>item.Position.Y; + + item.SendSignal(underWater ? "1" : "0", "signal_out"); + } + } +} diff --git a/Subsurface/Source/Items/Components/Signal/Wire.cs b/Subsurface/Source/Items/Components/Signal/Wire.cs index 12b5b14b1..bf47d2c0c 100644 --- a/Subsurface/Source/Items/Components/Signal/Wire.cs +++ b/Subsurface/Source/Items/Components/Signal/Wire.cs @@ -41,7 +41,7 @@ namespace Barotrauma.Items.Components public override void Move(Vector2 amount) { - amount = FarseerPhysics.ConvertUnits.ToDisplayUnits(amount); + //amount = FarseerPhysics.ConvertUnits.ToDisplayUnits(amount); //for (int i = 0; iPosition of the character doing the pick, only items that are close enough to this are checked + /// Position of the Character doing the pick, only items that are close enough to this are checked /// the item closest to pickPosition is returned /// If a hull is specified, only items within that hull are checked public static Item FindPickable(Vector2 position, Vector2 pickPosition, Hull hull = null, Item[] ignoredItems=null) @@ -1171,7 +1171,7 @@ namespace Barotrauma Item item = new Item(rect, ip); item.ID = (ushort)int.Parse(element.Attribute("ID").Value); - item.linkedToID = new List(); + item.linkedToID = new List(); foreach (XAttribute attribute in element.Attributes()) { @@ -1198,7 +1198,7 @@ namespace Barotrauma string[] linkedToIds = linkedToString.Split(','); for (int i = 0; i Triggers; public string ConfigFile diff --git a/Subsurface/Source/Map/FireSource.cs b/Subsurface/Source/Map/FireSource.cs new file mode 100644 index 000000000..723576e36 --- /dev/null +++ b/Subsurface/Source/Map/FireSource.cs @@ -0,0 +1,186 @@ +using Barotrauma.Lights; +using Microsoft.Xna.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Barotrauma +{ + class FireSource + { + const float OxygenConsumption = 10.0f; + const float GrowSpeed = 5.0f; + + Hull hull; + + LightSource lightSource; + + Vector2 position; + Vector2 size; + + public Vector2 Size + { + get { return size; } + } + + public FireSource(Vector2 position) + { + hull = Hull.FindHull(position); + if (hull == null) return; + + lightSource = new LightSource(position, 50.0f, new Color(1.0f, 0.9f, 0.6f)); + + hull.AddFireSource(this); + + this.position = position - new Vector2(-5.0f, 5.0f); + + this.position.Y = hull.Rect.Y - hull.Rect.Height; + + size = new Vector2(10.0f, 10.0f); + } + + private void LimitSize() + { + position.X = Math.Max(hull.Rect.X, position.X); + position.Y = Math.Min(hull.Rect.Y, position.Y); + + size.X = Math.Min(hull.Rect.Width - (position.X - hull.Rect.X), size.X); + size.Y = Math.Min(hull.Rect.Height - (hull.Rect.Y - position.Y), size.Y); + } + + public static void UpdateAll(List fireSources, float deltaTime) + { + for (int i = fireSources.Count - 1; i >= 0; i--) + { + fireSources[i].Update(deltaTime); + } + + //combine overlapping fires + for (int i = fireSources.Count - 1; i >= 0; i--) + { + for (int j = i-1; j>=0 ; j--) + { + if (!fireSources[i].CheckOverLap(fireSources[j])) continue; + + fireSources[j].position.X = Math.Min(fireSources[i].position.X, fireSources[j].position.X); + + fireSources[j].size.X = + Math.Max(fireSources[i].position.X + fireSources[i].size.X, fireSources[j].position.X + fireSources[j].size.X) + - fireSources[j].position.X; + + fireSources[i].Remove(); + } + } + } + + private bool CheckOverLap(FireSource fireSource) + { + return !(position.X > fireSource.position.X + fireSource.size.X && + position.X + size.X < fireSource.position.X); + + + } + + public void Update(float deltaTime) + { + float count = Rand.Range(0.0f, (float)Math.Sqrt(size.X)/2.0f); + + for (int i = 0; i < count; i++ ) + { + float normalizedPos = 0.5f-(i / count); + + Vector2 spawnPos = new Vector2(position.X + Rand.Range(0.0f, size.X), Rand.Range(position.Y - size.Y, position.Y)+10.0f); + + Vector2 speed = new Vector2((spawnPos.X - (position.X + size.X/2.0f)), (float)Math.Sqrt(size.X)*Rand.Range(10.0f,15.0f)); + + var particle = GameMain.ParticleManager.CreateParticle("flame", + spawnPos, speed, 0.0f, hull); + + if (particle == null) continue; + + if (Rand.Int(20) == 1) particle.OnChangeHull = OnChangeHull; + + + particle.Size *= MathHelper.Clamp(size.X/100.0f * (hull.Oxygen/hull.FullVolume), 0.5f, 4.0f); + } + + DamageCharacters(deltaTime); + + if (hull.Volume > 0.0f) Extinquish(deltaTime); + + lightSource.Range = Math.Max(size.X, size.Y)*Rand.Range(8.0f, 10.0f)/2.0f; + lightSource.Color = new Color(1.0f, 0.9f, 0.6f) * Rand.Range(0.8f, 1.0f); + + hull.Oxygen -= size.X*deltaTime*OxygenConsumption; + + float growModifier = hull.OxygenPercentage < 20.0f ? hull.OxygenPercentage/20.0f : 1.0f; + + position.X -= GrowSpeed * growModifier * 0.5f * deltaTime; + //position.Y += GrowSpeed*0.5f * deltaTime; + + size.X += GrowSpeed * growModifier * deltaTime; + //size.Y += GrowSpeed * deltaTime; + + LimitSize(); + } + + private void OnChangeHull(Vector2 pos, Hull particleHull) + { + if (particleHull == hull || particleHull==null) return; + + if (particleHull.FireSources.Find(fs => pos.X > fs.position.X && pos.X < fs.position.X+fs.size.X)!=null) return; + + new FireSource(new Vector2(pos.X, particleHull.Rect.Y-particleHull.Rect.Height + 5.0f)); + } + + private void DamageCharacters(float deltaTime) + { + foreach (Character c in Character.CharacterList) + { + if (c.AnimController.CurrentHull == null) continue; + + float range = (float)Math.Sqrt(size.X) * 10.0f; + if (c.Position.X < position.X - range || c.Position.X > position.X + size.X + range) continue; + if (c.Position.Y < position.Y - size.Y || c.Position.Y > hull.Rect.Y) continue; + + c.Health -= (float)Math.Sqrt(size.X) * deltaTime; + } + } + + private void Extinquish(float deltaTime) + { + float extinquishAmount = Math.Min(hull.Volume / 100.0f, size.X); + + float steamCount = Rand.Range(-5.0f, (float)Math.Sqrt(extinquishAmount)); + + for (int i = 0; i < steamCount; i++) + { + Vector2 spawnPos = new Vector2(position.X + size.X * (i / steamCount) + Rand.Range(-5.0f, 5.0f), Rand.Range(position.Y - size.Y, position.Y) + 10.0f); + + Vector2 speed = new Vector2((spawnPos.X - (position.X + size.X / 2.0f)), (float)Math.Sqrt(size.X) * Rand.Range(20.0f, 25.0f)); + + var particle = GameMain.ParticleManager.CreateParticle("steam", + spawnPos, speed, 0.0f, hull); + + if (particle == null) continue; + + particle.Size *= MathHelper.Clamp(size.X / 10.0f, 0.5f, 3.0f); + } + + position.X += extinquishAmount * 0.1f / 2.0f; + size.X -= extinquishAmount * 0.1f; + + hull.Volume -= extinquishAmount; + + if (size.X < 1.0f) Remove(); + } + + public void Remove() + { + lightSource.Remove(); + + hull.RemoveFire(this); + } + } +} diff --git a/Subsurface/Source/Map/Gap.cs b/Subsurface/Source/Map/Gap.cs index 5f45e58d1..83e05e1f0 100644 --- a/Subsurface/Source/Map/Gap.cs +++ b/Subsurface/Source/Map/Gap.cs @@ -609,7 +609,7 @@ namespace Barotrauma Gap g = new Gap(rect); g.ID = (ushort)int.Parse(element.Attribute("ID").Value); - g.linkedToID = new List(); + g.linkedToID = new List(); //int i = 0; //while (element.Attribute("linkedto" + i) != null) //{ diff --git a/Subsurface/Source/Map/Hull.cs b/Subsurface/Source/Map/Hull.cs index 17447f643..3dcffaac1 100644 --- a/Subsurface/Source/Map/Hull.cs +++ b/Subsurface/Source/Map/Hull.cs @@ -15,9 +15,11 @@ namespace Barotrauma { public static List hullList = new List(); - public static bool EditWater; + public static bool EditWater, EditFire; public static WaterRenderer renderer; + + private List fireSources; public const float OxygenDistributionSpeed = 500.0f; public const float OxygenDetoriationSpeed = 0.3f; @@ -126,12 +128,19 @@ namespace Barotrauma get { return waveVel; } } + public List FireSources + { + get { return fireSources; } + } + public Hull(Rectangle rectangle) { rect = rectangle; OxygenPercentage = Rand.Range(90.0f, 100.0f, false); + fireSources = new List(); + properties = TypeDescriptor.GetProperties(GetType()) .Cast() .ToDictionary(pr => pr.Name); @@ -197,6 +206,11 @@ namespace Barotrauma hullList.Remove(this); } + public void AddFireSource(FireSource fireSource) + { + fireSources.Add(fireSource); + } + public override void Update(Camera cam, float deltaTime) { Oxygen -= OxygenDetoriationSpeed * deltaTime; @@ -217,7 +231,20 @@ namespace Barotrauma } } } + else if (EditFire) + { + Vector2 position = cam.ScreenToWorld(PlayerInput.MousePosition); + if (Submarine.RectContains(rect, position)) + { + if (PlayerInput.LeftButtonClicked()) + { + new FireSource(position); + } + } + } + FireSource.UpdateAll(fireSources, deltaTime); + //update client hulls if the amount of water has changed by >10% if (Math.Abs(lastSentVolume - volume) > FullVolume * 0.1f) { @@ -292,8 +319,11 @@ namespace Barotrauma LethalPressure += ( Submarine.Loaded!=null && Submarine.Loaded.AtDamageDepth) ? 100.0f*deltaTime : 10.0f * deltaTime; } + } - + public void RemoveFire(FireSource fire) + { + fireSources.Remove(fire); } public override void Draw(SpriteBatch spriteBatch, bool editing) @@ -441,6 +471,27 @@ namespace Barotrauma return null; } + public List FindGaps() + { + List gaps = new List(); + + foreach (Gap gap in Gap.GapList) + { + if (gap.Open < 0.01f) continue; + if (gap.linkedTo.Count == 0) continue; + + var gapHull = gap.linkedTo[0] as Hull; + if (gapHull == this) gaps.Add(gap); + + if (gap.linkedTo.Count < 2) continue; + + gapHull = gap.linkedTo[1] as Hull; + if (gapHull == this) gaps.Add(gap); + } + + return gaps; + } + public override XElement Save(XDocument doc) { XElement element = new XElement("Hull"); diff --git a/Subsurface/Source/Map/Levels/Level.cs b/Subsurface/Source/Map/Levels/Level.cs index e274d1197..95f3aa857 100644 --- a/Subsurface/Source/Map/Levels/Level.cs +++ b/Subsurface/Source/Map/Levels/Level.cs @@ -731,10 +731,8 @@ namespace Barotrauma // cell.body.SetTransform(cell.body.Position + simAmount, cell.body.Rotation); //} - int i = 0; foreach (Body body in bodies) { - i++; body.SetTransform(body.Position + simAmount, body.Rotation); } @@ -759,7 +757,6 @@ namespace Barotrauma Vector2 prevVelocity; public void Move(Vector2 amount) { - Vector2 velocity = amount; Vector2 simVelocity = ConvertUnits.ToSimUnits(amount / (float)Physics.step); foreach (Body body in bodies) diff --git a/Subsurface/Source/Map/Levels/VoronoiElements.cs b/Subsurface/Source/Map/Levels/VoronoiElements.cs index ec22a8f5c..adf3f7832 100644 --- a/Subsurface/Source/Map/Levels/VoronoiElements.cs +++ b/Subsurface/Source/Map/Levels/VoronoiElements.cs @@ -62,10 +62,6 @@ namespace Voronoi2 { public double x, y; - public Point () - { - } - public void setPoint ( double x, double y ) { this.x = x; diff --git a/Subsurface/Source/Map/LocationType.cs b/Subsurface/Source/Map/LocationType.cs index 9ac05b1ab..6f4960dab 100644 --- a/Subsurface/Source/Map/LocationType.cs +++ b/Subsurface/Source/Map/LocationType.cs @@ -54,7 +54,7 @@ namespace Barotrauma nameFormats = new List(); foreach (XAttribute nameFormat in element.Element("nameformats").Attributes()) { - nameFormats.Add(nameFormat.Value.ToString()); + nameFormats.Add(nameFormat.Value); } string spritePath = ToolBox.GetAttributeString(element, "symbol", "Content/Map/beaconSymbol.png"); diff --git a/Subsurface/Source/Map/MapEntity.cs b/Subsurface/Source/Map/MapEntity.cs index e3d109813..59f7a50f7 100644 --- a/Subsurface/Source/Map/MapEntity.cs +++ b/Subsurface/Source/Map/MapEntity.cs @@ -24,7 +24,7 @@ namespace Barotrauma protected static Vector2 startMovingPos = Vector2.Zero; - protected List linkedToID; + protected List linkedToID; //observable collection because some entities may need to be notified when the collection is modified public ObservableCollection linkedTo; diff --git a/Subsurface/Source/Map/WaterRenderer.cs b/Subsurface/Source/Map/WaterRenderer.cs index 7f05f52bb..fcbe29b14 100644 --- a/Subsurface/Source/Map/WaterRenderer.cs +++ b/Subsurface/Source/Map/WaterRenderer.cs @@ -35,7 +35,7 @@ namespace Barotrauma waterEffect.Parameters["xWaveWidth"].SetValue(0.05f); waterEffect.Parameters["xWaveHeight"].SetValue(0.05f); #if WINDOWS - waterEffect.Parameters["xTexture"].SetValue(waterTexture); + //waterEffect.Parameters["xTexture"].SetValue(waterTexture); #endif #if LINUX waterEffect.Parameters["xWaterBumpMap"].SetValue(waterTexture); diff --git a/Subsurface/Source/Map/WayPoint.cs b/Subsurface/Source/Map/WayPoint.cs index d86ad027b..b04631f1a 100644 --- a/Subsurface/Source/Map/WayPoint.cs +++ b/Subsurface/Source/Map/WayPoint.cs @@ -327,11 +327,11 @@ namespace Barotrauma w.assignedJob = JobPrefab.List.Find(jp => jp.Name.ToLower() == jobName); } - w.linkedToID = new List(); + w.linkedToID = new List(); int i = 0; while (element.Attribute("linkedto" + i) != null) { - w.linkedToID.Add(int.Parse(element.Attribute("linkedto" + i).Value)); + w.linkedToID.Add((ushort)int.Parse(element.Attribute("linkedto" + i).Value)); i += 1; } } diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs index 76cc24db5..4f7f772b2 100644 --- a/Subsurface/Source/Networking/GameClient.cs +++ b/Subsurface/Source/Networking/GameClient.cs @@ -1,5 +1,4 @@ using System; -using System.Diagnostics; using Lidgren.Network; using Microsoft.Xna.Framework; using System.Collections.Generic; @@ -207,7 +206,7 @@ namespace Barotrauma.Networking if (packetType == (byte)PacketTypes.LoggedIn) { myID = inc.ReadInt32(); - bool gameStarted= inc.ReadBoolean(); + gameStarted = inc.ReadBoolean(); if (gameStarted && Screen.Selected != GameMain.GameScreen) { new GUIMessageBox("Please wait", "A round is already running. You will have to wait for a new round to start."); @@ -219,7 +218,7 @@ namespace Barotrauma.Networking { GameMain.NetLobbyScreen.Select(); - new GUIMessageBox("Connection timed out", "You were disconnected for too long and your character was deleted. Please wait for another round to start."); + new GUIMessageBox("Connection timed out", "You were disconnected for too long and your Character was deleted. Please wait for another round to start."); } GameMain.NetLobbyScreen.ClearPlayers(); @@ -428,7 +427,7 @@ namespace Barotrauma.Networking switch (packetType) { case (byte)PacketTypes.StartGame: - if (gameStarted) continue; + if (Screen.Selected == GameMain.GameScreen) continue; GameMain.ShowLoading(StartGame(inc), false); @@ -467,8 +466,8 @@ namespace Barotrauma.Networking if (!c.IsNetworkPlayer || !c.IsHumanoid || c.Info==null) continue; crew.Add(c); } - - CreateCrewFrame(crew); + + GameMain.GameSession.CrewManager.CreateCrewFrame(crew); break; @@ -532,7 +531,7 @@ namespace Barotrauma.Networking if (gameMode == null) { - DebugConsole.ThrowError("Game mode ''"+gameMode+"'' not found!"); + DebugConsole.ThrowError("Game mode ''" + modeName + "'' not found!"); yield return CoroutineStatus.Success; } @@ -576,7 +575,7 @@ namespace Barotrauma.Networking AddChatMessage("Press TAB to chat", ChatMessageType.Server); - CreateCrewFrame(crew); + GameMain.GameSession.CrewManager.CreateCrewFrame(crew); yield return CoroutineStatus.Success; } @@ -624,7 +623,7 @@ namespace Barotrauma.Networking myCharacter = null; foreach (Client c in otherClients) { - c.character = null; + c.Character = null; } yield return CoroutineStatus.Success; @@ -680,6 +679,16 @@ namespace Barotrauma.Networking } } + public bool SpectateClicked(GUIButton button, object userData) + { + NetOutgoingMessage msg = client.CreateMessage(); + msg.Write((byte)PacketTypes.Spectate); + + client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered); + + return false; + } + public void SendCharacterData() { if (characterInfo == null) return; @@ -800,7 +809,7 @@ namespace Barotrauma.Networking int bitCount = Rand.Int(100); for (int i = 0; i connectedClients = new List(); + public List ConnectedClients = new List(); //for keeping track of disconnected clients in case the reconnect shortly after private List disconnectedClients = new List(); private NetStats netStats; + private int roundStartSeed; + //is the server running - bool started; + private bool started; private NetServer server; private NetPeerConfiguration config; @@ -131,7 +134,7 @@ namespace Barotrauma.Networking request.AddParameter("action", "addserver"); request.AddParameter("servername", name); request.AddParameter("serverport", Port); - request.AddParameter("playercount", PlayerCountToByte(connectedClients.Count, config.MaximumConnections)); + request.AddParameter("playercount", PlayerCountToByte(ConnectedClients.Count, config.MaximumConnections)); request.AddParameter("password", string.IsNullOrWhiteSpace(password) ? 0 : 1); // execute the request @@ -143,7 +146,7 @@ namespace Barotrauma.Networking return; } - if (response!=null && !string.IsNullOrWhiteSpace(response.Content)) + if (response != null && !string.IsNullOrWhiteSpace(response.Content)) { DebugConsole.ThrowError("Error while connecting to master server (" +response.Content+")"); return; @@ -160,7 +163,7 @@ namespace Barotrauma.Networking var request = new RestRequest("masterserver.php", Method.GET); request.AddParameter("action", "refreshserver"); request.AddParameter("gamestarted", gameStarted ? 1 : 0); - request.AddParameter("playercount", PlayerCountToByte(connectedClients.Count, config.MaximumConnections)); + request.AddParameter("playercount", PlayerCountToByte(ConnectedClients.Count, config.MaximumConnections)); System.Diagnostics.Debug.WriteLine("refreshing master"); @@ -221,7 +224,7 @@ namespace Barotrauma.Networking //if all characters dead if (AutoRestart && - connectedClients.Find(c => c.character != null && !c.character.IsDead)==null && + ConnectedClients.Find(c => c.Character != null && !c.Character.IsDead)==null && (myCharacter == null || myCharacter.IsDead)) { EndButtonHit(null, null); @@ -229,7 +232,7 @@ namespace Barotrauma.Networking return; } } - else if (autoRestart && Screen.Selected == GameMain.NetLobbyScreen && connectedClients.Count>0) + else if (autoRestart && Screen.Selected == GameMain.NetLobbyScreen && ConnectedClients.Count>0) { AutoRestartTimer -= deltaTime; if (AutoRestartTimer < 0.0f) @@ -243,16 +246,16 @@ namespace Barotrauma.Networking disconnectedClients[i].deleteDisconnectedTimer -= deltaTime; if (disconnectedClients[i].deleteDisconnectedTimer > 0.0f) continue; - if (gameStarted && disconnectedClients[i].character!=null) + if (gameStarted && disconnectedClients[i].Character!=null) { - disconnectedClients[i].character.Remove(); - disconnectedClients[i].character = null; + disconnectedClients[i].Character.Remove(); + disconnectedClients[i].Character = null; } disconnectedClients.RemoveAt(i); } - foreach (Client c in connectedClients) + foreach (Client c in ConnectedClients) { c.ReliableChannel.Update(deltaTime); } @@ -283,7 +286,7 @@ namespace Barotrauma.Networking foreach (Character c in Character.CharacterList) { - if (c as AICharacter == null || c.IsDead) continue; + if (!(c is AICharacter) || c.IsDead) continue; if (c.SimPosition.Length() > NetConfig.CharacterIgnoreDistance) continue; @@ -301,12 +304,10 @@ namespace Barotrauma.Networking updateTimer = DateTime.Now + updateInterval; } - if (registeredToMaster && refreshMasterTimer < DateTime.Now) - { - CoroutineManager.StartCoroutine(RefreshMaster()); + if (!registeredToMaster || refreshMasterTimer >= DateTime.Now) return; - refreshMasterTimer = DateTime.Now + refreshMasterInterval; - } + CoroutineManager.StartCoroutine(RefreshMaster()); + refreshMasterTimer = DateTime.Now + refreshMasterInterval; } private void SparseUpdate() @@ -315,7 +316,7 @@ namespace Barotrauma.Networking foreach (Character c in Character.CharacterList) { - if (c as AICharacter != null || c.IsDead) continue; + if (c is AICharacter || c.IsDead) continue; new NetworkEvent(NetworkEventType.ImportantEntityUpdate, c.ID, false); } @@ -325,8 +326,6 @@ namespace Barotrauma.Networking private void ReadMessage(NetIncomingMessage inc) { - NetOutgoingMessage outmsg; - switch (inc.MessageType) { case NetIncomingMessageType.ConnectionApproval: @@ -336,7 +335,7 @@ namespace Barotrauma.Networking Debug.WriteLine(inc.SenderConnection + " status changed. " + (NetConnectionStatus)inc.SenderConnection.Status); if (inc.SenderConnection.Status == NetConnectionStatus.Connected) { - Client sender = connectedClients.Find(x => x.Connection == inc.SenderConnection); + Client sender = ConnectedClients.Find(x => x.Connection == inc.SenderConnection); if (sender == null) break; @@ -345,7 +344,7 @@ namespace Barotrauma.Networking DisconnectClient(sender, sender.name+" was unable to connect to the server (nonmatching game version)", "Version " + GameMain.Version + " required to connect to the server (Your version: " + sender.version + ")"); } - else if (connectedClients.Find(x => x.name == sender.name && x != sender)!=null) + else if (ConnectedClients.Find(x => x.name == sender.name && x != sender)!=null) { DisconnectClient(sender, sender.name + " was unable to connect to the server (name already in use)", "The name ''"+sender.name+"'' is already in use. Please choose another name."); @@ -357,19 +356,16 @@ namespace Barotrauma.Networking GameMain.NetLobbyScreen.AddPlayer(sender.name); // Notify the client that they have logged in - outmsg = server.CreateMessage(); + var outmsg = server.CreateMessage(); outmsg.Write((byte)PacketTypes.LoggedIn); - outmsg.Write(sender.ID); - outmsg.Write(gameStarted); - - outmsg.Write(gameStarted && sender.character!=null); + outmsg.Write(gameStarted && sender.Character!=null); //notify the client about other clients already logged in - outmsg.Write((characterInfo == null) ? connectedClients.Count - 1 : connectedClients.Count); - foreach (Client c in connectedClients) + outmsg.Write((characterInfo == null) ? ConnectedClients.Count - 1 : ConnectedClients.Count); + foreach (Client c in ConnectedClients) { if (c.Connection == inc.SenderConnection) continue; outmsg.Write(c.name); @@ -401,7 +397,7 @@ namespace Barotrauma.Networking } else if (inc.SenderConnection.Status == NetConnectionStatus.Disconnected) { - var connectedClient = connectedClients.Find(c => c.Connection == inc.SenderConnection); + var connectedClient = ConnectedClients.Find(c => c.Connection == inc.SenderConnection); if (connectedClient != null && !disconnectedClients.Contains(connectedClient)) { connectedClient.deleteDisconnectedTimer = NetConfig.DeleteDisconnectedTime; @@ -415,7 +411,7 @@ namespace Barotrauma.Networking break; case NetIncomingMessageType.Data: - Client dataSender = connectedClients.Find(c => c.Connection == inc.SenderConnection); + Client dataSender = ConnectedClients.Find(c => c.Connection == inc.SenderConnection); if (dataSender == null) return; byte packetType = 0; @@ -428,13 +424,10 @@ namespace Barotrauma.Networking return; } - bool isReliable = false; if (packetType == (byte)PacketTypes.ReliableMessage) { if (!dataSender.ReliableChannel.CheckMessage(inc)) return; packetType = inc.ReadByte(); - - isReliable = true; } switch (packetType) @@ -443,33 +436,6 @@ namespace Barotrauma.Networking if (!gameStarted) break; NetworkEvent.ReadMessage(inc, true); - //List recipients = connectedClients.FindAll(c => c.Connection != inc.SenderConnection && c.inGame); - //if (recipients.Count == 0) break; - - //if (isReliable) - //{ - // Debug.WriteLine("receiver reliable networkevent"); - // foreach (Client c in recipients) - // { - // var reliableMessage = c.ReliableChannel.CreateMessage(); - // inc.Position = 8+16; - // byte[] messageBytes = inc.ReadBytes(inc.LengthBytes-3); - // reliableMessage.InnerMessage.Write(messageBytes); - - // c.ReliableChannel.SendMessage(reliableMessage, c.Connection); - // } - //} - //else - //{ - // outmsg = server.CreateMessage(); - // outmsg.Write(inc); - - // List recipientConnections = new List(); - // foreach (Client c in recipients) recipientConnections.Add(c.Connection); - - // server.SendMessage(outmsg, recipientConnections, inc.DeliveryMethod, 0); - //} - break; case (byte)PacketTypes.Chatmessage: ChatMessageType messageType = (ChatMessageType)inc.ReadByte(); @@ -492,7 +458,14 @@ namespace Barotrauma.Networking dataSender.ReliableChannel.HandleLatestMessageID(inc); break; case (byte)PacketTypes.Vote: - Voting.RegisterVote(inc, connectedClients); + Voting.RegisterVote(inc, ConnectedClients); + break; + case (byte)PacketTypes.Spectate: + if (gameStarted) + { + var startMessage = CreateStartMessage(roundStartSeed, Submarine.Loaded, GameMain.GameSession.gameMode.Preset); + server.SendMessage(startMessage, inc.SenderConnection, NetDeliveryMethod.ReliableUnordered); + } break; } break; @@ -515,7 +488,7 @@ namespace Barotrauma.Networking return; } - if (connectedClients.Find(c => c.Connection == inc.SenderConnection)!=null) + if (ConnectedClients.Find(c => c.Connection == inc.SenderConnection)!=null) { inc.SenderConnection.Deny("Connection error - already joined"); return; @@ -565,7 +538,7 @@ namespace Barotrauma.Networking DebugConsole.NewMessage(name + " couldn't join the server (wrong content package hash)", Color.Red); return; } - else if (connectedClients.Find(c => c.name.ToLower() == name.ToLower() && c.ID!=userID) != null) + else if (ConnectedClients.Find(c => c.name.ToLower() == name.ToLower() && c.ID!=userID) != null) { inc.SenderConnection.Deny("The name ''" + name + "'' is already in use. Please choose another name."); DebugConsole.NewMessage(name + " couldn't join the server (name already in use)", Color.Red); @@ -577,14 +550,14 @@ namespace Barotrauma.Networking //existing user re-joining if (userID > 0) { - Client existingClient = connectedClients.Find(c => c.ID == userID); + Client existingClient = ConnectedClients.Find(c => c.ID == userID); if (existingClient == null) { existingClient = disconnectedClients.Find(c => c.ID == userID); if (existingClient != null) { disconnectedClients.Remove(existingClient); - connectedClients.Add(existingClient); + ConnectedClients.Add(existingClient); UpdateCrewFrame(); } @@ -598,7 +571,7 @@ namespace Barotrauma.Networking } userID = Rand.Range(1, 1000000); - while (connectedClients.Find(c => c.ID == userID) != null) + while (ConnectedClients.Find(c => c.ID == userID) != null) { userID++; } @@ -607,7 +580,7 @@ namespace Barotrauma.Networking newClient.Connection = inc.SenderConnection; newClient.version = version; - connectedClients.Add(newClient); + ConnectedClients.Add(newClient); UpdateCrewFrame(); @@ -615,11 +588,11 @@ namespace Barotrauma.Networking } - private void SendMessage(NetOutgoingMessage msg, NetDeliveryMethod deliveryMethod, NetConnection excludedConnection) + private void SendMessage(NetOutgoingMessage msg, NetDeliveryMethod deliveryMethod, NetConnection excludedConnection = null) { List recipients = new List(); - foreach (Client client in connectedClients) + foreach (Client client in ConnectedClients) { if (client.Connection != excludedConnection) recipients.Add(client.Connection); } @@ -634,78 +607,10 @@ namespace Barotrauma.Networking { if (NetworkEvent.Events.Count == 0) return; - List recipients = connectedClients.FindAll(c => c.character != null); - - List recipientConnections = new List(); - foreach (Client c in recipients) - { - recipientConnections.Add(c.Connection); - } + List recipients = ConnectedClients.FindAll(c => c.Character != null); if (recipients.Count == 0) return; - //foreach (Client c in recipients) - //{ - - // for (int i = 0; i < 2; i++) - // { - // bool important = i == 0; - - // var events = NetworkEvent.Events.FindAll(e => e.IsImportant == important && e.SenderConnection != c.Connection); - // if (events.Count == 0) continue; - - // List msgBytes = new List(); - - // int totalLength = 1; - - // foreach (NetworkEvent unreliableEvent in events) - // { - // NetBuffer tempMessage = new NetBuffer();// server.CreateMessage(); - // if (!unreliableEvent.FillData(tempMessage)) continue; - // tempMessage.WritePadBits(); - - // tempMessage.Position = 0; - // msgBytes.Add(tempMessage.ReadBytes(tempMessage.LengthBytes)); - - // //one extra byte for writing the length - // totalLength += 1 + tempMessage.LengthBytes; - // } - - // //NetOutgoingMessage combinedMessage = null; - // //reliableMessage = null; - // if (important) - // { - // ReliableMessage reliableMessage = c.ReliableChannel.CreateMessage(); - - // reliableMessage.InnerMessage.Write((byte)msgBytes.Count); - // foreach (byte[] msgData in msgBytes) - // { - // if (msgData.Length > 255) DebugConsole.ThrowError("too large networkevent (" + msgData.Length + " bytes)"); - - // reliableMessage.InnerMessage.Write((byte)msgData.Length); - // reliableMessage.InnerMessage.Write(msgData); - // } - - // c.ReliableChannel.SendMessage(reliableMessage, c.Connection); - // } - // else - // { - // var combinedMessage = server.CreateMessage(totalLength); - - // combinedMessage.Write((byte)msgBytes.Count); - // foreach (byte[] msgData in msgBytes) - // { - // if (msgData.Length > 255) DebugConsole.ThrowError("too large networkevent (" + msgData.Length + " bytes)"); - - // combinedMessage.Write((byte)msgData.Length); - // combinedMessage.Write(msgData); - // } - - // server.SendMessage(combinedMessage, c.Connection, NetDeliveryMethod.Unreliable, 0); - // } - - // } - //} foreach (Client c in recipients) { var message = ComposeNetworkEventMessage(true, c.Connection); @@ -725,39 +630,6 @@ namespace Barotrauma.Networking } } - - - //foreach (NetworkEvent networkEvent in NetworkEvent.events) - //{ - // if (!networkEvent.IsImportant) co - // //if (!networkEvent.IsClient) continue; - - // if (!networkEvent.FillData(message)) - // { - // continue; - // } - - // //Entity e = Entity.FindEntityByID(networkEvent.ID); - // //if (e == null) continue; - // if (networkEvent.IsImportant) - // { - // foreach (Client c in recipients) - // { - // ReliableMessage reliableMessage = c.ReliableChannel.CreateMessage(); - // message.Position = 0; - // reliableMessage.InnerMessage.Write(message.ReadBytes(message.LengthBytes)); - - // c.ReliableChannel.SendMessage(reliableMessage, c.Connection); - // } - // } - // else - // { - // if (server.ConnectionsCount>0) - // { - // server.SendMessage(message, recipientConnections, NetDeliveryMethod.Unreliable, 0); - // } - // } - //} NetworkEvent.Events.Clear(); } @@ -768,7 +640,7 @@ namespace Barotrauma.Networking if (Voting.AllowSubVoting) { - Voting.HighestVoted(VoteType.Sub, connectedClients); + selectedSub = Voting.HighestVoted(VoteType.Sub, ConnectedClients); if (selectedSub == null) selectedSub = GameMain.NetLobbyScreen.SelectedSub; } else @@ -793,22 +665,23 @@ namespace Barotrauma.Networking AssignJobs(); - //selectedMap.Load(); + roundStartSeed = DateTime.Now.Millisecond; + Rand.SetSyncedSeed(roundStartSeed); - int seed = DateTime.Now.Millisecond; - Rand.SetSyncedSeed(seed); - - GameModePreset selectedMode = Voting.HighestVoted(VoteType.Mode, connectedClients); + GameModePreset selectedMode = Voting.HighestVoted(VoteType.Mode, ConnectedClients); if (selectedMode==null) selectedMode=GameMain.NetLobbyScreen.SelectedMode; GameMain.GameSession = new GameSession(selectedSub, "", selectedMode); GameMain.GameSession.StartShift(GameMain.NetLobbyScreen.LevelSeed); + var startMessage = CreateStartMessage(roundStartSeed, Submarine.Loaded, GameMain.GameSession.gameMode.Preset); + SendMessage(startMessage, NetDeliveryMethod.ReliableUnordered); + yield return CoroutineStatus.Running; List characterInfos = new List(); - foreach (Client client in connectedClients) + foreach (Client client in ConnectedClients) { client.inGame = true; @@ -829,11 +702,11 @@ namespace Barotrauma.Networking WayPoint[] assignedWayPoints = WayPoint.SelectCrewSpawnPoints(characterInfos); - for (int i = 0; i < connectedClients.Count; i++) + for (int i = 0; i < ConnectedClients.Count; i++) { - connectedClients[i].character = new Character( - connectedClients[i].characterInfo, assignedWayPoints[i], true); - connectedClients[i].character.GiveJobItems(assignedWayPoints[i]); + ConnectedClients[i].Character = new Character( + ConnectedClients[i].characterInfo, assignedWayPoints[i], true); + ConnectedClients[i].Character.GiveJobItems(assignedWayPoints[i]); } if (characterInfo != null) @@ -845,7 +718,23 @@ namespace Barotrauma.Networking } yield return CoroutineStatus.Running; + + UpdateCrewFrame(); + //give some time for the clients to load the map + yield return new WaitForSeconds(2.0f); + + gameStarted = true; + + GameMain.GameScreen.Cam.TargetPos = Vector2.Zero; + + GameMain.GameScreen.Select(); + + yield return CoroutineStatus.Success; + } + + private NetOutgoingMessage CreateStartMessage(int seed, Submarine selectedSub, GameModePreset selectedMode) + { NetOutgoingMessage msg = server.CreateMessage(); msg.Write((byte)PacketTypes.StartGame); @@ -860,11 +749,13 @@ namespace Barotrauma.Networking //msg.Write(GameMain.NetLobbyScreen.GameDuration.TotalMinutes); - msg.Write((myCharacter == null) ? (byte)connectedClients.Count : (byte)(connectedClients.Count + 1)); - foreach (Client client in connectedClients) + List playingClients = ConnectedClients.FindAll(c => c.Character != null); + + msg.Write((myCharacter == null) ? (byte)playingClients.Count : (byte)(playingClients.Count + 1)); + foreach (Client client in playingClients) { msg.Write(client.ID); - WriteCharacterData(msg, client.character.Name, client.character); + WriteCharacterData(msg, client.Character.Name, client.Character); } if (myCharacter != null) @@ -873,21 +764,7 @@ namespace Barotrauma.Networking WriteCharacterData(msg, myCharacter.Info.Name, Character.Controlled); } - SendMessage(msg, NetDeliveryMethod.ReliableUnordered, null); - - UpdateCrewFrame(); - - //give some time for the clients to load the map - yield return new WaitForSeconds(2.0f); - - gameStarted = true; - - GameMain.GameScreen.Cam.TargetPos = Vector2.Zero; - - GameMain.GameScreen.Select(); - - yield return CoroutineStatus.Success; - + return msg; } private bool EndButtonHit(GUIButton button, object obj) @@ -909,7 +786,7 @@ namespace Barotrauma.Networking gameStarted = false; - if (connectedClients.Count > 0) + if (ConnectedClients.Count > 0) { NetOutgoingMessage msg = server.CreateMessage(); msg.Write((byte)PacketTypes.EndGame); @@ -920,9 +797,9 @@ namespace Barotrauma.Networking server.SendMessage(msg, server.Connections, NetDeliveryMethod.ReliableOrdered, 0); } - foreach (Client client in connectedClients) + foreach (Client client in ConnectedClients) { - client.character = null; + client.Character = null; client.inGame = false; } } @@ -961,7 +838,7 @@ namespace Barotrauma.Networking private void DisconnectClient(NetConnection senderConnection, string msg = "", string targetmsg = "") { - Client client = connectedClients.Find(x => x.Connection == senderConnection); + Client client = ConnectedClients.Find(x => x.Connection == senderConnection); if (client != null) DisconnectClient(client, msg, targetmsg); } @@ -969,18 +846,18 @@ namespace Barotrauma.Networking { if (client == null) return; - if (gameStarted && client.character != null) + if (gameStarted && client.Character != null) { if (GameMain.GameSession!=null && GameMain.GameSession.gameMode!=null) { TraitorMode traitorMode = GameMain.GameSession.gameMode as TraitorMode; if (traitorMode!=null) { - traitorMode.CharacterLeft(client.character); + traitorMode.CharacterLeft(client.Character); } } - client.character.ClearInputs(); + client.Character.ClearInputs(); } if (string.IsNullOrWhiteSpace(msg)) msg = client.name + " has left the server"; @@ -991,7 +868,7 @@ namespace Barotrauma.Networking outmsg.Write(targetmsg); server.SendMessage(outmsg, client.Connection, NetDeliveryMethod.ReliableUnordered, 0); - connectedClients.Remove(client); + ConnectedClients.Remove(client); outmsg = server.CreateMessage(); outmsg.Write((byte)PacketTypes.PlayerLeft); @@ -1014,24 +891,24 @@ namespace Barotrauma.Networking { List crew = new List(); - foreach (Client c in connectedClients) + foreach (Client c in ConnectedClients) { - if (c.character == null || !c.inGame) continue; + if (c.Character == null || !c.inGame) continue; - crew.Add(c.character); + crew.Add(c.Character); } if (myCharacter != null) crew.Add(myCharacter); - CreateCrewFrame(crew); + if (GameMain.GameSession!=null) GameMain.GameSession.CrewManager.CreateCrewFrame(crew); } public void KickPlayer(string playerName, bool ban = false) { playerName = playerName.ToLower(); - Client client = connectedClients.Find( c => c.name.ToLower() == playerName || - (c.character != null && c.character.Name.ToLower() == playerName)); + Client client = ConnectedClients.Find( c => c.name.ToLower() == playerName || + (c.Character != null && c.Character.Name.ToLower() == playerName)); if (client == null) return; @@ -1056,10 +933,10 @@ namespace Barotrauma.Networking public void NewTraitor(out Character traitor, out Character target) { List characters = new List(); - foreach (Client client in connectedClients) + foreach (Client client in ConnectedClients) { - if (!client.inGame || client.character==null) continue; - characters.Add(client.character); + if (!client.inGame || client.Character==null) continue; + characters.Add(client.Character); } if (myCharacter!= null) characters.Add(myCharacter); @@ -1093,9 +970,9 @@ namespace Barotrauma.Networking } Client traitorClient = null; - foreach (Client c in connectedClients) + foreach (Client c in ConnectedClients) { - if (c.character != traitor) continue; + if (c.Character != traitor) continue; traitorClient = c; break; } @@ -1133,7 +1010,7 @@ namespace Barotrauma.Networking int resentMessages = 0; y += 110; - foreach (Client c in connectedClients) + foreach (Client c in ConnectedClients) { spriteBatch.DrawString(GUI.SmallFont, c.name + ":", new Vector2(x + 10, y), Color.White); spriteBatch.DrawString(GUI.SmallFont, "- avg roundtrip " + c.Connection.AverageRoundtripTime+" s", new Vector2(x + 20, y + 15), Color.White); @@ -1160,7 +1037,7 @@ namespace Barotrauma.Networking { NetOutgoingMessage msg = server.CreateMessage(); msg.Write((byte)PacketTypes.VoteStatus); - Voting.WriteData(msg, connectedClients); + Voting.WriteData(msg, ConnectedClients); server.SendMessage(msg, server.Connections, NetDeliveryMethod.ReliableUnordered, 0); } @@ -1191,14 +1068,12 @@ namespace Barotrauma.Networking return true; } - protected override bool SelectCrewCharacter(GUIComponent component, object obj) + public override bool SelectCrewCharacter(GUIComponent component, object obj) { - base.SelectCrewCharacter(component, obj); - - var characterFrame = crewFrame.FindChild("selectedcharacter"); + var characterFrame = component.Parent.Parent.FindChild("selectedcharacter"); Character character = obj as Character; - if (obj == null) return false; + if (character == null) return false; if (character != myCharacter) { @@ -1225,9 +1100,9 @@ namespace Barotrauma.Networking List recipients = new List(); - foreach (Client c in connectedClients) + foreach (Client c in ConnectedClients) { - if (type!=ChatMessageType.Dead || (c.character != null && c.character.IsDead)) recipients.Add(c); + if (type!=ChatMessageType.Dead || (c.Character != null && c.Character.IsDead)) recipients.Add(c); } foreach (Client c in recipients) @@ -1271,7 +1146,7 @@ namespace Barotrauma.Networking if (jobPrefab != null) jobPreferences.Add(jobPrefab); } - foreach (Client c in connectedClients) + foreach (Client c in ConnectedClients) { if (c.Connection != message.SenderConnection) continue; @@ -1298,7 +1173,7 @@ namespace Barotrauma.Networking private void AssignJobs() { - List unassigned = new List(connectedClients); + List unassigned = new List(ConnectedClients); int[] assignedClientCount = new int[JobPrefab.List.Count]; @@ -1424,7 +1299,7 @@ namespace Barotrauma.Networking int bitCount = Rand.Int(100); for (int i = 0; i < bitCount; i++) { - msg.Write((Rand.Int(2) == 0) ? true : false); + msg.Write(Rand.Int(2) == 0); } SendMessage(msg, (Rand.Int(2) == 0) ? NetDeliveryMethod.ReliableOrdered : NetDeliveryMethod.Unreliable, null); @@ -1442,7 +1317,7 @@ namespace Barotrauma.Networking public string name; public int ID; - public Character character; + public Character Character; public CharacterInfo characterInfo; public NetConnection Connection { get; set; } public string version; diff --git a/Subsurface/Source/Networking/GameServerSettings.cs b/Subsurface/Source/Networking/GameServerSettings.cs index 4081baf14..401c665a4 100644 --- a/Subsurface/Source/Networking/GameServerSettings.cs +++ b/Subsurface/Source/Networking/GameServerSettings.cs @@ -36,7 +36,7 @@ namespace Barotrauma.Networking public bool AutoRestart { - get { return (connectedClients.Count == 0) ? false : autoRestart; } + get { return (ConnectedClients.Count == 0) ? false : autoRestart; } set { autoRestart = value; diff --git a/Subsurface/Source/Networking/NetConfig.cs b/Subsurface/Source/Networking/NetConfig.cs index 969eaa0ca..ea298bca7 100644 --- a/Subsurface/Source/Networking/NetConfig.cs +++ b/Subsurface/Source/Networking/NetConfig.cs @@ -14,7 +14,7 @@ namespace Barotrauma.Networking public static string MasterServerUrl = GameMain.Config.MasterServerUrl; - //if a character is further than this from the sub, the server will ignore it + //if a Character is further than this from the sub, the server will ignore it //(in sim units) public const float CharacterIgnoreDistance = 100.0f; diff --git a/Subsurface/Source/Networking/NetworkMember.cs b/Subsurface/Source/Networking/NetworkMember.cs index e49ae368b..e8b967505 100644 --- a/Subsurface/Source/Networking/NetworkMember.cs +++ b/Subsurface/Source/Networking/NetworkMember.cs @@ -27,7 +27,9 @@ namespace Barotrauma.Networking Vote, VoteStatus, - ResendRequest, ReliableMessage, LatestMessageID + ResendRequest, ReliableMessage, LatestMessageID, + + Spectate } enum VoteType @@ -56,10 +58,6 @@ namespace Barotrauma.Networking public int Port; - private bool crewFrameOpen; - private GUIButton crewButton; - protected GUIFrame crewFrame; - protected bool gameStarted; protected Character myCharacter; @@ -117,8 +115,6 @@ namespace Barotrauma.Networking chatMsgBox.Font = GUI.SmallFont; chatMsgBox.OnEnterPressed = EnterChatMessage; - crewButton = new GUIButton(new Rectangle(chatBox.Rect.Right-80, chatBox.Rect.Y-30, 80, 20), "Crew", GUI.Style, inGameHUD); - crewButton.OnClicked = ToggleCrewFrame; Voting = new Voting(); } @@ -159,66 +155,6 @@ namespace Barotrauma.Networking } return message; - } - - protected void CreateCrewFrame(List crew) - { - int width = 600, height = 400; - - crewFrame = new GUIFrame(new Rectangle(GameMain.GraphicsWidth / 2 - width / 2, GameMain.GraphicsHeight / 2 - height / 2, width, height), GUI.Style); - crewFrame.Padding = new Vector4(10.0f, 10.0f, 10.0f, 10.0f); - - GUIListBox crewList = new GUIListBox(new Rectangle(0, 0, 280, 300), Color.White * 0.7f, GUI.Style, crewFrame); - crewList.Padding = new Vector4(10.0f, 10.0f, 10.0f, 10.0f); - crewList.OnSelected = SelectCrewCharacter; - - foreach (Character character in crew) - { - GUIFrame frame = new GUIFrame(new Rectangle(0, 0, 0, 40), Color.Transparent, null, crewList); - frame.UserData = character; - frame.Padding = new Vector4(5.0f, 5.0f, 5.0f, 5.0f); - frame.Color = (myCharacter == character) ? Color.Gold * 0.2f : Color.Transparent; - frame.HoverColor = Color.LightGray * 0.5f; - frame.SelectedColor = Color.Gold * 0.5f; - - GUITextBlock textBlock = new GUITextBlock( - new Rectangle(40, 0, 0, 25), - character.Info.Name + " ("+character.Info.Job.Name+")", - Color.Transparent, Color.White, - Alignment.Left, Alignment.Left, - null, frame); - textBlock.Padding = new Vector4(5.0f, 0.0f, 5.0f, 0.0f); - - new GUIImage(new Rectangle(-10, 0, 0, 0), character.AnimController.Limbs[0].sprite, Alignment.Left, frame); - } - - var closeButton = new GUIButton(new Rectangle(0,0, 80, 20), "Close", Alignment.BottomCenter, GUI.Style, crewFrame); - closeButton.OnClicked = ToggleCrewFrame; - } - - protected virtual bool SelectCrewCharacter(GUIComponent component, object obj) - { - Character character = obj as Character; - if (obj == null) return false; - - GUIComponent existingFrame = crewFrame.FindChild("selectedcharacter"); - if (existingFrame != null) crewFrame.RemoveChild(existingFrame); - - var previewPlayer = new GUIFrame( - new Rectangle(0,0, 230, 300), - new Color(0.0f, 0.0f, 0.0f, 0.8f), Alignment.TopRight, GUI.Style, crewFrame); - previewPlayer.Padding = new Vector4(5.0f, 5.0f, 5.0f, 5.0f); - previewPlayer.UserData = "selectedcharacter"; - - var infoFrame = character.Info.CreateInfoFrame(previewPlayer); - - return true; - } - - private bool ToggleCrewFrame(GUIButton button, object obj) - { - crewFrameOpen = !crewFrameOpen; - return true; } public bool EnterChatMessage(GUITextBox textBox, string message) @@ -251,7 +187,6 @@ namespace Barotrauma.Networking //float prevScroll = chatBox.BarScroll; float prevSize = chatBox.BarSize; - float oldScroll = chatBox.BarScroll; msg.Padding = new Vector4(20, 0, 0, 0); chatBox.AddChild(msg); @@ -265,13 +200,13 @@ namespace Barotrauma.Networking public virtual void Update(float deltaTime) { - if (gameStarted) + if (gameStarted && Screen.Selected == GameMain.GameScreen) { inGameHUD.Update(deltaTime); - if (crewFrameOpen) crewFrame.Update(deltaTime); + //if (crewFrameOpen) crewFrame.Update(deltaTime); - if (Character.Controlled != null && Character.Controlled.IsDead) + if (Character.Controlled == null || Character.Controlled.IsDead) { GameMain.GameScreen.Cam.TargetPos = Vector2.Zero; GameMain.LightManager.LosEnabled = false; @@ -294,11 +229,14 @@ namespace Barotrauma.Networking public virtual void Draw(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch) { - if (!gameStarted) return; + if (!gameStarted && Screen.Selected != GameMain.GameScreen) return; inGameHUD.Draw(spriteBatch); + } - if (crewFrameOpen) crewFrame.Draw(spriteBatch); + public virtual bool SelectCrewCharacter(GUIComponent component, object obj) + { + return false; } public virtual void Disconnect() { } diff --git a/Subsurface/Source/Particles/Particle.cs b/Subsurface/Source/Particles/Particle.cs index 75ea43ef8..0d9f15e22 100644 --- a/Subsurface/Source/Particles/Particle.cs +++ b/Subsurface/Source/Particles/Particle.cs @@ -10,6 +10,9 @@ namespace Barotrauma.Particles { private ParticlePrefab prefab; + public delegate void OnChangeHullHandler(Vector2 position, Hull currentHull); + public OnChangeHullHandler OnChangeHull; + private Vector2 position; private Vector2 prevPosition; @@ -26,6 +29,8 @@ namespace Barotrauma.Particles private Color color; private float alpha; + private int spriteIndex; + private float totalLifeTime; private float lifeTime; @@ -37,12 +42,17 @@ namespace Barotrauma.Particles private Hull currentHull; - private List hullLimits; + private List hullGaps; public ParticlePrefab.DrawTargetType DrawTarget { get { return prefab.DrawTarget; } } + + public ParticleBlendState BlendState + { + get { return prefab.BlendState; } + } public Vector2 Size { @@ -56,10 +66,12 @@ namespace Barotrauma.Particles set { velocityChange = value; } } - public void Init(ParticlePrefab prefab, Vector2 position, Vector2 speed, float rotation) + public void Init(ParticlePrefab prefab, Vector2 position, Vector2 speed, float rotation, Hull hullGuess = null) { this.prefab = prefab; + spriteIndex = Rand.Int(prefab.Sprites.Count); + this.position = position; prevPosition = position; @@ -84,11 +96,15 @@ namespace Barotrauma.Particles velocityChange = prefab.VelocityChange; + OnChangeHull = null; + if (prefab.DeleteOnCollision || prefab.CollidesWithWalls) { - //currentHull = Hull.FindHull(position); - hullLimits = new List(); - hullLimits = FindLimits(position); + currentHull = Hull.FindHull(position, hullGuess); + + hullGaps = currentHull==null ? new List() : currentHull.FindGaps(); + //hullLimits = new List(); + //hullLimits = FindLimits(position); } if (prefab.RotateToDirection) @@ -99,55 +115,17 @@ namespace Barotrauma.Particles } } - private List FindLimits(Vector2 position) - { - List hullList = new List(); + //private List FindLimits(Vector2 position) + //{ + // List hullList = new List(); - currentHull = Hull.FindHull(position); - if (currentHull == null) return hullList; + // currentHull = Hull.FindHull(position); + // if (currentHull == null) return hullList; - hullList.Add(currentHull); - - return FindAdjacentHulls(hullList, currentHull, Math.Abs(velocity.X)>Math.Abs(velocity.Y)); - } + // hullList.Add(currentHull); - private List FindAdjacentHulls(List adjacentHulls, Hull currentHull, bool isHorizontal) - { - foreach (Gap gap in Gap.GapList) - { - if (gap.isHorizontal != isHorizontal) continue; - if (gap.Open < 0.01f) continue; - if (gap.linkedTo.Count==0) - { - continue; - } - else if (gap.linkedTo.Count==1) - { - if (!adjacentHulls.Contains(gap.linkedTo[0] as Hull)) - { - adjacentHulls.Add(gap.linkedTo[0] as Hull); - } - } - else if (gap.linkedTo[0] == currentHull && gap.linkedTo[1] != null) - { - if (!adjacentHulls.Contains(gap.linkedTo[1] as Hull)) - { - adjacentHulls.Add(gap.linkedTo[1] as Hull); - FindAdjacentHulls(adjacentHulls, gap.linkedTo[1] as Hull, isHorizontal); - } - } - else if (gap.linkedTo[1] == currentHull && gap.linkedTo[0] != null) - { - if (!adjacentHulls.Contains(gap.linkedTo[0] as Hull)) - { - adjacentHulls.Add(gap.linkedTo[0] as Hull); - FindAdjacentHulls(adjacentHulls, gap.linkedTo[0] as Hull, isHorizontal); - } - } - } - - return adjacentHulls; - } + // return FindAdjacentHulls(hullList, currentHull, Math.Abs(velocity.X) > Math.Abs(velocity.Y)); + //} public bool Update(float deltaTime) { @@ -182,24 +160,57 @@ namespace Barotrauma.Particles if ((prefab.DeleteOnCollision || prefab.CollidesWithWalls) && currentHull!=null) { - bool insideHull = false; - foreach (Hull hull in hullLimits) - { - if (!Submarine.RectContains(hull.Rect, position)) continue; + Vector2 edgePos = position + prefab.Sprites[spriteIndex].SourceRect.Width * Vector2.Normalize(velocity) * size.X; + //bool insideHull = false; + //foreach (Hull hull in hullLimits) + //{ + // if (!Submarine.RectContains(hull.Rect, edgePos)) continue; - insideHull = true; - break; - } + // insideHull = true; + // break; + //} - if (!insideHull) + if (!Submarine.RectContains(currentHull.Rect, edgePos)) { if (prefab.DeleteOnCollision) return false; - Hull prevHull = Hull.FindHull(prevPosition, hullLimits, currentHull); + bool gapFound = false; + foreach (Gap gap in hullGaps) + { + if (!gap.isHorizontal) + { + if (gap.Rect.X > position.X || gap.Rect.Right < position.X) continue; + if (Math.Sign(velocity.Y) != Math.Sign(gap.Rect.Y - position.Y)) continue; + } + else + { + if (gap.Rect.Y < position.Y || gap.Rect.Y - gap.Rect.Height > position.Y) continue; + if (Math.Sign(velocity.X) != Math.Sign(gap.Rect.X - position.X)) continue; + } - if (prevHull == null) return false; + //Rectangle enlargedRect = new Rectangle(gap.Rect.X - 10, gap.Rect.Y + 10, gap.Rect.Width + 20, gap.Rect.Height + 20); + //if (!Submarine.RectContains(enlargedRect, position)) continue; + gapFound = true; + } + + if (!gapFound) + { + + OnWallCollision(currentHull, edgePos); + } + else + { + currentHull = Hull.FindHull(position); + hullGaps = currentHull == null ? new List() : currentHull.FindGaps(); + + if (OnChangeHull != null) OnChangeHull(edgePos, currentHull); + + } + + //Hull prevHull = Hull.FindHull(prevPosition, hullLimits, currentHull); + + //if (prevHull == null) return false; - OnWallCollision(prevHull); } //if (position.Y < currentHull.Rect.Y-currentHull.Rect.Height) @@ -217,10 +228,10 @@ namespace Barotrauma.Particles return true; } - private void OnWallCollision(Hull prevHull) + private void OnWallCollision(Hull prevHull, Vector2 position) { - float restitution = 0.05f; - + float restitution = 0.5f; + if (position.Y < prevHull.Rect.Y - prevHull.Rect.Height) { position.Y = prevHull.Rect.Y - prevHull.Rect.Height + 1.0f; @@ -229,7 +240,8 @@ namespace Barotrauma.Particles else if (position.Y > prevHull.Rect.Y) { position.Y = prevHull.Rect.Y - 1.0f; - velocity.Y = -velocity.Y; + velocity.X = Math.Abs(velocity.Y) * Math.Sign(velocity.X); + velocity.Y = -velocity.Y*0.1f; } if (position.X < prevHull.Rect.X) @@ -262,7 +274,9 @@ namespace Barotrauma.Particles } - prefab.Sprite.Draw(spriteBatch, drawPosition, color*alpha, prefab.Sprite.origin, drawRotation, drawSize, SpriteEffects.None, prefab.Sprite.Depth); + prefab.Sprites[spriteIndex].Draw(spriteBatch, drawPosition, color * alpha, + prefab.Sprites[spriteIndex].origin, drawRotation, + drawSize, SpriteEffects.None, prefab.Sprites[spriteIndex].Depth); //spriteBatch.Draw( // prefab.sprite.Texture, diff --git a/Subsurface/Source/Particles/ParticleManager.cs b/Subsurface/Source/Particles/ParticleManager.cs index 750ccfdf1..04b2da216 100644 --- a/Subsurface/Source/Particles/ParticleManager.cs +++ b/Subsurface/Source/Particles/ParticleManager.cs @@ -7,9 +7,16 @@ using Microsoft.Xna.Framework.Graphics; namespace Barotrauma.Particles { + enum ParticleBlendState + { + AlphaBlend, Additive + } + class ParticleManager { public static int particleCount; + + private const int MaxOutOfViewDist = 500; private const int MaxParticles = 1500; private Particle[] particles; @@ -45,23 +52,23 @@ namespace Barotrauma.Particles return CreateParticle(prefabName, position, new Vector2((float)Math.Cos(angle), (float)Math.Sin(angle)) * speed, angle); } - public Particle CreateParticle(string prefabName, Vector2 position, Vector2 speed, float rotation=0.0f) + public Particle CreateParticle(string prefabName, Vector2 position, Vector2 speed, float rotation=0.0f, Hull hullGuess = null) { ParticlePrefab prefab = FindPrefab(prefabName); - return CreateParticle(prefab, position, speed, rotation); + return CreateParticle(prefab, position, speed, rotation, hullGuess); } - public Particle CreateParticle(ParticlePrefab prefab, Vector2 position, Vector2 speed, float rotation=0.0f) + public Particle CreateParticle(ParticlePrefab prefab, Vector2 position, Vector2 speed, float rotation = 0.0f, Hull hullGuess = null) { - if (!Submarine.RectContains(cam.WorldView, position)) return null; + if (!Submarine.RectContains(MathUtils.ExpandRect(cam.WorldView, MaxOutOfViewDist), position)) return null; //if (!cam.WorldView.Contains(position)) return null; if (particleCount >= MaxParticles) return null; if (particles[particleCount] == null) particles[particleCount] = new Particle(); - particles[particleCount].Init(prefab, position, speed, rotation); + particles[particleCount].Init(prefab, position, speed, rotation, hullGuess); particleCount++; @@ -100,12 +107,13 @@ namespace Barotrauma.Particles } } - public void Draw(SpriteBatch spriteBatch, bool inWater) + public void Draw(SpriteBatch spriteBatch, bool inWater, ParticleBlendState blendState) { ParticlePrefab.DrawTargetType drawTarget = inWater ? ParticlePrefab.DrawTargetType.Water : ParticlePrefab.DrawTargetType.Air; for (int i = 0; i < particleCount; i++) { + if (particles[i].BlendState != blendState) continue; if (!particles[i].DrawTarget.HasFlag(drawTarget)) continue; particles[i].Draw(spriteBatch); diff --git a/Subsurface/Source/Particles/ParticlePrefab.cs b/Subsurface/Source/Particles/ParticlePrefab.cs index d505b3131..04ceb3be2 100644 --- a/Subsurface/Source/Particles/ParticlePrefab.cs +++ b/Subsurface/Source/Particles/ParticlePrefab.cs @@ -1,6 +1,7 @@ using System.Xml.Linq; using Microsoft.Xna.Framework; using FarseerPhysics; +using System.Collections.Generic; namespace Barotrauma.Particles { @@ -10,7 +11,7 @@ namespace Barotrauma.Particles public readonly string Name; - public readonly Sprite Sprite; + public readonly List Sprites; public readonly float AngularVelocityMin, AngularVelocityMax; @@ -35,17 +36,21 @@ namespace Barotrauma.Particles public readonly DrawTargetType DrawTarget; + public readonly ParticleBlendState BlendState; + public readonly bool RotateToDirection; public ParticlePrefab(XElement element) { Name = element.Name.ToString(); + Sprites = new List(); + foreach (XElement subElement in element.Elements()) { if (subElement.Name.ToString().ToLower() != "sprite") continue; - Sprite = new Sprite(subElement); + Sprites.Add(new Sprite(subElement)); } if (element.Attribute("angularvelocity") == null) @@ -81,6 +86,10 @@ namespace Barotrauma.Particles SizeChangeMax = SizeChangeMin; } + var blendState = ToolBox.GetAttributeString(element, "blendstate", "alphablend"); + + BlendState = (blendState != "additive") ? ParticleBlendState.AlphaBlend : ParticleBlendState.Additive; + GrowTime = ToolBox.GetAttributeFloat(element, "growtime", 0.0f); if (element.Attribute("startrotation") == null) diff --git a/Subsurface/Source/Physics/PhysicsBody.cs b/Subsurface/Source/Physics/PhysicsBody.cs index 05a916536..1e42e05a9 100644 --- a/Subsurface/Source/Physics/PhysicsBody.cs +++ b/Subsurface/Source/Physics/PhysicsBody.cs @@ -41,7 +41,7 @@ namespace Barotrauma private float density; //the direction the item is facing (for example, a gun has to be - //flipped horizontally if the character holding it turns around) + //flipped horizontally if the Character holding it turns around) float dir; public Vector2 TargetPosition diff --git a/Subsurface/Source/PlayerInput.cs b/Subsurface/Source/PlayerInput.cs index a5d33222c..1c5214111 100644 --- a/Subsurface/Source/PlayerInput.cs +++ b/Subsurface/Source/PlayerInput.cs @@ -309,14 +309,14 @@ namespace Barotrauma { if (!oldKeyboardState.IsKeyUp(key)) continue; - char character = (char)key; + char Character = (char)key; if (keyboardState.IsKeyUp(Keys.LeftShift) && keyboardState.IsKeyUp(Keys.RightShift)) { - character = char.ToLower(character); + Character = char.ToLower(Character); } - EventInput.EventInput.OnCharEntered(character); + EventInput.EventInput.OnCharEntered(Character); } #endif diff --git a/Subsurface/Source/Properties.cs b/Subsurface/Source/Properties.cs index 21503aa68..a2fae550f 100644 --- a/Subsurface/Source/Properties.cs +++ b/Subsurface/Source/Properties.cs @@ -232,7 +232,7 @@ namespace Barotrauma { ObjectProperty property = null; if (!dictionary.TryGetValue(attribute.Name.ToString().ToLower(), out property)) continue; - if (property.Attributes.OfType().Count() == 0) continue; + if (!property.Attributes.OfType().Any()) continue; property.TrySetValue(attribute.Value); } diff --git a/Subsurface/Source/Screens/EditMapScreen.cs b/Subsurface/Source/Screens/EditMapScreen.cs index 9214a425c..c354f30e2 100644 --- a/Subsurface/Source/Screens/EditMapScreen.cs +++ b/Subsurface/Source/Screens/EditMapScreen.cs @@ -14,7 +14,7 @@ namespace Barotrauma private GUIComponent[] GUItabs; private int selectedTab; - //a character used for picking up and manipulating items + //a Character used for picking up and manipulating items private Character dummyCharacter; private bool characterMode; diff --git a/Subsurface/Source/Screens/GameScreen.cs b/Subsurface/Source/Screens/GameScreen.cs index 6cd0d8461..b8faa7b55 100644 --- a/Subsurface/Source/Screens/GameScreen.cs +++ b/Subsurface/Source/Screens/GameScreen.cs @@ -254,7 +254,7 @@ namespace Barotrauma BlendState.AlphaBlend, null, DepthStencilState.DepthRead, null, null, cam.Transform); - GameMain.ParticleManager.Draw(spriteBatch, true); + GameMain.ParticleManager.Draw(spriteBatch, true, Particles.ParticleBlendState.AlphaBlend); spriteBatch.End(); @@ -271,10 +271,17 @@ namespace Barotrauma BlendState.AlphaBlend, null, DepthStencilState.DepthRead, null, null, cam.Transform); - - GameMain.ParticleManager.Draw(spriteBatch, false); + GameMain.ParticleManager.Draw(spriteBatch, false, Particles.ParticleBlendState.AlphaBlend); spriteBatch.End(); + spriteBatch.Begin(SpriteSortMode.Immediate, + BlendState.Additive, + null, DepthStencilState.DepthRead, null, null, + cam.Transform); + GameMain.ParticleManager.Draw(spriteBatch, false, Particles.ParticleBlendState.Additive); + spriteBatch.End(); + + graphics.SetRenderTarget(null); //---------------------------------------------------------------------------------------- diff --git a/Subsurface/Source/Screens/LobbyScreen.cs b/Subsurface/Source/Screens/LobbyScreen.cs index abddf7fbe..4d8e8edf6 100644 --- a/Subsurface/Source/Screens/LobbyScreen.cs +++ b/Subsurface/Source/Screens/LobbyScreen.cs @@ -54,6 +54,11 @@ namespace Barotrauma } } + private CrewManager CrewManager + { + get { return GameMain.GameSession.CrewManager; } + } + public LobbyScreen() { Rectangle panelRect = new Rectangle( @@ -68,7 +73,7 @@ namespace Barotrauma // save, Color.Transparent, Color.White, Alignment.Left, GUI.Style, leftPanel); GUITextBlock moneyText = new GUITextBlock(new Rectangle(0, 30, 0, 25), "", GUI.Style, - Alignment.TopCenter, Alignment.Top, leftPanel); + Alignment.TopLeft, Alignment.TopLeft, leftPanel); moneyText.TextGetter = GetMoney; GUIButton button = new GUIButton(new Rectangle(0, 70, 100, 30), "Map", null, Alignment.TopCenter, GUI.Style, leftPanel); @@ -234,7 +239,7 @@ namespace Barotrauma private void UpdateCharacterLists() { characterList.ClearChildren(); - foreach (CharacterInfo c in gameMode.CrewManager.characterInfos) + foreach (CharacterInfo c in CrewManager.characterInfos) { GUITextBlock textBlock = new GUITextBlock( new Rectangle(0, 0, 0, 25), @@ -291,7 +296,7 @@ namespace Barotrauma CreateItemFrame(prefab, selectedItemList); - buyButton.Enabled = gameMode.CrewManager.Money >= selectedItemCost; + buyButton.Enabled = CrewManager.Money >= selectedItemCost; return false; } @@ -310,9 +315,9 @@ namespace Barotrauma { int cost = selectedItemCost; - if (gameMode.CrewManager.Money < cost) return false; + if (CrewManager.Money < cost) return false; - gameMode.CrewManager.Money -= cost; + CrewManager.Money -= cost; for (int i = selectedItemList.children.Count-1; i>=0; i--) { @@ -345,7 +350,7 @@ namespace Barotrauma public override void Draw(double deltaTime, GraphicsDevice graphics, SpriteBatch spriteBatch) { - if (characterList.CountChildren != gameMode.CrewManager.characterInfos.Count) + if (characterList.CountChildren != CrewManager.characterInfos.Count) { UpdateCharacterLists(); } @@ -406,7 +411,7 @@ namespace Barotrauma private string GetMoney() { - return "Money: " + ((GameMain.GameSession == null) ? "" : gameMode.CrewManager.Money.ToString()); + return "Money: " + ((GameMain.GameSession == null) ? "" : CrewManager.Money.ToString()); } private bool SelectCharacter(GUIComponent component, object selection) diff --git a/Subsurface/Source/Screens/NetLobbyScreen.cs b/Subsurface/Source/Screens/NetLobbyScreen.cs index 24afdc285..a1f409a8e 100644 --- a/Subsurface/Source/Screens/NetLobbyScreen.cs +++ b/Subsurface/Source/Screens/NetLobbyScreen.cs @@ -129,7 +129,7 @@ namespace Barotrauma //server info panel ------------------------------------------------------------ infoFrame = new GUIFrame(new Rectangle(0, 0, (int)(panelRect.Width * 0.7f), (int)(panelRect.Height * 0.6f)), GUI.Style, menu); - infoFrame.Padding = new Vector4(20.0f, 20.0f, 20.0f, 20.0f); ; + infoFrame.Padding = new Vector4(20.0f, 20.0f, 20.0f, 20.0f); //chatbox ---------------------------------------------------------------------- GUIFrame chatFrame = new GUIFrame( @@ -295,8 +295,8 @@ namespace Barotrauma ServerName = (GameMain.Server==null) ? "Server" : GameMain.Server.Name; - infoFrame.RemoveChild(infoFrame.children.Find(c => c.UserData as string == "startButton")); + infoFrame.RemoveChild(infoFrame.children.Find(c => c.UserData as string == "spectateButton")); playerList.Parent.RemoveChild(playerList.Parent.children.Find(c => c.UserData as string == "banListButton")); @@ -313,15 +313,13 @@ namespace Barotrauma GUIButton settingsButton = new GUIButton(new Rectangle(-100, 0, 80, 30), "Settings", Alignment.BottomRight, GUI.Style, infoFrame); settingsButton.OnClicked = GameMain.Server.ToggleSettingsFrame; + settingsButton.CanBeSelected = false; settingsButton.UserData = "settingsButton"; var banListButton = new GUIButton(new Rectangle(0, 30, 100, 20), "Banned IPs", Alignment.BottomRight, GUI.Style, playerList.Parent); banListButton.OnClicked = GameMain.Server.BanList.ToggleBanFrame; banListButton.UserData = "banListButton"; - //mapList.OnSelected = new GUIListBox.OnSelectedHandler(Game1.server.UpdateNetLobby); - //modeList.OnSelected += GameMain.Server.UpdateNetLobby; - if (subList.CountChildren > 0 && subList.Selected == null) subList.Select(-1); if (GameModePreset.list.Count > 0 && modeList.Selected == null) modeList.Select(-1); @@ -337,8 +335,15 @@ namespace Barotrauma if (GameMain.Server.SubSelectionMode == SelectionMode.Random) subList.Select(Rand.Range(0,subList.CountChildren)); if (GameMain.Server.ModeSelectionMode == SelectionMode.Random) modeList.Select(Rand.Range(0, modeList.CountChildren)); } - else + else if (GameMain.Client != null) { + if (GameMain.Client.GameStarted) + { + GUIButton spectateButton = new GUIButton(new Rectangle(0, 0, 80, 30), "Spectate", Alignment.BottomRight, GUI.Style, infoFrame); + spectateButton.OnClicked = GameMain.Client.SpectateClicked; + spectateButton.UserData = "spectateButton"; + } + UpdatePlayerFrame(GameMain.Client.CharacterInfo); } @@ -654,7 +659,6 @@ namespace Barotrauma public void NewChatMessage(string message, Color color) { float prevSize = chatBox.BarSize; - float oldScroll = chatBox.BarScroll; while (chatBox.CountChildren>20) { diff --git a/Subsurface/Source/Screens/NetLobbyVoting.cs b/Subsurface/Source/Screens/NetLobbyVoting.cs index ee3a3029f..6f6bee116 100644 --- a/Subsurface/Source/Screens/NetLobbyVoting.cs +++ b/Subsurface/Source/Screens/NetLobbyVoting.cs @@ -24,7 +24,7 @@ namespace Barotrauma if (GameMain.Server != null) { - UpdateVoteTexts(GameMain.Server.connectedClients, VoteType.Sub); + UpdateVoteTexts(GameMain.Server.ConnectedClients, VoteType.Sub); GameMain.Server.UpdateVoteStatus(); } else @@ -44,7 +44,7 @@ namespace Barotrauma GameMain.NetLobbyScreen.InfoFrame.FindChild("modevotes").Visible = value; if (GameMain.Server != null) { - UpdateVoteTexts(GameMain.Server.connectedClients, VoteType.Mode); + UpdateVoteTexts(GameMain.Server.ConnectedClients, VoteType.Mode); GameMain.Server.UpdateVoteStatus(); } else diff --git a/Subsurface/Source/Screens/ServerListScreen.cs b/Subsurface/Source/Screens/ServerListScreen.cs index 20c7aa855..904219bc4 100644 --- a/Subsurface/Source/Screens/ServerListScreen.cs +++ b/Subsurface/Source/Screens/ServerListScreen.cs @@ -143,7 +143,7 @@ namespace Barotrauma if (string.IsNullOrWhiteSpace(masterServerData)) { - var nameText = new GUITextBlock(new Rectangle(0, 0, 0, 20), "Couldn't find any servers", GUI.Style, serverList); + new GUITextBlock(new Rectangle(0, 0, 0, 20), "Couldn't find any servers", GUI.Style, serverList); return; } diff --git a/Subsurface/Source/Sounds/SoundPlayer.cs b/Subsurface/Source/Sounds/SoundPlayer.cs index ddef81f8a..7b9d21872 100644 --- a/Subsurface/Source/Sounds/SoundPlayer.cs +++ b/Subsurface/Source/Sounds/SoundPlayer.cs @@ -217,7 +217,7 @@ namespace Barotrauma Task criticalTask = null; if (GameMain.GameSession!=null) { - foreach (Task task in GameMain.GameSession.taskManager.Tasks) + foreach (Task task in GameMain.GameSession.TaskManager.Tasks) { if (!task.IsStarted) continue; if (criticalTask == null || task.Priority > criticalTask.Priority) diff --git a/Subsurface/Source/Utils/MathUtils.cs b/Subsurface/Source/Utils/MathUtils.cs index 645e46eb2..b46cddf37 100644 --- a/Subsurface/Source/Utils/MathUtils.cs +++ b/Subsurface/Source/Utils/MathUtils.cs @@ -42,6 +42,10 @@ namespace Barotrauma return (IsValid(vector.X) && IsValid(vector.Y)); } + public static Rectangle ExpandRect(Rectangle rect, int amount) + { + return new Rectangle(rect.X - amount, rect.Y + amount, rect.Width + amount * 2, rect.Height + amount * 2); + } public static int VectorOrientation(Vector2 p1, Vector2 p2, Vector2 p) { diff --git a/Subsurface/Source/Utils/ToolBox.cs b/Subsurface/Source/Utils/ToolBox.cs index 5afb9de85..1dc516a4a 100644 --- a/Subsurface/Source/Utils/ToolBox.cs +++ b/Subsurface/Source/Utils/ToolBox.cs @@ -179,7 +179,6 @@ namespace Barotrauma var attribute = element.Attribute(name); if (attribute == null) return defaultValue; - string val = attribute.Value.ToLower().Trim(); return GetAttributeBool(attribute, defaultValue); } diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index 37f70570d09c7028a106bdb526e9ea6adc3d8f4b..09f6f31b27c580fdcc5baf6b8250feba32ac9389 100644 GIT binary patch delta 24232 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