From d1e9a471b9bbab5e40225891afe25709155da2bf Mon Sep 17 00:00:00 2001 From: Kiri Date: Sat, 2 Sep 2023 16:45:26 -0700 Subject: [PATCH] Added battery swapping. --- mapinfo.txt | 5 + source_data/Makefile | 16 +- .../gretchencounter_weaponsprite.aseprite | Bin 9673 -> 10057 bytes sprites/bright_kgcmc0.png | Bin 0 -> 1497 bytes sprites/kgcmc0.png | Bin 0 -> 6197 bytes zscript.zs | 221 ++++++++++++++++-- 6 files changed, 221 insertions(+), 21 deletions(-) create mode 100644 mapinfo.txt create mode 100644 sprites/bright_kgcmc0.png create mode 100644 sprites/kgcmc0.png diff --git a/mapinfo.txt b/mapinfo.txt new file mode 100644 index 0000000..59650d6 --- /dev/null +++ b/mapinfo.txt @@ -0,0 +1,5 @@ +gameinfo +{ + AddEventHandlers = "GretchenCounterEventHandler" +} + diff --git a/source_data/Makefile b/source_data/Makefile index dec6948..6cd6a97 100644 --- a/source_data/Makefile +++ b/source_data/Makefile @@ -1,6 +1,7 @@ all : \ ../sprites/kgcmb0.png \ ../sprites/kgcma0.png \ + ../sprites/kgcmc0.png \ ../sprites/kgcna0.png \ ../sprites/kgcnb0.png \ ../sprites/bright_kgcma0.png \ @@ -11,7 +12,8 @@ all : \ ../sprites/kgcpa0.png \ ../sprites/kgcpb0.png \ ../sprites/bright_kgcpa0.png \ - ../sprites/bright_kgcpb0.png + ../sprites/bright_kgcpb0.png \ + ../sprites/bright_kgcmc0.png # Base frames ../sprites/kgcma0.png : gretchencounter_weaponsprite.aseprite @@ -26,6 +28,12 @@ all : \ --ignore-layer "brightmap" \ --frame-range 1,1 --save-as $@ +../sprites/kgcmc0.png : gretchencounter_weaponsprite.aseprite + aseprite $^ \ + -b \ + --ignore-layer "brightmap" \ + --frame-range 2,2 --save-as $@ + # Brightmaps ../sprites/bright_kgcma0.png : gretchencounter_weaponsprite.aseprite aseprite $^ \ @@ -39,6 +47,12 @@ all : \ --layer "brightmap" \ --frame-range 1,1 --save-as $@ +../sprites/bright_kgcmc0.png : gretchencounter_weaponsprite.aseprite + aseprite $^ \ + -b \ + --layer "brightmap" \ + --frame-range 2,2 --save-as $@ + # Needle ../sprites/kgcna0.png : gretchencounter_weaponsprite.aseprite aseprite $^ \ diff --git a/source_data/gretchencounter_weaponsprite.aseprite b/source_data/gretchencounter_weaponsprite.aseprite index 2bfebaa245362e2843b59f879c00b2ab46c137a8..c6a047f5e42dedb92c90e8bcbae03be5e0d09c5d 100644 GIT binary patch delta 78 zcmX@lf!tt&-2}2&?d8O8!2 z00saac6hnLw!zH;*EKd3E(=_Yu+FZg$#D|xi(ohMw?lWG*{jrACT1OxX=qFWz3{c% zQwNTc+H!130qJ>$XzPNh^193^Qdbf?$K!Fo-|u$2wrw|?&1$u3nr69N&gb*GuBX#! zRaIqKj>qHCXfzxSvn)%~G>+pi41*x>ecyFm$8jvnB7_)*p=p|`s{0RfHxmjGLU6~Gdp2B-iE zfFVE%5CQZ7TmUK=)oZ`UrorhH^BkiHZ5vgUx`@KiMPVog1)$j(KmcIB;ytvuU0_pS zo#4d9T*H)q8F7cOv+H-Z9=mdwXBNx}%#7D{;uf(+%n<`bf+!+Fr9-L0NQQw(&Dk?# zUKP7C&r*ulR?+}u01NKY#1f7vKJT{Q7Y7(VO|- bbl}|&&wq6<-W$E3j)k+k=ciBaeD=-XS<=~P literal 0 HcmV?d00001 diff --git a/sprites/kgcmc0.png b/sprites/kgcmc0.png new file mode 100644 index 0000000000000000000000000000000000000000..a0a837ae46ea059326477e7f99155dd2fb4f4d12 GIT binary patch literal 6197 zcmd^jc{J2t`2QV)8HP;uElU!zFEvDFBHNIiQT7O#7#cNX8_|cNC`3)RBq3QQA;rit zO0p%&G9*igDJhBG-}!ug=luTu{{Ow_p8I~zJ@@r`o_n9yJtoIUz;GP91_|ekE$Y8wIUg9=*~$z&ek=P0061{8bG6`1%1fXmgb=p2wh#o#$jFF@ zh@em?1OlOrkyla|l8{FTNdO09bt`=(thx-;*!ZieYQ3~{IWKP^Gn18?IvyK4OeXgd ziOhh2Hc!tM0)g(}P-A6Pj>VQ58`Jdl^R%@y)z#CLl#=D;6J=y55)xz)5u%V#Fbd_1 zKzJe$E(nAJ09F8)0{|_vpxI$)oCyuLK>c)xSq`<)pq6Zip8TsScCD1WKqIoU14h$5 z`;%RI6CK)OZRupIDw26A5lag&&h*8k67&;Yv?&hiL@O0vb0rt7ye&ost1Y3gE~2g^ zw6?aku&}^lvBt;8hlhuIdwZEoW?NfZV`C$oPOqw}DlacDDk{p$%gfHrPESuyPEJlt zOr%gKBoc{8BnAWoczSvg2m}WQ2P-Qpb8~ZJV`B^kqphv2qN1Xtq(p&8q_yB+malI= z!L!Z5rN+v(2y32=!6s{C$m-ewN-8cg^5zl}`a&W~D3k=Etvs`_D77Xpu{@JfluDu{ z60>6i(#f95L_%zU1I5>tL@*C_!TQ=_2i6iGElkktVv*Uqx1i%^qvjB_&&mhyb|!>vwq^8f}4?G>9Gxm3l&% z#!#ZnI$2_wB*Y398udl>5)d5@pwSA{nEw|iGzvj<2+D*YA_Q4MkP-xeax5sqfNX7$ zs>Bhein+E7MoC0l2E}plpOlON&;~#W00{s%lK?6*hZbz1SPm5G2mM8WMgqigBJu5K zK|JSPfGB5sm;dMN-w6Ltwg10u^RZ0|03xF{$Bw#2-~C$f#eKZz{Xf5FyEY7>JK<03 zZrjjO{Me5wEOVD$+p8!B9{v)=`q)Ux4Wx13G<`I(*)c@x9McQ3aro&`dEn3?z025_#vRJu9G1*e@QszxG zA+P3-cI=VNnl0DD^3HBI==;*A=L@wTD*NY7;Li#mMw5Hfr!?{(ZFv=zKe^*Av?cN4 ziw25=bbpL#O^BbOIZ{RzzH5}_O4u<8FQ&$5)tr@OPx#aHrJgTc^J-oq$J`onLJz!} zK3|i^({5#B^;%_k=5!5aroGZ({sbP*km7B(nXdU4rGUJ+8c02{PbMcO1MR1?$LmLT zc+eVl0$6Ox*11d`F8MVIpo&fF>on^CC>r?rGm)`_%o33Q>ftBBv9&ZH}mNHVk zd-igU0R!KZtU%Ty_xRw{`t;-zGHP=kc;J79@UnF;DJ(k4W_{r~p}Z-16#Zi?dQ+Hg z{XWCQ%!7|N@Fq_?6YsD8vb%;8kLk8#3E$ASgCMG2Mk#YQ5O|19xDs$FbVOxcmd8{U zotQ>RrH8LN4edwX6Z-S-rk-5q63@`8rFqKsZ9PkTWNnplvqWm>L~8`cbZMRpdzmEg=(r&?k=a3i@Nrwfd<}nRB6g6q``9qiPgL> zt_Bv3X8*oS9Rv-LEYvZXax-~k1izD#z+EZ9juY`F3ap!(I(e_ zc#+Mv5;W1F!jX!?RO0chZv&D0cYGMa)E;dCCVW&S(8txGI>=oJybFm-lW;*}`rpeJ zPY+QZ?Bp#(qEpyBt0=IC$qwlKguU7qbgLRB$$v(qZZFk2oPYiHZV?bA}~p_l92u8nzUok5#073zUa#HQE=a zdP3t2%;lcbmPjT)&0dwu^`GsFaBfu2WBuky9b3uK?rs1K(ejw~Cuw6x^no1L`@ z_^xx!uBth&=RVpuxYry!jEpcWj4{c8Ri>rbAiapx#SS@-=@7I97zi2}d;{VlFEkNq zMylpc)p@Bd^v-Sne1D5CTy+T!2Y9w2M3;AF#8I3=^6H-K3L&nP}_$F9a4eRT5( z#Y9T7hMw%E#8l!2g{zqM?bl__bsh(D4|IL~S{+vs)HAofyV;$C?TXRvTqT@D;AS!PV5^c~lH{z7^FXAg$~a zjD2ejybIEp50`3QTHYSLf1IgpLOLY4p@+K!gglS`@ZE>}Nl-2RFh^w6IBH$OlFTJF z#KEaLchZGS?Q*U3k#;(2NbjV7iN}~_Rh1ZS z&WsN>ub5jbL!f=ta@Xwzee{NfV7n~aBJ|#ad~@DZMD=9-9Kzn~z$ zDpiMD6O&>~>*%gsAvSK(0%#as4bJa9!8P3jQe^8rHA~e{Ya?jq5eg(Jh{l&qPCmDJ&I3me*_62V21skoDdxH^ zSMMmg>poTMzQO(Q)i9T1swC3fdar*RG0Xs^dTTK3Aq?in!%iym=T3RI~ib5wWo|E?3aQmBH4_A}zyQ~a4ZUn#%EsY2VemJ-1`MW^$kB|99Gap`F3TpAF zB#a|~PA%x$Qzq&6WF8D|8Ne}zK-ob?#3FCLx&6tF!+}>WzHn{otwFE%lFUtCktCLK zLy3tx%@WfWGi_!yj+XG{D_BwM5UFt46Z0y}XfG7<#dxgn)Iqa#F z02a>NkBxD#ZWTM&8;>Rd_UGufIv2I~f^99l`T0d(=9i{fxuNUq(50b#`E9ha2=!FK z@0n_U;bTb-_lN8*Uof>Yj1XibTb4O%91^CY5cXicQQ@!uLGP(EtG>sNNT=d>gl3)# z?p_wm;%<#P!sRWC5}}UD0Ta`u_h`R5r`iAlWmD>&r{}oiJ3meD$*(@gOJwdYpd0er z8KrK%b8V_$5sxvnW>X1881+U24$h8fbFT2Cr}KvBF(%|!U z9%=Zy5`Efn6_CYmgpd@h%QiM$l%&SMYXhHUTJXTP`3;}*zwoMS@~-R@4+(QP@WL+Q z8qBgpe@~`m_O~~s8E;f_l^FEdo$v-{EvXi`eI&QtW*CgIE$*?OYvO>LBJbO@NdL>( zNo&AsRR zCy8pXx3}j)R=5Q~_x65{%!GcOG}dL9wYu7EeqE7_;+U_vnJ26CTMKWho)@=HZtsd& zi_~o__18Dpjq43;EV}!7p{6i%Mer!BYd#f|Tl^fR|L93O!R~m7WX{+&zn_p73Np9@cRf?b5EO##3cenwp$6YD zEY2vp0Q0NxlWp+OkhrFE*(1R-BrD>6%J~ZwgIrXfm6v7@5YxP+Z%0N#49OivxG?ZH zVQ6x^>eg$?O@70>eyh7YQyz$Df>l9R%AetMb;h0(qmWiU?}XYhusj*7j`{ccZ>H<078)zz^8a4%s!eUR;@z{lAC zseQ0b?=4GJD&c8yH?8Yiky+Wv>b3I@K*3fChu@$4EzlBHe09>n0sh(-r!-WVbJb9& z)}y^bch1@5*6Dk4vYLwT%_7UE&Ys`p(B0Z!`uRabjx<%~nBnZV&Zb)YEyX0B@AM9P zVxzm(=yC&|51+SWf4uw$J%gwr@&Zv1d9{RM!3hAh9 z)p^@UgE!=H^x^m0E1%iy+TkxN@_S?rezo{r?+a>~48>3=%OfXWI90t5^()wzw4_gd z#G05&xm^8q^Q@ZW111+H=U(e<#Os@4!xs+~*cm-$9X@PgXkuh^ctuuDHp_MOgOj)U&Iwg$LIT{wuwoe?Gfk~bY7V_WQGr1o( zu`DYqg%S|N>DOr<2R#31gn@rvOgTcX*u9hE<5Ai^F zO)B&4MVAMCRO*#P_UdU-r3TbU5=;5E_g;pmo33T}{di@wxu1V>#*M;DI^$K$v^-Rm z=%Hc~a+mS^%J;MEdK}L^p8YiLK9HAJm}t~))bXXFG$2NC=2EJjD3@Vn);cx9>&{y> zH1{bxn_XU#!5R3M@t^eDXY>`RyjLg2CIYRscNb@!q2m@8(>h0%LlUMNGkA_NkR2A# z-QDe6Ts?7e(S?~b*Z?EgFPV#Q;N=2UJ-CS?{-RYD1QnX1CXi|0945>J8ZD-$3kC9I zxa7^a@bS{ou+u)%Z)I8Q4@_le4S@0GQoBgJ3BNq=R>^b)_aezugZG-;EcY)q(ra`h zp0z$`X)`VIDKM358M)FLh)uh-KM_L%*P}D z5vITtrk4f0?raspi(VeQKr>~zN2cAN|NLI@o(wQ zUp(d;_5~3L`wJyzUi!yfxnkku1vwakCnruGXnt~+h4)WOiBeKfsPCKei5|)OX;7~O ziyYY1T~IT?fB@zQ^Ctnf(uhX?!%q(@t?3oUb$&7GX; zQ}g$X>0>^av4@C_%8_mV3{)J#og}a`*9cvt29bEUGs$8Ew*_&izb}(=ZXz2Se*5= zSd2fqtN6?K-5L+y|IWAgnS`H-JsN-Xbol(apj#bF#+1ohtM_D}?)?|ZK0S}Nh6*it z{i5Wtv3C9ec`|R(7<>FzK6V<>Ee=05&YMYyiE~Mhf(dNMPRExV*L!&CA9}RdvsuFn zWJ|vWlg>~Hwf3X0Fp5sSqOkk^&rLT>;oL`2H+y3)2tWDBhk+k-zw46tiYpSMCM#k4 z^pnrOAw~RJwVfEdZH4<*ksj<B9Rf4|N5$-vpOm@{8wsQY)B$^r*WPj^mW;P;qg1rga@CiG4M(R~byO$c6Yl#-f z{`j5s$LQkvL#eZdy?_vZ#zCq3zV|(dVfkAz1y@L(70chY6{zJr$dXu~_`{K|=m-Or z`q5!gn1BfN*LQuJ{JCRilRmZK1m9s2HE|WQ3Qc3x=IebMK4nkt`@&KrRnHj-dlql5 zkFzXyT7Q2R1pEa8dKwyzgHJpZF6%k|J-hH-_47a|ayNWi9G2F=CZ9H8u4-Ht~-S!WQI}pAQ59)B)7O%>%kB9TdzOi>1&p z{tLrV87UV6xB@vUX40ARK-5FuovH{ zE#RmgJN{k586ODN2>ax@n<9vtQfBOypl3_OSmD8Gf}E^H39Kh^zT*~4pLa8HlYYJZ V=xuQZ=QR}ASlAzXZ02|Ae*hqt!pHys literal 0 HcmV?d00001 diff --git a/zscript.zs b/zscript.zs index 42ece36..54e673c 100644 --- a/zscript.zs +++ b/zscript.zs @@ -1,8 +1,25 @@ version "4.10" - const HDLD_KIRI_GRETCHENCOUNTER = "kgc"; +class GretchenCounterEventHandler : StaticEventHandler +{ + override void WorldThingSpawned(WorldEvent e) + { + HDBattery bat = HDBattery(e.Thing); + if(bat) { + bat.ItemsThatUseThis.Push("GretchenCounter"); + console.printf("thing added to thing"); + } + } +} + +enum GretchenCounterStatus +{ + KGC_BATTERY=0, + KGC_ACTIVE=1 +} + class GretchenCounter : HDWeapon { default @@ -28,28 +45,57 @@ class GretchenCounter : HDWeapon float angularVelocity; float needlePosition; int framesSinceLastBeep; - bool onSwitch; - - override double WeaponBulk() - { - return 20; - } + int lastBatteryCheckFrame; override bool AddSpareWeapon(actor newowner) { return AddSpareWeaponRegular(newowner); } - override hdweapon GetSpareWeapon(actor newowner,bool reverse,bool doselect) + override HDWeapon GetSpareWeapon(actor newowner, bool reverse, bool doselect) { - return GetSpareWeaponRegular(newowner,reverse,doselect); + return GetSpareWeaponRegular(newowner, reverse, doselect); + } + + int hash(int x) + { + x = ((x >> 16) ^ x) * 0x45d9f3b; + x = ((x >> 16) ^ x) * 0x45d9f3b; + x = (x >> 16) ^ x; + return x; + } + + bool HasBatteryCharge() + { + int bat = weaponstatus[KGC_BATTERY]; + if(bat > 0) { + + int timeHash = hash(level.time / 10); + if((timeHash % 5) < bat) { + return true; + } + } + return false; + } + + void TickBattery() + { + if(weaponstatus[KGC_ACTIVE] && + weaponstatus[KGC_BATTERY] > 0) + { + // Discharge rate: 1/1000 chance per tick. + int r = random(0, 1000); + if(r < 2) { + weaponstatus[KGC_BATTERY] -= 1; + } + } } states { spawn: - KGCP # -1 { frame = invoker.onSwitch; } - stop; + KGCP # 1 { frame = invoker.GetIsActive(); } + loop; // Needle overlay states. needle_indicator: @@ -67,6 +113,61 @@ class GretchenCounter : HDWeapon } goto deselect0big; + user3: + #### A 0 A_MagManager("HDBattery"); + goto ready; + + + unload: + KGCM # 1 offset(0, 20) { updateOverlay(); } + KGCM # 1 offset(0, 40) { updateOverlay(); } + KGCM # 1 offset(0, 55) { updateOverlay(); } + + KGCM # 10 { + if(invoker.weaponstatus[KGC_BATTERY] != -1) { + A_StartSound("weapons/pocket", 9); + HDMagAmmo.GiveMag(self, "HDBattery", invoker.weaponstatus[KGC_BATTERY]); + invoker.weaponstatus[KGC_BATTERY] = -1; + } + } + + KGCM # 1 offset(0, 55) { updateOverlay(); } + KGCM # 1 offset(0, 40) { updateOverlay(); } + KGCM # 1 offset(0, 20) { updateOverlay(); } + KGCM # 1 offset(0, 0) { updateOverlay(); } + goto ready; + + reload: + KGCM # 1 offset(0, 20) { updateOverlay(); } + KGCM # 1 offset(0, 40) { updateOverlay(); } + KGCM # 1 offset(0, 55) { updateOverlay(); } + + KGCM # 10 { + if(CountInv("HDBattery")) { + + // Unload existing battery. + if(invoker.weaponstatus[KGC_BATTERY] != -1) { + A_StartSound("weapons/pocket", 9); + HDMagAmmo.GiveMag(self, "HDBattery", invoker.weaponstatus[KGC_BATTERY]); + invoker.weaponstatus[KGC_BATTERY] = -1; + } + + // Load new mag. + A_StartSound("weapons/plasload", 8); + HDMagAmmo magAmmo = HDMagAmmo( + FindInventory("HDBattery")); + if(magAmmo) { + invoker.weaponstatus[KGC_BATTERY] = magAmmo.TakeMag(true); + } + } + } + + KGCM # 1 offset(0, 55) { updateOverlay(); } + KGCM # 1 offset(0, 40) { updateOverlay(); } + KGCM # 1 offset(0, 20) { updateOverlay(); } + KGCM # 1 offset(0, 0) { updateOverlay(); } + goto ready; + ready: KGCM B 1 { A_Overlay(355, "needle_indicator"); @@ -74,7 +175,9 @@ class GretchenCounter : HDWeapon // invoker.UpdateDisplay(); updateOverlay(); - A_WeaponReady(WRF_ALLOWUSER3); // USER3 = MagManager. + // USER3 = MagManager. + // USER4 = Unload. + A_WeaponReady(WRF_ALLOWUSER3 | WRF_ALLOWUSER4 | WRF_ALLOWRELOAD); } goto readyend; @@ -85,7 +188,8 @@ class GretchenCounter : HDWeapon KGCM # 1 offset(0, 55) { updateOverlay(); } KGCM # 1 { - invoker.onSwitch = !invoker.onSwitch; + invoker.weaponstatus[KGC_ACTIVE] = + !invoker.weaponstatus[KGC_ACTIVE]; A_PlaySound("kiri/gretchencounter_onoff"); updateOverlay(); } @@ -117,9 +221,17 @@ class GretchenCounter : HDWeapon A_OverlayRotate(355, angle_min + (angle_max - angle_min) * (1.0 - invoker.needlePosition)); - player.getpsprite(PSP_WEAPON).frame = int(invoker.onSwitch); - player.getpsprite(355).frame = int(invoker.onSwitch); - // frame = int(invoker.onSwitch); + if(invoker.weaponstatus[KGC_ACTIVE]) { + if(invoker.HasBatteryCharge()) { + player.getpsprite(PSP_WEAPON).frame = 1; + } else { + player.getpsprite(PSP_WEAPON).frame = 2; + } + } else { + player.getpsprite(PSP_WEAPON).frame = 0; + } + + player.getpsprite(355).frame = int(invoker.GetIsActive()); } float GetReadingForType(String type_name, float distance_scale) @@ -158,9 +270,70 @@ class GretchenCounter : HDWeapon override void Tick() { - // console.printf("lsjksdjklcmsdlkmcsdlkmslckmlkmsdclkmsdclkmsdc"); super.Tick(); UpdateDisplay(); + TickBattery(); + } + + override void DrawHUDStuff( + HDStatusBar statusBar, HDWeapon weapon, + HDPlayerPawn pawn) + { + if(statusBar.hudlevel == 1) { + statusBar.drawbattery( + -54, -4, + statusBar.DI_SCREEN_CENTER_BOTTOM, + reloadorder : true); + statusBar.drawnum( + pawn.countinv("HDBattery"), + -46, -8, + statusBar.DI_SCREEN_CENTER_BOTTOM); + } + + int bat = weapon.weaponstatus[KGC_BATTERY]; + if(bat > 0) { + + // Draw battery bar. + statusbar.drawwepnum(bat, 20); + + } else if(bat > -1) { + + // No battery. + statusBar.drawstring( + statusBar.mamountfont, "00000", + (-16,-9), + statusBar.DI_TEXT_ALIGN_RIGHT | + statusBar.DI_TRANSLATABLE | + statusBar.DI_SCREEN_CENTER_BOTTOM, + Font.CR_DARKGRAY); + } + + } + + bool GetIsActive() + { + return weaponstatus[KGC_ACTIVE] && + HasBatteryCharge(); + } + + override void InitializeWepStats(bool idfa) + { + weaponstatus[KGC_BATTERY] = 20; + weaponstatus[KGC_ACTIVE] = 0; + super.InitializeWepStats(idfa); + } + + override double WeaponBulk() + { + int battery_weight = 0; + if(weaponstatus[KGC_BATTERY] != -1) { + // Battery bulk = 18, but inside this combines with its + // bulk (takes up less room). + battery_weight = 10; + } + + // This item's bulk is 20. Battery adds to that. + return battery_weight + 20; } void UpdateDisplay() @@ -193,7 +366,7 @@ class GretchenCounter : HDWeapon // } float totalReading = 0.0; - if(onSwitch) { + if(GetIsActive()) { totalReading = GetReadingForType("BFGNecroShard", 1.0) + GetReadingForType("HDBarrel", 2.0); @@ -206,7 +379,7 @@ class GretchenCounter : HDWeapon lastReading = totalReading; float r = frandom(0.0, 1.0); - if(r < pct_reading && onSwitch) + if(r < pct_reading && GetIsActive()) { // console.printf("test: %f %f", r, pct_reading); referenceActor.A_StartSound("kiri/gretchencounter_click"); @@ -249,7 +422,7 @@ class GretchenCounter : HDWeapon framesSinceLastBeep++; - // if(onSwitch) + // if(GetIsActive()) { if(!wasNeedleAtMax || framesSinceLastBeep > 15) { if(needlePosition >= 0.9) { @@ -260,5 +433,13 @@ class GretchenCounter : HDWeapon } } + override string GetHelpText() + { + return "" + ..WEPHELP_FIRE.." Toggle on/off\n" + ..WEPHELP_RELOAD.." Reload battery\n" + ..WEPHELP_UNLOAD.." Remove battery\n" + ..WEPHELP_MAGMANAGER; + } }