From 2d64db512f67c14af0ac25123facc8921de6c163 Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Fri, 6 Sep 2019 14:08:53 +0200 Subject: [PATCH] Various Sentry fixups and whatnot, plus a fancy explosion. Sentry no longer causes a freeze if it runs out of ammo while still having a target. Sentry now has to be recalled by using the item. Hijacking a sentry now immediately assigns it to your inventory. You can hijack rogue sentries (not owned by anyone). Better placement check for forcefield and sentry spawning, no more "no room" messages when it can definitely fit. Increased flak slug explosion sprite size, as it felt too small. Eightball loads faster (slightly faster than vanilla but can't do anything about that). ASMD combo no longer spawns amped explosions when it shouldn't. Added a new flag to UnrealInventory, bDRAWSPECIAL, so the HUD displays the special1 as an amount. This is useful for items like the Sentry that use this variable to count ammo. Increased rotation range for the Sentry so it's harder for enemies to sneak behind it from the sides. Added debris to the explosions of flares and voice boxes. --- language.txt | 2 + modeldef.umisc | 17 ++ models/sfrag_a.3d | Bin 0 -> 940 bytes models/sfrag_d.3d | Bin 0 -> 912 bytes sndinfo.txt | 5 + sounds/CannonEx.ogg | Bin 0 -> 12613 bytes sounds/GlassTk1.ogg | Bin 0 -> 4392 bytes sounds/GlassTk2.ogg | Bin 0 -> 5129 bytes zscript/asmd.zsc | 2 +- zscript/miscitems.zsc | 337 +++++++++++++++++++++++++++++++++------ zscript/ueightball.zsc | 10 +- zscript/uflakcannon.zsc | 2 +- zscript/unrealcommon.zsc | 3 + zscript/unrealhud.zsc | 10 +- 14 files changed, 323 insertions(+), 65 deletions(-) create mode 100644 models/sfrag_a.3d create mode 100644 models/sfrag_d.3d create mode 100644 sounds/CannonEx.ogg create mode 100644 sounds/GlassTk1.ogg create mode 100644 sounds/GlassTk2.ogg diff --git a/language.txt b/language.txt index f9fb012..1c24293 100644 --- a/language.txt +++ b/language.txt @@ -190,6 +190,7 @@ M_SENTRYDOWN = "Your Sentry has been destroyed."; M_SENTRYDRY = "Your Sentry has run out of ammo."; M_SENTRYHIJACK = "Your Sentry has been hijacked."; M_MSNOROOM = "No room to deploy Sentry."; +M_NSTOOFAR = "Cannot recall Sentry from this distance."; M_FFNOROOM = "No room to activate Force Field."; S_MINHUD = "Health %d Score %d Ammo %d"; S_MINHUD2 = "Health %d Score %d Ammo %d/%d"; @@ -409,6 +410,7 @@ M_SENTRYDOWN = "Tu Torreta ha sido destruida."; M_SENTRYDRY = "Tu Torreta se ha quedado sin munición."; M_SENTRYHIJACK = "Tu Torreta ha sido hackeada."; M_MSNOROOM = "No hay espacio para colocar la Torreta."; +M_NSTOOFAR = "No se puede retirar la Torreta desde esta distancia."; M_FFNOROOM = "No hay espacio para activar el Campo de Fuerza."; S_MINHUD = "Salud %d Puntuación %d Munición %d"; S_MINHUD2 = "Salud %d Puntuación %d Munición %d/%d"; diff --git a/modeldef.umisc b/modeldef.umisc index e707e6a..48e6685 100644 --- a/modeldef.umisc +++ b/modeldef.umisc @@ -565,6 +565,23 @@ Model "MinigunSentryX" FrameIndex SENF P 0 47 // shoot } +Model "SentryFragment" +{ + Path "models" + Model 0 "sfrag_d.3d" + Skin 0 "Minigun.png" + Scale 0.1 0.1 0.12 + USEACTORPITCH + USEACTORROLL + + FrameIndex CHIP A 0 0 + FrameIndex CHIP B 0 1 + FrameIndex CHIP C 0 2 + FrameIndex CHIP D 0 3 + FrameIndex CHIP E 0 4 + FrameIndex CHIP F 0 5 +} + Model "MinigunSentryBase" { Path "models" diff --git a/models/sfrag_a.3d b/models/sfrag_a.3d new file mode 100644 index 0000000000000000000000000000000000000000..dfd5dbee92b1d83c11e6cee9f763abc5fc95a154 GIT binary patch literal 940 zcmZQ$n8SbzY|PmIdtUuf2Alo+zAJGsaLu#-%@B9u7(-~qFI-v%g*a3Ek^hApNB&#B z|Nq}cpNZp%#)1FaG@Mv&pE&&gQU8~pru!>CmA&}?Uo@hLV^BDlLPr=bwEu4`V9Cm9 z{_ofQ_P@Maws(J~&`5&Xiwqc;TnxyBD(hm3#!u>}GE)AUjE literal 0 HcmV?d00001 diff --git a/models/sfrag_d.3d b/models/sfrag_d.3d new file mode 100644 index 0000000000000000000000000000000000000000..cc3657c8cb0de79773f32a843491ed7eed4b4d63 GIT binary patch literal 912 zcmXqGP-h?ourM$(Ff%YP%sSe>yypc211kdym_P6JtfL@40|N^KD+2?=itDqE&U+2w zF)=VQFfiCCNNd>{gKT1AU}0cjuosfnvQc1QU}j(f2{MQaNNd>(ftajd^X!GRc*F%j z@{C{=Juljq*B@nI;9%fnU}s=p_^Exv@s}S111AFq0~Z4W!wtuu+7C1t7`PeO88{gj z81BdZ^1I>4z`(`81Li-_JfH*O^DwZ1`3H3NdV%=d44e#XVD&c~_j)oguraVRa5FG4 z^c2-jn%N7oj~y(Z+FCoQrwAm^#lQiU&nio8Wnkc8-~!8+WoDIuhc>xA~25|-khHi_APHS`-7=#$a z!SY8`*XV-e1sR0E{F{bHR6%?`25|;ZFzt|Et8+w^fkBvo56nL!wnHAm7h(`(U|={S zc0~22Ap-+1gE#{p0|P^w@fzJ7@(c_D4B`yDVEfkSwi$!u`56Ql7#OVNowQvQ85jf^ z_!xv47#I%m?T|ks#=s!Pzy~&OgV+xFLwpPj{0w|x_cZG4kl!E%GLH}Jzc%9?@{Kwm z|3ds%D%Pk2k{4qTVGw0tVAvqmz*Z{8z#z#W!ywJTz`#CDdZWr(1_lWR83suP1_r^c z(i_>QF)&Cm$S_DSFfbUNl-?+~m4QK;K?=+l+{!+Ua~DXxBv?P^F2j=`c^L*NFkgD3 z;YpBrvJ46g@(c_N8au@|3vOp%P-IYGkY!+Ckli4@Sz{*ygB*hbgCYY11K(`%&9WO9 z7~~n`zpvs`cz`&5$>tF9Ufq_AVK@H5;EN96V=mV)&2J08-Q|Z<$ SXJAlePy_S*>l1rH<^cezz?B&Q literal 0 HcmV?d00001 diff --git a/sndinfo.txt b/sndinfo.txt index e08ca02..e75da72 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -225,3 +225,8 @@ sentry/raise sentup sentry/wind sentwind sentry/fire sentfire sentry/unwind sentuwnd +sentry/explode cannonex + +vfrag/bounce1 glasstk1 +vfrag/bounce2 glasstk2 +$random vfrag/bounce { vfrag/bounce1 vfrag/bounce2 } diff --git a/sounds/CannonEx.ogg b/sounds/CannonEx.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a76ae2e0cfcbc49f9c5fa8f77215c3a09de9ed2a GIT binary patch literal 12613 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 literal 0 HcmV?d00001 diff --git a/sounds/GlassTk1.ogg b/sounds/GlassTk1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..1d3545bac5c865a240533682e65c9961fdca83bf GIT binary patch literal 4392 zcmeZIPY-5bVt@i25AJFZb3%YM7o!|wS$hME__d%0cz!@yQ%h#95~3=9#O1sQt&Md=DTnMq+_lNCG_j0_Ad42%uU6g2$u z%M}a_3{(};Qp;0|6pAxab8?C`K^8EwLJSddat>o;U|?k62@+9Ml??Vu=9n53q{%9q z91!g;n|#I6O)*6vxWiL&X|=!B)CjK=fC!JbotrfIs$CW{1nC(MQ1=O&2DFg51gA zz`_W2GZzEHp#UD&zy^?n0~9ZXqDGNr|C@iGiWV zu}AUPgkl~qHpQYo&l3tR=PWhnPVw>5Si5DKC#UYzYf8`OO!4zlTe?Lo==72)*POIj z85meB7#LV0I9l7*a4;-lU=V1Y5agkGWJ;2sVf&PzKF#A3g3eeTol(?d_(CD%jNu8H z77xv%62*R&&lFO4w4TYd@EC#OkdJ|ZQOs$fqBc{51tUYVO6IJknTs+qXK7R|Td``9 z#;R3ME0?{TxolO{qLr(bt=hG2<*Ic#mGd$|vhy@oty;NiUG}O~ue(-donE&3*0z_c zw!JyEDR1|tHMi%jI<;-(u1$HX*5&Trl=FI>&h1@KDp$Rlx$Je-vX{G7y}q^S)vir% zXD)l)wMzT;ve&0Jy*{;V?Ws-cvX{NwwP^LNbt`vmdV30_cg^o*uU~C@b!ykTQ=8u1 z-nQ=drnTI=U+mhp?$o+ zyk2{`v^08Z>h18<$nUAK-&-TM*WL{djW&-BzwUeeYHjrO+Qek zKD^pyxMx?M%fw&)D z@6+d5{QA`{t<$?U+}gDM^e#P~-RqbBO0S4$VK zzI`m8`|u_6vV9B;4UFsz4GhAk9AHt*rpO_hETDBvp+z8wOL0kvA)8_{pVu*&DFR-e zic>CW9aBi@^E@FlS->k}<&+Cv8cUZ3czG|JaxExJciELFo`qXPyfW8LxfGS9x$R0& zj%c!g(eouKeV!Uiw}g3RY8Lx=9b2%3&q-_Pl1pBmYg5m8o?Ni_lBLJWC6|IcS8fgP z%3e6-nwQtcrI);N*B+Jf%G6zQDav!@)+<4|Yqv%zA5%!_aXdL^a*&tj$|;wkp3RxU zXQef>d6Jjr%Bhor*36iE$x%bKxyQ?M>DEbJ+7P2!gQBw6UY!x-Z8~LAl;_H$0bbc_ zw@L+To3;i7aWCB>=9Rg2Ygl%c?zRA@?1f9jytNFsiY4c+Ju2aqxps+AwC2jAV$r>8 zw?+hen@*dQl(Y8g4KH2GYf;%=y4NlR^{m}GBid)@(THqbRj^T0E=75*J$fx_Ey!}M zjZ-H@fpkRmm`=Hrq^Y@ef>+Mktr5{Vrpu-!(wby-D|f-cx#&; zlgQ39eHz5TaG-&i!J&aOb-{%RQyCmY7#I?Gl6xF8M2gN>YW4=5vs70t=5ylEOg-nw zp}6#%CCAb&S1j2VPMPAQsku}nT0?c|wJ041h6M*0859n%`F0*<FwWN=|*P&lS> zRHEgW!cvLm3lfV(k_EJuN)+=sEfq;V=XgS*_?)ArWb!#jb=4LDC(WfT0!|uBr!X-v zaLF(*Fy&mB5+SqT!UR!9h=Y=N4BHe+f~+(JTYS9KmrfLl;?_)^=GCQo>`YYW+9NkS zIM=pbGs;#yb}7ki?U9HiEe3`+2N)UN9B|SwNl|5(z|PnsMH2It*yJE{Z%jXI$0#4886bm?UENm8V;#fN6k|T#=OOV$~kc8&a5|G4{ zAT9<5tpWxHjtzk+#Z40zI5~$gF;p@zG#GkWs;e$_(>$iIL?jyI;h?OwNjy$oYmY`4 zvMDaTmh?tp$(5*{tz`m1S-QufoIw)V=Rgu`Os|6^p53ViNfe*k$-r=jm7QS&v$U(3 zx&)^d%o7SrM3Q?f+ovS;7(Sol>}7atM)5h#V-m&ZET4lUp3f-;Nfe*61W8yvp97Lu z&^!Uey5RT%#N|*dIcND?rbPgoCmw=4F(t@LbLo^IuN8}-EG9(|7c53=Vk*>bs67k{ z_qo^^{R36E!`59t+{gRlpqbwqf*{pE0XOZeE!5}YAMM(At^3qgn5r9OGCMe%% zfYiY<4>;_=*$B)Ma^hGBjX{Vh;6T*?C1)^;Qxz)frKt#KEoES6UPMQxoE2y{GAz?TNo@Cd}42gMsa~ zx=F#$*E99~<@uLa8$R)sl|A|O)t|qv+YMzR7pM)4tiy z>K>iaJ^gC}$0fae_v}u+UTezwEu(**-QSAM+hkh$9Ula~xETGvU(xYqLtVMJtc>Y} zN``qlYWF&%#rl^&402%Kz~J>DfFasA_rRVbEW$Cj@Bg&S{C(qcwdT{q|9(7raKOsc zI_%UhzbwBcX6A2aYQHP;zRpN*=_zIh+}le57`SwdB=cQCg)@qLj<;B^qJkb6Gm@3nNj+@UZ@}@bAeR6*z>!YvVHE+H)`RjEhv*`AJtp)4dKW^C_ zEq7=WJL8Av3**8kxO}l(<$A8-|KrEIvP46SvKBu)z`y9YXhOR1j8*&xlpiXDWjf!h z`Ct`&?`6;03e&vh@6&yRpWGCi@9zF=`#<%w zBnF4+2WBu>OVlwXOzBwdKHK`*ZvLZt|2^KEeRb|E(WjqoB_F=UIWckatowPLixnqX zzg79|s*#C#N?q-s3Oc8xXhQUSND_O#JVvbsZID{&UY*{=QweOLgI7U#*vm zUq;@Y#ow_*ENziV^16MN%Q!cgN=y}xqDGzpwJ3F47e3g0fBDUox53Bt!6tDeXmt^th&9ZKxvUhi{FG|Yz ze`Bjb*P|qsyxZwzT)p#3yi})!{YuQ>$gfRG2$U=~nuYSDqZgAy(#kFexXA7np9beIz?$4!H?yTjq@?^>Ga}nis-}||yExPBsL#BFZ zw8fi}?UH?S^b}{#dpGH5?vMEI>o%^H2!8kF{>2Bg8ca4a#Kjd_9aA!{%#h$)aInnn zAiovEi*Ipp|L*RqKk}^PZ|0)&a}DZc?o3~L{KBb>&$rjB-+8s%U$el*vVUXO#pN4a z?@C{YlfD11zP>d@^#6};)}$}pub1~{uByqIC$W0Ns>t4!5X(PbRg!+)i_(dc4g0#H zwqV<`giESw*As6?wW~I;CGl=w6CVFJWvwI)4V_-o69?P@#!W^OH#S-HQsIKZi?dCRF6Wg@YsUvnD&N{Lc%H|hH| z>HeV#mbmDNZlzaV1~V}9RtisJVA!&DTh8X+0(@)t-(GuX{-u`@?=ts34E?-^H+15p z=K(vc?Du~-p8J=DbyNPv@W7zczxOd6o;6#!_|RM38&-mWrS?DH3FiG;ePt)lUJn;nUUc)_nNz=UYzl){om~ty#CP z>gCy{a+9`cRLqTVD*3u+|Te3jw00To7lfc6@pL|#UurmL9YSFoQetg^a?3})O8`Iff zL(RsJhDq+NzXXe?YCkyeuJ~tR*}PVc+}hbKD}1NR@4b7JV}~n?#kJ#3jIT_!zSfxR zTBef}6gQ3Sy`w0@)-Lg-(~`tkwQsfiJ#M?5Vxk$t zlq9?_oNYnCVHJi2JZdi(6w-r!-+jNV^34zX#BcB4>ni!%m3OG7-27Q!!j&kb*H-j@^WPD=D0Jt-A_ZBAsaem@gKjl_vGO;^duf2MNEw@(Ty(N637wymj# zfx)M_uxO{!V~d$<<`m!iz3X-%%k}j2l7Y2r4!kY3V4X8bmOo;U|?k62@+9Ml??Vu=9n53q{%9q z91!g;n|#I6O)*6vxWiL&X|=!B)CjK=fC!JbotrfIs$CW{1nC(MQ1=O&2DFg51gA zz`_W2GZzEHp#UD&zy^?n0~9ZXqDGNr|C@iGiWV zu}AUPgkl~qHpQYo&l3tR=PWhnPVw>5Si5DKC#UYzYf8`OO!4zlTe?Lo==72)*POIj z85meB7#LV0I9l7*a4;-lU=V1Y5agkGWJ;2sVf&PzKF#A3g3eeTol(?d_(CD%jNu8H z77xv%62*R&&lFO4w4TYd@EC#OkdJ|ZQOs$fqBc{51tUYVO6IJknTs+qXK7R|Td``9 z#;R3ME0?{TxolO{qLr(bt=hG2<*Ic#mGd$|vhy@oty;NiUG}O~ue(-donE&3*0z_c zw!JyEDR1|tHMi%jI<;-(u1$HX*5&Trl=FI>&h1@KDp$Rlx$Je-vX{G7y}q^S)vir% zXD)l)wMzT;ve&0Jy*{;V?Ws-cvX{NwwP^LNbt`vmdV30_cg^o*uU~C@b!ykTQ=8u1 z-nQ=drnTI=U+mhp?$o+ zyk2{`v^08Z>h18<$nUAK-&-TM*WL{djW&-BzwUeeYHjrO+Qek zKD^pyxMx?M%fw&)D z@6+d5{QA`{t<$?U+}gDM^e#P~-RqbBO0S4$VK zzI`m8`|u_6vV9B;4UFsz4GhAk9AHt*rpO_hETDBvp+z8wOL0kvA)8_{pVu*&DFR-e zic>CW9aBi@^E@FlS->k}<&+Cv8cUZ3czG|JaxExJciELFo`qXPyfW8LxfGS9x$R0& zj%c!g(eouKeV!Uiw}g3RY8Lx=9b2%3&q-_Pl1pBmYg5m8o?Ni_lBLJWC6|IcS8fgP z%3e6-nwQtcrI);N*B+Jf%G6zQDav!@)+<4|Yqv%zA5%!_aXdL^a*&tj$|;wkp3RxU zXQef>d6Jjr%Bhor*36iE$x%bKxyQ?M>DEbJ+7P2!gQBw6UY!x-Z8~LAl;_H$0bbc_ zw@L+To3;i7aWCB>=9Rg2Ygl%c?zRA@?1f9jytNFsiY4c+Ju2aqxps+AwC2jAV$r>8 zw?+hen@*dQl(Y8g4KH2GYf;%=y4NlR^{m}GBid)@(THqbRj^T0E=75*J$fx_Ey!}M zjZ-H@fpkRmm`=Hrq^Y@ef>+Mktr5{Vrpu-!(wby-D|f-cx#&; zlgQ39eHz5TaG-&i!J&aOb-{%RQyCmY7#I?Gl6xF8M2gN>YW4=5vs70t=5ylEOg-nw zp}6#%CCAb&S1j2VPMPAQsku}nT0?c|wJ041h6M*0859n%`F0*<FwWN=|*P&lS> zRHEgW!cvLm3lfV(k_EJuN)+=sEfq;V=XgS*_?)ArWb!#jb=4LDC(WfT0!|uBr!X-v zaLF(*Fy&mB5+SqT!UR!9h=Y=N4BHe+f~+(JTYS9KmrfLl;?_)^=GCQo>`YYW+9NkS zIM=pbGs;#yb}7ki?U9HiEe3`+2N)UN9B|SwNl|5(z|PnsMH2It*yJE{Z%jXI$0#4886bm?UENm8V;#fN6k|T#=OOV$~kc8&a5|G4{ zAT9<5tpWxHjtzk+#Z40zI5~$gF;p@zG#GkWs;e$_(>$iIL?jyI;h?OwNjy$oYmY`4 zvMDaTmh?tp$(5*{tz`m1S-QufoIw)V=Rgu`Os|6^p53ViNfe*k$-r=jm7QS&v$U(3 zx&)^d%o7SrM3Q?f+ovS;7(Sol>}7atM)5h#V-m&ZET4lUp3f-;Nfe*61W8yvp97Lu z&^!Uey5RT%#N|*dIcND?rbPgoCmw=4F(t@LbLo^IuN8}-EG9(|7c53=Vk*>bs67k{ z_qo^^{R36E!`59t+{gRlpqbwqf*{pE0XOZeE!5}YAMM(At^3qgn5r9OGCMe%% zfYiY<4>;_=*$B)Ma^hGBjX{Vh;6T*?C1)^;Qxz)frKt#KEoES6Unb{ zvU?0iRxs}Pbbh^mfB9SaSv6G!e-37zUR`Y**1W=If8IO!lU9M6_3QaL`5QxvIT@E_ zta+UH`+nv6|M%thO=fnpJ+l1VirMb7IrA57-@Nx;`Q{uIX;bIV_a|qiNzT0AzO7eY zPh^ok+Z1L7h8cS}Sub3cPY`TqW@g}6crkXvv7?dC`W$5~dv{Fv%95X0_3q?bdq1)B zqS{((+n%0SeS5#zV|Q*I?+zjLb5`c_LcSWUx6Je|pZ%@w=lE)*noeoD{q%U>(% zD3K}Lx99aL`)J?8@5J+}`IfEU@$BEG2{&6<8SXJlC@}0{c+kXBu<*xazUyBvRXqP} z;8i-U^lEPE6~5cikCYSL`j%F*pWige#pr9;uhe$K$Q2zd&b#xMO=izz7AoCoGyM{e zx_|Pl(7Xpm)*t=s<|G{SDK9&3BG=}oeQU2})LoMp#(C>PmTng+3Ttj*t2aJq#b6-0 zpyEM(`S}v9&l&6fUJ%Q1eEv;OBuuzfxwou?JHcl#>I zw@2?V2z~Pp?k=TV1KZuL zGNwl@J>3@SEy@aY+g_x2b~gjBT@2?9hR+umKQS_>I_%%Hc&2Rql4}jUxnlH*$y0+sAx$_vCVubHP6G|8;`WgFg#=>|5~oVEf7zZpnx4T)95Z z)m6sV9&X9cu%CYNQ_|;*Mav{!-Bp{l!pi?yh#Fh=EOs%5hO^DD8X2o(3|@t(9$smA z$l#}z%PVHFU$IOL-?na@a4J${$@ZmLrK`4v{+cH_KtFWw*P&}qa*d1M~=^9eH0heQ9LcwDe-^BVxJYZix>)Txm$i?n6)BmespZZ zk76~2gLAbSTnZQs_!&+y+*S9u_l~D}<=oE?(>8er_Z0Q}{@8YQ#_nQy^F$fWYxBOU z1~nZmbKiS@|0kjRq*QaE&=qV-dW-jLTN<;pY18cJ-tr@9HYV@QpKmA;X){yF_&g<9 zFHWUz#kYc;$qLD7~#XK6fZmr&NrmvDrky5U7gj@iCm$)#!AbbS(EuUKQF-1WpJ zc|m8|bS8~WkD?fM=lR{7%*1Y4cN2Q73a3!vupV$4h=Ev!;I$ln}bKk(E?<^*dcp|sGbP-qF)ZE=KTFCmK zKr+jWvFn!v>mQA8rZy9wCB`|No11=Ha>~`erw>2AFL59!NRTNn#r()#cJJw|4m=-J zBADAM1x!kEwrpbCRK8?q2uEgGj+@%s*Mjlda}Rg1EdF)jdLZMg){sK|P(_~Ovly6k zL>fXq?L3foXVvG{&xev2mYDNBahs%*T)f9T@0nqbjP$mroJ9*m-ge?gXs$I zgyIFV39=z|>;754ll%8N{=W5t_X6eh+uQVZ@ox#d7atMOf4^Y1*% z(~Zs+lCyRC#m`39D(g(XeNdm3vS820BS zY-VR>IKy^k-e&vY{_M2xk6xTyDwAUF`Zn62wV*ma>h%hSkXd{em@*{i{aYOAa8h^k z3V~4OhRIUa{=Y&>8nnWX*BB+UoT%8b|7eYGSN!*Lw|%>-*wW_za?v}n;X6aaKWEm2 z%ffC92YLb}LbU2HonKWxt^Ed@>n2%kr&-U{kE&QWHhSIm=aOPLx#W9zh>Ks+m7=L# zOh;c%w!3pCs_9?c-;`Y}*2gZXw_WJ=SUy|QI+?A(n>lS>RZRblo4yH(+6=RqFS1R@ zxm)-7=bLlC4&SXy+OhTIhx>a47VWQ@ctmgEfdX^U6$=!MSM9p~;p95)HB8@)cW?eQ z^WpY2ud_TR%<|r_aa}0GhCih`=Txn2CtJ=FJ#w^yA#P5UNxQiMQSlX}x+uF++urLkRcWkjf29<6N&z z%w#)te(r(ahg287IP$E2@4E#%ELVE81hA^U=b5%R)8$@v&%)qW6P7YZC|CP4zpLM= z80*T+W+A(cGhyFf@wjQM>+}V3E;cX(GD#=!F?2XuWtF{K?Kb=6{?;-Hp+m2?l}M!Z zc?)IoPW zTzCp5GbD-q-pgP2n}K(iRl(Z^#)<~5-n(1b`uFpY&$jmE#N#?lQ5WYiC5cq;-^mci zAQq!qP|V3tbijaNqU6^d=AR}#)`{Hl{*$%h?_a9h{C0jROux$~5@Wi0k;u9R>wn5q z7(@)2{q212X^WrS@@C)8nR|RKWsjUw{QQ5K9zz<>b@LN!FRUN4R5G(nWLPw9W?n#; zsM3oc_og5BbqKI=`*G&m`MI*POXOp-yw)xLKV$VX{^TXBYwzEcIl(kxNpaijdcT<7 L)!*~^4ln@#@l4P} literal 0 HcmV?d00001 diff --git a/zscript/asmd.zsc b/zscript/asmd.zsc index 1adf27b..e2833ce 100644 --- a/zscript/asmd.zsc +++ b/zscript/asmd.zsc @@ -532,7 +532,7 @@ Class ASMDBeam : Actor Actor r; if ( t.Results.HitActor is 'ASMDHitbox' ) { - BeamExplode(true); + BeamExplode(mult>1.5); if ( target ) { target.TakeInventory('ASMDAmmo',2); diff --git a/zscript/miscitems.zsc b/zscript/miscitems.zsc index 80dd54a..78b4dd3 100644 --- a/zscript/miscitems.zsc +++ b/zscript/miscitems.zsc @@ -431,6 +431,28 @@ Class VoiceBoxActive : Actor bMOVEWITHSECTOR = false; bFORCEXYBILLBOARD = true; A_SetScale(FRandomPick[ExploS](-1.5,1.5),FRandomPick[ExploS](-1.5,1.5)); + int numpt = Random[ExploS](15,30); + for ( int i=0; i 80 ) + { + if ( Owner.CheckLocalView() ) Console.Printf(StringTable.Localize("$M_NSTOOFAR")); + return false; + } + tracer.SetStateLabel("PackUp"); return false; } + Vector3 origin = Owner.Vec2OffsetZ(0,0,Owner.player.viewz); + FLineTraceData d; + Owner.LineTrace(Owner.angle,90,Owner.pitch,TRF_ABSPOSITION,origin.z,origin.x,origin.y,data:d); + if ( d.HitType != TRACE_HitNone ) origin = d.HitLocation-d.HitDir*20; + else origin = d.HitLocation; + Owner.LineTrace(0,56,90,TRF_ABSPOSITION,origin.z,origin.x,origin.y,data:d); + origin = d.HitLocation; let a = Spawn("MinigunSentryBase",origin); if ( !a.TestMobjLocation() ) { @@ -1416,7 +1509,8 @@ Class SentryItem : UnrealInventory return; } Charge = tracer.Health; - if ( Charge <= 0 ) DepleteOrDestroy(); + special1 = tracer.special1; + if ( Charge <= 0 ) Destroy(); } override void Travelled() { @@ -1425,7 +1519,7 @@ Class SentryItem : UnrealInventory { bUNTOSSABLE = false; bUNDROPPABLE = false; - DepleteOrDestroy(); + Destroy(); } } States @@ -1481,8 +1575,8 @@ Class MinigunSentryX : Actor // The "head" of the sentry, attaches to the body Class MinigunSentry : Actor { - const maxangle = 60; - const maxpitch = 30; + const maxangle = 80; + const maxpitch = 40; Default { @@ -1545,7 +1639,7 @@ Class MinigunSentry : Actor } void A_SentryAttack() { - special1 = max(0,special1-1); + master.special1 = special1 = max(0,special1-1); if ( (special1 <= 0) && master.master && master.master.CheckLocalView() ) Console.Printf(StringTable.Localize("$M_SENTRYDRY")); A_SentryFaceTarget(); master.A_AlertMonsters(0,AMF_TARGETEMITTER); @@ -1553,7 +1647,7 @@ Class MinigunSentry : Actor Vector3 x, y, z, origin; [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); origin = level.Vec3Offset(pos,x*24+z*8); - double a = FRandom[Sentry](0,360), s = FRandom[Sentry](0,0.15); + double a = FRandom[Sentry](0,360), s = FRandom[Sentry](0,0.04); Vector3 dir = (x+y*cos(a)*s+z*sin(a)*s).unit(); FLineTraceData d; master.LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); @@ -1692,7 +1786,7 @@ Class MinigunSentry : Actor SENU A 0 { A_LookEx(LOF_NOSOUNDCHECK|LOF_NOJUMP); - if ( TargetVisible() ) return ResolveState("MissileLoop"); + if ( TargetVisible() && (special1>0) ) return ResolveState("MissileLoop"); A_PlaySound("sentry/unwind"); master.SetStateLabel("MissileEnd"); return ResolveState(null); @@ -1716,21 +1810,180 @@ Class MinigunSentry : Actor Class SentryFragment : Actor { + int deadtimer; + double rollvel, anglevel, pitchvel; + double heat; + + Default + { + Radius 2; + Height 2; + +NOBLOCKMAP; + +MISSILE; + +MOVEWITHSECTOR; + +THRUACTORS; + +NOTELEPORT; + +DONTSPLASH; + +INTERPOLATEANGLES; + +USEBOUNCESTATE; + BounceType "Doom"; + BounceFactor 0.3; + Gravity 0.35; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + deadtimer = 0; + anglevel = FRandom[Junk](10,30)*RandomPick[Junk](-1,1); + pitchvel = FRandom[Junk](10,30)*RandomPick[Junk](-1,1); + rollvel = FRandom[Junk](10,30)*RandomPick[Junk](-1,1); + frame = Random[Junk](0,5); + scale *= Frandom[Junk](0.8,1.2); + heat = 1.5; + } + override void Tick() + { + Super.Tick(); + if ( isFrozen() ) return; + if ( heat > 0 ) + { + heat -= FRandom[Junk](0.003,0.006); + let s = Spawn("UTSmoke",pos); + s.alpha *= min(1.,heat)*0.6*alpha; + } + if ( InStateSequence(CurState,ResolveState("Death")) ) + { + deadtimer++; + if ( deadtimer > 300 ) A_FadeOut(0.05); + return; + } + } + States + { + Spawn: + CHIP # 1 + { + angle += anglevel; + pitch += pitchvel; + roll += rollvel; + } + Loop; + Bounce: + CHIP # 0 + { + anglevel = FRandom[Junk](10,30)*RandomPick[Junk](-1,1); + pitchvel = FRandom[Junk](10,30)*RandomPick[Junk](-1,1); + rollvel = FRandom[Junk](10,30)*RandomPick[Junk](-1,1); + vel = (vel.unit()+(FRandom[Junk](-.2,.2),FRandom[Junk](-.2,.2),FRandom[Junk](-.2,.2))).unit()*vel.length(); + A_PlaySound("vfrag/bounce",CHAN_BODY,min(1.,vel.length()*0.1),pitch:FRandom[Junk](0.6,1.4)); + } + Goto Spawn; + Death: + CHIP # -1 + { + pitch = int(pitch/180)*180; + roll = int(roll/180)*180; + } + Stop; + Dummy: + CHIP ABCDEF -1; + Stop; + } +} + +Class SentryXLight : PaletteLight +{ + Default + { + ReactionTime 30; + Args 0,0,0,120; + } } Class SentryBoom : Actor { + Default + { + RenderStyle "Add"; + Scale 3.2; + +NOGRAVITY; + +NOBLOCKMAP; + +NODAMAGETHRUST; + +FORCERADIUSDMG; + +FORCEXYBILLBOARD; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + A_Explode(80,250); + A_PlaySound("sentry/explode"); + UTMainHandler.DoBlast(self,250,70000); + double ang, pt; + for ( int i=0; i<16; i++ ) + { + let f = Spawn("SentryFragment",Vec3Offset(FRandom[EFrag](-8,8),FRandom[EFrag](-8,8),FRandom[EFrag](4,40))); + ang = FRandom[EFrag](0,360); + pt = FRandom[EFrag](-90,90); + f.vel = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt))*FRandom[EFrag](8,15); + } + Scale.x *= RandomPick[EFrag](-1,1); + Scale.y *= RandomPick[EFrag](-1,1); + int numpt = Random[ExploS](20,25); + for ( int i=0; i= sentryammo) ) return; A_PlaySound("misc/i_pkup",CHAN_ITEM); int xammo = min(sentryammo-tracer.special1,amo.Amount); - tracer.special1 += xammo; + special1 = tracer.special1 += xammo; amo.Amount -= xammo; } override int DamageMobj( Actor inflictor, Actor source, int damage, Name mod, int flags, double angle ) @@ -1841,10 +2075,6 @@ Class MinigunSentryBase : Actor if ( tracer && !tracer.target ) tracer.target = target; return dmg; } - override void Die( Actor source, Actor inflictor, int dmgflags, Name MeansOfDeath ) - { - Super.Die(source,inflictor,dmgflags,MeansOfDeath); - } States { Spawn: @@ -1866,6 +2096,7 @@ Class MinigunSentryBase : Actor PackUp: SENI A -1 { + bSPECIAL = false; tracer.SetStateLabel("PackUp"); } Stop; @@ -1891,7 +2122,7 @@ Class MinigunSentryBase : Actor } Stop; Death: - TNT1 A 1 Spawn("SentryBoom",pos); + TNT1 A 1 Spawn("SentryBoom",Vec3Offset(0,0,height/2)); Stop; } } diff --git a/zscript/ueightball.zsc b/zscript/ueightball.zsc index 3b9a02c..a09aad0 100644 --- a/zscript/ueightball.zsc +++ b/zscript/ueightball.zsc @@ -516,10 +516,10 @@ Class Eightball : UnrealWeapon EBLS ABCDEFGHIJKLMNO 1 A_WeaponReady(WRF_NOFIRE); Ready2: EBLS O 0 A_CheckReload(); - EBLL A 0 A_PlaySound("utrl/load",CHAN_ITEM,Dampener.Active(self)?.1:1.); - EBLL ABCDEFGHIJK 2; + EBLL A 0 A_PlaySound("utrl/load",CHAN_6,Dampener.Active(self)?.1:1.); + EBLL ABCDEFGHIJK 1 A_WeaponReady(WRF_NOFIRE); EBLL L 0 A_PlaySound("utrl/rotate",CHAN_ITEM,Dampener.Active(self)?.01:.1); - EBLL LMNOPQRSTUVWXYZ[ 1; + EBLL LMNOPQRSTUVWXYZ[ 1 A_WeaponReady(WRF_NOFIRE); EBLL Z 0; // force no tweening EBLI A 0; Goto Idle; @@ -571,8 +571,8 @@ Class Eightball : UnrealWeapon Loading: EBLI A 0; EBLL A 0 A_LoadRocket(); - EBLL A 0 A_PlaySound("utrl/load",CHAN_ITEM,Dampener.Active(self)?.1:1.); - EBLL ABCDEFGHIJK 2; + EBLL A 0 A_PlaySound("utrl/load",CHAN_6,Dampener.Active(self)?.1:1.); + EBLL ABCDEFGHIJK 1; EBLL L 0 A_PlaySound("utrl/rotate",CHAN_ITEM,Dampener.Active(self)?.01:.1); EBLL LMNOPQRSTUVWXYZ[ 1; EBLL Z 0; diff --git a/zscript/uflakcannon.zsc b/zscript/uflakcannon.zsc index ba735dd..18a9f33 100644 --- a/zscript/uflakcannon.zsc +++ b/zscript/uflakcannon.zsc @@ -117,7 +117,7 @@ Class UFlakSlug : FlakSlug A_SetRenderStyle(1.0,STYLE_Add); A_SprayDecal("RocketBlast",50); A_NoGravity(); - A_SetScale(1.2); + A_SetScale(2.2); UTMainHandler.DoBlast(self,120,75000); A_Explode(70,120); A_QuakeEx(4,4,4,8,0,170,"",QF_RELATIVE|QF_SCALEDOWN,falloff:120,rollIntensity:0.2); diff --git a/zscript/unrealcommon.zsc b/zscript/unrealcommon.zsc index 2a87226..ef9e456 100644 --- a/zscript/unrealcommon.zsc +++ b/zscript/unrealcommon.zsc @@ -592,9 +592,12 @@ Class UnrealInventory : Inventory bool bActive; // is currently activated int Charge; // for timed items int DefaultCharge; + private int UItemFlags; Property Charge : DefaultCharge; + FlagDef DrawSpecial : UItemFlags, 0; // hud draws special1 as amount + // Drawstuffs under HUD virtual ui void PreRender( double lbottom ) {} // Drawstuffs over HUD diff --git a/zscript/unrealhud.zsc b/zscript/unrealhud.zsc index fd0ec22..279c18b 100644 --- a/zscript/unrealhud.zsc +++ b/zscript/unrealhud.zsc @@ -190,9 +190,9 @@ Class UnrealHUD : BaseStatusBar private void DrawNumberOf( Inventory i, double x, double y ) { - if ( i.Amount <= 1 ) return; + if ( (i.Amount <= 1) && !((i is 'UnrealInventory') || !UnrealInventory(i).bDRAWSPECIAL) ) return; double TempX = CurX, TempY = CurY; - string itxt = String.Format("%d",i.Amount); + string itxt = String.Format("%d",((i is 'UnrealInventory')&&UnrealInventory(i).bDRAWSPECIAL)?i.special1:i.Amount); CurX += 30; CurY += 23; CurX -= TinyRedFont.StringWidth(itxt); @@ -377,7 +377,7 @@ Class UnrealHUD : BaseStatusBar { bRed = ((Prev is 'UnrealInventory') && UnrealInventory(Prev).bActive) || (Prev is 'Powerup') || ((Prev is 'UTranslator') && ((bTranslatorActive) || (bFlashTranslator && ((gametic%8)<4)))); DrawHudIcon(x,y,Prev,bRed); - if ( Prev.MaxAmount > 1 ) DrawNumberOf(Prev,x,y); + if ( (Prev.MaxAmount > 1) || ((Prev is 'UnrealInventory') && UnrealInventory(Prev).bDRAWSPECIAL) ) DrawNumberOf(Prev,x,y); } bRed = ((SelectedItem is 'UnrealInventory') && UnrealInventory(SelectedItem).bActive) || (SelectedItem is 'Powerup') || ((SelectedItem is 'UTranslator') && ((bTranslatorActive) || (bFlashTranslator && ((gametic%8)<4)))); if ( !Next && !Prev && !bDrawOne ) DrawHudIcon(x+64,y,SelectedItem,bRed); @@ -386,12 +386,12 @@ Class UnrealHUD : BaseStatusBar if ( !Next && !Prev && !bDrawOne ) CurX = x+64; CurY = y; Screen.DrawTexture(IconSel,false,CurX,CurY,DTA_VirtualWidthF,ClipX,DTA_VirtualHeightF,ClipY,DTA_KeepRatio,true,DTA_Alpha,0.5); - if ( SelectedItem.MaxAmount > 1 ) DrawNumberOf(SelectedItem,CurX,y); + if ( (SelectedItem.MaxAmount > 1) || ((SelectedItem is 'UnrealInventory') && UnrealInventory(SelectedItem).bDRAWSPECIAL) ) DrawNumberOf(SelectedItem,CurX,y); if ( Next ) { bRed = ((Next is 'UnrealInventory') && UnrealInventory(Next).bActive) || (Next is 'Powerup') || ((Next is 'UTranslator') && ((bTranslatorActive) || (bFlashTranslator && ((gametic%8)<4)))); DrawHudIcon(x+64,y,Next,bRed); - if ( Next.MaxAmount > 1 ) DrawNumberOf(Next,x+64,y); + if ( (Next.MaxAmount > 1) || ((Next is 'UnrealInventory') && UnrealInventory(Next).bDRAWSPECIAL) ) DrawNumberOf(Next,x+64,y); } }