Release Candidate 2:

- Added option to toggle all beta content.
 - Added option to toggle armor bonuses (for purists).
 - Added cheap alternate allmap replacer, so there's something else to replace the computer map when the detector isn't allowed.
 - Small fixes and corrections.
This commit is contained in:
Marisa the Magician 2019-10-08 11:01:20 +02:00
commit 7051cb25be
35 changed files with 719 additions and 93 deletions

View file

@ -74,18 +74,20 @@ Doom Tournament (currently the devel branch is required).
## In progress ## In progress
- Beta testing - Final polishing
## Planned ## Planned
- Impaler "slice" animation for melee alt - Shifted to a 1.1 update:
- Separate proto content into an add-on (if people want) - Impaler "slice" animation for melee alt
- Alternate flamethrower secondary that behaves more like the Unreal Bible - Alternate flamethrower secondary that behaves more like the Unreal Bible
describes (unlit blobs at a rate of 4 per second that catch on fire with describes (unlit blobs at a rate of 4 per second that catch on fire with
explosions/lava/etc). explosions/lava/etc).
- Alternate Impaler primary that follows the Bible (laser shots from the - Alternate Impaler primary that follows the Bible (laser shots from the
crystal), shifts crystal shooting to pressing both buttons at once. crystal), shifts crystal shooting to pressing both buttons at once.
- Actual Bonesaw? - Actual Bonesaw?
- Implement ASMD behavior described in the Unreal novels (highly destructive
green beam that bounces off mirrors and water).
- RTNP add-on - RTNP add-on
- Monster pack (someday) - Monster pack (someday)
@ -94,4 +96,5 @@ Doom Tournament (currently the devel branch is required).
## Known bugs ## Known bugs
- The Quadshot will visibly load 4 shells even when there's less available, - The Quadshot will visibly load 4 shells even when there's less available,
this is a limitation of the animation. this is a limitation of the animation and I'll have to make alternate ones
for it eventually.

BIN
brightmaps/JAllMap1_a00.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

BIN
brightmaps/JAllMap1_a01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

BIN
brightmaps/JAllMap1_a02.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
brightmaps/JAllMap1_a03.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

View file

@ -73,6 +73,8 @@ server bool sting_olsmp = true; // adds the stupid oldskool SMP 7243 to
// an option // an option
server bool sting_msentry = true; // allows the new Minigun Sentry, which server bool sting_msentry = true; // allows the new Minigun Sentry, which
// is an original creation for this mod // is an original creation for this mod
server bool sting_abonus = true; // allows the armor bonus pickup, which
// is also original for this mod
server bool sting_dubious = true; // allows weapons of dubious origin server bool sting_dubious = true; // allows weapons of dubious origin
// (Demolisher, Razorclaw, Autocannon) // (Demolisher, Razorclaw, Autocannon)
server bool sting_autoscuba = true; // SCUBA gear toggles automatically server bool sting_autoscuba = true; // SCUBA gear toggles automatically
@ -88,3 +90,4 @@ server bool sting_flametspread = false; // targets on fire spread the flames
// to anyone nearby (may be op) // to anyone nearby (may be op)
server bool sting_impself = false; // disable impaler beam self-hit server bool sting_impself = false; // disable impaler beam self-hit
user bool sting_zoomshader = true; // rifle scope shader user bool sting_zoomshader = true; // rifle scope shader
server bool sting_proto = true; // allow prototype content

View file

