Added shuffle function to Wallbuster menu.

Eviscerator shells have higher range with an extended barrel.
Dashing backwards deals more damage (buttslam).
Wallbuster damage tweaks (longer barrel == more hurt).
Allow buying Gravity Suppressors in Doom, and Barriers in Heretic/Hexen.
This commit is contained in:
Mari the Deer 2020-06-05 09:44:14 +02:00
commit ef92bdb1d1
11 changed files with 50 additions and 19 deletions

View file

@ -266,7 +266,7 @@ SWWM_LORETXT_LOOTBOX = "\cxDesignation:\c-\n\cf Lucky Chance Box\c-\n\cxManufact
SWWM_LORETAG_EVISCERATOR = "Eviscerator";
SWWM_LORETAB_EVISCERATOR = "Item";
SWWM_LOREREL_EVISCERATOR = "BigShot;Hammerspace;Saya";
SWWM_LORETXT_EVISCERATOR = "\cxDesignation:\c-\n\cf \"Eviscerator\" High Load Flechette Cannon\c-\n\cxManufacturer:\c-\n\cf Mr. BIG SHOT\c-\n\cxClassification:\c-\n\cf Portable Artillery\c-\n\nA beastly weapon devised by the one and only \cfMr. BIG SHOT\c-, to \"rain hot steaming metal\" on large groups of enemies, turning them into a fine red mist in mere instants. It has been described as \"the bastard child of a shotgun and a grenade launcher\" by some.\n\nIts ownership and use was banned on many countries, not only due to the gruesome effects it had on targets, but also the danger it posed even to its own user. However, at the start of the demonic invasion of 2148, the ban on this weapon was lifted, and was deemed justifiable for use against the invading forces.\n\nUnlike other weapons of similar operation, the \cfEviscerator\c- does not need to be reloaded, thanks to its compatibility with \cfHammerspace™\c- containers, allowing its internal magazine to refill as needed from the operator's own ammo supplies.\n\n\cfPrimary Fire:\c- Detonates the shell directly, spreading hot steaming metal in front of the user.\n\n\cfSecondary Fire:\c- Lobs the shell as a grenade, which will detonate on impact with any surface or object and release its payload in the direction it was facing when initially shot.\n\n\cfTertiary Fire:\c- Toggle between two spread modes for the primary fire. Allowing for either a wide shot with more close range crowd coverage, or a tighter cone which can be beneficial for hitting targets at mid to long range.\n\n\cfTechniques:\c- The metal fragments shot by this weapon will ricochet all over the place, which makes it very effective for shooting around corners and hitting targets out of sight, or hiding behind cover.\n\n\cxSaya's Notes:\c-\n\cfWhy is there an \"owo\" face scribbled on every shell? Who did this? I want answers!\c-";
SWWM_LORETXT_EVISCERATOR = "\cxDesignation:\c-\n\cf \"Eviscerator\" High Load Flechette Cannon\c-\n\cxManufacturer:\c-\n\cf Mr. BIG SHOT\c-\n\cxClassification:\c-\n\cf Portable Artillery\c-\n\nA beastly weapon devised by the one and only \cfMr. BIG SHOT\c-, to \"rain hot steaming metal\" on large groups of enemies, turning them into a fine red mist in mere instants. It has been described as \"the bastard child of a shotgun and a grenade launcher\" by some.\n\nIts ownership and use was banned on many countries, not only due to the gruesome effects it had on targets, but also the danger it posed even to its own user. However, at the start of the demonic invasion of 2148, the ban on this weapon was lifted, and was deemed justifiable for use against the invading forces.\n\nUnlike other weapons of similar operation, the \cfEviscerator\c- does not need to be reloaded, thanks to its compatibility with \cfHammerspace™\c- containers, allowing its internal magazine to refill as needed from the operator's own ammo supplies.\n\n\cfPrimary Fire:\c- Detonates the shell directly, spreading hot steaming metal in front of the user.\n\n\cfSecondary Fire:\c- Lobs the shell as a grenade, which will detonate on impact with any surface or object and release its payload in the direction it was facing when initially shot.\n\n\cfTertiary Fire:\c- Toggle between two spread modes for the primary fire. Allowing for either a wide shot with more close range crowd coverage, or a tighter cone which can be beneficial for hitting targets at mid to long range. Toggling to an extended barrel also has the added benefit of increasing the range of the secondary fire.\n\n\cfTechniques:\c- The metal fragments shot by this weapon will ricochet all over the place, which makes it very effective for shooting around corners and hitting targets out of sight, or hiding behind cover.\n\n\cxSaya's Notes:\c-\n\cfWhy is there an \"owo\" face scribbled on every shell? Who did this? I want answers!\c-";
SWWM_LORETAG_KEYCHAIN = "Keychain";
SWWM_LORETAB_KEYCHAIN = "Item";
SWWM_LOREREL_KEYCHAIN = "Saya;Demolitionist;Belt";

View file

