From 70311e9f862c0242729af3098a7f9157442cc677 Mon Sep 17 00:00:00 2001 From: AGAININGTRYING211 Date: Fri, 30 May 2025 21:35:46 -0700 Subject: [PATCH 1/8] Troubleshooting............ Added 3 skins Added use sprite for Backup Firewall 2.0 and hit sparks for both primaries. Also updated several existing sprites Added a hidden multiplayer interaction Nerfed Fine Tune and Troubleshoot damage to 150%, and Forced Shutdown to 400%. Fine Tune now temporarily upgrades for 30 seconds and Forced Shutdown only stuns when upgraded Fixed several issues, including a crash that would occur when a turret's line of sight would not meet a wall, several errors that would randomly occur due to data, and turrets and Troubleshoot could not hit Bramble Heads or segmented enemies Comment update soon (tm)........ --- Language/english.json | 18 +- Misc/sharedObjects.lua | 22 +- Misc/votvlibrary.lua | 18 +- Sprites/Survivors/Technician/minea.png | Bin 613 -> 641 bytes Sprites/Survivors/Technician/mineb.png | Bin 902 -> 889 bytes Sprites/Survivors/Technician/palette.png | Bin 160 -> 624 bytes Sprites/Survivors/Technician/portrait.png | Bin 3561 -> 3468 bytes Sprites/Survivors/Technician/portraitPROV.png | Bin 0 -> 3547 bytes Sprites/Survivors/Technician/portraitS1.png | Bin 0 -> 3573 bytes Sprites/Survivors/Technician/portraitS2.png | Bin 0 -> 3507 bytes Sprites/Survivors/Technician/portraitS3.png | Bin 0 -> 3555 bytes Sprites/Survivors/Technician/portraitS4.png | Bin 0 -> 3471 bytes .../Survivors/Technician/portraitSmall.png | Bin 1073 -> 1001 bytes .../Technician/portraitSmallPROV.png | Bin 0 -> 997 bytes .../Survivors/Technician/portraitSmallS1.png | Bin 0 -> 897 bytes .../Survivors/Technician/portraitSmallS2.png | Bin 0 -> 994 bytes .../Survivors/Technician/portraitSmallS3.png | Bin 0 -> 1012 bytes .../Survivors/Technician/portraitSmallS4.png | Bin 0 -> 1002 bytes Sprites/Survivors/Technician/select.png | Bin 24522 -> 20135 bytes Sprites/Survivors/Technician/selectPROV.png | Bin 0 -> 19796 bytes Sprites/Survivors/Technician/selectS1.png | Bin 0 -> 24498 bytes Sprites/Survivors/Technician/selectS2.png | Bin 0 -> 19887 bytes Sprites/Survivors/Technician/selectS3.png | Bin 0 -> 20099 bytes Sprites/Survivors/Technician/selectS4.png | Bin 0 -> 19930 bytes Sprites/Survivors/Technician/shoot1T_1.png | Bin 2049 -> 2041 bytes Sprites/Survivors/Technician/shoot1T_2.png | Bin 1880 -> 1879 bytes Sprites/Survivors/Technician/shoot5.png | Bin 0 -> 3902 bytes Sprites/Survivors/Technician/sparks4.png | Bin 0 -> 314 bytes Sprites/Survivors/Technician/sparks5.png | Bin 0 -> 381 bytes Sprites/Survivors/Technician/turreta.png | Bin 865 -> 854 bytes Sprites/Survivors/Technician/turretashoot.png | Bin 1463 -> 1451 bytes Sprites/Survivors/Technician/turretb.png | Bin 1073 -> 1031 bytes .../Survivors/Technician/turretexplosion.png | Bin 1203 -> 0 bytes Survivors/technician.lua | 792 ++++++++++-------- 34 files changed, 507 insertions(+), 343 deletions(-) create mode 100644 Sprites/Survivors/Technician/portraitPROV.png create mode 100644 Sprites/Survivors/Technician/portraitS1.png create mode 100644 Sprites/Survivors/Technician/portraitS2.png create mode 100644 Sprites/Survivors/Technician/portraitS3.png create mode 100644 Sprites/Survivors/Technician/portraitS4.png create mode 100644 Sprites/Survivors/Technician/portraitSmallPROV.png create mode 100644 Sprites/Survivors/Technician/portraitSmallS1.png create mode 100644 Sprites/Survivors/Technician/portraitSmallS2.png create mode 100644 Sprites/Survivors/Technician/portraitSmallS3.png create mode 100644 Sprites/Survivors/Technician/portraitSmallS4.png create mode 100644 Sprites/Survivors/Technician/selectPROV.png create mode 100644 Sprites/Survivors/Technician/selectS1.png create mode 100644 Sprites/Survivors/Technician/selectS2.png create mode 100644 Sprites/Survivors/Technician/selectS3.png create mode 100644 Sprites/Survivors/Technician/selectS4.png create mode 100644 Sprites/Survivors/Technician/shoot5.png create mode 100644 Sprites/Survivors/Technician/sparks4.png create mode 100644 Sprites/Survivors/Technician/sparks5.png delete mode 100644 Sprites/Survivors/Technician/turretexplosion.png diff --git a/Language/english.json b/Language/english.json index 09740e7d..52d38408 100644 --- a/Language/english.json +++ b/Language/english.json @@ -33,6 +33,16 @@ "nameUpper": "TECHNICIAN", "description": "The Technician is excellent at setting up and maintaining zones of enemy denial. Forced Shutdown can forcibly lock down an area when upgraded. Upgrading gadgets improves their effectiveness, but be careful when doing so in dangerous situations!", "endQuote": "..and so he left, by switching the ship off and on again." + }, + "swapNemesis": { + "name": "Nemesis Survivors", + "nameUpper": "NEMESIS SURVIVORS", + "description": "Swap to the familiar yet twisted Nemesis survivors." + }, + "swapNormal": { + "name": "Normal Survivors", + "nameUpper": "NORMAL SURVIVORS", + "description": "Swap to the regular set of survivors." } }, "skill" : { @@ -118,19 +128,19 @@ }, "technicianZ": { "name": "Fine Tune", - "description": "Strike forward with a wrench for 210% damage.\nHitting gadgets 3 times upgrades them." + "description": "Strike forward with a wrench for 150% damage.\nHitting gadgets 3 times temporarily upgrades them for 30 seconds." }, "technicianZ2": { "name": "Troubleshoot", - "description": "Throw a wrench forward, piercing up to 3 enemies for 100% damage.\nHitting gadgets 3 times temporarily upgrades them." + "description": "Throw a wrench forward, piercing up to 3 enemies for 150% damage.\nHitting gadgets 3 times temporarily upgrades them for 20 seconds." }, "technicianX": { "name": "Forced Shutdown", - "description": "Toss out a stunning bomb dealing 700% damage on reactivation.\nPassively pulls in enemies when upgraded." + "description": "Toss out a bomb dealing 400% damage on reactivation.\nStuns and passively pulls in enemies when upgraded." }, "technicianX2": { "name": "The Red Button", - "description": "Detonate the dropped bomb for 700% damage, stunning enemies." + "description": "Detonate the dropped bomb for 400% damage.\nStuns enemies when upgraded." }, "technicianC": { "name": "24/7 Energy", diff --git a/Misc/sharedObjects.lua b/Misc/sharedObjects.lua index 0f34302e..d716827d 100644 --- a/Misc/sharedObjects.lua +++ b/Misc/sharedObjects.lua @@ -2,19 +2,24 @@ obj_sparks = Object.new(NAMESPACE, "sparks") obj_sparks:set_sprite(gm.constants.sSparks2) -obj_sparks:set_depth(1) +obj_sparks.obj_depth = 1 obj_sparks:onCreate(function(inst) - inst:get_data().frame_index = 0 + inst.frame_index = 0 + inst.image_yscale = math.random(0, 1) * 2 - 1 inst.image_speed = 0.33 end) obj_sparks:onStep(function(inst) - local data = inst:get_data() - data.frame_index = data.frame_index + inst.image_speed - inst.image_index = data.frame_index - if data.frame_index >= gm.sprite_get_number(inst.sprite_index) then + inst.frame_index = inst.frame_index + inst.image_speed + inst.image_index = inst.frame_index + if inst.frame_index >= gm.sprite_get_number(inst.sprite_index) then inst:destroy() end end) +obj_sparks:onDraw(function(inst) + if inst.skinnable then + inst:actor_skin_skinnable_draw_self() + end +end) obj_fading_sparks = Object.new(NAMESPACE, "fading_sparks") obj_fading_sparks:set_sprite(gm.constants.sEfChestRain) @@ -53,4 +58,9 @@ obj_sprite_layer:onStep(function(inst) if not inst.parent or not Instance.exists(inst.parent) then inst:destroy() end +end) +obj_sprite_layer:onDraw(function(inst) + if inst.skinnable then + inst:actor_skin_skinnable_draw_self() + end end) \ No newline at end of file diff --git a/Misc/votvlibrary.lua b/Misc/votvlibrary.lua index 3359cfa3..f2f600ab 100644 --- a/Misc/votvlibrary.lua +++ b/Misc/votvlibrary.lua @@ -20,13 +20,14 @@ function move_point_contact_solid(x, y, angle, amount) local totalMoved = 0 local xx = math.cos(math.rad(angle)) local yy = math.sin(math.rad(angle)) - while totalMoved <= amount do + while totalMoved < amount do x = x + xx * 32 y = y + yy * 32 - totalMoved = totalMoved + xx * 32 + yy * 32 - if totalMoved > amount then + totalMoved = totalMoved + 32 + if totalMoved >= amount then x = x - xx * (totalMoved - amount) y = y - yy * (totalMoved - amount) + break end if is_point_colliding_stage(x, y) then for i = 0, 31 do @@ -129,9 +130,9 @@ function move_contact_air(inst, angle, amount) return x, y end -function move_in_direction(inst, angle, amount) - inst.x = inst.x + math.cos(math.rad(angle)) * amount - inst.y = inst.y + math.sin(math.rad(angle)) * amount +function move_in_direction(inst, angle, amount, isDeg) + inst.x = inst.x + math.cos(isDeg and math.rad(angle) or angle) * amount + inst.y = inst.y + math.sin(isDeg and math.rad(angle) or angle) * amount end --Kinda useless but whatever... Feels better anyways @@ -177,4 +178,9 @@ function tableToString(t) return str end return serialize(t) +end + +function setNoProc(attack_info) --Simple, makes the attack not proc and makes the damage number yellow + attack_info.proc = false + attack_info.damage_color = Color.from_hex(0xC9B736) end \ No newline at end of file diff --git a/Sprites/Survivors/Technician/minea.png b/Sprites/Survivors/Technician/minea.png index 5702f1e0a5014baf35fd829d13b0d79823d25250..cb807cbe237a79abd2867535b3ec44b654ea5e9a 100644 GIT binary patch delta 569 zcmV-90>=I21c3#RF@GURL_t(&f$f;RZi6rsg%1(0P^3OUhGYyGt7HI0Fl6rDiIpW= zUZs2I4n$QlwCb2Lk|7Tei9CcmL`KE|Cow+(;%~CRhie~vuMI%UA&y04bRREoQo7C~ zYiL#U?mYlShv;XxF9jEn%s+2DomGUK{R%pjjhAI>f#oY_~cDE-05PW_C0NnWu05Bf( zg=3S|RZVHZWhTgLD3`Rdx;iK&u*?Lh<`TSCR#z8#(Fd>-qy}d7xpyko#hIaX)h5&T zlD4+mXivs70e^sFe9%N+Kc?@c4)d&zUaR8k=~`cOk%+e4`7C#pvDb)W5hIKM0P$$p zxUU$Xyjq{9kssH8ftJ8WbcVy zL_8V-!TQv8ZT#i*qpRW?9dBA)wO;3g0pd3=3VN+EZGS<=mmYBbHWOolb@BiT-?t2m zFalf~aBa|%kp;i9L^|4cyW5j2V@%(J>3eXela!9_FXKz$lxH!*2(fD??Lg3%-Q|z* zK{G-myS3?inRRPC=xfBW2wR(3-FVOkaH{3B55M^Ux0Q-p(fMGfLFOCd&SzLI(vzg^ zvrVZ1XD-jIdUzeK#L-_iWIx(}7 HlRp9`sj3h? delta 541 zcmV+&0^gF@FU~L_t(&f$f+vZi6rshJROFp-4SIhRkG3)ow_UU?5BP-XKec zNV!V)F3pfgk-D`iTbVob0FlTc+#z*p95B=v2Z+DPO8jH{_j}Ik13 zMxtF<-$|D4JikcRJ~@WWDU#YrLLa$MaPQ-u1us{GOR54!|&1&>u}j=ru4A zFcuCEoMFJ$v zBhd{f&ntCR!|8KeH1x4qIxh2FsY~x`EvZ$OI+rnefQrty(cA2>T5rYR;T|uC{l`0M zhdqX^_VK1}c0jjttwid9%G5cryjm%(ry4=VW3}E2-@R`cA6ytNuNP5`;IkL$Ddo!) zpq^IV%72p5!0F}4!yc%Cj%u)?MgZJmQHO@mAqV0uyqikN<}*FITPMyMlMCIH-w zpq|IIC-v!rl;QLRsKPErh`HI7EW4eL9!|NY364RMJ=|Rhjf+i#MMsWt`KK3?*~%C} zp3@YwDt!?AYZ1xv)H4lRZI}WipIo0vt@FwKAw1Ge#!f@TKRkc!`#7qxe~tTzy!cdh@g!y z@;w2DVHhjCr3MbwR>xZ^^KRiR7ci6=F7zzN5FiLmz=mVU41X88*|>%ygbxl38R8w* zR(xm(7)ry1Y;4|A8B*AAglv3IfEfEPF9f$} ziU8>vlD4&|bbtCpPz&xdK>OoKtXFTvSTA3U{jYoaZC`+`p)tPRvd};77o_`qoJYCKJa_AzI=!Vk+q#Ca2xEtlO%vy`t3!X0L;vKd0swK1O za}pPQQj4x`n5B{#Z8`vuC2{F`(>3;~_Pwd$Y_*7Lgf?pt8KebJ4$$R{!+26$pEen^ z22}&dUw@8FFK0m8Mnlw54c4^w1>9oOl@CUyMy3U*-_#BA8>!Y>`eN%QT!$$@a&bdv ze>@4B5wavkmc%!8aFcPm^g$`Z>26dTyL?kaE_NkZ5*IaGYS`+gh8nIZ`k|ppN49bK zrx%k!s*C{Su~{hD$CUl{$CEI{tVVr|$1)zNDS#NjwH?=}UKOxnnRhtg3o}{9WB(!P)M*qtmiV-x^@tC=Josgu;p%w%(-!LtQ|BMZ?``Ob K9~l^vQv)WJNRr?H diff --git a/Sprites/Survivors/Technician/palette.png b/Sprites/Survivors/Technician/palette.png index 225fe4e39ee867dcacc448a8f75c10602dc3a51d..8e0a21b9b38da3f5738bdd6dd2d75f9393b6f0f7 100644 GIT binary patch literal 624 zcmV-$0+0QPP)Px%DM>^@R5(w4(p^Z?VHC&l@54+ZU82rqU{0+l8%7c~h03UlHZ!7be4#*!F4CAH ztuqRY+afPq*hQ`iy*hgUe;%Rf~gS;L$hT@+r5kY?o1kMohnSoG+Rtp&aK zL&%rsBF1{Q?IyAKE@IktC<1FO8!;U3MFfA>%K7glXnjkBOg9;J*1;|(j=yixS!I!Z znj{iFWRq-v&Wq*>2Gg6!$g(4DS*>z16ynnm>@14mahHbq+)+0B_ac;s|B0{R=&*XW zrRI8dRA#TLW6PZr>R4ZXKpoANLUnxb^o=^&E;XoQQAwpL{sHwy?6+dTs#pL3002ov KPDHLkV1fXEbtE7F literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-W0V2~}Z=?b##^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!psA;eV~9jJqZY%}|BUMk>;5?eFiVO_UwgyK z^jl1D?cxfC+egn?Sy?ghvUA$m*)hC&{Ote#|KTqMFPm8|+6Od%!PC{xWt~$(69DEH BE`0z1 diff --git a/Sprites/Survivors/Technician/portrait.png b/Sprites/Survivors/Technician/portrait.png index b0adb3aa343fa450558c6c976eade3881a5d0aa2..de76881291d6c384db35ea11f9f762c430136df6 100644 GIT binary patch delta 3452 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 V0002eQ& literal 0 HcmV?d00001 diff --git a/Sprites/Survivors/Technician/portraitS1.png b/Sprites/Survivors/Technician/portraitS1.png new file mode 100644 index 0000000000000000000000000000000000000000..20891252c078a1c334e70a66ae5fe35b3471b812 GIT binary patch literal 3573 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 literal 0 HcmV?d00001 diff --git a/Sprites/Survivors/Technician/portraitS2.png b/Sprites/Survivors/Technician/portraitS2.png new file mode 100644 index 0000000000000000000000000000000000000000..fa759de948c5825a1b298b983fa10e5be6d8c1c1 GIT binary patch literal 3507 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 a>5j6lzCnEk0RI4pLU43<4^D@Z!viKTZ267= diff --git a/Sprites/Survivors/Technician/portraitSmallPROV.png b/Sprites/Survivors/Technician/portraitSmallPROV.png new file mode 100644 index 0000000000000000000000000000000000000000..b6eb796c3db3b58e9355ba145f4b5d57252597fa GIT binary patch literal 997 zcmVPx&g-Jv~R7i=vlx=8JR~W~C8G%l^HoB6mZ5DJ($2CYXrk-Hc{!gKXFgX3MGZ{=9N$@ z6oyaowERQqO2`WE>Klc#!m28~hPeQUFTiSdCxkl<`}Dd0Q_bGlxY96RtXSpP%$ddR z$Vp^oEtwN!TVp-vK5aC_CT=t*-S2Z{uqbz}(Weq9Yc@JE1ZcN?HtpM03c&r_D&AF!90Rxyd|{}S z-kHVj$Vrryug9DJmiANlXWCl7H-%(+d`w0{Y$|pD@MQQ87G*Cm>=9RE=e5f+Cg2vk zBPa3R`hx)6i~a<_9rdaqfoJo(4E96-@IQ;u+@~gW9n90526NMC9{Qc*w{H?1uh(EZ zd}|VqKlluQmyhfLU?4h7$5dQ`00w&^_@Bi9m~dt?*dN2`&eGQUV}u_)q@}DtLVXwh zaRv|_uh$yn`gYCc3dPSI^(rN4HhFBq(PSh9d5S5>>CWQd>kDUqgd?FBg!Pg%8_QiQ zS)usl;$$R*bE!ujk2pR75_&)JmmCM$x=lex_uj;+4-8Z;C;n?6>gl*)qjRYT_u^it zQyJ`!8P?9W1`YH4@(GUBZlSWeR6+oDA6|>Kxlg4e&4%shHvp)ozrsw1>a;g7{OI9~ zwZdf|1KQ&(w13;@cvmUxKD<`OOy5RPvyQ2_Y>+p@Kgtf%E0~*(>(mAVRNO-$;nDyL z<|(ohOVVt-=E~-m{I>z9jomYKJYAw@(}9QT+Kn}v?rb1B4Ef0uPj~rmy8EEU+?ie- zQ*rrn1oISvx#_be7VbtzhB#KcMaE5?nJLrbBWV9KrM)d>1q9lPx&I!Q!9R7gv`mTgE=VHC%YkB%}htV2Okk zSp*T5h#wY3P<^OKElHwKD-&T_*`m2Du+jWrTQ3R~LQzm;{LkfF?wwm(l$|g4K5ysu z{LlSA&lVA5h@GSV6cK=Bm+t)MxE~%T=j<6gLzQ(G32lb`a}p7mSEVrsVT#MA9l4tn z*g`35w;iD-TQ36_Oc_)Ggvc$~&QJ8QvXqR%uqrv+er0@LRHD>t66KduALe*C1igDP7Z9UoGec0%9PQ#3sKRJZ2PvDTnD zV2&h1T=?Hin`z|EHHu%eT$jAOaIe~i6SXeHfC~FlWk)UL-i|z@7@mxw5-mi zftL^Y>OnvacB~C?D@rXPC1p3(6)CP7^FHFI!`-J#&{SDZW8*IFOa1zqY*W6V>a8nH zJeFiKk;mtwW`~15*zMdG(Na<}_hQcpZlql}%+I08NgA8|%aTXAgX$LbQ=PYVeQUmJYY^KWmW5!MKKIzlR){f>p&nt%OWG^fkcrE zFig~#GY@bnzrVNZl!+>ouh^`=ZJ=sbLV^miJ{TpK%^x%}^h!}Cu$Y!Eni}sW_qj{z zVkx6x(GuF<)lTWL%C#lYX|w6t)mAIji2wwVTac_AYLpEi#J&2>y2S!(y?$2L zFAZGCa>L_YU~()3iunQWM!*sHZUX!E_?GH0Efub_G&FFRK>aUi0qS6l8S7Lh0$7lk zNQ;wlIFad%@}DA9;F}@*f%pUgVcLY2V&%_JAQ;Y(f5;gOq%I^(j(}JnWeXLe4z9es zuT7mEHViAaME?xMQO5z)nrEIt#28`@S*bnT!GQiHMLFfKgX9V8ms$&xD=U=5K(JrJ X4w3v@tOs`h00008G4~ literal 0 HcmV?d00001 diff --git a/Sprites/Survivors/Technician/portraitSmallS2.png b/Sprites/Survivors/Technician/portraitSmallS2.png new file mode 100644 index 0000000000000000000000000000000000000000..e0990716f604f89ecf550e3c23a2cf8a8e958a11 GIT binary patch literal 994 zcmV<810DQ{P)Px&f=NU{R7i=vlwW9@RTzh#jG*ms$!POe`;i6{VrGMD%jz6KrRsz>hUp5{8%5lp zE9`2hS1O3C7g8)N*nkung4>0Ht7Ftvb1?>;1x;s0+HZ|(L$Z>Lw5;hxXQ#xAk8_r< zN!ApsKM0)jelPEHe&>C23|5=7#Q!8Cz@eVE|MSA}*aZM?og3rmSL4KE7clIUv&IH9 zx6X|L;C#Igo86_scFNgQ?+}CQ*W`XjoHaI>nd%(^VE^}nGG+wub-Ywpk(2MfR`c86 z9gP4)k4Nx$+!7*ctH1wJzq81h5kCFw3-0980EEI}QmF+z9yh7f0sxjLU*WMM2Ur|F z&3XR`2^2C|ZO&4Qw{uI_MzH`OVNdM~JTzax%4-_|vh%;yV@{{JWP-r6UAox)we^a; z^4bQg%~>)vw{8n`<;4&9@z0yO*he!XHS-%A%<=6SU?y>mD?j~Q6=HE%DC7#*>@EP-R`0UMyjPbargi4% zmog^cMgadmFYwn4#4}UCBNdSL1D#|tT9I%t!1&dK{I-5?RhJtMYOcSrUS$48hQn{Z zN9cZ7b9S=7yR_2xIRH)Hy$?V(J>j{Rqx3x4oh7iK>oQWCS%Mc6Y{6K#&TEU1u56rAEtTd zNLNK1YF}x2?{u(gfO?D8qkjPa#8=WsV$G`n000hUSV?A0O#mtY000O800000007cc QlK=n!07*qoM6N<$g067S^#A|> literal 0 HcmV?d00001 diff --git a/Sprites/Survivors/Technician/portraitSmallS3.png b/Sprites/Survivors/Technician/portraitSmallS3.png new file mode 100644 index 0000000000000000000000000000000000000000..8c46940f9825b3b64621cfff6e4b9629bea0b034 GIT binary patch literal 1012 zcmVPx&lu1NER7i=vlx=KNRT#&A)nY;-8bV*#m_ruUQi7Rx#;x8BR;xysD5gUiK(|0FwrTL032o;Y)H0D#^^Bd@{4j75fR;#h>0Z@>JsAQ%+$%KOby0E(JTY7+ps+{N?4Hom+EfSbuQ%Y9xk z1~||*F4fBH%;t0zEkvFGJ$z?|{4JK%RSQBiBdA08naG68$H|T2{+QdzD%p61h@C?EJT! z?K(}%?PjuVZF(Vh@AkI=m_B^~fYECjQ<(*BQkQyFj zNXyc^d#8ZzdGjslC&KZR?(EzfTLGx@))P;k!RhgdV>2AZlH(|~C6=Id>nqswTIC#2 zI4)n0I{>PK0h}Hm%6*Se<*gTsvE(?b%2u0>Pd|GDWXM(XH|St^za=Ps>_gp|p{pT< z=_?~l9XcazTvfK38?GSq$4CtiN^6fE>6GS0?k{NAbr>a7Cm;Y-J6f@SA3d+TYSsTJ zedrig>N~m@fFUg_!+?)(zwj-QsE9}Readp5m#Q7DB4+tE8a12BBt?UaOwXVO^bRvi z4b*UF^%gKejeBUwa4Es6g8|WrPLGeW5;vtwX8>?1eoM!*Wz=jou{9yOTF0000Q literal 0 HcmV?d00001 diff --git a/Sprites/Survivors/Technician/portraitSmallS4.png b/Sprites/Survivors/Technician/portraitSmallS4.png new file mode 100644 index 0000000000000000000000000000000000000000..a28cdb6c2f373af7e5ff00067108c610e0998ce4 GIT binary patch literal 1002 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 B3-15` literal 24522 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 literal 0 HcmV?d00001 diff --git a/Sprites/Survivors/Technician/selectS1.png b/Sprites/Survivors/Technician/selectS1.png new file mode 100644 index 0000000000000000000000000000000000000000..26e72961e8532c15c5234e2972b651c050d69087 GIT binary patch literal 24498 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 literal 0 HcmV?d00001 diff --git a/Sprites/Survivors/Technician/selectS2.png b/Sprites/Survivors/Technician/selectS2.png new file mode 100644 index 0000000000000000000000000000000000000000..f2b6304e601c51743d1689a955ecfa279c783389 GIT binary patch literal 19887 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