@ -440,6 +440,18 @@ Object StarterImpalerBolt
Frame "PBLT" { light "IBOLTLIGHT" } Frame "PBLT" { light "IBOLTLIGHT" }
} }
PointLight UCOMPLIGHT
{
Color 0.3 1.0 0.2
Size 12
Offset 0 8 0
Attenuate 1
}
Object UAllMap
{
Frame "PMAP" { light "UCOMPLIGHT" }
}
// Shaders / Brightmaps // Shaders / Brightmaps
HardwareShader Texture "graphics/MenuBarr.png" HardwareShader Texture "graphics/MenuBarr.png"
{ {
@ -850,6 +862,34 @@ HardwareShader Texture "models/shield.png"
{ {
Shader "shaders/glsl/AmbientGlow.fp" Shader "shaders/glsl/AmbientGlow.fp"
} }
HardwareShader Texture "models/JAllMap1_a00.png"
{
Shader "shaders/glsl/AmbientGlow_Brightmapped.fp"
Texture "brighttex" "brightmaps/JAllMap1_a00.png"
}
HardwareShader Texture "models/JAllMap1_a01.png"
{
Shader "shaders/glsl/AmbientGlow_Brightmapped.fp"
Texture "brighttex" "brightmaps/JAllMap1_a01.png"
}
HardwareShader Texture "models/JAllMap1_a02.png"
{
Shader "shaders/glsl/AmbientGlow_Brightmapped.fp"
Texture "brighttex" "brightmaps/JAllMap1_a02.png"
}
HardwareShader Texture "models/JAllMap1_a03.png"
{
Shader "shaders/glsl/AmbientGlow_Brightmapped.fp"
Texture "brighttex" "brightmaps/JAllMap1_a03.png"
}
HardwareShader Texture "models/JAllMap2.png"
{
Shader "shaders/glsl/AmbientGlow.fp"
}
HardwareShader Texture "models/JAllMap3.png"
{
Shader "shaders/glsl/AmbientGlow.fp"
}
// PP shaders // PP shaders
HardwareShader PostProcess scene HardwareShader PostProcess scene
{ {

View file

@ -115,6 +115,7 @@ I_SCUBA = "You picked up the SCUBA Gear.";
I_OLSMP = "You got the SMP 7243. Time to kick ass!"; I_OLSMP = "You got the SMP 7243. Time to kick ass!";
I_OLSMPAMMO = "You picked up a SMP 7243 Magazine."; I_OLSMPAMMO = "You picked up a SMP 7243 Magazine.";
I_LBOOTS = "You picked up the Jump Boots."; I_LBOOTS = "You picked up the Jump Boots.";
I_ALLMAP = "You got an Area Map.";
/* Tags */ /* Tags */
T_WPOWERUP = "Dispersion Pistol Powerup"; T_WPOWERUP = "Dispersion Pistol Powerup";
T_STINGERAMMO = "Tarydium Shards"; T_STINGERAMMO = "Tarydium Shards";
@ -182,6 +183,7 @@ T_SCUBA = "SCUBA Gear";
T_OLSMP = "SMP 7243"; T_OLSMP = "SMP 7243";
T_OLSMPAMMO = "SMP 7243 Magazine"; T_OLSMPAMMO = "SMP 7243 Magazine";
T_LBOOTS = "Jump Boots"; T_LBOOTS = "Jump Boots";
T_ALLMAP = "Area Map";
/* Miscellaneous */ /* Miscellaneous */
TR_NOMSG = "No new messages"; TR_NOMSG = "No new messages";
TR_NEWMSG = "New Translator message"; TR_NEWMSG = "New Translator message";
@ -225,6 +227,7 @@ STING_UNREAL97 = "Unreal '97";
STING_UNREAL96 = "Unreal '96"; STING_UNREAL96 = "Unreal '96";
STING_UNREAL95 = "Unreal '95"; STING_UNREAL95 = "Unreal '95";
STING_POPTS = "Prototype features"; STING_POPTS = "Prototype features";
STING_PROTO = "Enable prototype content";
STING_TELEHAND = "Teleport Capsules"; STING_TELEHAND = "Teleport Capsules";
STING_FLARES = "Light/Dark Flares"; STING_FLARES = "Light/Dark Flares";
STING_STINGER = "Stinger detonation"; STING_STINGER = "Stinger detonation";
@ -243,6 +246,7 @@ STING_PSHIELD = "Power Shield does not drain over time";
STING_NOPSTART = "Players don't start up with an Automag"; STING_NOPSTART = "Players don't start up with an Automag";
STING_OLSMP = "Enable SMP 7243 from Oldskool Amp'd"; STING_OLSMP = "Enable SMP 7243 from Oldskool Amp'd";
STING_MSENTRY = "Enable new Minigun Sentry"; STING_MSENTRY = "Enable new Minigun Sentry";
STING_ABONUS = "Enable Armor Bonus";
STING_DUBIOUS = "Enable Demolisher, Razorclaw and Autocannon"; STING_DUBIOUS = "Enable Demolisher, Razorclaw and Autocannon";
STING_ZSHADER = "Enable Rifle scope shader"; STING_ZSHADER = "Enable Rifle scope shader";
STING_QOPTS = "Convenience features"; STING_QOPTS = "Convenience features";
@ -373,6 +377,7 @@ I_SCUBA = "Has recogido el Kit de Buceo.";
I_OLSMP = "Has obtenido el SMP 7243. ¡Hora de patear traseros!"; I_OLSMP = "Has obtenido el SMP 7243. ¡Hora de patear traseros!";
I_OLSMPAMMO = "Has recogido un Cargador de SMP 7243."; I_OLSMPAMMO = "Has recogido un Cargador de SMP 7243.";
I_LBOOTS = "Has recogido las Botas de Salto."; I_LBOOTS = "Has recogido las Botas de Salto.";
I_ALLMAP = "Has obtenido un Mapa de Área.";
/* Tags */ /* Tags */
T_WPOWERUP = "Mejora para Pistola de Dispersión"; T_WPOWERUP = "Mejora para Pistola de Dispersión";
T_STINGERAMMO = "Fragmentos de Tarydium"; T_STINGERAMMO = "Fragmentos de Tarydium";
@ -435,6 +440,7 @@ T_DETECTOR = "Detector de Movimiento";
T_SCUBA = "Kit de Buceo"; T_SCUBA = "Kit de Buceo";
T_OLSMPAMMO = "Cargador de SMP 7243"; T_OLSMPAMMO = "Cargador de SMP 7243";
T_LBOOTS = "Botas de Salto"; T_LBOOTS = "Botas de Salto";
T_ALLMAP = "Mapa de Área";
/* Miscellaneous */ /* Miscellaneous */
TR_NOMSG = "No hay mensajes nuevos"; TR_NOMSG = "No hay mensajes nuevos";
TR_NEWMSG = "Nuevo mensaje de Traductor"; TR_NEWMSG = "Nuevo mensaje de Traductor";
@ -465,6 +471,7 @@ STING_HUDMODE = "Modo de HUD";
STING_TRANSEXT = "Traductor extendido (cabe más texto)"; STING_TRANSEXT = "Traductor extendido (cabe más texto)";
STING_INTRO = "Tipo de intro"; STING_INTRO = "Tipo de intro";
STING_POPTS = "Características de prototipo"; STING_POPTS = "Características de prototipo";
STING_PROTO = "Habilitar contenido de prototipo";
STING_TELEHAND = "Cápsulas de Teletransporte"; STING_TELEHAND = "Cápsulas de Teletransporte";
STING_FLARES = "Bengalas de luz/oscuridad"; STING_FLARES = "Bengalas de luz/oscuridad";
STING_STINGER = "Detonación de Arma Aguijón"; STING_STINGER = "Detonación de Arma Aguijón";
@ -483,6 +490,7 @@ STING_PSHIELD = "El Escudo de Fuerza no pierde carga con el tiempo";
STING_NOPSTART = "Los jugadores no empiezan la partida con un Automag"; STING_NOPSTART = "Los jugadores no empiezan la partida con un Automag";
STING_OLSMP = "Habilitar SMP 7243 de Oldskool Amp'd"; STING_OLSMP = "Habilitar SMP 7243 de Oldskool Amp'd";
STING_MSENTRY = "Habilitar nueva Torreta"; STING_MSENTRY = "Habilitar nueva Torreta";
STING_ABONUS = "Habilitar Armadura Extra";
STING_DUBIOUS = "Habilitar Demoledor, Garra y Autocañón"; STING_DUBIOUS = "Habilitar Demoledor, Garra y Autocañón";
STING_ZSHADER = "Habilitar shader de mira de Rifle"; STING_ZSHADER = "Habilitar shader de mira de Rifle";
STING_QOPTS = "Características de comodidad"; STING_QOPTS = "Características de comodidad";

View file

@ -23,8 +23,9 @@ OptionMenu "UnrealOptionMenu"
Option "$STING_TRANSEXT", "sting_transext", "YesNo" Option "$STING_TRANSEXT", "sting_transext", "YesNo"
StaticText " " StaticText " "
StaticText "$STING_POPTS", "Gold" StaticText "$STING_POPTS", "Gold"
Option "$STING_TELEHAND", "sting_telegun", "YesNo" Option "$STING_PROTO", "sting_proto", "YesNo"
Option "$STING_FLARES", "sting_flares", "YesNo" Option "$STING_TELEHAND", "sting_telegun", "YesNo", "sting_proto"
Option "$STING_FLARES", "sting_flares", "YesNo", "sting_proto"
Command "$FLAK_APPLY", "netevent refreshtrans" Command "$FLAK_APPLY", "netevent refreshtrans"
Option "$STING_STINGER", "sting_stinger", "YesNo" Option "$STING_STINGER", "sting_stinger", "YesNo"
Option "$STING_STINGERB", "sting_stingerb", "YesNo" Option "$STING_STINGERB", "sting_stingerb", "YesNo"
@ -36,7 +37,7 @@ OptionMenu "UnrealOptionMenu"
StaticText " " StaticText " "
StaticText "$STING_DOPTS", "Gold" StaticText "$STING_DOPTS", "Gold"
Option "$STING_AUTODUAL", "sting_automags", "YesNo" Option "$STING_AUTODUAL", "sting_automags", "YesNo"
Option "$STING_PROTODUAL", "sting_protomags", "YesNo" Option "$STING_PROTODUAL", "sting_protomags", "YesNo", "sting_proto"
StaticText " " StaticText " "
StaticText "$STING_UOPTS", "Gold" StaticText "$STING_UOPTS", "Gold"
Option "$STING_DPISTOL", "sting_dpistol", "YesNo" Option "$STING_DPISTOL", "sting_dpistol", "YesNo"
@ -44,15 +45,16 @@ OptionMenu "UnrealOptionMenu"
Option "$STING_NOPSTART", "sting_nopstart", "YesNo" Option "$STING_NOPSTART", "sting_nopstart", "YesNo"
Option "$STING_OLSMP", "sting_olsmp", "YesNo" Option "$STING_OLSMP", "sting_olsmp", "YesNo"
Option "$STING_MSENTRY", "sting_msentry", "YesNo" Option "$STING_MSENTRY", "sting_msentry", "YesNo"
Option "$STING_DUBIOUS", "sting_dubious", "YesNo" Option "$STING_ABONUS", "sting_abonus", "YesNo"
Option "$STING_DUBIOUS", "sting_dubious", "YesNo", "sting_proto"
Option "$STING_ZSHADER", "sting_zoomshader", "YesNo" Option "$STING_ZSHADER", "sting_zoomshader", "YesNo"
StaticText " " StaticText " "
StaticText "$STING_QOPTS", "Gold" StaticText "$STING_QOPTS", "Gold"
Option "$STING_AUTOSCUBA", "sting_autoscuba", "YesNo" Option "$STING_AUTOSCUBA", "sting_autoscuba", "YesNo"
Option "$STING_RAZORAIM", "sting_razoraim", "YesNo" Option "$STING_RAZORAIM", "sting_razoraim", "YesNo"
Option "$STING_BIOSPLASH", "sting_biosplash", "YesNo" Option "$STING_BIOSPLASH", "sting_biosplash", "YesNo"
Option "$STING_FLAMETSPREAD", "sting_flametspread", "YesNo" Option "$STING_FLAMETSPREAD", "sting_flametspread", "YesNo", "sting_proto"
Option "$STING_IMPSELF", "sting_impself", "YesNo" Option "$STING_IMPSELF", "sting_impself", "YesNo", "sting_proto"
} }
AddOptionMenu "OptionsMenu" AddOptionMenu "OptionsMenu"

View file

@ -797,3 +797,23 @@ Model "UArmorBonus"
FrameIndex XANH A 0 0 FrameIndex XANH A 0 0
} }
Model "UAllMap"
{
Path "models"
Model 0 "cheapcomp_d.3d"
SurfaceSkin 0 1 "JAllMap2.png"
SurfaceSkin 0 2 "JAllMap3.png"
Scale 0.04 0.04 0.048
ZOffset 3
AngleOffset 90
SurfaceSkin 0 0 "JAllMap1_a00.png"
FrameIndex PMAP A 0 0
SurfaceSkin 0 0 "JAllMap1_a01.png"
FrameIndex PMAP B 0 0
SurfaceSkin 0 0 "JAllMap1_a02.png"
FrameIndex PMAP C 0 0
SurfaceSkin 0 0 "JAllMap1_a03.png"
FrameIndex PMAP D 0 0
}

BIN
models/CheapComp_a.3d Normal file

Binary file not shown.

BIN
models/CheapComp_d.3d Normal file

Binary file not shown.

BIN
models/JAllMap1_a00.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
models/JAllMap1_a01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
models/JAllMap1_a02.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
models/JAllMap1_a03.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
models/JAllMap2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
models/JAllMap3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -11,6 +11,66 @@ Class Betamag : UnrealWeapon
int SlaveRefire; int SlaveRefire;
double AltAccuracy; double AltAccuracy;
override bool TryPickup( in out Actor toucher )
{
if ( !sting_proto ) return false; // not allowed
return Super.TryPickup(toucher);
}
override void Tick()
{
Super.Tick();
if ( sting_protomags && (MaxAmount <= 1) ) MaxAmount = 2;
else if ( !sting_protomags && (MaxAmount > 1) ) MaxAmount = 1;
if ( Owner && !sting_protomags && (Amount > 1) )
{
// no dual wielding
if ( Owner.player.ReadyWeapon == self )
{
// delete the slave overlay
PSprite psp;
for ( psp = Owner.player.psprites; psp; psp = psp.next )
{
if ( (psp.Caller == self) && ((psp.id == 2) || (psp.id == -9998)) ) psp.Destroy();
slaveactive = false;
slavedown = false;
}
}
Amount = 1;
SetTag(StringTable.Localize("$T_AUTOMAG"));
}
if ( sting_proto ) return;
if ( !Owner )
{
let r = Spawn("Pistol",pos,ALLOW_REPLACE);
r.spawnangle = spawnangle;
r.spawnpoint = spawnpoint;
r.angle = angle;
r.pitch = pitch;
r.roll = roll;
r.special = special;
r.args[0] = args[0];
r.args[1] = args[1];
r.args[2] = args[2];
r.args[3] = args[3];
r.args[4] = args[4];
r.ChangeTid(tid);
r.SpawnFlags = SpawnFlags&~MTF_SECRET;
r.HandleSpawnFlags();
r.SpawnFlags = SpawnFlags;
r.bCountSecret = SpawnFlags&MTF_SECRET;
r.vel = vel;
r.master = master;
r.target = target;
r.tracer = tracer;
r.bDropped = bDropped;
Destroy();
}
else
{
Owner.RemoveInventory(self);
Destroy();
}
}
override bool HandlePickup( Inventory item ) override bool HandlePickup( Inventory item )
{ {
if ( sting_protomags && (item.GetClass() == GetClass()) ) if ( sting_protomags && (item.GetClass() == GetClass()) )
@ -271,27 +331,6 @@ Class Betamag : UnrealWeapon
else if ( Amount > 1 ) SelectionOrder = 2200; else if ( Amount > 1 ) SelectionOrder = 2200;
else SelectionOrder = default.SelectionOrder; else SelectionOrder = default.SelectionOrder;
} }
override void Tick()
{
Super.Tick();
if ( sting_protomags && (MaxAmount <= 1) ) MaxAmount = 2;
else if ( !sting_protomags && (MaxAmount > 1) ) MaxAmount = 1;
if ( !Owner || sting_protomags || (Amount <= 1) ) return;
// no dual wielding
if ( Owner.player.ReadyWeapon == self )
{
// delete the slave overlay
PSprite psp;
for ( psp = Owner.player.psprites; psp; psp = psp.next )
{
if ( (psp.Caller == self) && ((psp.id == 2) || (psp.id == -9998)) ) psp.Destroy();
slaveactive = false;
slavedown = false;
}
}
Amount = 1;
SetTag(StringTable.Localize("$T_AUTOMAG"));
}
Default Default
{ {
Tag "$T_PROTOMAG"; Tag "$T_PROTOMAG";

View file

@ -20,13 +20,13 @@ Class BigAmmo : Ammo
} }
override bool TryPickup( in out Actor toucher ) override bool TryPickup( in out Actor toucher )
{ {
if ( !sting_dubious ) return false; // not allowed if ( !sting_proto || !sting_dubious ) return false; // not allowed
return Super.TryPickup(toucher); return Super.TryPickup(toucher);
} }
override void Tick() override void Tick()
{ {
Super.Tick(); Super.Tick();
if ( sting_dubious ) return; if ( sting_proto && sting_dubious ) return;
if ( !Owner ) if ( !Owner )
{ {
let r = Spawn((GetClass()=="BigAmmo")?"CellPack":"Cell",pos,ALLOW_REPLACE); let r = Spawn((GetClass()=="BigAmmo")?"CellPack":"Cell",pos,ALLOW_REPLACE);
@ -237,13 +237,13 @@ Class BigGun : UnrealWeapon
override bool TryPickup( in out Actor toucher ) override bool TryPickup( in out Actor toucher )
{ {
if ( !sting_dubious ) return false; // not allowed if ( !sting_proto || !sting_dubious ) return false; // not allowed
return Super.TryPickup(toucher); return Super.TryPickup(toucher);
} }
override void Tick() override void Tick()
{ {
Super.Tick(); Super.Tick();
if ( sting_dubious ) return; if ( sting_proto && sting_dubious ) return;
if ( !Owner ) if ( !Owner )
{ {
let r = Spawn("BFG9000",pos,ALLOW_REPLACE); let r = Spawn("BFG9000",pos,ALLOW_REPLACE);

View file

@ -2,13 +2,13 @@ Class Bonesaw : UnrealWeapon
{ {
override bool TryPickup( in out Actor toucher ) override bool TryPickup( in out Actor toucher )
{ {
if ( !sting_dubious ) return false; // not allowed if ( !sting_proto || !sting_dubious ) return false; // not allowed
return Super.TryPickup(toucher); return Super.TryPickup(toucher);
} }
override void Tick() override void Tick()
{ {
Super.Tick(); Super.Tick();
if ( sting_dubious ) return; if ( sting_proto && sting_dubious ) return;
if ( !Owner ) if ( !Owner )
{ {
let r = Spawn("Chainsaw",pos,ALLOW_REPLACE); let r = Spawn("Chainsaw",pos,ALLOW_REPLACE);

View file

@ -66,7 +66,7 @@ Class DefaultAmmo : Ammo
} }
override void DoEffect() override void DoEffect()
{ {
Super.Tick(); Super.DoEffect();
if ( rechargespeed <= 0. ) rechargespeed = 1.1; if ( rechargespeed <= 0. ) rechargespeed = 1.1;
rechargephase += 1./rechargespeed; rechargephase += 1./rechargespeed;
if ( rechargephase < 35 ) return; if ( rechargephase < 35 ) return;

View file

@ -316,6 +316,47 @@ Class FlameGun : UnrealWeapon
Weapon.AmmoGive 100; Weapon.AmmoGive 100;
UTWeapon.DropAmmo 50; UTWeapon.DropAmmo 50;
} }
override bool TryPickup( in out Actor toucher )
{
if ( !sting_proto ) return false; // not allowed
return Super.TryPickup(toucher);
}
override void Tick()
{
Super.Tick();
if ( sting_proto ) return;
if ( !Owner )
{
let r = Spawn("RocketLauncher",pos,ALLOW_REPLACE);
r.spawnangle = spawnangle;
r.spawnpoint = spawnpoint;
r.angle = angle;
r.pitch = pitch;
r.roll = roll;
r.special = special;
r.args[0] = args[0];
r.args[1] = args[1];
r.args[2] = args[2];
r.args[3] = args[3];
r.args[4] = args[4];
r.ChangeTid(tid);
r.SpawnFlags = SpawnFlags&~MTF_SECRET;
r.HandleSpawnFlags();
r.SpawnFlags = SpawnFlags;
r.bCountSecret = SpawnFlags&MTF_SECRET;
r.vel = vel;
r.master = master;
r.target = target;
r.tracer = tracer;
r.bDropped = bDropped;
Destroy();
}
else
{
Owner.RemoveInventory(self);
Destroy();
}
}
action void A_FlameGunFire( bool bAlt = false ) action void A_FlameGunFire( bool bAlt = false )
{ {
Weapon weap = Weapon(invoker); Weapon weap = Weapon(invoker);

View file

@ -10,13 +10,13 @@ Class SMiniAmmo : Ammo
} }
override bool TryPickup( in out Actor toucher ) override bool TryPickup( in out Actor toucher )
{ {
if ( !sting_dubious ) return false; // not allowed if ( !sting_proto || !sting_dubious ) return false; // not allowed
return Super.TryPickup(toucher); return Super.TryPickup(toucher);
} }
override void Tick() override void Tick()
{ {
Super.Tick(); Super.Tick();
if ( sting_dubious ) return; if ( sting_proto && sting_dubious ) return;
if ( Owner ) Owner.RemoveInventory(self); if ( Owner ) Owner.RemoveInventory(self);
Destroy(); Destroy();
} }
@ -123,13 +123,13 @@ Class SMiniGun : UnrealWeapon
{ {
override bool TryPickup( in out Actor toucher ) override bool TryPickup( in out Actor toucher )
{ {
if ( !sting_dubious ) return false; // not allowed if ( !sting_proto || !sting_dubious ) return false; // not allowed
return Super.TryPickup(toucher); return Super.TryPickup(toucher);
} }
override void Tick() override void Tick()
{ {
Super.Tick(); Super.Tick();
if ( sting_dubious ) return; if ( sting_proto && sting_dubious ) return;
if ( !Owner ) if ( !Owner )
{ {
let r = Spawn("BFG9000",pos,ALLOW_REPLACE); let r = Spawn("BFG9000",pos,ALLOW_REPLACE);

View file

@ -12,6 +12,47 @@ Class ImpalerAmmo : Ammo
Ammo.DropAmount 3; Ammo.DropAmount 3;
+INVENTORY.IGNORESKILL; +INVENTORY.IGNORESKILL;
} }
override bool TryPickup( in out Actor toucher )
{
if ( !sting_proto ) return false; // not allowed
return Super.TryPickup(toucher);
}
override void Tick()
{
Super.Tick();
if ( sting_proto ) return;
if ( !Owner )
{
let r = Spawn((GetClass()=="ImpalerAmmo")?"CellPack":"Cell",pos,ALLOW_REPLACE);
r.spawnangle = spawnangle;
r.spawnpoint = spawnpoint;
r.angle = angle;
r.pitch = pitch;
r.roll = roll;
r.special = special;
r.args[0] = args[0];
r.args[1] = args[1];
r.args[2] = args[2];
r.args[3] = args[3];
r.args[4] = args[4];
r.ChangeTid(tid);
r.SpawnFlags = SpawnFlags&~MTF_SECRET;
r.HandleSpawnFlags();
r.SpawnFlags = SpawnFlags;
r.bCountSecret = SpawnFlags&MTF_SECRET;
r.vel = vel;
r.master = master;
r.target = target;
r.tracer = tracer;
r.bDropped = bDropped;
Destroy();
}
else
{
Owner.RemoveInventory(self);
Destroy();
}
}
States States
{ {
Spawn: Spawn:
@ -693,6 +734,47 @@ Class Impaler : UnrealWeapon
property ClipCount : ClipCount; property ClipCount : ClipCount;
override bool TryPickup( in out Actor toucher )
{
if ( !sting_proto ) return false; // not allowed
return Super.TryPickup(toucher);
}
override void Tick()
{
Super.Tick();
if ( sting_proto ) return;
if ( !Owner )
{
let r = Spawn("PlasmaRifle",pos,ALLOW_REPLACE);
r.spawnangle = spawnangle;
r.spawnpoint = spawnpoint;
r.angle = angle;
r.pitch = pitch;
r.roll = roll;
r.special = special;
r.args[0] = args[0];
r.args[1] = args[1];
r.args[2] = args[2];
r.args[3] = args[3];
r.args[4] = args[4];
r.ChangeTid(tid);
r.SpawnFlags = SpawnFlags&~MTF_SECRET;
r.HandleSpawnFlags();
r.SpawnFlags = SpawnFlags;
r.bCountSecret = SpawnFlags&MTF_SECRET;
r.vel = vel;
r.master = master;
r.target = target;
r.tracer = tracer;
r.bDropped = bDropped;
Destroy();
}
else
{
Owner.RemoveInventory(self);
Destroy();
}
}
override int, int, bool, bool GetClipAmount() override int, int, bool, bool GetClipAmount()
{ {
return HasGem?ClipCount:-1, -1, (ClipCount<10), false; return HasGem?ClipCount:-1, -1, (ClipCount<10), false;

View file

@ -90,24 +90,24 @@ Class UnrealBackpack : BackpackItem replaces Backpack
Super.DoPickupSpecial(toucher); Super.DoPickupSpecial(toucher);
if ( gameinfo.gametype&GAME_DOOMCHEX ) if ( gameinfo.gametype&GAME_DOOMCHEX )
{ {
static const Class<Inventory> xitems[] = {"Flare", "Seeds", "SentryGunItem", "VoiceBox", "ForceField", "Dampener", "Peacemaker"}; static const Class<Inventory> xitems[] = {"Flare", "Seeds", "VoiceBox", "ForceField", "Dampener", "Peacemaker", "SentryGunItem"};
int xitemn[7]; int xitemn[7];
xitemn[0] = max(0,Random[BackpackExtra](-1,3)); xitemn[0] = max(0,Random[BackpackExtra](-1,3));
xitemn[1] = max(0,Random[BackpackExtra](-1,3)); xitemn[1] = max(0,Random[BackpackExtra](-1,3));
xitemn[2] = max(0,Random[BackpackExtra](-2,1)); xitemn[2] = max(0,Random[BackpackExtra](-2,1));
xitemn[3] = max(0,Random[BackpackExtra](-2,1)); xitemn[3] = max(0,Random[BackpackExtra](-2,1));
xitemn[4] = max(0,Random[BackpackExtra](-2,1)); xitemn[4] = max(0,Random[BackpackExtra](-1,1));
xitemn[5] = max(0,Random[BackpackExtra](-1,1)); xitemn[5] = max(0,Random[BackpackExtra](-2,1));
xitemn[6] = max(0,Random[BackpackExtra](-2,1)); xitemn[6] = max(0,Random[BackpackExtra](-2,1));
// random doubling // random doubling
if ( !Random[BackpackExtra](0,4) ) xitemn[0] *= 2; if ( !Random[BackpackExtra](0,4) ) xitemn[0] *= 2;
if ( !Random[BackpackExtra](0,4) ) xitemn[1] *= 2; if ( !Random[BackpackExtra](0,4) ) xitemn[1] *= 2;
if ( !Random[BackpackExtra](0,9) ) xitemn[2] *= 2; if ( !Random[BackpackExtra](0,7) ) xitemn[2] *= 2;
if ( !Random[BackpackExtra](0,7) ) xitemn[3] *= 2; if ( !Random[BackpackExtra](0,6) ) xitemn[3] *= 2;
if ( !Random[BackpackExtra](0,6) ) xitemn[4] *= 2; if ( !Random[BackpackExtra](0,5) ) xitemn[4] *= 2;
if ( !Random[BackpackExtra](0,5) ) xitemn[5] *= 2; if ( !Random[BackpackExtra](0,9) ) xitemn[5] *= 2;
if ( !Random[BackpackExtra](0,9) ) xitemn[6] *= 2; if ( !Random[BackpackExtra](0,9) ) xitemn[6] *= 2;
for ( int i=0; i<7; i++ ) for ( int i=0; i<(sting_proto?7:5); i++ )
{ {
if ( xitemn[i] <= 0 ) continue; if ( xitemn[i] <= 0 ) continue;
toucher.GiveInventory(xitems[i],xitemn[i]); toucher.GiveInventory(xitems[i],xitemn[i]);
@ -749,13 +749,13 @@ Class BetaFlare : UnrealInventory
override bool TryPickup( in out Actor toucher ) override bool TryPickup( in out Actor toucher )
{ {
if ( !sting_flares ) return false; // not allowed if ( !sting_proto || !sting_flares ) return false; // not allowed
return Super.TryPickup(toucher); return Super.TryPickup(toucher);
} }
override void Tick() override void Tick()
{ {
Super.Tick(); Super.Tick();
if ( sting_flares ) return; if ( sting_proto && sting_flares ) return;
if ( Owner ) Owner.RemoveInventory(self); if ( Owner ) Owner.RemoveInventory(self);
Destroy(); Destroy();
} }
@ -2251,6 +2251,18 @@ Class SentryGunItem : UnrealInventory
Inventory.PickupMessage "$I_OSENTRY"; Inventory.PickupMessage "$I_OSENTRY";
Inventory.RespawnTics 1050; Inventory.RespawnTics 1050;
} }
override bool TryPickup( in out Actor toucher )
{
if ( !sting_proto ) return false; // not allowed
return Super.TryPickup(toucher);
}
override void Tick()
{
Super.Tick();
if ( sting_proto ) return;
if ( Owner ) Owner.RemoveInventory(self);
Destroy();
}
override bool Use( bool pickup ) override bool Use( bool pickup )
{ {
if ( pickup ) return false; if ( pickup ) return false;
@ -2399,6 +2411,11 @@ Class SentryGun : Actor
override void Tick() override void Tick()
{ {
Super.Tick(); Super.Tick();
if ( !sting_proto )
{
Destroy();
return;
}
if ( !master && (rememberedplayer != -1) && playeringame[rememberedplayer] ) if ( !master && (rememberedplayer != -1) && playeringame[rememberedplayer] )
master = players[rememberedplayer].mo; master = players[rememberedplayer].mo;
} }

View file

@ -11,6 +11,47 @@ Class FlameAmmo : Ammo
Ammo.BackpackMaxAmount 900; Ammo.BackpackMaxAmount 900;
Ammo.DropAmount 30; Ammo.DropAmount 30;
} }
override bool TryPickup( in out Actor toucher )
{
if ( !sting_proto ) return false; // not allowed
return Super.TryPickup(toucher);
}
override void Tick()
{
Super.Tick();
if ( sting_proto ) return;
if ( !Owner )
{
let r = Spawn("RocketAmmo",pos,ALLOW_REPLACE);
r.spawnangle = spawnangle;
r.spawnpoint = spawnpoint;
r.angle = angle;
r.pitch = pitch;
r.roll = roll;
r.special = special;
r.args[0] = args[0];
r.args[1] = args[1];
r.args[2] = args[2];
r.args[3] = args[3];
r.args[4] = args[4];
r.ChangeTid(tid);
r.SpawnFlags = SpawnFlags&~MTF_SECRET;
r.HandleSpawnFlags();
r.SpawnFlags = SpawnFlags;
r.bCountSecret = SpawnFlags&MTF_SECRET;
r.vel = vel;
r.master = master;
r.target = target;
r.tracer = tracer;
r.bDropped = bDropped;
Destroy();
}
else
{
Owner.RemoveInventory(self);
Destroy();
}
}
States States
{ {
Spawn: Spawn:
@ -761,6 +802,47 @@ Class UFlamethrower : UnrealWeapon
bool bCharging; bool bCharging;
double ChargeSize, Count; double ChargeSize, Count;
override bool TryPickup( in out Actor toucher )
{
if ( !sting_proto ) return false; // not allowed
return Super.TryPickup(toucher);
}
override void Tick()
{
Super.Tick();
if ( sting_proto ) return;
if ( !Owner )
{
let r = Spawn("PlasmaRifle",pos,ALLOW_REPLACE);
r.spawnangle = spawnangle;
r.spawnpoint = spawnpoint;
r.angle = angle;
r.pitch = pitch;
r.roll = roll;
r.special = special;
r.args[0] = args[0];
r.args[1] = args[1];
r.args[2] = args[2];
r.args[3] = args[3];
r.args[4] = args[4];
r.ChangeTid(tid);
r.SpawnFlags = SpawnFlags&~MTF_SECRET;
r.HandleSpawnFlags();
r.SpawnFlags = SpawnFlags;
r.bCountSecret = SpawnFlags&MTF_SECRET;
r.vel = vel;
r.master = master;
r.target = target;
r.tracer = tracer;
r.bDropped = bDropped;
Destroy();
}
else
{
Owner.RemoveInventory(self);
Destroy();
}
}
override int, int, bool, bool GetClipAmount() override int, int, bool, bool GetClipAmount()
{ {
return bCharging?min(5,int(chargesize+0.1)):-1, -1, false, false; return bCharging?min(5,int(chargesize+0.1)):-1, -1, false, false;

View file

@ -114,6 +114,10 @@ Class OLSMP : UnrealWeapon
Destroy(); Destroy();
} }
} }
override void PlayUpSound( Actor origin )
{
origin.A_PlaySound(upsound,CHAN_WEAPON,Dampener.Active(origin)?.1:1.,pitch:0.8);
}
action void A_OLSMPRefire( statelabel flash = null, bool slave = false ) action void A_OLSMPRefire( statelabel flash = null, bool slave = false )
{ {
Weapon weap = Weapon(invoker); Weapon weap = Weapon(invoker);

View file

@ -8,6 +8,18 @@ Class PeaceAmmo : Ammo
Ammo.BackpackAmount 0; Ammo.BackpackAmount 0;
Ammo.BackpackMaxAmount 2; Ammo.BackpackMaxAmount 2;
} }
override bool TryPickup( in out Actor toucher )
{
if ( !sting_proto ) return false; // not allowed
return Super.TryPickup(toucher);
}
override void Tick()
{
Super.Tick();
if ( sting_proto ) return;
if ( Owner ) Owner.RemoveInventory(self);
Destroy();
}
} }
Class PeaceLight : RocketLight Class PeaceLight : RocketLight
@ -398,6 +410,18 @@ Class PeaceBarrel : Actor
Class Peacemaker : UnrealWeapon Class Peacemaker : UnrealWeapon
{ {
override bool TryPickup( in out Actor toucher )
{
if ( !sting_proto ) return false; // not allowed
return Super.TryPickup(toucher);
}
override void Tick()
{
Super.Tick();
if ( sting_proto ) return;
if ( Owner ) Owner.RemoveInventory(self);
Destroy();
}
action void A_PeacemakerThrow( bool bAlt = false ) action void A_PeacemakerThrow( bool bAlt = false )
{ {
let weap = Weapon(invoker); let weap = Weapon(invoker);

View file

@ -16,6 +16,47 @@ Class UShells : Ammo
if ( PickupMsg.Length() > 0 ) return Super.PickupMessage(); if ( PickupMsg.Length() > 0 ) return Super.PickupMessage();
return String.Format("%s%d%s",StringTable.Localize("$I_SHELLSL"),Amount,StringTable.Localize("$I_SHELLSR")); return String.Format("%s%d%s",StringTable.Localize("$I_SHELLSL"),Amount,StringTable.Localize("$I_SHELLSR"));
} }
override bool TryPickup( in out Actor toucher )
{
if ( !sting_proto ) return false; // not allowed
return Super.TryPickup(toucher);
}
override void Tick()
{
Super.Tick();
if ( sting_proto ) return;
if ( !Owner )
{
let r = Spawn((GetClass()=="UShells")?"ShellBox":"Shells",pos,ALLOW_REPLACE);
r.spawnangle = spawnangle;
r.spawnpoint = spawnpoint;
r.angle = angle;
r.pitch = pitch;
r.roll = roll;
r.special = special;
r.args[0] = args[0];
r.args[1] = args[1];
r.args[2] = args[2];
r.args[3] = args[3];
r.args[4] = args[4];
r.ChangeTid(tid);
r.SpawnFlags = SpawnFlags&~MTF_SECRET;
r.HandleSpawnFlags();
r.SpawnFlags = SpawnFlags;
r.bCountSecret = SpawnFlags&MTF_SECRET;
r.vel = vel;
r.master = master;
r.target = target;
r.tracer = tracer;
r.bDropped = bDropped;
Destroy();
}
else
{
Owner.RemoveInventory(self);
Destroy();
}
}
States States
{ {
Spawn: Spawn:
@ -96,6 +137,48 @@ Class QuadShot : UnrealWeapon
property ClipCount : ClipCount; property ClipCount : ClipCount;
override bool TryPickup( in out Actor toucher )
{
if ( !sting_proto ) return false; // not allowed
return Super.TryPickup(toucher);
}
override void Tick()
{
Super.Tick();
if ( sting_proto ) return;
if ( !Owner )
{
let r = Spawn("Shotgun",pos,ALLOW_REPLACE);
r.spawnangle = spawnangle;
r.spawnpoint = spawnpoint;
r.angle = angle;
r.pitch = pitch;
r.roll = roll;
r.special = special;
r.args[0] = args[0];
r.args[1] = args[1];
r.args[2] = args[2];
r.args[3] = args[3];
r.args[4] = args[4];
r.ChangeTid(tid);
r.SpawnFlags = SpawnFlags&~MTF_SECRET;
r.HandleSpawnFlags();
r.SpawnFlags = SpawnFlags;
r.bCountSecret = SpawnFlags&MTF_SECRET;
r.vel = vel;
r.master = master;
r.target = target;
r.tracer = tracer;
r.bDropped = bDropped;
Destroy();
}
else
{
Owner.RemoveInventory(self);
Destroy();
}
}
override int, int, bool, bool GetClipAmount() override int, int, bool, bool GetClipAmount()
{ {
return ClipOut?-1:ClipCount, -1, (ClipCount<2), false; return ClipOut?-1:ClipCount, -1, (ClipCount<2), false;

View file

@ -12,7 +12,7 @@ Class StunnerAmmo : Ammo
} }
override void DoEffect() override void DoEffect()
{ {
Super.Tick(); Super.DoEffect();
if ( rechargespeed <= 0. ) rechargespeed = 2.; if ( rechargespeed <= 0. ) rechargespeed = 2.;
rechargephase += 1./rechargespeed; rechargephase += 1./rechargespeed;
if ( rechargephase < 7 ) return; if ( rechargephase < 7 ) return;
@ -20,6 +20,18 @@ Class StunnerAmmo : Ammo
rechargephase = 0; rechargephase = 0;
Amount = min(Amount+1,MaxAmount); Amount = min(Amount+1,MaxAmount);
} }
override bool TryPickup( in out Actor toucher )
{
if ( !sting_proto ) return false; // not allowed
return Super.TryPickup(toucher);
}
override void Tick()
{
Super.Tick();
if ( sting_proto ) return;
if ( Owner ) Owner.RemoveInventory(self);
Destroy();
}
} }
Class StunTrail : Actor Class StunTrail : Actor
@ -272,6 +284,48 @@ Class Stunner : UnrealWeapon
double chargesize, count; double chargesize, count;
bool bCharging; bool bCharging;
override bool TryPickup( in out Actor toucher )
{
if ( !sting_proto ) return false; // not allowed
return Super.TryPickup(toucher);
}
override void Tick()
{
Super.Tick();
if ( sting_proto ) return;
if ( !Owner )
{
let r = Spawn("Chainsaw",pos,ALLOW_REPLACE);
r.spawnangle = spawnangle;
r.spawnpoint = spawnpoint;
r.angle = angle;
r.pitch = pitch;
r.roll = roll;
r.special = special;
r.args[0] = args[0];
r.args[1] = args[1];
r.args[2] = args[2];
r.args[3] = args[3];
r.args[4] = args[4];
r.ChangeTid(tid);
r.SpawnFlags = SpawnFlags&~MTF_SECRET;
r.HandleSpawnFlags();
r.SpawnFlags = SpawnFlags;
r.bCountSecret = SpawnFlags&MTF_SECRET;
r.vel = vel;
r.master = master;
r.target = target;
r.tracer = tracer;
r.bDropped = bDropped;
Destroy();
}
else
{
Owner.RemoveInventory(self);
Destroy();
}
}
override int, int, bool, bool GetClipAmount() override int, int, bool, bool GetClipAmount()
{ {
return bCharging?min(5,int(chargesize)):-1, -1, false, false; return bCharging?min(5,int(chargesize)):-1, -1, false, false;

View file

@ -250,6 +250,49 @@ Class PowerShield : UnrealArmor
Class UArmorBonus : UArmor Class UArmorBonus : UArmor
{ {
override bool TryPickup( in out Actor toucher )
{
if ( !sting_abonus ) return false; // not allowed
bool valid = Super.TryPickup(toucher);
if ( valid ) level.allmap = true;
return valid;
}
override void Tick()
{
Super.Tick();
if ( sting_abonus ) return;
if ( !Owner )
{
let r = Spawn("ArmorBonus",pos,ALLOW_REPLACE);
r.spawnangle = spawnangle;
r.spawnpoint = spawnpoint;
r.angle = angle;
r.pitch = pitch;
r.roll = roll;
r.special = special;
r.args[0] = args[0];
r.args[1] = args[1];
r.args[2] = args[2];
r.args[3] = args[3];
r.args[4] = args[4];
r.ChangeTid(tid);
r.SpawnFlags = SpawnFlags&~MTF_SECRET;
r.HandleSpawnFlags();
r.SpawnFlags = SpawnFlags;
r.bCountSecret = SpawnFlags&MTF_SECRET;
r.vel = vel;
r.master = master;
r.target = target;
r.tracer = tracer;
r.bDropped = bDropped;
Destroy();
}
else
{
Owner.RemoveInventory(self);
Destroy();
}
}
override void AbsorbDamage( int damage, Name damageType, out int newdamage ) override void AbsorbDamage( int damage, Name damageType, out int newdamage )
{ {
absorb = Clamp(Amount-50,25,100); absorb = Clamp(Amount-50,25,100);

View file

@ -183,15 +183,21 @@ Class UPlayer : UTPlayer
{ {
// force akimbo // force akimbo
let t = FindInventory(type); let t = FindInventory(type);
if ( t ) t.Amount = 2; if ( t )
t.SetTag(StringTable.Localize("$T_AUTOMAG2")); {
t.Amount = 2;
t.SetTag(StringTable.Localize("$T_AUTOMAG2"));
}
} }
else if ( (type is 'Betamag') && sting_protomags ) else if ( (type is 'Betamag') && sting_protomags )
{ {
// force akimbo // force akimbo
let t = FindInventory(type); let t = FindInventory(type);
if ( t ) t.Amount = 2; if ( t )
t.SetTag(StringTable.Localize("$T_PROTOMAG2")); {
t.Amount = 2;
t.SetTag(StringTable.Localize("$T_PROTOMAG2"));
}
} }
else if ( type is 'DispersionPistol' ) else if ( type is 'DispersionPistol' )
{ {
@ -952,29 +958,29 @@ Class UnrealMainHandler : EventHandler
{ {
if ( (e.Replacee == 'Chainsaw') || (e.Replacee == 'Gauntlets') ) if ( (e.Replacee == 'Chainsaw') || (e.Replacee == 'Gauntlets') )
{ {
if ( (sting_dubious || sting_olsmp) && !Random[Replacements](0,3) ) e.Replacement = 'WeaponPowerUp'; if ( ((sting_proto && sting_dubious) || sting_olsmp) && !Random[Replacements](0,sting_proto?3:1) ) e.Replacement = 'WeaponPowerUp';
else if ( Random[Replacements](0,2) ) else if ( sting_proto && Random[Replacements](0,2) )
{ {
if ( sting_dubious && Random[Replacements](0,1) ) e.Replacement = 'Bonesaw'; if ( sting_dubious && Random[Replacements](0,1) ) e.Replacement = 'Bonesaw';
else e.Replacement = 'Stunner'; else e.Replacement = 'Stunner';
} }
else if ( !Random[Replacements](0,2) ) e.Replacement = 'Betamag'; else if ( sting_proto && !Random[Replacements](0,2) ) e.Replacement = 'Betamag';
else e.Replacement = 'Automag'; else e.Replacement = 'Automag';
} }
else if ( (e.Replacee == 'Fist') || (e.Replacee == 'Staff') ) e.Replacement = 'DispersionPistol'; else if ( (e.Replacee == 'Fist') || (e.Replacee == 'Staff') ) e.Replacement = 'DispersionPistol';
else if ( (e.Replacee == 'Pistol') || (e.Replacee == 'GoldWand') ) else if ( (e.Replacee == 'Pistol') || (e.Replacee == 'GoldWand') )
{ {
if ( !Random[Replacements](0,2) ) e.Replacement = 'Betamag'; if ( sting_proto && !Random[Replacements](0,2) ) e.Replacement = 'Betamag';
else e.Replacement = 'Automag'; else e.Replacement = 'Automag';
} }
else if ( (e.Replacee == 'Shotgun') || (e.Replacee == 'SuperShotgun') || (e.Replacee == 'Crossbow') ) else if ( (e.Replacee == 'Shotgun') || (e.Replacee == 'SuperShotgun') || (e.Replacee == 'Crossbow') )
{ {
if ( !Random[Replacements](0,3) && (e.Replacee != 'SuperShotgun') ) if ( !Random[Replacements](0,3) && (e.Replacee != 'SuperShotgun') )
{ {
if ( !Random[Replacements](0,2) ) e.Replacement = 'Betamag'; if ( sting_proto && !Random[Replacements](0,2) ) e.Replacement = 'Betamag';
else e.Replacement = 'Automag'; else e.Replacement = 'Automag';
} }
else switch( Random[Replacements](0,2) ) else switch( Random[Replacements](0,sting_proto?2:1) )
{ {
case 0: case 0:
e.Replacement = 'Stinger'; e.Replacement = 'Stinger';
@ -994,7 +1000,7 @@ Class UnrealMainHandler : EventHandler
} }
else if ( (e.Replacee == 'RocketLauncher') || (e.Replacee == 'PhoenixRod') ) else if ( (e.Replacee == 'RocketLauncher') || (e.Replacee == 'PhoenixRod') )
{ {
if ( !Random[Replacements](0,3) ) if ( sting_proto && !Random[Replacements](0,3) )
{ {
if ( Random[Replacements](0,1) ) e.Replacement = 'UFlamethrower'; if ( Random[Replacements](0,1) ) e.Replacement = 'UFlamethrower';
else e.Replacement = 'FlameGun'; else e.Replacement = 'FlameGun';
@ -1004,14 +1010,14 @@ Class UnrealMainHandler : EventHandler
} }
else if ( (e.Replacee == 'PlasmaRifle') || (e.Replacee == 'SkullRod') ) else if ( (e.Replacee == 'PlasmaRifle') || (e.Replacee == 'SkullRod') )
{ {
if ( !Random[Replacements](0,2) ) e.Replacement = 'Impaler'; if ( sting_proto && !Random[Replacements](0,2) ) e.Replacement = 'Impaler';
else if ( Random[Replacements](0,1) ) e.Replacement = 'URifle'; else if ( Random[Replacements](0,1) ) e.Replacement = 'URifle';
else e.Replacement = 'UBioRifle'; else e.Replacement = 'UBioRifle';
} }
else if ( (e.Replacee == 'BFG9000') || (e.Replacee == 'Mace') ) else if ( (e.Replacee == 'BFG9000') || (e.Replacee == 'Mace') )
{ {
if ( sting_olsmp && (!sting_dubious || Random[Replacements](0,1)) ) e.Replacement = 'OLSMP'; if ( sting_olsmp && (!sting_proto || !sting_dubious || Random[Replacements](0,1)) ) e.Replacement = 'OLSMP';
else if ( sting_dubious ) else if ( sting_proto && sting_dubious )
{ {
if ( Random[Replacements](0,1) ) e.Replacement = 'SMiniGun'; if ( Random[Replacements](0,1) ) e.Replacement = 'SMiniGun';
else e.Replacement = 'BigGun'; else e.Replacement = 'BigGun';
@ -1033,7 +1039,7 @@ Class UnrealMainHandler : EventHandler
else if ( (e.Replacee == 'Shell') || (e.Replacee == 'CrossbowAmmo') ) else if ( (e.Replacee == 'Shell') || (e.Replacee == 'CrossbowAmmo') )
{ {
if ( !Random[Replacements](0,2) ) e.Replacement = 'UClip'; if ( !Random[Replacements](0,2) ) e.Replacement = 'UClip';
else switch( Random[Replacements](0,2) ) else switch( Random[Replacements](0,sting_proto?2:1) )
{ {
case 0: case 0:
e.Replacement = 'StingerAmmo'; e.Replacement = 'StingerAmmo';
@ -1048,7 +1054,7 @@ Class UnrealMainHandler : EventHandler
} }
else if ( (e.Replacee == 'ShellBox') || (e.Replacee == 'CrossbowHefty') ) else if ( (e.Replacee == 'ShellBox') || (e.Replacee == 'CrossbowHefty') )
{ {
switch( Random[Replacements](0,2) ) switch( Random[Replacements](0,sting_proto?2:1) )
{ {
case 0: case 0:
e.Replacement = 'StingerAmmo2'; e.Replacement = 'StingerAmmo2';
@ -1063,7 +1069,7 @@ Class UnrealMainHandler : EventHandler
} }
else if ( (e.Replacee == 'RocketAmmo') || (e.Replacee == 'PhoenixRodAmmo') || (e.Replacee == 'MaceAmmo') ) else if ( (e.Replacee == 'RocketAmmo') || (e.Replacee == 'PhoenixRodAmmo') || (e.Replacee == 'MaceAmmo') )
{ {
if ( !Random[Replacements](0,4) ) e.Replacement = 'FlameAmmo'; if ( sting_proto && !Random[Replacements](0,4) ) e.Replacement = 'FlameAmmo';
else if ( Random[Replacements](0,1) ) else if ( Random[Replacements](0,1) )
{ {
if ( !Random[Replacements](0,3) ) e.Replacement = 'UFlakBox'; if ( !Random[Replacements](0,3) ) e.Replacement = 'UFlakBox';
@ -1077,18 +1083,18 @@ Class UnrealMainHandler : EventHandler
} }
else if ( (e.Replacee == 'RocketBox') || (e.Replacee == 'PhoenixRodHefty') || (e.Replacee == 'MaceHefty') ) else if ( (e.Replacee == 'RocketBox') || (e.Replacee == 'PhoenixRodHefty') || (e.Replacee == 'MaceHefty') )
{ {
if ( !Random[Replacements](0,3) ) e.Replacement = 'FlameAmmo'; if ( sting_proto && !Random[Replacements](0,3) ) e.Replacement = 'FlameAmmo';
else if ( Random[Replacements](0,1) ) e.Replacement = 'UFlakBox'; else if ( Random[Replacements](0,1) ) e.Replacement = 'UFlakBox';
else e.Replacement = 'URocketAmmo'; else e.Replacement = 'URocketAmmo';
} }
else if ( (e.Replacee == 'Cell') || (e.Replacee == 'SkullRodAmmo') ) else if ( (e.Replacee == 'Cell') || (e.Replacee == 'SkullRodAmmo') )
{ {
if ( sting_dubious && !Random[Replacements](0,4) ) if ( sting_proto && sting_dubious && !Random[Replacements](0,4) )
{ {
if ( !Random[Replacements](0,2) ) e.Replacement = 'BigAmmo2'; if ( !Random[Replacements](0,2) ) e.Replacement = 'BigAmmo2';
else e.Replacement = 'BigAmmo3'; else e.Replacement = 'BigAmmo3';
} }
else if ( !Random[Replacements](0,3) ) else if ( sting_proto && !Random[Replacements](0,3) )
{ {
if ( !Random[Replacements](0,3) ) e.Replacement = 'ImpalerAmmo'; if ( !Random[Replacements](0,3) ) e.Replacement = 'ImpalerAmmo';
else e.Replacement = 'ImpalerAmmo2'; else e.Replacement = 'ImpalerAmmo2';
@ -1106,12 +1112,12 @@ Class UnrealMainHandler : EventHandler
} }
else if ( (e.Replacee == 'CellPack') || (e.Replacee == 'SkullRodHefty') ) else if ( (e.Replacee == 'CellPack') || (e.Replacee == 'SkullRodHefty') )
{ {
if ( sting_dubious && !Random[Replacements](0,4) ) if ( sting_proto && sting_dubious && !Random[Replacements](0,4) )
{ {
if ( !Random[Replacements](0,2) ) e.Replacement = 'BigAmmo'; if ( !Random[Replacements](0,2) ) e.Replacement = 'BigAmmo';
else e.Replacement = 'BigAmmo2'; else e.Replacement = 'BigAmmo2';
} }
else if ( !Random[Replacements](0,3) ) e.Replacement = 'ImpalerAmmo'; else if ( sting_proto && !Random[Replacements](0,3) ) e.Replacement = 'ImpalerAmmo';
else if ( sting_olsmp && !Random[Replacements](0,2) ) e.Replacement = 'OLSMPAmmo'; else if ( sting_olsmp && !Random[Replacements](0,2) ) e.Replacement = 'OLSMPAmmo';
else if ( Random[Replacements](0,1) ) e.Replacement = 'UBioAmmo'; else if ( Random[Replacements](0,1) ) e.Replacement = 'UBioAmmo';
else e.Replacement = 'URifleAmmo'; else e.Replacement = 'URifleAmmo';
@ -1120,13 +1126,17 @@ Class UnrealMainHandler : EventHandler
else if ( (e.Replacee == 'Berserk') || (e.Replacee == 'ArtiTomeOfPower') ) else if ( (e.Replacee == 'Berserk') || (e.Replacee == 'ArtiTomeOfPower') )
{ {
if ( sting_msentry && !Random[Replacements](0,9) ) e.Replacement = 'SentryItem'; if ( sting_msentry && !Random[Replacements](0,9) ) e.Replacement = 'SentryItem';
else if ( (sting_dubious || sting_olsmp) && !Random[Replacements](0,2) ) e.Replacement = 'WeaponPowerUp'; else if ( ((sting_proto && sting_dubious) || sting_olsmp) && !Random[Replacements](0,2) ) e.Replacement = 'WeaponPowerUp';
else e.Replacement = 'Amplifier'; else e.Replacement = 'Amplifier';
} }
else if ( e.Replacee == 'ArtiEgg' ) e.Replacement = 'VoiceBox'; else if ( e.Replacee == 'ArtiEgg' ) e.Replacement = 'VoiceBox';
else if ( (e.Replacee == 'Soulsphere') || (e.Replacee == 'ArtiSuperHealth') ) e.Replacement = 'SuperHealth'; else if ( (e.Replacee == 'Soulsphere') || (e.Replacee == 'ArtiSuperHealth') ) e.Replacement = 'SuperHealth';
else if ( e.Replacee == 'Megasphere' ) e.Replacement = 'ShieldBelt'; else if ( e.Replacee == 'Megasphere' ) e.Replacement = 'ShieldBelt';
else if ( (e.Replacee == 'Allmap') || (e.Replacee == 'SuperMap') ) e.Replacement = 'MotionDetector'; else if ( (e.Replacee == 'Allmap') || (e.Replacee == 'SuperMap') )
{
if ( sting_proto && Random[Replacements](0,2) ) e.Replacement = 'MotionDetector';
else e.Replacement = 'UAllMap';
}
else if ( (e.Replacee == 'BlurSphere') || (e.Replacee == 'ArtiInvisibility') ) e.Replacement = 'UInvisibility'; else if ( (e.Replacee == 'BlurSphere') || (e.Replacee == 'ArtiInvisibility') ) e.Replacement = 'UInvisibility';
else if ( (e.Replacee == 'Infrared') || (e.Replacee == 'ArtiTorch') ) e.Replacement = 'UFlashlight'; else if ( (e.Replacee == 'Infrared') || (e.Replacee == 'ArtiTorch') ) e.Replacement = 'UFlashlight';
else if ( e.Replacee == 'RadSuit' ) e.Replacement = 'UJumpBoots'; else if ( e.Replacee == 'RadSuit' ) e.Replacement = 'UJumpBoots';
@ -1134,7 +1144,7 @@ Class UnrealMainHandler : EventHandler
else if ( (e.Replacee == 'Backpack') || (e.Replacee == 'BagOfHolding') ) e.Replacement = 'UnrealBackpack'; else if ( (e.Replacee == 'Backpack') || (e.Replacee == 'BagOfHolding') ) e.Replacement = 'UnrealBackpack';
else if ( (e.Replacee == 'ArmorBonus') || (e.Replacee == 'ArtiTimeBomb') ) else if ( (e.Replacee == 'ArmorBonus') || (e.Replacee == 'ArtiTimeBomb') )
{ {
if ( Random[Replacements](0,3) ) e.Replacement = 'UArmorBonus'; if ( sting_abonus && Random[Replacements](0,3) ) e.Replacement = 'UArmorBonus';
else e.Replacement = 'Flare'; else e.Replacement = 'Flare';
} }
else if ( (e.Replacee == 'HealthBonus') || (e.Replacee == 'CrystalVial') ) e.Replacement = 'Bandages'; else if ( (e.Replacee == 'HealthBonus') || (e.Replacee == 'CrystalVial') ) e.Replacement = 'Bandages';
@ -1150,7 +1160,7 @@ Class UnrealMainHandler : EventHandler
else if ( e.Replacee == 'ArtiTeleport' ) else if ( e.Replacee == 'ArtiTeleport' )
{ {
// I have no idea what to replace this with, so just have some random stuff // I have no idea what to replace this with, so just have some random stuff
switch( Random[Replacements](0,7) ) switch( Random[Replacements](0,sting_proto?7:5) )
{ {
case 0: case 0:
e.Replacement = 'UnrealBackpack'; e.Replacement = 'UnrealBackpack';
@ -1208,6 +1218,19 @@ Class UnrealMainHandler : EventHandler
else if ( e.Replacee is 'EnhancedShockAmmo' ) e.Replacement = 'UNothing'; else if ( e.Replacee is 'EnhancedShockAmmo' ) e.Replacement = 'UNothing';
else if ( e.Replacee is 'UTBackpack' ) e.Replacement = 'UnrealBackpack'; else if ( e.Replacee is 'UTBackpack' ) e.Replacement = 'UnrealBackpack';
else if ( e.Replacee is 'UDamage' ) e.Replacement = 'Amplifier'; else if ( e.Replacee is 'UDamage' ) e.Replacement = 'Amplifier';
else if ( e.Replacee is 'UTInvisibility' ) e.Replacement = 'UInvisibility';
else if ( e.Replacee is 'UTShieldBelt' ) e.Replacement = 'ShieldBelt';
else if ( e.Replacee is 'UTBodyArmor' ) e.Replacement = 'UArmor';
else if ( e.Replacee is 'UTThighPads' ) e.Replacement = 'KevlarSuit';
else if ( e.Replacee is 'UTArmorBonus' )
{
if ( sting_abonus ) e.Replacement = 'UArmorBonus';
else e.Replacement = 'Flare';
}
else if ( (e.Replacee is 'UTMedBox') || (e.Replacee is 'UTHealthBox') ) e.Replacement = 'UHealth';
else if ( e.Replacee is 'UTHealthPack' ) e.Replacement = 'SuperHealth';
else if ( e.Replacee is 'UTHealthBonus' ) e.Replacement = 'Bandages';
else if ( e.Replacee is 'UTJumpBoots' ) e.Replacement = 'UJumpBoots';
// we don't need these // we don't need these
else if ( e.Replacee is 'UTActivatable' ) e.Replacement = 'UNothing'; else if ( e.Replacee is 'UTActivatable' ) e.Replacement = 'UNothing';
else if ( e.Replacee is 'UTActivatableHealth' ) e.Replacement = 'UNothing'; else if ( e.Replacee is 'UTActivatableHealth' ) e.Replacement = 'UNothing';
@ -1218,9 +1241,9 @@ Class UnrealMainHandler : EventHandler
{ {
if ( flak_translocator ) if ( flak_translocator )
players[e.playernumber].mo.TakeInventory("Translocator",1); players[e.playernumber].mo.TakeInventory("Translocator",1);
if ( sting_telegun ) if ( sting_proto && sting_telegun )
players[e.playernumber].mo.GiveInventory("UTranslocator",1); players[e.playernumber].mo.GiveInventory("UTranslocator",1);
if ( sting_flares ) if ( sting_proto && sting_flares )
{ {
players[e.playernumber].mo.GiveInventory("LightFlare",1); players[e.playernumber].mo.GiveInventory("LightFlare",1);
players[e.playernumber].mo.GiveInventory("DarkFlare",1); players[e.playernumber].mo.GiveInventory("DarkFlare",1);
@ -1241,14 +1264,14 @@ Class UnrealMainHandler : EventHandler
players[i].mo.TakeInventory("Translocator",1); players[i].mo.TakeInventory("Translocator",1);
} }
} }
if ( sting_telegun ) if ( sting_proto && sting_telegun )
{ {
for ( int i=0; i<MAXPLAYERS; i++ ) if ( playeringame[i] ) for ( int i=0; i<MAXPLAYERS; i++ ) if ( playeringame[i] )
{ {
players[i].mo.GiveInventory("UTranslocator",1); players[i].mo.GiveInventory("UTranslocator",1);
} }
} }
if ( sting_flares ) if ( sting_proto && sting_flares )
{ {
for ( int i=0; i<MAXPLAYERS; i++ ) if ( playeringame[i] ) for ( int i=0; i<MAXPLAYERS; i++ ) if ( playeringame[i] )
{ {

View file

@ -319,6 +319,28 @@ Class UJumpBoots : UnrealInventory
} }
} }
// cheap replacement when proto content disabled
Class UAllMap : MapRevealer
{
Default
{
Tag "$T_ALLMAP";
+COUNTITEM;
+INVENTORY.ALWAYSPICKUP;
Inventory.MaxAmount 0;
Inventory.Icon "I_Detect";
Inventory.PickupSound "misc/p_pkup";
Inventory.PickupMessage "$I_ALLMAP";
Inventory.RespawnTics 1050;
}
States
{
Spawn:
PMAP ABCDCB 6;
Loop;
}
}
Class MotionDetector : UnrealInventory Class MotionDetector : UnrealInventory
{ {
ui TextureID DetHud, DetSpot[2]; ui TextureID DetHud, DetSpot[2];
@ -328,7 +350,6 @@ Class MotionDetector : UnrealInventory
{ {
Tag "$T_DETECTOR"; Tag "$T_DETECTOR";
+COUNTITEM; +COUNTITEM;
+INVENTORY.BIGPOWERUP;
+INVENTORY.ALWAYSPICKUP; +INVENTORY.ALWAYSPICKUP;
Inventory.MaxAmount 1; Inventory.MaxAmount 1;
Inventory.Icon "I_Detect"; Inventory.Icon "I_Detect";
@ -338,10 +359,47 @@ Class MotionDetector : UnrealInventory
} }
override bool TryPickup( in out Actor toucher ) override bool TryPickup( in out Actor toucher )
{ {
if ( !sting_proto ) return false; // not allowed
bool valid = Super.TryPickup(toucher); bool valid = Super.TryPickup(toucher);
if ( valid ) level.allmap = true; if ( valid ) level.allmap = true;
return valid; return valid;
} }
override void Tick()
{
Super.Tick();
if ( sting_proto ) return;
if ( !Owner )
{
let r = Spawn("AllMap",pos,ALLOW_REPLACE);
r.spawnangle = spawnangle;
r.spawnpoint = spawnpoint;
r.angle = angle;
r.pitch = pitch;
r.roll = roll;
r.special = special;
r.args[0] = args[0];
r.args[1] = args[1];
r.args[2] = args[2];
r.args[3] = args[3];
r.args[4] = args[4];
r.ChangeTid(tid);
r.SpawnFlags = SpawnFlags&~MTF_SECRET;
r.HandleSpawnFlags();
r.SpawnFlags = SpawnFlags;
r.bCountSecret = SpawnFlags&MTF_SECRET;
r.vel = vel;
r.master = master;
r.target = target;
r.tracer = tracer;
r.bDropped = bDropped;
Destroy();
}
else
{
Owner.RemoveInventory(self);
Destroy();
}
}
override void PostRender( double lbottom ) override void PostRender( double lbottom )
{ {
if ( !bActive ) return; if ( !bActive ) return;

View file

@ -12,7 +12,7 @@ Class UTranslocatorAmmo : Ammo
override void Tick() override void Tick()
{ {
Super.Tick(); Super.Tick();
if ( sting_telegun ) return; if ( sting_proto && sting_telegun ) return;
if ( Owner ) Owner.RemoveInventory(self); if ( Owner ) Owner.RemoveInventory(self);
Destroy(); Destroy();
} }
@ -132,13 +132,13 @@ Class UTranslocator : UnrealWeapon
override bool TryPickup( in out Actor toucher ) override bool TryPickup( in out Actor toucher )
{ {
if ( !sting_telegun ) return false; // not allowed if ( !sting_proto || !sting_telegun ) return false; // not allowed
return Super.TryPickup(toucher); return Super.TryPickup(toucher);
} }
override void Tick() override void Tick()
{ {
Super.Tick(); Super.Tick();
if ( sting_telegun ) return; if ( sting_proto && sting_telegun ) return;
if ( Owner ) Owner.RemoveInventory(self); if ( Owner ) Owner.RemoveInventory(self);
Destroy(); Destroy();
} }