diff --git a/Readme.md b/Readme.md index 2994792..e164605 100644 --- a/Readme.md +++ b/Readme.md @@ -74,18 +74,20 @@ Doom Tournament (currently the devel branch is required). ## In progress - - Beta testing + - Final polishing ## Planned - - Impaler "slice" animation for melee alt - - Separate proto content into an add-on (if people want) - - 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 - explosions/lava/etc). - - Alternate Impaler primary that follows the Bible (laser shots from the - crystal), shifts crystal shooting to pressing both buttons at once. - - Actual Bonesaw? + - Shifted to a 1.1 update: + - Impaler "slice" animation for melee alt + - 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 + explosions/lava/etc). + - Alternate Impaler primary that follows the Bible (laser shots from the + crystal), shifts crystal shooting to pressing both buttons at once. + - Actual Bonesaw? + - Implement ASMD behavior described in the Unreal novels (highly destructive + green beam that bounces off mirrors and water). - RTNP add-on - Monster pack (someday) @@ -94,4 +96,5 @@ Doom Tournament (currently the devel branch is required). ## Known bugs - 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. diff --git a/brightmaps/JAllMap1_a00.png b/brightmaps/JAllMap1_a00.png new file mode 100644 index 0000000..6ca149b Binary files /dev/null and b/brightmaps/JAllMap1_a00.png differ diff --git a/brightmaps/JAllMap1_a01.png b/brightmaps/JAllMap1_a01.png new file mode 100644 index 0000000..bc36315 Binary files /dev/null and b/brightmaps/JAllMap1_a01.png differ diff --git a/brightmaps/JAllMap1_a02.png b/brightmaps/JAllMap1_a02.png new file mode 100644 index 0000000..3b2eb8b Binary files /dev/null and b/brightmaps/JAllMap1_a02.png differ diff --git a/brightmaps/JAllMap1_a03.png b/brightmaps/JAllMap1_a03.png new file mode 100644 index 0000000..633823d Binary files /dev/null and b/brightmaps/JAllMap1_a03.png differ diff --git a/cvarinfo.txt b/cvarinfo.txt index 4c2e437..8019032 100644 --- a/cvarinfo.txt +++ b/cvarinfo.txt @@ -73,6 +73,8 @@ server bool sting_olsmp = true; // adds the stupid oldskool SMP 7243 to // an option server bool sting_msentry = true; // allows the new Minigun Sentry, which // 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 // (Demolisher, Razorclaw, Autocannon) 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) server bool sting_impself = false; // disable impaler beam self-hit user bool sting_zoomshader = true; // rifle scope shader +server bool sting_proto = true; // allow prototype content diff --git a/gldefs.txt b/gldefs.txt index 5c2998f..e69a236 100644 --- a/gldefs.txt +++ b/gldefs.txt @@ -440,6 +440,18 @@ Object StarterImpalerBolt 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 HardwareShader Texture "graphics/MenuBarr.png" { @@ -850,6 +862,34 @@ HardwareShader Texture "models/shield.png" { 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 HardwareShader PostProcess scene { diff --git a/language.txt b/language.txt index 09247e8..0edb3fb 100644 --- a/language.txt +++ b/language.txt @@ -115,6 +115,7 @@ I_SCUBA = "You picked up the SCUBA Gear."; I_OLSMP = "You got the SMP 7243. Time to kick ass!"; I_OLSMPAMMO = "You picked up a SMP 7243 Magazine."; I_LBOOTS = "You picked up the Jump Boots."; +I_ALLMAP = "You got an Area Map."; /* Tags */ T_WPOWERUP = "Dispersion Pistol Powerup"; T_STINGERAMMO = "Tarydium Shards"; @@ -182,6 +183,7 @@ T_SCUBA = "SCUBA Gear"; T_OLSMP = "SMP 7243"; T_OLSMPAMMO = "SMP 7243 Magazine"; T_LBOOTS = "Jump Boots"; +T_ALLMAP = "Area Map"; /* Miscellaneous */ TR_NOMSG = "No new messages"; TR_NEWMSG = "New Translator message"; @@ -225,6 +227,7 @@ STING_UNREAL97 = "Unreal '97"; STING_UNREAL96 = "Unreal '96"; STING_UNREAL95 = "Unreal '95"; STING_POPTS = "Prototype features"; +STING_PROTO = "Enable prototype content"; STING_TELEHAND = "Teleport Capsules"; STING_FLARES = "Light/Dark Flares"; 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_OLSMP = "Enable SMP 7243 from Oldskool Amp'd"; STING_MSENTRY = "Enable new Minigun Sentry"; +STING_ABONUS = "Enable Armor Bonus"; STING_DUBIOUS = "Enable Demolisher, Razorclaw and Autocannon"; STING_ZSHADER = "Enable Rifle scope shader"; 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_OLSMPAMMO = "Has recogido un Cargador de SMP 7243."; I_LBOOTS = "Has recogido las Botas de Salto."; +I_ALLMAP = "Has obtenido un Mapa de Área."; /* Tags */ T_WPOWERUP = "Mejora para Pistola de Dispersión"; T_STINGERAMMO = "Fragmentos de Tarydium"; @@ -435,6 +440,7 @@ T_DETECTOR = "Detector de Movimiento"; T_SCUBA = "Kit de Buceo"; T_OLSMPAMMO = "Cargador de SMP 7243"; T_LBOOTS = "Botas de Salto"; +T_ALLMAP = "Mapa de Área"; /* Miscellaneous */ TR_NOMSG = "No hay mensajes nuevos"; TR_NEWMSG = "Nuevo mensaje de Traductor"; @@ -465,6 +471,7 @@ STING_HUDMODE = "Modo de HUD"; STING_TRANSEXT = "Traductor extendido (cabe más texto)"; STING_INTRO = "Tipo de intro"; STING_POPTS = "Características de prototipo"; +STING_PROTO = "Habilitar contenido de prototipo"; STING_TELEHAND = "Cápsulas de Teletransporte"; STING_FLARES = "Bengalas de luz/oscuridad"; 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_OLSMP = "Habilitar SMP 7243 de Oldskool Amp'd"; STING_MSENTRY = "Habilitar nueva Torreta"; +STING_ABONUS = "Habilitar Armadura Extra"; STING_DUBIOUS = "Habilitar Demoledor, Garra y Autocañón"; STING_ZSHADER = "Habilitar shader de mira de Rifle"; STING_QOPTS = "Características de comodidad"; diff --git a/menudef.txt b/menudef.txt index bb2a8b3..13c3ae6 100644 --- a/menudef.txt +++ b/menudef.txt @@ -23,8 +23,9 @@ OptionMenu "UnrealOptionMenu" Option "$STING_TRANSEXT", "sting_transext", "YesNo" StaticText " " StaticText "$STING_POPTS", "Gold" - Option "$STING_TELEHAND", "sting_telegun", "YesNo" - Option "$STING_FLARES", "sting_flares", "YesNo" + Option "$STING_PROTO", "sting_proto", "YesNo" + Option "$STING_TELEHAND", "sting_telegun", "YesNo", "sting_proto" + Option "$STING_FLARES", "sting_flares", "YesNo", "sting_proto" Command "$FLAK_APPLY", "netevent refreshtrans" Option "$STING_STINGER", "sting_stinger", "YesNo" Option "$STING_STINGERB", "sting_stingerb", "YesNo" @@ -36,7 +37,7 @@ OptionMenu "UnrealOptionMenu" StaticText " " StaticText "$STING_DOPTS", "Gold" Option "$STING_AUTODUAL", "sting_automags", "YesNo" - Option "$STING_PROTODUAL", "sting_protomags", "YesNo" + Option "$STING_PROTODUAL", "sting_protomags", "YesNo", "sting_proto" StaticText " " StaticText "$STING_UOPTS", "Gold" Option "$STING_DPISTOL", "sting_dpistol", "YesNo" @@ -44,15 +45,16 @@ OptionMenu "UnrealOptionMenu" Option "$STING_NOPSTART", "sting_nopstart", "YesNo" Option "$STING_OLSMP", "sting_olsmp", "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" StaticText " " StaticText "$STING_QOPTS", "Gold" Option "$STING_AUTOSCUBA", "sting_autoscuba", "YesNo" Option "$STING_RAZORAIM", "sting_razoraim", "YesNo" Option "$STING_BIOSPLASH", "sting_biosplash", "YesNo" - Option "$STING_FLAMETSPREAD", "sting_flametspread", "YesNo" - Option "$STING_IMPSELF", "sting_impself", "YesNo" + Option "$STING_FLAMETSPREAD", "sting_flametspread", "YesNo", "sting_proto" + Option "$STING_IMPSELF", "sting_impself", "YesNo", "sting_proto" } AddOptionMenu "OptionsMenu" diff --git a/modeldef.umisc b/modeldef.umisc index 817faac..4aa2bfb 100644 --- a/modeldef.umisc +++ b/modeldef.umisc @@ -797,3 +797,23 @@ Model "UArmorBonus" 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 +} diff --git a/models/CheapComp_a.3d b/models/CheapComp_a.3d new file mode 100644 index 0000000..d8ecb79 Binary files /dev/null and b/models/CheapComp_a.3d differ diff --git a/models/CheapComp_d.3d b/models/CheapComp_d.3d new file mode 100644 index 0000000..346b8cc Binary files /dev/null and b/models/CheapComp_d.3d differ diff --git a/models/JAllMap1_a00.png b/models/JAllMap1_a00.png new file mode 100644 index 0000000..c96c445 Binary files /dev/null and b/models/JAllMap1_a00.png differ diff --git a/models/JAllMap1_a01.png b/models/JAllMap1_a01.png new file mode 100644 index 0000000..251643e Binary files /dev/null and b/models/JAllMap1_a01.png differ diff --git a/models/JAllMap1_a02.png b/models/JAllMap1_a02.png new file mode 100644 index 0000000..acfd19e Binary files /dev/null and b/models/JAllMap1_a02.png differ diff --git a/models/JAllMap1_a03.png b/models/JAllMap1_a03.png new file mode 100644 index 0000000..8276767 Binary files /dev/null and b/models/JAllMap1_a03.png differ diff --git a/models/JAllMap2.png b/models/JAllMap2.png new file mode 100644 index 0000000..fb1c329 Binary files /dev/null and b/models/JAllMap2.png differ diff --git a/models/JAllMap3.png b/models/JAllMap3.png new file mode 100644 index 0000000..dc4674b Binary files /dev/null and b/models/JAllMap3.png differ diff --git a/zscript/betamag.zsc b/zscript/betamag.zsc index d23d56e..4f213be 100644 --- a/zscript/betamag.zsc +++ b/zscript/betamag.zsc @@ -11,6 +11,66 @@ Class Betamag : UnrealWeapon int SlaveRefire; 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 ) { if ( sting_protomags && (item.GetClass() == GetClass()) ) @@ -271,27 +331,6 @@ Class Betamag : UnrealWeapon else if ( Amount > 1 ) SelectionOrder = 2200; 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 { Tag "$T_PROTOMAG"; diff --git a/zscript/biggun.zsc b/zscript/biggun.zsc index f74ca5d..4440610 100644 --- a/zscript/biggun.zsc +++ b/zscript/biggun.zsc @@ -20,13 +20,13 @@ Class BigAmmo : Ammo } 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); } override void Tick() { Super.Tick(); - if ( sting_dubious ) return; + if ( sting_proto && sting_dubious ) return; if ( !Owner ) { let r = Spawn((GetClass()=="BigAmmo")?"CellPack":"Cell",pos,ALLOW_REPLACE); @@ -237,13 +237,13 @@ Class BigGun : UnrealWeapon 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); } override void Tick() { Super.Tick(); - if ( sting_dubious ) return; + if ( sting_proto && sting_dubious ) return; if ( !Owner ) { let r = Spawn("BFG9000",pos,ALLOW_REPLACE); diff --git a/zscript/bonesaw.zsc b/zscript/bonesaw.zsc index 125f5a0..8e71aac 100644 --- a/zscript/bonesaw.zsc +++ b/zscript/bonesaw.zsc @@ -2,13 +2,13 @@ Class Bonesaw : UnrealWeapon { 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); } override void Tick() { Super.Tick(); - if ( sting_dubious ) return; + if ( sting_proto && sting_dubious ) return; if ( !Owner ) { let r = Spawn("Chainsaw",pos,ALLOW_REPLACE); diff --git a/zscript/dispersionpistol.zsc b/zscript/dispersionpistol.zsc index 49c2337..531ca81 100644 --- a/zscript/dispersionpistol.zsc +++ b/zscript/dispersionpistol.zsc @@ -66,7 +66,7 @@ Class DefaultAmmo : Ammo } override void DoEffect() { - Super.Tick(); + Super.DoEffect(); if ( rechargespeed <= 0. ) rechargespeed = 1.1; rechargephase += 1./rechargespeed; if ( rechargephase < 35 ) return; diff --git a/zscript/flamegun.zsc b/zscript/flamegun.zsc index ca5928c..35518ff 100644 --- a/zscript/flamegun.zsc +++ b/zscript/flamegun.zsc @@ -316,6 +316,47 @@ Class FlameGun : UnrealWeapon Weapon.AmmoGive 100; 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 ) { Weapon weap = Weapon(invoker); diff --git a/zscript/gatling.zsc b/zscript/gatling.zsc index 00255f6..3924f5a 100644 --- a/zscript/gatling.zsc +++ b/zscript/gatling.zsc @@ -10,13 +10,13 @@ Class SMiniAmmo : Ammo } 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); } override void Tick() { Super.Tick(); - if ( sting_dubious ) return; + if ( sting_proto && sting_dubious ) return; if ( Owner ) Owner.RemoveInventory(self); Destroy(); } @@ -123,13 +123,13 @@ Class SMiniGun : UnrealWeapon { 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); } override void Tick() { Super.Tick(); - if ( sting_dubious ) return; + if ( sting_proto && sting_dubious ) return; if ( !Owner ) { let r = Spawn("BFG9000",pos,ALLOW_REPLACE); diff --git a/zscript/impaler.zsc b/zscript/impaler.zsc index 03139b5..4fa4506 100644 --- a/zscript/impaler.zsc +++ b/zscript/impaler.zsc @@ -12,6 +12,47 @@ Class ImpalerAmmo : Ammo Ammo.DropAmount 3; +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 { Spawn: @@ -693,6 +734,47 @@ Class Impaler : UnrealWeapon 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() { return HasGem?ClipCount:-1, -1, (ClipCount<10), false; diff --git a/zscript/miscitems.zsc b/zscript/miscitems.zsc index f036dbe..16076f5 100644 --- a/zscript/miscitems.zsc +++ b/zscript/miscitems.zsc @@ -90,24 +90,24 @@ Class UnrealBackpack : BackpackItem replaces Backpack Super.DoPickupSpecial(toucher); if ( gameinfo.gametype&GAME_DOOMCHEX ) { - static const Class xitems[] = {"Flare", "Seeds", "SentryGunItem", "VoiceBox", "ForceField", "Dampener", "Peacemaker"}; + static const Class xitems[] = {"Flare", "Seeds", "VoiceBox", "ForceField", "Dampener", "Peacemaker", "SentryGunItem"}; int xitemn[7]; xitemn[0] = max(0,Random[BackpackExtra](-1,3)); xitemn[1] = max(0,Random[BackpackExtra](-1,3)); xitemn[2] = max(0,Random[BackpackExtra](-2,1)); xitemn[3] = max(0,Random[BackpackExtra](-2,1)); - xitemn[4] = max(0,Random[BackpackExtra](-2,1)); - xitemn[5] = max(0,Random[BackpackExtra](-1,1)); + xitemn[4] = max(0,Random[BackpackExtra](-1,1)); + xitemn[5] = max(0,Random[BackpackExtra](-2,1)); xitemn[6] = max(0,Random[BackpackExtra](-2,1)); // random doubling if ( !Random[BackpackExtra](0,4) ) xitemn[0] *= 2; if ( !Random[BackpackExtra](0,4) ) xitemn[1] *= 2; - if ( !Random[BackpackExtra](0,9) ) xitemn[2] *= 2; - if ( !Random[BackpackExtra](0,7) ) xitemn[3] *= 2; - if ( !Random[BackpackExtra](0,6) ) xitemn[4] *= 2; - if ( !Random[BackpackExtra](0,5) ) xitemn[5] *= 2; + if ( !Random[BackpackExtra](0,7) ) xitemn[2] *= 2; + if ( !Random[BackpackExtra](0,6) ) xitemn[3] *= 2; + if ( !Random[BackpackExtra](0,5) ) xitemn[4] *= 2; + if ( !Random[BackpackExtra](0,9) ) xitemn[5] *= 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; toucher.GiveInventory(xitems[i],xitemn[i]); @@ -749,13 +749,13 @@ Class BetaFlare : UnrealInventory 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); } override void Tick() { Super.Tick(); - if ( sting_flares ) return; + if ( sting_proto && sting_flares ) return; if ( Owner ) Owner.RemoveInventory(self); Destroy(); } @@ -2251,6 +2251,18 @@ Class SentryGunItem : UnrealInventory Inventory.PickupMessage "$I_OSENTRY"; 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 ) { if ( pickup ) return false; @@ -2399,6 +2411,11 @@ Class SentryGun : Actor override void Tick() { Super.Tick(); + if ( !sting_proto ) + { + Destroy(); + return; + } if ( !master && (rememberedplayer != -1) && playeringame[rememberedplayer] ) master = players[rememberedplayer].mo; } diff --git a/zscript/napalm.zsc b/zscript/napalm.zsc index 92a9737..138c674 100644 --- a/zscript/napalm.zsc +++ b/zscript/napalm.zsc @@ -11,6 +11,47 @@ Class FlameAmmo : Ammo Ammo.BackpackMaxAmount 900; 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 { Spawn: @@ -761,6 +802,47 @@ Class UFlamethrower : UnrealWeapon bool bCharging; 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() { return bCharging?min(5,int(chargesize+0.1)):-1, -1, false, false; diff --git a/zscript/olsmp.zsc b/zscript/olsmp.zsc index 506a64b..d7d7c48 100644 --- a/zscript/olsmp.zsc +++ b/zscript/olsmp.zsc @@ -114,6 +114,10 @@ Class OLSMP : UnrealWeapon 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 ) { Weapon weap = Weapon(invoker); diff --git a/zscript/peacemaker.zsc b/zscript/peacemaker.zsc index 36dc0dc..65af97e 100644 --- a/zscript/peacemaker.zsc +++ b/zscript/peacemaker.zsc @@ -8,6 +8,18 @@ Class PeaceAmmo : Ammo Ammo.BackpackAmount 0; 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 @@ -398,6 +410,18 @@ Class PeaceBarrel : Actor 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 ) { let weap = Weapon(invoker); diff --git a/zscript/quadshot.zsc b/zscript/quadshot.zsc index f2efbcf..4dd8b90 100644 --- a/zscript/quadshot.zsc +++ b/zscript/quadshot.zsc @@ -16,6 +16,47 @@ Class UShells : Ammo if ( PickupMsg.Length() > 0 ) return Super.PickupMessage(); 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 { Spawn: @@ -96,6 +137,48 @@ Class QuadShot : UnrealWeapon 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() { return ClipOut?-1:ClipCount, -1, (ClipCount<2), false; diff --git a/zscript/stunner.zsc b/zscript/stunner.zsc index c06721d..853ba3b 100644 --- a/zscript/stunner.zsc +++ b/zscript/stunner.zsc @@ -12,7 +12,7 @@ Class StunnerAmmo : Ammo } override void DoEffect() { - Super.Tick(); + Super.DoEffect(); if ( rechargespeed <= 0. ) rechargespeed = 2.; rechargephase += 1./rechargespeed; if ( rechargephase < 7 ) return; @@ -20,6 +20,18 @@ Class StunnerAmmo : Ammo rechargephase = 0; 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 @@ -272,6 +284,48 @@ Class Stunner : UnrealWeapon double chargesize, count; 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() { return bCharging?min(5,int(chargesize)):-1, -1, false, false; diff --git a/zscript/uarmoritems.zsc b/zscript/uarmoritems.zsc index 368f710..39ebe1a 100644 --- a/zscript/uarmoritems.zsc +++ b/zscript/uarmoritems.zsc @@ -250,6 +250,49 @@ Class PowerShield : UnrealArmor 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 ) { absorb = Clamp(Amount-50,25,100); diff --git a/zscript/unrealcommon.zsc b/zscript/unrealcommon.zsc index d91c06e..e9ae79a 100644 --- a/zscript/unrealcommon.zsc +++ b/zscript/unrealcommon.zsc @@ -183,15 +183,21 @@ Class UPlayer : UTPlayer { // force akimbo let t = FindInventory(type); - if ( t ) t.Amount = 2; - t.SetTag(StringTable.Localize("$T_AUTOMAG2")); + if ( t ) + { + t.Amount = 2; + t.SetTag(StringTable.Localize("$T_AUTOMAG2")); + } } else if ( (type is 'Betamag') && sting_protomags ) { // force akimbo let t = FindInventory(type); - if ( t ) t.Amount = 2; - t.SetTag(StringTable.Localize("$T_PROTOMAG2")); + if ( t ) + { + t.Amount = 2; + t.SetTag(StringTable.Localize("$T_PROTOMAG2")); + } } else if ( type is 'DispersionPistol' ) { @@ -952,29 +958,29 @@ Class UnrealMainHandler : EventHandler { if ( (e.Replacee == 'Chainsaw') || (e.Replacee == 'Gauntlets') ) { - if ( (sting_dubious || sting_olsmp) && !Random[Replacements](0,3) ) e.Replacement = 'WeaponPowerUp'; - else if ( Random[Replacements](0,2) ) + if ( ((sting_proto && sting_dubious) || sting_olsmp) && !Random[Replacements](0,sting_proto?3:1) ) e.Replacement = 'WeaponPowerUp'; + else if ( sting_proto && Random[Replacements](0,2) ) { if ( sting_dubious && Random[Replacements](0,1) ) e.Replacement = 'Bonesaw'; 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 if ( (e.Replacee == 'Fist') || (e.Replacee == 'Staff') ) e.Replacement = 'DispersionPistol'; 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 if ( (e.Replacee == 'Shotgun') || (e.Replacee == 'SuperShotgun') || (e.Replacee == 'Crossbow') ) { 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 switch( Random[Replacements](0,2) ) + else switch( Random[Replacements](0,sting_proto?2:1) ) { case 0: e.Replacement = 'Stinger'; @@ -994,7 +1000,7 @@ Class UnrealMainHandler : EventHandler } 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'; else e.Replacement = 'FlameGun'; @@ -1004,14 +1010,14 @@ Class UnrealMainHandler : EventHandler } 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 e.Replacement = 'UBioRifle'; } else if ( (e.Replacee == 'BFG9000') || (e.Replacee == 'Mace') ) { - if ( sting_olsmp && (!sting_dubious || Random[Replacements](0,1)) ) e.Replacement = 'OLSMP'; - else if ( sting_dubious ) + if ( sting_olsmp && (!sting_proto || !sting_dubious || Random[Replacements](0,1)) ) e.Replacement = 'OLSMP'; + else if ( sting_proto && sting_dubious ) { if ( Random[Replacements](0,1) ) e.Replacement = 'SMiniGun'; else e.Replacement = 'BigGun'; @@ -1033,7 +1039,7 @@ Class UnrealMainHandler : EventHandler else if ( (e.Replacee == 'Shell') || (e.Replacee == 'CrossbowAmmo') ) { 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: e.Replacement = 'StingerAmmo'; @@ -1048,7 +1054,7 @@ Class UnrealMainHandler : EventHandler } else if ( (e.Replacee == 'ShellBox') || (e.Replacee == 'CrossbowHefty') ) { - switch( Random[Replacements](0,2) ) + switch( Random[Replacements](0,sting_proto?2:1) ) { case 0: e.Replacement = 'StingerAmmo2'; @@ -1063,7 +1069,7 @@ Class UnrealMainHandler : EventHandler } 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) ) { 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') ) { - 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 e.Replacement = 'URocketAmmo'; } 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'; 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'; else e.Replacement = 'ImpalerAmmo2'; @@ -1106,12 +1112,12 @@ Class UnrealMainHandler : EventHandler } 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'; 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 ( Random[Replacements](0,1) ) e.Replacement = 'UBioAmmo'; else e.Replacement = 'URifleAmmo'; @@ -1120,13 +1126,17 @@ Class UnrealMainHandler : EventHandler else if ( (e.Replacee == 'Berserk') || (e.Replacee == 'ArtiTomeOfPower') ) { 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 if ( e.Replacee == 'ArtiEgg' ) e.Replacement = 'VoiceBox'; else if ( (e.Replacee == 'Soulsphere') || (e.Replacee == 'ArtiSuperHealth') ) e.Replacement = 'SuperHealth'; 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 == 'Infrared') || (e.Replacee == 'ArtiTorch') ) e.Replacement = 'UFlashlight'; 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 == '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 if ( (e.Replacee == 'HealthBonus') || (e.Replacee == 'CrystalVial') ) e.Replacement = 'Bandages'; @@ -1150,7 +1160,7 @@ Class UnrealMainHandler : EventHandler else if ( e.Replacee == 'ArtiTeleport' ) { // 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: e.Replacement = 'UnrealBackpack'; @@ -1208,6 +1218,19 @@ Class UnrealMainHandler : EventHandler else if ( e.Replacee is 'EnhancedShockAmmo' ) e.Replacement = 'UNothing'; else if ( e.Replacee is 'UTBackpack' ) e.Replacement = 'UnrealBackpack'; 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 else if ( e.Replacee is 'UTActivatable' ) e.Replacement = 'UNothing'; else if ( e.Replacee is 'UTActivatableHealth' ) e.Replacement = 'UNothing'; @@ -1218,9 +1241,9 @@ Class UnrealMainHandler : EventHandler { if ( flak_translocator ) players[e.playernumber].mo.TakeInventory("Translocator",1); - if ( sting_telegun ) + if ( sting_proto && sting_telegun ) 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("DarkFlare",1); @@ -1241,14 +1264,14 @@ Class UnrealMainHandler : EventHandler players[i].mo.TakeInventory("Translocator",1); } } - if ( sting_telegun ) + if ( sting_proto && sting_telegun ) { for ( int i=0; i