`v)YF 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 YfL;K0)l2m4In@Vgi|^(?+;%7Y2Male{r~^~ literal 0 HcmV?d00001 diff --git a/Sprites/Survivors/Technician/selectS3.png b/Sprites/Survivors/Technician/selectS3.png new file mode 100644 index 0000000000000000000000000000000000000000..0245c45b665d9319fe4801c4a86268585b6dc151 GIT binary patch literal 20099 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 VVHhSX{{t?AHS3Ov3T~6z2PS$M!)5>g delta 1926 zcmV;12YLAU4}lPnF#(~GGBAG{<3NZ{35FWg4Iv){+7d98@ufcaATTl1CTYP~w}Jys z+FOk6-jZvX9^|)qJDOQ(SK8ef`~5(8rQMb0?VI_}+cz_70EV%ct?eDLwY?+KE(gOf zOy3cQq+O1qg*DyqRrTVL*HbwInh|(@ZJ{-d8h4+BLX&1w_JjQ{oNyHXH@ZZ97lUC=ywJk z$1qGhcqtKCtO2@@Ix^Xuz-ZOBNF}PxrXeKK{vL*5`j02r2m8BDv5$8=f3-yX6uz);D}< z5?QR}XcaLrwW1Sen^GhwqG1HIAL7n}%>?o8Z9|+KaD8<|tlbpO@b^~Lo3ZM+Sa>oD z)E1p?B&BgD!k&NyZmg_=J30aYda=exeQSG1m?YYF<{k=KeuRJ6(dHDB%8x`5&Wm48 zc-zbMM~>}jkFn~wSgt?vu7i!j0MIUSX$wPC#;W6O<=)!f5lsNt+WyA3&vaV=06yIO z-P>0ABx#Ln6KvhUV2r)~pHqx|#w7w_-M0oN%O^05>?EL+<<0?P~l zzA^)}=dGzFDm&z3Y^sN*iCn)Z z7V-|Jd(+am69DP~M=T(2&rDA^Gt;e$?2e9rTQ0%%soTEe@%@jF|Az0beiCcJ!{W^f zIgG01)DC`@wnLIcZcN$1Qvd+4zxSr&xhUGYv`mzAO)q~WAq>Sr-id3RgNocys)x4Q za`ET4UWfYp*>dU{r_4tK=%WZ4Wn{8BK}Gw1?QWZh&rDAk(Sy>4Cfhbv9T(4^EyKb7 zu0!u6&>?a@&Q?^ntIwY;d)wHcP7b)CQzcZGlNz9;_AJ*QwFv`&9ljf@j*H*E9sruk zv9%t`b&P+C9DrT6WU@K&`4?l}du%IdYFy|al7)|o_Wjyj?Rl4~6?kxOJ~6}ONJ!4J zQ_-fCOs-%6?;VoK=0wtV^pj4F382-WurZlFKpEsWn}k8-7l3qyAu1+{Tra35U&vgl zR=n-FwIR}%>joaHvo)ySn(~gT&eq_+znZ>tlMsKqpaC0sA9gx)wu_D=9TNxi)(*g* zv!}UzY)t1Wlj4v14}srF(;}*Uy_Pu$6o=Cn&U^LFMq!{LNAGxKYzY=rA}4DDwk6Z; zQ3ZaoEda@BL*E5k1&a1keKGbab94oxoR`O_S|#YzmW3CaZ4RNG&r*F60Kl5*e*o|E z^i+S~EWeG!I+TaD*jWzw1{aTvj! zzHnZ-zp=8~7M%i^J?C0(9F6r2?}c2u(Y=3<(p)%ou)ph6XKVhup2O|xYz>y`i_qNj zwIzs>ehK4JiK|{lpSdA(c@(yjtL86WO zs8fQd&elA!wpp|hIsM~~j%XJ@bwkqP{_Rh{3IKK8>%|Teq4m!6I@efP^}S^OY_5N` zqU)jIif5N;xT7Q9tFf}G73W^7vk&>9`_stanuGY{Q%O zdsv@>CL)*&4fN2KPP&jp2h^A6VF!QZZR)qC;Ot;OekD9np2*jYEq^Y~JM`7B@+J+6 z+}@klZ5>)SqSQ&qlYW5I!i&we&*U5=fZ8@wo+GpHViW%T_#-d6`|A8>008i6ZP8cv zQZA+zmC(tY9cTNfDdlY3?wIWV{MYy@dU3-Faw}se>dzT)TfUDIVOL zcXT;j>LZnS$*Uk$VjX6HGA_`*!Bc0nf`O<8p}QI12zz`K=x?~?k~Om`5cwL(dH`U@ zfUs&&A@v6U_{O#3?o50B@=k*~wp1_*&bL;PR_D_TK|TsxDY|(kN7yCjaR@fGN7a9E+O&il>)YikSACy9eexIp?9v3;7PJAObubBC2>tM< zFxcc6q*DiU)WkZ-9vXo*U%u+2DaUUgzjvZd+_jpj_r zu}6W5ooxXRzVJ6hzIxP9UCiKzx-pOpy^QArh5RCEas+SLm3fz z{i)d5s0q3SO9r^^?;FCNrwcmjD0& diff --git a/Sprites/Survivors/Technician/shoot1T_2.png b/Sprites/Survivors/Technician/shoot1T_2.png index 7a01b5d40289481c4a052f21012fe4229e6ff7d5..483abf08d2f4b1a9a2269c0d14f71468ca2f82cc 100644 GIT binary patch delta 1817 zcmV+!2j=+L4%ZHlF@N_-L_t(|ob8-XXd6cq#^03Ql0Yfg#n)mTL@%Y)B@o(!Q-cmZ zxR)TELMaVNoYplafzb4jxP}(hDQ=4iv?Wj~ky8#i7+edI;MQQ|TR{gq>8&DCZ^^Yx z5Axf*eLFKdEA8xV+WCPomMrb3nfJbV^JgXCKR~B@AOQd><$sdMTMI`@DfweUh{Eag zcwWw1z__3hRNs9kZz)P>;-fL(Z*K~oBH<($F+l-_Njm8FoLb=iKhwxn#JqOTutgb;$7fRs|c2o*w+7i^R8?CGXF zexe#S<@OaRX1>h)b79_5I^6@g4*;F+hoR?OwYzcw@qgIfeW=V-g|6fW0GOVs8Q&PI zh;dB;JIr>(&wKqq6<}OD?M#y)q_NQGBH-yDF^(49dt_lUMMyr*vAz2tE&O@RJy+9U z<8A^SVgG#eQ}Fxd#$x~&P9vsgYA`)h3k3+R65yzk7$r$*m7>$O`QTwlXP!pD1B~mo z?aZ{M41YR3Jm5zOtfa4rYa0Of!OqD$`Ak&GC4mDf&AsC%s-jXZIk~3N4Br3oDa_X| z$er!G@bU6z003}v<1u`C{&fI&zL?0%b!;$I5{#Op$M)_+we~^qH*J{rKKd0dUEhG| znHuc2)(TOwVu0z4V9@VHI+Iri{5cnTsHQxUFMp3hwIUH&#NT0EPj*u(%}mpA27f*lva1!$n}38s@Owf{Do~S)}bn9$Xk;$4^wP z-y_ZS1DC-*>Ka1U!OqD$`6x8+5LNEEMA>}+ipy{hQLenx88gsk)9;PRTo^#&h}jZfJmQSyL>T|{+pPbk~I19 z)`Ob(LOcg^4*=l1Z_=%XBX6cEZ|kcKXkJ|o9>c%S)N4T^rk#Xz8&lUnS(#ECw9US_ zaWe=kfM{^7H&)jN*NjDH1Y8d`5}H!pMgTAzVW_tC#!ARMu_G52m*glNIf@Zb=(&+JiJKy* z`jH1Z4f0Xj#}-}t&^V{sT8iVh#o;1w5ds|m;GaMCb2D}wwDNQTw$J9ht>8S5Dfe)#F70))-~?i)dmyWG zv#@z@YbYv5BN+61V$kmi9z;L?winSGsZD-nEv{^jlZD!JhB<;tf+mKY#waXX9CqMjRG#%6f;I7)U z?YrjHiWott$w&m9+ZbAQt!oXMzk z$EwrN6}K?hyt*7pyd;cr`VjT-#W1c3aXA74g!|5#LMYVqtMf-f6Z%?L(n$MLz>QEM=Mw@Iy(u z>VWs5s=at0Qj*-2YFi!HXn*3`a8B&%AepWTrWz2`g19`~#&=u*hVjq)3{5F*Ey^?W zw{LBz|NDq6w^_J3*(6*R*tC_d+?|-5l5~{$z4^8ATDIGZDube^wxo3Cq+=X2u+>B> zCf9~w>OZc>^(j|ew>f+6JgBs}-a=PyEuKAhUfW1nj=q$*1+F5kK7Rw4&1ul@iRq(V z5*s5J^*14W6v`{^02uK!r zr~E#HxXK_)Z04t~w|-P$(DP11;>>BcwI*yU0{&RsS%ai=`a!=Zuu|bknAZ10#ErnJ z_R7K(bh`2yTu@IQIe!@1TEqa?xlkTeL0mbi3#2S@;o>ym1;OUEHf?5l{$y=QcDe^L zsS)t&j&lPPj>axV-kH_Qjcsw4D$K&yMJPsa@$07d$nb>j+aUdsX HlQIV;8!?p} delta 1818 zcmV+#2j%$J4%iNmF@N|;L_t(|ob6meXd6cq{Zo2N0;OOVUyF4Ry_8m$Kxhw64LbPX zUV?NAr8FdQ+SHf?LeoRy8d_ARxGg5omO!b5Pd?;ea4m2`+JKR71s&|9w~9!;CD$@N z$ba+q@67D1w6nWu=YcVjEba6B_uu^aGb;iA0d%?t5&)o5E`N!mZ;J^AeEmIN3Yz*=KDcz$AX zDw60FydtQSOMjwLE{QB=ZM?S1jEV@J{Hor9$NvkMcNDUHH8WjAdIt0L3qev<$|Vt$ z;&ZbBKLCJBH`asq9JX7qb?<)g*mc={vbLxkprZE=ID`;_nt+s2z6cdUksG#2@a*Z9 zJbt1YHs$tJDQ3RR{Qttdqv&)Gh7>yH6oxQv*dsloJ2EhG?HCBRW7F-nrsDn-X_>)!nk&peHQ3ykx& z4Q5(P27etNF8EP|mGnJvV*}t`>>PO~p9z(6N#KM^bMN?xs;HDpPOhmmgZF=Y3iI^~ z^1;p~e7y7-007)te+-|Ve;ojxHxqfejsvDjf>D$7*xoKwYaaxU>A<}A(XVjn#yU*T z)Zk%jwGbsM3QT7NgMKd(OkN%E*Ie+SobpJ%Jb%P)LJ|02-T?sUa?d3qX7FHV6Hc9; z2LOOmr{`g=$e_pPPV-M5Lu94Hn|bUym~3 zVSft~UlbQ#zf;6*Hzw^N@Y4LPH{VFaCkf)J3(n=i&L#jrB&OG|T+AeX6O&VtCSTrs zkP~mjb71ZP0DSjNy47&x!&K#MeWd}-YfHg%`1nk{79?WYNl3Rbbpw=@DaC<~*%vo& z1;PS|ifgU03}@;!WgtyQm+5P^W}q^4SASxUGXoo;13Zsu+Co=>j}O;*o_uULrOnIw zIC6cZk=8Y1p)&%`2L}mFDQ_bH7|t-1+gf8eWS$tvh0BX_lt7MR1Qhh#NScUSBBiF0~H$GJ7l$&cl^njlYCl`7TnE@w+&J+h%NqF?RkwHRER7`mofo%XeTz?yv zikGgsTev)I0vAE(0095|v7ei<>p&|{7r^n^y1N~m=P~6T_Uh8^lLaRbJKY0WotuTN zyW2xjIU2#B-xGs=PjC_a{M%lHQ+=fY8_iZA>a3s=xXodwq{2$N&1m9PUugtC9InPM z*lxbN9paN^rK#dnBtF%-+2F^Ndw+ZF{n+z8<3M=;gm#{FgXG%5xrngbRsl=!EY@|D z9~IQ!ufC%FTi#zm@Ub&(FWNK@`IwnFA(F;1={6+gbp6Uj@yQRr7)=NH0Jy96Y-88F zwiF~E?wGmOJ3!dHDfZg?k@uy!r5?FA0RwINr?V{0t8=r?*16*X-Q3iKGk+PC?pSpi zyy6;z&1*}c#7lxvP9Gv4-VEcM5H4pxfN<ysU}Tk!U4&L~7H1C#61 zQquLhj^Af6==X%~h;tU}ULC(mxg@Z;q${=QSkdMvJuGEf4)8-sy6Rw*7*Zs;E7i6- zu>Jdq$tj5qL|hZQI!LCw+kX`xx?Dmo2$zT3_>K#}Q2(^Cy3uR}rj#}pLVws=jU07%1)bJ8pDeggK4=JtEb>nI zeFkxrL6)#tpSs@qQ2|BIgNBGRr-!XoVOtUK=i<&9Bwf=F`aOY_3Qxkcz8@lP23Cz% z7N(%%mDl8geDcV_(0|q<3S8$xc~k{)<)}_bS;B>j(}WiUHt)3=Gt=uQYm2heJ&;L_ zfM0i<8=!DDb}=i*@ye_E)m=BM$*xePHG+Pz3Jn@xD&!S306oVd@lh?UY>WT^;M>o` z2A9VFI0_#R504yxMnEfr7v*c@JUl!+JUl!+JUl!+JUl!+JP$lPJUkrYUm3-B3}--u IVUsZjCT=lso&W#< diff --git a/Sprites/Survivors/Technician/shoot5.png b/Sprites/Survivors/Technician/shoot5.png new file mode 100644 index 0000000000000000000000000000000000000000..2aaebe3307feefafab6389dd203dacbbd829aefe GIT binary patch literal 3902 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 M07*qoM6N<$f&{6HcK`qY literal 0 HcmV?d00001 diff --git a/Sprites/Survivors/Technician/sparks4.png b/Sprites/Survivors/Technician/sparks4.png new file mode 100644 index 0000000000000000000000000000000000000000..f1a6d53f3f4f0e53c73bdc5f54f00b64c804e919 GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^4nQoy!3HF~w)}PhQjEnx?oJHr&dIz4a&CFLIEF;D zzMWwx)T|)jI^Bn>cwLOz)U}pO+rr|G6+5o-J=&vm%yo{A&b~{L?*E?GyRl}QL@hRK zF_m((IJLi_L;IrF%Byoknhs?dB?gD+s{IiOY3AIWv}Cq}kkU<-O&lxL?yP85+^86w zbmF0{aus{+#ih#|<}e(e*;MS|u!WJ~>HA-EoY_1cZD5qYt!``4{)1UX;)2aRrL2Nb zg{RN1NIh}*%9-%;;~$16cHR-f2Xy5gtUB<&&^~eJ^@lr(^%J<~?0V{ceY5)Y)ST!V zUgpewGq@gHS(txHvW9W`y&SXu^L9i6eaV*^;hE;^%b*2ha{w_2Tne5HqC8#wT-G@y GGywpM-FQd< literal 0 HcmV?d00001 diff --git a/Sprites/Survivors/Technician/sparks5.png b/Sprites/Survivors/Technician/sparks5.png new file mode 100644 index 0000000000000000000000000000000000000000..dfb345abc703666f83d42799f13e74972ead720d GIT binary patch literal 381 zcmV-@0fPRCP)Px$9Z5t%R9J=WnK2TBAP`0WucGJ5Wvp!V2-;eC8P63{ZHfekK~STRam>C-1ee`m z{~}5xMnuGJlVs{S73EhXOJ-L%vx!wm$_0p)#N(rpTUL4do?{CDSnAL6`qY9NAI(${ zOdKXI0H^m~NyFwvUlPa?c9H>M5v|$yWrEsbu~{n+E-I?)Gh1L^rQJ&?v0~cwC8-+& zNt#zmk_-tXmY<=xU9!BMe97{fA|h^VGE~BQO8_v}GF0zaKKDbIak1GtukqFO9{~EY zl%nf)7nr^*r`U?Fquuu5jyXEFd47|Ty}J((X9qHNQde}Ju)g)zCm!92uFK(t-6F2F zGmt&*jLGH-%XbC>R4D(5euYz%10+vk{STyEnHP2hs0!6rgckq+01jnXNoGw=04e|g b00;m8000000Mb*F00000NkvXXu0mjfFjbqd literal 0 HcmV?d00001 diff --git a/Sprites/Survivors/Technician/turreta.png b/Sprites/Survivors/Technician/turreta.png index dcad39fa7202b81ecba5e2bdab56e8769f5e0cca..8aec21f7d9dd49fd7af42fbfa76ac063129f4a0f 100644 GIT binary patch delta 785 zcmV+s1Md9c2G$0UFn94rh9CAehk`xh%g@x_a zNuv-51e?T4uMr_2n8tjDSXk^KrceY^B#VugKvGBIeTYesn{^y#XZGLgMezrRp6)*L z>@)Aav%6?v3$W+U7=LeFeYPm{qv$fmHa@eg#OEf*TWA0I0U|R4uNl( zoe#X;>@a6E#@FvZ$*xqAB#}kaM7`Nzg<>86*!k&6;w!AvAH>?9F{WJjDSUf@?`kLj z;Lhd%fYL>o0e?W|EbV=FdrVrs{rCj{O7Wz9uT}W2g;H;Jm^+&zbC&k>MO|S1m~`Xt zmLwNj(!RYn+`LFwah2g9p@;+-hmT>>=2~Lt?N-C6f3sXzRKD#X#%0q{D#c`!>pT5{ zF_fd!F}qnVEYYVb45vRpp_oUZnBO>imzjsR8*M)034d}U7u9#5Mf1)=`SV*aky{Ig zha&rU_2ylWLs~t?xc|U+n^=>ndRSM;t$H|xxOKGv5F->h4C((`wPKYn%4{<1A)6~< zGVGzFH)DEj3(zV z9|!KWqBg(rih``m3DRbDd03RqYSghkNVp zGtWNr?#%2W!y4ePUUIR`&b~1U{V2MebJsq`61TU)JyLZUbAK4=G|su}&q>O;hji z8y|SR+2Q8-2tR)QB3r2>Ng|V`AN6L37m9fR;KzptiO;ZRe-P_@&be~pr|@kDzNw)A zfHj=~07@ri4u1fdqqP0q?KNq+xVi=arFhc5S1NqdLa8@9+?vjiIZE65vM#WCO}ci( zkmM}3q@^}sC*kij5|$7sT4n>Lf`BU zd_&nw?em+(oXI{_VVL~^3dKAM#k}k8U1T2L9^`(<6My7EE~@W9ljfa;^5?f?BDWHb z2*v5+?fZ{GE@}B1SbLaw;aPM#M#*#K#WkFVL1M;RV%D?Qs(1f57}G^ z<6#f&Rzs_Ao{wDno;-SJZ(m$pvIM&PxI@gx0DR z<@iD6+kc=Grw#=G#>1X+e>PY0Y&#BdeQU??Btj9(DG`A9{7`$RYueVaIfABQ{m1b zOP()Mr(b!-@^I$yqPgN~{jMxUZH z?USe~W!p%1CmaBDg#virm4SkEHsU85230l2scxCi%3t3AB8y9k~we a9T6U+yA$pVUdLa|F{U_oBzIhsFast_R*6gi diff --git a/Sprites/Survivors/Technician/turretashoot.png b/Sprites/Survivors/Technician/turretashoot.png index c53da418468a9556ca00340d862bee01110d0afc..e8b7e7e714fd3bd04ed8257d5ca201450d6496a5 100644 GIT binary patch delta 1385 zcmV-v1(y1^3#$u|F@H-*L_t(|ob8;yYaB-u$KM1M@*iLYr#I+wjS(&qI3$D4!dIv` z(z#ARKTN>ExN+nnr!+!1Aaa&Lsoez?D$Yn}h>bug65&RXAgLoF{{g4&rC7h!+u7OK z-#fGC`G7!oH@iFU=6&bQdoz-Nj{v+kkMz5E^;($hOHtsxd4J4e3nGTz6JjjBl1lhQ z_aUmj-53xt^kW5sVdhJ1v}x-2FVkHp3_hWyy3V$7!Gr0s5zO_e8<{&|qfL42v5l;@ zm>8FdqHj2k;e8x!8V5{_i*`xoa5#cE!8jZ#aDs6-iXcnEZ#yngwv#&9Qc8rep^8)n zw%FC%=;PqcTYvcD^lv*l^bw(~lHq6xVR9P~0fnX%5wlMdx(-K6D6YLQQgZ5T^s%$J z004lu8#lFmh;qa~&;9{W*kyvj-hQs@5z&h3Uz%~Tf#|aG<#OmP5>gUKOgh0;O_YLu~2kTL?39MY91rJ`|{@)5KEMk(V(bix{Lq*y?W7U2aebXA*@;2 z5V9?Uy?^~!@n4_1fwqdDkBLq^a^x>-T+;3IUoLy1ncNPGX4pu48`~;ygS~y|EG|H2 zaUmp{sZT!(HkMx-fSgJdS#-8s%zXZ#QTSY)5W*_q1K25kwO}ZsL@mQO+Q{O8qh((p zB$le83!!r|6@xc#W82(r+%)23veSI~==((1`F{sCEf77COZ=(>wVgJISLdaTi&`+L z@|Q-i&4=Y&AXnkbvG!@IXjBwwoQ$ujY00qmc-4yOckS`2=-yw!!{IKp+Fdvt?!wmQ zy4Ieg;x|Dq@f#3+KrnbP9ZvQEAehsnbM}B(CE<+V%W-b7glO4Z10Xgxk z8-L_@t#&uk7AOAvOaN$d3R-Rr8;Po6shQjc#BJ}{C5eXy1mH?60KqSwCzC(+ek!^P zg+n&TwA$T@dr}TIi+>^z0k|l5ZlcRmG|Mah-bwauxOg}jghYE21Ub@^wTA#}50%$+ z=4JuF6H;ex)_2PH7w2O4rPt>5ubZih6@T+zJt}NKWxD`8+nz+&#L?|_JbU^8zx&~5 z!CyzUrFPVYUzdd{#n0_j^aoX z?>~EMb3G^)1|^gP7YvUwyDy*n&&eVfBCl|g+9kv7GQHU5* zQNl?}0b&7w(7p~pw1_yeP^yB9t;ncDkX=RC$0Lk9BK@B@cO)Ft#nn;v!6xU`#JD zOMjrUtgNEMDj9#xlS~p!bLS{FQk;DAr4&(b3#F!qu<8P=40` z<#%g@5{J$X!bW@QHUU)9p^#{XjmnS4IO+pMeBDF_U?%EkexPiW&IncM+FmBXsAgvy zXX7M1k0|M{*mknArd0MNl4y8U&L+`}6LL;gN8uCWWJ@Y=w1hm;*mlI{BTQ15 r89P*eL}scl4o4P@{$Db;By-da_mBJ>juiY4HjI*86n+5|laU1`D&M27 delta 1418 zcmV;51$FwX3%3i9F@IM{L_t(|ob8;yYaB-u$KM1M@*iLYr;b6FYmDN;fkQIrEPREE zBc1C6^urh&j2lNTa!MnF10rV`l-gZTq2i2mhS&&{!WM313F0~;@*i;OUW)Tuy`7z% z{k=1Lo(~9gd$T+9cIG>8-kXsGduGFIKem^d5|XHw;dNK+ewvdDa6CrkVPs2 zTkPtrb+PyAHGjN0{>P36eMTs=WH?wr7~cd$K%q%RMC{W9?!&`4wm9*pLs<(B7Jm@-|MFjK+*Ch7E~l#G)`_6! zau0)hlStncO=qo(G{^`($YeIwS0kVK@$9tp0Y`RBU8{Sd(b*A4JS2V-UMH$w;!b2` zO<(~Jv4jmW>J-&XclO`E7av+p-w_)jgf&YW zLbj#1vws^Y{>u|r&{pyDKGBIs_WVWlOR}B*^TnZP#y5ka>DOXE#)l6h2_r%ph2bbEIM1xroQ=9D0r?;2w|1*0qhjNS}^2M!j@qit!Ej6gGEmu zB$l$g3!xiiDtfP82d;fP`L*}^+mjD)y>`{eAb*nw&AkUd$GXouuxWwliA>^G9jI+J zLA*FEtY6fENff`-{AE5Z=X|jWUye186M3V&NHWOynwpjjD-V~gn0{9tE{pb^CEV|C zL!;S-{r)y=tgmYAi7S2+WD>st;rj%Gdy~On9{~I@O|rr66AQ&a&0|0Wg!4rxBhAbO zpnn=gU#X}^LYR+3Lcy2;uOvD%6oR4y&EnbP6{E>-ULAd z>Cwu4fR+2ods;Ko05B9%Yi8OTlpoJd#eeqmVVReIt|v}b%zpnMw+@x<0vOu%D8wd? zZm;9X4~= zVi@h=%p@^P7&*i+1fRWHGt)+nwqzm8 z62`XWSd@ne6O8F4X5keo)5;@DFasyG3d6--I{ zFgog62e|yh4dr*;KmN8xC{gI_AZ)a!Y7;;y4GM^+Un~7+jH5b`$Jb3{0Doq@e(DNk zqjW~7Qr9*KMm0OzI2*^|X-G))5t*sBI2>s(`hUsXlFU&x+&}VjI1=zb89kp}r44Jq0000E YWmrjOO-%qQ00008000000F#;p5#*Ph8UO$Q diff --git a/Sprites/Survivors/Technician/turretb.png b/Sprites/Survivors/Technician/turretb.png index 2a249cd1ec906d5e038e30a47857bd075f34273d..3247f8028183ad6d8eb8a3b981f1a8cc9959f4ec 100644 GIT binary patch delta 1009 zcmVtNsI-MjC9ySsO}-1n}19}r^ha_{5! z`+Yy|odJjehlXLWA8HqX7awW|Dqc|wc;z#-07rc`MXg{Gsp5^2%yFTU^GhTg3&0Eq!x%9yZdb;n_B|_Fh0C{o4}4^pZoh6N3iQf zjaU>+)RNSHJ3V)8pS8`-?VX;x`uzO$fc||lDB>b57@Z`X+q3{j4gi#j_G>HOB~4QXLsqzc7;Ue^*WZt(PY2YVm&rU@ z%?4DeHBZ;*^#|tbEYh}@sXFN5t6l615;Zvc#o z_wu5DJCP6OrOGsl*GpWaQxb&?Mii4I#)rAJnho3e{1nb}dpCr+Od57J%Su}e)WwSy zj7}1c7!S5^$8HjW8lh!S#l><0t6teOfE5rX4KQBoOxlxb2iAq5pCnDEbMP7%wl|c`J($;UOA_y);@#^Hq<3lJ z9#wW_8G8MJ<)(p+OpfW25;ugvj3BniW98UVmM2JUHPD0EWu!-3@<}@H{jPt#w1CaWZDh_v1oZ@vjc-)9Aok8 zen0eAFc=g`k~zr&lRmyu`fkp!xET3p|7^n$<3drqmL5zk!y`Jm^&)_m!YK<+fEn$R z>(C0t$%DctNMa|fQG<=XP8|ur`=}d8!H80-5Js%k%(OLG%+E4d}XNKB=GzJTEN<>JX=lGlM4hUAW+oL delta 1052 zcmV+%1mpXM2(bu%iBL{Q4GJ0x0000DNk~Le000220000W2nGNE0FOhHdjJ3c0drDE zLIAGL9O(c61JOxDK~#90?VP_$96=Pv-v$4LD6vlwE`?|y3Zjh&S6FD7T9GJ73Q3_C zBzUn93lUT#)+u9QaY1bE5MmL#;f_Hnn_u0pH ze(kOTbO3un5a3VVF0J5-Cr6&;EntiHc?%e@*4Ll6Ld!VSxW*llect=RyQTm)S8Wgb z+o7Jo(;alol)%#+_`rIc!Uxvl6h5#Xr|8LBpxapA+zm=olK=q0n^!Lj)OKpW|NCg6 zj@M~)L||Qi3qkexB=nl{LpS_v_4p*#_t&3W^8Ay+v98L%a+KBKN(e5mZkoSOzgq~X z_Xh`x>+U*aG`;M-wGO!$FDO?J{=)^RfogTsH z#B^kvTvx1NX=*akaR31He)&$j&W+emWm{J=uv}$-DO?JH4yvwkzSpzEq1Ueu&#n1z ztt%N=uCk^i2|-#MYzzhEZMvpOXsph_{_I`ky(}=T>*DNir2-5<7Z>NcY4-%>?eM}QNeI$(6+It+8utbCigVf7su(wPY7uF2F6fHB2q#x% z4=cjCCm=!)acs4)cY+t1j)d!*yFn|y za#+Q>a&m13Hl`#EL~%79B>W+Qu)x&HU#r47X>k_Prm9qiGu@0SXwS?Z*SXt$b~{2b#-?= zvvv&?6MI=vmeUFmkw*nnUlnPFpq*)dR~E>PN<=mKBI4qVs{hfqy>tRg!7&6XXH{W~ zUw<0?ZT-#M2)jUKfm~OPjVshciExw^k)7ju0f5KgE=o^0A-jj?Y=WxuL^%0oN!OjQ z$1XT}={f=cd!v?>gUHghC2d0WUR--C)&I3xC=}SaW<}SYxGTu>Z;lNMamm#a;{kxj W(3&oCP51|oqTC6hE2(yq;R7b*_w{T5 diff --git a/Sprites/Survivors/Technician/turretexplosion.png b/Sprites/Survivors/Technician/turretexplosion.png deleted file mode 100644 index 64cc6595c50fc31542c3bec86c6c43dbd1284661..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1203 zcmV;k1WfyhP)Px(Y)M2xRCr$PoIQ@zKoEt;2Y?8~Lck3;0fdljh(K_KU1^Bm7DTMXCL90+F$tuc zfEy6-BZ%MtgJipA+b66s?V>h+a5Qo_&3W4Y&M(CF2|atX-YUu zJAK;b!a6Podn!f5w_sX}05kwi zBW0piBB0-Y{~gpox2|6uw6)&prRVGAAI0J3wJY6{lUW09e%>F%vpM=)MI5+7(|mY7 zOXnlkegFz07l7uX<}jA-Xi%E`x-{_d03 z3o8_l7pM2yKiW zYS`Rb4%ydUmuf(+JhTfY`=q2uLACyrYVW;^udU1hDBC0ipqJk&dkZK{du~cvO1ZQ( za%n%%xpwLCbM04C&;Yc1`J>jRkpr>!fYOAmwdmRTyVjI`w1L?NJb=aJ&kGwEFSyp}k0?m4Of!Lx8w{7Z_O3M$3% z+t;(!HLJqs#(ydOC|&_*pRoXRUg)X;CHL1SPfRnZt)S?@9D#|Hcy;4b+eDfdUxAi# zerigxW9MWA4M4jHjF$QU)Dg$ADF`Ta;ZIa@mDEc?x0|-Uwv^r$qIOcPC@Cm<+emtI zo!7?b{Yx~CHT$LQTm3`*1JM4Z5WZfZ|`CG|cx z-70$jYfLmxbOZRL_rgl;@x1&GK>J8~9s8snf7J%2_IR@aRO?7;0=0Izf^o&4OJsNe@7G|7b4&wGyZ7zpaTGp!^hq z%%(os*(wk?RzmJ-l~a38>pecQXT6T*S6xA^6GHt1(90vFy+KgCt=A6*Q1q!7{<_(R z_a6tbr7wG+(+adZM+qwh2ugHnX@%^d`FUU88wCwOyC3;Uo4o+k`_@s~LxA#4QtGcX zy}xx-N6vPYw9dP>-~7?*-qxVj#CZ3wooFxrYx^C5dSy;&M|uP+nVI?}j@n@II8aFz3aSJx zw|M}ni(CMzi`Q&gr=D9*?XY$QkmeN%I&~(M;|HM1fJJkk2rT{FQX7R-g$)JOMz&D< z0Caa?1JFXiEzPV{I!wKr4?vejQXzi>&_aO?v-6ICwR8yuop*j0@0}IU|J@oUF*)i) R761SM07*qoM6N<$f&kVQJ-z?{ diff --git a/Survivors/technician.lua b/Survivors/technician.lua index 30a1e1a8..18869b6c 100644 --- a/Survivors/technician.lua +++ b/Survivors/technician.lua @@ -14,6 +14,7 @@ local sprite_portrait = Resources.sprite_load(NAMESPACE, "TechnicianPortrait", local sprite_portrait_small = Resources.sprite_load(NAMESPACE, "TechnicianPortraitSmall", path.combine(SPRITE_PATH, "portraitSmall.png")) local sprite_skills = Resources.sprite_load(NAMESPACE, "TechnicianSkills", path.combine(SPRITE_PATH, "skills.png"), 7) local sprite_credits = Resources.sprite_load(NAMESPACE, "TechnicianCredits", path.combine(SPRITE_PATH, "credits.png"), 1, 7, 12) +local sprite_palette = Resources.sprite_load(NAMESPACE, "TechnicianPalette", path.combine(SPRITE_PATH, "palette.png")) local sprite_idle = Resources.sprite_load(NAMESPACE, "TechnicianIdle", path.combine(SPRITE_PATH, "idle.png"), 1, 9, 13) local sprite_idle_half = Resources.sprite_load(NAMESPACE, "TechnicianIdleHalf", path.combine(SPRITE_PATH, "idleHalf.png"), 1, 9, 13) @@ -38,11 +39,13 @@ local sprite_shoot1T_1 = Resources.sprite_load(NAMESPACE, "TechnicianShoot1T_1 local sprite_shoot1T_2 = Resources.sprite_load(NAMESPACE, "TechnicianShoot1T_2", path.combine(SPRITE_PATH, "shoot1T_2.png"), 7, 12, 17) local sprite_shoot2 = Resources.sprite_load(NAMESPACE, "TechnicianShoot2", path.combine(SPRITE_PATH, "shoot2.png"), 7, 17, 13) local sprite_shoot4 = Resources.sprite_load(NAMESPACE, "TechnicianShoot4", path.combine(SPRITE_PATH, "shoot4.png"), 8, 16, 23) -local sprite_shoot5 = Resources.sprite_load(NAMESPACE, "TechnicianShoot4S", path.combine(SPRITE_PATH, "shoot4.png"), 8, 16, 23) +local sprite_shoot5 = Resources.sprite_load(NAMESPACE, "TechnicianShoot4S", path.combine(SPRITE_PATH, "shoot5.png"), 8, 16, 25) local sprite_sparks1 = Resources.sprite_load(NAMESPACE, "TechnicianSparks1", path.combine(SPRITE_PATH, "sparks1.png"), 4, 12, 16) local sprite_sparks2 = Resources.sprite_load(NAMESPACE, "TechnicianSparks2", path.combine(SPRITE_PATH, "sparks2.png"), 4, 17, 22) local sprite_sparks3 = Resources.sprite_load(NAMESPACE, "TechnicianSparks3", path.combine(SPRITE_PATH, "sparks3.png"), 4, 16, 22) +local sprite_sparks4 = Resources.sprite_load(NAMESPACE, "TechnicianSparks4", path.combine(SPRITE_PATH, "sparks4.png"), 4, 9, 12) +local sprite_sparks5 = Resources.sprite_load(NAMESPACE, "TechnicianSparks5", path.combine(SPRITE_PATH, "sparks5.png"), 4, 26, 4) local sprite_drink_technician_1 = Resources.sprite_load(NAMESPACE, "TechnicianDrink", path.combine(SPRITE_PATH, "Drink/technician_drink_1.png"), 12, 9, 13) local sprite_drink_technician_2 = Resources.sprite_load(NAMESPACE, "TechnicianDrinkUp", path.combine(SPRITE_PATH, "Drink/technician_drink_2.png"), 12, 9, 13) @@ -56,7 +59,7 @@ local sprite_turretcshoot = Resources.sprite_load(NAMESPACE, "TechnicianTurretc local sprite_turretc_mis1 = Resources.sprite_load(NAMESPACE, "TechnicianTurretcMissile1", path.combine(SPRITE_PATH, "turretc_mis1.png"), 4, 21, 17) local sprite_turretc_mis2 = Resources.sprite_load(NAMESPACE, "TechnicianTurretcMissile2", path.combine(SPRITE_PATH, "turretc_mis2.png"), 5, 21, 19) local sprite_turretc_mis3 = Resources.sprite_load(NAMESPACE, "TechnicianTurretcMissile3", path.combine(SPRITE_PATH, "turretc_mis3.png"), 5, 29, 32) -local sprite_turretexplosion = Resources.sprite_load(NAMESPACE, "TechnicianTurretExplosion", path.combine(SPRITE_PATH, "turretexplosion.png"), 4, 20, 20) +--local sprite_turretexplosion = Resources.sprite_load(NAMESPACE, "TechnicianTurretExplosion", path.combine(SPRITE_PATH, "turretexplosion.png"), 4, 20, 20) local sprite_vending1 = Resources.sprite_load(NAMESPACE, "TechnicianVendingMachine", path.combine(SPRITE_PATH, "vendinga.png"), 10, 21, 34) local sprite_vending2 = Resources.sprite_load(NAMESPACE, "TechnicianVendingMachine2", path.combine(SPRITE_PATH, "vendingb.png"), 10, 19, 37) @@ -108,26 +111,31 @@ local color_tech_orange = Color.from_hex(0xFFC479) local explosion1 = gm.constants.sEfBombExplode -- WWWWWWWWWWWWWWWWWWWWWWWOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO local explosion2 = gm.constants.sMinerExplosion local explosion3 = gm.constants.sDroneDeath +local soundImpact = gm.constants.wTurtleExplosion local WRENCH_BLAST_OFFSET_X = get_tiles(0.8) local WRENCH_BLAST_OFFSET_Y = -get_tiles(0.1) local WRENCH_BLAST_W = get_tiles(2.2) local WRENCH_BLAST_H = get_tiles(1.2) +local WRENCH_DOWNGRADE_TIME = 60 * 30 +local WRENCH_THROW_DOWNGRADE_TIME = 60 * 20 + local MACHINE_VENDING_BLAST_H = get_tiles(1) local MACHINE_VENDING_GRAV = 0.2 local MACHINE_VENDING_DAMAGE_THRESHOLD = 6 local MACHINE_VENDING_MOVESPEED = 0.56 local MACHINE_VENDING_ATTACKSPEED = 0.2 -local MACHINE_VENDING_ATTACKSPEED2 = 0.3 -local MACHINE_VENDING_CRIT = 17 +local MACHINE_VENDING_ATTACKSPEED2 = 0.4 +local MACHINE_VENDING_CRIT = 20 local MACHINE_VENDING_BLAST_W = get_tiles(2.5) local MACHINE_VENDING_BLAST_H = get_tiles(3) + local MACHINE_MINE_GRAV = 0.2 local MACHINE_MINE_PULL_RADIUS = get_tiles(4) local MACHINE_MINE_PULL_INTERVAL = 75 --80 local MACHINE_MINE_PULL_LIFE = 90 + local MACHINE_AMPLIFIER_RADIUS = 140 -local MACHINE_DOWNGRADE_TIME = 1200 -- His only friends are machines local technician = Survivor.new(NAMESPACE, "technician") @@ -168,6 +176,32 @@ technician.sprite_idle = sprite_idle technician.sprite_title = sprite_walk technician.sprite_credits = sprite_credits +technician:set_palettes(sprite_palette, sprite_palette, sprite_palette) + +technician:add_skin("TechnicianRose", 1, Resources.sprite_load(NAMESPACE, "TechnicianSelect_PAL2", path.combine(SPRITE_PATH, "selectS1.png"), 18, 28, 0), +Resources.sprite_load(NAMESPACE, "TechnicianPortrait_PAL2", path.combine(SPRITE_PATH, "portraitS1.png"), 3), +Resources.sprite_load(NAMESPACE, "TechnicianPortraitSmall_PAL2", path.combine(SPRITE_PATH, "portraitSmallS1.png"))) + +technician:add_skin("TechnicianBlack", 2, Resources.sprite_load(NAMESPACE, "TechnicianSelect_PAL4", path.combine(SPRITE_PATH, "selectS2.png"), 18, 28, 0), +Resources.sprite_load(NAMESPACE, "TechnicianPortrait_PAL4", path.combine(SPRITE_PATH, "portraitS2.png"), 3), +Resources.sprite_load(NAMESPACE, "TechnicianPortraitSmall_PAL4", path.combine(SPRITE_PATH, "portraitSmallS2.png"))) + +technician:add_skin("TechnicianBlue", 3, Resources.sprite_load(NAMESPACE, "TechnicianSelect_PAL5", path.combine(SPRITE_PATH, "selectS3.png"), 18, 28, 0), +Resources.sprite_load(NAMESPACE, "TechnicianPortrait_PAL5", path.combine(SPRITE_PATH, "portraitS3.png"), 3), +Resources.sprite_load(NAMESPACE, "TechnicianPortraitSmall_PAL5", path.combine(SPRITE_PATH, "portraitSmallS3.png"))) + +--[[technician:add_skin("TechnicianOperator", 4, Resources.sprite_load(NAMESPACE, "TechnicianSelect_PAL1", path.combine(SPRITE_PATH, "selectS4.png"), 18, 28, 0), +Resources.sprite_load(NAMESPACE, "TechnicianPortrait_PAL1", path.combine(SPRITE_PATH, "portraitS4.png"), 3), +Resources.sprite_load(NAMESPACE, "TechnicianPortraitSmall_PAL1", path.combine(SPRITE_PATH, "portraitSmallS4.png")))]] + +--[[technician:add_skin("TechnicianEngineer", 5, Resources.sprite_load(NAMESPACE, "TechnicianSelect_PAL3", path.combine(SPRITE_PATH, "selectS1.png"), 18, 28, 0), +Resources.sprite_load(NAMESPACE, "TechnicianPortrait_PAL3", path.combine(SPRITE_PATH, "portraitS1.png"), 3), +Resources.sprite_load(NAMESPACE, "TechnicianPortraitSmall_PAL3", path.combine(SPRITE_PATH, "portraitSmallS1.png")))]] + +--[[technician:add_skin("TechnicianProvidence", 5, Resources.sprite_load(NAMESPACE, "TechnicianSelect_PROV", path.combine(SPRITE_PATH, "selectPROV.png"), 18, 28, 0), +Resources.sprite_load(NAMESPACE, "TechnicianPortrait_PROV", path.combine(SPRITE_PATH, "portraitPROV.png"), 3), +Resources.sprite_load(NAMESPACE, "TechnicianPortraitSmall_PROV", path.combine(SPRITE_PATH, "portraitSmallPROV.png")))]] + technician:clear_callbacks() technician:onInit(function(actor) -- setup half-sprite nonsense @@ -229,20 +263,20 @@ local machine_temp_visual_packet = Packet.new() machine_temp_visual_packet:onReceived(function(message, player) --print("yes I'm working") local inst = message:read_instance() - local isFinal = message:read_instance() - machineFlash(inst, color_tech_red) --Yep that's literally it + local isFinal = message:read_byte() + machineFlash(inst, color_tech_red) gm.sound_play_at(gm.bool(isFinal) and sound_downgrade or sound_downgradeBeep, 1, 1, inst.x, inst.y) + --Yep that's literally it end) local machine_update_temp = function(inst) - local machineData = inst:get_data() - if machineData.upgrade_progress_temp > 0 then - if machineData.upgrade_progress_temp_timer < 300 and machineData.upgrade_progress_temp_timer % 120 == 0 then + if inst.upgrade_progress_temp > 0 then + if inst.upgrade_progress_temp_timer < 300 and inst.upgrade_progress_temp_timer % 120 == 0 then machineFlash(inst, color_tech_red) if gm._mod_net_isHost() then - if machineData.upgrade_progress_temp_timer <= 0 then - machineData.upgrade_progress = machineData.upgrade_progress - machineData.upgrade_progress_temp - machineData.upgrade_progress_temp = 0 + if inst.upgrade_progress_temp_timer <= 0 then + inst.upgrade_progress = inst.upgrade_progress - inst.upgrade_progress_temp + inst.upgrade_progress_temp = 0 gm.sound_play_at(sound_downgrade, 1, 1, inst.x, inst.y) else gm.sound_play_at(sound_downgradeBeep, 1, 1, inst.x, inst.y) @@ -250,23 +284,22 @@ local machine_update_temp = function(inst) if not Net.is_single() then local buffer = machine_temp_visual_packet:message_begin() buffer:write_instance(inst) - buffer:write_byte(machineData.upgrade_progress_temp_timer <= 0 and 1 or 0) + buffer:write_byte(inst.upgrade_progress_temp_timer <= 0 and 1 or 0) buffer:send_to_all() end end end - machineData.upgrade_progress_temp_timer = machineData.upgrade_progress_temp_timer - 1 + inst.upgrade_progress_temp_timer = inst.upgrade_progress_temp_timer - 1 end end -local upgrade_machine = function(inst, amount, isTemp) - local machineData = inst:get_data() - if machineData.upgrade_progress < machineData.upgrade_progress_max then +local upgrade_machine = function(inst, amount, tempTimer) + if inst.upgrade_progress < inst.upgrade_progress_max then if gm._mod_net_isHost() then - machineData.upgrade_progress = math.min(machineData.upgrade_progress + amount, machineData.upgrade_progress_max) - if isTemp then - machineData.upgrade_progress_temp = math.min(machineData.upgrade_progress_temp + amount, machineData.upgrade_progress_max) - machineData.upgrade_progress_temp_timer = MACHINE_DOWNGRADE_TIME + inst.upgrade_progress = math.min(inst.upgrade_progress + amount, inst.upgrade_progress_max) + if tempTimer then + inst.upgrade_progress_temp = math.min(inst.upgrade_progress_temp + amount, inst.upgrade_progress_max) + inst.upgrade_progress_temp_timer = tempTimer end end particle_spark:create(inst.x, inst.y, math.random(2, 4), Particle.SYSTEM.middle) @@ -279,9 +312,9 @@ end local turret_shoot_packet = Packet.new() turret_shoot_packet:onReceived(function(message, player) local inst = message:read_instance() - inst:get_data().playanim = 1 + inst.playanim = 1 inst.image_index = 0 - gm.sound_play_at(inst:get_data().upgradeState >= 1 and sound_turretShoot2 or sound_turretShoot1, 1, 0.9 + math.random() * 0.2, inst.x, inst.y) + gm.sound_play_at(inst.upgradeState >= 1 and sound_turretShoot2 or sound_turretShoot1, 1, 0.9 + math.random() * 0.2, inst.x, inst.y) end) local turret_shoot_packet_host = Packet.new() @@ -289,9 +322,9 @@ turret_shoot_packet_host:onReceived(function(message, player) --print("yes I'm also working") local inst = message:read_instance() local owner = message:read_instance() - inst:get_data().playanim = 1 + inst.playanim = 1 inst.image_index = 0 - gm.sound_play_at(inst:get_data().upgradeState >= 1 and sound_turretShoot2 or sound_turretShoot1, 1, 0.9 + math.random() * 0.2, inst.x, inst.y) + gm.sound_play_at(inst.upgradeState >= 1 and sound_turretShoot2 or sound_turretShoot1, 1, 0.9 + math.random() * 0.2, inst.x, inst.y) local buffer = turret_shoot_packet:message_begin() buffer:write_instance(inst) @@ -305,114 +338,124 @@ local shoot_missiledis_offset_map = { {0, 0}, } -local obj_turret = Object.new(NAMESPACE, "turret") +local obj_turret = Object.new(NAMESPACE, "turret", Object.PARENT.actor) obj_turret:set_sprite(sprite_turretaI) obj_turret:clear_callbacks() obj_turret:onCreate(function(inst) - local data = inst:get_data() + --inst.sprite_palette = sprite_palette inst.mask_index = turret_mask - data.idle = sprite_turretaI - data.shoot = sprite_turretashoot - data.sparks = sprite_sparks1 - data.init = nil - data.upgrade_progress = 0 - data.upgrade_progress_max = 3 - data.upgrade_progress_temp = 0 - data.upgrade_progress_temp_timer = 0 - data.cooldown = 0 - data.basecooldown = 50 - data.secondarycooldown = 0 - data.secondarystocks = 0 - data.basesecondarycooldown = 90 - data.extrasecondarycooldown = 12 - data.basesecondarystocks = 4 - data.damage = technicianSpecial.damage - data.upgradeState = 0 - data.ff = 0 + inst.idle = sprite_turretaI + inst.shoot = sprite_turretashoot + inst.sparks = sprite_sparks1 + inst.init = nil + inst.upgrade_progress = 0 + inst.upgrade_progress_max = 3 + inst.upgrade_progress_temp = 0 + inst.upgrade_progress_temp_timer = 0 + inst.cooldown = 0 + inst.basecooldown = 50 + inst.secondarycooldown = 0 + inst.secondarystocks = 0 + inst.basesecondarycooldown = 90 + inst.extrasecondarycooldown = 12 + inst.basesecondarystocks = 4 + inst.damage = 1 + inst.co_damage = technicianSpecial.damage + inst.upgradeState = 0 + inst.ff = 0 inst.image_speed = 0.2 + inst.intangible = true inst:instance_sync() end) obj_turret:onStep(function(inst) - local data = inst:get_data() if inst.parent and Instance.exists(inst.parent) then - if not data.oy then data.oy = inst.y end - data.ff = data.ff + 1 - inst.y = data.oy - math.sin(data.ff / 20) * 2 - 2 + if not inst.oy then inst.oy = inst.y end + inst.ff = inst.ff + 1 + inst.y = inst.oy - math.sin(inst.ff / 20) * 2 - 2 --print(data.upgrade_progress) -- print("TRY AGAIN!") - data.scepter = inst.parent:item_stack_count(item_scepter) - if not data.init then - local xx, _ = move_point_contact_solid(inst.x, inst.y, 90 - 90 * inst.image_xscale) - data.range = math.min(math.abs(xx - inst.x), 1000) + inst.scepter = inst.parent:item_stack_count(item_scepter) + if not inst.init then + local xx, _ = move_point_contact_solid(inst.x, inst.y, 90 - 90 * inst.image_xscale, 600) + inst.range = math.abs(xx - inst.x) --print(data.range) - data.init = 1 + inst.init = 1 --print("xx "..(xx).." inst.x "..(inst.x)) + + obj_sprite_layer.obj_depth = -12 + inst.skin_layer = obj_sprite_layer:create(inst.x, inst.y) + inst.skin_layer.parent = inst + inst.skin_layer.sprite_index = inst.sprite_index + inst.skin_layer.image_xscale = inst.image_xscale + inst.skin_layer:actor_skin_skinnable_init() + inst.skin_layer:actor_skin_skinnable_set_skin(inst.parent) + inst.skin_layer.skinnable = 1 + --Helper.log_struct(inst.skin_layer) end + machine_update_temp(inst) - if data.upgrade_progress_max < 6 and data.scepter > 0 then - data.upgrade_progress_max = 6 + if inst.upgrade_progress_max < 6 and inst.scepter > 0 then + inst.upgrade_progress_max = 6 end local doResync = false - if data.upgrade_progress < 3 and data.upgradeState ~= 0 then - data.idle = sprite_turretaI - data.shoot = sprite_turretashoot - data.sparks = sprite_sparks1 - data.basecooldown = 50 - data.damage = technicianSpecial.damage - data.upgradeState = 0 - data.cooldown = math.min(data.cooldown, data.basecooldown) - data.playanim = nil - if data.missileDis then data.missileDis:destroy() end + if inst.upgrade_progress < 3 and inst.upgradeState ~= 0 then + inst.idle = sprite_turretaI + inst.shoot = sprite_turretashoot + inst.sparks = sprite_sparks1 + inst.basecooldown = 50 + inst.co_damage = technicianSpecial.damage + inst.upgradeState = 0 + inst.cooldown = math.min(inst.cooldown, inst.basecooldown) + inst.playanim = nil + if inst.missileDis then inst.missileDis:destroy() end doResync = true end - if data.upgrade_progress >= 3 and data.upgrade_progress < 6 and data.upgradeState ~= 1 then - data.idle = sprite_turretbI - data.shoot = sprite_turretbshoot - data.sparks = sprite_sparks2 - data.basecooldown = 12 - data.damage = 0.7 - data.upgradeState = 1 - data.cooldown = math.min(data.cooldown, data.basecooldown) - data.playanim = nil - if (data.prevUpgradeState or data.upgradeState) < data.upgradeState then + if inst.upgrade_progress >= 3 and inst.upgrade_progress < 6 and inst.upgradeState ~= 1 then + inst.idle = sprite_turretbI + inst.shoot = sprite_turretbshoot + inst.sparks = sprite_sparks2 + inst.basecooldown = 12 + inst.co_damage = 0.7 + inst.upgradeState = 1 + inst.cooldown = math.min(inst.cooldown, inst.basecooldown) + inst.playanim = nil + if (inst.prevUpgradeState or inst.upgradeState) < inst.upgradeState then machineFlash(inst) gm.sound_play_at(sound_turretUpgrade, 1, 1, inst.x, inst.y) end - if data.missileDis then data.missileDis:destroy() end + if inst.missileDis then inst.missileDis:destroy() end doResync = true end - if data.upgrade_progress >= 6 and data.upgradeState ~= 2 then - data.idle = sprite_turretcI - data.shoot = sprite_turretcshoot - data.sparks = sprite_sparks3 - data.missileDis = obj_sprite_layer:create(inst.x, inst.y) - data.missileDis.parent = inst - data.missileDis.sprite_index = sprite_turretc_mis1 - data.missileDis.image_xscale = inst.image_xscale - data.secondarystocks = data.basesecondarystocks - data.missileState = 1 - data.upgradeState = 2 - data.playanim = nil + if inst.upgrade_progress >= 6 and inst.upgradeState ~= 2 then + inst.idle = sprite_turretcI + inst.shoot = sprite_turretcshoot + inst.sparks = sprite_sparks3 + obj_sprite_layer.obj_depth = 1 + inst.missileDis = obj_sprite_layer:create(inst.x, inst.y) + inst.missileDis.parent = inst + inst.missileDis.sprite_index = sprite_turretc_mis1 + inst.missileDis.image_xscale = inst.image_xscale + inst.secondarystocks = inst.basesecondarystocks + inst.missileState = 1 + inst.upgradeState = 2 + inst.playanim = nil machineFlash(inst) - machineFlash(data.missileDis) + machineFlash(inst.missileDis) gm.sound_play_at(sound_turretUpgrade, 1, 0.9 + math.random() * 0.2, inst.x, inst.y) doResync = true end - if data.playanim then - local attack_speed = inst.parent.attack_speed - if inst.parent:buff_stack_count(buff_vending) >= 1 then attack_speed = attack_speed - MACHINE_VENDING_ATTACKSPEED end - if inst.parent:buff_stack_count(buff_vending_2) >= 1 then attack_speed = attack_speed - MACHINE_VENDING_ATTACKSPEED2 end - inst.image_speed = 0.2 * attack_speed + if inst.playanim then + inst.image_speed = 0.2 * inst.attack_speed --print(data.parent:buff_stack_count(buff_vending)) - inst.sprite_index = data.shoot - if inst.image_index >= gm.sprite_get_number(data.shoot) - 1 then - data.playanim = nil + inst.sprite_index = inst.shoot + if inst.image_index >= gm.sprite_get_number(inst.shoot) - 1 then + inst.playanim = nil end else - inst.sprite_index = data.idle + inst.sprite_index = inst.idle inst.image_speed = 0.2 end if gm._mod_net_isHost() and doResync then @@ -420,71 +463,71 @@ obj_turret:onStep(function(inst) inst:instance_resync() end - if data.missileDis and Instance.exists(data.missileDis) then + if inst.missileDis and Instance.exists(inst.missileDis) then local xo, yo = 0, 0 - if data.playanim then + if inst.playanim then xo = shoot_missiledis_offset_map[math.floor(inst.image_index + 1)][1] yo = shoot_missiledis_offset_map[math.floor(inst.image_index + 1)][2] end - if data.switchMissileState then - if data.switchMissileState == -1 then - if data.missileDis.sprite_index == sprite_turretc_mis3 then - data.missileDis.image_index = math.min(data.missileDis.image_index + 0.3, gm.sprite_get_number(sprite_turretc_mis3) - 1) - if data.missileDis.image_index >= gm.sprite_get_number(data.missileDis.sprite_index) - 1 then - data.missileDis.sprite_index = sprite_turretc_mis2 + if inst.switchMissileState then + if inst.switchMissileState == -1 then + if inst.missileDis.sprite_index == sprite_turretc_mis3 then + inst.missileDis.image_index = math.min(inst.missileDis.image_index + 0.3, gm.sprite_get_number(sprite_turretc_mis3) - 1) + if inst.missileDis.image_index >= gm.sprite_get_number(inst.missileDis.sprite_index) - 1 then + inst.missileDis.sprite_index = sprite_turretc_mis2 end else - data.missileDis.image_index = math.max(data.missileDis.image_index - 0.2, 0) - if data.missileDis.image_index <= 0 then - data.missileState = 1 - data.switchMissileState = nil + inst.missileDis.image_index = math.max(inst.missileDis.image_index - 0.2, 0) + if inst.missileDis.image_index <= 0 then + inst.missileState = 1 + inst.switchMissileState = nil end end else - data.missileDis.sprite_index = sprite_turretc_mis2 - data.missileDis.image_index = math.min(data.missileDis.image_index + 0.3, gm.sprite_get_number(data.missileDis.sprite_index) - 1) - if data.missileDis.image_index >= gm.sprite_get_number(data.missileDis.sprite_index) - 1 then - data.missileState = 2 - data.switchMissileState = nil + inst.missileDis.sprite_index = sprite_turretc_mis2 + inst.missileDis.image_index = math.min(inst.missileDis.image_index + 0.3, gm.sprite_get_number(inst.missileDis.sprite_index) - 1) + if inst.missileDis.image_index >= gm.sprite_get_number(inst.missileDis.sprite_index) - 1 then + inst.missileState = 2 + inst.switchMissileState = nil end end - elseif data.missileState == 2 then - data.missileDis.sprite_index = sprite_turretc_mis3 - data.missileDis.image_index = math.min(data.missileDis.image_index + 0.2, gm.sprite_get_number(sprite_turretc_mis3) - 1) + elseif inst.missileState == 2 then + inst.missileDis.sprite_index = sprite_turretc_mis3 + inst.missileDis.image_index = math.min(inst.missileDis.image_index + 0.2, gm.sprite_get_number(sprite_turretc_mis3) - 1) else - data.missileDis.sprite_index = sprite_turretc_mis1 - data.missileDis.image_index = inst.image_index + inst.missileDis.sprite_index = sprite_turretc_mis1 + inst.missileDis.image_index = inst.image_index end - data.missileDis.x = inst.x + xo * inst.image_xscale - data.missileDis.y = inst.y + yo + inst.missileDis.x = inst.x + xo * inst.image_xscale + inst.missileDis.y = inst.y + yo end - if inst.parent:is_authority() or (data.upgradeState == 2 and gm._mod_net_isHost()) then + if inst.parent:is_authority() or (inst.upgradeState == 2 and gm._mod_net_isHost()) then local wantattack = false local victims = List.new() - inst:collision_line_list(inst.x, inst.y, inst.x + data.range * inst.image_xscale, inst.y, gm.constants.pActor, false, true, victims, false) + inst:collision_line_list(inst.x, inst.y, inst.x + inst.range * inst.image_xscale, inst.y, gm.constants.pActorCollisionBase, false, true, victims, false) for _, victim in ipairs(victims) do - if victim.team ~= inst.team and not victim.intangible then + if inst:attack_collision_canhit(victim) then wantattack = victim break end end - data.cooldown = data.cooldown - 1 - data.secondarycooldown = data.secondarycooldown - 1 + inst.cooldown = inst.cooldown - 1 + inst.secondarycooldown = inst.secondarycooldown - 1 if wantattack then - if data.cooldown <= 0 and inst.parent:is_authority() then - data.playanim = 1 + if inst.cooldown <= 0 and inst.parent:is_authority() then + inst.playanim = 1 inst.image_index = 0 - local attack_speed = inst.parent.attack_speed - if inst.parent:buff_stack_count(buff_vending) >= 1 then attack_speed = attack_speed - MACHINE_VENDING_ATTACKSPEED end - if inst.parent:buff_stack_count(buff_vending_2) >= 1 then attack_speed = attack_speed - MACHINE_VENDING_ATTACKSPEED2 end - data.cooldown = data.basecooldown / attack_speed + --print(inst.attack_speed) + inst.cooldown = inst.basecooldown / inst.attack_speed + inst.damage = inst.parent.damage for i = 0, inst.parent:buff_stack_count(buff_mirror) do - local attack = inst.parent:fire_bullet(inst.x, inst.y + (data.upgradeState >= 1 and 8 or 10), 1000, 90 - 90 * inst.image_xscale, data.damage, nil, data.sparks, Attack_Info.TRACER.commando1) - attack.climb = i * 8 + local attack_info = inst:fire_bullet(inst.x, inst.y + (inst.upgradeState >= 1 and 8 or 10), 1000, 90 - 90 * inst.image_xscale, inst.co_damage, nil, inst.sparks, Attack_Info.TRACER.commando1).attack_info + setNoProc(attack_info) + attack_info.climb = i * 8 * 1.35 end - gm.sound_play_at(data.upgradeState >= 1 and sound_turretShoot2 or sound_turretShoot1, 1, 0.9 + math.random() * 0.2, inst.x, inst.y) + gm.sound_play_at(inst.upgradeState >= 1 and sound_turretShoot2 or sound_turretShoot1, 1, 0.9 + math.random() * 0.2, inst.x, inst.y) --print(gm._mod_net_isHost()) if not Net.is_single() then if gm._mod_net_isHost() then @@ -500,39 +543,47 @@ obj_turret:onStep(function(inst) end end end - if data.upgradeState == 2 and gm._mod_net_isHost() then - if data.missileState == 2 then - if data.secondarycooldown <= 0 then + if inst.upgradeState == 2 and gm._mod_net_isHost() then + if inst.missileState == 2 then + if inst.secondarycooldown <= 0 then local missile = object_missile:create(inst.x - 16 * inst.image_xscale, inst.y - 20) - missile.parent = inst.parent.id + missile.parent = inst.id missile.team = inst.team missile.damage = inst.parent.damage missile.sync = true --Helper.log_struct(missile) - data.missileDis.image_index = 0 - data.secondarystocks = data.secondarystocks - 1 - data.secondarycooldown = data.extrasecondarycooldown - if data.secondarystocks <= 0 then - data.secondarycooldown = data.basesecondarycooldown - data.secondarystocks = data.basesecondarystocks - data.switchMissileState = -1 + inst.missileDis.image_index = 0 + inst.secondarystocks = inst.secondarystocks - 1 + inst.secondarycooldown = inst.extrasecondarycooldown + if inst.secondarystocks <= 0 then + inst.secondarycooldown = inst.basesecondarycooldown + inst.secondarystocks = inst.basesecondarystocks + inst.switchMissileState = -1 end end - elseif data.secondarycooldown <= 4 * gm.sprite_get_number(sprite_turretc_mis2) and not data.switchMissileState then - data.missileDis.image_index = 0 - data.switchMissileState = 1 + elseif inst.secondarycooldown <= 4 * gm.sprite_get_number(sprite_turretc_mis2) and not inst.switchMissileState then + inst.missileDis.image_index = 0 + inst.switchMissileState = 1 end end else - data.switchMissileState = -1 - if data.secondarycooldown <= 0 then - data.secondarycooldown = data.basesecondarycooldown - data.secondarystocks = data.basesecondarystocks + inst.switchMissileState = -1 + if inst.secondarycooldown <= 0 then + inst.secondarycooldown = inst.basesecondarycooldown + inst.secondarystocks = inst.basesecondarystocks end end -- print(data.cooldown.." LOUD INCORRECT BUZZER") end - data.prevUpgradeState = data.upgradeState + + if inst.skin_layer then + inst.skin_layer.x = inst.x + inst.skin_layer.y = inst.y + inst.skin_layer.sprite_index = inst.sprite_index + inst.skin_layer.image_index = inst.image_index + end + + inst.prevUpgradeState = inst.upgradeState else inst:destroy() end @@ -550,18 +601,16 @@ obj_turret:onDestroy(function(inst) end end) obj_turret:onSerialize(function(self, buffer) - local data = self:get_data() buffer:write_instance(self.parent) buffer:write_byte(self.team) buffer:write_byte(self.image_xscale + 1) --We have to add +1 otherwise the byte will underflow if -1 - buffer:write_byte(data.upgrade_progress) + buffer:write_byte(self.upgrade_progress) end) obj_turret:onDeserialize(function(self, buffer) - local data = self:get_data() self.parent = buffer:read_instance() self.team = buffer:read_byte() self.image_xscale = buffer:read_byte() - 1 --Revert the +1 after being recieved - data.upgrade_progress = buffer:read_byte() + self.upgrade_progress = buffer:read_byte() end) -- Vending Machine @@ -618,7 +667,7 @@ local vending_shoot_packet = Packet.new() vending_shoot_packet:onReceived(function(message, player) local inst = message:read_instance() local recipient = message:read_instance() - inst:get_data().playanim = 1 + inst.playanim = 1 if recipient.actor_state_current_id == -1 and drinkSprites[recipient.class] then recipient:sound_play(sound_vendingDrink, 1, 1) recipient.__ssr_current_drink_sprite = drinkSprites[recipient.class][inst:get_data().upgraded and 2 or 1] @@ -631,56 +680,61 @@ obj_vending:set_sprite(sprite_vending1) obj_vending.obj_depth = 20 obj_vending:clear_callbacks() obj_vending:onCreate(function(inst) - local data = inst:get_data() inst.gravity = MACHINE_VENDING_GRAV - data.init = nil - data.upgrade_progress = 0 - data.upgrade_progress_max = 3 - data.upgrade_progress_temp = 0 - data.upgrade_progress_temp_timer = 0 + inst.init = nil + inst.upgrade_progress = 0 + inst.upgrade_progress_max = 3 + inst.upgrade_progress_temp = 0 + inst.upgrade_progress_temp_timer = 0 inst.image_speed = 0.2 - data.upgraded = nil - data.buff = buff_vending + inst.upgraded = nil + inst.buff = buff_vending + inst:actor_skin_skinnable_init() inst:instance_sync() end) obj_vending:onStep(function(inst) - local data = inst:get_data() if inst.parent and Instance.exists(inst.parent) then -- print("TRY AGAIN!") -- print(data.hits_taken.. "hits taken") if is_colliding_stage(inst, inst.x, inst.y + inst.vspeed + inst.gravity) then move_contact_solid(inst, 90, 32) - if inst.vspeed > MACHINE_VENDING_DAMAGE_THRESHOLD and inst.parent:is_authority() then - inst.parent:fire_explosion(inst.x, inst.y - MACHINE_VENDING_BLAST_H / 2, MACHINE_VENDING_BLAST_W, MACHINE_VENDING_BLAST_H, inst.parent:skill_get_damage(technicianUtility) * (inst.vspeed / MACHINE_VENDING_DAMAGE_THRESHOLD) * 2 - inst.parent:skill_get_damage(technicianUtility)) - inst:screen_shake(math.floor(inst.vspeed / MACHINE_VENDING_DAMAGE_THRESHOLD) + 2) + if inst.vspeed > MACHINE_VENDING_DAMAGE_THRESHOLD then + if inst.parent:is_authority() then + inst.parent:fire_explosion(inst.x, inst.y - MACHINE_VENDING_BLAST_H / 2, MACHINE_VENDING_BLAST_W, MACHINE_VENDING_BLAST_H, inst.parent:skill_get_damage(technicianUtility) * (inst.vspeed / MACHINE_VENDING_DAMAGE_THRESHOLD) * 2 - inst.parent:skill_get_damage(technicianUtility)) + end local ef_sparks = object_sparks:create(inst.x, inst.y) ef_sparks.sprite_index = mine_explosion ef_sparks.image_speed = 0.25 ef_sparks.image_yscale = 1 end + if inst.vspeed > 0 then + inst:screen_shake(math.floor(inst.vspeed / MACHINE_VENDING_DAMAGE_THRESHOLD * 2) + 3) + gm.sound_play_at(soundImpact, math.min(0.7 + 0.4 * (inst.vspeed / MACHINE_VENDING_DAMAGE_THRESHOLD), 1.5), math.max(1.4 - 0.4 * (inst.vspeed / MACHINE_VENDING_DAMAGE_THRESHOLD), 0.6), inst.x, inst.y) + end + inst.vspeed = 0 inst.gravity = 0 end local doResync = false machine_update_temp(inst) - if data.upgrade_progress < 3 and data.upgraded then + if inst.upgrade_progress < 3 and inst.upgraded then inst.sprite_index = sprite_vending1 - data.upgraded = nil - data.buff = buff_vending + inst.upgraded = nil + inst.buff = buff_vending doResync = true end - if data.upgrade_progress >= 3 and not data.upgraded then + if inst.upgrade_progress >= 3 and not inst.upgraded then inst.sprite_index = sprite_vending2 - data.upgraded = 1 - data.buff = buff_vending_2 + inst.upgraded = 1 + inst.buff = buff_vending_2 machineFlash(inst) gm.sound_play_at(sound_vendingUpgrade, 1, 1, inst.x, inst.y) doResync = true end - if data.playanim then + if inst.playanim then if inst.image_index >= gm.sprite_get_number(inst.sprite_index) - 1 then - data.playanim = nil + inst.playanim = nil end else inst.image_index = 0 @@ -694,17 +748,17 @@ obj_vending:onStep(function(inst) -- print(player:buff_stack_count(data.buff).. " buffmaxxing") -- print(player.team.. " this is our team") -- print(inst.team.. " vending team") - if player.team == inst.team and player:buff_stack_count(data.buff) <= 0 then + if player.team == inst.team and player:buff_stack_count(inst.buff) <= 0 then gm.sound_play_at(sound_vendingDispense, 1, 1, inst.x, inst.y) player:buff_remove(buff_vending) - player:buff_apply(data.buff, 5 * 60) + player:buff_apply(inst.buff, 5 * 60) if player.actor_state_current_id == -1 and drinkSprites[player.class] then player:sound_play(sound_vendingDrink, 1, 1) - player.__ssr_current_drink_sprite = drinkSprites[player.class][data.upgraded and 2 or 1] + player.__ssr_current_drink_sprite = drinkSprites[player.class][inst.upgraded and 2 or 1] player:enter_state(stateDrink) end --print(player.state) - data.playanim = 1 + inst.playanim = 1 if not Net.is_single() then local buffer = vending_shoot_packet:message_begin() buffer:write_instance(inst) @@ -719,24 +773,26 @@ obj_vending:onStep(function(inst) inst:destroy() end end) +obj_vending:onDraw(function(inst) + inst:actor_skin_skinnable_draw_self() +end) obj_vending:onDestroy(function(inst) if gm._mod_net_isHost() then inst:instance_destroy_sync() end end) obj_vending:onSerialize(function(self, buffer) - local data = self:get_data() buffer:write_instance(self.parent) buffer:write_byte(self.team) buffer:write_byte(self.image_xscale + 1) --We have to add +1 otherwise the byte will underflow if -1 - buffer:write_byte(data.upgrade_progress) + buffer:write_byte(self.upgrade_progress) end) obj_vending:onDeserialize(function(self, buffer) - local data = self:get_data() self.parent = buffer:read_instance() self.team = buffer:read_byte() self.image_xscale = buffer:read_byte() - 1 --Revert the +1 after being recieved - data.upgrade_progress = buffer:read_byte() + self.upgrade_progress = buffer:read_byte() + self:actor_skin_skinnable_set_skin(self.parent) end) -- and they called it a mine @@ -744,49 +800,56 @@ end) local obj_mine_pull = Object.new(NAMESPACE, "mine_pull") obj_mine_pull:clear_callbacks() obj_mine_pull:onCreate(function(inst) - local data = inst:get_data() - data.life = MACHINE_MINE_PULL_LIFE - data.ff = 0 + inst.life = MACHINE_MINE_PULL_LIFE + inst.ff = 0 end) obj_mine_pull:onStep(function(inst) - local data = inst:get_data() - data.ff = data.ff + 1 + inst.ff = inst.ff + 1 local targets = List.wrap(gm.find_characters_circle(inst.x, inst.y, MACHINE_MINE_PULL_RADIUS, true, inst.team == 1 and 2 or 1, true)) for _, target in ipairs(targets) do - if target.team ~= inst.team and not target.intangible and not GM.actor_state_is_climb_state(target.actor_state_current_id) then + if inst:attack_collision_canhit(target) and not GM.actor_state_is_climb_state(target.actor_state_current_id) then -- move_contact_solid(target, 360 - gm.point_direction(inst.x, inst.y, target.x, target.y), 1)--(0.5 + 0.5 * data.life / 120) * (1 - gm.point_distance(inst.x, inst.y, target.x, target.y) / MACHINE_MINE_PULL_RADIUS)) local lastx = target.x - local strength = math.max(1, math.ceil((0.5 + 2.5 * (1 - data.life / MACHINE_MINE_PULL_LIFE)) * (0.2 + 0.8 * (1 - gm.point_distance(inst.x, inst.y, target.x, target.y) / MACHINE_MINE_PULL_RADIUS)))) + local lasty = target.y + local strength = math.max(1, math.ceil((0.5 + 2.5 * (1 - inst.life / MACHINE_MINE_PULL_LIFE) + math.max(-1.5 + 3 * (1 - inst.life / MACHINE_MINE_PULL_LIFE), 0)) * (0.2 + 0.8 * (1 - gm.point_distance(inst.x, inst.y, target.x, target.y) / MACHINE_MINE_PULL_RADIUS)))) if GM.actor_is_classic(target) then target:move_contact_solid(180 + gm.point_direction(inst.x, target.y, target.x, target.y), strength) - if target.y < inst.y then + --if target.y < inst.y then --target:move_contact_solid(180 + gm.point_direction(target.x, inst.y, target.x, target.y), strength) - end - else + --end + elseif not GM.actor_is_boss(target) then --print("i'm not classic") - --move_in_direction(target, gm.point_direction(target.x, inst.y, target.x, target.y), 100) + target.x = target.x - math.cos(math.rad(gm.point_direction(inst.x, inst.y, target.x, target.y))) * strength + target.y = target.y + math.sin(math.rad(gm.point_direction(inst.x, inst.y, target.x, target.y))) * strength + --move_in_direction(target, gm.point_direction(inst.x, inst.y, target.x, target.y), 100) --target.y = (target.pVspeed > 0 and math.min(target.y, inst.y) or math.max(target.y, inst.y)) end + if lastx < inst.x and target.x >= inst.x then target.x = math.min(target.x, inst.x) elseif lastx > inst.x and target.x <= inst.x then target.x = math.max(target.x, inst.x) end + + if lasty < inst.y and target.y >= inst.y then + target.y = math.min(target.y, inst.y) + elseif lasty > inst.y and target.y <= inst.y then + target.y = math.max(target.y, inst.y) + end end end - data.life = data.life - 1 - if data.life <= 0 then + inst.life = inst.life - 1 + if inst.life <= 0 then inst:destroy() end end) local int1 = 60 local int2 = 120 / int1 obj_mine_pull:onDraw(function(inst) - local data = inst:get_data() - gm.draw_set_alpha(((0.2 * math.sin(data.ff / 10)) + 0.4) * math.min(data.ff / (int1 / 2), 1)) + gm.draw_set_alpha(((0.2 * math.sin(inst.ff / 10)) + 0.4) * math.min(inst.ff / (int1 / 2), 1)) gm.draw_set_colour(color_tech_blue) - local a = data.ff > int1 and (int1 * int2 - (data.ff - int1) * int1 / (MACHINE_MINE_PULL_LIFE - int1) * int2) or (data.ff * int2) - local t = math.min(data.ff > int1 and (1 - (data.ff - int1) / (MACHINE_MINE_PULL_LIFE - int1)) or (data.ff / int1), 1) + local a = inst.ff > int1 and (int1 * int2 - (inst.ff - int1) * int1 / (MACHINE_MINE_PULL_LIFE - int1) * int2) or (inst.ff * int2) + local t = math.min(inst.ff > int1 and (1 - (inst.ff - int1) / (MACHINE_MINE_PULL_LIFE - int1)) or (inst.ff / int1), 1) --local a = (data.ff * 5) --local t = math.min(data.ff / int1, 1) gm.draw_circle(math.floor(inst.x + 0.5), math.floor(inst.y + 0.5), a + (MACHINE_MINE_PULL_RADIUS - a) * t, true) @@ -798,23 +861,22 @@ obj_mine:set_sprite(sprite_mine1) --obj_mine.obj_depth = 218 -- GRAAAAAAH THIS WONT GO BACK --- Note from the future: Now it does, thanks kris :) ----Never mind I don't like it obj_mine:clear_callbacks() obj_mine:onCreate(function(inst) - local data = inst:get_data() inst.gravity = MACHINE_MINE_GRAV inst.mask_index = mine_mask - data.upgrade_progress = 0 - data.upgrade_progress_max = 3 - data.upgrade_progress_temp = 0 - data.upgrade_progress_temp_timer = 0 - data.upgraded = nil - data.pull_timer = MACHINE_MINE_PULL_INTERVAL - data.ff = 0 + inst.upgrade_progress = 0 + inst.upgrade_progress_max = 3 + inst.upgrade_progress_temp = 0 + inst.upgrade_progress_temp_timer = 0 + inst.upgraded = nil + inst.pull_timer = MACHINE_MINE_PULL_INTERVAL + inst.ff = 0 inst.image_speed = 0.2 + inst:actor_skin_skinnable_init() inst:instance_sync() end) obj_mine:onStep(function(inst) - local data = inst:get_data() if inst.parent and Instance.exists(inst.parent) then - data.ff = data.ff + 1 + inst.ff = inst.ff + 1 inst.hspeed = inst.hspeed * 0.9 if is_colliding_stage(inst, inst.x + inst.hspeed, inst.y) then inst.hspeed = 0 @@ -826,20 +888,20 @@ obj_mine:onStep(function(inst) end local doResync = false machine_update_temp(inst) - if data.upgrade_progress < 3 and data.upgraded then + if inst.upgrade_progress < 3 and inst.upgraded then inst.sprite_index = sprite_mine1 for _, pull in ipairs(Instance.find_all(obj_mine_pull)) do if pull.parent == inst.id then pull:destroy() end end - data.upgraded = nil + inst.upgraded = nil doResync = true end - if data.upgrade_progress >= 3 and not data.upgraded then + if inst.upgrade_progress >= 3 and not inst.upgraded then inst.sprite_index = sprite_mine2 - data.pull_timer = 0 - data.upgraded = 1 + inst.pull_timer = 0 + inst.upgraded = 1 machineFlash(inst) gm.sound_play_at(sound_mineUpgrade, 1, 1, inst.x, inst.y) doResync = true @@ -847,13 +909,13 @@ obj_mine:onStep(function(inst) if gm._mod_net_isHost() and doResync then inst:instance_resync() end - if data.upgraded == 1 then - data.pull_timer = data.pull_timer - 1 - if data.pull_timer <= 0 then + if inst.upgraded == 1 then + inst.pull_timer = inst.pull_timer - 1 + if inst.pull_timer <= 0 then local JimmyJohnsPizzeria = obj_mine_pull:create(inst.x, inst.y) JimmyJohnsPizzeria.parent = inst.id JimmyJohnsPizzeria.team = inst.team - data.pull_timer = MACHINE_MINE_PULL_INTERVAL + inst.pull_timer = MACHINE_MINE_PULL_INTERVAL end end else @@ -861,11 +923,11 @@ obj_mine:onStep(function(inst) end end) obj_mine:onDraw(function(inst) - local data = inst:get_data() - if not data.upgraded then - gm.draw_set_alpha((0.3 * math.sin(data.ff / 10)) + 0.4) + inst:actor_skin_skinnable_draw_self() + if not inst.upgraded then + gm.draw_set_alpha((0.3 * math.sin(inst.ff / 10)) + 0.4) gm.draw_set_colour(color_tech_red) - gm.draw_circle(math.floor(inst.x + 0.5), math.floor(inst.y + 0.5), data.ff * 2.5 + (70 - data.ff * 2.5) * math.min(data.ff / 30, 1), true) + gm.draw_circle(math.floor(inst.x + 0.5), math.floor(inst.y + 0.5), inst.ff * 2.5 + (70 - inst.ff * 2.5) * math.min(inst.ff / 30, 1), true) gm.draw_set_alpha(1) end end) @@ -881,30 +943,32 @@ obj_mine:onDestroy(function(inst) ef_sparks.image_yscale = 1 gm.sound_play_at(sound_mineExplode1, 1, 0.9 + math.random() * 0.2, inst.x, inst.y) + inst:screen_shake(5) if gm._mod_net_isHost() then for i = 0, inst.parent:buff_stack_count(buff_mirror) do local attack_info = inst.parent:fire_explosion(inst.x, inst.y, get_tiles(6), get_tiles(6), inst.parent:skill_get_damage(technicianSecondary)).attack_info attack_info.knockback = 6 - attack_info:set_stun(1.2) + if inst.upgraded then + attack_info:set_stun(1.2) + end end inst:instance_destroy_sync() end end) obj_mine:onSerialize(function(self, buffer) - local data = self:get_data() buffer:write_instance(self.parent) buffer:write_byte(self.team) buffer:write_int(self.hspeed) - buffer:write_byte(data.upgrade_progress) + buffer:write_byte(self.upgrade_progress) end) obj_mine:onDeserialize(function(self, buffer) - local data = self:get_data() self.parent = buffer:read_instance() self.team = buffer:read_byte() self.hspeed = buffer:read_int() - data.upgrade_progress = buffer:read_byte() + self.upgrade_progress = buffer:read_byte() + self:actor_skin_skinnable_set_skin(self.parent) end) -- Stick of Death @@ -913,64 +977,29 @@ buff_exposed.icon_sprite = buff_exposed_sprite buff_exposed_2.icon_sprite = buff_exposed_2_sprite buff_exposed:clear_callbacks() buff_exposed_2:clear_callbacks() -Callback.add(Callback.TYPE.onAttackHit, "SSOnHitExposed", function(hit_info) - --Helper.log_struct(hit_info) - --print(hit_info.attack_info.__ssr_technician_no_expose_proc) - --print("Target id: "..hit_info.inflictor.id) - local expose = 0 - if hit_info.target:buff_stack_count(buff_exposed) >= 1 then expose = 1 end - if hit_info.target:buff_stack_count(buff_exposed_2) >= 1 then expose = 2 end - if not hit_info.attack_info.__ssr_technician_is_expose and hit_info.inflictor and Instance.exists(hit_info.inflictor) and expose >= 1 and gm._mod_net_isHost() then - local attack_info = hit_info.inflictor:fire_direct(hit_info.target, hit_info.damage * 0.15 / hit_info.inflictor.damage, hit_info.attack_info.direction, hit_info.target.x - 10, hit_info.target.y).attack_info - attack_info.__ssr_technician_is_expose = expose - attack_info.damage_color = expose == 2 and color_tech_orange or color_tech_red - attack_info.climb = 8 * 1.35 - --Helper.log_struct(attack_info) - end -end) - ---Hook from Needles -gm.pre_script_hook(gm.constants.damager_calculate_damage, function(self, other, result, args) - --print("HIIIII") - --print(#args) - --for i = 1, #args do - -- print(args[i].value) - --end - --Helper.log_struct(args[1]) --Hit Info - --Helper.log_struct(args[6]) --Player - local _hit_info = args[1] - local _damage = args[4] - local _critical = args[5] - if _hit_info and _hit_info.value and (_hit_info.value.attack_info.__ssr_technician_is_expose or 0) >= 2 and not gm.bool(_critical.value) then - _critical.value = true - _damage.value = _damage.value * 2 - end -end) local obj_amplifier = Object.new(NAMESPACE, "amplifier") obj_amplifier:set_sprite(sprite_amplifier1) obj_amplifier:clear_callbacks() obj_amplifier:onCreate(function(inst) - local data = inst:get_data() inst.gravity = MACHINE_VENDING_GRAV inst.mask_index = amplifier_mask - data.idle = sprite_turretaI - data.shoot = sprite_turretashoot - data.radius = MACHINE_AMPLIFIER_RADIUS - data.upgrade_progress = 0 - data.upgrade_progress_max = 3 - data.upgrade_progress_temp = 0 - data.upgrade_progress_temp_timer = 0 - data.visual_radius = 0 - data.ff = 0 - data.upgraded = nil - data.buff = buff_exposed + inst.idle = sprite_turretaI + inst.shoot = sprite_turretashoot + inst.radius = MACHINE_AMPLIFIER_RADIUS + inst.upgrade_progress = 0 + inst.upgrade_progress_max = 3 + inst.upgrade_progress_temp = 0 + inst.upgrade_progress_temp_timer = 0 + inst.visual_radius = 0 + inst.ff = 0 + inst.upgraded = nil + inst.buff = buff_exposed inst:instance_sync() end) obj_amplifier:onStep(function(inst) - local data = inst:get_data() if inst.parent and Instance.exists(inst.parent) then - data.ff = data.ff + 1 + inst.ff = inst.ff + 1 if is_colliding_stage(inst, inst.x, inst.y + inst.vspeed + inst.gravity) then move_contact_solid(inst, 90, 32) if inst.vspeed > MACHINE_VENDING_DAMAGE_THRESHOLD and inst.parent:is_authority() then @@ -986,20 +1015,20 @@ obj_amplifier:onStep(function(inst) inst.gravity = 0 end - data.visual_radius = gm.lerp(data.visual_radius, data.radius, 0.2) + inst.visual_radius = gm.lerp(inst.visual_radius, inst.radius, 0.2) local doResync = false machine_update_temp(inst) - if data.upgrade_progress < 3 and data.upgraded then + if inst.upgrade_progress < 3 and inst.upgraded then inst.sprite_index = sprite_amplifier1 - data.buff = buff_exposed - data.upgraded = nil + inst.buff = buff_exposed + inst.upgraded = nil doResync = true end - if data.upgrade_progress >= 3 and not data.upgraded then + if inst.upgrade_progress >= 3 and not inst.upgraded then inst.sprite_index = sprite_amplifier2 - data.buff = buff_exposed_2 - data.upgraded = 1 + inst.buff = buff_exposed_2 + inst.upgraded = 1 machineFlash(inst) doResync = true end @@ -1009,11 +1038,11 @@ obj_amplifier:onStep(function(inst) inst:instance_resync() end - local targets = List.wrap(gm.find_characters_circle(inst.x, inst.y, data.radius, true, inst.team == 1 and 2 or 1, true)) + local targets = List.wrap(gm.find_characters_circle(inst.x, inst.y, inst.radius, true, inst.team == 1 and 2 or 1, true)) for _, target in ipairs(targets) do - if target.team ~= inst.team and not target.intangible then + if inst:attack_collision_canhit(target) then target:buff_remove(buff_exposed) - target:buff_apply(data.buff, 2) + target:buff_apply(inst.buff, 2) end end end @@ -1022,10 +1051,9 @@ obj_amplifier:onStep(function(inst) end end) obj_amplifier:onDraw(function(inst) - local data = inst:get_data() - gm.draw_set_alpha((0.4 * math.sin(data.ff * 0.07)) + 0.4) - gm.draw_set_colour(data.upgraded and color_tech_orange or color_tech_red) - gm.draw_circle(math.floor(inst.x + 0.5), math.floor(inst.y + 0.5), data.visual_radius, true) + gm.draw_set_alpha((0.4 * math.sin(inst.ff * 0.07)) + 0.4) + gm.draw_set_colour(inst.upgraded and color_tech_orange or color_tech_red) + gm.draw_circle(math.floor(inst.x + 0.5), math.floor(inst.y + 0.5), inst.visual_radius, true) gm.draw_set_alpha(1) end) obj_amplifier:onDestroy(function(inst) @@ -1034,26 +1062,79 @@ obj_amplifier:onDestroy(function(inst) end end) obj_amplifier:onSerialize(function(self, buffer) - local data = self:get_data() buffer:write_instance(self.parent) buffer:write_byte(self.team) - buffer:write_byte(data.upgrade_progress) + buffer:write_byte(self.upgrade_progress) end) obj_amplifier:onDeserialize(function(self, buffer) - local data = self:get_data() self.parent = buffer:read_instance() self.team = buffer:read_byte() - data.upgrade_progress = buffer:read_byte() + self.upgrade_progress = buffer:read_byte() end) +-- Misc + local machines = {obj_turret, obj_vending, obj_mine, obj_amplifier} +local healable_survivors = { + [Survivor.find("ror-chef").value] = true, + [Survivor.find("ror-hand").value] = true, +} + +Callback.add(Callback.TYPE.onAttackHit, "SSOnHitTechnician", function(hit_info) + --Helper.log_struct(hit_info) + --print(hit_info.attack_info.__ssr_technician_no_expose_proc) + --print("Target id: "..hit_info.inflictor.id) + local expose = 0 + if hit_info.target:buff_stack_count(buff_exposed) >= 1 then expose = 1 end + if hit_info.target:buff_stack_count(buff_exposed_2) >= 1 then expose = 2 end + if not hit_info.attack_info.__ssr_technician_is_expose and hit_info.inflictor and Instance.exists(hit_info.inflictor) and expose >= 1 and gm._mod_net_isHost() then + local attack_info = hit_info.inflictor:fire_direct(hit_info.target, hit_info.damage * 0.15 / hit_info.inflictor.damage, hit_info.attack_info.direction, hit_info.target.x - 10, hit_info.target.y).attack_info + attack_info.__ssr_technician_is_expose = expose + attack_info.damage_color = expose == 2 and color_tech_orange or color_tech_red + attack_info.climb = 8 * 1.35 + --Helper.log_struct(attack_info) + end + + if hit_info.attack_info.__wrench_hit then + if hit_info.attack_info.__wrench_hit == 1 then + gm.sound_play_at(sound_wrenchHit, 1, 0.8 + math.random() * 0.3, hit_info.target.x, hit_info.target.y) + hit_info.attack_info.__wrench_hit = 2 + end + + local sparks = object_sparks:create(hit_info.target.x, hit_info.target.y) + sparks.sprite_index = (hit_info.attack_info.__wrench_hit == 3 and sprite_sparks5 or sprite_sparks4) + sparks.image_speed = 0.33 + sparks.image_xscale = gm.sign(hit_info.target.x - hit_info.inflictor.x) + --sparks:actor_skin_skinnable_init() + --sparks:actor_skin_skinnable_set_skin(hit_info.target) + --sparks.skinnable = 1 + end +end) + +--Hook from Needles +gm.pre_script_hook(gm.constants.damager_calculate_damage, function(self, other, result, args) + --print("HIIIII") + --print(#args) + --for i = 1, #args do + -- print(args[i].value) + --end + --Helper.log_struct(args[1]) --Hit Info + --Helper.log_struct(args[6]) --Player + local _hit_info = args[1] + local _damage = args[4] + local _critical = args[5] + if _hit_info and _hit_info.value and (_hit_info.value.attack_info.__ssr_technician_is_expose or 0) >= 2 and not gm.bool(_critical.value) then + _critical.value = true + _damage.value = _damage.value * 2 + end +end) -- Wrench Whack technicianPrimary.sprite = sprite_skills technicianPrimary.subimage = 0 technicianPrimary.cooldown = 5 -technicianPrimary.damage = 2.1 +technicianPrimary.damage = 1.5 technicianPrimary.require_key_press = false technicianPrimary.is_primary = true technicianPrimary.does_change_activity_state = true @@ -1097,11 +1178,14 @@ stateTechnicianPrimary:onStep(function(actor, data) for i = 0, actor:buff_stack_count(buff_mirror) do if actor:is_authority() then local attack_info = actor:fire_explosion(actor.x + WRENCH_BLAST_OFFSET_X * actor.image_xscale, actor.y + WRENCH_BLAST_OFFSET_Y, WRENCH_BLAST_W, WRENCH_BLAST_H, actor:skill_get_damage(technicianPrimary)).attack_info - attack_info.climb = i * 8 + attack_info.climb = i * 8 * 1.35 attack_info.knockback_direction = actor.image_xscale + attack_info.__wrench_hit = 1 end local machinesHit = List.new() - actor:collision_rectangle_list(actor.x + (WRENCH_BLAST_OFFSET_X - WRENCH_BLAST_W / 2) * actor.image_xscale, actor.y - WRENCH_BLAST_H / 2 + WRENCH_BLAST_OFFSET_Y, actor.x + (WRENCH_BLAST_OFFSET_X + WRENCH_BLAST_W / 2) * actor.image_xscale, actor.y + WRENCH_BLAST_H / 2 + WRENCH_BLAST_OFFSET_Y, gm.constants.oCustomObject, false, true, machinesHit, false) + local x, y, x2, y2 = (actor.x + (WRENCH_BLAST_OFFSET_X - WRENCH_BLAST_W / 2) * actor.image_xscale), (actor.y - WRENCH_BLAST_H / 2 + WRENCH_BLAST_OFFSET_Y), (actor.x + (WRENCH_BLAST_OFFSET_X + WRENCH_BLAST_W / 2) * actor.image_xscale), (actor.y + WRENCH_BLAST_H / 2 + WRENCH_BLAST_OFFSET_Y) + actor:collision_rectangle_list(x, y, x2, y2, gm.constants.oCustomObject, false, true, machinesHit, false) + actor:collision_rectangle_list(x, y, x2, y2, gm.constants.oCustomObject_pNPC, false, true, machinesHit, false) -- ^ finding all machines in machines table that collides with the explosion to upgrade -- print(" Machines ") -- print(tableToString(machines)) @@ -1111,26 +1195,45 @@ stateTechnicianPrimary:onStep(function(actor, data) for _, instance in ipairs(machinesHit) do if machineObj.value == instance.__object_index then if instance.team == actor.team then - upgrade_machine(instance, 1) + upgrade_machine(instance, 1, WRENCH_DOWNGRADE_TIME) --print((machineData.hits_taken).. " Hits Taken ") end end end end + local playersHit = List.new() + actor:collision_rectangle_list(x, y, x2, y2, gm.constants.oP, false, true, playersHit, false) + for _, instance in ipairs(playersHit) do + if healable_survivors[instance.class] then + instance:heal(10) + gm.sound_play_at(sound_wrenchHit, 1, 0.9 + math.random() * 0.2, instance.x, instance.y) + particle_spark:create(instance.x, instance.y, math.random(2, 4), Particle.SYSTEM.middle) + end + end end else local machinesHit = List.new() local endX, _ = move_point_contact_solid(actor.x, actor.y, 90 - 90 * actor.image_xscale, 700) actor:collision_line_list(actor.x, actor.y, endX, actor.y, gm.constants.oCustomObject, false, true, machinesHit, false) + actor:collision_line_list(actor.x, actor.y, endX, actor.y, gm.constants.oCustomObject_pNPC, false, true, machinesHit, false) for _, machineObj in ipairs(machines) do for _, instance in ipairs(machinesHit) do if machineObj.value == instance.__object_index then if instance.team == actor.team then - upgrade_machine(instance, 1) + upgrade_machine(instance, 1, WRENCH_DOWNGRADE_TIME) end end end end + local playersHit = List.new() + actor:collision_line_list(actor.x, actor.y, endX, actor.y, gm.constants.oP, false, true, playersHit, false) + for _, instance in ipairs(playersHit) do + if healable_survivors[instance.class] then + instance:heal(10) + gm.sound_play_at(sound_wrenchHit, 1, 0.9 + math.random() * 0.2, instance.x, instance.y) + particle_spark:create(instance.x, instance.y, math.random(2, 4), Particle.SYSTEM.middle) + end + end end end @@ -1162,6 +1265,7 @@ obj_wrench:onCreate(function(inst) inst.team = 1 inst.parent = -4 + inst:actor_skin_skinnable_init() end) obj_wrench:onStep(function(inst) local data = inst:get_data() @@ -1169,11 +1273,12 @@ obj_wrench:onStep(function(inst) inst.life = inst.life - 1 inst.image_angle = inst.image_angle - inst.speed * 3 for _, actor in ipairs(inst:get_collisions(gm.constants.pActorCollisionBase)) do - if actor.team ~= inst.team and not actor.intangible and not data.hit[actor.id] then + if inst:attack_collision_canhit(actor) and not data.hit[actor.id] then if inst.parent:is_authority() then - for i = 0, actor:buff_stack_count(buff_mirror) do - local attack_info = inst.parent:fire_direct(actor, inst.damage, inst.direction, inst.x, inst.y, nil).attack_info - attack_info.climb = i * 8 + for i = 0, inst.parent:buff_stack_count(buff_mirror) do + local attack_info = inst.parent:fire_direct(actor, inst.damage, inst.direction, inst.x, inst.y).attack_info + attack_info.climb = i * 8 * 1.35 + attack_info.__wrench_hit = 3 end end inst.hits = inst.hits - 1 @@ -1184,22 +1289,35 @@ obj_wrench:onStep(function(inst) end local machinesHit = List.new() inst.parent:collision_rectangle_list(inst.x - 9, inst.y - 9, inst.x + 9, inst.y + 9, gm.constants.oCustomObject, false, true, machinesHit, false) + inst.parent:collision_rectangle_list(inst.x - 9, inst.y - 9, inst.x + 9, inst.y + 9, gm.constants.oCustomObject_pNPC, false, true, machinesHit, false) for _, machineObj in ipairs(machines) do for _, instance in ipairs(machinesHit) do if machineObj.value == instance.__object_index then if instance.team == inst.team and not data.hit[instance.id] then - upgrade_machine(instance, 1, true) + upgrade_machine(instance, 1, WRENCH_THROW_DOWNGRADE_TIME) data.hit[instance.id] = true break end end end end + local playersHit = List.new() + inst.parent:collision_rectangle_list(inst.x - 9, inst.y - 9, inst.x + 9, inst.y + 9, gm.constants.oP, false, true, playersHit, false) + for _, instance in ipairs(playersHit) do + if healable_survivors[instance.class] then + instance:heal(10) + gm.sound_play_at(sound_wrenchHit, 1, 0.9 + math.random() * 0.2, instance.x, instance.y) + particle_spark:create(instance.x, instance.y, math.random(2, 4), Particle.SYSTEM.middle) + end + end else gm.sound_play_at(sound_wrenchHit, 1, 0.8 + math.random() * 0.3, inst.x, inst.y) inst:destroy() end end) +obj_wrench:onDraw(function(inst) + inst:actor_skin_skinnable_draw_self() +end) obj_wrench:onDestroy(function(inst) particle_spark:create(inst.x, inst.y, math.random(2, 3), Particle.SYSTEM.middle) end) @@ -1209,7 +1327,7 @@ technicianPrimaryAlt.subimage = 6 technician:add_primary(technicianPrimaryAlt) technicianPrimaryAlt.cooldown = 5 -technicianPrimaryAlt.damage = 1.8 +technicianPrimaryAlt.damage = 1.5 technicianPrimaryAlt.require_key_press = false technicianPrimaryAlt.is_primary = true technicianPrimaryAlt.does_change_activity_state = true @@ -1251,24 +1369,35 @@ stateTechnicianPrimaryAlt:onStep(function(actor, data) local dir = actor:skill_util_facing_direction() if not GM.skill_util_update_heaven_cracker(actor, damage, actor.image_xscale) then - local wrench = obj_wrench:create(actor.x, actor.y - 4) + local wrench = obj_wrench:create(actor.x + 6 * actor.image_xscale, actor.y - 4) wrench.speed = wrench.speed * actor.image_xscale wrench.team = actor.team wrench.parent = actor wrench.damage = damage + wrench:actor_skin_skinnable_set_skin(actor) else local machinesHit = List.new() local endX, _ = move_point_contact_solid(actor.x, actor.y, 90 - 90 * actor.image_xscale, 700) actor:collision_line_list(actor.x, actor.y, endX, actor.y, gm.constants.oCustomObject, false, true, machinesHit, false) + actor:collision_line_list(actor.x, actor.y, endX, actor.y, gm.constants.oCustomObject_pNPC, false, true, machinesHit, false) for _, machineObj in ipairs(machines) do for _, instance in ipairs(machinesHit) do if machineObj.value == instance.__object_index then if instance.team == actor.team then - upgrade_machine(instance, 1, true) + upgrade_machine(instance, 1, WRENCH_THROW_DOWNGRADE_TIME) end end end end + local playersHit = List.new() + actor:collision_line_list(actor.x, actor.y, endX, actor.y, gm.constants.oP, false, true, playersHit, false) + for _, instance in ipairs(playersHit) do + if healable_survivors[instance.class] then + instance:heal(10) + gm.sound_play_at(sound_wrenchHit, 1, 0.9 + math.random() * 0.2, instance.x, instance.y) + particle_spark:create(instance.x, instance.y, math.random(2, 4), Particle.SYSTEM.middle) + end + end end end @@ -1284,7 +1413,7 @@ end) technicianSecondary.sprite = sprite_skills technicianSecondary.subimage = 1 technicianSecondary.cooldown = 3 * 60 -technicianSecondary.damage = 7 +technicianSecondary.damage = 4 technicianSecondary.require_key_press = true technicianSecondary.does_change_activity_state = true technicianSecondary.use_delay = 10 @@ -1300,7 +1429,7 @@ technicianSecondary_2.damage = 1.0 --This damage isn't used for anything, only t technicianSecondary_2.require_key_press = true technicianSecondary_2.does_change_activity_state = true technicianSecondary_2.hold_facing_direction = true -technicianSecondary_2.auto_restock = false --Makes stocks not regenerate by themselves\ +technicianSecondary_2.auto_restock = false --Makes stocks not regenerate by themselves technicianSecondary_2.use_delay = 10 technicianSecondary_2.required_interrupt_priority = State.ACTOR_STATE_INTERRUPT_PRIORITY.skill_interrupt_period @@ -1334,6 +1463,7 @@ state_technician_secondary:onStep(function(actor, data) mine_inst.team = actor.team mine_inst.parent = actor mine_inst.hspeed = 8 * actor.image_xscale + mine_inst:actor_skin_skinnable_set_skin(actor) end data.used = 1 end @@ -1371,6 +1501,7 @@ technicianUtility.damage = 1 technicianUtility.subimage = 3 technicianUtility.cooldown = 12 * 60 technicianUtility.is_utility = true +technicianUtility.require_key_press = true technicianUtility.override_strafe_direction = true technicianUtility.ignore_aim_direction = true @@ -1381,15 +1512,25 @@ technicianUtility:clear_callbacks() technicianUtility:onActivate(function(actor) if gm._mod_net_isHost() then local vendings, _ = Instance.find_all(obj_vending) - for _, vending in ipairs(vendings) do - if vending.parent.id == actor.id then - vending:destroy() + if #vendings >= actor:get_default_skill(Skill.SLOT.utility).max_stock then + local oldestID = math.huge + local oldestInst = nil + for _, vending in ipairs(vendings) do + print(vending.id) + if vending.parent.id == actor.id and vending.id < oldestID then + oldestID = vending.id + oldestInst = vending + end + end + if oldestInst then + oldestInst:destroy() end end local vending_inst = obj_vending:create(actor.x, actor.y - 4) vending_inst.parent = actor vending_inst.team = actor.team vending_inst.image_xscale = actor.image_xscale + vending_inst:actor_skin_skinnable_set_skin(actor) -- move_contact_solid(vending_inst, 90) end @@ -1466,7 +1607,7 @@ end) technicianSpecial.sprite = sprite_skills technicianSpecial.subimage = 4 -technicianSpecial.cooldown = 7 * 60 +technicianSpecial.cooldown = 9 * 60 technicianSpecial.damage = 1.8 -- technicianSpecial.damage2 = 0.7 technicianSpecial.require_key_press = true @@ -1504,11 +1645,7 @@ stateTechnicianSpecial:onEnter(function(actor, data) end) stateTechnicianSpecial:onStep(function(actor, data) actor:skill_util_fix_hspeed() - local animation = sprite_shoot4 - if data.scepter > 0 then - animation = sprite_shoot5 - end - actor:actor_animation_set(animation, 0.2, true) + actor:actor_animation_set(data.scepter > 0 and sprite_shoot5 or sprite_shoot4, 0.2, true) if not data.created and actor.image_index >= 6 and gm._mod_net_isHost() then local turrets, _ = Instance.find_all(obj_turret) for _, turret in ipairs(turrets) do @@ -1517,14 +1654,15 @@ stateTechnicianSpecial:onStep(function(actor, data) end end local turret_inst = obj_turret:create(actor.x + 18 * actor.image_xscale, actor.y - 8) - local turret_data = turret_inst:get_data() turret_inst.parent = actor turret_inst.team = actor.team turret_inst.image_xscale = actor.image_xscale + --GM.inventory_items_copy(actor, turret_inst, Item.LOOT_TAG.item_blacklist_engi_turrets) + --GM.actor_queue_dirty(turret_inst) if data.scepter > 0 then - turret_data.upgrade_progress = 3 + turret_inst.upgrade_progress = 3 end data.created = 1 end actor:skill_util_exit_state_on_anim_end() -end) +end) \ No newline at end of file From d4d3b38666493d7e52339cd59481eb1754df5164 Mon Sep 17 00:00:00 2001 From: AGAININGTRYING211 Date: Sat, 31 May 2025 11:43:27 -0700 Subject: [PATCH 2/8] Troubleshooting even more!!!!! More technician balance and also logs Both primaries damage 150% -> 180% Forced Shutdown damage 400% -> 500% 24/7 Energy base damage 100% -> 200%, damage now scales exponentially with fall height 24/7 Energy cooldown 12 -> 7 seconds Backup Firewall 2.0 cooldown is now 9 seconds as it should be Changed cape offsets Fixed Shattered Mirror interacting incorrectly with some skills and vending machine from clipping through the map at insanely high velocities --- Language/english.json | 14 ++- Survivors/technician.lua | 230 ++++++++++++++++++++++++++++----------- 2 files changed, 173 insertions(+), 71 deletions(-) diff --git a/Language/english.json b/Language/english.json index 52d38408..6b250e74 100644 --- a/Language/english.json +++ b/Language/english.json @@ -19,7 +19,7 @@ "nameUpper" : "NEMESIS COMMANDO", "description" : "The Nemesis Commando is a flexible character with the firepower to deal with any situation. Wound enemies using Blade of Cessation to setup for devastating damage from your other abilities. Use Tactical Dive to weave in and out of melee range, and turn even the most dangerous situations in your favour.", "endQuote": "..and so he left, carrying new sense of humanity within.", - "story": "

MY ORIGINAL OC DO NOT STEAL" + "story": "UNREGISTERED FIELD DATA LOG: DATA LAST MODIFIED ON [##090??!?] \n[ERROR 0x00000ce: Data Package Corrupted, viewing a restore point.] \n\n

    [Entry 1] - Patrol group just picked up a wounded straggler a few miles off from camp. Word going around is he “showed up out of nowhere,” (as if I'm buying that), what with nothing in the surrounding area to trace his origin. Regardless of the validity of their claims, a survivor's a survivor. As I'm writing this, we're carrying him back. He's certainly not making it easy on us, though, considering the sheer heft of his gear- he's lugging some unorthodox modifications to a standard Commando armor rig. It looks to be- or maybe was originally- the initial issue of the Mk. 1 model (even though I'm pretty sure they stopped producing those years ago?). \n\n
      [Entry 2] - Update- buddy's got some scarily heavy artillery on hand for a Commando unit- a rocket launcher still warm to the touch and some almost certainly alien grenades- I sure as hell haven't seen anything like them. He’s out cold right now, and from what we can tell looking through his helmet he's well-battered. His left arm seems especially stiff- his hand's clamped shut around the handle of his vibroblade. Some of us tried to get a good look at it just now, but it's almost like his fist is fused to the damn thing. Amongst other things on his person, it's thoroughly coated in this crusted black.. substance. We don't know if it was the result of a fight between a few more survivors, or evidence for some kind of self defe??!0049### \n[End of legible data.] \n\n
        [Entry 2a] - I dont know how much time I have left as im typing this it woke up and camp is DESTROYED people wont stop bleeding we dont even know if it was human with what it can do noone knows what to do now it went straight for Adrian \nwe dont even know what set it off??? what did WE do to deserve all of this??? why did that THING attack U!??!?##$0959090302???! \n[End of legible data.] \n\n

        Th?e ga??dflies s?warm t?his nob?le b?eas?t as i?t gra?zes. \n\nYou?r plag??ue upo?n it?s sur?fa?ce wi?ll be un?do?ne.. \n\nBy t??he?se toi?lin??g han?d?s.", }, "nemesisMercenary" : { "name" : "Nemesis Mercenary", @@ -32,7 +32,11 @@ "name": "Technician", "nameUpper": "TECHNICIAN", "description": "The Technician is excellent at setting up and maintaining zones of enemy denial. Forced Shutdown can forcibly lock down an area when upgraded. Upgrading gadgets improves their effectiveness, but be careful when doing so in dangerous situations!", - "endQuote": "..and so he left, by switching the ship off and on again." + "endQuote": "..and so he left, by switching the ship off and on again.", + "story": "

          Passenger Details:\n[Employee Class]\n\n
            Employee Details:\nEmployee contracted to work on-site for the full duration of the scheduled voyage of the UES Contact Light, to perform maintenance on machinery should technical issues arise aboard the ship. Employee qualified with 6 years of hands-on experience in software and hardware engineering.\n\n
              Luggage & Equipment:\nEmployee boarded with a Durarend welding spacesuit rated with strong vacuum resistance, and additionally leather and cloth attire made for planetary wear. Employee notified that clothes may tear in the case of a vacuum event. Security flagged the sizable wrench they held for appearing impractical for use while potentially dangerous. Upon questioning, the employee indicated that it was \"custom-built ... for the toughest jobs.\" Following procedure, the wrench was moved to an automated lockbox in loading bay 1a. Remaining inspection of carry-ons revealed several standard-issue wrenches, 3 color-coded USBs, a 2047 model GeForm Laptop, tool boxes, and a welding tool. USBs were inspected on company-owned QPuting Disposable Computer installed with ReoVirus Detector v1.6.2. No traces of malware were detected and stored files are UPG format containing blueprints of various devices. Employee permitted to pass with no further difficulties.\n\n[SECURITY RECALL]\n
                [Event T1] Employee forcibly removed from cabin during liftoff preparations when refusing to leave after conversating with ship pilot for multiple hours.\n
                  [Event T2] Employee observed stealing sodas from a vending machine.\n
                    [Event T3] Automated lockdown originating in loading bay 4a resolved by employee.\n
                      [Event T4] Escape pod B-08 status shifted from ERROR to ALERT after the employee was requested by ship personnel to troubleshoot. Security personnel instructed to investigate.\n
                        [Event T1a] Employee additionally reported to have tampered with cabin control panel to make it \"easier to cruise.\" Scheduled launch delayed and employee instructed to revert any modifications made.", + "id" : "Travel ID: 54E4F4C434F59474E454", + "departure" : "Departure:\nUES Shipping Dock 5,\nRedview,\nMars", + "arrival" : "Destination:\nUES Shipping Dock 0,\nRedview,\nMars" }, "swapNemesis": { "name": "Nemesis Survivors", @@ -128,11 +132,11 @@ }, "technicianZ": { "name": "Fine Tune", - "description": "Strike forward with a wrench for 150% damage.\nHitting gadgets 3 times temporarily upgrades them for 30 seconds." + "description": "Strike forward with a wrench for 180% damage.\nHitting gadgets 3 times temporarily upgrades them for 30 seconds." }, "technicianZ2": { "name": "Troubleshoot", - "description": "Throw a wrench forward, piercing up to 3 enemies for 150% damage.\nHitting gadgets 3 times temporarily upgrades them for 20 seconds." + "description": "Throw a wrench forward, piercing up to 3 enemies for 180% damage.\nHitting gadgets 3 times temporarily upgrades them for 20 seconds." }, "technicianX": { "name": "Forced Shutdown", @@ -140,7 +144,7 @@ }, "technicianX2": { "name": "The Red Button", - "description": "Detonate the dropped bomb for 400% damage.\nStuns enemies when upgraded." + "description": "Detonate the dropped bomb for 500% damage.\nStuns enemies when upgraded." }, "technicianC": { "name": "24/7 Energy", diff --git a/Survivors/technician.lua b/Survivors/technician.lua index 18869b6c..06e7c11e 100644 --- a/Survivors/technician.lua +++ b/Survivors/technician.lua @@ -15,6 +15,7 @@ local sprite_portrait_small = Resources.sprite_load(NAMESPACE, "TechnicianPortr local sprite_skills = Resources.sprite_load(NAMESPACE, "TechnicianSkills", path.combine(SPRITE_PATH, "skills.png"), 7) local sprite_credits = Resources.sprite_load(NAMESPACE, "TechnicianCredits", path.combine(SPRITE_PATH, "credits.png"), 1, 7, 12) local sprite_palette = Resources.sprite_load(NAMESPACE, "TechnicianPalette", path.combine(SPRITE_PATH, "palette.png")) +local sprite_log = Resources.sprite_load(NAMESPACE, "TechnicianLog", path.combine(SPRITE_PATH, "log.png")) local sprite_idle = Resources.sprite_load(NAMESPACE, "TechnicianIdle", path.combine(SPRITE_PATH, "idle.png"), 1, 9, 13) local sprite_idle_half = Resources.sprite_load(NAMESPACE, "TechnicianIdleHalf", path.combine(SPRITE_PATH, "idleHalf.png"), 1, 9, 13) @@ -120,15 +121,14 @@ local WRENCH_BLAST_H = get_tiles(1.2) local WRENCH_DOWNGRADE_TIME = 60 * 30 local WRENCH_THROW_DOWNGRADE_TIME = 60 * 20 -local MACHINE_VENDING_BLAST_H = get_tiles(1) local MACHINE_VENDING_GRAV = 0.2 local MACHINE_VENDING_DAMAGE_THRESHOLD = 6 local MACHINE_VENDING_MOVESPEED = 0.56 local MACHINE_VENDING_ATTACKSPEED = 0.2 local MACHINE_VENDING_ATTACKSPEED2 = 0.4 local MACHINE_VENDING_CRIT = 20 -local MACHINE_VENDING_BLAST_W = get_tiles(2.5) -local MACHINE_VENDING_BLAST_H = get_tiles(3) +local MACHINE_VENDING_BLAST_W = get_tiles(4) +local MACHINE_VENDING_BLAST_H = get_tiles(2) local MACHINE_MINE_GRAV = 0.2 local MACHINE_MINE_PULL_RADIUS = get_tiles(4) @@ -166,7 +166,7 @@ technician:set_animations({ drone_shoot = sprite_drone_shoot, }) -technician:set_cape_offset(0, -8, 0, -12) +technician:set_cape_offset(-4, -7, -3, -9) technician:set_primary_color(Color.from_rgb(104, 191, 208)) technician.sprite_loadout = sprite_loadout @@ -202,6 +202,17 @@ Resources.sprite_load(NAMESPACE, "TechnicianPortraitSmall_PAL3", path.combine(SP Resources.sprite_load(NAMESPACE, "TechnicianPortrait_PROV", path.combine(SPRITE_PATH, "portraitPROV.png"), 3), Resources.sprite_load(NAMESPACE, "TechnicianPortraitSmall_PROV", path.combine(SPRITE_PATH, "portraitSmallPROV.png")))]] +local technicianLog = Survivor_Log.new(technician, sprite_log) + +local technicianPrimary = technician:get_primary() +local technicianSecondary = technician:get_secondary() +local technicianUtility = technician:get_utility() +local technicianSpecial = technician:get_special() +local technicianSecondary_2 = Skill.new(NAMESPACE, "technicianX2") + +local technicianPrimaryAlt = Skill.new(NAMESPACE, "technicianZ2") +local technicianUtilityAlt = Skill.new(NAMESPACE, "technicianC2") + technician:clear_callbacks() technician:onInit(function(actor) -- setup half-sprite nonsense @@ -221,6 +232,10 @@ technician:onInit(function(actor) actor.sprite_jump_half = jump_half actor.sprite_jump_peak_half = jump_peak_half actor.sprite_fall_half = fall_half + + actor:add_callback("onStageStart", "SSOnStageStartTech", function(actor) + actor:remove_skill_override(Skill.SLOT.secondary, technicianSecondary_2, 1) + end) actor:survivor_util_init_half_sprites() end) @@ -239,14 +254,6 @@ local handle_strafing_yoffset = function(actor) end end -local technicianPrimary = technician:get_primary() -local technicianSecondary = technician:get_secondary() -local technicianUtility = technician:get_utility() -local technicianSpecial = technician:get_special() - -local technicianPrimaryAlt = Skill.new(NAMESPACE, "technicianZ2") -local technicianUtilityAlt = Skill.new(NAMESPACE, "technicianC2") - local buff_vending = Buff.new(NAMESPACE, "hydrated") local buff_vending_2 = Buff.new(NAMESPACE, "really_hydrated") local buff_exposed = Buff.new(NAMESPACE, "exposed") @@ -331,6 +338,13 @@ turret_shoot_packet_host:onReceived(function(message, player) buffer:send_exclude(owner) end) +local turret_missile_state_packet = Packet.new() +turret_missile_state_packet:onReceived(function(message, player) + local inst = message:read_instance() + local missileState = message:read_byte() - 1 + inst.switchMissileState = missileState +end) + local shoot_missiledis_offset_map = { {-8, 2}, {-4, 1}, @@ -378,7 +392,7 @@ obj_turret:onStep(function(inst) -- print("TRY AGAIN!") inst.scepter = inst.parent:item_stack_count(item_scepter) if not inst.init then - local xx, _ = move_point_contact_solid(inst.x, inst.y, 90 - 90 * inst.image_xscale, 600) + local xx, _ = move_point_contact_solid(inst.x, inst.y, 90 - 90 * inst.image_xscale, 800) inst.range = math.abs(xx - inst.x) --print(data.range) inst.init = 1 @@ -559,15 +573,38 @@ obj_turret:onStep(function(inst) inst.secondarycooldown = inst.basesecondarycooldown inst.secondarystocks = inst.basesecondarystocks inst.switchMissileState = -1 + + if not Net.is_single() then + local buffer = turret_missile_state_packet:message_begin() + buffer:write_instance(inst) + buffer:write_byte(inst.switchMissileState + 1) + buffer:send_to_all() + end end end elseif inst.secondarycooldown <= 4 * gm.sprite_get_number(sprite_turretc_mis2) and not inst.switchMissileState then inst.missileDis.image_index = 0 inst.switchMissileState = 1 + + if not Net.is_single() then + local buffer = turret_missile_state_packet:message_begin() + buffer:write_instance(inst) + buffer:write_byte(inst.switchMissileState + 1) + buffer:send_to_all() + end end end else - inst.switchMissileState = -1 + if inst.switchMissileState ~= -1 then + inst.switchMissileState = -1 + + if not Net.is_single() then + local buffer = turret_missile_state_packet:message_begin() + buffer:write_instance(inst) + buffer:write_byte(inst.switchMissileState + 1) + buffer:send_to_all() + end + end if inst.secondarycooldown <= 0 then inst.secondarycooldown = inst.basesecondarycooldown inst.secondarystocks = inst.basesecondarystocks @@ -595,6 +632,7 @@ obj_turret:onDestroy(function(inst) ef_sparks.image_yscale = 1 gm.sound_play_at(sound_turretDeath, 1, 1, inst.x, inst.y) + inst:screen_shake(2) if gm._mod_net_isHost() then inst:instance_destroy_sync() @@ -696,26 +734,56 @@ obj_vending:onStep(function(inst) if inst.parent and Instance.exists(inst.parent) then -- print("TRY AGAIN!") -- print(data.hits_taken.. "hits taken") - if is_colliding_stage(inst, inst.x, inst.y + inst.vspeed + inst.gravity) then - move_contact_solid(inst, 90, 32) - if inst.vspeed > MACHINE_VENDING_DAMAGE_THRESHOLD then - if inst.parent:is_authority() then - inst.parent:fire_explosion(inst.x, inst.y - MACHINE_VENDING_BLAST_H / 2, MACHINE_VENDING_BLAST_W, MACHINE_VENDING_BLAST_H, inst.parent:skill_get_damage(technicianUtility) * (inst.vspeed / MACHINE_VENDING_DAMAGE_THRESHOLD) * 2 - inst.parent:skill_get_damage(technicianUtility)) + local height = inst.bbox_bottom - inst.bbox_top + for i = 1, (math.floor((inst.vspeed + inst.gravity) / height) + 1) do + if is_colliding_stage(inst, inst.x, inst.y + inst.vspeed + inst.gravity - height * (i - 1)) then + move_contact_solid(inst, 90, 32) + if inst.vspeed > MACHINE_VENDING_DAMAGE_THRESHOLD then + if inst.parent:is_authority() then + for i = 0, inst.parent:buff_stack_count(buff_mirror) do + local attack_info = inst.parent:fire_explosion(inst.x, inst.y - MACHINE_VENDING_BLAST_H / 2, MACHINE_VENDING_BLAST_W, MACHINE_VENDING_BLAST_H, inst.parent:skill_get_damage(technicianUtility) * (inst.vspeed / MACHINE_VENDING_DAMAGE_THRESHOLD)^1.5).attack_info + attack_info.climb = i * 8 * 1.35 + end + end + + local ef_sparks = object_sparks:create(inst.x, inst.y) + ef_sparks.sprite_index = mine_explosion + ef_sparks.image_speed = 0.25 + ef_sparks.image_yscale = 1 end + if inst.vspeed > 0 then + inst:screen_shake(math.floor(inst.vspeed / MACHINE_VENDING_DAMAGE_THRESHOLD * 2) + 3) + gm.sound_play_at(soundImpact, math.min(0.7 + 0.4 * (inst.vspeed / MACHINE_VENDING_DAMAGE_THRESHOLD), 1.5), math.max(1.4 - 0.4 * (inst.vspeed / MACHINE_VENDING_DAMAGE_THRESHOLD), 0.6), inst.x, inst.y) + + inst.xo = inst.x + inst.shakeTimer = math.floor(inst.vspeed / MACHINE_VENDING_DAMAGE_THRESHOLD * 4) + 6 + end + + inst.vspeed = 0 + inst.gravity = 0 + end - local ef_sparks = object_sparks:create(inst.x, inst.y) - ef_sparks.sprite_index = mine_explosion - ef_sparks.image_speed = 0.25 - ef_sparks.image_yscale = 1 + if inst.vspeed > MACHINE_VENDING_DAMAGE_THRESHOLD and Global._current_frame % math.max(4 - math.floor(inst.vspeed / MACHINE_VENDING_DAMAGE_THRESHOLD), 1) == 0 then + local trail = GM.instance_create(inst.x, inst.y - height * (i - 1), gm.constants.oEfTrail) + trail.sprite_index = inst.sprite_index + trail.image_index = inst.image_index + trail.image_blend = gm.merge_colour(inst.image_blend, Color.BLACK, 0.25) + trail.image_xscale = inst.image_xscale + trail.image_yscale = inst.image_yscale + trail.image_alpha = trail.image_alpha * (0.2 * (inst.vspeed / MACHINE_VENDING_DAMAGE_THRESHOLD)) + trail.depth = inst.depth + 1 + trail:actor_skin_skinnable_set_skin(inst.parent) end - if inst.vspeed > 0 then - inst:screen_shake(math.floor(inst.vspeed / MACHINE_VENDING_DAMAGE_THRESHOLD * 2) + 3) - gm.sound_play_at(soundImpact, math.min(0.7 + 0.4 * (inst.vspeed / MACHINE_VENDING_DAMAGE_THRESHOLD), 1.5), math.max(1.4 - 0.4 * (inst.vspeed / MACHINE_VENDING_DAMAGE_THRESHOLD), 0.6), inst.x, inst.y) + end + + if (inst.shakeTimer or 0) > 0 then + inst.x = inst.xo + math.random(-math.floor(inst.shakeTimer * 0.75), math.floor(inst.shakeTimer * 0.75)) + inst.shakeTimer = inst.shakeTimer - 1 + if inst.shakeTimer <= 0 then + inst.x = inst.xo end - - inst.vspeed = 0 - inst.gravity = 0 end + local doResync = false machine_update_temp(inst) if inst.upgrade_progress < 3 and inst.upgraded then @@ -949,6 +1017,7 @@ obj_mine:onDestroy(function(inst) for i = 0, inst.parent:buff_stack_count(buff_mirror) do local attack_info = inst.parent:fire_explosion(inst.x, inst.y, get_tiles(6), get_tiles(6), inst.parent:skill_get_damage(technicianSecondary)).attack_info attack_info.knockback = 6 + attack_info.climb = i * 8 * 1.35 if inst.upgraded then attack_info:set_stun(1.2) end @@ -1079,6 +1148,7 @@ local healable_survivors = { [Survivor.find("ror-chef").value] = true, [Survivor.find("ror-hand").value] = true, } +local healable_objects = { Object.find("ror", "EngiTurret"), Object.find("ror", "EngiTurretB") } Callback.add(Callback.TYPE.onAttackHit, "SSOnHitTechnician", function(hit_info) --Helper.log_struct(hit_info) @@ -1134,7 +1204,7 @@ technicianPrimary.sprite = sprite_skills technicianPrimary.subimage = 0 technicianPrimary.cooldown = 5 -technicianPrimary.damage = 1.5 +technicianPrimary.damage = 1.8 technicianPrimary.require_key_press = false technicianPrimary.is_primary = true technicianPrimary.does_change_activity_state = true @@ -1169,7 +1239,7 @@ stateTechnicianPrimary:onStep(function(actor, data) if data.fired == 0 and actor.image_index2 >= 2 then data.fired = 1 - actor:sound_play(sound_shoot1, 2.3, 0.9 + math.random() * 0.2) + actor:sound_play(sound_shoot1, 0.3, 0.9 + math.random() * 0.2) local damage = actor:skill_get_damage(technicianPrimary) local dir = actor:skill_util_facing_direction() @@ -1201,10 +1271,13 @@ stateTechnicianPrimary:onStep(function(actor, data) end end end - local playersHit = List.new() - actor:collision_rectangle_list(x, y, x2, y2, gm.constants.oP, false, true, playersHit, false) - for _, instance in ipairs(playersHit) do - if healable_survivors[instance.class] then + local healablesHit = List.new() + actor:collision_rectangle_list(x, y, x2, y2, gm.constants.oP, false, true, healablesHit, false) + for _, object in ipairs(healable_objects) do + actor:collision_rectangle_list(x, y, x2, y2, object, false, true, healablesHit, false) + end + for _, instance in ipairs(healablesHit) do + if instance.object_index ~= gm.constants.oP or healable_survivors[instance.class] then instance:heal(10) gm.sound_play_at(sound_wrenchHit, 1, 0.9 + math.random() * 0.2, instance.x, instance.y) particle_spark:create(instance.x, instance.y, math.random(2, 4), Particle.SYSTEM.middle) @@ -1225,10 +1298,13 @@ stateTechnicianPrimary:onStep(function(actor, data) end end end - local playersHit = List.new() - actor:collision_line_list(actor.x, actor.y, endX, actor.y, gm.constants.oP, false, true, playersHit, false) - for _, instance in ipairs(playersHit) do - if healable_survivors[instance.class] then + local healablesHit = List.new() + actor:collision_line_list(actor.x, actor.y, endX, actor.y, gm.constants.oP, false, true, healablesHit, false) + for _, object in ipairs(healable_objects) do + actor:collision_line_list(actor.x, actor.y, endX, actor.y, object, false, true, healablesHit, false) + end + for _, instance in ipairs(healablesHit) do + if instance.object_index ~= gm.constants.oP or healable_survivors[instance.class] then instance:heal(10) gm.sound_play_at(sound_wrenchHit, 1, 0.9 + math.random() * 0.2, instance.x, instance.y) particle_spark:create(instance.x, instance.y, math.random(2, 4), Particle.SYSTEM.middle) @@ -1269,7 +1345,19 @@ obj_wrench:onCreate(function(inst) end) obj_wrench:onStep(function(inst) local data = inst:get_data() - if inst.parent and not inst:is_colliding(gm.constants.pBlock) and inst.life > 0 and inst.hits > 0 then + if inst.life <= 0 or not (inst.parent and Instance.exists(inst.parent)) then + inst.image_alpha = inst.image_alpha - 0.04 + inst.image_angle = inst.image_angle - inst.speed * 3 + if inst.image_alpha <= 0 then + inst:destroy() + end + elseif inst.hits <= 0 then + inst:destroy() + elseif inst:is_colliding(gm.constants.pBlock) then + particle_spark:create(inst.x, inst.y, math.random(2, 3), Particle.SYSTEM.middle) + gm.sound_play_at(sound_wrenchHit, 1, 0.8 + math.random() * 0.3, inst.x, inst.y) + inst:destroy() + else inst.life = inst.life - 1 inst.image_angle = inst.image_angle - inst.speed * 3 for _, actor in ipairs(inst:get_collisions(gm.constants.pActorCollisionBase)) do @@ -1301,33 +1389,31 @@ obj_wrench:onStep(function(inst) end end end - local playersHit = List.new() - inst.parent:collision_rectangle_list(inst.x - 9, inst.y - 9, inst.x + 9, inst.y + 9, gm.constants.oP, false, true, playersHit, false) - for _, instance in ipairs(playersHit) do - if healable_survivors[instance.class] then + local healablesHit = List.new() + inst.parent:collision_rectangle_list(inst.x - 9, inst.y - 9, inst.x + 9, inst.y + 9, gm.constants.oP, false, true, healablesHit, false) + for _, object in ipairs(healable_objects) do + actor:collision_rectangle_list(inst.x - 9, inst.y - 9, inst.x + 9, inst.y + 9, object, false, true, healablesHit, false) + end + for _, instance in ipairs(healablesHit) do + if (instance.object_index ~= gm.constants.oP or healable_survivors[instance.class]) and not data.hit[instance.id] then instance:heal(10) - gm.sound_play_at(sound_wrenchHit, 1, 0.9 + math.random() * 0.2, instance.x, instance.y) particle_spark:create(instance.x, instance.y, math.random(2, 4), Particle.SYSTEM.middle) + gm.sound_play_at(sound_wrenchHit, 1, 0.9 + math.random() * 0.2, instance.x, instance.y) + data.hit[instance.id] = true end end - else - gm.sound_play_at(sound_wrenchHit, 1, 0.8 + math.random() * 0.3, inst.x, inst.y) - inst:destroy() end end) obj_wrench:onDraw(function(inst) inst:actor_skin_skinnable_draw_self() end) -obj_wrench:onDestroy(function(inst) - particle_spark:create(inst.x, inst.y, math.random(2, 3), Particle.SYSTEM.middle) -end) technicianPrimaryAlt.sprite = sprite_skills technicianPrimaryAlt.subimage = 6 technician:add_primary(technicianPrimaryAlt) technicianPrimaryAlt.cooldown = 5 -technicianPrimaryAlt.damage = 1.5 +technicianPrimaryAlt.damage = 1.8 technicianPrimaryAlt.require_key_press = false technicianPrimaryAlt.is_primary = true technicianPrimaryAlt.does_change_activity_state = true @@ -1389,10 +1475,13 @@ stateTechnicianPrimaryAlt:onStep(function(actor, data) end end end - local playersHit = List.new() - actor:collision_line_list(actor.x, actor.y, endX, actor.y, gm.constants.oP, false, true, playersHit, false) - for _, instance in ipairs(playersHit) do - if healable_survivors[instance.class] then + local healablesHit = List.new() + actor:collision_line_list(actor.x, actor.y, endX, actor.y, gm.constants.oP, false, true, healablesHit, false) + for _, object in ipairs(healable_objects) do + actor:collision_line_list(actor.x, actor.y, endX, actor.y, object, false, true, healablesHit, false) + end + for _, instance in ipairs(healablesHit) do + if instance.object_index ~= gm.constants.oP or healable_survivors[instance.class] then instance:heal(10) gm.sound_play_at(sound_wrenchHit, 1, 0.9 + math.random() * 0.2, instance.x, instance.y) particle_spark:create(instance.x, instance.y, math.random(2, 4), Particle.SYSTEM.middle) @@ -1413,14 +1502,13 @@ end) technicianSecondary.sprite = sprite_skills technicianSecondary.subimage = 1 technicianSecondary.cooldown = 3 * 60 -technicianSecondary.damage = 4 +technicianSecondary.damage = 5 technicianSecondary.require_key_press = true technicianSecondary.does_change_activity_state = true technicianSecondary.use_delay = 10 technicianSecondary.required_interrupt_priority = State.ACTOR_STATE_INTERRUPT_PRIORITY.skill_interrupt_period -- big red button -local technicianSecondary_2 = Skill.new(NAMESPACE, "technicianX2") technicianSecondary_2.sprite = sprite_skills technicianSecondary_2.subimage = 2 @@ -1497,9 +1585,9 @@ end) -- Vending Machine technicianUtility.sprite = sprite_skills -technicianUtility.damage = 1 +technicianUtility.damage = 2 technicianUtility.subimage = 3 -technicianUtility.cooldown = 12 * 60 +technicianUtility.cooldown = 7 * 60 technicianUtility.is_utility = true technicianUtility.require_key_press = true technicianUtility.override_strafe_direction = true @@ -1516,7 +1604,7 @@ technicianUtility:onActivate(function(actor) local oldestID = math.huge local oldestInst = nil for _, vending in ipairs(vendings) do - print(vending.id) + --print(vending.id) if vending.parent.id == actor.id and vending.id < oldestID then oldestID = vending.id oldestInst = vending @@ -1526,7 +1614,7 @@ technicianUtility:onActivate(function(actor) oldestInst:destroy() end end - local vending_inst = obj_vending:create(actor.x, actor.y - 4) + local vending_inst = obj_vending:create(actor.x, actor.y + 4) vending_inst.parent = actor vending_inst.team = actor.team vending_inst.image_xscale = actor.image_xscale @@ -1611,6 +1699,7 @@ technicianSpecial.cooldown = 9 * 60 technicianSpecial.damage = 1.8 -- technicianSpecial.damage2 = 0.7 technicianSpecial.require_key_press = true +technicianSpecial.does_change_activity_state = true technicianSpecial.required_interrupt_priority = State.ACTOR_STATE_INTERRUPT_PRIORITY.skill -- Backup Firewall 2.0 @@ -1619,9 +1708,10 @@ technicianSpecial:set_skill_upgrade(technicianSpecialScepter) technicianSpecialScepter.sprite = sprite_skills technicianSpecialScepter.subimage = 5 -technicianSpecialScepter.cooldown = 7 * 60 +technicianSpecialScepter.cooldown = 9 * 60 technicianSpecialScepter.damage = 15 technicianSpecialScepter.require_key_press = true +technicianSpecialScepter.does_change_activity_state = true technicianSpecialScepter.required_interrupt_priority = State.ACTOR_STATE_INTERRUPT_PRIORITY.skill local stateTechnicianSpecial = State.new(NAMESPACE, "technicianSpecial") @@ -1648,9 +1738,17 @@ stateTechnicianSpecial:onStep(function(actor, data) actor:actor_animation_set(data.scepter > 0 and sprite_shoot5 or sprite_shoot4, 0.2, true) if not data.created and actor.image_index >= 6 and gm._mod_net_isHost() then local turrets, _ = Instance.find_all(obj_turret) - for _, turret in ipairs(turrets) do - if turret.parent.id == actor.id then - turret:destroy() + if #turrets >= actor:get_default_skill(Skill.SLOT.special).max_stock then + local oldestID = math.huge + local oldestInst = nil + for _, turret in ipairs(turrets) do + if turret.parent.id == actor.id and turret.id < oldestID then + oldestID = turret.id + oldestInst = turret + end + end + if oldestInst then + oldestInst:destroy() end end local turret_inst = obj_turret:create(actor.x + 18 * actor.image_xscale, actor.y - 8) From 62aff3703e8c0dc06d070565f1d892ba9aa30f33 Mon Sep 17 00:00:00 2001 From: AGAININGTRYING211 Date: Sat, 31 May 2025 15:19:51 -0700 Subject: [PATCH 3/8] Troubleshooted his css Added select sound, updated Fine Tune sound Removed a bunch of junk code Updated Nemmando log --- Language/english.json | 10 +- Misc/sharedObjects.lua | 48 ------- Misc/votvlibrary.lua | 48 +++---- Sounds/Survivors/Technician/select.ogg | Bin 0 -> 40816 bytes Sounds/Survivors/Technician/shoot1.ogg | Bin 14012 -> 14011 bytes Survivors/technician.lua | 174 +++++++++---------------- 6 files changed, 82 insertions(+), 198 deletions(-) create mode 100644 Sounds/Survivors/Technician/select.ogg diff --git a/Language/english.json b/Language/english.json index 6b250e74..87406f0c 100644 --- a/Language/english.json +++ b/Language/english.json @@ -19,7 +19,7 @@ "nameUpper" : "NEMESIS COMMANDO", "description" : "The Nemesis Commando is a flexible character with the firepower to deal with any situation. Wound enemies using Blade of Cessation to setup for devastating damage from your other abilities. Use Tactical Dive to weave in and out of melee range, and turn even the most dangerous situations in your favour.", "endQuote": "..and so he left, carrying new sense of humanity within.", - "story": "UNREGISTERED FIELD DATA LOG: DATA LAST MODIFIED ON [##090??!?] \n[ERROR 0x00000ce: Data Package Corrupted, viewing a restore point.] \n\n
                          [Entry 1] - Patrol group just picked up a wounded straggler a few miles off from camp. Word going around is he “showed up out of nowhere,” (as if I'm buying that), what with nothing in the surrounding area to trace his origin. Regardless of the validity of their claims, a survivor's a survivor. As I'm writing this, we're carrying him back. He's certainly not making it easy on us, though, considering the sheer heft of his gear- he's lugging some unorthodox modifications to a standard Commando armor rig. It looks to be- or maybe was originally- the initial issue of the Mk. 1 model (even though I'm pretty sure they stopped producing those years ago?). \n\n
                            [Entry 2] - Update- buddy's got some scarily heavy artillery on hand for a Commando unit- a rocket launcher still warm to the touch and some almost certainly alien grenades- I sure as hell haven't seen anything like them. He’s out cold right now, and from what we can tell looking through his helmet he's well-battered. His left arm seems especially stiff- his hand's clamped shut around the handle of his vibroblade. Some of us tried to get a good look at it just now, but it's almost like his fist is fused to the damn thing. Amongst other things on his person, it's thoroughly coated in this crusted black.. substance. We don't know if it was the result of a fight between a few more survivors, or evidence for some kind of self defe??!0049### \n[End of legible data.] \n\n
                              [Entry 2a] - I dont know how much time I have left as im typing this it woke up and camp is DESTROYED people wont stop bleeding we dont even know if it was human with what it can do noone knows what to do now it went straight for Adrian \nwe dont even know what set it off??? what did WE do to deserve all of this??? why did that THING attack U!??!?##$0959090302???! \n[End of legible data.] \n\n

                              Th?e ga??dflies s?warm t?his nob?le b?eas?t as i?t gra?zes. \n\nYou?r plag??ue upo?n it?s sur?fa?ce wi?ll be un?do?ne.. \n\nBy t??he?se toi?lin??g han?d?s.", + "story": "UNREGISTERED FIELD DATA LOG: DATA LAST MODIFIED ON [##090??!?] \n[ERROR 0x00000ce: Data Package Corrupted, viewing a restore point.] \n\n

                                [Entry 1] - Patrol group just picked up a wounded straggler a few miles off from camp. Word going around is he “showed up out of nowhere,” (as if I'm buying that), what with nothing in the surrounding area to trace his origin. Regardless of the validity of their claims, a survivor's a survivor. As I'm writing this, we're carrying him back. He's certainly not making it easy on us, though, considering the sheer heft of his gear- he's lugging some unorthodox modifications to a standard Commando armor rig. It looks to be- or maybe was originally- the initial issue of the Mk. 1 model (even though I'm pretty sure they stopped producing those years ago?). \n\n
                                  [Entry 2] - Update- buddy's got some scarily heavy artillery on hand for a Commando unit- a rocket launcher still warm to the touch and some almost certainly alien grenades- I sure as hell haven't seen anything like them. He’s out cold right now, and from what we can tell looking through his helmet he's well-battered. His left arm seems especially stiff- his hand's clamped shut around the handle of his vibroblade. Some of us tried to get a good look at it just now, but it's almost like his fist is fused to the damn thing. Amongst other things on his person, it's thoroughly coated in this crusted black.. substance. We don't know if it was the result of a fight between a few more survivors, or evidence for some kind of self defe??!0049### \n[End of legible data.] \n\n
                                    [Entry 2a] - I dont know how much time I have left as im typing this it woke up and camp is DESTROYED people wont stop bleeding we dont even know if it was human with what it can do noone knows what to do now it went straight for Adrian \nwe dont even know what set it off??? what did WE do to deserve all of this??? why did that THING attack U!??!?##$0959090302???! \n[End of legible data.] \n\n

                                    Th?e ga?dflies swarm thi?s nob?le beas?t as it gra?zes.\n\nYour plag??ue upon it?s surfa?ce wi?ll be undo?ne by the?se toiling hand?s.", }, "nemesisMercenary" : { "name" : "Nemesis Mercenary", @@ -142,15 +142,19 @@ "name": "Forced Shutdown", "description": "Toss out a bomb dealing 400% damage on reactivation.\nStuns and passively pulls in enemies when upgraded." }, - "technicianX2": { + "technicianXD": { "name": "The Red Button", "description": "Detonate the dropped bomb for 500% damage.\nStuns enemies when upgraded." }, + "technicianX2": { + "name": "", + "description": "" + }, "technicianC": { "name": "24/7 Energy", "description": "Deploy a vending machine that gives a movement and attack speed bonus.\nAdditionally increases critical strike chance when upgraded." }, - "technicianC2": { + "technicianC": { "name": "Radial Amplifier", "description": "Deploy an antenna that deals 15% additional damage to attacked enemies.\nHas 100% critical strike chance when upgraded." }, diff --git a/Misc/sharedObjects.lua b/Misc/sharedObjects.lua index d716827d..c24e9751 100644 --- a/Misc/sharedObjects.lua +++ b/Misc/sharedObjects.lua @@ -1,53 +1,5 @@ --Objects used in a lot of parts of the module -obj_sparks = Object.new(NAMESPACE, "sparks") -obj_sparks:set_sprite(gm.constants.sSparks2) -obj_sparks.obj_depth = 1 -obj_sparks:onCreate(function(inst) - inst.frame_index = 0 - inst.image_yscale = math.random(0, 1) * 2 - 1 - inst.image_speed = 0.33 -end) -obj_sparks:onStep(function(inst) - inst.frame_index = inst.frame_index + inst.image_speed - inst.image_index = inst.frame_index - if inst.frame_index >= gm.sprite_get_number(inst.sprite_index) then - inst:destroy() - end -end) -obj_sparks:onDraw(function(inst) - if inst.skinnable then - inst:actor_skin_skinnable_draw_self() - end -end) - -obj_fading_sparks = Object.new(NAMESPACE, "fading_sparks") -obj_fading_sparks:set_sprite(gm.constants.sEfChestRain) -obj_fading_sparks:set_depth(1) -obj_fading_sparks:onCreate(function(inst) - local data = inst:get_data() - data.delay = 5 * 60 - data.rate = 1 / 600 - data.frame_index = 0 - inst.image_speed = 0.2 -end) -obj_fading_sparks:onStep(function(inst) - local data = inst:get_data() - local frames = gm.sprite_get_number(inst.sprite_index) - data.frame_index = data.frame_index + inst.image_speed - inst.image_index = math.min(inst.image_index, frames - 1) - if inst.image_index >= frames - 1 then - inst.image_index = frames - 1 - data.delay = data.delay - 1 - if data.delay <= 0 then - inst.image_alpha = inst.image_alpha - data.rate - if inst.image_alpha <= 0 then - inst:destroy() - end - end - end -end) - obj_sprite_layer = Object.new(NAMESPACE, "sprite_layer") obj_sprite_layer:set_sprite(gm.constants.sEfChestRain) obj_sprite_layer.obj_depth = 1 diff --git a/Misc/votvlibrary.lua b/Misc/votvlibrary.lua index f2f600ab..e9e5437e 100644 --- a/Misc/votvlibrary.lua +++ b/Misc/votvlibrary.lua @@ -9,6 +9,7 @@ function is_point_colliding_stage(x, y) return true end +--Same thing, but with an instance instead function is_colliding_stage(inst, x, y) return inst:is_colliding(gm.constants.pBlock, x or inst.x, y or inst.y) end @@ -49,13 +50,14 @@ function move_point_contact_air(x, y, angle, amount) local totalMoved = 0 local xx = math.cos(math.rad(angle)) local yy = math.sin(math.rad(angle)) - while totalMoved <= amount do + while totalMoved < amount do x = x + xx * 32 y = y + yy * 32 - totalMoved = totalMoved + xx * 32 + yy * 32 - if totalMoved > amount then + totalMoved = totalMoved + 32 + if totalMoved >= amount then x = x - xx * (totalMoved - amount) y = y - yy * (totalMoved - amount) + break end if not is_point_colliding_stage(x, y) then for i = 0, 31 do @@ -73,16 +75,17 @@ function move_point_contact_air(x, y, angle, amount) return x, y end +--Same as move_point_contact_solid, but with an instance instead function move_contact_solid(inst, angle, amount) amount = amount or 1000 local totalMoved = 0 local xx = math.cos(math.rad(angle)) local yy = math.sin(math.rad(angle)) - while totalMoved <= amount do + while totalMoved < amount do inst.x = inst.x + xx * 32 inst.y = inst.y + yy * 32 - totalMoved = totalMoved + xx * 32 + yy * 32 - if totalMoved > amount then + totalMoved = totalMoved + 32 + if totalMoved >= amount then inst.x = inst.x - xx * (totalMoved - amount) inst.y = inst.y - yy * (totalMoved - amount) end @@ -100,17 +103,17 @@ function move_contact_solid(inst, angle, amount) return x, y end - +--Same as move_point_contact_air, but with an instance instead function move_contact_air(inst, angle, amount) amount = amount or 1000 local totalMoved = 0 local xx = math.cos(math.rad(angle)) local yy = math.sin(math.rad(angle)) - while totalMoved <= amount do + while totalMoved < amount do inst.x = inst.x + xx * 32 inst.y = inst.y + yy * 32 - totalMoved = totalMoved + xx * 32 + yy * 32 - if totalMoved > amount then + totalMoved = totalMoved + 32 + if totalMoved >= amount then inst.x = inst.x - xx * (totalMoved - amount) inst.y = inst.y - yy * (totalMoved - amount) end @@ -130,11 +133,6 @@ function move_contact_air(inst, angle, amount) return x, y end -function move_in_direction(inst, angle, amount, isDeg) - inst.x = inst.x + math.cos(isDeg and math.rad(angle) or angle) * amount - inst.y = inst.y + math.sin(isDeg and math.rad(angle) or angle) * amount -end - --Kinda useless but whatever... Feels better anyways function get_tiles(x) return (x or 1) * 32 @@ -163,24 +161,8 @@ function progress_achievement(achievement, value) gm.achievement_add_progress(achievement.value, value) end -function tableToString(t) - local function serialize(tbl, indent) - local str = "" - indent = indent or "" - for k, v in pairs(tbl) do - str = str .. indent .. k .. ": " - if type(v) == "table" then - str = str .. "\n" .. serialize(v, indent .. " ") - else - str = str .. tostring(v) .. "\n" - end - end - return str - end - return serialize(t) -end - -function setNoProc(attack_info) --Simple, makes the attack not proc and makes the damage number yellow +--Simple, makes the attack not proc the damage number yellow +function setNoProc(attack_info) attack_info.proc = false attack_info.damage_color = Color.from_hex(0xC9B736) end \ No newline at end of file diff --git a/Sounds/Survivors/Technician/select.ogg b/Sounds/Survivors/Technician/select.ogg new file mode 100644 index 0000000000000000000000000000000000000000..79aeeb9fa70616f62f42c5dd3b6da93f8c305b95 GIT binary patch literal 40816 zcmbTd2UJtp`Y3)90wfSHfdBylCJ>MyU_uiRnUF#=AYH(~kWi#ps19Jc0YV5Zw4eb+ z=}kdURCK@z9TXj^SVpCZ6rB-8$8qjl-$C!(-+k}D)_ZIH_uAQKf4gPxZ+~rn`<(rU z4*393;NO92@GWyRYoi#V3psu)fg7E;RRm>R27oVM0DgsjeRe_iZ}t37*y;%ZA@lU} zuTjFSmj4stWxfq$0@epa$3>a#PdJ1>9L@FrIy~MLZ%(FIktt*=ywSor{(mA#4s4GG ze@qYheg@NfuM-RJlaw4DeQc}3*VUKB+`E-?W_oxt_sWAgM{i$OAK$%jFiYR>?#}f1 zJMZD^NcY_fk^MH0oiw^X1lVdtVc`dP<3)Y|fC7L}B1yS4(v?&%t~N@Qh+VdFgXA2E zIA;(WmQNY_JHcCqs{sHE;29xAwaczC4{Q%%cZd?IY@%fC^p~-26qiFE0;f16INdh?3 zw`Ji09=J@vxftWxfw|X#yFWqP|IWlq)oQ|m>Er9}2ZrR}1IHs~k0;L_KNTp+I@on8 zuq*4}qpaZHvp876zvHJkb}%pt%U{CFySYU{(2eMdAZjWJUeA zT&l`B`PSx1uuSvSdF3HZ4%jYwvO>Q3aRAsiaJ*u<=@tge<%rMixPHs`+j##bi{_B? z4|;9q!5%qJ&c)tB1cSLh!q5MDAF);Tf07Rs+&9i6>`-L}{**|Liy<@+N_CS8l}oEA zBcwXr0+EwjbEc=a=8pQLjIS%l0{|cOm5TpPzLN4cDy}QZHNI)-}Od^mZ+$A-F zT=Cx<_m=oGT4&X}1170u-rR-0=S{twQH%59Y7HVSiJ2}MRZXQFc|T5i=G zzT38b`~MmL!#U0gL@~97b0_6K7Q3L{{|~|RD1<57_}IKVzOoRcKFj9oO}NU z8`f?getd)Q6l8niejoRW$O_B*mN_*sG(Us;7Jh$&%{0HgK1sn1tG8KG$+y}}=x6p$ zfMD}~KyYp@7aCi@zR?xYDomfO7`Oid{j!?VzV$6{SWk!u6qug)4_Fc$C@_%$fN|E; znVg!}D$Lo4iZ;dB8J5qDoSL1g{|43kX3jJ>nELnyF5kY23{>~?yHVb9_-}Aae|`mUdKJcvBN161!)K@>uGMgWk#5O4-W+i-`8yQ;e= zEU+Rnm*_fW|FdOv;DtjK7h#7lujGO%=WL>Pz_Xwl7eVpo^e>krLI&7iQ43qk6F2 z`9!hzSB37@EC$PP^}cQ(DDpNo0K4q~fF>yfz)PKq?<1Tt6qEuHKphmo;)bt+h+|Dy znz~L}dSRF#qV|<+A;QbbuPh>Z3ppTWK(v6U-6Gtz)Q093P(b(|*aQhW_`sR}!3qSJ zLns4OS?kN9IB!e!fT$5S01pxsMUD`Tq>W(t7#f^Zk5T~u@*HR-h0-*QEW-_eA_Y*{ z)rvut>}?iBh5FLGK33L2B!|%Z1MzffLG@;QCs6Z zaD-PTiom(@$8Coti748u^I>DQ@an{T%JO;8D1mMfxHi*z2Nq$xwMG;uGO+!U#C%)1 zO1=W&6+TIsX58!xx0SC>M7g;(rzqQz2%!El9t1%|wOAaq(@fy)W>jA{?OjaagNhAY zZ7!vOU*zr9eBD2vQqA`T3vY1q3&18I?WlzvHZdsMq9Smvv83zjVV6NHu=h3BV`EK* zu!|>ROosx(z%^Yw7(;4cD+1)yIDqHY9xo`XyVf@`_Z1JfKudND4-$}Gwg}0!9=kb0>D0TyvmiWL?o&bVITU7To2kJae?=?xH@|O17YF9t~cMlK*w*y4gw+g=4`|ljs z4m61W?jcqImy!jR8Squy;0ASKZ-uQMqtn$6S{zWeC+qhr5 zZY5hY`8LphivItB5a}}wWuAlT|Hfb7@qsJ=w=Cg-Z9T|CAbp8lNFaTAxRLg5?MEeF zoc492NTd%~x)A|H&U%Ny!wz2GIUT!=z!wL_H2z>{*q@m|0_8DB8 z42tb}^?aW(Y3NDXZ?-o}yjiB|K&Z+*!0QU_UxV*phNXijfC5~QdFV)*%eOWD=VbFg zXB-Ly;DK@hfcUrXyw(|0+tpm!y^<;2ku(q)K2q;Hw!|3Mx0>b}JgQdvWllD9OD6#4 z05ITn*=i_cCl|{vi7`=f%y-PW6)|M=lDPa3{HM|YpAoV5SYWO}5{u+SYEYpKiR(bh zCnZe=J=lBG*G&=BGI&5r<&VLjvYw%!7*a;5)B(IcD1A5%jVjtVVnjB=sXlORR060d zJqv~&m*T=|lFQ9q1w!M~3EKg4OY2E9v#NW5MpFE2Iw}Lj$E(YGQlZKoUGq7+?dRoo ztYFIQz_T70;6MtfdaZfFsK{j-J9`Hzjp5|t#`5s=_62nW7*K!%0F5!B`I(2^LOk3(e3MTkq@{ileX06V^X1GKik|P1mRjBr9VwXL8@(2jWd=&^14wcdx6Z2vrcXZ5M) z&(-r}oR2@+!`Z2RSm#M@fy^GohS|pbS4KBDVPT=`d{zIvMbT5vlP77xrHdOWxUu!A z#@PYxp+jL!Ghnm4tuppShx;4z#kT}d0O=MTN-mJ7nqnnGCtp{I<>aP>wi6lY(PP6N z_nMl_B9f9IUfd@WZZ5_#M(+GE+j`*E0HXw-g;K4L>RS*u!Sg&9ET=FAbqr=S+AFt# zfiLF+LQmKNAC5rh=92TSVFTci&Z0cO^W=d=$t{QA_oQ8IWG`*U8RhUk`x_z>(CPH} z@{Fm8x=zVt(=)AzYyLOe1Cm_aYCl?Djf|)^eG}t+X#O3Q4^<$z6ajQ@ ztQB&Kl5Hp`z$)V;qhW1}c9Aw$0}it;VPk}?JzQ+)V%IZE*atBu1N|8AEwWb7b|h~1wBC~ z+&Mu0cvAqON3K9FDDXn@$4)4{^#x!uhy1dU9E-Nr1y)$c|GzU?yE?{dw^z)a5!RX@n! z*YH&ixv}{*uTgo6$^*K?jooeQ9l}SNl7`r>knNx1`qZbX`A6Y|e5WW&@??>6Fk^NC zvYGxv*g@)8DHp!lx~*ILDU^EwLw7lL)4a)qSibX~`L!VC$o1y8uc zeak`Uc!t5g5^oGt&n+)6M>v5ppj8AiSiXF9_+S7swAv;z_PRtA*sAV>vuSTBhz_`X z{G()ks&TBbvNbw@j9ZX)c1VurhKXjEu%f)-@V0Fhnz)R6^!>i|cCasmF8fV}Ukm;1 zi@O+RJN<`&A&*62W!urZG(Az-z3P)@XayrQ1g$FcfySpBnL6dsqjl8RyL`#GCAUeOdijDor(ueJek808BTvGXAh=ab zqey}Th1N6EGc>L;ibq!)4It1OjR+qx6~pBR!Y~8V#q^E`>ZZk4LFivGQdj6OP2?rJlCU?x1i`Jo9=Wg%VMeN zcm)?dSBo$#G3mu9Gfb72?tmey_%o1iNBSq;okThp{xI*J0EU0%m`7U-}^c z&Xz9Tz@*6Wq_XGDYxEF`=CKN0-RAF8FBkQzl3AhLQIo1DFDN(YHO@}z)J=0(8X>0= z`(+dDMY2|}k$$7e8#ZmvX`eoDAl*4f|DmTh^oTM+(E`F_6sz`5TG8kYH-IPl!TOf0 zdqS*N05v{A$^(BF!i42FFjvf zjXGxKem&^OskHkWDfTIfgvyRA^ygxiI$2fZoDonLBZ~YyEb*Yh(c9D zwZh#vQsFLu!k$lKFT5*eFi{=Ou;jkt#g8#s{&da1PFtkvY?osJh%2*LeUlOw#wMX! zBMI>Jx5|AK@!K`Ne-%IbZi^H8$JeLMj4O!WQvU@^s;aVBMvib_0ACf=0JCk^n+)UQ zvXwu?Wld|k3UC*(h9|q!3mlh5#9G*o8B8qPQKrwcYTHSH!Qk1tJ`!c>P=HsGmhpKN zi%Kg}G0Cra-xB^(%O&G|kZgrd$O9v2o_cP&It`ywPgL*3sy5_MO$0x=|1?w0q3B%m zLhrcz=n|(xRjog_vZtUG>%Zq9eFn2fJ1<(7y^*rx4Ti}e(Q*{=JmySwYp%?m zyqPsmTuy;n9zCxW+t8zbsZ~GQVQjrWd9TC$b;)e@y4LZAR!&p270$-cTJ$({UHW{; zSTOV8Ay*Cl{ipMQeXiFKiRJ^ZJL62bYr~9ENT0rXHz*f0XjO-Ea2U0j8T1J^8kuT> zLZj5lN(4y`_QXML?H#QCu;q<~{>B;Q6WZ+?pEp0n1-l-`^>YV3r`mf%a3hOTxPB9B z<>`mqj@u4zS9?E5)+z6?#mEm3jDX~O_x=k5q9aE_tN-Pn!8DcgR(i}cH%dupd-Hou zMh$)h0{IgSl0wimFq9KW;EE7^3@?Htgk2LpDi@I)#v1o;*S#ogEwG8C;QG^}W6?X+ zFGV-ru;#`JXUK1mqiVWT(?@xgtI76lv+><+@>eolf7$~DHgib15pnx?9s5~cCYcAJ z`4_Fcy$`vXWfXYU>ouxDVG&rg^3IWJXob*1DfeYUGm3VhXv~`ya0H3l&FUB%D7IO~ z9#=+AJ%9M1*rwC!^}s`82i%qYe@GjnJG>6=(Vi-PKt**t$*mmzuzGhM@^dO}@e6@+=HfTvk7FIdES&|Ci7?<7&Gr^!=I> z1N&*d{(f>1$(rHJ#6E=6*dUFJ48=IK~kW&ZSv zW+*L9vDlrM$I;6sn5lBk`)Y8yFW5{HrmI6eh{AR05QyhgaRCn^Cz&0SLZrCu5>y*OB(xBBAvcAv6!vU)TuBwIN;{Pk<( zb)Eu{iyX_GCBK~<;BnfvZSP|f+45xaDBt!Sf}>aJ=~PoY$0HOH65qOoaNtM|BLVF; zr?e@CgvM#!A2+0KqLFF)$6*r;b2Dc%X-ZFNn%t8p)l+ojB|-qs?y3gWAgbdnH18c=1{@@ zTZ|DIC0d@4Ts>&iARz;zfDjA_I3Hud=>t!gGz)j35n2Ie34u#td{n%;+7Bn~9N5m# zvG})mx^DS8rI7P*VPITql)X(f8n0uK6I7=QOY3>g4QQ@TV+=m8;YAyTPV6DgnX5Z) zqKnVZXFk}IJnam?!*#dwIOmBOy_umj-YBkLu~t{ET7gn+H?cHP2E2w+z!3r&Kh+sr55 zN6LU_UmpIS=y`cSrT`nX$?uJrt3k%4u231QJ@Pjs0KloCAHV{%>fgx#pwgnPSF0!^ zGd?~m?1fv7>(zcIxYNV~@c!D_)*%o;l#T$FKEJgSAe`!~^id2YuIj`QGVr`>$&#Lb zJwKzJd=_?uolrp-3UYD`P?7A*cs^skk34_ zRav=qVlj+YgnTTlBPQxW;RA!PP9c^+GS(w9kbG_h8IJZ2Md{TIfMRh9k0j$^#C_0A zpaG%e37*zJ-e_nI>Uh#J!!W%ut@cmdnCN&QC77b;&6=2wjLo zqzNF>K)I;IE%g)%FV{X-n}3JzlTFumO$nbM-!>w6qA}N>JhdaM5ix06kQk(trDC%j z|6?_?!^$}yPVaH3`(2DxS<7$z@T1P>&u`Hvwx&%q#rh7ww#`^!3&=DPDkoV?V>@2F1I(rD4H*Wjr>KrcULRpe0frW~^*cGI_b^U(^>|cpt@dZSwija> zZTDFxlR}}e#_fU>X?#vqv?Cs>1$^^vP#wV$z_8`r0A0nvC1JFN=9jZy8o%^^x&Gzm zekWI!JMT2;)M)uK`DNlxfbVsFw<&e_Fm$)Nnm#)9AW!rd=D@h1;xc?RJHXYCeT6eG z3Azyp{Kdvx9m)kB$&wiuFH8X5gFywxiKOp69iAz4v%Q+&%)A_nYmLMc3irfJV_2ue zlO-0?@&`3(G=PStd9fU+08ePnfk#0j;iC-i5+b*E3=^fE5#8V@18~qNJv@*Jv3WNq zu`eNjHsE}hZd?(&ood=;XX(8J*Q5!`=aVVqfTYw~eP!41Mda#q`P)ntm6Cupp~tI{ z6o{a6E?L%r3eX7e7i4!yH0NyKDhRv-6gK{+XU{$TL?BU7W=zKmc_d>8@~xbc^FJS= zxoG;E))+r3%+Y(WxV$5D`R=MdE1cF{C`6*9@YZ8UEDwr?pRAbO(2~m_J88qrcbTgS zx{a!M##q6k&Cw?TFbsgw4uhh!0IXTa_O>t}81l?eU@e3QK*I|lr^|6r&;cPlX_5T- zSrm$?l}U+HN!d@*&!PbA3n)cSN0mi>etuf*H7WHZ-x)uIB~ba+KuExt4C0e=0A5=! z@5UMGYo6@Y`IVpIm(z#-FayU4Czp7r-P)rR<~>?M|jKxbJ-xxppC8?)rIFpB{pPbHTE&m=3V zKr?dcOF_ykj|ORGcJt-*%_dI3Uqaschv*S|!LDK4Ezu8a{Wg~T6@8&a##-`nTJa)W zn%raaA@~CZ15I><_s0&oM2B}tmi7AAlIN4gWmN(y{%8f_$gC{;WwfkeKilY(n@c@C zSnT~<5#{i6pB;LePV&cGvI9`M&Tarq<@w9`nrcGN53rR=<^G>nTz>A+cWJAir3TCe z!L0CU63<1qw{`8k1F&&2+N#xp;wW2{tl6qmI=_(vdafwR$JZX=UGnSBY>qII5?Dy- zu5x)YK;@&cQ8EDYQ@5%*`aaLW4w%nO7coLnJV+=R5Q2xbhFbs>&vKE`NV=fcA8Tev z{Nrs3*`hS83qSmJ^>!Z`kLVZPhhfj7%>ZgF3q_S7LxHGRDgZp!?6j8)lG!J}f(cTV zX-$`%Qx7~-@1K9Y?a$=>Gxj;p44c}ls140~hdZKW@TP`Pi3MdJabw}RcF-TmL*HGj z`kcKhVKKzP)T|=HQFZdSBM3`$dcS2J00~cV{YQ=Et{0yvCMTFfh(3*zHUWujg*Tq;a}`a zHG5@~+)JBS*FSMdnO(idDb{&Ep~j)B=~t~oje1=Fy1>Ul%XO*8tQXRD*WZ57lt!(F z0p(tw{(9GH;>X)Hd^tlnnc-=`=bP;Ff#{k1WiHO`|9r^7Uv6%!PNiCqb35d{jfm(B z43W8tJjJK{!6F}pjqOevk{8;nKwI z)9()*8edE3?e*WBurqwpSgU~~JE)zpt}(m%97+pWN9bAHeJjJe$M&h!o|xN&Q~sGV zZOdTQA&|hLPPV+Im$PIX!po`R29k?Rck+X46o1m)37pEu?s3YhX67IL^wTioX66Ji zB;#c(T$@&#Fg#+ z@$+9LXFoF&A3WYy34uJnwPJQ)OlS9!P%TphyxES7&sz6)t7!OXSf(_E^zI)oej26Y zEPKjs@0&$c%h*hddN(Gj3wI6YPx$#z4!_xP-{P^Rb!m`bVY^Aj%w62}Wo-DHrV&P; zr6o&qP)mSH30q8Jl82IZI&nqp@)J3;xV@6hkKO1{+>HMb-xTyW}8#SEQ;ZWB=xtk&AUZx^c@(xxwq_K zS$9!r0dW*|>@}V7GHOY?7QI)G_Cfraf}&}_lUHB!C+p_@6rD$+n@^1r*|_pp=3adY zWB-FfO@2Lt+PQI7NxtC2^t{zcx>o+1J#uG}m`l0YH9I>|A|y}5-&{_HgadM)DK|uD zh;)}x0+j7+OvzW7J&>cAR%v$iK{VW++NT?MNOJPWsTEQV{()zEbh>2~1XzH*sq)-U z)8C`IsXL9wqy>0ycf8#*K_glUck@x&p)`GzB^I0c5gFv$1wi>{B(7>BWN+@&70KNvoDp=7S4PmJg@SJ!OSX=abVEDWMD|4`RtRy zthh;oS8XQ8_FW#@CAxfP&UBXQ_i9?G(EQ^8#s!o?xmdVJrPjJos0hxJXAjpD``;hI zH;~4cl`gX<*Qa>KP zrW$cl)l_dloVUiz>g6f4#)o~?D9Im|@`zZZX(vMmBeX=0S?$u5AB(%sz7_-xmC;u5 z=$n(c6e&ZrZaqDrrQ&o`HTjm0B5y|=Ise{d^qes5 zm>q%oW(7_df)_z8X5-Eqr?-hms7vC)7PmqIA^`Wjx`Pt2sN8FB{I4S(cqFcnEK~hH ze+ViQm2ES$t+eNd>>LpbQDhsFr^hMvPDX<>OqWvV(l!1s+Bgl=##p>k5&VGMg#*-Gwt zA3&}TyTdLWJ{B~thn#Sfne#lXbl6D|rO!jU)pue$AR|?ks>Tth?q>5u_J)=-dg!N0 zI|_cmitejpaWP<~3{eQ#ZKscB*w6)bbSD@^%TftzPj)>or4%YfjuYRHAd3%Skpz@@PNRf9yh}H)egN4ug37~D5OT$2Q zumJk2hv!6{=a>X%w>O;_aqeJ=;oTqCf4bqxFKmY!OhNT>6Ffs`0of=uZ*h}RD-<2n znP1-I7D3T7oZ<)m(p*cjAnmz+EvQ4w1KaeX;ZsLPVhr|%&gsL`8_^CYyV^7k%C}^g z7Zr6aZWF{NWR(4$mw%&A zT09(9vj2VPh-|v8=wMk9|CU2Uo3oj4h3=$~%(QM%zU;$5vf2kNvxeCddBe#s@%{Fq z^+BAg;Q_-@d*1xq-RN#kCv`7J7{1w#eOziDzPup9u{q`ze0Jfw#6nzb_kly+Ji$lT zbkZP#QQ-Z)If|+v&nO2Y=dt*ssmkq>P0yp*)xMFs_+mmImh}mszfQB6?%!j|K&5PR zzD-8vd)P!HtBZBC+>DY8GXUYKai>}(3Jh-9yE5ExDNF*)toG1*e)}N|<-9IJB~!nT z;s#V;;qZ9A4R!!s!)qwu$#*}fQRT1)Qh37KGz;iwejAqOU>QUtqW~==%8_Ud1OD}7 z3C9Dvsixi5wwZWfo2O#-)L~jh*^dyzpHr_LcyrfpVP(LjWK?JvEzWiItTSeAUy3eH z&@&LH57PxtThiAz?1E$@ns1eNnK-Qg=2D(@%cT}g8+^Je0~K~O>2@D)aIRwft>+QL(rzoc z22dn~mE4;SyAMaq$w{$iWff8yCo}D)`pXZh zMAvOe6OjEU)Q=+`LGV1KJDL=nPaHm1-X8WK_1)z2X}@PVR(ri!-gYV{#^%aX6&RQN z@6{QQ(%HQ)YjkNgbz^9bTfR#9^TL^8`o2fG1r$ovuc212eN1n(z#G21dakUJM*Ypgh`D$nfh4}H*Lq<3+$+lfir0t+D zC9zu+X7l{`UNe39p+yCbidsjIFU05dG;i7)(vKQ8xiPY&m-sRni7e6nA0ug86k&9i**=_&G zW!Z1o1qbxe`qIg;RaA}5?S3-47M<}hXg7A8`)eT{<&FdjAXNEBBTI0_3%!~-1VY@r|GfZ`5n@sD|H`ZReY4b^aWG#olPC(A@ zEebHqQf%yK{OZojl2j+XDs#;o#`4I?KWE%7CH;AMBz(RG zIQus80UgyNddENHFf}rFh=jZCf}5Dzu-na9{HcBBghXla`o`xtoh$n6;ohRWJgxeJ zB8H5B^VoAu;Zn$pN|!|st6;hkK`W;3Q1=enqf1OY7reyItK@`X72es9-gd$5$9+7v z<*B;=K+ceoH$70;yHrGS27gA?20bcMyX)h@pO{j$p_gP9He9sc1-f(+i77h`Q+!ca4tWS&EB5CKAGluaF5r)ys%Ik zjMe>ia-ZiRSmustK1E$Av+%9qNr3=M!*{|zKNE)X)Mdy2_WVSEM|Uu6d49HDk`dKG ze^L2z|I3vxpT0c(a`VfNU*^6nei?Vr^p(KM=1NoyB*+$4reeE-QU58IVm*d;xH!7; z-2L+(W#(@E+R$5L?!m14=vg;jZg#y?I`)fIKt^R4CTmA^7hcrW)g|PqXP&QvEASBk zKoQKss876$b>${XYxTuY`n)tfdJW&8+N$vGsn+`xw(ZN5>7%*nH8mMcj}>$HplgKQ zC2|v4AG&ZF1slXv65wGS7bO!HtVDz>=|ya^W{}(amo?N9djaA55DQ4iyuwmw3EQVd zJe*vK>FXxvkFJ|oMk)(_YdbmYYo(r)R+ZCISVkU(0c@U4XVm8S!8)>sn|na3;>G9A zA9Kx*&;Yd)ejm`qoA3zB&?4hpJ5M_EK9H*O9(2968v|V>wviGJjM{zr*v;rgYxO59 z-+%BrH^C`LPg&_!n3JB(&26dXLS0otb?LN`4;9i_hq1V*L%&I%1K{o0#BbYLDV)vm zskQk!btRVM;kMSS=Z~6dWd_VlRX+a(zN=Nct#TfI3z5S@3`<9s>_X-xMc{SWr=+F3@j5#$r~O8ZgBFcSH|z{i zVfdI#paufD4fu_L6*Xr+SWTia1EX&F>*2Em;=8h_PVXp@7k5>xA z$sh|gsGVMeHO7X59)2}?Xcd_}O4-Fr{l!?cj%|-2m&bNBBr-w&>4c_Rzndu^YAp22 zYmPz7%hmiOt}-I0X`ijW@Y$0dfi)+V+J<=5&RY08R|}*}hnH9$Lan-ZuFh~9Z>I%J zorCS(7=k;8>RLFHNaoc;=iaVk5mmJV#X#ZuwBnStktnJm>y9e9ir81=lBNL6#_JHJ z*|YKYk>$kqJVKQWjigi=3ez7^3|+PYOs3cKCuCGjV}iM_Z@S1F86co!I&D5X@)~w- zqH!{sbCklJ5W_-Od_SM*w7+|TPS10{SoO4k8*7@|k$1=Gr)^13SMtK`34k1fas$1o zEevj*kk=mrhPg zqc_(t1?U~}P0mDJwhFE_6+&=&*6Oj13TZ*Kq--4l8*M zCIuU@W!RThx=!cPJbwA~uMc;3et-14Lv}x1Z`=`FZ#ZBj%T%+fL^+x^D6mq35vBa{ zZDTOePFq9RN-gtFW!$@^#rDqk*Z@|ZKC&7{kLLR{R#gd_ayXyjV}vufYz0F#c=(9D zLtc=&dEg^skDGfw^rtXvlBZJyh`%0Iu4ECAV`0$Y2;8IM%H>Zw_8~Wien|B9+<5jh z9ip-fKO`%eEq+42~ z%4CZal|>pryZUCP_2-qo6zcwdXZT;$N+CGDS4kv3+0Pq6Nd-?@sny4ZydK}HZ&o)5pl=s z9;X;JM7wDTST_DAbo$wdh9F$v>%-_+VY-D$ak8%X6Pa*@uUV3I=cU76udYA->&lfM z-`C}GX_9&FyEK@Y%e%Y1z%c0~JoP0uM8+9TjquHTvha58*wxv0o=8z&OYM~GA`uE0 zIy97;1)K^~F>Zlk4L?QryQsZTIP1FmtnSQ=8L+t3dDAWWAzFqwDE_(nDSsMiCA8XSd{;^M)V>U)^lM^2NDNE0Hx3bk8-dP@ZePobI+9F1F*kQ#Rm91_X9{ zU9dc?=Wja78YZ-DD+^JkDm~TkMa?K7XhwB54UVG`n}&U!FLcm$z+OH0dB^o(2QG>p z73Va`On_o*DB~LGka2n4kxY|}d0C#uNTy}Rk}M?U2fY@3U!nICo3YUnY3dp<1HdK^ z28>^u^{t7$!X8u!6uS^nRPRW)Gf8$=bN+aa`9S2W|DM*Ip&}fqfdTFm_Y>_r^->kr zl1`K(mNfw-Izr}_0WBqUlp8g(ruQ|yfg@4Ju{wfS*S#piwUl92WN07olMW|C*xIbu zaBM0!vGS3dP6$^~3flh86&{Bc zjp-AqJsQfo{IEz}-)27w3O5?L+Ap1tX^w^}fv2P|wBfABYr`m2g*XeU!C zyUnTPrha~?;ly*$!^V@(+_s|i*PX~D28`#-Z!1U_!MQwg$RT!>2frpPzv{)zfDPY4 z1|>-Ot@%QV>Zo?gF|=~eg|z+sJR3)(J`z8!N0o*Gr*F!TX_AW{37IR;-vIfj<;IgE z_&d&LU1!UGLA_224U)iqJ{LLL+?EjkW=x`c01ZG)%b}1c+Q?OxW=2$eHBTt?Ug(68 z^z>Nqp3tB24exl$;!GZ(a^YE_faO4Vj9sNf@5U!di=b(K{DHDh2E-(WdAV(vvR$wq zSQLvDFx{ufGafT!CCV_nbWB#7Ssw7_u=_OAU9H~@G0fg=ZzzxK&};e$V}ViglbMJX z3@Y@6Vn4l=ge^1MQe`oa1<#GAS_EUe8B4#*4bfWWeVk7j-K8s8*_N|o>%8@ph_(ZZ zE{12x^Zh5SQ+gb5iEnK@`l(9#VNnbhCslLe{hFT_sG5qWw#^1xufjIY=d$%3VooNPTSfQZR9}QJ*fC zxgkXMOnlH48CA=*!B>*h^V!l~b}CgcMohiWMp{XvMYCfpkv77EPEyLWO+X^)DZ#ah z1!E&~2}7ryQG2>@=wKtNAvwb(kFxSMZq+^+bVDGwh0-4C^rLQ3HBD07x@Ud(X?KAI z`d(SX#O^+78w>kxp{uVfo!T_PMDZarnkhYy2%bEZ0RR_y~OqD>&h zxnj(5fH0K=!vpt<#ueqdbzrNyKRRD28OZlRLjX^4qm6q2U!_eUQ$>Nv46Z?`QK@LR z6=g&hBBQ(pP5{o06JTRv8Ba3>0Nsek5TLY7loy0LAj@Jz={ZF~WJ3Fp4Sd#=B@?~p zQqL;CN9II-`;$MPmbt$Fqve?HmHnv-+Y^>5nm=aLG_NVQS(Ahaq|`%APKm_b$SBoYA$I(Qed;w|KJq&Np4eJ1ZH%AL8eI)0C{Z<`C?}pef(+al@`)4)-GN3>2eV$+$f|L5x!E-*7NrLr2cjT( zj!0;{dM!l3EM10%wS*WvlEkoB-&KBYbhkQu_&oW@V8)_wCgu%d_%--}9UbQN^RVm9 zPN-LL*=gMSfOK2QAIp+m#M#&p^t)9cvM-*$2tAWhB+T8Ww~%#h_3Y~5)0To^=ewN= z)P@YsA=&-1ejJAgGhMPhHls?yee%eL?9LRer|on&d4`4+tq;SD?@#h3UiKUkva-Sx zvg*7~YnCj1+6A+QounKw8FE{h$5>X@Zs1VmaHZBgit*dS9Er~EJ zTk3gl5WKjI4}SosE3uQtD-4jFC<JY1adG=-e%kr0v zFQ32s_2rB8moJnrUmTwgEk-FiQhE3O9MTU^%otZSD)@Cm_8Giams33V%M0M5d(_Y8 za)W}OwcTcyJ-Q2iM{G^6>&`%-5jAaY_W$ESVb zvUVfv5vuJ(Q01Zp?kT*RQ>E zdzTwj;yUNpa$ich*}=SS(e^_Bn3_DGs@XVe&8SlFPj(lLk_WC|k2h-C)#!g{>apMV zgyyzbyANU9Pn45J5h25iDa1tFjw1%Ha~V0s%Ej2tG_CpRb1n~JYc4|7{m}Q4YLSu6 ztuePEg=PNO2eAkEK1@T=&e_E@8FD|6{s*aBAU!m{5nzJ}m8;pABaG8hu-GOrR>o`Q zuS?4FyeL;<1&XIjGZzh=qDMa1@dym;0-7|ftudTjydCH3NUGi3!#v~fB1Ng(MhkBH zQe5TkAXz10T`Bgyd_~cGGAqOYZ!0Gt=R0k8?9tD&`>jA<8lE*9|FX->OfcN&4Dd29 zcpnN^fI*kIebPl!Pu^P9cXs)qp`4W!A?3J~AsLCwz?aNwtD1MJXOEY$M+afLtQBha zh9M?jAkCv$I$xUlG#{XT zGKsp<=-U|lnN`E~^G==aX~^cM#CN9 z%)&XmY)4VErU?m7HA;tbXcklLwdfb8Ri=hw3{woo)MzO>!yi&y(`}UvmsB-Q;)iuE zAAdU^syxCHbuUYh+n|ZkKpYD88W)6=QJYRaS)pGzYc-}SSWh|CW#-a0ws@Q8$8v1% zuyDLjyfVw49V<>f?-1|Ndg3GtLn zC;zhD_)s#j52{Zm%4u%!qMb zlZZ?KqMY0FE#NuV-Cdrmb`?t;iv%F#cjhk1a!2w&p@WqYtOZM!LXn13Kqj~WP^%fs>_0@Vg_c0Bo{o4 zE00f)>zH6Q)S;RHVlOs27lT7b;bVj=@6_g51SW&11rW(t)cN#y({;S&`ZU8FKw#iE zaLvHv;+o7nW)f!EEnEZB8V5tZIUc#fmE&R_*EMrj=1L<&Zh{wAu9@T$IX=x5lrH8m z8KA}lchb64;+&j z$ZNteN+P41=v{Dn`0$x9&?CZ75L6FpDDz-XD;kIn4hbR%7!9Lm&^d|DNg_K*_zV~w z`cNlffHVAIh!e*v0F#6yS_rzs<NG(yZGIw(JF$4PmJGVD`-LAXaRe4oT=|m&|%CnI=luJ@nRF+=VAw`Iki;Hw{uKgoLSJ+GiHhLP8-93>#IowYQjd7`Ap6M`|M?riiE@ z76VaHQ^D5Gz{H~9xScA1tr{{MubJzSYv7pUb>#IaGZ&B-WQNRSUY|Y;M@%sgTL%`k z7%J8lDK*5_0br;oVl}K*)9?c(s*@s_Tp6y%OcDcF#okU#K~)KJCG$v@BjlJ&$n_(y zBf!GzxF#=n4dlw&0oU<*%*7lTb!2p2AK42eb*{i1*W(IIxaL7(asZM!#;{s!5qKIsPI1I^R80I+Uf|tZZ6w^=) z>@ihLM~3S$gzGVk$T|~2!srtr-EmBJLdfg2|Ud#YM=Cp3N zqXV6B7+!C57GVGe3zSes0D$4Rj+w`B5Do_B6^8T?gu3)#Fz`BK7)hu_5&0g8}FR0KT;&*;pXSL<3&eju2ykBoi%wcUMQGQW9AxgIvM92e4jyUQb?4-QC^P zsbg_g0)VlR$U6{2vTP!0n#%;TxR(}CMCb@ah&T-}p@;|spb2HDjh(&Yb~t7=)U~m9 zfZ-d%VmLOPIucV9J27l+)KtT2prB@s>+#B`$Hj1Dm?}7KXR1X^v~6)QLmm&ZbX+qW zdCX(7QeI2Lr{kIl`IH<(qGA;Tox#>3i7DW^;PvS>A&}wJioL~5#4t@v8-dKh^_b&j zMMVp>$DDK>ulZ%QA1ojwhM_hpl*lB!eo|(R5eDHJRU!P1dfF+@UfDYvjcI0vACJl7 zkuVF9DKXYWSj5NTVKMDZ(~tyHj)l1%%sjRN!xb`fJ+55IHC*$!9t@K}E(=T5BNjRG zcyQ#{Y7OmroM0Ha~yN69O0PX%p67H2y?yT$|vJ>kc;7Q9dji! zYw$P~9}>2>VIXf63~HIP^0dh{d4+)lhEK^&+^9lz6i$~;Ts7NJ8?gsaY*7(W2a<-E zVyY`ZhOx#BTqI;>GBYpc3I|isUdM0@xm-@2BOd|KFfLuRju=pfI_mvs6QQHU0gDC( zG{Sf%^)R84oYZ)t*Ez+(tOouCF`OlxsM8(puN8Au4Z5~E885TI)UzyO}LgRUnx zicXRd?5!P+J-JkLl5CiLSB4R#6lLxR2+0x{%-%FF7U=Hwx+kxl>n;n?L;wI?>xX3d zy2;t4;4&^mU7e)McOw!-k`f0~G?>r@B_=8=N>RilK!_-4LTCoXR%38r`trxbYPC3E zdUa?~Oj|=06V$MG+_bY=Y_W>Hp;ki*TbZRWbA42+Rkx;CM5mju7Xwr6t@svE6RTjV zU{%3!C3DU7NamQS+6Sf&f)%ievkgw2F+9;Qt0b1*YQ)S|9-*KTRC6kc;Na|5rLIj-Y+ z4SA~=GQ7B$V>O;IC%s{2m`0RU{MecbVj_m?6LZ7NDvn$F#92%xD=JdBuIrjy53X6o z<2v5Kb)v>=wSSyOW?88=(@Lw<~O#RF8ct8&OqK`0)e zntfOA(X+@Dr4Turv6II>nXH_B7I@x5CQLnbd(;JBYH#jt=ZYl&m|J~Z7s>t+vI)@= zEh6SB0wRJKqVN)N35xi%P}0lnC6uIqDFPuS5QPx5R0yVt82jFG2t|ZUTmtwntydV5 zE~ZrAPt`GrjS+&{TP%hIPB^e&n5JT=XZkk`i|v4EGa9DFv~x@mTtm37TrbYz;G<1G zT#t*_18(3-O)yv-ng(jMAWp|>O0N_ObG!?N)ieY&ZR`yNrils;EY+Y2h6<)gTBek} zjS5k1JYGj;4nEzeONS-QW0-H|EQ&hrRwZ6piVDtZQB{oAO-C7G@y5VUEx)O1cK3UC zm2f?!p)_B3O25e*OUHyzyIxPq#SyN@Hwwyvif~q5a~&V@f@_Xr!U}Vp!10DlCw|lo z!v|->kM9X9a!sAY(=fh$*;#PKFK5q1412SE9rwmK8g=#gtKn1YamN%OjR8MmN?AWe zG|(N+%9Xy2yQu>fsZ=0sFchjVU@(p1+_03|Cvr;@ zuJD+HxiZ6Xgvrcft_dWQBg5_l^+gw1sS{iz3=_V2@onp%V_o@D4L+$>!th>0SF`9L<e5~MK&jc`nINoRbodqj+hl3|+4 zFhxR^RdwaN@5>s4Ds}Dpmx*a-HWHaS^)xksnuEo#`d4OXQ&o$3O4s8_glzFtwMKQf zRcVVkZn)msVaC`CCzFC{^;JOZrR>L$j05MJM2a%8o&oUwA+&C@LC#|}r?qc}R^Dl>4?)R^_%h9IhmhC4rPLvLY zwT!J>>t1F%CdO`2kybmg*qVbwE>#zo1#d3XrbU(k(_;ecEv{!ivQqH~GsEx7Bi9RN zuKbQ~m@5iAZsEc38emS~!+e?Fzqsi*4vvN6%P9>4Z^#uR1W*y|Fx3W`Tzr~jJ`H(g zW`;+YgGt6MURVSJr6U?0r*$KO1?i|aP6iK9eI!afBTSe`a7ZmWy=UV~tX{Jk_RD~l`LgvE%y}vo0 z7s4hw6OY^RKVtQ%9E5k+O?FEq7Wg(toZCvuwc?8ewTEoWD4TA4o`Z*B6b8pqXe zqg!;3{iBUttCwSnk4K>?6BV%bxcJw22yHcWJhAy(mifU|$M$wuI9|WG)n$+|rkaMU z6TT=JJj0N5DrK(a%Xyrprt7+X%+iG@O1YSC7KURbV^*5;70ZN6n%k5rTvKTt9KVcO zc-$%7iVqc7m@kXOvZyXjU2!}Ws|_&6iv8vJTK)9xt84t5v-{Yw8aIBGV>Vj*G|R_31jUsK7jSvh(2%}>p z7M!5MXstz2ZlEpb0Awr)PiJRS002O#00000002NG000I6005369(9IuZ#0sGs`1P_sZ#2xxIpcqSkP3qe6Zie%{}NUpFXTJl*1GP+HgawQvd zfNN*1nR3H<%coRdygZb1qWiQ7SnXhp~bMUWnfVei@!}(3{?>uwZ-!RH7s_vei9(m zModigGvQnoEOu&98|y@1*r*6hXLg9MnJ3NM=QxN}3~)-v>zacw3^3jx*clV+)m7i> z#^hW~=VNo4xQ-R>@@Fc(+v0j&rWKPu7V%@Mq&b0RBBeT1Z9kgM942q;8yDSC5lJtD z@O3ZWQP^|aDP(2guT%<^1%6yB!c?g<0DOLK-}kK@A*O)_xK(8i8#-yH%zCtQCa+^O zfZoKYC*AFdQS2BY4o;nqjtY8xB;vx5@0(#L+;rIO1|GcxNDZyEFm&j)&;UxHcj_4_ zA;w2?VfgcXt^t^E#zuIFvNy!jkjo07y4_u}^A2$hgTe4WA%-%^SbM}$w1MMmG%sHt z`tUM1Uh6)nt(G|f-s_Yq+#flLlho;^Q14%wMItvT=oqBxnKF~FBkvt$)kO? zBT1t-RvIrI07Mc{ZjiTLxV>@v$>}S({pq`LbG!DM0T75HfU;~;dGNCi?8j{6>YM}s z0Hh6zxd~Y)fT+8fq$mx*T}a^6lC+9Zm|!15^oD5`Rxni|5P)fiWe=5UHxC+=6}Pp# zzVDw+8-4Y&go0fToDx!GW-O#~1e&5v6)iTlm00=N?`S#pFeSPBFeqFxv>#x?n{kzTU zqbdH|NB0t|s?fdqV=K!I%ed;K>-ao_uSM%1VZ zG&jpJBSQoLujuXu0HEHmG6w)6GywfRz0+9*Q~(9w2>|mB^`)qRbbT2B&=@UhQAg}I z0NMxvzQyx!jIf77`Ciy{|2Bcl${9FEq#`kYR_tARH(|I}MOH-$L@IJ(;Mj>o&hz-n zV3&N%rPcs^c#8Dez5wKbpC3Pc`1b1)ng*alF`o?ptMPSy>(5@k`21ooz={MAkc5Pg zfshrIQCU%0>>-H&0069&;)r4gOcXO{6BiYVGsGp!#e`+$bcrHm)HD+zB@_lFo)zPeI_qN4x?AKZ1yI!Lg(FxC_Rr@VR{JVzrPBS{G6FQrd@Vz+>&^ULjMmNkc2oN9 zk@-V5<j z!}UwXdSsJOl8|!5Xy3qZ9}`Dqz)Sj8AzN)oDi~FMu?15SOhT7 z^Baus{+A##0W3qnJoRe;_PKvNUE@b5o9OE^VCr~}Er6|Y##k{vJ@*(ldyo1QNAyYp z000P&LMAjp8N^sbC?b$4p6Iesr9_qs*{4OtAWq;5X;H#c=QCN_>r1&s|68Nz@BRQ} zmZr|Sq3p+ZsY~LNvn12+r}^Zow;m%)RW!;_PEa@ILeIj-YR#*+e7^qguxEG>E#>!g za=qy%ep59R)z9;f*sI&Cj22^39a`*cY@Lc>ibH!<(^GsIikKF0=n8%utTu*$7{g#1 zVihOxZHiMr{uXeW#Q?Pn~HxqfSX#62!(vWOCIhc)o2h%suX9(Vici zh8~R*A-B$q(XYX{#O-Y{9D98m@wVej@3_je36OL)P2=>i2`4?m*%w_Gw3lHV*MPyF^);GtS)sFmmze7`B}KE zMHDj89;~s5XdgcK5O(g+%>`ybZH9reta_oUUMzmL^e|Oc*P;3Ix*rE>Q>XXV93TJy zv2t)6Z2)j+k$M22p^SsNEC2ujI2Zu^TPq z?Bue$XP01}-oU;9;I8okKtxedd*0sM9{}`zzN}+sLtr!DJm>iWn7gO;CIJ8d&|o4) zi%39FDyN0sauGMDXF(i_5~s>25lV~_Ff9-ha5+s;pjlKzjFpIq!v!HFCV;4r<*S4= zckGbqW{YOW<+iNkJ}c|bWg%oH101ESx62(;>sns$yBD*XSc0a1!2UmfaK5AS*;y2F zvwSv1Ss}hS`V$Rdvs3P-t`d$pZZS-&U=SEHIAQ4M$QXrj7|X_LsDWZ@TFe%#rUUh3 z;FxK#V2YYfO%z#B`G8dd;Q9-dBm9L#ncNv5;hFFZvKR-1HsJ3@vjV*I^ z0$!xc>=*$8A}7NYuCcuypHVW79kQn4j^m7Lbxu|0JO=5`QpoAq(O}|GvE#m}J%8>A zlM*r8`(d9N&$S8wh9lZFfn*@_`o01{weRgT0DvTqYw0=yD-%o%{-@sV`CynR)E-=9 z0C-z<){cQWYAR%>;lo@rvpbnz^VjmuvT_}PpT1xJ^Pl^4b{>^k`@$k|ZXN+vmM70H z4L|_q6#z)5Co&6OX49~QoWTCe6gpJKUuM&|hg`t?=_pz#B_GBy%d}&Loe-Gk`3nH{ zx%%xN{9(=j@DhN-oqv8}p4I@XfEpl0MZ03Of7!ki5dcg?w*cBN8Z@h)-nw~l)BNst zdo1<_4ayHR~{U1%K!Vr=NKY_0RR91@ExJ3kakfb5Rm{=0x_v03OARC z)ZIhOC7?i20s$mIiLfJ(5=lx_RxJ(5wioU+!gQ&A(zos5J$l7%(PRW*ErjYv^Hr4%g1z{OaFpc)w=T=M_A4p|>-7aC6YQj^s0b<=g)4 z^w!wBRO%XjZ#VhP%Ru2W0oaK+vP-oKOvHj=n2t;no5HYK4OKgfIBtO2Di#$(4Mj|K zh`pg|btH;ob|t8o)(MMRhZc+A&|VCkWNh_R#YxvjY9iF#1^^>*jWs zk8<^3c@D&Bl-aN_Ou3&(40wb-wk{i9u`-TeFzJJK;44FhV6k=+)D9+SfpY zh=`{X{-4!TCLqZ}0CHw{{rYl=F987HCjbl$a0j1jZu0)VZwR-6 z`Q=02d;S0b01yLO=<5dHaf$!{9A^svHvqS_&(7^$I}6a}l+%-bX4BXKqr<6)q z==Nrd+5>sO$20Xfs0(!79v;Yp5m^*vW@cojoY*6~WJGIQCT4H?4glaUmumySd;kFK zoDGT$9)Q6*a6lICx@$TP4~#5lrCRBW^3Ho=2LKR)5QG{q>!-ax`?ntZ9spqetHYk00000Vh31n{q<20H6aV7MCt))?^)8LgR4?@ zwQiMeG+_b{H>z{*Jltr?-8{e$r9BjYzHdJ8=v@bHcafMU7R_0c6lGKZfTqI+&oXj@d*?ss|Y+MJi}b#sPIyCnH(_s5;x6O3%?(_BeL-Hj7003Ga001ETcV1^pVgiv4iSt~rJKfzL z2JdV|j(|A?&U?ikc~VcJlhzrn$OzSCh?2w(nJf~Rr&oqNn|gQU>wo>ro$J}~jzCg? zAGz)U$Tt8HrsKdt#~ysL4}P-;-+g~70~`Q)2S5ly3>M%soV$7W=lK42KH2Nei+tth zD(5a9yC@Wwuon~qgfwux{`>YAA1^fP`rE&L{kA@R;CMcot+5wS4gdfE#48F3vIs>n z%ESqk2&|!|0geg~QpjSIK!gxkj1Wp7CSVrQG!di4nTd!vjo`9@^BJI^Cm&zl<8&vL zR-S!Hg=Yw9f3lI-xSnq3cVCmMDua+-a0=Ju>0|GI6;-ldqIk(^-6)r_0-FKKe4{q^ zdReBIoYv*v`PG`Z-AztBsO!ty&YcwN*I9_q@BhaiHF!&*SpVnWw=)MUn<)rz)YOX> z$lI}HJD<2TU5@+oL&4oMo^$RQuX&xCix2O_1mV0*y1>2GSf2ye_+#05<5mLz2s;FB z6xp*;e5?GfwRsOy{@*(}CJKu(2~8*kNO_ zH!X@qF+?$J6imzLmkc&m69;OswOCASuyajYtFv!E0^&I^eOqviags#7#t@bXB>89Y zH#nB7HcSPSB}EApL-JrTMJ$s*Ta;-tajR%_LVQZz9S9x(epg6Dz~ziX+yHbG02)1W z_RhyT-&}fqtnqotPXYjd^|MO{zY72WPiJRS002PA00000002NG000L7006_<52P6X z{|Nv85&!=-|Nk`q|2F^sWB>nl|NlCEXY*nk+`%X-Dd8do+}XT1gE|8!s zBcg0_)E=Lni&wsXdN<;Bjo28S073?kI2h69@2ezZjgZsBEAtHnp7l=whQvy+1#3jO@C`wF7Q%o}pXn;V-6rl+SArML(2tttn%3rJ3 z?N^?IwM!*qvjspzjPOxI001Jm0RDD!cn{h@i%<|oZ#Rd}APNW>iU4#t3?Sv` z=NT~bd@ds*i#_&@+tugxdUzceO;#Ndu@#bTvq4u7p*_eMo!k$r^_)PTh9 z&K>O8Y&CK4Bjduq-uwD6BoY7slra&5h?oFGL?{kIGX)_fpa>BmOc6050YpVaDN0mC z$h3ed5r_*wiBin85)ff%LznGVL(DJ!rR>DEqRO_6m_d=fQIna_PWQRnBn#{2ymI(d zQe-T-$bIydA2-|H&3h?>kN^OHXdQdo!yQ`1`q#hG?&Q^PvgG{jzqvicP&t9c-s-qx zs9~zD)uNaajw50}frzSOj$t6G2DYZC1Jl+>F+^h0R!{=Ea zoS(O=*gRa{45!z#Gav&Afk+=y6SWW)X~LH;6TbXdVPK>=mBL@R-a-cebf3+w(IXCr zaJr0#j!`>?Et4<}ktuz{tuD3`K7R+{hSow?ixVN}08wiRVl*PETL#_&5bBV-yd(4^ zGbf#jzvAo5S4yYX{c*=YQA7~Hv;jmTpaF;gUUqZ*8JK_yfzjB_@MmBGDg=f*D3uXG zRA;2cc)A|sjIA!6*n;U#Koe35MU4r%q5DH zqHuUTzImS^O@H>C7Jw!d6D7YuNf=^YsaziBg&QR`4^g3KnFv9GreuhUh}Qy7iI~ap z%0q8tk?oZywqm?`w;zs@}prPvgP39)t6Vwi>lacH%-v2o0gjj585 zT4Eg>LrxA8I_Y1wso^mZ1dQ)~v`R*@;~O?7AtjryN#ri|)^XZU59mdL>wQ6{Se zO1+xm$bQmCEGD5=BvhTJ`5x1^i(AOrYm`=Fb?C%NqZHK~>;+S;#p61!HdPA8Ts5&5 z1U0Ruy-Wy>>)7L@<7>f#`EtUMOo8Ldhs?Q{6=)>n(|G16W z;NX=J24FHIk9qOwpm)Nwbe=k@9fATyot;2eUBkj7;xevoT@UW<5zHnAPmIvf&L9DT z!a?#nz`H6TjQVsOl~~2ne0cGUOcRNT*~_XtGLE=4oSc zaKx@fu&^A=8(?N{@^*4qo@++~{PLo)oQDKx*F852004lZ#%ZBYP!bgph>D3)A~cm^ zqD(Q1ffBM9i;K}LLWxk6xF``31;ru)2t@@%jL@P2nj#|Qq7==9KnRwKh|&}YM3@#8 zp+yp6;<9z(DMVc`F%eHUA-f470WmSzOxs@g|0;V))y&Rk2tM#W1X>*f_F?s8vj>p)EF)nwYi@!`|LU3{4-X37E#1J};H3 zlQ|VzX(jFS$jhbV+NZFiz4$#47Iy=YT9f!P|bB4R%17FeQqiJV8x5YxnI-0 z=i*h^i^nx{ug=g8);Dx<)Twu>m999h4?L`qd}_JG;iI9ps@=xq6WJ6W;IfeSFKHvq7%-L4t}dCgjD9FXfw$fy?=$t#ByE&3yO!og&C@nj7WLu;*X z#!vt>G7)0pAOoIui|iWu1PMcMcJu5S<^%~taOk3&O)?RAQxr*57lMd@S@V1&iG-+@ z2R1erBw_Y?n!M=%_yE&1P2&bIO_Kxw07O+xZXk6Nny9;!*^N?nsRTSIM<$|lrJD#5 z6buxg9SV?e#EG~V3n&@1I4vRoSx87JU~Hv>b_zN@W#5r>cLR%wi6A;Uydf$O^-|&< zK7~x;=Z0Q+-n*&E(J{3K8(kp>-3m8Om5RdkKjq?Z;LPhx;Ftq@2eyU@YM}NOH4MeG zsDah6vv**N0H)a3+t}Ho7?^6Dukc(xNb zo0DyII_bc3YfA3)Z8U};`7`s-%lqPkJPU3UaOpd7F*c~_;zUH*izI=k53;8 zE0I993aTmYwXfe21As8rJYm=eSiL! z(4xcRI);lJ6OR0=VIZbOMAQ~@S_=oOA_F9;X-LIauhiBAYZtLH$BPf@^Wp$B5HUam z0sww>b7+t43t)z;n^r{avpDP`j6c7~BLE9n0*Pswx+jnT0DuTVcSsgel8}NDK!g$%DKGPB z0x@y0fCxmXG%*pOkYWMFEM`>DOjCs{=I)|X5|cvql7h&zn|3AI-D{JTg|U~5Xi|1< zI{W6iBUqnUx7o|;393+k3SD*lG{j5DsI3d~IB?ane@LL9{4snVc3b`4P1G!46iX?x zBa&gY&8_UWb$j0H=X`&E$2PZ~%YQbLJMaj0xo*za+{9CZl6$O9F0S0m}2ihz%*1%2d2dzC&S`n>nf^-kHzrG zp%mKz|2AhGMjc!=tjH*%8ifO=R_FcpkL+di$9ZlOUx)C&b9Sb_PoB849@)xko_eLA zRd}DW;+tG=wsu`u^?H}ZXblxZ@pUpo2IJZLDM1)%cj3a0lSiMVJ@bW|@y+*NrSyKy zU;i$3ynfdGfs5laKiCbJ|%NR$n>tq^mUwuTQ`vp9pzy@QHz2l?!MExL%cx z>%#}gOVy`vO;)%r=EHmwvPCSTwYNNrs9;RkS+2_?^AW&U0MGzlh4Wxeivy|-l_;D+ zQ)(RmHg{}Ev?(%VWt5{!V-~dAj(rC>fDKr&-VzRhBUte98XVjJHrZ$r>}nFT=k2iV zn)hJ{^ECD3H3D80F)83c0smu4}*E9dgnQcsi4S;DBfh^AtlpQwmgm#vxEr*DAMLdHc!-`C(_wCzb!JdZaAYzFiCtz7@X9P5ozf>-Z<8 z_q7e1lTW7lOgU$J>VM{^jWcoNKbK=(wan`C@9Jk;t%mnqF`OU9)HqB!lX5d(;Ve13 zwbkPJy3Rw)@FijfI|4;vRzZIA=^f$Ab5e1QDU%a><9OQSI$_A;?fbH3u1+;C1#6hJ zEMhqCTp0(kGT~0xh-D{ZO@E)2%l0XE--j}CTezl^aBjAE=9xaZJhfx3=iD0qr~Pqy zT1#`;6_Zov*X`u;-a>O;k$?N?CRtz6F2xwF>9D&aizXDZ|3yI1Orp7mD2He z92@gG0+~hl9(5KmWBX0^hD88cM5Ro}WFEZIl9Y}os^$eBmR91&@lAMy*Dy>#)U{Iu zE8sXj%_ojWV6Nl%#EY2+K*&T5Z94%#t%k~rBNwqo!j&x=77utOKwJR+ge!CkF_~n& z0Yu>{okL6ptiUm4jw8kqrn7MX33k|l+<6ZJ7O-h42rSfK0meM_JTI{1JoQxF4FCXu zvYFhOr>I4lXNeN^(u9O)84(J^MO1~fNU2;lu@bzbO!lCC-|J;x%o84PK=ty=s1Rd_ zJ0i3wr7ET9K`hH1M>!9Hw&ccrDnx|+qH0qXTibTSVZ`bs@^LTQcgvb9K%Fly?53fM zs`p`xZf?YFteVko=B?qCYbM3{!GtR(OEMwsE|gaTM6B23yYW7zjJJ=yzMcPhI_I|En^tG(G1JqBpKbf(=pv{8fm80Vkq(vS9#pDbS?&X#;*Rn`fc$>`l{XXZSr`QkiB~M z=>$%i=InB0?_qdCh!u-^Oju`kTaJ9h)^sEW+QxXo;Sh#l73{;nq7tKN!D0o(Kh=p7 zYLSUQF^Iz*F+ABHZUfI)doFH%ZfefY_R-C{&N~Egh<^oZIcde@HSn0%_r+w=0C=6+ z421b^hWBd&#sH`V)bwvos9zSJDHZ|DTO*J;u6ew84C@6mj~cHJtBJ}3000ZefGW@? z!|?*J5{_dgkC|NW%2}hud;ngoN`qmJ>zc`H$m5#Fivi#PuOk6ZXJ=CY06^sc00000 z06--G00;m80Qsrt*A@T&H2?oe|Nm0||6>3DW&i(N|Nlk)bZcx0u^>jKnW$SAb7%`< zWJ!oQ$?1kHt3_qX1kCdeqy><(zkqq}9SdEx5P6uKsa@UOBme+_!*frPz62>+D(aD5 zFGt8SXKny7i3yinm4t+3Pdzz!CRH)XbPD9s1SShlxvse`6I8hev2d6HV}YnJWYT)+ zLUu&M@mFr*A@9F4@fHWg-SllZn$CgIzQl{hmR63|qA|ytKDXC%f8pPIEM47h7KzJAWN~OdH+R?&mhg-joS^ z;`Vc<+Dn>e>O%3MYQl72n#L3+Jl|V>(r8~P-&Wh_>dRC0*8k7>)8cb-XQxHCP7Y6M z*kR#>E`Z7EWIi>&q7RTQiC<8w2-IJZ~#n^-(NCqCiW_`7BX?!LwNKLFadlyf#C$Pw^vpA6KH=BLrk?#vY`I>1%4SJVymD_(UiR^K z;_08KH}jnR)c@Gc8>+GY!7*7-XGh?u6^Z zfHvf&;YeNsT%+`QoCyJda4|Eyn5qV#0se%W*cmB`Mu!kFQMg$gk)mkyXiQR$jhJvo z%fVPI$Xy`q0?3^VnCBgKn7nzO4ges{^E7!hfbIzZ0007!85Lz^lAc21E>`Y~i$;YD z6j)5O48#$nDUnJ=eWpY?g(eURgD%m8h!=uF%ndRV!cs!3G(l2ST;Tg45Qvo*l$TjZ zffm4zB!#Y<7!EBgWmXMkg%#xIrjTNia_!OHUwlwKzxIpeX>U*ECz)cfTEi3pR0RjN z;+Xm`!*;?36^p;ar^R-{icW_Q!y!H2t_4#KQ+H$L6w?^mX4)hsVQ)XUlh%2;!>(p( z@k34M!SKr7GC551dxTgfg3}hKb}9}Ht1r~`*L0KfVPlwO_}EQ)zFk8t!(sbi zOn1@~i~ot(@b&4zXYFHIwrr>Nmt}a$YLuU+i+WyNzwx)$o__O{S#)`Ha@NNbl248@o<3N|+b3l|Nw5D-)?qFPx1HVedvR}b zsQJ15jd-pr(x9inP{?*ywecV_ z>`vCicQxbJneZua-vDD$Q+k}a8gzEOt5 zD2ox|2mq>bTjsOk;J89})@#gFJ#%YM3J|ri`X8{!5I!Hl5CPokw4BA`2v;sH@<>)( z4dkKkkNGY7EdS{<}Vx)|Mqm==q_tU75p zv{=Q%w~Z;bro}264#nQjU;(QGi(jKK7pFrzK7}c^7QaRx-%f(*E$dqCTOm2Uo~uHA z$u@@${CH(?%+}dI*0Y^@PKI;ShLdVLvqQUQEfeY6oZ|Vowz$J#_Mpz{=f3Sf6BEYF z<{@l#G@aXT-zU+{`BSF-u4?gW{pR&L@qe7f$I8xMUCr1^v+UL%j z+?-vU+Uq-|VKoO`gDpRdogZUs&$;n=uO3+JwcT)=H z-d>NnPHnY&otIjy0RSrDb-zHIc+7+0dISgo zfB{4RK6GpPh>c=UF@mC7bKBSmCK)5RGeeO@8I?s*6lKPU3>E|IB1kjO-aOCqd;q}U zfLRzUUk%Lj0h1;r06@xsl|z&VJy&*OWixRTcu*!@5-FF3VnQKJ2?-HWC})}$ zWx_6+X(B??L4*R|nZIvVjsd5kDrwnEDDFl2#Nu`HFio>Itm^E!^cDT6i}ha;qX>eGK~VXHlVf7erF>mdsX?8V2~WuMq!UgWVs&b9 zcFdOrr~WOIO!e$+#YSxX&!A$eCCm~vVv5aF)4w5;lhd1nzfa&l2GdA;oOIIEwzU@o zF~l*$YUh}A8_s?P%u?Szj=kblu)?{F9|x0)?KJ<7UF8`EwJ}HQ!OpWEp6A5oW=@^j zEPcb$?R%W&9UH@q>Yb9C`M2|Oik}Htb@DL9tK*)h)5-J6viq%O&BfPY_4#)(bvDIM zZ#kH@^R}hNbNxZgW3oW6URyuj1F;XU5}mm^X7Ter$5}XWK30Kl0yG z^TB3gF~i$9n-8hkW=p@e|3A0g=hV)&m*Tv3b^Gf5ue^;Wh)A!Hc8~+aSr^+~5whqfYu6M7k z=C<%UCRf*Dm8uYmVljEG_sXy|EczQ)Lh<+}+soQcUASg|$Lj(PO9KFd>r5FgfY)q5 z$U9!S5?Gd+ifo`mcE79kQv0Z774 z?ixq{;Mg%XW(Cr2bZPAt)()g4fSKocnhyn_2*m-YL2v+WRG2)jSO_&(JHUMK0f1=- z=Wd@YHI zQ{^rqDGfMG8-yM-Gq|Fhh9eMCjt@sgNa5-Kdn>J)>0MqYN8PngPw*W`)%$o;+;=TI z>zle!${$SH46fH-nm<9UpAYEI5X=s{MJ1!7H#_rN2hsf({}byN^ZcMc+|{ezgNxPI zKfNc?GSezC^59)^d)W#EccW`k3y0lTx7&is17W+cDxFxadLeI&m9aiE0TPqn(DfR( zfhPNvM@q$wVyd<64UZwzW~u|!mw$^^jnX>E;Lx}IFq~nTRC~M0cHWvz|E@3lb~+kURNPH6 zm2h`0GSj`~1}r;za-vm>@|hRm;n(hZJPxCeTkC!uPIwlbO5{YI4sUW>yK;k#=c^j` zYvigrZ9f(B+BzXt7JY0s6XyqvPlj)N*S}Z)<~l!iw!LxvJ?hKR#^8FqTCa!U$99Rc zz0a@fs_`5j1f3}BHJ+Y7%hSvGy%@D@d))rG=^U3Q5>G*OF>Y*)38(GWy^1xCzMVDH zk2j%e5z~vUobeX^0j(U&>*8_DW1|pQUj5EuYmk{E!%$iMJ~REsi)IzEooaf#@`3}d zM}{NUfc&jq-&bj7234?Sr57h%;WdvHmjnP_bnEUK2n_&+Zp~kl2n+yjk!=YSMJyud z9Or=@qg~*T!7PbkAxP%go920u)`~*{K;+>S07&xzFo1wcQ+jX00837JIGit zqOOA!mbr-a%1ZYmLzV0OnD|_v!k^(SdOJmlc`^k71MUd!aji;wv5RII3t6HA zqOBDr!W4l^RFtMbi>0VCQbSCX5-q!y{~mb8ro3$mi4EQ3iQW6%cg*@zu`S!z&6)9T zTSg|`yW?%VJNquN+5I=-Tz6bGIVqiOdo_y+iIWq}iU70Z?V9ul(kza>SyWFd@#3?+ z==C6DsdFZF+h6+T^sIUCG>Ll0pSJc?pTwTovMj8ewSN61G#;MjbxnpPnrsC-2%Z%c zg>)S`mz_hKw)k7s5E*5_^ySYmOmp0JbhaOi%yGn<4r`m{44yINpw5SdY@B%NyUV2i*BR?gxAy*X`SIDw9FgC}muFZX&pg(1*S>D@woDAJH_!7& z{Bxp=tFQm(^2O=-cJtI>VDeyQqcz<&csxnDmdG(L@_N4aQjzo2U!&@Ed;qg+MOO?2 zUZ1WjnIl{WaH37&IAih&Am8e#Ey^252-ovcRC1~zna7JO12Z2W*9)G)2H~0`fxg~dtj06d%1BcycJMEe|wYdmjo(~|Lz|M=7*fDP`m==Hq z0tcV~ETAwipfGz=cNYNw06>nk)FlDP;xt``QsEE*ts)*pFG-z5iqkB@67-fll@KwZ z3TQE}iikF45Gue#7SKWod*z^E0Jz+Uh#1QiM*1mQ;ZW`sG|`s!U2g6@EEtQb_qu9w zSyabYknMsZ&U#lW?h%{+-%aV;24%q4i*KSe>&lB8@n(t#GE>1eRWin(YN*x(x7yM)F3H?#L$S+ zEnU*3bazREfOL-1BAr8nq%w33Juq}Ph}1XU?{~lNu66fc`;W8Ub&izm@kMZAT z;ex^p+wxrEoW(6g_~3jS{q55hh$EN72kvtP2<9k4Y}3vnSjg=%q1X7L94a;Ddv3O3 z9jql47z4gGjK578Sr<$cUyE%X`0ITE=4NaZaT|J=gta>d?*oI}LGVdW$}D45;)&do zX>|q5uzUgH&e}|XwsN9ThOTr!sJgu2gULEdr~yos%$JDI00)R{(O@B5x0BP8Val5s zAx0kX|bHw-+gXzCuJQ~SWta@ z)P8&f|5t@U^zr!d{Bcb(Jm;Po2jD{AGjfE(`aJa9ypcke02>rDi~`k*4X=ogh;GSlcZtGTCk3%l|}A9s~*>43*Lm;S!oaye53V^abt| z=mW-c@Tjlk#EZYT+J?654m`AcT&Y~IIK|cZNXv*}Ob+wUjL;IEq(4X!;w*jtMEl*d zd=9>F-ifZ)xL-#4Y-T+^ z6~oSFZA=@z>-suR`QfM1ycv`I1s9tE*qq;LF6=vf+u2s9S2J=aGo;zpd;)K_IK|C$ z&x(Ue*UbPVnW5|NLYrB2SD(DX9v;RMMX$t;7I<){9kG^Hc%j|>)X~EhTMGcD^NMjv zinmUP$lZS8GJL)?6+i%BWe3CoulG{$??Y&Pc=SUSP*6XN26)-O&#uhxJ3(bK$?5u= z<|NOqbF%QQ#@zDZ(y-LwWOVPrH*Z&!yngqPMYm9Da?p;jgpPZ&^|DORHqv4^G>cb1wMsgu8l z@b?)ne+(=`XWAv0GG{Jby>|xbLiOu(Zt(Mw;PRo@zsnM>~)RRmdc)e>dvRHVEX z*$?8GE`55+wxK#b1K)ZFsOufshOIn=^afQC5N?QCc(9mJ6u9M&uqsODAk`^r-)%$u zP(*i3cd6^0k1J;aVyWWj>uuwc;7b%usNJpjn)ZCdblcH@Hur8RqaFw?b*@@!=Ypp7 z7z5#m`Q{nVvQxL~4)0c22YF8Nkm6U*hv~a&*T>U`_x`s7)ANOw4x9;Nho7%44YpdS zZ$H>Ts!d>jknJ8-^g(nRqFhEF%Kbp+zvw`nX{CludIWumYQ&D;tx2Stn(?`^*1ms# zJB_tv5$GzReau`OX}KdipvxT~r%AGzic;cWkxmeKQ<)ix*)3j$!H`6E&J1t|#{neY zF5YK{r=ZbAxs)!ZD4?X^<6Mpyo{8aZ`QmnqkKuP8(3+hQg`hFu)4HIP<~Kf9X`zDM zH`$_0GsWr#6)@o#*?EfRKv7LkyAvFp*=q)~d{Uq$2 zi@Z=>7+HbqJ-nP$;7EikzSu9&qUowL9es&G;#%LcKIW0b_62!NewjbI&oMs>6ZCx+uTctQW@M+zzX}OcM>ezCRqQ&TzCyYKu4p6<*(T*M-L?x>`$!3 zu!f^rCP(uJKGPDHGP2hP<~n7ScpgFjI(m}eUo{Is%16DB(*h2*b6YUQ{f*j#o}!YG zx0j>1rlM^YPG6heKo|khyP~qzB2Jhn7f`Z3WHmbHd@agcuiWtG|+8ywE%Es6$SIor7UJ|q|9H{BW zM=6$wJKI~=8qfaVT>6R&;eU!)>HCqaC0CODoi5VZMmXicJP+ZXx4KoZorb)mJQDXC zm2CEb<9pwnHlMD#UuW%bEwXPV($;VHjz6BYZnq-ZT!KQ+8B0b>21(cggYSi78_BN6 z_5)kAKb(SFD~?Plyno1k?>E>=k!=y{!!G~$GdYb^n27duNHeddO8mDRkO|GR4;v_b z#vn8*52G3T5TPaiJmP-zgf-bqBKn^eR%b@f!_Y)S4gN&Lu_>}rnqvYw-{fpExB$RM z<2JsS1OTEa)j4_-!&{Y6Gj=M_FDbGQ8N(nvG<&CZkyzrzi z-BIkdxfTjA&cS_q*o_4m8ffsQu(kD{;0wTV&t_jP{5d@VCu0nzeem9isha1PqlI_< zg+jjywfvpnwwhcrUsj({37BuK?|prGx7)TrYig2q$(1m6xgY*m#vZ>5UC;v?wR>K6 zWcfd>|0n)ZZkj?mdLYprcoX5_TJ%zN4C zs}5;x>+HFe4_5@->UGZF3=OjX zDtdjkxuHM_C*|?i=hKK8Na4@|rJoF9)>IL_>dfKoJVgcads8)GPTxJ6|`{v_; z2v8VI61(hQQ|i%8b2*(?K;8HQ>yZc|I7Te&n2J?>?bzcWGNA0pC>U;j6!4M!NDDy&0Cbad@VKo_yA1*9DAU5u+w!0>xk5 zVAppDda0Elou@;dDJ!R_8==Kd@M z@9fXR+kk@cDZADO?%GR=^`@Ddj^JNg*Im<&OUIrk;aZQe=;8>Ga7fTfF8w;Un+8B3lJ(fQ+jLbEHjAoVb{$ z&EKx6vn1`~@cEf=(y^RSq^#6-g?veoehL6QxaUk-zj-p=?YSeA0gJ@@77@Asb0SZk z2A=}+fHia5{!8}~WLq^wxQ)<^bC3YFU$EMAqW`=CDi;|OA=5C$WpPwiQ3~#O#D>qG z;pG*{hCi7?2eRc;)#IoFqU)k*t&gO6ESUKCM=)`wJU!OkXFV&w5w9(Nv2=7*Js3oD zC2TbO+=R`C?d{T)u@)nqRG7PBHFMbGB243-Ew&LC!Y!}`L#+(C7WO&E&{m_ zBQ}RkKL9~Pf^?}`bfQn?W`r}*KSGb*Y^N> zukA@M6<39R{Kg6~iR*>)t5rDo?co#Nyvq)cTaxBxHQ8T+#)D}u7%2+*6S-jijq9R{ z?|V77RsmIm+{*@ccmO>_JG(k2RlMsvK79c#YK{$Ty;z1y+6FKN;^+bqVCR7SVjLI9~u(?VUK7&1b zW;0^E=p&{g2DPfpLGVj+!Q8;I$QM(02Q;?sG8%8#sg1FB{|*%!?XNlti8K*k$!8aD zPi_bv$&ei;V}OLZEL=AZarA(-Oz(w=3%{M)SN;NKu#QQXioua?qSHlzcfRvbPevGv z6@B~HjsU-b1GC&$gY3?qlO}fF8%4o4gn40}^B}*#(W6Vj##c8EaqNvj8B<*muqBR3 z;d<}@^AMt?rTO}{ZM*ibB53xL`=j{PFVA{wf{`BQD5b0YqQ@l@-r@&%%&)Kd!*(zK zEQ4JdAwl$BQy=?8ZN(cB0*DEf&f5~q6EeK&8R>=<%00y}0XwztR+Rx!URZogVH1rB zLyA=6#ZHE}_<(1~3t9q{K*a6@5tW@`Tp*QbG+@QuXwP>Zs9>jNG}pM@)NroEhGX{w z={ILEu%Kv;Ao_VgFU^|N?wj4VjFog%qPBwq$^(XVMjGW2DGi)Sqh@GpZko}WoyH`j z-dq6-(YLDlZ-XG6=bobLiBmJ%-WDg(DnQ2iX^j^M~?6^ zzmB$4ua0nkkE+OI=T*NDalVfBrd9kKuKlLYKySBKu7L`RrOHNzfe{q7cM$hoD_7

                                    6M9-HaNS(^VE&-pVw9zm@39bjNsG4Dq=ayks_~lYLD-H}fv;72 z+>5=MV9gG114^YIG~jV6i|jLq(L|DmTVx_u8_?9^ItxMoz{ZSRca+gA^oi2FljS|) zv~}6=`24&Z)eDitt&%VqAKwRU=K(T)9647ILo88<0EXEN1Hyn9|3$jNT$KF(#gczH z-3~|Dhvc#KvEb3ZT$z;-?LP)_U!1+6BUaK7tZeDN-1a&=x78@doJrz#k(ih_F(5b4 zO#i|pGsjc|4tdf>hl&GvZu#z<{Wd5%IiR@`JWLS7z-F($$U9MyE$Cu(V+|7rjLaRA-9`G50 z(Iu`)HI2*|5$G~e)j>FlLHVp<0*CP$S|#~emHwuiEZI#;BQzk0b(V(Zo>faw+M{n| z4n%4l+{*09A)u!&wxFtiRa}}zIdk;eNJF_&R{+p6wUg z`S#7P^<&&kk^WoD1ge=HT5Lx3yAU&Gb<9H<01ZQL^1&Eb4gYc=Ce3Bd8O1HrAI8!Nl6DR>WZ z=IGanPKMcui2rSmn z4T(fjajp^f zGOzpN!b<4g9mn1;3pTD#ew$>FjYy-7IGL%|P%QDXWJynogyo$V=VakS6I+sU$3hi|8>wuWCm7%C!}fAW4D)gbp1(FmG(QVr{OJ=dZCRX zNukS_m9&ihqV)5dqZVq0S$RPNO2%Z`&7o*6=_9tJudx%e05}Ayod5<8f1dTHnB(1o zJ6DDSj5yyy_kU)JhpmsJI`ka0Bv8xqf)xLqqG+vK@>hPqe*D_xaGKMwZ&%-WB;Ke{ zlv-2d{gj^xl_0u1w9B4oN}xM;UdYQ`f%b!XcLi!rMZoH{wPE?Xh!T-zN#?0s!dE7= zgOR%qUp$(efDR=^YX{*YW@>7Uf2DR+h3yTe8*2TC4*KT>DzHd{41g+AaslSH#|Mh4 zu6wc{W9CHd6XdE2-wK7d%L!L)tL6ctXOL*@XL+W05ytAW=DW>yG2ccE>@XYx=lf%U zh2|~Ry8~{ILnCKI2QHXON`Uy4W0vL6WbH=?u;T*xJgvU!!=>&A{-NNVtGSfUw94Df z_z{B5q-qMeIG%dxXDSP&GixuVBLCn~b#p;59~~63f6sE&9RGe}BT%vhN}4uO$jb1+ z$sNk#eu9S{FjWjfC-YxlUckg)>Cg0t?<~1AI#~4z0nXrFDcq@GT2ui zZs@`NFOz<=ni*8wO6gz`sZ-+)o08Otti8r1c)L(K&TKdGgoIcs6#aisRY@S3 z^)+gap*YggfPVoyq!f?uJZH*1_-MGJ5%~5)aM?SvFA&b|h$pM)_}$npX!z7Fp-+tg so$mfe_k^fbxBhd8P!8w6wf@JX(PE8<|L>c@|DR+2C4&EFME|k>15<02(f|Me literal 0 HcmV?d00001 diff --git a/Sounds/Survivors/Technician/shoot1.ogg b/Sounds/Survivors/Technician/shoot1.ogg index 6bfbeeb316c3cdd369b1cdf95c02c20afaed25a9..734976d94273ab1bf9aab5c468fe9f25009018a7 100644 GIT binary patch literal 14011 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 delta 12629 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%0AZ}Pi#--7(975*jrw1>R~aSa{5o$H~qmZ}N! zt>9Ao;fatPxYZ*qcK>w1(&6rpr!zOSNBujNMR7}KFS}Wk$n_>byc9R9)NTC}F-k@r z!+Je)tJj(vJFEQQn0sdw=FNf?XOt_Ugw;b%B)hk~Lg?2G7b-89<)t}HA+ciN{DiRz zZ-33ea$Jn@=C2DjyXKymgZl2esd}$rckabl0b~_9_tMj@N`hR{D7)%g|2OwO4hEEGxR8l2qgO%B+HpfZT3YgNkn zx9K@L9*7jt-@OmKK@)5zVAIv!2lhn{kVP}SMTDuuu#OKE<``eD%6@dqdH0r)khu*E zp$TGs6{-SlGqS2CX9zKDbJMcDCr4X}f#AQNPsd{zd4NaVs*LYaX?!B5j{^~LO?1r=X zf_$W__Qh;c6@3@Ue(_W=pH$~f+_~kIEs>$qKLaugu|0v7+x2LPxm8?QHnHsvPA3eY1$tn+{~87Ar}} z5IyIMC0&|p$|9efqWyotyZj&{cPOMSJetcUejfHuha%=m-?;X^nBd-v+%pe7*}K@3 z2NDPX=ngM-uj)5&6vIV?10lMKhn7GLkA27isqmPE1;e8rNrrQf6$SliwMG|~nLfV{ zGDceX&B}FmqO<4QWE)G*PJf>jY$^%4Ggndl82!<_vVT)JV(O6pThX@7l;9gwGjfP{ zri$!r^T=-ZIVJ9W$;WEaH2rc1t%?%B*VGwLDg@^t@n>z7PQ z9SZdIk1&O&JKNl#FwuuyE+_ZV>9wJ2oEi{Dxn&~e#pP-xL3-&fiu*XVuH4_!T8EYT zG-?-J-HUsa@$X0yz!=GZ$Kh`#8p5xKlVIuL>=Q8gh*!#kcq7}uc5M=`w6u}e%)v1f z5v-JOAc3%AbNqfBHa}}t(|HCnukdnnudUFB5dzi_25yk*ikGW&heep_<_Y^c5voHx z0j1WyE74l$7U+CFOb?$dwbE<+_9UOgFtz}}ltw98gV%v@Jv?>~(!i@ZcKPjSF?GmU z{vmHI?S`9{tAzELsE5y!zJp*FXT{HF`$(i0oX3AYxMeTw3;x?5u2Ha4%DS1JoZp(t zR74=)@!{nT7vt#<<@)J*E`la6TcE4w-2NiSh>z+Fd!v2uA$S-W?kZ6=gNjBD+keE%Q6u*?oZKX zGT0Bzz-@re)7p+$5htwYe0tZ6&^p|Z8l^Vu_sIEOrt*qU=W(j^Wi&sL8H(t`p1%>+3zG_ZLIGpeJWSfG$zz>(?Hm0uy-JTlDS)_FPM9+u0 zIGGNzMjqdHARc}A6#OIsmzPYjkFyU(c^9|fp^KN^fR+-O`7Z>^EvF)*I8wbm!``eDz`;XY>oDjZNGy>{m zTHOXV@5^N#T9!P_;u-SoU-#{hiG{yAY~rvXE3pz7_1zv4FN@z+?SC^z`H9}heiiBb z{o8=!8uP$I^|WFVG64GFT<(ks@6N|SM|A56IhM&oPqBB17&t5?DT^cNUz)I&@mW(h t^JVu;%?^UwB}={Q^+65`N4dNCTCVHcI72rqMz-y7M(Ly;i(1= gm.sprite_get_number(inst.shoot) - 1 then inst.playanim = nil @@ -473,7 +463,6 @@ obj_turret:onStep(function(inst) inst.image_speed = 0.2 end if gm._mod_net_isHost() and doResync then - --print("tried resync") inst:instance_resync() end @@ -542,14 +531,12 @@ obj_turret:onStep(function(inst) attack_info.climb = i * 8 * 1.35 end gm.sound_play_at(inst.upgradeState >= 1 and sound_turretShoot2 or sound_turretShoot1, 1, 0.9 + math.random() * 0.2, inst.x, inst.y) - --print(gm._mod_net_isHost()) if not Net.is_single() then if gm._mod_net_isHost() then local buffer = turret_shoot_packet:message_begin() buffer:write_instance(inst) buffer:send_to_all() else - --print("yes I'm also working 2.0") local buffer = turret_shoot_packet_host:message_begin() buffer:write_instance(inst) buffer:write_instance(inst.parent) @@ -565,7 +552,6 @@ obj_turret:onStep(function(inst) missile.team = inst.team missile.damage = inst.parent.damage missile.sync = true - --Helper.log_struct(missile) inst.missileDis.image_index = 0 inst.secondarystocks = inst.secondarystocks - 1 inst.secondarycooldown = inst.extrasecondarycooldown @@ -610,7 +596,6 @@ obj_turret:onStep(function(inst) inst.secondarystocks = inst.basesecondarystocks end end - -- print(data.cooldown.." LOUD INCORRECT BUZZER") end if inst.skin_layer then @@ -677,7 +662,6 @@ stateDrink:clear_callbacks() stateDrink:onEnter(function(actor, data) actor.image_index2 = 0 data.sprite = actor.__ssr_current_drink_sprite or drinkSprites[technician_id][1] - --print(drinkSprites[actor.class][1]) actor:skill_util_strafe_init() actor:skill_util_strafe_turn_init() end) @@ -732,8 +716,6 @@ obj_vending:onCreate(function(inst) end) obj_vending:onStep(function(inst) if inst.parent and Instance.exists(inst.parent) then - -- print("TRY AGAIN!") - -- print(data.hits_taken.. "hits taken") local height = inst.bbox_bottom - inst.bbox_top for i = 1, (math.floor((inst.vspeed + inst.gravity) / height) + 1) do if is_colliding_stage(inst, inst.x, inst.y + inst.vspeed + inst.gravity - height * (i - 1)) then @@ -812,10 +794,6 @@ obj_vending:onStep(function(inst) inst:instance_resync() end for _, player in ipairs(inst:get_collisions(gm.constants.oP)) do - -- print(player) - -- print(player:buff_stack_count(data.buff).. " buffmaxxing") - -- print(player.team.. " this is our team") - -- print(inst.team.. " vending team") if player.team == inst.team and player:buff_stack_count(inst.buff) <= 0 then gm.sound_play_at(sound_vendingDispense, 1, 1, inst.x, inst.y) player:buff_remove(buff_vending) @@ -825,7 +803,6 @@ obj_vending:onStep(function(inst) player.__ssr_current_drink_sprite = drinkSprites[player.class][inst.upgraded and 2 or 1] player:enter_state(stateDrink) end - --print(player.state) inst.playanim = 1 if not Net.is_single() then local buffer = vending_shoot_packet:message_begin() @@ -875,24 +852,21 @@ obj_mine_pull:onStep(function(inst) inst.ff = inst.ff + 1 local targets = List.wrap(gm.find_characters_circle(inst.x, inst.y, MACHINE_MINE_PULL_RADIUS, true, inst.team == 1 and 2 or 1, true)) for _, target in ipairs(targets) do - if inst:attack_collision_canhit(target) and not GM.actor_state_is_climb_state(target.actor_state_current_id) then - -- move_contact_solid(target, 360 - gm.point_direction(inst.x, inst.y, target.x, target.y), 1)--(0.5 + 0.5 * data.life / 120) * (1 - gm.point_distance(inst.x, inst.y, target.x, target.y) / MACHINE_MINE_PULL_RADIUS)) + --Check if we should pull the target + --Pulling is weird with ropes so climbing enemies are excluded + --And intangible enemies are usually doing special behavior so best not to interrupt + if target.team ~= inst.team and not target.intangible and not GM.actor_state_is_climb_state(target.actor_state_current_id) then local lastx = target.x local lasty = target.y local strength = math.max(1, math.ceil((0.5 + 2.5 * (1 - inst.life / MACHINE_MINE_PULL_LIFE) + math.max(-1.5 + 3 * (1 - inst.life / MACHINE_MINE_PULL_LIFE), 0)) * (0.2 + 0.8 * (1 - gm.point_distance(inst.x, inst.y, target.x, target.y) / MACHINE_MINE_PULL_RADIUS)))) - if GM.actor_is_classic(target) then + if GM.actor_is_classic(target) then --Classic enemies (Eg. NOT Jellyfish or Archer Bugs) are pulled horizontally to the center of the pull target:move_contact_solid(180 + gm.point_direction(inst.x, target.y, target.x, target.y), strength) - --if target.y < inst.y then - --target:move_contact_solid(180 + gm.point_direction(target.x, inst.y, target.x, target.y), strength) - --end - elseif not GM.actor_is_boss(target) then - --print("i'm not classic") + elseif not GM.actor_is_boss(target) then --Non-boss, non-classic enemies are pulled directly to the center target.x = target.x - math.cos(math.rad(gm.point_direction(inst.x, inst.y, target.x, target.y))) * strength target.y = target.y + math.sin(math.rad(gm.point_direction(inst.x, inst.y, target.x, target.y))) * strength - --move_in_direction(target, gm.point_direction(inst.x, inst.y, target.x, target.y), 100) - --target.y = (target.pVspeed > 0 and math.min(target.y, inst.y) or math.max(target.y, inst.y)) end + --Prevent overshooting on both axes if lastx < inst.x and target.x >= inst.x then target.x = math.min(target.x, inst.x) elseif lastx > inst.x and target.x <= inst.x then @@ -918,8 +892,6 @@ obj_mine_pull:onDraw(function(inst) gm.draw_set_colour(color_tech_blue) local a = inst.ff > int1 and (int1 * int2 - (inst.ff - int1) * int1 / (MACHINE_MINE_PULL_LIFE - int1) * int2) or (inst.ff * int2) local t = math.min(inst.ff > int1 and (1 - (inst.ff - int1) / (MACHINE_MINE_PULL_LIFE - int1)) or (inst.ff / int1), 1) - --local a = (data.ff * 5) - --local t = math.min(data.ff / int1, 1) gm.draw_circle(math.floor(inst.x + 0.5), math.floor(inst.y + 0.5), a + (MACHINE_MINE_PULL_RADIUS - a) * t, true) gm.draw_set_alpha(1) end) @@ -1151,9 +1123,6 @@ local healable_survivors = { local healable_objects = { Object.find("ror", "EngiTurret"), Object.find("ror", "EngiTurretB") } Callback.add(Callback.TYPE.onAttackHit, "SSOnHitTechnician", function(hit_info) - --Helper.log_struct(hit_info) - --print(hit_info.attack_info.__ssr_technician_no_expose_proc) - --print("Target id: "..hit_info.inflictor.id) local expose = 0 if hit_info.target:buff_stack_count(buff_exposed) >= 1 then expose = 1 end if hit_info.target:buff_stack_count(buff_exposed_2) >= 1 then expose = 2 end @@ -1162,7 +1131,6 @@ Callback.add(Callback.TYPE.onAttackHit, "SSOnHitTechnician", function(hit_info) attack_info.__ssr_technician_is_expose = expose attack_info.damage_color = expose == 2 and color_tech_orange or color_tech_red attack_info.climb = 8 * 1.35 - --Helper.log_struct(attack_info) end if hit_info.attack_info.__wrench_hit then @@ -1175,21 +1143,12 @@ Callback.add(Callback.TYPE.onAttackHit, "SSOnHitTechnician", function(hit_info) sparks.sprite_index = (hit_info.attack_info.__wrench_hit == 3 and sprite_sparks5 or sprite_sparks4) sparks.image_speed = 0.33 sparks.image_xscale = gm.sign(hit_info.target.x - hit_info.inflictor.x) - --sparks:actor_skin_skinnable_init() - --sparks:actor_skin_skinnable_set_skin(hit_info.target) - --sparks.skinnable = 1 + sparks.depth = hit_info.target.depth - 1 end end) --Hook from Needles gm.pre_script_hook(gm.constants.damager_calculate_damage, function(self, other, result, args) - --print("HIIIII") - --print(#args) - --for i = 1, #args do - -- print(args[i].value) - --end - --Helper.log_struct(args[1]) --Hit Info - --Helper.log_struct(args[6]) --Player local _hit_info = args[1] local _damage = args[4] local _critical = args[5] @@ -1199,6 +1158,35 @@ gm.pre_script_hook(gm.constants.damager_calculate_damage, function(self, other, end end) +----TEMPORARY: Will be removed when a proper solution is added to the api +--Plays the survivor's selection sound when being selected in the character select screen +local localSelectMenu +local playedSound = false +gm.pre_script_hook(gm.constants.game_lobby_start, function(self, other, result, args) + local function WaitForInit() + localSelectMenu = Instance.find(Object.find("ror", "SelectMenu")) + end + Alarm.create(WaitForInit, 25) +end) + +gm.pre_script_hook(gm.constants._ui_update, function(self, other, result, args) + if not Instance.exists(localSelectMenu) then return end + + if localSelectMenu.choice == technician.value then + if not playedSound then + gm.sound_play_at(sound_select, 1, 1, 1000, 100) + + if gm.audio_is_playing(soundCommandoSelect) then + gm.audio_stop_sound(soundCommandoSelect) + end + + playedSound = true + end + else + playedSound = false + end +end) + -- Wrench Whack technicianPrimary.sprite = sprite_skills technicianPrimary.subimage = 0 @@ -1257,16 +1245,11 @@ stateTechnicianPrimary:onStep(function(actor, data) actor:collision_rectangle_list(x, y, x2, y2, gm.constants.oCustomObject, false, true, machinesHit, false) actor:collision_rectangle_list(x, y, x2, y2, gm.constants.oCustomObject_pNPC, false, true, machinesHit, false) -- ^ finding all machines in machines table that collides with the explosion to upgrade - -- print(" Machines ") - -- print(tableToString(machines)) - -- print(" Machines Hit ") - -- print(tableToString(machinesHit)) for _, machineObj in ipairs(machines) do for _, instance in ipairs(machinesHit) do if machineObj.value == instance.__object_index then if instance.team == actor.team then upgrade_machine(instance, 1, WRENCH_DOWNGRADE_TIME) - --print((machineData.hits_taken).. " Hits Taken ") end end end @@ -1509,17 +1492,17 @@ technicianSecondary.use_delay = 10 technicianSecondary.required_interrupt_priority = State.ACTOR_STATE_INTERRUPT_PRIORITY.skill_interrupt_period -- big red button -technicianSecondary_2.sprite = sprite_skills -technicianSecondary_2.subimage = 2 +technicianSecondary_Det.sprite = sprite_skills +technicianSecondary_Det.subimage = 2 -technicianSecondary_2.cooldown = 0.5 * 60 -technicianSecondary_2.damage = 1.0 --This damage isn't used for anything, only the original skill is -technicianSecondary_2.require_key_press = true -technicianSecondary_2.does_change_activity_state = true -technicianSecondary_2.hold_facing_direction = true -technicianSecondary_2.auto_restock = false --Makes stocks not regenerate by themselves -technicianSecondary_2.use_delay = 10 -technicianSecondary_2.required_interrupt_priority = State.ACTOR_STATE_INTERRUPT_PRIORITY.skill_interrupt_period +technicianSecondary_Det.cooldown = 0.5 * 60 +technicianSecondary_Det.damage = 1.0 --This damage isn't used for anything, only the original skill is +technicianSecondary_Det.require_key_press = true +technicianSecondary_Det.does_change_activity_state = true +technicianSecondary_Det.hold_facing_direction = true +technicianSecondary_Det.auto_restock = false --Makes stocks not regenerate by themselves +technicianSecondary_Det.use_delay = 10 +technicianSecondary_Det.required_interrupt_priority = State.ACTOR_STATE_INTERRUPT_PRIORITY.skill_interrupt_period local state_technician_secondary = State.new(NAMESPACE, "technician_secondary") @@ -1538,11 +1521,8 @@ state_technician_secondary:onStep(function(actor, data) if actor.image_index >= 3 and not data.used then actor.tech_saved_stock = actor:get_default_skill(Skill.SLOT.secondary).stock - --actor.tech_saved_max_stock = actor:get_default_skill(Skill.SLOT.secondary).max_stock - actor:add_skill_override(Skill.SLOT.secondary, technicianSecondary_2, 1) --Replaces the secondary with a new secondary (Remote Detonator) + actor:add_skill_override(Skill.SLOT.secondary, technicianSecondary_Det, 1) --Replaces the secondary with a new secondary (Remote Detonator) actor:get_active_skill(Skill.SLOT.secondary).stock = math.max(actor.tech_saved_stock, 1) - --if actor.tech_saved_stock <= 0 then actor:get_active_skill(Skill.SLOT.secondary).max_stock = 1 end - --actor:override_active_skill_cooldown(Skill.SLOT.secondary, actor:get_active_skill(Skill.SLOT.secondary).cooldown_base * (1 - actor.cdr)) gm.sound_play_at(sound_shoot2, 1, 1, actor.x, actor.y) @@ -1563,11 +1543,10 @@ end) -- blows up mine with mind... -technicianSecondary_2:clear_callbacks() -technicianSecondary_2:onActivate(function(actor) - actor:remove_skill_override(Skill.SLOT.secondary, technicianSecondary_2, 1) +technicianSecondary_Det:clear_callbacks() +technicianSecondary_Det:onActivate(function(actor) + actor:remove_skill_override(Skill.SLOT.secondary, technicianSecondary_Det, 1) actor:get_default_skill(Skill.SLOT.secondary).stock = actor.tech_saved_stock - --actor:get_default_skill(Skill.SLOT.secondary).max_stock = actor.tech_saved_max_stock actor:override_default_skill_cooldown(Skill.SLOT.secondary, actor:get_default_skill(Skill.SLOT.secondary).cooldown_base * (1 - actor.cdr)) if gm._mod_net_isHost() then @@ -1579,7 +1558,7 @@ technicianSecondary_2:onActivate(function(actor) end end end) -technicianSecondary_2:onStep(function(actor) +technicianSecondary_Det:onStep(function(actor) actor:freeze_default_skill(Skill.SLOT.secondary) end) @@ -1593,9 +1572,6 @@ technicianUtility.require_key_press = true technicianUtility.override_strafe_direction = true technicianUtility.ignore_aim_direction = true ---local stateTechnicianUtility = State.new(NAMESPACE, "technicianUtility") ---stateTechnicianUtility.activity_flags = State.ACTIVITY_FLAG.allow_rope_cancel - technicianUtility:clear_callbacks() technicianUtility:onActivate(function(actor) if gm._mod_net_isHost() then @@ -1604,7 +1580,6 @@ technicianUtility:onActivate(function(actor) local oldestID = math.huge local oldestInst = nil for _, vending in ipairs(vendings) do - --print(vending.id) if vending.parent.id == actor.id and vending.id < oldestID then oldestID = vending.id oldestInst = vending @@ -1619,36 +1594,8 @@ technicianUtility:onActivate(function(actor) vending_inst.team = actor.team vending_inst.image_xscale = actor.image_xscale vending_inst:actor_skin_skinnable_set_skin(actor) - -- move_contact_solid(vending_inst, 90) end - - --actor:enter_state(stateTechnicianUtility) end) ---[[stateTechnicianUtility:clear_callbacks() -stateTechnicianUtility:onEnter(function(actor, data) - actor.image_index = 0 - data.created = nil -end) -stateTechnicianUtility:onStep(function(actor, data) - actor:skill_util_fix_hspeed() - local animation = sprite_shoot3 - if not data.created and actor.image_index >= 4 and gm._mod_net_isHost() then - local vendings, _ = Instance.find_all(obj_vending) - for _, vending in ipairs(vendings) do - if vending.parent.id == actor.id then - vending:destroy() - end - end - local vending_inst = obj_vending:create(actor.x, actor.y - 4) - vending_inst.parent = actor - vending_inst.team = actor.team - vending_inst.image_xscale = actor.image_xscale - -- move_contact_solid(vending_inst, 90) - data.created = 1 - end - actor:actor_animation_set(animation, 0.25, true) - actor:skill_util_exit_state_on_anim_end() -end)]] -- Radial Amplifier technicianUtilityAlt.sprite = sprite_skills @@ -1697,7 +1644,6 @@ technicianSpecial.sprite = sprite_skills technicianSpecial.subimage = 4 technicianSpecial.cooldown = 9 * 60 technicianSpecial.damage = 1.8 --- technicianSpecial.damage2 = 0.7 technicianSpecial.require_key_press = true technicianSpecial.does_change_activity_state = true technicianSpecial.required_interrupt_priority = State.ACTOR_STATE_INTERRUPT_PRIORITY.skill @@ -1709,7 +1655,7 @@ technicianSpecial:set_skill_upgrade(technicianSpecialScepter) technicianSpecialScepter.sprite = sprite_skills technicianSpecialScepter.subimage = 5 technicianSpecialScepter.cooldown = 9 * 60 -technicianSpecialScepter.damage = 15 +technicianSpecialScepter.damage = 1.8 technicianSpecialScepter.require_key_press = true technicianSpecialScepter.does_change_activity_state = true technicianSpecialScepter.required_interrupt_priority = State.ACTOR_STATE_INTERRUPT_PRIORITY.skill From 92613e6a6e874a210376eb141535d0e8633d352e Mon Sep 17 00:00:00 2001 From: AGAININGTRYING211 Date: Sat, 31 May 2025 17:10:29 -0700 Subject: [PATCH 4/8] This never happened --- Survivors/technician.lua | 31 ++----------------------------- 1 file changed, 2 insertions(+), 29 deletions(-) diff --git a/Survivors/technician.lua b/Survivors/technician.lua index 470c9018..e972761a 100644 --- a/Survivors/technician.lua +++ b/Survivors/technician.lua @@ -175,6 +175,8 @@ technician.sprite_idle = sprite_idle technician.sprite_title = sprite_walk technician.sprite_credits = sprite_credits +technician.select_sound_id = sound_select + technician:set_palettes(sprite_palette, sprite_palette, sprite_palette) technician:add_skin("TechnicianRose", 1, Resources.sprite_load(NAMESPACE, "TechnicianSelect_PAL2", path.combine(SPRITE_PATH, "selectS1.png"), 18, 28, 0), @@ -1158,35 +1160,6 @@ gm.pre_script_hook(gm.constants.damager_calculate_damage, function(self, other, end end) -----TEMPORARY: Will be removed when a proper solution is added to the api ---Plays the survivor's selection sound when being selected in the character select screen -local localSelectMenu -local playedSound = false -gm.pre_script_hook(gm.constants.game_lobby_start, function(self, other, result, args) - local function WaitForInit() - localSelectMenu = Instance.find(Object.find("ror", "SelectMenu")) - end - Alarm.create(WaitForInit, 25) -end) - -gm.pre_script_hook(gm.constants._ui_update, function(self, other, result, args) - if not Instance.exists(localSelectMenu) then return end - - if localSelectMenu.choice == technician.value then - if not playedSound then - gm.sound_play_at(sound_select, 1, 1, 1000, 100) - - if gm.audio_is_playing(soundCommandoSelect) then - gm.audio_stop_sound(soundCommandoSelect) - end - - playedSound = true - end - else - playedSound = false - end -end) - -- Wrench Whack technicianPrimary.sprite = sprite_skills technicianPrimary.subimage = 0 From c24da3f3fd48ae6db613fdae79f81ba04a2290aa Mon Sep 17 00:00:00 2001 From: AGAININGTRYING211 Date: Sat, 31 May 2025 18:00:35 -0700 Subject: [PATCH 5/8] Ooopsy --- Sprites/Survivors/Technician/log.png | Bin 0 -> 12346 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Sprites/Survivors/Technician/log.png diff --git a/Sprites/Survivors/Technician/log.png b/Sprites/Survivors/Technician/log.png new file mode 100644 index 0000000000000000000000000000000000000000..8f3c472a037e4765c98ea3089e5f72376bd4dc92 GIT binary patch literal 12346 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 F=x~D1EI@T%#7U0)0LMjP;lAXybX@ zY8<-C8w=k2SF`(AHq>PR!tFUw6ea!!LALt!ZV@4+PMEU~tU`zR$72>mqQvulww<3P zA0?)1M1^O|W&LoFj+t|}ur@sOMU6EnFvEek`)K)=CUCM5CWNG%|%);?CG?J8n=hO&mx$sLfV=rSM2Sy-*_e4XdXI z$kOxx`YW8o#^|FX<14A(=}z)Jx?5dX^+A5}0e7VI@OsSIE^1 zl`oDU=1B|DySn_>9-NN1?_5-XF+n&>Q|eCW=!qA5TP=*KCXbI08{ItXgCB;}th<*T zzn_8>oUS0RPofbpaad}am0RIU7Kqgb^{y_vo1a<2xP)7I?fEM(*Um5^Siq zgeSdE>`)~Y5WB;+hV6#@CeBBIaHDGW$FF8^#j{YKKv0JNc!b`3Izza*sv#y@lA%ip zzOxw6Klh01C9cV1Qrah=U!}Sqvs`HSBvd+(H~8bvw5B4*6`VDQ`yM#b9uAW(;Y^mX zI@N5LFpwsjDpki$IJIFvw%aE;Vf`#?p>Y5a$ufD(zkbKt-6=@Aaf5A~M~N~AD!AY3vb-Bo4mkNsq^q!ff)xvCIT>yV{wes>Vs0Kle3iw zzu_cwf6WtSuV|lS#R(1i7c36CFNEr3_P;6mhI*8xk1_oqBpTXNkF|SLsXxH+YP2&2 zjiRotE_#PxMp@`Gok*=EfXZ%bzvp>^@4fK9T*Jz2(uI%~{yZ@671k1Jo)_;_>vo>JF*;~ggGV?AA%Z_f z5Zj(P+(nQl-d%f$SSk}e-~5j9=E-0=maZGZbn%R|=+E(4o z4Y3nq4blijmKh+$iF}0+X>3McPTTHYcsqXHXGV-BXaM3C$Y9TO`~tWt zw(I7@(aB0iQ%ki082O+XYUI_FFn1`8HNf9Yd3V$-CedkHXD|!M^cSw*Emh&7TA;0a zDrCd~sc2akVa@>)Y9c_bc$5%;T7-GN`={m^-2mHg&MfW+oKYzTX>x2G(5>fEjO(N8 zl3h;kI0-H(?EZ01QK=901V@T*31&__Y3tgB@66?>O2a##gl13f3&DB*k)$6j<63(6 z$@VWYZujYN!GZHi9+-Rp#t8@o0gvB$_2tIVc`JuuIZPMs_DtQosb zRO24?oqk7Lx00!fgI^$W)h$u0idF|^9u;U*Xsf*Lr!!MaKtRCoSFfWl0f}hb@246n z9BY};Ji!Mi7Otf+lmVt>XJ9=_Q=JPrcS!)SeWk~v@POotXzw2Axr(3Typ(Emlj{e5 z-ykj`_pt}arf`phNK$_r@%vQR{an|rcqdMVFXp=IjTz+%uwwddp0I%So`qLmB9*q@ z|5ku8_=J2q>Js1qAP6-tp@dz&_NdxM*G!0%-W_X$!9r@EG~HKTxv$v@s;)gR8&htf zN|0b}-W){Y=`syZ2-f`Kq^5_q$K03^?VRCC0Ngid3FXs{dqh;W_4_lKGUA41Q9pH5 zKHdc$@TPW}E+1%rCi9vorJF>RW7V$viUbADpZp@m9NoWf4mwBZ&uX&$ke$RS~ycV@snAynt zjOCeXsAq5{9k9Joiy_UO`@?w3lpW1Rp+|^FQjaJzKD=-2X=X Date: Sat, 31 May 2025 18:43:34 -0700 Subject: [PATCH 6/8] Description fix --- Language/english.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Language/english.json b/Language/english.json index 87406f0c..0f038f23 100644 --- a/Language/english.json +++ b/Language/english.json @@ -154,7 +154,7 @@ "name": "24/7 Energy", "description": "Deploy a vending machine that gives a movement and attack speed bonus.\nAdditionally increases critical strike chance when upgraded." }, - "technicianC": { + "technicianC2": { "name": "Radial Amplifier", "description": "Deploy an antenna that deals 15% additional damage to attacked enemies.\nHas 100% critical strike chance when upgraded." }, From 38edd83f146d3397890782a955d971f8c83866bf Mon Sep 17 00:00:00 2001 From: AGAININGTRYING211 Date: Sun, 14 Sep 2025 08:12:48 -0700 Subject: [PATCH 7/8] Tecchchashchiciasicannnn Technician is NOT fixed don't get your hopes up!! --- Survivors/technician.lua | 130 ++++++++++++++++++++++++++------------- 1 file changed, 87 insertions(+), 43 deletions(-) diff --git a/Survivors/technician.lua b/Survivors/technician.lua index e972761a..d0db6549 100644 --- a/Survivors/technician.lua +++ b/Survivors/technician.lua @@ -1,21 +1,21 @@ local SPRITE_PATH = path.combine(PATH, "Sprites/Survivors/Technician") local SOUND_PATH = path.combine(PATH, "Sounds/Survivors/Technician") -local buff_mirror = Buff.find("ror", "shadowClone") +local buff_mirror = Buff.find("ror", "shadowClone") --Shattered Mirror buff local item_scepter = Item.find("ror", "ancientScepter") -local object_sparks = Object.find("ror", "EfSparks") +local object_sparks = Object.find("ror", "EfSparks") --Standard hit sparks object local object_flash = Object.find("ror", "EfFlash") local object_missile = Object.find("ror", "EfMissile") local particle_spark = Particle.find("ror", "Spark") --- assets. +-- Define all the assets local sprite_loadout = Resources.sprite_load(NAMESPACE, "TechnicianSelect", path.combine(SPRITE_PATH, "select.png"), 18, 28, 0) -local sprite_portrait = Resources.sprite_load(NAMESPACE, "TechnicianPortrait", path.combine(SPRITE_PATH, "portrait.png"), 3) -local sprite_portrait_small = Resources.sprite_load(NAMESPACE, "TechnicianPortraitSmall", path.combine(SPRITE_PATH, "portraitSmall.png")) +local sprite_portrait = Resources.sprite_load(NAMESPACE, "TechnicianPortrait", path.combine(SPRITE_PATH, "portrait.png"), 3) --CSS screen/General UI survivor icons +local sprite_portrait_small = Resources.sprite_load(NAMESPACE, "TechnicianPortraitSmall", path.combine(SPRITE_PATH, "portraitSmall.png")) --Ditto local sprite_skills = Resources.sprite_load(NAMESPACE, "TechnicianSkills", path.combine(SPRITE_PATH, "skills.png"), 7) -local sprite_credits = Resources.sprite_load(NAMESPACE, "TechnicianCredits", path.combine(SPRITE_PATH, "credits.png"), 1, 7, 12) -local sprite_palette = Resources.sprite_load(NAMESPACE, "TechnicianPalette", path.combine(SPRITE_PATH, "palette.png")) -local sprite_log = Resources.sprite_load(NAMESPACE, "TechnicianLog", path.combine(SPRITE_PATH, "log.png")) +local sprite_credits = Resources.sprite_load(NAMESPACE, "TechnicianCredits", path.combine(SPRITE_PATH, "credits.png"), 1, 7, 12) --The sprite used at the end of the credits; 2x scale RoR1 idle sprite if it exists +local sprite_palette = Resources.sprite_load(NAMESPACE, "TechnicianPalette", path.combine(SPRITE_PATH, "palette.png")) --The color palette used to map skins +local sprite_log = Resources.sprite_load(NAMESPACE, "TechnicianLog", path.combine(SPRITE_PATH, "log.png")) --The logbook portrait local sprite_idle = Resources.sprite_load(NAMESPACE, "TechnicianIdle", path.combine(SPRITE_PATH, "idle.png"), 1, 9, 13) local sprite_idle_half = Resources.sprite_load(NAMESPACE, "TechnicianIdleHalf", path.combine(SPRITE_PATH, "idleHalf.png"), 1, 9, 13) @@ -76,6 +76,7 @@ local buff_exposed_2_sprite = Resources.sprite_load(NAMESPACE, "BuffExposed2", local sprite_wrench = Resources.sprite_load(NAMESPACE, "TechnicianWrench", path.combine(SPRITE_PATH, "wrench.png"), 1, 9, 9) +--Object hitbox sprites local mine_mask = Resources.sprite_load(NAMESPACE, "TechnicianMineMask", path.combine(SPRITE_PATH, "minemask.png"), 1, 7, 18) local turret_mask = Resources.sprite_load(NAMESPACE, "TechnicianTurretMask", path.combine(SPRITE_PATH, "turretmask.png"), 1, 11, 8) local wrench_mask = Resources.sprite_load(NAMESPACE, "TechnicianWrenchMask", path.combine(SPRITE_PATH, "wrenchmask.png"), 1, 11, 8) @@ -107,17 +108,16 @@ local color_tech_red = Color.from_hex(0xFF4843) local color_tech_blue = Color.from_hex(0x96FFFF) local color_tech_orange = Color.from_hex(0xFFC479) -local explosion1 = gm.constants.sEfBombExplode -- WWWWWWWWWWWWWWWWWWWWWWWOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO local explosion2 = gm.constants.sMinerExplosion local explosion3 = gm.constants.sDroneDeath local soundImpact = gm.constants.wTurtleExplosion -local soundCommandoSelect = gm.constants.wUI_Survivors_Commando +--Constants for various things local WRENCH_BLAST_OFFSET_X = get_tiles(0.8) local WRENCH_BLAST_OFFSET_Y = -get_tiles(0.1) local WRENCH_BLAST_W = get_tiles(2.2) local WRENCH_BLAST_H = get_tiles(1.2) -local WRENCH_DOWNGRADE_TIME = 60 * 30 +local WRENCH_DOWNGRADE_TIME = 60 * 20 local WRENCH_THROW_DOWNGRADE_TIME = 60 * 20 local MACHINE_VENDING_GRAV = 0.2 @@ -140,6 +140,7 @@ local MACHINE_AMPLIFIER_RADIUS = 140 local technician = Survivor.new(NAMESPACE, "technician") local technician_id = technician.value +--Set base and level stats technician:set_stats_base({ maxhp = 102, damage = 11, @@ -177,8 +178,11 @@ technician.sprite_credits = sprite_credits technician.select_sound_id = sound_select +--Set palettes to be used for skins technician:set_palettes(sprite_palette, sprite_palette, sprite_palette) +--Add a few skins +---1st arg is internal name, 2nd is the column in the palette sprite where the skin is located, 3rd-5th are recolored sprites in the CSS technician:add_skin("TechnicianRose", 1, Resources.sprite_load(NAMESPACE, "TechnicianSelect_PAL2", path.combine(SPRITE_PATH, "selectS1.png"), 18, 28, 0), Resources.sprite_load(NAMESPACE, "TechnicianPortrait_PAL2", path.combine(SPRITE_PATH, "portraitS1.png"), 3), Resources.sprite_load(NAMESPACE, "TechnicianPortraitSmall_PAL2", path.combine(SPRITE_PATH, "portraitSmallS1.png"))) @@ -203,8 +207,11 @@ Resources.sprite_load(NAMESPACE, "TechnicianPortraitSmall_PAL3", path.combine(SP Resources.sprite_load(NAMESPACE, "TechnicianPortrait_PROV", path.combine(SPRITE_PATH, "portraitPROV.png"), 3), Resources.sprite_load(NAMESPACE, "TechnicianPortraitSmall_PROV", path.combine(SPRITE_PATH, "portraitSmallPROV.png")))]] +--Create the survivor log +---All text is defined in the language file local technicianLog = Survivor_Log.new(technician, sprite_log) +--Retrieve the skills automatically created with custom survivors, and manually create skills for alts and Red Button local technicianPrimary = technician:get_primary() local technicianSecondary = technician:get_secondary() local technicianUtility = technician:get_utility() @@ -234,17 +241,18 @@ technician:onInit(function(actor) actor.sprite_jump_peak_half = jump_peak_half actor.sprite_fall_half = fall_half + actor:survivor_util_init_half_sprites() + --Skill overrides aren't removed when transitioning between stages so this does that --Otherwise the skill stocks of it get all messed up and secondary does nothing because there's no mine to detonate actor:add_callback("onStageStart", "SSOnStageStartTech", function(actor) actor:remove_skill_override(Skill.SLOT.secondary, technicianSecondary_Det, 1) end) - - actor:survivor_util_init_half_sprites() end) +-- Adjusts your vertical offset to keep in line with the legs animation while strafing +--- Offsets and frames may vary per survivor local handle_strafing_yoffset = function(actor) - -- Adjust vertical offset so the upper body bobs up and down depending on the leg animation if actor.sprite_index == actor.sprite_walk_half[2] then local walk_offset = 0 local leg_frame = math.floor(actor.image_index) @@ -257,18 +265,22 @@ local handle_strafing_yoffset = function(actor) end end +---Create some buffs local buff_vending = Buff.new(NAMESPACE, "hydrated") local buff_vending_2 = Buff.new(NAMESPACE, "really_hydrated") local buff_exposed = Buff.new(NAMESPACE, "exposed") local buff_exposed_2 = Buff.new(NAMESPACE, "exposed2") --- machines +-- All the machines.........! + +--Create an EfFlash (Fading solid color overlay of the object) local machineFlash = function(inst, color) local flash = object_flash:create(inst.x, inst.y) flash.parent = inst.id flash.image_blend = color or Color.WHITE end +--MULTIPLAYER: Create a new packet, when it is retrieved by a client the cooresponding machine flashes and plays a sound local machine_temp_visual_packet = Packet.new() machine_temp_visual_packet:onReceived(function(message, player) local inst = message:read_instance() @@ -277,22 +289,25 @@ machine_temp_visual_packet:onReceived(function(message, player) gm.sound_play_at(gm.bool(isFinal) and sound_downgrade or sound_downgradeBeep, 1, 1, inst.x, inst.y) end) +--Update machine temporary upgrade logic local machine_update_temp = function(inst) if inst.upgrade_progress_temp > 0 then if inst.upgrade_progress_temp_timer < 300 and inst.upgrade_progress_temp_timer % 120 == 0 then - machineFlash(inst, color_tech_red) - if gm._mod_net_isHost() then + if gm._mod_net_isHost() then --Only ran by the host in a Multiplayer game, must be done to have properly synced visuals (through packets) + machineFlash(inst, color_tech_red) --Create a red flash on the instance if inst.upgrade_progress_temp_timer <= 0 then - inst.upgrade_progress = inst.upgrade_progress - inst.upgrade_progress_temp + inst.upgrade_progress = inst.upgrade_progress - inst.upgrade_progress_temp --Reduce the upgrade_progress of the instance; The machine itself handles the reprecussions inst.upgrade_progress_temp = 0 - gm.sound_play_at(sound_downgrade, 1, 1, inst.x, inst.y) + gm.sound_play_at(sound_downgrade, 1, 1, inst.x, inst.y) --Play a non-moving sound at the instance's location else - gm.sound_play_at(sound_downgradeBeep, 1, 1, inst.x, inst.y) + gm.sound_play_at(sound_downgradeBeep, 1, 1, inst.x, inst.y) --Ditto end + + --MULTIPLAYER: Create and send the temp packet visual which runs code similar to above on all clients if not Net.is_single() then local buffer = machine_temp_visual_packet:message_begin() - buffer:write_instance(inst) - buffer:write_byte(inst.upgrade_progress_temp_timer <= 0 and 1 or 0) + buffer:write_instance(inst) --Add the machine as an argument to the packet + buffer:write_byte(inst.upgrade_progress_temp_timer <= 0 and 1 or 0) --Tells the client whether or not to play the full downgrade sound (1) or beep sound (0) buffer:send_to_all() end end @@ -301,22 +316,30 @@ local machine_update_temp = function(inst) end end +--Increments the upgrade_progress variable on a machine local upgrade_machine = function(inst, amount, tempTimer) - if inst.upgrade_progress < inst.upgrade_progress_max then - if gm._mod_net_isHost() then - inst.upgrade_progress = math.min(inst.upgrade_progress + amount, inst.upgrade_progress_max) - if tempTimer then - inst.upgrade_progress_temp = math.min(inst.upgrade_progress_temp + amount, inst.upgrade_progress_max) - inst.upgrade_progress_temp_timer = tempTimer + local shouldTempReset = (inst.upgrade_progress_temp_timer <= 240 and inst.upgrade_progress_temp_timer > 0) + if inst.upgrade_progress < inst.upgrade_progress_max or shouldTempReset then + if gm._mod_net_isHost() then --Host handles all upgrade logic + if tempTimer or shouldTempReset then + if inst.upgrade_progress < inst.upgrade_progress_max then + inst.upgrade_progress_temp = math.min(inst.upgrade_progress_temp + amount, inst.upgrade_progress_max) --Stores the amount of progress to be reverted when the machine is downgraded + end + inst.upgrade_progress_temp_timer = math.max(inst.upgrade_progress_temp_timer, tempTimer or 0) --Reset the machine's temporary upgrade timer end + inst.upgrade_progress = math.min(inst.upgrade_progress + amount, inst.upgrade_progress_max) --Increments the machine's upgrade_progress variable; The machine itself handles the reprecussions end - particle_spark:create(inst.x, inst.y, math.random(2, 4), Particle.SYSTEM.middle) - gm.sound_play_at(sound_wrenchHit, 1, 0.9 + math.random() * 0.2, inst.x, inst.y) + particle_spark:create(inst.x, inst.y, math.random(2, 4), Particle.SYSTEM.middle) --Creates 2-4 spark particles at the machine's location + gm.sound_play_at(sound_wrenchHit, 1, 0.9 + math.random() * 0.2, inst.x, inst.y) --Plays a non-moving sound at the machine's location end end -- Turret +--MULTIPLAYER: Define a few new packets for the Turret machine +---Each one is for purely visual and auditory purposes + +--Plays the fire animation and sound when recieved by clients local turret_shoot_packet = Packet.new() turret_shoot_packet:onReceived(function(message, player) local inst = message:read_instance() @@ -325,6 +348,7 @@ turret_shoot_packet:onReceived(function(message, player) gm.sound_play_at(inst.upgradeState >= 1 and sound_turretShoot2 or sound_turretShoot1, 1, 0.9 + math.random() * 0.2, inst.x, inst.y) end) +--Plays the fire animation and sound when recieved by the host, then sends the above packet to all clients except the one who sent this packet local turret_shoot_packet_host = Packet.new() turret_shoot_packet_host:onReceived(function(message, player) local inst = message:read_instance() @@ -338,6 +362,7 @@ turret_shoot_packet_host:onReceived(function(message, player) buffer:send_exclude(owner) end) +--Changes the display state of the missile silo on Scepter turret when recieved by clients local turret_missile_state_packet = Packet.new() turret_missile_state_packet:onReceived(function(message, player) local inst = message:read_instance() @@ -345,6 +370,7 @@ turret_missile_state_packet:onReceived(function(message, player) inst.switchMissileState = missileState end) +-- local shoot_missiledis_offset_map = { {-8, 2}, {-4, 1}, @@ -356,15 +382,23 @@ local obj_turret = Object.new(NAMESPACE, "turret", Object.PARENT.actor) obj_turret:set_sprite(sprite_turretaI) obj_turret:clear_callbacks() obj_turret:onCreate(function(inst) + inst:init_actor_default() + inst.mask_index = turret_mask inst.idle = sprite_turretaI inst.shoot = sprite_turretashoot inst.sparks = sprite_sparks1 + inst.intangible = true inst.init = nil + + inst.team = gm.constants.TEAM_PLAYER + inst.upgrade_progress = 0 inst.upgrade_progress_max = 3 inst.upgrade_progress_temp = 0 inst.upgrade_progress_temp_timer = 0 + inst.upgradeState = 0 + inst.cooldown = 0 inst.basecooldown = 50 inst.secondarycooldown = 0 @@ -372,15 +406,21 @@ obj_turret:onCreate(function(inst) inst.basesecondarycooldown = 90 inst.extrasecondarycooldown = 12 inst.basesecondarystocks = 4 + inst.damage = 1 inst.co_damage = technicianSpecial.damage - inst.upgradeState = 0 + inst.ff = 0 inst.image_speed = 0.2 - inst.intangible = true + + inst:init_actor_late(true) + + inst.dirty = 1 inst:instance_sync() end) obj_turret:onStep(function(inst) + inst:step_actor() + if inst.parent and Instance.exists(inst.parent) then if not inst.oy then inst.oy = inst.y end inst.ff = inst.ff + 1 @@ -388,7 +428,7 @@ obj_turret:onStep(function(inst) inst.scepter = inst.parent:item_stack_count(item_scepter) if not inst.init then - local xx, _ = move_point_contact_solid(inst.x, inst.y, 90 - 90 * inst.image_xscale, 800) + local xx, _ = move_point_contact_solid(inst.x, inst.y, 90 - 90 * inst.image_xscale, 1000) inst.range = math.abs(xx - inst.x) inst.init = 1 @@ -416,6 +456,7 @@ obj_turret:onStep(function(inst) inst.upgradeState = 0 inst.cooldown = math.min(inst.cooldown, inst.basecooldown) inst.playanim = nil + inst.skin_layer.visible = true if inst.missileDis then inst.missileDis:destroy() end doResync = true end @@ -428,6 +469,7 @@ obj_turret:onStep(function(inst) inst.upgradeState = 1 inst.cooldown = math.min(inst.cooldown, inst.basecooldown) inst.playanim = nil + inst.skin_layer.visible = true if (inst.prevUpgradeState or inst.upgradeState) < inst.upgradeState then machineFlash(inst) gm.sound_play_at(sound_turretUpgrade, 1, 1, inst.x, inst.y) @@ -444,6 +486,7 @@ obj_turret:onStep(function(inst) inst.missileDis.parent = inst inst.missileDis.sprite_index = sprite_turretc_mis1 inst.missileDis.image_xscale = inst.image_xscale + inst.skin_layer.visible = false inst.secondarystocks = inst.basesecondarystocks inst.missileState = 1 inst.upgradeState = 2 @@ -510,7 +553,7 @@ obj_turret:onStep(function(inst) if inst.parent:is_authority() or (inst.upgradeState == 2 and gm._mod_net_isHost()) then local wantattack = false local victims = List.new() - inst:collision_line_list(inst.x, inst.y, inst.x + inst.range * inst.image_xscale, inst.y, gm.constants.pActorCollisionBase, false, true, victims, false) + inst:collision_line_list(inst.x, inst.y + (inst.upgradeState >= 1 and 8 or 10), inst.x + inst.range * inst.image_xscale, inst.y, gm.constants.pActorCollisionBase, false, true, victims, false) for _, victim in ipairs(victims) do if inst:attack_collision_canhit(victim) then wantattack = victim @@ -524,12 +567,10 @@ obj_turret:onStep(function(inst) if inst.cooldown <= 0 and inst.parent:is_authority() then inst.playanim = 1 inst.image_index = 0 - --print(inst.attack_speed) inst.cooldown = inst.basecooldown / inst.attack_speed inst.damage = inst.parent.damage for i = 0, inst.parent:buff_stack_count(buff_mirror) do local attack_info = inst:fire_bullet(inst.x, inst.y + (inst.upgradeState >= 1 and 8 or 10), 1000, 90 - 90 * inst.image_xscale, inst.co_damage, nil, inst.sparks, Attack_Info.TRACER.commando1).attack_info - setNoProc(attack_info) attack_info.climb = i * 8 * 1.35 end gm.sound_play_at(inst.upgradeState >= 1 and sound_turretShoot2 or sound_turretShoot1, 1, 0.9 + math.random() * 0.2, inst.x, inst.y) @@ -1125,7 +1166,7 @@ local healable_survivors = { local healable_objects = { Object.find("ror", "EngiTurret"), Object.find("ror", "EngiTurretB") } Callback.add(Callback.TYPE.onAttackHit, "SSOnHitTechnician", function(hit_info) - local expose = 0 + --[[local expose = 0 if hit_info.target:buff_stack_count(buff_exposed) >= 1 then expose = 1 end if hit_info.target:buff_stack_count(buff_exposed_2) >= 1 then expose = 2 end if not hit_info.attack_info.__ssr_technician_is_expose and hit_info.inflictor and Instance.exists(hit_info.inflictor) and expose >= 1 and gm._mod_net_isHost() then @@ -1133,7 +1174,7 @@ Callback.add(Callback.TYPE.onAttackHit, "SSOnHitTechnician", function(hit_info) attack_info.__ssr_technician_is_expose = expose attack_info.damage_color = expose == 2 and color_tech_orange or color_tech_red attack_info.climb = 8 * 1.35 - end + end]] if hit_info.attack_info.__wrench_hit then if hit_info.attack_info.__wrench_hit == 1 then @@ -1191,7 +1232,7 @@ end) stateTechnicianPrimary:onStep(function(actor, data) actor.sprite_index2 = (data.currentAnim == 1 and sprite_shoot1_2 or sprite_shoot1_1) - actor:skill_util_strafe_update(0.2 * actor.attack_speed, gm.constants.STRAFE_SPEED_NORMAL) + actor:skill_util_strafe_update(0.18 * actor.attack_speed, gm.constants.STRAFE_SPEED_NORMAL) actor:skill_util_step_strafe_sprites() actor:skill_util_strafe_turn_update() @@ -1210,7 +1251,10 @@ stateTechnicianPrimary:onStep(function(actor, data) if actor:is_authority() then local attack_info = actor:fire_explosion(actor.x + WRENCH_BLAST_OFFSET_X * actor.image_xscale, actor.y + WRENCH_BLAST_OFFSET_Y, WRENCH_BLAST_W, WRENCH_BLAST_H, actor:skill_get_damage(technicianPrimary)).attack_info attack_info.climb = i * 8 * 1.35 + attack_info.knockback_direction = actor.image_xscale + attack_info.knockback = 3 + attack_info.__wrench_hit = 1 end local machinesHit = List.new() @@ -1348,7 +1392,7 @@ obj_wrench:onStep(function(inst) local healablesHit = List.new() inst.parent:collision_rectangle_list(inst.x - 9, inst.y - 9, inst.x + 9, inst.y + 9, gm.constants.oP, false, true, healablesHit, false) for _, object in ipairs(healable_objects) do - actor:collision_rectangle_list(inst.x - 9, inst.y - 9, inst.x + 9, inst.y + 9, object, false, true, healablesHit, false) + inst.parent:collision_rectangle_list(inst.x - 9, inst.y - 9, inst.x + 9, inst.y + 9, object, false, true, healablesHit, false) end for _, instance in ipairs(healablesHit) do if (instance.object_index ~= gm.constants.oP or healable_survivors[instance.class]) and not data.hit[instance.id] then @@ -1369,7 +1413,7 @@ technicianPrimaryAlt.subimage = 6 technician:add_primary(technicianPrimaryAlt) technicianPrimaryAlt.cooldown = 5 -technicianPrimaryAlt.damage = 1.8 +technicianPrimaryAlt.damage = 1.6 technicianPrimaryAlt.require_key_press = false technicianPrimaryAlt.is_primary = true technicianPrimaryAlt.does_change_activity_state = true @@ -1674,8 +1718,8 @@ stateTechnicianSpecial:onStep(function(actor, data) turret_inst.parent = actor turret_inst.team = actor.team turret_inst.image_xscale = actor.image_xscale - --GM.inventory_items_copy(actor, turret_inst, Item.LOOT_TAG.item_blacklist_engi_turrets) - --GM.actor_queue_dirty(turret_inst) + GM.actor_queue_dirty(turret_inst) + GM.inventory_items_copy(actor, turret_inst, Item.LOOT_TAG.item_blacklist_engi_turrets) if data.scepter > 0 then turret_inst.upgrade_progress = 3 end From 46370b9a3937db8fbcdf683cdadb97b3de64a591 Mon Sep 17 00:00:00 2001 From: Azuline Date: Mon, 15 Sep 2025 18:32:31 +0700 Subject: [PATCH 8/8] fixed mine and turret lagging the game like crazy --- Misc/votvlibrary.lua | 16 ++++++++-------- Survivors/technician.lua | 10 ++++++---- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/Misc/votvlibrary.lua b/Misc/votvlibrary.lua index e9e5437e..970e0691 100644 --- a/Misc/votvlibrary.lua +++ b/Misc/votvlibrary.lua @@ -1,8 +1,8 @@ --All my functions! And sometimes some constants --Check if a point is colliding with the stage -function is_point_colliding_stage(x, y) - local collision = gm.collision_point(x, y, gm.constants.pBlock, false, true) +function is_point_colliding_stage(x, y, actor) + local collision = actor:collision_point(x, y, gm.constants.pBlock, false, true) if not collision or (type(collision) == "number" and collision < 0) then return false end @@ -16,7 +16,7 @@ end --Move a point in a specified direction until it collides with the stage, or has reached the max amount ---90 is down, 270 up, 180 left, and 0/360 right -function move_point_contact_solid(x, y, angle, amount) +function move_point_contact_solid(x, y, angle, amount, actor) amount = amount or 1000 local totalMoved = 0 local xx = math.cos(math.rad(angle)) @@ -30,11 +30,11 @@ function move_point_contact_solid(x, y, angle, amount) y = y - yy * (totalMoved - amount) break end - if is_point_colliding_stage(x, y) then + if is_point_colliding_stage(x, y, actor) then for i = 0, 31 do x = x - xx y = y - yy - if not is_point_colliding_stage(x, y) then + if not is_point_colliding_stage(x, y, actor) then break end end @@ -45,7 +45,7 @@ function move_point_contact_solid(x, y, angle, amount) end --Same as move_point_contact_solid, but stops after *exiting* terrain instead -function move_point_contact_air(x, y, angle, amount) +function move_point_contact_air(x, y, angle, amount, actor) amount = amount or 1000 local totalMoved = 0 local xx = math.cos(math.rad(angle)) @@ -59,11 +59,11 @@ function move_point_contact_air(x, y, angle, amount) y = y - yy * (totalMoved - amount) break end - if not is_point_colliding_stage(x, y) then + if not is_point_colliding_stage(x, y, actor) then for i = 0, 31 do x = x - xx y = y - yy - if is_point_colliding_stage(x, y) then + if is_point_colliding_stage(x, y, actor) then x = x + xx y = y + yy break diff --git a/Survivors/technician.lua b/Survivors/technician.lua index d0db6549..ba0a3ecb 100644 --- a/Survivors/technician.lua +++ b/Survivors/technician.lua @@ -428,7 +428,7 @@ obj_turret:onStep(function(inst) inst.scepter = inst.parent:item_stack_count(item_scepter) if not inst.init then - local xx, _ = move_point_contact_solid(inst.x, inst.y, 90 - 90 * inst.image_xscale, 1000) + local xx, _ = move_point_contact_solid(inst.x, inst.y, 90 - 90 * inst.image_xscale, 1000, inst) inst.range = math.abs(xx - inst.x) inst.init = 1 @@ -893,7 +893,8 @@ obj_mine_pull:onCreate(function(inst) end) obj_mine_pull:onStep(function(inst) inst.ff = inst.ff + 1 - local targets = List.wrap(gm.find_characters_circle(inst.x, inst.y, MACHINE_MINE_PULL_RADIUS, true, inst.team == 1 and 2 or 1, true)) + local targets = List.new() + inst:collision_circle_list(inst.x, inst.y, MACHINE_MINE_PULL_RADIUS, gm.constants.pActorCollisionBase, false, true, targets, false) for _, target in ipairs(targets) do --Check if we should pull the target --Pulling is weird with ropes so climbing enemies are excluded @@ -923,6 +924,7 @@ obj_mine_pull:onStep(function(inst) end end end + targets:destroy() inst.life = inst.life - 1 if inst.life <= 0 then inst:destroy() @@ -1286,7 +1288,7 @@ stateTechnicianPrimary:onStep(function(actor, data) end else local machinesHit = List.new() - local endX, _ = move_point_contact_solid(actor.x, actor.y, 90 - 90 * actor.image_xscale, 700) + local endX, _ = move_point_contact_solid(actor.x, actor.y, 90 - 90 * actor.image_xscale, 700, actor) actor:collision_line_list(actor.x, actor.y, endX, actor.y, gm.constants.oCustomObject, false, true, machinesHit, false) actor:collision_line_list(actor.x, actor.y, endX, actor.y, gm.constants.oCustomObject_pNPC, false, true, machinesHit, false) for _, machineObj in ipairs(machines) do @@ -1463,7 +1465,7 @@ stateTechnicianPrimaryAlt:onStep(function(actor, data) wrench:actor_skin_skinnable_set_skin(actor) else local machinesHit = List.new() - local endX, _ = move_point_contact_solid(actor.x, actor.y, 90 - 90 * actor.image_xscale, 700) + local endX, _ = move_point_contact_solid(actor.x, actor.y, 90 - 90 * actor.image_xscale, 700, actor) actor:collision_line_list(actor.x, actor.y, endX, actor.y, gm.constants.oCustomObject, false, true, machinesHit, false) actor:collision_line_list(actor.x, actor.y, endX, actor.y, gm.constants.oCustomObject_pNPC, false, true, machinesHit, false) for _, machineObj in ipairs(machines) do