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.
This commit is contained in:
parent
2343d3d764
commit
3a9d217816
10 changed files with 644 additions and 23 deletions
12
README.md
12
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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
BIN
graphics/HUD/WallbusterMenu.png
Normal file
BIN
graphics/HUD/WallbusterMenu.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 247 B |
|
|
@ -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";
|
||||
|
|
@ -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";
|
||||
|
|
@ -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)";
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,6 +3,311 @@
|
|||
|
||||
Class WallbusterReloadMenu : GenericMenu
|
||||
{
|
||||
transient Font TewiFont, MPlusFont, MiniwiFont, k6x8Font;
|
||||
TextureID MainWindow, AmmoIcon[4];
|
||||
int sel0;
|
||||
Array<int> 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<Ammo> 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<Ammo> 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<queue.Size(); i++ )
|
||||
cbt.AppendFormat("%d,",queue[i]);
|
||||
MenuSound("menu/democlose");
|
||||
EventHandler.SendNetworkEvent(cbt,consoleplayer);
|
||||
Close();
|
||||
return true;
|
||||
case MKEY_UP:
|
||||
if ( queue.Size() <= 0 ) MenuSound("menu/noinvuse");
|
||||
else
|
||||
{
|
||||
MenuSound("menu/demoscroll");
|
||||
AmmoSets[queue[queue.Size()-1]]--;
|
||||
queue.Pop();
|
||||
}
|
||||
return true;
|
||||
case MKEY_DOWN:
|
||||
if ( IsDone() )
|
||||
{
|
||||
MenuSound("menu/noinvuse");
|
||||
return true;
|
||||
}
|
||||
PushAmmo();
|
||||
return true;
|
||||
case MKEY_RIGHT:
|
||||
MenuSound("menu/demotab");
|
||||
sel0++;
|
||||
if ( sel0 > 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<Ammo> 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<l.Count(); i++ )
|
||||
{
|
||||
sw = l.StringWidth(i);
|
||||
if ( sw > 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<l.Count(); i++ )
|
||||
{
|
||||
Screen.DrawText(fnt,Font.CR_WHITE,x,y,l.StringAt(i),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
|
||||
y += 9;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Class Wallbuster : SWWMWeapon
|
||||
|
|
@ -11,7 +316,7 @@ Class Wallbuster : SWWMWeapon
|
|||
bool fired[25];
|
||||
int rotation[6];
|
||||
bool initialized;
|
||||
Array<int> reloadqueue;
|
||||
Array<Class<Ammo> > 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<Ammo> 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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2869,6 +2869,7 @@ Class SWWMHandler : EventHandler
|
|||
|
||||
override void NetworkProcess( ConsoleEvent e )
|
||||
{
|
||||
static const Class<Ammo> 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<String> qs;
|
||||
qs.Clear();
|
||||
String rite = e.Name.Mid(8);
|
||||
rite.Split(qs,",",TOK_SKIPEMPTY);
|
||||
for ( int i=0; i<qs.Size(); i++ )
|
||||
{
|
||||
int qi = qs[i].ToInt();
|
||||
if ( (qi < 0) || (qi > 3) ) continue;
|
||||
cbt.reloadqueue.Push(cbttypes[qi]);
|
||||
}
|
||||
cbt.waitreload = false;
|
||||
}
|
||||
}
|
||||
|
||||
// stuff for hud
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue