From 76df49e62b79505c1dc546ab7d41be26b72e6356 Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Wed, 1 May 2019 22:26:46 +0200 Subject: [PATCH 1/2] Added activatable items for Heretic, along with a full inventory bar. Support new versions of Kinsie's test map. Switch to new GetAxes implementation across the board. Minor fixes here and there. --- Readme.md | 11 +- graphics/hud/HFlash.png | Bin 2610 -> 2599 bytes graphics/hud/IFlash.png | Bin 0 -> 2659 bytes graphics/hud/IconRip.png | Bin 2080 -> 2079 bytes graphics/hud/ItemBelt.png | Bin 0 -> 2215 bytes graphics/hud/ItemBoot.png | Bin 0 -> 2026 bytes graphics/hud/ItemBox.png | Bin 0 -> 144 bytes graphics/hud/ItemHbox.png | Bin 0 -> 2089 bytes graphics/hud/ItemHbxb.png | Bin 0 -> 2893 bytes graphics/hud/ItemInvs.png | Bin 0 -> 2452 bytes graphics/hud/ItemLite.png | Bin 0 -> 2228 bytes graphics/hud/ItemMbox.png | Bin 0 -> 2195 bytes graphics/hud/ItemUdmg.png | Bin 0 -> 2041 bytes graphics/hud/ItmArrw1.png | Bin 0 -> 172 bytes graphics/hud/ItmArrw2.png | Bin 0 -> 262 bytes graphics/hud/ItmSel.png | Bin 0 -> 128 bytes graphics/hud/ManArmo.png | Bin 1195 -> 1192 bytes graphics/hud/UseTrn2.png | Bin 832 -> 639 bytes graphics/hud/WomanArm.png | Bin 1022 -> 1021 bytes graphics/hud/WomanBlt.png | Bin 2663 -> 2658 bytes modeldef.misc | 100 ++++++++++++++ sndinfo.txt | 1 + sounds/FSHLITE1.ogg | Bin 0 -> 5334 bytes zscript/biorifle.zsc | 5 +- zscript/chainsaw.zsc | 6 +- zscript/compat.zsc | 190 ++++++++++++++++++++++++++- zscript/dt_coordutil.zsc | 64 +++++++++ zscript/dt_matrix.zsc | 3 +- zscript/eightball.zsc | 7 +- zscript/enforcer.zsc | 12 +- zscript/flakcannon.zsc | 9 +- zscript/impacthammer.zsc | 15 ++- zscript/minigun.zsc | 4 +- zscript/powerups.zsc | 2 + zscript/pulsegun.zsc | 17 +-- zscript/ripper.zsc | 2 +- zscript/shockrifle.zsc | 10 +- zscript/sniperrifle.zsc | 2 +- zscript/translocator.zsc | 2 +- zscript/utcommon.zsc | 53 ++++---- zscript/uthud.zsc | 253 +++++++++++++++++++++++++++++++----- zscript/warheadlauncher.zsc | 6 +- 42 files changed, 663 insertions(+), 111 deletions(-) create mode 100644 graphics/hud/IFlash.png create mode 100644 graphics/hud/ItemBelt.png create mode 100644 graphics/hud/ItemBoot.png create mode 100644 graphics/hud/ItemBox.png create mode 100644 graphics/hud/ItemHbox.png create mode 100644 graphics/hud/ItemHbxb.png create mode 100644 graphics/hud/ItemInvs.png create mode 100644 graphics/hud/ItemLite.png create mode 100644 graphics/hud/ItemMbox.png create mode 100644 graphics/hud/ItemUdmg.png create mode 100644 graphics/hud/ItmArrw1.png create mode 100644 graphics/hud/ItmArrw2.png create mode 100644 graphics/hud/ItmSel.png create mode 100644 sounds/FSHLITE1.ogg diff --git a/Readme.md b/Readme.md index 0bb4412..2a63c19 100644 --- a/Readme.md +++ b/Readme.md @@ -49,6 +49,8 @@ This mod requires GZDoom 4.0.0 or later. toggled) - UT-like weapon dropping style - UT player classes (sound only, no models yet) + - Heretic compatibility + - Spanish localization ## In progress @@ -56,8 +58,12 @@ This mod requires GZDoom 4.0.0 or later. - Add some more effects - Lava/Slime footstep sounds? - UT gore system (toggleable) - - Heretic compatibility - - Localization in all languages supported by the original game + - French localization + - Italian localization + +## Ideas + + - Chainsaw balancing (maybe give it ammo?) ## Future plans @@ -74,6 +80,7 @@ This mod requires GZDoom 4.0.0 or later. - Port some of my UT weapon mods (and maybe also some of my personal faves by others, such as Psi Weapon Dreams) - Hexen compatibility ??? + - Relics? ## Known bugs diff --git a/graphics/hud/HFlash.png b/graphics/hud/HFlash.png index 64c5186638e7e00f81e58ca87d5f7e290596cf70..9f5193d2019cc6522e9df2e610e0eebb598a64c9 100644 GIT binary patch delta 2051 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 f+wW?B^Xs2|-2e5$drbxg1_n=dS3j3^P6 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 FCIFt|$43AF delta 2025 zcmbO)us~pfW&I^j7srr{dv7Ce7Tq}}YPb#`o zQ$kudxp>_<`LJNa7u(7gY-|s7Hf{ZRRAXhw%e)8kcI!{5PpDP>@oW0sore$ZWl(5g zU=d+D^l+`go#R)3xYV?^NK4A3{m^W=Vf)~kiN=Bk1(#M42SuLf`b2l;Lmff^91@xA zB_gd2BCHO9ikyMmbMhDd)xGzZ`-tE=rr@~@eFd$3f&m@MG0jesBNluVk$Y&x)ZcTy zQ1+?tQN!b=kG|cv)oG}5iROK<=+BM+k@`GlO$-c7Wo&WV6P6r_YfY(Vi?A1}(@r?N zPt8$v?>dLPh(qsKPx4(pR)6+FL(~WN@h6pW%lA4-Ux*hrb~18)g@l`ynD%K+3NE9{(2ns9v@9U zwrzLZ+!;{H&2X35frE>IisQykC?tTokz3yzS=0l0&~Ahfik+@qOT!*gJcP`m;MC z=VTQO)Bn$m_`GG6wE5-#CyiAZRW@fPFA%M7i#wpen8UcBKQv)dk=@xpkDg4w{=NU) z^$FRRPub^2in&glZT{Rps+>i2)As#;ZeI0#rFmJs%1-zFj+ISog#w&3_x|rHeERUp zkJIMr@5A0so8ZYBzC%1Y;jGvFE0Z5RSYU8{{kpgr%_VWyt7goP@mHPHZ`gTgD{sIy z4}}b;Nq_1SqSU@#{rEC;?QbV@(G{&0yA7_TWp-`;_HUC(B%h(UeJU&8oP3U1=Oj2I zoU_Dhk{Uz;T8$Y_Y5Igs(VQ;6{=Tl%zpgKC4x(G{IQn$Y@4uT8!bJ4aV8` z|JGFfUY+uPp?CI!f2R)Y*uU531h4)Bh3}dx=Wf0ybN}P!tM*Hns#bTt^mrS>D3~Ra z8(sHI%ST=-U0dLhFMC65J*!}oo~YE_fbF;E)j0jlc(t^bDIlWtm4YN&{RIv2w?Ze_ z{=V6Ls3mDl|Em{2ITr5IUcBTxcPIDE?8Uq<_IXHr%rXCec>3kSdCT8i{PWm$Z??sW zwp&*#Y8y{Cvh2y5+MxPo@kBol9W86F8wmB(L!EPeuusb&Gjllu0wFXs@~+{%hwAwj&25 zlDV~Z+Do@pOi8QxzwKYjAtvVJH5)riXVw?%on9(ws&>2Bkx}H`!@r*j<=_64esL(` z^_s1juVQ9JDGPAys40lJeZWstWoKM$+3a_f%jQjZ^{FvUrqoOzk~w*<_uQ>!TUYuz zMKIa!t;)K;S|j1)S|NdZvpd(G3zv0nw|~MAF+XmRjln*-MOXFiy06hcW#T#Mh)U!A zZOg*H*56yL-qFPWry$uW$mmW?36qD{exVIJEh5jx%ghRV!|^5m|Lw-o`%}4AY};Cu zx=4Gy%$GVY*>bn&M-8DGm)5*wWvDNF-53@<_s@r(ee<75WH2!(^+vi2*56)nDcJGk z#;Eja2d5|enT>M=%l3v}$(Si<(z^2 zpL%xK9u(fZ;|CX!|r@D>+{+k z_EDPQga>Qos)#vEJHJjpou@qW=B`hUmA8B+9h#iYCRs1GTwvOY{A$K0!Zs!gZ@ozi z7ja15Df*8!CMiLEnu@B^Rf`OPb*t~yt@Dg4L+OGmR6Y5y)Kcx z=dsH0*p5XfE?o(IyWoC}&C}@fZ&x(r%KPpQd%ue{J?TVIaL7i>?wDMyklJ5Io;FT;V~8SW?QSe$uGQ+G>!%UAAnot*LNPqcDF{;gyE?8&>1 z^E$hh1RtGbnSAx;_1ITDDkcUQ@5A?QO^%2!7gLD3U+tW0BOLa3f>m2|-<_Ci&WfCk z9HHq_%&B+PJH?Y1wlp*!Jdt2?`rwhyP}#Z^<*UNdGpjeaw5__awtoBF2WuE#-w0RT z7Cx(bNt1t+LWX(r*KI+~@-n~ct~iAp{3!lc diff --git a/graphics/hud/ItemBelt.png b/graphics/hud/ItemBelt.png new file mode 100644 index 0000000000000000000000000000000000000000..1f32ca3d7216bf2e04445659e5439fdb97f3d682 GIT binary patch literal 2215 zcmeAS@N?(olHy`uVBq!ia0y~yV6XvU4i*Lmh6!H z!SmYv-*-R1mzo~=ZNX`s3q>6cUe1@zwl3J#7-4YCEGl==wlLwx6HSg>yP&4vdwI#l z6${N4My%1jHEV&;;hU>G1J6B;ikN1bmY!bz?&q`J{og0d)oDpyc*E@9tmhjO54Z73 zo8?qQK5*Zm@WMUwhmo`KC!pyEIoHb3SQVwzcp6mj{!> zMasq9Pc8jZ@cO``_omZ+IsTbqE?gO0FJ)3Tf5*EErF-B0?VNh*vt!oYTjlIxygfIU7~nR-D6j*Q3whO3kWw3FnE;nzI3~FYn!OANtunsm!n9a^>Hhk&eyMqS{ojDf9~-}D&pof-rvD;qHRqBlwpmhAQLn1{R=$4m zG9!CM_NtYc*{@!|wp^kqcCwT8(Vrit={<2@n|}+h=a^&k_u+?kSs!N9Cu}RZwy8Ny zrD_&e(8{JoZ6OPCVuG~QjI1qikronBH@u5G_x^6Nwk~wkd6SmZ|zJ6EkP;4?AI$} zBI=&)pI7Xa5?l3g*=pr}%Zwvpm#e~9*y1jod{;RA@!p^J7HykU6xFr5>*j=_0I$!H z`nj){tgTaj>6Sa!qVxDB-J45RzPY}6zTh)cor?B-Q5HY1>ev2n6Me1p`ddwnM$N^* z+{wG7xUR7@O?}h7(|U5H{>eQ$SBt7PmagWrez{tY&u(trs;S*eBQ~WTzcxGn&l&N# zB2}Ks7N3dX6mp8efnV|iZl0_#x8aKx%yZCZ_d=nvgr5Io36G+JZfD9&4T5_R67CC|1 zr~f|t!~a)gi40GaUC>1_jvkrXKaBdEYo&i3OTJnA>6cJ3+a&km|L>NoOuQ#2m*sh6 z+LwE|u_>{i3M%jK7`{e|Of{a%|(-uU-94zf68|#w(xN zYtscI%ZqSLN$dbPz zxO{K*mrG%V^@Te{o=$dJXHs(Q!K6Rml0MeRm#kiNd#&u>2z&zibVQ2e#* zN&k@JOx-{KrQ{j?4!CclHBDz_UHy~BUAKGLBQNlXADZTO=^We3Iq!F#a<1R@d)B(g zT3*w5r#$7kopednZb|C?Ta&N3`bEy}eZRK;%k$bpQ(BE@@4vzA_Vi4Klq=mZIM&V9|6 z`n|H?{bj$dIh*Wn|GeqBhqc%AB>vwvtenkrrKi(JyK=u~{|t%#_5M?PX9tL_ z^m^-XdycYRDFgeR$1>AzJnirZJUzMX?t7c-zgpGb6$L#Jb?1L#AGNFQ*Y5txgI5o3 zTGqvRdYZ4)_m=w0(^p9a1qPY6OpYJ-QOfG(f1YOx8#k@n`)QfY>Wu4+ z6UEnb?>VI~d#`qR!N)nQuE%AjOy2H#cUISt*i&V*gir8n37t6WtJ10!+_tL}iucV? zerJ}|zAydF_Pc%?1=;ieMkK{PG5u%o@9F!Vx^+vFE^_jU&YpTD^zEiaNmo9LwJZzO zc@Y`BIVUjw`l?y&wE>RD#a1dVX8Ts<=66$V;?G}aw$Bl&oZDR9cW1(rG*-4*ucoZ*XZte^JYQb0u=#e;|)m(SNuBH%~~drd-~d!R-@9=Qtn%``etp{nd-%= zq}_Gz;l%$lDvoFu-Bb8}<-w(YJAEyEmvBt<{K_(K+oFug%jT?_7rHsjWKG7ajF|!E z>7mhG5zE%-q_4Cs{(Fygea9Y0<#m7F-4fPL|I&NXlSQdgweiNB$|b+7)N(Fw)VVaB zqlA~`+LY3gBTSWza{|sE_%dI<=Gy8Ozs0t<|CY=;rc@loR`tuMa-xh^SBGxJEyir8 zi4KmQj&X~0r+IuaU6c88MnHAeQ|&nA=UbZozP$D=^>(x1>Lf*_O3~T68WP4URX3{z z3TSF*aj#8z1F74(IxB`F<-?e&VZDx#cF?#Cl(@K7Bhi;^59z zpVHllH=3r-&e?i>iKw`z z;O*oH*HufGE?la9>GO_RH}X2$vTpr}`q@AKl~wP7{sLFcJ%umJ+sxPAN9c6|Nn+D#Ry+S|3B&pqbiq?`TA zs52x@Vfmux4M#l6&+mPEds6lH(mg8=+}@%sW0(JN@>+k3&rFMdRRtZ{B{Xwi$i)?+ z?%&hzpSWN6t@F82zUGH|qqsMF-!EF}yPGZDyu7shShA<(^vv(mtBsx855GJ$ap!aY zKmPh3%~Rz*zp4B;s4yuy?e ztXS&Is>?KWo6^(;ix#w*DQa?>oC`Vr@y{IdyFcd@N0>C-kiE2Llf#MsPxt<>uKzB5 zuKZkUZfh3kde66`e@=X8)tG0VqHxY4yYhci-TeojHvCz0XXR@vjnWg3 zWafQ-^U65f>fQ4n-fyjCgY*&`Om1I``DXn4WZ3)KBSsOL@_H|u%C;_+&CQM$|5|E) z^NnSSUDYo>+f}ElLau*Za&O`HSDAZ@6OWgF7hCtO?)BWfiu*?Sn>T6%s3)}Q=`DWL z>pSnl&b%MaB@qsZ6P4X3>OFM%WBZu(-xc*6JI*oW6fN=4G0`+l-~2qrkw?Vx0F$D^ ziOJ5wiIaN1NPb)+Fj-AVn)|~<4~6}#cUG}oGiv(Fa-`x(L8Bngs>kWSnC+A1&Y$sE zN31KbEz`*BRKrHmHh8+S}c^N+Q*a%y;WuWfBtct>N2zkWZw` ztUY379Be_ClbbPYu?&w5o3J{*K8f zd98McT#QgDc_A?A=Iq$HSse~ZlP)Yft7NEIzu4Jq7FUUU!d(u|o1OiSI2311nUQmP zj<>X#pkz}^gPLW~t}Q2o`L$;+;oopk;Kq?HF9TH;HFvu1U|q9{O_R&h&7p#tYz(t+M-Q5}WQR9X+DBpt<#!y2|Y*VOt$oez>SK z?3+{MdPbF{ZfXD1DN`l~@j3P!G*S~|jZwJuB1(xK$OLk2ZQo6wN$gt@^D#!Ga%js=j^%w;;nYtxB+k87C zO&Ay5azC=^Ve%rz-s3`(c&3+}cJvJ86%o_aT;0&>+RiwQa>G*FU!vnXlnm1V&Aay>!H8S+yCq`*yq*1yn<8uq{u7|N2hf!>OOsom*bQ_Au9LIF0EQo zbHPRl$3y|a1sX;klf^HZ%ltScSNi^;`ju*i_u_Nq^=lq!?0y61ok>Of-aj;) z_Uw8sQ-9CW;77&jw+|L=C@8qlz{2%p=8=Sn`#;I3-zkVhv}+)pH;RitlZ>KnRcSPeC^}}20k`Tf#ipVhdI_4i}hzNTN(V2 zE$-pRW7Qe!_Q))D>$Iw#aU_}TsA7;`QIBEK9Cf+XA$RU-#yS`rakn_f#mRIwvTxFa zUpH^|ybtp_@0EtV7wgUENt}=@KiR~iVpfBV9IH-^p3;OggVTAxKfTM| zaE|>W14qQMggKn2QgSXVX+P>~Q}Eq)|BsrNv9niyZ1@|Xz-Dv zuL)M9EOCGPn`wKy)8mbYRMZ)Kk1&{Oi5LdD97%DQ%5ShGyynZV`}^MPXZ~?**4Ge| z1veWHO6kq&mT}&Eh)Gj7D2c0~XY%Z7C8ivnn6Qr*Q!J)PE^Jxm+_uEkr^%mP`0kF1 z_v_N*cYiT^5b69s3PQn8+TCvVXP!3LEh$_Ea+ z#sB+UaN&o;?9_9GlZtoT37ENm{kKOimu@!+|1$HExY>=vI)<-%ly15=>xsQ)*p73`KX9L zvELRy`!x0J#&sTgf1jV2_wn#0?UUPg-qYN^Mov(YQc^4HP!8h z)WdG)GyeY`dekII`ASgc+zo4Ub6@}W{m=AeUg(ZHQetly7#J8lUHx3vIVCg!0Mp8| AJpcdz literal 0 HcmV?d00001 diff --git a/graphics/hud/ItemBox.png b/graphics/hud/ItemBox.png new file mode 100644 index 0000000000000000000000000000000000000000..4e562da07130b07bd627e35979e1850c9bcbb32c GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9oCT0c(hU@GzeHj=ScmjMvT%DYpf`WoVLPBb4 zYG$+PMlvuk*n7G-hFF|V{?X4S!NL6}G2uZ{LPA0ogAlib#GCdB2lj`qp0+M(YgVe* vgpR1KS@z2g2zB?ov7 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 Y`C?7whDE;_7#J8lUHx3vIVCg!0H*9AO#lD@ literal 0 HcmV?d00001 diff --git a/graphics/hud/ItemHbxb.png b/graphics/hud/ItemHbxb.png new file mode 100644 index 0000000000000000000000000000000000000000..ce07f1a0b9be1f020bb80c130112c022949d29ff GIT binary patch literal 2893 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 literal 0 HcmV?d00001 diff --git a/graphics/hud/ItemInvs.png b/graphics/hud/ItemInvs.png new file mode 100644 index 0000000000000000000000000000000000000000..2518ef8f3193d8311e97e81662d32529e7ff5594 GIT binary patch literal 2452 zcmeAS@N?(olHy`uVBq!ia0y~yV6XvU4i*Lmh6!H*46U=uZmas z{T2Ur|DU&S+2_aGuf^3}eRfTD`M;gdd7rA=mw$VbtiJzAxz)6LmftGR=gG|ZaY6pN zd?m+&f2;FvZm%!BpH=+$yrs!HpZeGK7v@zRJO6)&^Ol>M-`ZY3mS3kQbNo!tyZ-x` z{7)jbY&Cw<9cS_R@oceIPgXp9angCR^phoX<}jZ4 zv^J-C)06ji|6F0Ly}9g{>+kToipO7c)L;Br^=01uXGe5G@868II-NYnZb`o`@8e=M z|GX^w$maSL{CoH19{*vM(gUyd7HT>L zym5aeW@mVJxE17%Y?~r%IXDVI9y~|oyvE?QFl{ANzV%-4=%gsh%Jf9m~1TZY1p1QOUWSzM#>9 zrD;Cv1dD~uY&Dvf4yHdXvTblZ@Ob4y&*{h5*GE|87%PN3s5C8N30SYT<;2OtEX`Hg z&mXT8FqqLZr-|XmGhd^;0^Mx3oJqZTj~lvV6p9qzO}=zM@Jr8HmnL0irzb}rdNSC* z)lP1luX=Qovq#}#UmdYMoQ%(sJGq&hnO>;h@wwT4&LdVw%7&G(^X!|7uGM+B76v%5 zacM6~Vp!aKDdU>P0iWqpS55QLS(VhGDkKx|z$c@JJ+Ebw>xCsEY~4x%jB9Q=u{~iC zN&2+GY|e^lN!i@~Dom1%4g!%f+;3*xi%?Qv^=*-GWf8rswIQLiGw{~SulLHfPj-2F zMzET9UIW8AOSuY7hG`9|5=lnn@y zv`I~Lss1!GryHLq-ECgqqU!6ztEkv6Bj4oDVC8sSI7sBdlINcm&0m(O&mLsRz~}hk zv(Q^99XC_fZuP^DMdrzzU^JWTXmg}cb=I7l8Py!yI1*oY>}6DBxAE~Ry`B)xeYs7D z)2T;P;cLJOhQEtslv>QXI*jYA#ZSp`EIHR;prE*P#gogs^ho!R52+!E``%Uv~ zB_>?~#`BW9QoeAWjb#rne=nu}!#MZUlt5+8bPmM{7nbU5@x17;Vvb!@x67dhT>;&Q zplcs0*iP>b+p{TVp&u)E#+?_5?Q*6Z&$|T{GB`VCt_a+)y>pw4>`z{XIBk*Tmd-By|D2Nk1zNuKD2%yQ z+_-s88dvwR^P>8DZj|;3EX?sbV5qWSaojzRdzTm^=5U%@$P{0ReBx=cd|uGKsgGvv zta_=XrtxCJl~*s|_-bmUW!289AUn<_KL2U}mgWovbmnDl66 z+SI#CgNxRE-sk+Ue9rNp!$C@i_HX=uE->G>LsZI_v-zYSOT*O4;{Iz=-aU#>Rq7u- zasTCB#(GcT&h&fL(}Ht?7CK3`s_p)L^*ZC0(maRWP1Pkf&!tk|Z>;7K3#bUXwS>QI z_rCqNSyS$QZhVrjZh5YOGfAZBN?UwwEw7V~oA6@8#V6Um+z|yM z;XdPQ^EW@|*5fY&jw$g-+_S6b?KW#*YEE=0IKTZH_tl$PsY-5BD_s73{gFLAXf6&v^Mx{B5xIk_xpI3pf<-$i>}ScF1J1i_4m%{+rfy^_g+cu5`)Ne4W>x zX>gp4-|+0^3145;@H)@!Fi_g8by*2#0>~GPG zCM^NO^BZ=FpH}iu@9g+>=78Il8Osi-=|2!if43?A=AM$~wZEy8>f z(Kx^Cl$56JgY~(^pF6*vev+Ej`t$2f=Fi()8P^CjXo_VTcu&=yarDw7k@U#s^Q(Vb zO+T-({YU<(wQZhRAu9zYUQ$nQv{G1-Q_z?z^6J@H`Pi^_ySm698&9m@kP7|Y*r2q` ziL-TiyQ0jgb@Au*R|m@3C-m*s=4JD5l$O0=aAl?72A>PepZw*{m7C4GrMYABt!i&Z zmeP-04T~0dv%5Q<*wtUM@3Z_5iAz^}o^fAvTCsFvzmsOS%BI5_s#iTtH0GY|S3kM) g!2jF-qkdbT-|)0A{XvEd0|Nttr>mdKI;Vst05lnXApigX literal 0 HcmV?d00001 diff --git a/graphics/hud/ItemLite.png b/graphics/hud/ItemLite.png new file mode 100644 index 0000000000000000000000000000000000000000..15b082edfec8c9c6340b44277717fa2fcfef99ae GIT binary patch literal 2228 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 N;OXk;vd$@?2>^c!wT}P* literal 0 HcmV?d00001 diff --git a/graphics/hud/ItmArrw1.png b/graphics/hud/ItmArrw1.png new file mode 100644 index 0000000000000000000000000000000000000000..2fdfd79afc2c46055fd8290f46240e9a24519043 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0y~yU=UznV36QoU|?Xlc3SBI0|P^`r;B5VM0oDRjeHFT z94^0Ad5>5~%34ds@`(TcU!SwFH|Ug0+zz=IW`DyOk7~EJ6sT`vuy~fyz;N2#Lt&=M zKSq%fGxJF?Rw1b&Rjn0wOPmr*vmF%8!aOrW+p~G*9I>_9u(f;V)!&cr{Ipx3=OkYA apO^okg2n&rsNb(Z&hT{gb6Mw<&;$Upemxcd literal 0 HcmV?d00001 diff --git a/graphics/hud/ItmArrw2.png b/graphics/hud/ItmArrw2.png new file mode 100644 index 0000000000000000000000000000000000000000..51e99d1be1571f83bdf7e84e6a0d6171e7cd84f0 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0y~yU=UznV36QoU|?Xlc3SBI0|UcZPZ!4!iOb0sE(E1I zFiPniTcPyIG0^Ol1`}i9#dWtlx~}{+{*?TeS5WEIKGo^ZjP3TGg~s{!>-Nr&lV;n4Zg$;y=Fq z{oi=QLf(eSet+({o}#O+62FqXN;Yh@Iy3G4e!Z(MKb`mR3jO$;TI|)*ZFVQo|GsZG z-?qSZ>%A%Ywmz0eexKwNT<7tSgJ(fNc4_Go1s;PiS3YOn?AXvN2BGc`jTjh~)D$o! SK4g0W@}Q@ypUXO@geCwp?QRhO literal 0 HcmV?d00001 diff --git a/graphics/hud/ItmSel.png b/graphics/hud/ItmSel.png new file mode 100644 index 0000000000000000000000000000000000000000..463b95775090ade461606b33f9388fbd9edada20 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9oCT0c(hU@GzeHj=SI0Jk_Tp7UN^J&KH7gA9S z3=E7VL4Lsu4$p3+F)%Qwdb&7)6Xo-U3d6}R3@&n~{?AmO&yZHi{d>aewoL))tkYn67bU9{5dW{lYd zA&#J~Fjm1|fBxG)$ZN`6BkrVUTzBJhO)rZ4$aE-n z-bc2jbH1-$p7H&a?1Cv?e{TBr+}-wio7;)X!yB1-s@85ebV{r*nw|ODrWaQwtk>Pn z>)kljd*1#%-O5vgrU(7bb)8nci79$>#93as6KmY3&h?S;(mnfuSIe63z5i9a0_)6w zRu?X;RCjn|E-kHJmKa^|tg_!N(p=rsR5udi%Sub8K?Z^47r&+g8;KjFr< zyBqh`*gF{8f3A6)epZQJmW?y3lp$5Ku8#ACuoOptQ-|=n{{CE#US#nw zWAZQC>Bz#kx}8;1IO|NpwuaDlCC^C7dWp@fCK~CRgft#h7e7-mIAp46eC@-@IfhJp z*Ov0EtgQY}|F&!MZ^jCpge9%aXSZdxWq;y5J(J6$|D$5W6rQb?mh*gMeEC_v3GL%_ zb!dFY`C`f8?b7SxKc4Sjw!bvkII^`aRnYn0v&VZUhpzuHEva=rzx1kw^#}XQ-dtdF zP-t^z(%>o-7BFDxR&X?6Fy6rOTi+qLSwW*{#rG87{eN=fZ5?F(SLel_vduo86MuZ? zwfpj^KR?d%I4pMgWjn*uy?Il1W=}3;5f^Xp*DGq|o;7_sw*~_P1B0ilpUXO@geCyf COja@g delta 764 zcmZ3%xteps9>)4xo-U3d6}R5rcpH5wK!WW3E)=_4M9(7ug;W zUG1JD&;S2tw|efd!zB65($)Om-#34fQTtxYE1Ryx#Q+8e>b2`XUb(dRgF)@5o7_83 zXCBj^T=2JIX@URJ4}wRJt~~V7M1enEbIH{D=_~f_ja(X3eWqU2R8qk1$;^lgUCeJY z`&NDZDs|CE>*I6rmj)}?9G7}lR$7I1N`3X(ap;JUY-pKOO{&Yek{9fbTZ=rre?Iw{ zoV{hev6#WLy}`vhYy6bY7yQ(bvN`in+3Szv>GU(EZ_1cUuZkZxuI+!}cj-^%qD@Cr z7%x}v-tZx**Jiuz=Gs>u>Pw@~^n7Gnb?US4Pn*qq#ccgW;xD|Itr#D*XTi(LxU-Xg zzGXQ4Q|Z&&c;o&%UoAIVzvjK<_W1dEfwwc)L^sS__OkuCea-iuhG`Y|RH|gm|BITg z-Q1*9U*4;xdtAqX-O4+rVSiw?$o2zz-isMNYl>_C7rNRUa^*$V8m90Q-p_gJBTVF0 zA7Gi;wr}c|hPAJ&&SZbmDP6n!ulS9JQgi3`mzzpS$nCA%|C#IQKJJp!)6MJKd>Icu(covtBwEK81fS+e9vjm(RP|ZU_E<_gClB(cK9yHq30i=@ZtA z1U8t>$zVN`!(|gI%&R0)@Y-ZaN>Z!&i`e=DvFg5oo3awV>m^Jm(_78N`fKCW&q^1T zNPDHFz1)2HG0zW^^(h&y?+*UorhV?6xP#Q9WrBPqtNMiJoqcaIEtBynXYHFhjhny1 zUaz?NiFb8$g7U+;0W4CHn;KHD9VvT!Hv8k($(Qf#dO5R(>u+8Q-;uffd(^dKg|!c_ zs;CLLmRs^#+czz);r^f3MzOLsai{%H-wp4LOPhb*{PgmFwu*P-9XZ*22O0m5GtR9iyFCS^>06t2U70o>gTe~DWM4fwi0Bp diff --git a/graphics/hud/UseTrn2.png b/graphics/hud/UseTrn2.png index dbb8868c1640f95c6c6345b424a8ac0b479774bc..195c0102ad556f133627ce144148dd01cfe9b291 100644 GIT binary patch delta 615 zcmX@W_Mc^fay^rqr;B4q#=W;UeY2Yl7}y@XQ+adAx!?M``Va0aQEW|zy&f;+v08F? zQNSLT7xnRzeoZ`bQTGiGOo74p+g*4i>~_y`4XiZJHbE1j%gm^nd5yHTnk_IwTN z3RW+M9r6=Q8oU-THT*sux0!JY6Dz~2`HT|UIsps|enm0}x;Qhg@Z#aHa{6A}5Ol%* zMT`W`fxqu#8TRlcsBkLGv)i_x)nMBGuk&s^7UN+z_^i*A;Akd);Q23BhGbiHg{A`) zEC$b6cf?4RH^z8BVLWiRUNWNd*HflN)eT!YZ<{l$XAET!e%4gClp%0`P(z~4bDor4 z*BzGq)(l{Maf3aD>CTITVLCz{%nv@#vcL6v4l9Skd-l$-h6>&T{7a7;^52NFI2d!h z@LHi%l%jeD^Mzf1X7V`vjor_AxJPgc!wUPtWlXQ?E_3OYW&L`YGi#Xn z8h&lQFpFcsucOVGjNAwA+w-U~z4+I6a7qK?grEFsOf&wiJLt0ENTKF|xBvPX0}_8* zvnM-BPLHlvW{7!Y*StNlubH7Cs=iN^QQ*5w&SMKs7VSx^>O~qV-L2lNO=ddj^JMz3 zpYqHzKHR$O{mJO+zr_*>j1MN(SY4}dNLZljM$DEFF8o%grfAMdzIf+`Qi bG1mX;Dk-@e%fEtwfq}u()z4*}Q$iB}5jYXj delta 810 zcmey*a)51uay>J#?BYRXD>5FJXytQf7^F=H_>OvgqEkhaRA6+BPZ8KRlV8#YT$z8l(?*DswV6*d1 zZvW$QyeCfuB*iN3uCa5g@LQ|6^T+9HMG{XfZvKA5^RsuAzN6psD5->tbsu(x_O8u3 zJX>LTaitRXh8c@~H>I>hR?lORoO`;~Tj+pyy?l>tf9Q!PnSZvZBp-;D@0q0SsCND- zzqb*`-!HZtMn65D*RwS2-{(8QLq(`lHL_Mj=KYaL$uF7%tE{$PmDWG`a`Ayxmmja^ zcgqZB4fvf~q~`DJ@V`t;&RxDI->~7vWRcHzJ5OBJ;C!)|A-%cp(+u^ps@d%C8P-@X z{P~`7N^Je>w))^nFVo)c_~`Bv|IIe>ak&2H*=;lIx;EGOekeP(t9QIZOD_wyl1?hge@E$bFr?C2Z$KPDzFr zb8fI)b6mi`Tv#~bw+nNEu*{4=#tWAF+Pr3;V0f@2G}mPkyK>%}1Ezv|x9|V+|Fad> bZ+6kwY`eu+KWt}UU|{fc^>bP0l+XkK*P4Y& diff --git a/graphics/hud/WomanArm.png b/graphics/hud/WomanArm.png index 0062baa7203f47949bb22cf5ff56d1b1efe2793d..5eed79ea100015f41cbadfa7f645b77aad41edeb 100644 GIT binary patch delta 644 zcmeyz{+E42D`S1Kr;B4q#jQ8fVuOVZMcNj3#I2aJDwMlx%C?7RrM7+Ro)+ZfA6R&S zHPbu#O4Yyr`#&TlK4{84?Q`j)(s|#s=WovaesfZ#xaC8Ija>in#~&fo&-#-L6;{`0 zGhBP~{CPp;iDIrd{DB)}_V4MPzi^l81g!^$eJh!de$i!&t+!rsx?+-VH_uhPMGICOe|S~?(%);>@*@N%$gEgqY51&;NsZ%I8Os5~{a5}lh0nhs7!g%9ZE}!T z!FJ2#49pEaYu7~V<&|enww=zve2CMs=W7n*Q=Rw@agDPg1vB+o_!djnWY<65S)lRZ zZ%P&Wt+yB34%aBArtfOFr)5*1sqkUBk?#V-rUGxVubE6zv-?LJ~JnzxTBo?!UD^tB{($6q37<`w0#jUB=#oFk2ghyfiuj}vj%x2(l z2^6VWD9<7-!0ec(z07RG-}1z)1hpI!;dw7YLV2SnU3;gUyuDH7_%FT7^Pa4!V~#JK e$<2TrJlM~E#z1gF)25zZAO)VTelF{r5}E+kw;-PY delta 645 zcmey%{*Qe_D`S0%r;B4q#jUs3a)X5eC60XzPV-;p;kxu0Gvn*6w+nq;9FI(u);%5N z>u|8^-TVK#RgHaShbLdwyWIWyds`y^nZM89Y$)zgRDytC^-CFidcSxwe7<j>Gj`s0`Lynw>SRy$3(vwfT-&+t^5z#gx3gjy)u(zbO{f** zoOQz0SyW1v z>j-sqJXyOoO1h(?MX7%F(QT_%neBO3%~^9_{QmTJzvivK_(w7>Q{Y>1$m*+hU!!d< z_^2@EU)}$!wP^eGPyQ}K4^}*%*7R6mN3_F(%H9m71+n&bE;6s%C**tJ$dS!k9$WBj z36nB(U_9V?=8VfPlNydKZ#@{fW<)Hxxa~0Wog2@jKg+y!W_~m$pXb|QMZ5ZNgWM#Z zA5}IL>{?T=1@(OHeH_Bhexv+mbs?L?pHuu?8ru>cnYOQWWE9gjWS5A^`^K+f`uHA0 z^0UAf@*m|!IcJMJcZ%^3$oiF5^fn{HV>zeO;1*X}@ zn8c61>pXtj!gjyK{g2yrr5_Nsk@7!K%e7`o^Vi@|28Ix6*YAsW%rZ`HN?XCDFxlYP zjN{!5A+O^nj9f?r|KIVSF%X;()y8;|fq{X+)78&q Iol`;+0KMfWNdN!< diff --git a/graphics/hud/WomanBlt.png b/graphics/hud/WomanBlt.png index 6b548e54baf775e719771ef48d3856156a64b618..2524087e068346a968b7996104b22868c8c50b88 100644 GIT binary patch delta 2373 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 diff --git a/modeldef.misc b/modeldef.misc index adcdfa1..d917b22 100644 --- a/modeldef.misc +++ b/modeldef.misc @@ -58,6 +58,20 @@ Model "UTHealthPack" FrameIndex HBOX A 0 0 } +Model "ActHealthPack" +{ + Path "models" + Model 0 "hbox_d.3d" + // indices start at 1 for this mesh + SurfaceSkin 0 1 "jhbox1.png" + SurfaceSkin 0 2 "fizzfull" + Scale 0.2 0.24 0.2 + RollOffset -90 + ZOffset 16 + + FrameIndex HBOX A 0 0 +} + Model "UTHealthBox" { Path "models" @@ -72,6 +86,20 @@ Model "UTHealthBox" FrameIndex HBOX B 0 0 } +Model "ActHealthBox" +{ + Path "models" + Model 0 "hboxbeta_d.3d" + // indices start at 1 for this mesh + SurfaceSkin 0 1 "jhboxbeta1.png" + SurfaceSkin 0 2 "fizzside" + SurfaceSkin 0 3 "fizzfull" + Scale 0.08 0.08 0.096 + ZOffset 4 + + FrameIndex HBOX B 0 0 +} + Model "UTMedBox" { Path "models" @@ -85,6 +113,19 @@ Model "UTMedBox" FrameIndex HBOX C 0 0 } +Model "ActMedBox" +{ + Path "models" + Model 0 "MedBox_d.3d" + // indices start at 1 for this mesh + SurfaceSkin 0 1 "JMedBox1.png" + SurfaceSkin 0 2 "fizzfull" + Scale 0.06 0.06 0.072 + ZOffset 5 + + FrameIndex HBOX C 0 0 +} + Model "UTHealthBonus" { Path "models" @@ -147,6 +188,18 @@ Model "UTShieldBelt" FrameIndex BELT A 0 0 } +Model "ActShieldBelt" +{ + Path "models" + Model 0 "ShieldBeltMeshM_d.3d" + Skin 0 "AUbelt1.png" + Scale 0.1 0.1 0.12 + AngleOffset -90 + ZOffset 4 + + FrameIndex BELT A 0 0 +} + Model "UDamage" { Path "models" @@ -159,6 +212,18 @@ Model "UDamage" FrameIndex UDAM A 0 0 } +Model "ActUDamage" +{ + Path "models" + Model 0 "UDamage_d.3d" + Skin 0 "GoldSkin2.png" + Scale 0.16 0.16 0.192 + ZOffset 24 + ROTATING + + FrameIndex UDAM A 0 0 +} + Model "UTRedSkull" { Path "models" @@ -300,6 +365,18 @@ Model "UTInvisibilityX" FrameIndex INVS A 0 0 } +Model "ActInvisibility" +{ + Path "models" + Model 0 "invis2M_d.3d" + // indices start at 1 for this mesh + SurfaceSkin 0 1 "jinvis.png" + Scale 0.1 0.1 0.12 + ZOffset 9 + + FrameIndex INVS A 0 0 +} + Model "UTMapRevealer" { Path "models" @@ -322,6 +399,17 @@ Model "UTJumpBoots" FrameIndex JBUT A 0 0 } +Model "ActJumpBoots" +{ + Path "models" + Model 0 "jboot_d.3d" + Skin 0 "Jlboot2.png" + Scale 0.09 0.09 0.108 + ZOffset 7 + + FrameIndex JBUT A 0 0 +} + Model "Searchlight" { Path "models" @@ -334,6 +422,18 @@ Model "Searchlight" FrameIndex SLIT A 0 0 } +Model "ActSearchlight" +{ + Path "models" + Model 0 "BigFlash_d.3d" + Skin 0 "JBigFlash1.png" + Scale 0.07 0.07 0.084 + AngleOffset -90 + ZOffset 9 + + FrameIndex SLIT A 0 0 +} + Model "UTChip" { Path "models" diff --git a/sndinfo.txt b/sndinfo.txt index 695cf30..7882490 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -193,6 +193,7 @@ udamage/fire1 ampfire udamage/fire2 ampfire2 udamage/drain ampout trans/pickup voicesnd +lite/pickup fshlite1 misc/gibbed1 gib1 misc/gibbed2 gib2 misc/gibbed3 gib3 diff --git a/sounds/FSHLITE1.ogg b/sounds/FSHLITE1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..0a88291b08252a69795788605348236101c6548e GIT binary patch literal 5334 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 Xwtv=~YyV?!`l%`Q78C!SXJY^W_=#3J literal 0 HcmV?d00001 diff --git a/zscript/biorifle.zsc b/zscript/biorifle.zsc index d4a4be4..c209851 100644 --- a/zscript/biorifle.zsc +++ b/zscript/biorifle.zsc @@ -138,6 +138,7 @@ Class BioLight : DynamicLight Destroy(); return; } + SetOrigin(target.pos,true); args[LIGHT_INTENSITY] = int(8*target.Scale.x); } } @@ -657,7 +658,7 @@ Class BioRifle : UTWeapon else A_QuakeEx(1,1,1,5,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.05); Vector3 x, y, z; double a, s; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+8.0*y-5.0*z; Actor p; if ( alt ) @@ -686,6 +687,7 @@ Class BioRifle : UTWeapon s.A_SetRenderStyle(0.5,STYLE_AddShaded); UTViewSmoke(s).vvel += (FRandom[GES](0.8,1.6),FRandom[GES](-0.5,0.5),FRandom[GES](-0.5,0.5)); } + invoker.charge = 0; } action void A_BeginCharge() { @@ -736,6 +738,7 @@ Class BioRifle : UTWeapon Idle: BIOI A 1 { + invoker.charge = 0; invoker.bCharging = false; A_CheckReload(); A_WeaponReady(); diff --git a/zscript/chainsaw.zsc b/zscript/chainsaw.zsc index cd63a15..ac1a2da 100644 --- a/zscript/chainsaw.zsc +++ b/zscript/chainsaw.zsc @@ -53,7 +53,7 @@ Class UTChainsaw : UTWeapon invoker.FireEffect(); A_AlertMonsters(); Vector3 x, y, z; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x-4.0*z; FLineTraceData d; LineTrace(angle,90,BulletSlope(),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); @@ -91,7 +91,7 @@ Class UTChainsaw : UTWeapon if ( initial ) invoker.FireEffect(); A_AlertMonsters(); Vector3 x, y, z; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x-2.0*z; FLineTraceData d; double ang = (angle-60)+120*invoker.sawcnt; @@ -141,7 +141,7 @@ Class UTChainsaw : UTWeapon UTMainHandler.DoSwing(self,(FRandom[Chainsaw](-1,1),FRandom[Chainsaw](-1,1)),0.25,-0.1,2,SWING_Spring); if ( bAlt || Random[Chainsaw](0,2) ) return; Vector3 x, y, z; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = (pos.x,pos.y,player.viewz)+5.0*x+1.0*y-3.0*z; for ( int i=0; i<5; i++ ) { diff --git a/zscript/compat.zsc b/zscript/compat.zsc index ef72c6b..f2ece86 100644 --- a/zscript/compat.zsc +++ b/zscript/compat.zsc @@ -47,12 +47,135 @@ Class UTHereticBlueKey : KeyBlue } } -// TODO Base class for items that can be activated from the inventory bar +// Base class for items that can be activated from the inventory bar Class UTActivatable : Inventory { + Class GiveItem; + + Property GiveItem: GiveItem; + + override bool Use( bool pickup ) + { + if ( !Owner ) return true; + let i = GetDefaultByType(GiveItem); + if ( Owner.GiveInventory(GiveItem,i.Amount) ) + { + Owner.A_PlaySound(i.PickupSound,CHAN_ITEM); + return true; + } + return false; + } + Default { +INVENTORY.INVBAR; + Inventory.DefMaxAmount; + Inventory.PickupSound "misc/p_pkup"; + Inventory.UseSound ""; + } +} + +Class ActUDamage : UTActivatable +{ + Default + { + Tag "$T_UDAMAGE"; + Inventory.Icon "ItemUdmg"; + Inventory.PickupMessage "$I_UDAMAGE"; + +COUNTITEM; + +INVENTORY.BIGPOWERUP; + UTActivatable.GiveItem "UDamage"; + Inventory.RespawnTics 4200; + } + States + { + Spawn: + UDAM A -1; + Stop; + } +} + +Class ActShieldBelt : UTActivatable +{ + Default + { + Tag "$T_SHIELDBELT"; + Inventory.Icon "ItemBelt"; + Inventory.PickupMessage "$I_SHIELDBELT"; + +COUNTITEM; + +INVENTORY.BIGPOWERUP; + UTActivatable.GiveItem "UTShieldBelt"; + Inventory.RespawnTics 2100; + } + States + { + Spawn: + BELT A -1; + Stop; + } +} + +Class ActInvisibility : UTActivatable +{ + Default + { + Tag "$T_INVISIBILITY"; + Inventory.Icon "ItemInvs"; + Inventory.PickupMessage "$I_INVISIBILITY"; + +COUNTITEM; + +INVENTORY.BIGPOWERUP; + UTActivatable.GiveItem "UTInvisibility"; + Inventory.RespawnTics 4200; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + tracer = Spawn("UTInvisibilityX",pos); + tracer.angle = angle; + tracer.target = self; + } + States + { + Spawn: + INVS A -1; + Stop; + } +} + +Class ActJumpBoots : UTActivatable +{ + Default + { + Tag "$T_JUMPBOOTS"; + Inventory.Icon "ItemBoot"; + Inventory.PickupMessage "$I_JUMPBOOTS"; + UTActivatable.GiveItem "UTJumpBoots"; + Inventory.RespawnTics 1050; + } + States + { + Spawn: + JBUT A -1; + Stop; + } +} + +Class ActSearchlight : UTActivatable +{ + Default + { + Tag "$T_SEARCHLIGHT"; + Inventory.Icon "ItemLite"; + Inventory.PickupMessage "$I_SEARCHLIGHT"; + +COUNTITEM; + UTActivatable.GiveItem "Searchlight"; + Inventory.RespawnTics 1050; + } + States + { + Spawn: + SLIT A -1; + Stop; } } @@ -61,6 +184,71 @@ Class UTActivatableHealth : HealthPickup { Default { + +INVENTORY.INVBAR; + Inventory.DefMaxAmount; + Inventory.PickupSound "misc/p_pkup"; + Inventory.UseSound "misc/ut_heal"; + HealthPickup.Autouse 1; + } +} + +Class ActHealthPack : UTActivatableHealth +{ + Default + { + Tag "$T_SUPERHEALTH"; + Inventory.Icon "ItemHbox"; + Inventory.PickupMessage "$I_SUPERHEALTH"; + +COUNTITEM; + Health 100; + Inventory.UseSound "misc/ut_keg"; + Inventory.RespawnTics 3500; + HealthPickup.Autouse 2; + } + override bool Use( bool pickup ) + { + return Owner.GiveBody(health,200); + } + States + { + Spawn: + HBOX A -1; + Stop; + } +} + +Class ActHealthBox : UTActivatableHealth +{ + Default + { + Tag "$T_HEALTHBOX"; + Inventory.Icon "ItemHbxb"; + Inventory.PickupMessage "$I_HEALTHBOX"; + Health 50; + } + States + { + Spawn: + HBOX B -1; + Stop; + } +} + +Class ActMedBox : UTActivatableHealth +{ + Default + { + Tag "$T_MEDBOX"; + Inventory.Icon "ItemMbox"; + Inventory.PickupMessage "$I_MEDBOX"; + Health 20; + Inventory.RespawnTics 700; + } + States + { + Spawn: + HBOX C -1; + Stop; } } diff --git a/zscript/dt_coordutil.zsc b/zscript/dt_coordutil.zsc index 709a425..8b40d72 100644 --- a/zscript/dt_coordutil.zsc +++ b/zscript/dt_coordutil.zsc @@ -69,4 +69,68 @@ Class dt_CoordUtil } else return ((screenpos.x+1)*Screen.getWidth(),(-screenpos.y+1)*Screen.getHeight())*0.5, (screenpos.z<=1.0); } + + // In Tim Sweeney's own words: "transform by a pitch-yaw-roll rotation" + static Vector3, Vector3, Vector3 GetUnAxes( double pitch, double yaw, double roll ) + { + Vector3 x = (1,0,0), y = (0,-1,0), z = (0,0,1); // y inverted for left-handed result + Vector3 a, b, c; + // pitch and roll in gzdoom work in reverse compared to UE + pitch = -pitch; + roll = -roll; + // yaw + a = (cos(yaw),sin(yaw),0); + b = (-sin(yaw),cos(yaw),0); + c = (0,0,1); + x = (x dot a, x dot b, x dot c); + y = (y dot a, y dot b, y dot c); + z = (z dot a, z dot b, z dot c); + // pitch + a = (cos(pitch),0,sin(pitch)); + b = (0,1,0); + c = (-sin(pitch),0,cos(pitch)); + x = (x dot a, x dot b, x dot c); + y = (y dot a, y dot b, y dot c); + z = (z dot a, z dot b, z dot c); + // roll + a = (1,0,0); + b = (0,cos(roll),-sin(roll)); + c = (0,sin(roll),cos(roll)); + x = (x dot a, x dot b, x dot c); + y = (y dot a, y dot b, y dot c); + z = (z dot a, z dot b, z dot c); + return x, y, z; + } + + // In Tim Sweeney's own words: "detransform by a pitch-yaw-roll rotation" + static Vector3, Vector3, Vector3 GetAxes( double pitch, double yaw, double roll ) + { + Vector3 x = (1,0,0), y = (0,-1,0), z = (0,0,1); // y inverted for left-handed result + Vector3 a, b, c; + // pitch and roll in gzdoom work in reverse compared to UE + pitch = -pitch; + roll = -roll; + // inverse roll + a = (1,0,0); + b = (0,cos(roll),sin(roll)); + c = (0,-sin(roll),cos(roll)); + x = (x dot a, x dot b, x dot c); + y = (y dot a, y dot b, y dot c); + z = (z dot a, z dot b, z dot c); + // inverse pitch + a = (cos(pitch),0,-sin(pitch)); + b = (0,1,0); + c = (sin(pitch),0,cos(pitch)); + x = (x dot a, x dot b, x dot c); + y = (y dot a, y dot b, y dot c); + z = (z dot a, z dot b, z dot c); + // inverse yaw + a = (cos(yaw),-sin(yaw),0); + b = (sin(yaw),cos(yaw),0); + c = (0,0,1); + x = (x dot a, x dot b, x dot c); + y = (y dot a, y dot b, y dot c); + z = (z dot a, z dot b, z dot c); + return x, y, z; + } } diff --git a/zscript/dt_matrix.zsc b/zscript/dt_matrix.zsc index 7a15095..3ce9ee6 100644 --- a/zscript/dt_matrix.zsc +++ b/zscript/dt_matrix.zsc @@ -106,7 +106,8 @@ Class dt_Matrix4 return r; } - // UE-like axes from rotation + // [deprecated] UE-like axes from rotation + // proper implementation moved to CoordUtil static Vector3, Vector3, Vector3 getaxes( double pitch, double yaw, double roll ) { Vector3 x = (1,0,0), y = (0,-1,0), z = (0,0,1); // y inverted for left-handed result diff --git a/zscript/eightball.zsc b/zscript/eightball.zsc index a096afb..2aa3a03 100644 --- a/zscript/eightball.zsc +++ b/zscript/eightball.zsc @@ -337,6 +337,7 @@ Class UTRocketLauncher : UTWeapon invoker.LockedOn = false; } if ( checktarget && !weap.bAltFire ) A_CheckTarget(); + invoker.special1++; } // refire that is ignored if there's no ammo @@ -353,6 +354,7 @@ Class UTRocketLauncher : UTWeapon { Weapon weap = Weapon(invoker); if ( !weap ) return; + invoker.special1 = 0; if ( weap.bAltFire ) A_PlaySound("utrl/altfire",CHAN_WEAPON); else A_PlaySound("utrl/fire",CHAN_WEAPON); invoker.FireEffect(); @@ -363,9 +365,9 @@ Class UTRocketLauncher : UTWeapon UTMainHandler.DoSwing(self,(FRandom[Eightball](0.4,-0.8),FRandom[Eightball](-0.5,0.5)),1,-0.2,Random[Eightball](3,4),SWING_Spring,Random[Eightball](2,5),Random[Eightball](2,4)); Vector3 x, y, z, x2, y2, z2; double a, s; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+3.0*y-3.0*z; - [x2, y2, z2] = dt_Matrix4.GetAxes(BulletSlope(),angle,roll); + [x2, y2, z2] = dt_CoordUtil.GetAxes(BulletSlope(),angle,roll); Actor p; if ( weap.bAltFire ) { @@ -490,6 +492,7 @@ Class UTRocketLauncher : UTWeapon EBLI A 1 { invoker.locktics = 0; + invoker.special1 = 0; A_CheckReload(); A_WeaponReady(WRF_ALLOWRELOAD); } diff --git a/zscript/enforcer.zsc b/zscript/enforcer.zsc index be00ece..5f05fb8 100644 --- a/zscript/enforcer.zsc +++ b/zscript/enforcer.zsc @@ -175,14 +175,6 @@ Class Enforcer : UTWeapon property ClipCount : ClipCount; property SlaveClipCount : SlaveClipCount; - override void PostRender( double lbottom ) - { - if ( !flak_enforcerreload ) return; - if ( !usmf ) usmf = Font.GetFont('USMALLFONT'); - if ( Amount > 1 ) Screen.DrawText(usmf,Font.FindFontColor('UGreen'),Screen.GetWidth()*0.01,lbottom-Screen.GetHeight()*0.01-usmf.GetHeight()*2,String.Format("%s: %2d / 20\n%s: %2d / 20",StringTable.Localize("$M_LCLIP"),slaveclipcount,StringTable.Localize("$M_RCLIP"),clipcount)); - else Screen.DrawText(usmf,Font.FindFontColor('UGreen'),Screen.GetWidth()*0.01,lbottom-Screen.GetHeight()*0.01-usmf.GetHeight(),String.Format("%s: %2d / 20",StringTable.Localize("$M_CLIP"),clipcount)); - } - override bool HandlePickup( Inventory item ) { if ( item.GetClass() == GetClass() ) @@ -324,14 +316,14 @@ Class Enforcer : UTWeapon UTMainHandler.DoSwing(self,(FRandom[Enforcer](-0.2,-0.5),FRandom[Enforcer](-0.3,0.2)),2,0,1,SWING_Spring,0,2); } Vector3 x, y, z, x2, y2, z2; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = pos+(0,0,player.viewheight)+10.0*x; int ydir = slave?-1:1; if ( alt ) origin = origin-z*3.0+ydir*y*1.0; else origin = origin-z*1.0+ydir*y*4.0; double a = FRandom[Enforcer](0,360), s = FRandom[Enforcer](0,alt?0.08:0.004); if ( invoker.SlaveActive ) s *= 3; - [x2, y2, z2] = dt_Matrix4.GetAxes(BulletSlope(),angle,roll); + [x2, y2, z2] = dt_CoordUtil.GetAxes(BulletSlope(),angle,roll); Vector3 dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit(); FLineTraceData d; LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); diff --git a/zscript/flakcannon.zsc b/zscript/flakcannon.zsc index 7514a7d..b1642c6 100644 --- a/zscript/flakcannon.zsc +++ b/zscript/flakcannon.zsc @@ -55,6 +55,7 @@ Class ChunkLight : DynamicLight Destroy(); return; } + SetOrigin(target.pos,true); if ( isFrozen() ) return; args[LIGHT_RED] = int(255*(10-target.frame)*0.1); args[LIGHT_GREEN] = int(224*(10-target.frame)*0.1); @@ -460,7 +461,7 @@ Class FlakSlug : Actor Spawn("SlugLight",pos); Vector3 x, y, z; double a, s; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Actor p; Vector3 spawnofs; if ( BlockingMobj ) spawnofs = level.Vec3Diff(pos,BlockingMobj.Vec3Offset(0,0,BlockingMobj.height/2)).unit()*8; @@ -564,12 +565,12 @@ Class FlakCannon : UTWeapon A_QuakeEx(1,1,1,3,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.05); Vector3 x, y, z; double a, s; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+4.0*y-3.0*z; A_Overlay(-2,"MuzzleFlash"); A_OverlayFlags(-2,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true); A_OverlayRenderstyle(-2,STYLE_Add); - [x, y, z] = dt_Matrix4.GetAxes(BulletSlope(),angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(BulletSlope(),angle,roll); Vector3 offsets[8]; // vanilla adds these to each chunk offsets[0] = (0,0,0); offsets[1] = -z; @@ -623,7 +624,7 @@ Class FlakCannon : UTWeapon A_QuakeEx(2,2,2,6,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1); Vector3 x, y, z; double a, s; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+2.0*y-3.0*z; A_Overlay(-2,"MuzzleFlash"); A_OverlayFlags(-2,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true); diff --git a/zscript/impacthammer.zsc b/zscript/impacthammer.zsc index 9f215dc..f3cfe2f 100644 --- a/zscript/impacthammer.zsc +++ b/zscript/impacthammer.zsc @@ -70,7 +70,7 @@ Class ImpactHammer : UTWeapon UTMainHandler.DoSwing(self,(FRandom[Impact](-0.3,-1.5),FRandom[Impact](-1.2,-0.4)),3,-0.8,3,SWING_Spring,3,2); A_AlertMonsters(); Vector3 x, y, z; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+3.0*y-4.0*z; double realcharge = min(1.5,invoker.chargesize); FLineTraceData d; @@ -122,6 +122,8 @@ Class ImpactHammer : UTWeapon s.vel = pvel; s.scale *= 0.4; } + invoker.chargesize = 0; + invoker.count = 0; } action void A_FireAltBlast() { @@ -133,7 +135,7 @@ Class ImpactHammer : UTWeapon A_AlertMonsters(); A_QuakeEx(2,2,2,6,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1); Vector3 x, y, z; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+3.0*y-4.0*z; FLineTraceData d; LineTrace(angle,120,BulletSlope(),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); @@ -188,7 +190,7 @@ Class ImpactHammer : UTWeapon { FLineTraceData d; Vector3 x, y, z; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+3.0*y-4.0*z; LineTrace(angle,40,BulletSlope(),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); if ( (invoker.chargesize > 1) && (d.HitType == TRACE_HitActor) ) @@ -227,7 +229,12 @@ Class ImpactHammer : UTWeapon Ready: IMPS ABCDEFGHIJKLMNOPQ 1 A_WeaponReady(WRF_NOFIRE); Idle: - IMPI A 1 A_WeaponReady(); + IMPI A 1 + { + invoker.chargesize = 0; + invoker.count = 0; + A_WeaponReady(); + } Wait; Fire: IMPL A 0 diff --git a/zscript/minigun.zsc b/zscript/minigun.zsc index 0dffaea..fc22f02 100644 --- a/zscript/minigun.zsc +++ b/zscript/minigun.zsc @@ -101,10 +101,10 @@ Class Minigun : UTWeapon l.target = self; if ( !alt ) MinigunLight(l).cnt--; Vector3 x, y, z, x2, y2, z2; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = pos+(0,0,player.viewheight)+10.0*x+y*2.0-z*2.0; double a = FRandom[Minigun](0,360), s = FRandom[Minigun](0,alt?0.05:0.02); - [x2, y2, z2] = dt_Matrix4.GetAxes(BulletSlope(),angle,roll); + [x2, y2, z2] = dt_CoordUtil.GetAxes(BulletSlope(),angle,roll); Vector3 dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit(); FLineTraceData d; LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); diff --git a/zscript/powerups.zsc b/zscript/powerups.zsc index c5450c3..62fe05a 100644 --- a/zscript/powerups.zsc +++ b/zscript/powerups.zsc @@ -404,6 +404,8 @@ Class Searchlight : Inventory Inventory.MaxAmount 200; Inventory.InterHubAmount 0; Inventory.PickupMessage "$I_SEARCHLIGHT"; + Inventory.PickupSound "lite/pickup"; + Inventory.RespawnTics 1050; } override bool Use( bool pickup ) diff --git a/zscript/pulsegun.zsc b/zscript/pulsegun.zsc index 7e04133..7b04517 100644 --- a/zscript/pulsegun.zsc +++ b/zscript/pulsegun.zsc @@ -87,7 +87,7 @@ Class ViewPulseSpark : PulseSpark return; } Vector3 x, y, z; - [x, y, z] = dt_Matrix4.GetAxes(target.pitch,target.angle,target.roll); + [x, y, z] = dt_CoordUtil.GetAxes(target.pitch,target.angle,target.roll); Vector3 origin = x*ofs.x+y*ofs.y+z*ofs.z+(0,0,target.player.viewz); SetOrigin(target.Vec2OffsetZ(origin.x,origin.y,origin.z),true); bInvisible = (players[consoleplayer].camera != target); @@ -517,7 +517,7 @@ Class StarterBolt : PulseBolt bRELATIVETOFLOOR = (target.pos.z <= target.floorz); // hack, but kinda works if ( target.player ) { - [x, y, z] = dt_Matrix4.GetAxes(target.pitch,target.angle,target.roll); + [x, y, z] = dt_CoordUtil.GetAxes(target.pitch,target.angle,target.roll); origin = target.Vec2OffsetZ(0,0,target.player.viewz)+8.0*x+4.1*y-2.7*z; } else origin = target.Vec3Offset(0,0,target.missileheight); @@ -539,13 +539,6 @@ Class PulseGun : UTWeapon Property ClipCount : clipcount; - override void PostRender( double lbottom ) - { - if ( !flak_pulsereload ) return; - if ( !usmf ) usmf = Font.GetFont('USMALLFONT'); - Screen.DrawText(usmf,Font.FindFontColor('UGreen'),Screen.GetWidth()*0.01,lbottom-Screen.GetHeight()*0.01-usmf.GetHeight(),String.Format("%s: %2d / 50",StringTable.Localize("$M_CLIP"),clipcount)); - } - action void A_Reloading() { Weapon weap = Weapon(invoker); @@ -566,7 +559,7 @@ Class PulseGun : UTWeapon UTMainHandler.DoSwing(self,(FRandom[Pulse](-1,-1),FRandom[Pulse](-1,1)),0.1,-0.02,3,SWING_Spring,0,2); A_AlertMonsters(); Vector3 x, y, z; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = Vec2OffsetZ(0,0,player.viewz)+10.0*x+4.1*y-2.7*z; for ( int i=0; i<4; i++ ) { @@ -632,7 +625,7 @@ Class PulseGun : UTWeapon A_OverlayRenderstyle(-2,STYLE_Add); Vector3 x, y, z; double a; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = Vec2OffsetZ(0,0,player.viewz)+10.0*x+3.0*y-1.8*z; origin += y*cos(invoker.sangle)*2.0+z*sin(invoker.sangle)*2.0; invoker.sangle += 100; @@ -664,7 +657,7 @@ Class PulseGun : UTWeapon { A_PlaySound("pulse/bolt",CHAN_WEAPON,1.0,true); Vector3 x, y, z, origin; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); origin = Vec2OffsetZ(0,0,player.viewz)+10.0*x+4.1*y-2.7*z; invoker.beam = Spawn("StarterBolt",origin); invoker.beam.angle = angle; diff --git a/zscript/ripper.zsc b/zscript/ripper.zsc index 1cb0560..3245f65 100644 --- a/zscript/ripper.zsc +++ b/zscript/ripper.zsc @@ -282,7 +282,7 @@ Class Ripper2 : UTWeapon UTMainHandler.DoSwing(self,(FRandom[Ripper](-0.3,-0.6),FRandom[Ripper](0.2,0.6)),1,-0.3,2,SWING_Spring,2,2); } Vector3 x, y, z; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+6.0*y-4.0*z; Actor p; if ( alt ) p = Spawn("Razor2Alt",origin); diff --git a/zscript/shockrifle.zsc b/zscript/shockrifle.zsc index cfdd0ca..69d5838 100644 --- a/zscript/shockrifle.zsc +++ b/zscript/shockrifle.zsc @@ -981,7 +981,7 @@ Class ViewShockSpark : ShockSpark return; } Vector3 x, y, z; - [x, y, z] = dt_Matrix4.GetAxes(target.pitch,target.angle,target.roll); + [x, y, z] = dt_CoordUtil.GetAxes(target.pitch,target.angle,target.roll); Vector3 origin = x*ofs.x+y*ofs.y+z*ofs.z+(0,0,target.player.viewz); SetOrigin(target.Vec2OffsetZ(origin.x,origin.y,origin.z),true); bInvisible = (players[consoleplayer].camera != target); @@ -1015,7 +1015,7 @@ Class ShockRifle : UTWeapon A_AlertMonsters(); A_QuakeEx(2,2,2,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1); Vector3 x, y, z; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+2.0*y-1.5*z; Actor p = Spawn("ShockBeam",origin); p.angle = angle; @@ -1053,7 +1053,7 @@ Class ShockRifle : UTWeapon A_AlertMonsters(); A_QuakeEx(2,2,2,8,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1); Vector3 x, y, z; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+2.0*y-1.5*z; Actor p = Spawn("ShockBall",origin); p.angle = angle; @@ -1198,7 +1198,7 @@ Class EnhancedShockRifle : UTWeapon A_AlertMonsters(); A_QuakeEx(3,3,3,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.15); Vector3 x, y, z; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+2.0*y-1.5*z; Actor p = Spawn("SuperShockBeam",origin); p.angle = angle; @@ -1236,7 +1236,7 @@ Class EnhancedShockRifle : UTWeapon A_AlertMonsters(); A_QuakeEx(3,3,3,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.15); Vector3 x, y, z; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+2.0*y-1.5*z; Actor p = Spawn("SuperShockBall",origin); p.angle = angle; diff --git a/zscript/sniperrifle.zsc b/zscript/sniperrifle.zsc index bce628f..e847328 100644 --- a/zscript/sniperrifle.zsc +++ b/zscript/sniperrifle.zsc @@ -97,7 +97,7 @@ Class SniperRifle : UTWeapon let l = Spawn("SniperLight",pos); l.target = self; Vector3 x, y, z; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = Vec2OffsetZ(0,0,player.viewz)+10.0*x; if ( !zoomed ) origin = origin+y*4.0-z*2.0; FLineTraceData d; diff --git a/zscript/translocator.zsc b/zscript/translocator.zsc index bbdfee4..ca6baaa 100644 --- a/zscript/translocator.zsc +++ b/zscript/translocator.zsc @@ -330,7 +330,7 @@ Class Translocator : UTWeapon UTMainHandler.DoSwing(self,(FRandom[Translocator](-0.2,0.4),FRandom[Translocator](-0.2,0.7)),2,-0.3,3,SWING_Spring,2,3); A_AlertMonsters(); Vector3 x, y, z; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x-8.0*y-12.0*z; let p = Spawn("TranslocatorModule",origin); p.target = self; diff --git a/zscript/utcommon.zsc b/zscript/utcommon.zsc index 42328aa..c17dfce 100644 --- a/zscript/utcommon.zsc +++ b/zscript/utcommon.zsc @@ -34,6 +34,7 @@ Class UTPlayer : DoomPlayer const groundfriction = 8.; const fluidfriction = 1.2; const terminalvelocity = 2500.; + const slantnormal = 0.7; // slope sliding will have to be handled eventually, but currently due to how much is hardcoded this is impossible Default { @@ -395,7 +396,7 @@ Class UTPlayer : DoomPlayer Vector3 dir = (0,0,0); if ( vel.length() > double.epsilon ) dir = vel.unit(); Vector3 x, y; - [x, y] = dt_Matrix4.GetAxes(pitch,angle,0); + [x, y] = dt_CoordUtil.GetAxes(pitch,angle,0); acceleration3 = x*player.cmd.forwardmove+y*player.cmd.sidemove; if ( player.cmd.buttons&BT_JUMP ) acceleration3.z = 0x500; else if ( player.cmd.buttons&BT_CROUCH ) acceleration3.z = -0x500; @@ -424,7 +425,7 @@ Class UTPlayer : DoomPlayer if ( vel.length() > double.epsilon ) dir = vel.unit(); double doomfriction = clamp(GetFriction()/ORIG_FRICTION,0.0,1.0); Vector3 x, y; - [x, y] = dt_Matrix4.GetAxes(pitch,angle,0); + [x, y] = dt_CoordUtil.GetAxes(pitch,angle,0); acceleration3 = x*player.cmd.forwardmove+y*player.cmd.sidemove; if ( player.cmd.buttons&BT_JUMP ) acceleration3.z = 0x500; else if ( player.cmd.buttons&BT_CROUCH ) acceleration3.z = -0x500; @@ -785,7 +786,7 @@ Class UTWeapon : Weapon Vector2 hofs = RotateVector((dropper.radius,0),dropper.angle); SetOrigin(dropper.Vec3Offset(hofs.x,hofs.y,dropper.height*0.5),false); Vector3 x, y, z; - [x, y, z] = dt_Matrix4.GetAxes(dropper.pitch,dropper.angle,dropper.roll); + [x, y, z] = dt_CoordUtil.GetAxes(dropper.pitch,dropper.angle,dropper.roll); vel = x*12.0; vel.z += 4.0; angle = dropper.angle; @@ -956,7 +957,7 @@ Class UTViewSpark : UTSpark return; } Vector3 x, y, z; - [x, y, z] = dt_Matrix4.GetAxes(target.pitch,target.angle,target.roll); + [x, y, z] = dt_CoordUtil.GetAxes(target.pitch,target.angle,target.roll); Vector3 origin = x*ofs.x+y*ofs.y+z*ofs.z+(0,0,target.player.viewz); SetOrigin(target.Vec2OffsetZ(origin.x,origin.y,origin.z),true); bInvisible = (players[consoleplayer].camera != target); @@ -1201,7 +1202,7 @@ Class UTViewSmoke : UTSmoke return; } Vector3 x, y, z; - [x, y, z] = dt_Matrix4.GetAxes(target.pitch,target.angle,target.roll); + [x, y, z] = dt_CoordUtil.GetAxes(target.pitch,target.angle,target.roll); Vector3 origin = x*ofs.x+y*ofs.y+z*ofs.z+(0,0,target.player.viewz); SetOrigin(target.Vec2OffsetZ(origin.x,origin.y,origin.z),true); bInvisible = (players[consoleplayer].camera != target); @@ -1609,13 +1610,19 @@ Class UTMainHandler : EventHandler else e.Replacement = 'RifleAmmo'; } else if ( e.Replacee == 'InvulnerabilitySphere' ) e.Replacement = (!deathmatch||flak_dmsshock)?'EnhancedShockRifle':'UDamage'; - else if ( (e.Replacee == 'Berserk') || (e.Replacee == 'ArtiTomeOfPower') || (e.Replacee == 'ArtiEgg') ) e.Replacement = 'UDamage'; - else if ( (e.Replacee == 'Soulsphere') || (e.Replacee == 'ArtiSuperHealth') ) e.Replacement = 'UTHealthPack'; - else if ( (e.Replacee == 'Megasphere') || (e.Replacee == 'ArtiInvulnerability') ) e.Replacement = 'UTShieldBelt'; + else if ( e.Replacee == 'Berserk' ) e.Replacement = 'UDamage'; + else if ( (e.Replacee == 'ArtiTomeOfPower') || (e.Replacee == 'ArtiEgg') ) e.Replacement = 'ActUDamage'; + else if ( e.Replacee == 'Soulsphere' ) e.Replacement = 'UTHealthPack'; + else if ( e.Replacee == 'ArtiSuperHealth' ) e.Replacement = 'ActHealthPack'; + else if ( e.Replacee == 'Megasphere' ) e.Replacement = 'UTShieldBelt'; + else if ( e.Replacee == 'ArtiInvulnerability' ) e.Replacement = 'ActShieldBelt'; else if ( (e.Replacee == 'Allmap') || (e.Replacee == 'SuperMap') ) e.Replacement = 'UTMapRevealer'; - else if ( (e.Replacee == 'BlurSphere') || (e.Replacee == 'ArtiInvisibility') ) e.Replacement = 'UTInvisibility'; - else if ( (e.Replacee == 'Infrared') || (e.Replacee == 'ArtiTorch') ) e.Replacement = 'Searchlight'; - else if ( (e.Replacee == 'RadSuit') || (e.Replacee == 'ArtiFly') ) e.Replacement = 'UTJumpBoots'; + else if ( e.Replacee == 'BlurSphere' ) e.Replacement = 'UTInvisibility'; + else if ( e.Replacee == 'ArtiInvisibility' ) e.Replacement = 'ActInvisibility'; + else if ( e.Replacee == 'Infrared' ) e.Replacement = 'Searchlight'; + else if ( e.Replacee == 'ArtiTorch' ) e.Replacement = 'ActSearchlight'; + else if ( e.Replacee == 'RadSuit' ) e.Replacement = 'UTJumpBoots'; + else if ( e.Replacee == 'ArtiFly' ) e.Replacement = 'ActJumpBoots'; else if ( (e.Replacee == 'Backpack') || (e.Replacee == 'BagOfHolding') ) e.Replacement = 'UTBackpack'; else if ( (e.Replacee == 'ArmorBonus') || (e.Replacee == 'ArtiTimeBomb') ) e.Replacement = 'UTArmorBonus'; else if ( (e.Replacee == 'HealthBonus') || (e.Replacee == 'CrystalVial') ) e.Replacement = 'UTHealthBonus'; @@ -1625,16 +1632,16 @@ Class UTMainHandler : EventHandler else if ( e.Replacee == 'Medikit' ) e.Replacement = 'UTHealthBox'; else if ( e.Replacee == 'ArtiHealth' ) { - if ( !Random[Replacements](0,3) ) e.Replacement = 'UTHealthBox'; - else e.Replacement = 'UTMedBox'; + if ( !Random[Replacements](0,3) ) e.Replacement = 'ActHealthBox'; + else e.Replacement = 'ActMedBox'; } else if ( e.Replacee == 'ArtiTeleport' ) { // I have no idea what to replace this with, so just have some random stuff if ( Random[Replacements](0,1) ) e.Replacement = 'UTBackpack'; - else if ( Random[Replacements](0,1) ) e.Replacement = 'UTShieldBelt'; - else if ( Random[Replacements](0,1) ) e.Replacement = 'UTHealthPack'; - else e.Replacement = 'UDamage'; + else if ( Random[Replacements](0,1) ) e.Replacement = 'ActShieldBelt'; + else if ( Random[Replacements](0,1) ) e.Replacement = 'ActHealthPack'; + else e.Replacement = 'ActUDamage'; } else if ( e.Replacee == 'RedCard' ) e.Replacement = 'UTRedKey'; else if ( e.Replacee == 'BlueCard' ) e.Replacement = 'UTBlueKey'; @@ -1674,7 +1681,7 @@ Class UTMainHandler : EventHandler // just replace the -noflat- with a better scaled version and change the sky if ( !flak_doomtest ) { - if ( (level.GetChecksum() ~== "FBC3B6622A8B74AE06DE01E70007AC33") || (level.GetChecksum() ~== "D8206A3414DA967F2159473B5791139E") ) + if ( (level.GetChecksum() ~== "959A613006CC3AA912C4A22908B7566A") || (level.GetChecksum() ~== "75319AE5D2DBA214C5D394BF69DF32F4") ) { Level.ReplaceTextures("-noflat-","DefTex",0); TextureID skytx = TexMan.CheckForTexture("BlueSky",TexMan.Type_Any); @@ -1683,7 +1690,7 @@ Class UTMainHandler : EventHandler return; } // prettify Kinsie's test map for a more Unreal feel - if ( level.GetChecksum() ~== "FBC3B6622A8B74AE06DE01E70007AC33" ) + if ( level.GetChecksum() ~== "959A613006CC3AA912C4A22908B7566A" ) { TextureID deftex = TexMan.CheckForTexture("-noflat-",TexMan.Type_Any); TextureID skytx = TexMan.CheckForTexture("KGDaySky",TexMan.Type_Any); @@ -1703,13 +1710,13 @@ Class UTMainHandler : EventHandler level.sectors[i].SetTexture(1,skyflatnum); if ( level.sectors[i].GetTexture(0) == deftex ) { - level.sectors[i].SetTexture(0,(i==47)?baseceil:baseflor); + level.sectors[i].SetTexture(0,((i==47)||((i>=256)&&(i<=260)))?baseceil:baseflor); level.sectors[i].SetXScale(0,2.); level.sectors[i].SetYScale(0,2.); } if ( level.sectors[i].GetTexture(1) == deftex ) { - level.sectors[i].SetTexture(1,(i==47)?baseflor:baseceil); + level.sectors[i].SetTexture(1,((i==47)||((i>=256)&&(i<=260)))?baseflor:baseceil); level.sectors[i].SetXScale(1,2.); level.sectors[i].SetYScale(1,2.); } @@ -1780,7 +1787,7 @@ Class UTMainHandler : EventHandler AddAmbient((3584,736,64),"testamb/slime",0.4,2.4); AddAmbient((3584,512,64),"testamb/lava",0.8,2.4); } - else if ( level.GetChecksum() ~== "D8206A3414DA967F2159473B5791139E" ) + else if ( level.GetChecksum() ~== "75319AE5D2DBA214C5D394BF69DF32F4" ) { TextureID deftex = TexMan.CheckForTexture("-noflat-",TexMan.Type_Any); TextureID skytx = TexMan.CheckForTexture("KGDaySky",TexMan.Type_Any); @@ -1800,13 +1807,13 @@ Class UTMainHandler : EventHandler level.sectors[i].SetTexture(1,skyflatnum); if ( level.sectors[i].GetTexture(0) == deftex ) { - level.sectors[i].SetTexture(0,(i==47)?baseceil:baseflor); + level.sectors[i].SetTexture(0,((i==47)||((i>=144)&&(i<=148)))?baseceil:baseflor); level.sectors[i].SetXScale(0,2.); level.sectors[i].SetYScale(0,2.); } if ( level.sectors[i].GetTexture(1) == deftex ) { - level.sectors[i].SetTexture(1,(i==47)?baseflor:baseceil); + level.sectors[i].SetTexture(1,((i==47)||((i>=144)&&(i<=148)))?baseflor:baseceil); level.sectors[i].SetXScale(1,2.); level.sectors[i].SetYScale(1,2.); } diff --git a/zscript/uthud.zsc b/zscript/uthud.zsc index f2ae27c..cad6ab1 100644 --- a/zscript/uthud.zsc +++ b/zscript/uthud.zsc @@ -23,12 +23,12 @@ Class ViewTracer : LineTracer Class UTHud : BaseStatusBar { - TextureID AmmoBar, Boxes[4], Keys[5], BigNum[12], Flash, Slots[10], Icons[14], Uses[14], Man[5], Woman[5], Boss[5], WeaponBox, IconTloc2, UseTloc2; + TextureID AmmoBar, Boxes[4], Keys[5], BigNum[12], Flash, Slots[10], Icons[14], Uses[14], Man[5], Woman[5], Boss[5], WeaponBox, IconTloc2, UseTloc2, ItemBox, ItemSel, ItemFlash, ItemArrow[2], LastItem; Class IconClasses[14]; double HScale; Color tintcolor, bgcolor; int opacity; - int lastfrag, lastfragcnt, lastpickup, lastslot; + int lastfrag, lastfragcnt, lastpickup, lastslot, lastamount; ViewTracer vtracer; Actor lastseen; int lastseentic; @@ -145,6 +145,11 @@ Class UTHud : BaseStatusBar Boss[3] = TexMan.CheckForTexture("BossBot",TexMan.Type_Any); Boss[4] = TexMan.CheckForTexture("BossBlt",TexMan.Type_Any); WeaponBox = TexMan.CheckForTexture("WpSel",TexMan.Type_Any); + ItemBox = TexMan.CheckForTexture("ItemBox",TexMan.Type_Any); + ItemSel = TexMan.CheckForTexture("ItmSel",TexMan.Type_Any); + ItemFlash = TexMan.CheckForTexture("IFlash",TexMan.Type_Any); + ItemArrow[0] = TexMan.CheckForTexture("ItmArrw1",TexMan.Type_Any); + ItemArrow[1] = TexMan.CheckForTexture("ItmArrw2",TexMan.Type_Any); } override void Draw( int state, double TicFrac ) @@ -189,7 +194,7 @@ Class UTHud : BaseStatusBar { BeginHUD(); FracTic = TicFrac; - DrawUTHUD(); + DrawUTHUD(lbottom); } if ( (CPlayer.ReadyWeapon is 'UTWeapon') ) UTWeapon(CPlayer.ReadyWeapon).PostRender(lbottom); @@ -200,25 +205,25 @@ Class UTHud : BaseStatusBar return Color(a.a,int(a.r*(1.-x)+b.r*x),int(a.g*(1.-x)+b.g*x),int(a.b*(1.-x)+b.b*x)); } - private void UTDrawTintedTex( TextureID tx, double sx = 1.0, int opacity = -1, Color tint = Color("Black") ) + private void UTDrawTintedTex( TextureID tx, double sx = 1.0, int opacity = -1, Color tint = Color("Black"), bool flip = false ) { double ss = (HScale*sx); double dw = (Screen.GetWidth()/ss), dh = (Screen.GetHeight()/ss); double dx = CurX/ss, dy = CurY/ss; if ( opacity == -1 ) opacity = self.opacity; - if ( opacity >= 16 ) Screen.DrawTexture(tx,false,dx,dy,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_FillColor,bgcolor); + if ( opacity >= 16 ) Screen.DrawTexture(tx,false,dx,dy,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_FillColor,bgcolor,DTA_TopOffset,0,DTA_LeftOffset,0); double alpha = clamp(opacity/15.,0.0,1.0); - Screen.DrawTexture(tx,false,dx,dy,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_Alpha,alpha,DTA_LegacyRenderStyle,STYLE_AddShaded,DTA_FillColor,(tint!="Black")?tint:tintcolor); + Screen.DrawTexture(tx,false,dx,dy,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_Alpha,alpha,DTA_LegacyRenderStyle,STYLE_AddShaded,DTA_FillColor,(tint!="Black")?tint:tintcolor,DTA_TopOffset,0,DTA_LeftOffset,0,DTA_FlipX,flip); } - private void UTDrawPlainTex( TextureID tx, double sx = 1.0, int opacity = -1 ) + private void UTDrawPlainTex( TextureID tx, double sx = 1.0, int opacity = -1, bool flip = false ) { double ss = (HScale*sx); double dw = (Screen.GetWidth()/ss), dh = (Screen.GetHeight()/ss); double dx = CurX/ss, dy = CurY/ss; if ( opacity == -1 ) opacity = self.opacity; - if ( opacity >= 16 ) Screen.DrawTexture(tx,false,dx,dy,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_FillColor,bgcolor); + if ( opacity >= 16 ) Screen.DrawTexture(tx,false,dx,dy,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_FillColor,bgcolor,DTA_TopOffset,0,DTA_LeftOffset,0,DTA_FlipX,flip); double alpha = clamp(opacity/15.,0.0,1.0); - Screen.DrawTexture(tx,false,dx,dy,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_Alpha,alpha); + Screen.DrawTexture(tx,false,dx,dy,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_Alpha,alpha,DTA_TopOffset,0,DTA_LeftOffset,0,DTA_FlipX,flip); } private bool UTDrawWeaponIcon( Weapon w, bool use, double sx = 1.0 ) @@ -255,9 +260,9 @@ Class UTHud : BaseStatusBar double flen = 3*step; double len = digits.length()*step; double alpha = clamp((opacity+7)/15.,0.0,1.0); - for ( int i=0; i 15 ) Screen.DrawTexture(BigNum[11],false,CurX/ss,CurY/ss,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_FillColor,bgcolor); @@ -266,9 +271,9 @@ Class UTHud : BaseStatusBar } for ( int i=0; i 15 ) Screen.DrawTexture(BigNum[digits.CharCodeAt(i)-0x30],false,CurX/ss,CurY/ss,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_FillColor,bgcolor); - Screen.DrawTexture(BigNum[digits.CharCodeAt(i)-0x30],false,CurX/ss,CurY/ss,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_Alpha,alpha,DTA_LegacyRenderStyle,STYLE_AddShaded,DTA_FillColor,DrawColor); - CurX += ((i 15 ) Screen.DrawTexture(BigNum[digits.ByteAt(i)-0x30],false,CurX/ss,CurY/ss,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_FillColor,bgcolor); + Screen.DrawTexture(BigNum[digits.ByteAt(i)-0x30],false,CurX/ss,CurY/ss,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_Alpha,alpha,DTA_LegacyRenderStyle,STYLE_AddShaded,DTA_FillColor,DrawColor); + CurX += ((i1)?0.125:0.3)*hudsize*HScale; + double dw = (Screen.GetWidth()/ss.x), dh = (Screen.GetHeight()/ss.y); + double dx = CurX/ss.x, dy = CurY/ss.y; + Vector2 bs = TexMan.GetScaledSize(AmmoBar); + double ddw = bs.x*ch; + double alpha = clamp((opacity+7)/15.,0.0,1.0); + Screen.DrawTexture(AmmoBar,false,dx,dy,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_WindowRightF,ddw,DTA_Alpha,alpha); + if ( cw.Amount > 1 ) + { + ch = Enforcer(cw).SlaveClipCount/20.; + CurY += 3*hudsize*HScale; + ss = (0.54,0.125)*hudsize*HScale; + dw = (Screen.GetWidth()/ss.x); + dh = (Screen.GetHeight()/ss.y); + dx = CurX/ss.x; + dy = CurY/ss.y; + ddw = bs.x*ch; + Screen.DrawTexture(AmmoBar,false,dx,dy,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_WindowRightF,ddw,DTA_Alpha,alpha); + } + } + else if ( flak_pulsereload && (cw is 'Pulsegun') ) + { + // draw clip + double ch = Pulsegun(cw).ClipCount/50.; + CurX = BaseX+6*hudsize*HScale; + CurY = BaseY+53*hudsize*HScale; + Vector2 ss = (0.54,0.3)*hudsize*HScale; + double dw = (Screen.GetWidth()/ss.x), dh = (Screen.GetHeight()/ss.y); + double dx = CurX/ss.x, dy = CurY/ss.y; + Vector2 bs = TexMan.GetScaledSize(AmmoBar); + double ddw = bs.x*ch; + double alpha = clamp((opacity+7)/15.,0.0,1.0); + Screen.DrawTexture(AmmoBar,false,dx,dy,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_WindowRightF,ddw,DTA_Alpha,alpha); + } + else if ( cw is 'ImpactHammer' ) + { + double ch = min(ImpactHammer(cw).chargesize,1.5)/1.5; + CurX = BaseX+6*hudsize*HScale; + CurY = BaseY+53*hudsize*HScale; + Vector2 ss = (0.54,0.3)*hudsize*HScale; + double dw = (Screen.GetWidth()/ss.x), dh = (Screen.GetHeight()/ss.y); + double dx = CurX/ss.x, dy = CurY/ss.y; + Vector2 bs = TexMan.GetScaledSize(AmmoBar); + double ddw = bs.x*ch; + double alpha = clamp((opacity+7)/15.,0.0,1.0); + Screen.DrawTexture(AmmoBar,false,dx,dy,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_WindowRightF,ddw,DTA_Alpha,alpha); + } + else if ( cw is 'BioRifle' ) + { + double ch = min(BioRifle(cw).charge,5.1)/5.1; + CurX = BaseX+6*hudsize*HScale; + CurY = BaseY+53*hudsize*HScale; + Vector2 ss = (0.54,0.3)*hudsize*HScale; + double dw = (Screen.GetWidth()/ss.x), dh = (Screen.GetHeight()/ss.y); + double dx = CurX/ss.x, dy = CurY/ss.y; + Vector2 bs = TexMan.GetScaledSize(AmmoBar); + double ddw = bs.x*ch; + double alpha = clamp((opacity+7)/15.,0.0,1.0); + Screen.DrawTexture(AmmoBar,false,dx,dy,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_WindowRightF,ddw,DTA_Alpha,alpha); + } + else if ( cw is 'UTRocketLauncher' ) + { + double ch = cw.special1/6.; + CurX = BaseX+6*hudsize*HScale; + CurY = BaseY+53*hudsize*HScale; + Vector2 ss = (0.54,0.3)*hudsize*HScale; + double dw = (Screen.GetWidth()/ss.x), dh = (Screen.GetHeight()/ss.y); + double dx = CurX/ss.x, dy = CurY/ss.y; + Vector2 bs = TexMan.GetScaledSize(AmmoBar); + double ddw = bs.x*ch; + double alpha = clamp((opacity+7)/15.,0.0,1.0); + Screen.DrawTexture(AmmoBar,false,dx,dy,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_WindowRightF,ddw,DTA_Alpha,alpha); + } } private void DrawStatus() { @@ -609,9 +691,108 @@ Class UTHud : BaseStatusBar } } + private void DrawInventory( double lbottom ) + { + if ( isInventoryBarVisible() ) + { + CPlayer.mo.InvFirst = ValidateInvFirst(5); + if ( !CPlayer.mo.InvFirst ) return; + // draw the boxes + double BaseX, BaseY; + BaseX = CurX = (Screen.GetWidth()-64*5*hudsize*HScale)/2.; + BaseY = CurY = Screen.GetHeight()-224*hudsize*HScale; + for ( int i=0; i<5; i++ ) + { + UTDrawTintedTex(ItemBox,hudsize); + CurX += 64*hudsize*HScale; + } + int i = 0; + Inventory itm; + for ( itm=CPlayer.mo.InvFirst; (itm && (i < 5)); itm=itm.NextInv() ) + { + CurX = BaseX+2*hudsize*HScale; + CurY = BaseY+2*hudsize*HScale; + // if item doesn't fit 60x60, scale + Vector2 scl = TexMan.GetScaledSize(itm.Icon); + double mscl = max(scl.x,scl.y)/60.; + UTDrawTintedTex(itm.Icon,hudsize*mscl); + // amount if >1 + if ( itm.Amount > 1 ) + { + CurX = BaseX+32*hudsize*HScale; + CurY = BaseY+40*hudsize*HScale; + DrawColor = WhiteColor; + UTDrawBigNum(itm.Amount,hudsize*0.5); + } + // selection box if current item + if ( itm == CPlayer.mo.InvSel ) + { + CurX = BaseX; + CurY = BaseY; + UTDrawPlainTex(ItemSel,hudsize,opacity+7); + } + BaseX += 64*hudsize*HScale; + i++; + } + // draw arrows + CurY = Screen.GetHeight()-204*hudsize*HScale; + CurX = (Screen.GetWidth()-(64*5+40)*hudsize*HScale)/2.; + UTDrawTintedTex(ItemArrow[CPlayer.mo.InvFirst!=CPlayer.mo.FirstInv()],hudsize,flip:true); + CurX = (Screen.GetWidth()+(64*5+8)*hudsize*HScale)/2.; + UTDrawTintedTex(ItemArrow[!!itm],hudsize); + } + else if ( CPlayer.mo.InvSel || artiflashtick ) + { + // flashie + if ( artiflashtick ) + { + DrawColor = GoldColor; + CurX = -32*hudsize*HScale; + CurY = lbottom-96*hudsize*HScale; + UTDrawTintedTex(ItemFlash,hudsize,min(opacity,15),DrawColor); + } + // position 64x64 box + CurX = 0; + CurY = lbottom-64*hudsize*HScale; + UTDrawTintedTex(ItemBox,hudsize); + if ( artiflashtick ) + { + Vector2 scl = TexMan.GetScaledSize(LastItem); + double mscl = max(scl.x,scl.y)/60.; + CurX += 2*hudsize*HScale; + CurY += 2*hudsize*HScale; + UTDrawTintedTex(LastItem,hudsize*mscl); + if ( LastAmount <= 1 ) return; + CurX = 32*hudsize*HScale; + CurY = lbottom-24*hudsize*HScale; + DrawColor = WhiteColor; + UTDrawBigNum(LastAmount,hudsize*0.5); + return; + } + if ( !CPlayer.mo.InvSel ) return; + // if item doesn't fit 60x60, scale + Vector2 scl = TexMan.GetScaledSize(CPlayer.mo.InvSel.Icon); + double mscl = max(scl.x,scl.y)/60.; + CurX += 2*hudsize*HScale; + CurY += 2*hudsize*HScale; + UTDrawTintedTex(CPlayer.mo.InvSel.Icon,hudsize*mscl); + // amount if >1 + if ( CPlayer.mo.InvSel.Amount <= 1 ) return; + CurX = 32*hudsize*HScale; + CurY = lbottom-24*hudsize*HScale; + DrawColor = WhiteColor; + UTDrawBigNum(CPlayer.mo.InvSel.Amount,hudsize*0.5); + } + } + override void Tick() { Super.Tick(); + if ( CPlayer.mo.InvSel && !artiflashtick ) + { + LastItem = CPlayer.mo.InvSel.Icon; + LastAmount = CPlayer.mo.InvSel.Amount-1; + } if ( deathmatch||teamplay ) { if ( CPlayer.fragcount != lastfragcnt ) lastfrag = level.time; @@ -629,7 +810,7 @@ Class UTHud : BaseStatusBar lastseentic = level.time; } - private void DrawUTHUD() + private void DrawUTHUD( double lbottom ) { // Display Weapons if ( showweapons ) DrawWeapons(); @@ -641,6 +822,8 @@ Class UTHud : BaseStatusBar DrawStatus(); // Display Keys DrawKeys(); + // Inventory Bar + DrawInventory(lbottom); // Display Identification Info if ( CPlayer == players[consoleplayer] && showinfo ) DrawIdentifyInfo(); } diff --git a/zscript/warheadlauncher.zsc b/zscript/warheadlauncher.zsc index 89992c3..4c90b0d 100644 --- a/zscript/warheadlauncher.zsc +++ b/zscript/warheadlauncher.zsc @@ -660,7 +660,7 @@ Class WarheadLauncher : UTWeapon A_AlertMonsters(); A_QuakeEx(6,6,6,20,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.2); Vector3 x, y, z; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); vel -= x*10; Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+2.0*y-2.0*z; Actor p = Spawn("WarShell",origin); @@ -674,7 +674,7 @@ Class WarheadLauncher : UTWeapon Weapon weap = Weapon(invoker); if ( !weap ) return; Vector3 x, y, z; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); vel -= x*0.2; Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+2.0*y-2.0*z; int numpt = Random[Warhead](10,20); @@ -698,7 +698,7 @@ Class WarheadLauncher : UTWeapon A_AlertMonsters(); A_QuakeEx(6,6,6,20,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.2); Vector3 x, y, z; - [x, y, z] = dt_Matrix4.GetAxes(pitch,angle,roll); + [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); vel -= x*10; Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+2.0*y-2.0*z; Actor p = Spawn("GuidedWarShell",origin); From 6cf482a7e1b54fdb0bfe3742d8dc6df3a87cfd64 Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Wed, 1 May 2019 22:33:52 +0200 Subject: [PATCH 2/2] Properly reflect version requirement. --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index 2a63c19..502408a 100644 --- a/Readme.md +++ b/Readme.md @@ -3,7 +3,7 @@ What began as a test for importing UT vertex meshes has turned into an actual full UT weapon and item mod. -This mod requires GZDoom 4.0.0 or later. +This mod requires GZDoom 4.1 or later. ## Currently implemented