@ -322,6 +322,7 @@ SWWM_BUSTERKEYS =
"\cfUp:\c- Remove Ammo\n"
"\cfPage Up:\c- Add 5 Ammo\n"
"\cfPage Down:\c- Remove 5 Ammo\n"
"\cfTab:\c- Shuffle Ammo\n"
"\cfBackspace:\c- Clear Ammo\n"
"\cfEnter:\c- Initiate Reload\n"
"\cfEnter (if empty):\c- Full Reload\n"

File diff suppressed because one or more lines are too long

View file

@ -319,6 +319,7 @@ SWWM_BUSTERKEYS =
"\cfArriba:\c- Quitar Munición\n"
"\cfRe Pág:\c- Agregar 5 Munición\n"
"\cfAv Pág:\c- Quitar 5 Munición\n"
"\cfTab:\c- Barajar Munición\n"
"\cfRetroceso:\c- Limpiar Munición\n"
"\cfEnter:\c- Iniciar Recarga\n"
"\cfEnter (si vacío):\c- Recarga Completa\n"

View file

@ -1,2 +1,2 @@
[default]
SWWM_MODVER="\cxSWWM GZ\c- r306 (Thu 4 Jun 21:21:45 CEST 2020)";
SWWM_MODVER="\cxSWWM GZ\c- r307 (Fri 5 Jun 09:44:14 CEST 2020)";

View file

@ -22,7 +22,7 @@ Unlike other weapons of similar operation, the **Eviscerator** does not need to
\cfSecondary Fire:\c- Lobs the shell as a grenade, which will detonate on impact with any surface or object and release its payload in the direction it was facing when initially shot.
\cfTertiary Fire:\c- Toggle between two spread modes for the primary fire. Allowing for either a wide shot with more close range crowd coverage, or a tighter cone which can be beneficial for hitting targets at mid to long range.
\cfTertiary Fire:\c- Toggle between two spread modes for the primary fire. Allowing for either a wide shot with more close range crowd coverage, or a tighter cone which can be beneficial for hitting targets at mid to long range. Toggling to an extended barrel also has the added benefit of increasing the range of the secondary fire.
\cfTechniques:\c- The metal fragments shot by this weapon will ricochet all over the place, which makes it very effective for shooting around corners and hitting targets out of sight, or hiding behind cover.

View file

@ -18,7 +18,7 @@ A diferencia de otras armas de operación similar, el **Eviscerator** no necesit
\cfFuego Terciario:\c- Alterna entre dos rangos de alcance para el fuego primario. Permitiendo la opción de un disparo más ancho con mejor alcance a corta distancia, o un disparo más concentrado que puede ser útil para alcanzar objetivos a mayores distancias.
\cfTécnicas:\c- Los fragmentos metálicos disparados por este arma rebotarán por todas partes, lo que los hace muy efectivos para disparar alrededor de esquinas y alcanzar objetivos fuera de vista, u ocultos bajo cobertura.
\cfTécnicas:\c- Los fragmentos metálicos disparados por este arma rebotarán por todas partes, lo que los hace muy efectivos para disparar alrededor de esquinas y alcanzar objetivos fuera de vista, u ocultos bajo cobertura. Cambiar a un cañón extendido tiene también el beneficio añadido de incrementar el rango del fuego secundario.
\cxNotas de Saya:\c-
\cf¿Por que hay una cara de "owo" garabateada en cada bomba de estas? ¿Quien ha sido? ¡Exijo respuestas!\c-

View file

