From 3a9d217816df1709d59e8f434498a2f771cee934 Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Sat, 30 May 2020 00:08:20 +0200 Subject: [PATCH] The recipient of such activities may receive direct physical pleasure via masochism, or emotional pleasure through erotic humiliation, or knowledge that the play is pleasing to a sadistic dominant. --- README.md | 12 +- cvarinfo.txt | 2 + graphics/HUD/WallbusterMenu.png | Bin 0 -> 247 bytes language.def_menu | 14 + language.es_menu | 14 + language.version | 2 +- menudef.txt | 1 + modeldef.wallbuster | 8 +- zscript/swwm_cbt.zsc | 594 +++++++++++++++++++++++++++++++- zscript/swwm_common.zsc | 20 ++ 10 files changed, 644 insertions(+), 23 deletions(-) create mode 100644 graphics/HUD/WallbusterMenu.png diff --git a/README.md b/README.md index 98201a74b..f13e58bc9 100644 --- a/README.md +++ b/README.md @@ -173,18 +173,12 @@ REALLY watch out for the recoil. Reload reloads (obviously). The process is very complicated so I'll explain it better as a list: - - Press fire to change the ammo type to load. - - Press altfire to queue reloads, if the selected ammo is exhausted, you will - be prompted to reselect one. - - Press zoom to "auto-load". Stronger ammo types will be prioritized. + - A menu will open after the side lever is pulled. Here you can queue ammo to + load up. Controls are displayed at all times. - In single player, the game is paused when you're in the queueing process, so you can take your time, but in coop you better have someone to cover you while you micromanage this beast. - - Since it's actually just a menu, you can also cancel by closing it. - - The reload menu can also be helpful to see the current status of all loaded - barrels. - - Press reload again to start filling it up (or cancel if there's no queue). - - While loading shells, you can stop the reload by pressing any weapon button. + - While loading shells, you can cancel by holding the reload button. - For a skilled combat robot like you, reloading this should be very fast. People like to nickname it the "Ballbuster". You'll see why. diff --git a/cvarinfo.txt b/cvarinfo.txt index 02ca558e8..17bd2b984 100644 --- a/cvarinfo.txt +++ b/cvarinfo.txt @@ -52,3 +52,5 @@ user int swwm_scrscale = 0; // score scaling (0 = use GZDoom scaling) user int swwm_numscale = 0; // damnum scaling (0 = use GZDoom scaling) server bool swwm_blood = false; // custom blood/gibbing user bool swwm_fuzz = true; // allows toggling the fuzz shader on the demolitionist menus, useful if you're streaming/recording since it destroys the encoding quality +user bool swwm_cbtpause = true; // wallbuster menu pauses the game + diff --git a/graphics/HUD/WallbusterMenu.png b/graphics/HUD/WallbusterMenu.png new file mode 100644 index 0000000000000000000000000000000000000000..8ff13bac7fc48c2b0ddb75b62b68127c532b087b GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0y~yU}$AvV36iuV_;wi+UCR0z`(H2)5S3)z(4<56=y`NRY%**nUfq{X+)78&qol`;+04IT4MF0Q* literal 0 HcmV?d00001 diff --git a/language.def_menu b/language.def_menu index b8c1eb782..ca63620f4 100644 --- a/language.def_menu +++ b/language.def_menu @@ -97,6 +97,7 @@ SWWM_SCRSCALE = "Score Scaling"; SWWM_GZSCALE = "Use GZDoom Setting"; SWWM_BLOOD = "Enable Custom Blood"; SWWM_FUZZ = "Enable Animated Menu BG"; +SWWM_BUSTERPAUSE = "Pause on Wallbuster Reload"; TOOLTIP_SWWM_VOICETYPE = "Sets the voice pack for the player."; TOOLTIP_SWWM_MUTEVOICE = "Control what gets muted, if you'd rather have a more silent protagonist."; TOOLTIP_SWWM_FLASHSTRENGTH = "Screen flashes usually happen when firing some weapons, you can lower this if these effects are harmful for you."; @@ -140,6 +141,7 @@ TOOLTIP_SWWM_NUMSCALE = "Scaling factor for damage/healing numbers. Set to 0 to TOOLTIP_SWWM_SCRSCALE = "Scaling factor for score numbers. Set to 0 to use GZDoom's own HUD scaling."; TOOLTIP_SWWM_BLOOD = "Please note that these effects are kinda cheap and performance heavy. I'd honestly recommend Nashgore instead, it's better."; TOOLTIP_SWWM_FUZZ = "Toggling this off is recommended if you're recording/streaming as this effect can harm video quality."; +TOOLTIP_SWWM_CBTPAUSE = "The game will pause while the Wallbuster reload menu is open (only in singleplayer)."; // knowledge base SWWM_COMINGSOON = "(coming soon)"; SWWM_MISSTAB = "Mission"; @@ -310,3 +312,15 @@ SWWM_MISSION_HEXEN = "\n" "Saya out."; SWWM_MISSION_NONE = "(no mission briefing available)"; +// Wallbuster menu +SWWM_BUSTERTITLE = "Wallbuster - Easy Reload Menu"; +SWWM_BUSTERKEYS = +"\cfLeft/Right:\c- Select Ammo Type\n" +"\cfDown:\c- Add Ammo\n" +"\cfUp:\c- Remove Ammo\n" +"\cfPage Up,\c-\n" +"\cfBackspace:\c- Clear Ammo\n" +"\cfPage Down:\c- Auto Fill\n" +"\cfEnter:\c- Initiate Reload\n" +"\cfEnter (if empty):\c- Auto Reload\n" +"\cfEsc:\c- Cancel Reload\n"; \ No newline at end of file diff --git a/language.es_menu b/language.es_menu index 662e7826e..14eeba6a4 100644 --- a/language.es_menu +++ b/language.es_menu @@ -94,6 +94,7 @@ SWWM_SCRSCALE = "Escala de Puntuaciones"; SWWM_GZSCALE = "Usar Opción de GZDoom"; SWWM_BLOOD = "Habilitar Sangre Personalizada"; SWWM_FUZZ = "Habilitar Fondo Animado de Menú"; +SWWM_BUSTERPAUSE = "Pausar en Regarga de Wallbuster"; TOOLTIP_SWWM_VOICETYPE = "Selecciona el pack de voz para el jugador."; TOOLTIP_SWWM_MUTEVOICE = "Controla lo que se mutea, si prefieres tener un protagonista más silencioso."; TOOLTIP_SWWM_FLASHSTRENGTH = "Los destellos en pantalla suelen ocurrir al disparar algunas armas, puedes reducirlo si este tipo de effectos te causan malestar."; @@ -137,6 +138,7 @@ TOOLTIP_SWWM_NUMSCALE = "Factor de escalado para los números de daño/salud. Po TOOLTIP_SWWM_SCRSCALE = "Factor de escalado para los números de puntuación. Pon a 0 para usar el escalado de HUD de GZDoom."; TOOLTIP_SWWM_BLOOD = "Ten en cuenta que estos efectos son un poco cutres y bajan los frames. Sinceramente, recomendaría usar Nashgore, es mejor."; TOOLTIP_SWWM_FUZZ = "Desactivar ésto es recomendado si estás grabando o haciendo streaming, ya que este effecto puede dañar la calidad del vídeo."; +TOOLTIP_SWWM_CBTPAUSE = "El juego será pausado mientras el menú de recarga de Wallbuster está abierto (sólo en modo de un jugador)."; // knowledge base SWWM_COMINGSOON = "(próximamente)"; SWWM_MISSTAB = "Misión"; @@ -307,3 +309,15 @@ SWWM_MISSION_HEXEN = "\n" " — Saya"; SWWM_MISSION_NONE = "(no hay instrucciones de misión disponibles)"; +// Wallbuster menu +SWWM_BUSTERTITLE = "Wallbuster - Menú de Recarga Fácil"; +SWWM_BUSTERKEYS = +"\cfIzq/Dcha:\c- Seleccionar Munición\n" +"\cfAbajo:\c- Agregar Munición\n" +"\cfArriba:\c- Quitar Munición\n" +"\cfRe Pág,\c-\n" +"\cfRetroceso:\c- Limpiar Munición\n" +"\cfAv Pág:\c- Autorellenado\n" +"\cfEnter:\c- Iniciar Recarga\n" +"\cfEnter (si vacío):\c- Autorrecarga\n" +"\cfEsc:\c- Calcelar recarga\n"; \ No newline at end of file diff --git a/language.version b/language.version index 5ac12be07..102c49b22 100644 --- a/language.version +++ b/language.version @@ -1,2 +1,2 @@ [default] -SWWM_MODVER="\cxSWWM GZ\c- r276 (Fri 29 May 19:23:51 CEST 2020)"; +SWWM_MODVER="\cxSWWM GZ\c- r277 (Sat 30 May 00:08:20 CEST 2020)"; diff --git a/menudef.txt b/menudef.txt index b77950600..1ff043e67 100644 --- a/menudef.txt +++ b/menudef.txt @@ -67,6 +67,7 @@ OptionMenu "SWWMOptionMenu" Option "$SWWM_HEALTHUSE", "swwm_autousehealth", "YesNo" Option "$SWWM_AMMOUSE", "swwm_autouseammo", "YesNo" Option "$SWWM_EARBUSTER", "swwm_earbuster", "YesNo" + Option "$SWWM_BUSTERPAUSE", "swwm_cbtpause", "YesNo" Option "$SWWM_BALLUSE", "swwm_balluse", "YesNo" StaticText " " StaticText "$SWWM_CTITLE", "Gold" diff --git a/modeldef.wallbuster b/modeldef.wallbuster index 04cbd3efc..b88d95795 100644 --- a/modeldef.wallbuster +++ b/modeldef.wallbuster @@ -20,7 +20,7 @@ Model "Wallbuster" Model 3 "Flat_d.3d" PitchOffset 90 - // Buckshot XZWW + // Buckshot Scale 0.13 0.13 0.13 Skin 3 "ShotgMuz.png" Offset 16 -60 -16 @@ -49,13 +49,13 @@ Model "Wallbuster" FrameIndex XZWW W 3 0 FrameIndex XZWW X 3 0 FrameIndex XZWW Y 3 0 - // Slug XZWX + // Slug Scale 0.08 0.08 0.08 Skin 3 "ShotgMuz.png" - // Kinylum XZWY + // Kinylum Scale 0.13 0.13 0.13 Skin 2 "ShotgMuzSalt.png" - // Ball XZWZ + // Ball Scale 0.06 0.06 0.06 Skin 2 "ShotgMuz.png" } diff --git a/zscript/swwm_cbt.zsc b/zscript/swwm_cbt.zsc index 58e024d73..047cbd82f 100644 --- a/zscript/swwm_cbt.zsc +++ b/zscript/swwm_cbt.zsc @@ -3,6 +3,311 @@ Class WallbusterReloadMenu : GenericMenu { + transient Font TewiFont, MPlusFont, MiniwiFont, k6x8Font; + TextureID MainWindow, AmmoIcon[4]; + int sel0; + Array queue; + int AmmoSets[4]; + bool isrclick, ismclick; + transient CVar pauseme, lang; + + // if playing in Japanese, returns an alternate font of the same height + // Tewi -> MPlus + // Miniwi -> k6x8 + Font LangFont( Font req ) + { + if ( !lang ) lang = CVar.GetCVar('language',players[consoleplayer]); + if ( lang.GetString() ~== "jp" ) + { + if ( req == MiniwiFont ) return k6x8Font; + return MPlusFont; + } + return req; + } + + override void Init( Menu parent ) + { + Super.Init(parent); + if ( (gamestate != GS_LEVEL) || (players[consoleplayer].Health <= 0) || !(players[consoleplayer].ReadyWeapon is 'Wallbuster') ) + { + EventHandler.SendNetworkEvent("swwmcbt.",consoleplayer); + Close(); + return; + } + TewiFont = Font.GetFont('TewiShaded'); + MPlusFont = Font.GetFont('MPlusShaded'); + MiniwiFont = Font.GetFont('MiniwiShaded'); + k6x8Font = Font.GetFont('k6x8Shaded'); + MainWindow = TexMan.CheckForTexture("graphics/HUD/WallbusterMenu.png",TexMan.Type_Any); + AmmoIcon[0] = TexMan.CheckForTexture("graphics/HUD/RedShell.png",TexMan.Type_Any); + AmmoIcon[1] = TexMan.CheckForTexture("graphics/HUD/GreenShell.png",TexMan.Type_Any); + AmmoIcon[2] = TexMan.CheckForTexture("graphics/HUD/BlueShell.png",TexMan.Type_Any); + AmmoIcon[3] = TexMan.CheckForTexture("graphics/HUD/PurpleShell.png",TexMan.Type_Any); + MenuSound("menu/demotab"); + queue.Clear(); + sel0 = 0; + } + + override void Ticker() + { + Super.Ticker(); + if ( !pauseme ) pauseme = CVar.GetCVar('swwm_cbtpause',players[consoleplayer]); + if ( pauseme.GetBool() ) menuactive = Menu.On; + else menuactive = Menu.OnNoPause; + if ( (players[consoleplayer].Health > 0) && (players[consoleplayer].ReadyWeapon is 'Wallbuster') ) return; + MenuEvent(MKEY_BACK,false); + } + + private bool IsDone() + { + static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell"}; + if ( queue.Size() >= 25 ) return true; + for ( int i=0; i<4; i++ ) + { + if ( (players[consoleplayer].mo.CountInv(types[i])-AmmoSets[i]) > 0 ) + return false; + } + return true; + } + + private bool PushAmmo( bool autoshift = false ) + { + static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell"}; + if ( queue.Size() >= 25 ) return true; + if ( (players[consoleplayer].mo.CountInv(types[sel0])-AmmoSets[sel0]) <= 0 ) + { + if ( autoshift ) + { + // switch to next available ammo + for ( int i=0; i<4; i++ ) + { + int idx = (sel0+i)%4; + if ( (players[consoleplayer].mo.CountInv(types[idx])-AmmoSets[idx]) > 0 ) + { + sel0 = idx; + return PushAmmo(true); + } + } + } + MenuSound("menu/noinvuse"); + return false; + } + if ( !autoshift ) MenuSound("menu/demosel"); + AmmoSets[sel0]++; + queue.Push(sel0); + return true; + } + + override bool MenuEvent( int mkey, bool fromcontroller ) + { + switch ( mkey ) + { + case MKEY_BACK: + queue.Clear(); + for ( int i=0; i<4; i++ ) AmmoSets[i] = 0; + MenuSound("menu/democlose"); + EventHandler.SendNetworkEvent("swwmcbt.",consoleplayer); + Close(); + return true; + case MKEY_ENTER: + if ( queue.Size() <= 0 ) + { + while ( queue.Size() < 25 ) + { + if ( !PushAmmo(true) ) + break; + } + } + String cbt = "swwmcbt."; + for ( int i=0; i 3 ) sel0 = 0; + return true; + case MKEY_LEFT: + MenuSound("menu/demotab"); + sel0--; + if ( sel0 < 0 ) sel0 = 3; + return true; + case MKEY_PAGEDOWN: + if ( IsDone() ) + { + MenuSound("menu/noinvuse"); + return true; + } + while ( queue.Size() < 25 ) + { + if ( !PushAmmo(true) ) + return true; + } + MenuSound("menu/demosel"); + return true; + case MKEY_CLEAR: + case MKEY_PAGEUP: + if ( queue.Size() <= 0 ) MenuSound("menu/noinvuse"); + else + { + MenuSound("menu/demoscroll"); + queue.Clear(); + for ( int i=0; i<4; i++ ) AmmoSets[i] = 0; + } + return true; + } + return Super.MenuEvent(mkey,fromcontroller); + } + + override bool MouseEvent( int type, int mx, int my ) + { + bool res = Super.MouseEvent(type,mx,my); + // TODO + return res; + } + + override bool OnUiEvent( UIEvent ev ) + { + int y; + bool res; + switch ( ev.type ) + { + case UIEvent.Type_LButtonDown: + isrclick = false; + ismclick = false; + return Super.OnUIEvent(ev); + break; + case UIEvent.Type_RButtonDown: + isrclick = true; + ismclick = false; + // copy over what base menus do for L click + y = ev.MouseY; + res = MouseEventBack(MOUSE_Click,ev.MouseX,y); + if ( res ) y = -1; + res |= MouseEvent(MOUSE_Click,ev.MouseX,y); + if ( res ) SetCapture(true); + return false; + break; + case UIEvent.Type_MButtonDown: + isrclick = false; + ismclick = true; + // copy over what base menus do for L click + y = ev.MouseY; + res = MouseEventBack(MOUSE_Click,ev.MouseX,y); + if ( res ) y = -1; + res |= MouseEvent(MOUSE_Click,ev.MouseX,y); + if ( res ) SetCapture(true); + return false; + break; + case UIEvent.Type_RButtonUp: + case UIEvent.Type_MButtonUp: + // copy over what base menus do for L release + if ( mMouseCapture ) + { + SetCapture(false); + y = ev.MouseY; + res = MouseEventBack(MOUSE_Release,ev.MouseX,y); + if ( res ) y = -1; + res |= MouseEvent(MOUSE_Release,ev.MouseX,y); + } + return false; + break; + } + return Super.OnUIEvent(ev); + } + + override void Drawer() + { + static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell"}; + Super.Drawer(); + double hs = max(min(floor(Screen.GetWidth()/640.),floor(Screen.GetHeight()/400.)),1.); + Vector2 ss = (Screen.GetWidth(),Screen.GetHeight())/hs; + Vector2 origin = (ss.x-132,ss.y-26)/2.; + Screen.DrawTexture(MainWindow,false,origin.x,origin.y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + int ox = 27, oy = 2; + for ( int i=0; i<4; i++ ) + { + Screen.DrawTexture(AmmoIcon[i],false,origin.x+ox,origin.y+oy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i==sel0)?Color(0,0,0,0):Color(128,0,0,0)); + String astr = String.Format("%3d",players[consoleplayer].mo.CountInv(types[i])-AmmoSets[i]); + Screen.DrawText(TewiFont,Font.CR_FIRE,origin.x+ox-(TewiFont.StringWidth(astr)+1),origin.y+oy-2,astr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i==sel0)?Color(0,0,0,0):Color(128,0,0,0)); + ox += 33; + } + // pointer (▸) + Screen.DrawChar(TewiFont,Font.CR_GREEN,origin.x+2+33*sel0,origin.y,0x25B8,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + int siz = queue.Size()-1; + ox = 2+siz*5+(siz/5); + oy = 15; + for ( int i=0; i<=siz; i++ ) + { + Screen.DrawTexture(AmmoIcon[queue[i]],false,origin.x+ox,origin.y+oy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + ox -= 5; + if ( !((i+1)%5) ) ox--; + } + // text stuff + String str; + Font fnt; + int boxw, sw; + double x, y; + fnt = LangFont(TewiFont); + str = StringTable.Localize("$SWWM_BUSTERTITLE"); + sw = fnt.StringWidth(str); + boxw = sw; + fnt = LangFont(MiniwiFont); + str = "(C)2148 Akari Labs"; + sw = fnt.StringWidth(str); + if ( sw > boxw ) boxw = sw; + x = floor((ss.x-boxw)/2.); + y = origin.y-30; + Screen.Dim("Black",.8,int((x-2)*hs),int((y-1)*hs),int((boxw+4)*hs),int(25*hs)); + fnt = LangFont(TewiFont); + str = StringTable.Localize("$SWWM_BUSTERTITLE"); + sw = fnt.StringWidth(str); + x = floor((ss.x-sw)/2.); + Screen.DrawText(fnt,Font.CR_FIRE,x,y,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + y += 14; + fnt = LangFont(MiniwiFont); + str = "(C)2148 Akari Labs"; + sw = fnt.StringWidth(str); + x = floor((ss.x-sw)/2.); + Screen.DrawText(fnt,Font.CR_GOLD,x,y,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + y = origin.y+36; + fnt = LangFont(MiniwiFont); + str = StringTable.Localize("$SWWM_BUSTERKEYS"); + BrokenLines l = fnt.BreakLines(str,300); + boxw = 0; + for ( int i=0; i boxw ) boxw = sw; + } + x = floor((ss.x-boxw)/2.); + Screen.Dim("Black",.8,int((x-2)*hs),int((y-2)*hs),int((boxw+4)*hs),int((9*l.Count()+2)*hs)); + for ( int i=0; i reloadqueue; + Array > reloadqueue; transient bool waitreload; int whichspin; transient CVar cbtmuffler; @@ -158,12 +463,32 @@ Class Wallbuster : SWWMWeapon fired[i] = false; } } + action void A_CBTFlash( StateLabel flashlabel = null, int index = 0 ) + { + if ( !player || !player.ReadyWeapon ) + return; + Weapon weap = player.ReadyWeapon; + State flashstate = null; + if ( !flashlabel ) + { + if ( weap.bAltFire ) + flashstate = weap.FindState('AltFlash'); + if ( !flashstate ) + flashstate = weap.FindState('Flash'); + } + else flashstate = weap.FindState(flashlabel); + player.SetPSprite(PSP_FLASH,flashstate+index); + A_OverlayFlags(PSP_FLASH,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true); + A_OverlayRenderStyle(PSP_FLASH,STYLE_Add); + } action void A_FireShells( int num = 1 ) { static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell"}; static const statelabel flashes[] = {"FlashRed","FlashGreen","FlashBlue","FlashPurple"}; static const String sounds[] = {"spreadgun/redfire","spreadgun/greenfire","spreadgun/bluefire","spreadgun/purplefire"}; static const Color cols[] = {Color(40,255,192,64),Color(36,255,192,80),Color(48,32,176,255),Color(24,255,224,96)}; + int redflashstr = 0; + int blueflashstr = 0; // speen if ( num == 1 ) invoker.whichspin = 1; else if ( num == 5 ) invoker.whichspin = 2; @@ -191,6 +516,7 @@ Class Wallbuster : SWWMWeapon player.SetPsprite(PSP_WEAPON,ResolveState("DryFire")); return; } + Console.Printf("\cgFIRING NOT FULLY IMPLEMENTED\c-"); Vector3 x, y, z; [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); if ( !invoker.cbtmuffler ) invoker.cbtmuffler = CVar.GetCVar('swwm_earbuster',players[consoleplayer]); @@ -211,12 +537,16 @@ Class Wallbuster : SWWMWeapon int which = 0; for ( int j=0; j<4; j++ ) { - if ( !(invoker.loaded[i] is types[j]) ) continue; + if ( !(invoker.loaded[idx] is types[j]) ) continue; which = j; break; } double rfact = invoker.cbtmuffler.GetBool()?.85:.65; A_StartSound(sounds[which],CHAN_WEAPON,CHANF_OVERLAP,1./(howmany**rfact),.6-howmany*.004,1.-howmany*.012); + if ( which == 0 ) redflashstr = max(120,redflashstr+10); + else if ( which == 1 ) redflashstr = max(90,redflashstr+8); + else if ( which == 2 ) blueflashstr = max(160,blueflashstr+10); + else if ( which == 3 ) redflashstr = max(60,redflashstr+6); invoker.fired[idx] = true; } if ( howmany < 3 ) player.SetPsprite(PSP_WEAPON,ResolveState("FireOne")); @@ -227,6 +557,21 @@ Class Wallbuster : SWWMWeapon A_QuakeEx(qk,qk,qk,ql,0,8,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:qk*.15); A_ZoomFactor(1.+qk*.04,ZOOM_INSTANT); A_ZoomFactor(1.); + if ( redflashstr > 0 ) + { + let l = Spawn("SWWMWeaponLight",pos); + l.args[3] = redflashstr; + l.target = self; + } + if ( blueflashstr > 0 ) + { + let l = Spawn("SWWMWeaponLight",pos); + l.args[0] = 96; + l.args[1] = 224; + l.args[2] = 255; + l.args[3] = blueflashstr; + l.target = self; + } } action void A_SpinOne() { @@ -246,6 +591,19 @@ Class Wallbuster : SWWMWeapon invoker.rotation[5]--; while ( invoker.rotation[5] < 0 ) invoker.rotation[5] += 5; } + action void A_OpenMenu() + { + invoker.reloadqueue.Clear(); + invoker.waitreload = true; + if ( player == players[consoleplayer] ) + Menu.SetMenu('WallbusterReloadMenu'); + } + action void A_WaitMenu() + { + if ( invoker.waitreload ) return; + if ( invoker.reloadqueue.Size() <= 0 ) player.SetPsprite(PSP_WEAPON,ResolveState("EndReload")); + else player.SetPsprite(PSP_WEAPON,ResolveState("Detach")); + } Default { @@ -347,16 +705,30 @@ Class Wallbuster : SWWMWeapon XZW2 A 0; Goto Ready; Reload: - XZW2 A 1; - Goto Ready; + XZW2 A 2 A_StartSound("wallbuster/meleestart",CHAN_WEAPON,CHANF_OVERLAP); + XZW4 DEFGHIJK 2; + XZW4 L 1 A_StartSound("wallbuster/unlock",CHAN_WEAPON,CHANF_OVERLAP); + XZW4 MNOPQ 1; + XZW4 RSTUV 2; + XZW4 W 2 A_OpenMenu(); + XZW4 W 1 A_WaitMenu(); + Wait; Detach: - XZW2 A 1; - Goto Ready; + XZW4 W 1 + { + Console.Printf("\cgRELOADING NOT IMPLEMENTED\c-"); + } + Goto EndReload; Attach: - XZW2 A 1; - Goto Ready; + XZW2 W 1; + Goto EndReload; EndReload: - XZW2 A 1; + XZW4 W 2; + XZW8 OPQRS 2; + XZW8 T 1 A_StartSound("wallbuster/lock",CHAN_WEAPON,CHANF_OVERLAP); + XZW8 UVWXY 1; + XZW8 Z 2 A_StartSound("wallbuster/meleeend",CHAN_WEAPON,CHANF_OVERLAP); + XZW9 ABCDEF 2; Goto Ready; User1: XZW2 A 2 @@ -378,5 +750,209 @@ Class Wallbuster : SWWMWeapon XZW2 BCDEFG 2; XZW2 G -1 A_FullLower(); Stop; + FlashRed: + XZWW A 2 Bright; + Stop; + XZWW B 2 Bright; + Stop; + XZWW C 2 Bright; + Stop; + XZWW D 2 Bright; + Stop; + XZWW E 2 Bright; + Stop; + XZWW F 2 Bright; + Stop; + XZWW G 2 Bright; + Stop; + XZWW H 2 Bright; + Stop; + XZWW I 2 Bright; + Stop; + XZWW J 2 Bright; + Stop; + XZWW K 2 Bright; + Stop; + XZWW L 2 Bright; + Stop; + XZWW M 2 Bright; + Stop; + XZWW N 2 Bright; + Stop; + XZWW O 2 Bright; + Stop; + XZWW P 2 Bright; + Stop; + XZWW Q 2 Bright; + Stop; + XZWW R 2 Bright; + Stop; + XZWW S 2 Bright; + Stop; + XZWW T 2 Bright; + Stop; + XZWW U 2 Bright; + Stop; + XZWW V 2 Bright; + Stop; + XZWW W 2 Bright; + Stop; + XZWW X 2 Bright; + Stop; + XZWW Y 2 Bright; + Stop; + FlashGreen: + XZWX A 2 Bright; + Stop; + XZWX B 2 Bright; + Stop; + XZWX C 2 Bright; + Stop; + XZWX D 2 Bright; + Stop; + XZWX E 2 Bright; + Stop; + XZWX F 2 Bright; + Stop; + XZWX G 2 Bright; + Stop; + XZWX H 2 Bright; + Stop; + XZWX I 2 Bright; + Stop; + XZWX J 2 Bright; + Stop; + XZWX K 2 Bright; + Stop; + XZWX L 2 Bright; + Stop; + XZWX M 2 Bright; + Stop; + XZWX N 2 Bright; + Stop; + XZWX O 2 Bright; + Stop; + XZWX P 2 Bright; + Stop; + XZWX Q 2 Bright; + Stop; + XZWX R 2 Bright; + Stop; + XZWX S 2 Bright; + Stop; + XZWX T 2 Bright; + Stop; + XZWX U 2 Bright; + Stop; + XZWX V 2 Bright; + Stop; + XZWX W 2 Bright; + Stop; + XZWX X 2 Bright; + Stop; + XZWX Y 2 Bright; + Stop; + FlashBlue: + XZWY A 2 Bright; + Stop; + XZWY B 2 Bright; + Stop; + XZWY C 2 Bright; + Stop; + XZWY D 2 Bright; + Stop; + XZWY E 2 Bright; + Stop; + XZWY F 2 Bright; + Stop; + XZWY G 2 Bright; + Stop; + XZWY H 2 Bright; + Stop; + XZWY I 2 Bright; + Stop; + XZWY J 2 Bright; + Stop; + XZWY K 2 Bright; + Stop; + XZWY L 2 Bright; + Stop; + XZWY M 2 Bright; + Stop; + XZWY N 2 Bright; + Stop; + XZWY O 2 Bright; + Stop; + XZWY P 2 Bright; + Stop; + XZWY Q 2 Bright; + Stop; + XZWY R 2 Bright; + Stop; + XZWY S 2 Bright; + Stop; + XZWY T 2 Bright; + Stop; + XZWY U 2 Bright; + Stop; + XZWY V 2 Bright; + Stop; + XZWY W 2 Bright; + Stop; + XZWY X 2 Bright; + Stop; + XZWY Y 2 Bright; + Stop; + FlashPurple: + XZWZ A 2 Bright; + Stop; + XZWZ B 2 Bright; + Stop; + XZWZ C 2 Bright; + Stop; + XZWZ D 2 Bright; + Stop; + XZWZ E 2 Bright; + Stop; + XZWZ F 2 Bright; + Stop; + XZWZ G 2 Bright; + Stop; + XZWZ H 2 Bright; + Stop; + XZWZ I 2 Bright; + Stop; + XZWZ J 2 Bright; + Stop; + XZWZ K 2 Bright; + Stop; + XZWZ L 2 Bright; + Stop; + XZWZ M 2 Bright; + Stop; + XZWZ N 2 Bright; + Stop; + XZWZ O 2 Bright; + Stop; + XZWZ P 2 Bright; + Stop; + XZWZ Q 2 Bright; + Stop; + XZWZ R 2 Bright; + Stop; + XZWZ S 2 Bright; + Stop; + XZWZ T 2 Bright; + Stop; + XZWZ U 2 Bright; + Stop; + XZWZ V 2 Bright; + Stop; + XZWZ W 2 Bright; + Stop; + XZWZ X 2 Bright; + Stop; + XZWZ Y 2 Bright; + Stop; } } diff --git a/zscript/swwm_common.zsc b/zscript/swwm_common.zsc index f0652ac43..7baedbe63 100644 --- a/zscript/swwm_common.zsc +++ b/zscript/swwm_common.zsc @@ -2869,6 +2869,7 @@ Class SWWMHandler : EventHandler override void NetworkProcess( ConsoleEvent e ) { + static const Class cbttypes[] = {"RedShell","GreenShell","BlueShell","PurpleShell"}; if ( e.Name ~== "swwmgesture" ) { if ( (e.player == -1) || !playeringame[e.player] || !players[e.player].mo ) return; @@ -3029,6 +3030,25 @@ Class SWWMHandler : EventHandler SWWMLoreLibrary.Add(players[e.Args[0]],fn.Mid(13,ext-13)); } } + else if ( e.Name.Left(8) ~== "swwmcbt." ) + { + // from wikipedia, the free encyclopedia + if ( !playeringame[e.Args[0]] || !players[e.Args[0]].mo ) return; + let cbt = Wallbuster(players[e.Args[0]].mo.FindInventory("Wallbuster")); + if ( !cbt ) return; + cbt.reloadqueue.Clear(); + Array qs; + qs.Clear(); + String rite = e.Name.Mid(8); + rite.Split(qs,",",TOK_SKIPEMPTY); + for ( int i=0; i 3) ) continue; + cbt.reloadqueue.Push(cbttypes[qi]); + } + cbt.waitreload = false; + } } // stuff for hud