@ -98,6 +98,23 @@ Class WallbusterReloadMenu : GenericMenu
return true;
}
private void ShuffleAmmo()
{
static const Class<Ammo> types[] = {"RedShell","GreenShell","BlueShell","PurpleShell"};
// there's probably a better way to do this but I'm lazy
Array<Int> candidates;
candidates.Clear();
for ( int i=0; i<4; i++ )
{
if ( (players[consoleplayer].mo.CountInv(types[i])-AmmoSets[i]) <= 0 )
continue;
candidates.Push(i);
}
sel0 = Random[WallbusterMenu](0,candidates.Size()-1);
AmmoSets[sel0]++;
queue.Push(sel0);
}
private bool PopAmmo()
{
if ( queue.Size() <= 0 ) return false;
@ -214,6 +231,21 @@ Class WallbusterReloadMenu : GenericMenu
bool res;
switch ( ev.type )
{
case UIEvent.Type_KeyDown:
if ( ev.keychar == UiEvent.Key_Tab )
{
// shuffle!
queue.Clear();
for ( int i=0; i<4; i++ ) AmmoSets[i] = 0;
bool didsomething = false;
while ( !IsDone() )
{
ShuffleAmmo();
didsomething = true;
}
MenuSound(didsomething?"menu/demosel":"menu/noinvuse");
}
break;
case UIEvent.Type_LButtonDown:
isrclick = false;
ismclick = false;
@ -758,7 +790,7 @@ Class Wallbuster : SWWMWeapon
// slug
if ( !sst ) sst = new("SpreadSlugTracer");
sst.ignoreme = self;
sst.penetration = 250.;
sst.penetration = 275.;
a = FRandom[Wallbuster](0,360);
s = FRandom[Wallbuster](0,.002);
dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit();
@ -803,7 +835,7 @@ Class Wallbuster : SWWMWeapon
b.angle = atan2(x2.y,x2.x);
b.pitch = asin(-x2.z);
b.Stamina += howmany*16;
b.Accuracy += howmany/5;
b.Accuracy += 2+howmany/5;
}
for ( int i=0; i<(9-howmany/3); i++ )
{
@ -840,7 +872,7 @@ Class Wallbuster : SWWMWeapon
p.target = self;
p.angle = atan2(dir.y,dir.x);
p.pitch = asin(-dir.z);
p.vel = dir*p.speed;
p.vel = dir*p.speed*1.25;
for ( int i=0; i<(4-howmany/8); i++ )
{
let s = Spawn("SWWMViewSmoke",origin);
@ -871,7 +903,7 @@ Class Wallbuster : SWWMWeapon
if ( !st ) st = new("SpreadgunTracer");
st.ignoreme = self;
// attempt to uniformize expected damage
int expecteddmg = 180;
int expecteddmg = 200;
int numshot = 31-howmany;
int individualdmg = int(ceil(expecteddmg/double(numshot)));
for ( int j=0; j<numshot; j++ )
@ -1007,7 +1039,7 @@ Class Wallbuster : SWWMWeapon
{
Vector3 x, y, z;
[x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll);
Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x-10*z);
Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x-3*y-13*z);
let c = Spawn(casetypes[which],origin);
c.angle = angle;
c.pitch = pitch;
@ -1025,7 +1057,7 @@ Class Wallbuster : SWWMWeapon
}
if ( amo.Amount < amo.MaxAmount ) amo.Amount++;
else if ( !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) )
Spawn(types[which],Vec3Angle(5,(angle-20)+i*10,height/2));
Spawn(types[which],Vec3Angle(10,(angle-20)+i*10,height/3));
}
}
invoker.loaded[invoker.rotation[5]*5+i] = null;

View file

@ -665,7 +665,7 @@ Class Eviscerator : SWWMWeapon
p.target = self;
p.angle = atan2(dir.y,dir.x);
p.pitch = asin(-dir.z);
p.vel = dir*p.speed;
p.vel = dir*p.speed*(invoker.extended?1.6:.8);
for ( int i=0; i<4; i++ )
{
let s = Spawn("SWWMViewSmoke",origin);

View file

@ -1522,10 +1522,6 @@ Class SWWMKnowledgeBaseMenu : GenericMenu
if ( type is 'Chancebox' ) continue;
// no fabricators outside of hexen
if ( !(gameinfo.gametype&GAME_Hexen) && (type is 'AmmoFabricator') ) continue;
// no barrier outside of doom/strife
if ( !(gameinfo.gametype&(GAME_DoomChex|GAME_Strife)) && (type is 'EBarrier') ) continue;
// no gravity suppressor outside heretic/hexen
if ( !(gameinfo.gametype&GAME_Raven) && (type is 'GravitySuppressor') ) continue;
// skip maxed items
let cur = players[consoleplayer].mo.FindInventory(type);
if ( cur && (cur.Amount >= cur.MaxAmount) ) continue;

View file

@ -216,8 +216,6 @@ Class Demolitionist : PlayerPawn
if ( !type ) continue;
if ( type is 'Chancebox' ) continue; // do not give these until they're fully implemented
if ( !(gameinfo.gametype&GAME_Hexen) && (type is 'AmmoFabricator') ) continue; // no fabricators outside of hexen
if ( !(gameinfo.gametype&(GAME_DoomChex|GAME_Strife)) && (type is 'EBarrier') ) continue; // no barrier outside of doom/strife
if ( !(gameinfo.gametype&GAME_Raven) && (type is 'GravitySuppressor') ) continue; // no gravity suppressor outside heretic/hexen
let def = GetDefaultByType (type);
if ( def.Icon.isValid() &&
!(type is "PuzzleItem") && !(type is "Powerup") && !(type is "Ammo") && !(type is "Armor") && !(type is "Key") )
@ -574,6 +572,7 @@ Class Demolitionist : PlayerPawn
Vector3 dir = vel+dashdir*dashboost;
double spd = dir.length();
dir = dir.unit();
Vector3 viewdir = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch));
// look for things we could potentially bump into
let bi = BlockThingsIterator.Create(self,500);
bool bumped = false;
@ -607,7 +606,9 @@ Class Demolitionist : PlayerPawn
int flg = DMG_THRUSTLESS;
if ( FindInventory("RagekitPower") ) flg |= DMG_FOILINVUL;
if ( !a.player ) a.bBLASTED = true;
int dmg = a.DamageMobj(self,self,int(15+spd*2.5),'Dash',flg);
int dmg = int(15+spd*2.5);
if ( dir dot viewdir < -.3 ) dmg *= 2; // BUTTSLAM
dmg = a.DamageMobj(self,self,dmg,'Dash',flg);
if ( FindInventory("RagekitPower") )
{
let ps = Spawn("BigPunchSplash",diff/2);