1.1 release:
- Hexen compatibility (Combiner Patch will be updated soon). - Environment Map shader fixes from Doom Tournament. - Buffed Stunner so it's actually useful. This goes against what the Unreal Bible indicated but whatever, the weapon would be useless otherwise. - "Superweapons" now have +ALWAYSPICKUP for consistency. - Sneaky Strife stuff: - Dispersion Pistol and Stunner have reduced alert radius. - Rename Peacemaker sprites to avoid conflict with peasant sprites.
This commit is contained in:
parent
693933ebfb
commit
1207748311
16 changed files with 339 additions and 281 deletions
|
|
@ -682,7 +682,8 @@ Class UnrealInventory : Inventory
|
|||
Super.AttachToOwner(other);
|
||||
if ( !Charge ) Charge = DefaultCharge;
|
||||
// it's annoying to set this per-subclass
|
||||
InterHubAmount = bUNLIMITEDCOPIES?int.max:MaxAmount;
|
||||
if ( !(gameinfo.gametype&GAME_Hexen) )
|
||||
InterHubAmount = bUNLIMITEDCOPIES?int.max:MaxAmount;
|
||||
}
|
||||
override bool HandlePickup( Inventory item )
|
||||
{
|
||||
|
|
@ -950,6 +951,52 @@ Class UNothing : Actor
|
|||
}
|
||||
}
|
||||
|
||||
Class HexenEitherOrSession : Thinker
|
||||
{
|
||||
Array<Class<Actor> > done;
|
||||
|
||||
private bool IsAvailable( Class<Actor> item )
|
||||
{
|
||||
let ti = ThinkerIterator.Create(item);
|
||||
Actor a;
|
||||
while ( a = Actor(ti.Next()) ) return true;
|
||||
for ( int i=0; i<done.Size(); i++ ) if ( done[i] == item ) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
void MarkDone( Class<Actor> item )
|
||||
{
|
||||
for ( int i=0; i<done.Size(); i++ ) if ( done[i] == item ) return;
|
||||
done.Push(item);
|
||||
}
|
||||
void MarkUnDone( Class<Actor> item )
|
||||
{
|
||||
for ( int i=0; i<done.Size(); i++ )
|
||||
{
|
||||
if ( done[i] != item ) continue;
|
||||
done.Delete(i);
|
||||
i--;
|
||||
}
|
||||
}
|
||||
|
||||
Class<Actor> EitherOr( Class<Actor> a, Class<Actor> b, bool allowed = true )
|
||||
{
|
||||
if ( !allowed ) return a;
|
||||
if ( IsAvailable(a) )
|
||||
{
|
||||
MarkDone(a);
|
||||
if ( IsAvailable(b) )
|
||||
{
|
||||
MarkDone(b);
|
||||
if ( Random[Replacements](0,1) ) return b;
|
||||
return a;
|
||||
}
|
||||
return b;
|
||||
}
|
||||
return a;
|
||||
}
|
||||
}
|
||||
|
||||
Class UnrealMainHandler : EventHandler
|
||||
{
|
||||
Array<AmmoUsedInSlot> AmmoSlots;
|
||||
|
|
@ -971,6 +1018,25 @@ Class UnrealMainHandler : EventHandler
|
|||
break;
|
||||
}
|
||||
}
|
||||
private bool IsAvailable( Class<Actor> item )
|
||||
{
|
||||
let ti = ThinkerIterator.Create(item);
|
||||
Actor a;
|
||||
while ( a = Actor(ti.Next()) ) return true;
|
||||
return false;
|
||||
}
|
||||
private Class<Actor> EitherOr( Class<Actor> a, Class<Actor> b, bool allowed = true )
|
||||
{
|
||||
let ti = ThinkerIterator.Create("HexenEitherOrSession",Thinker.STAT_STATIC);
|
||||
HexenEitherOrSession hs = HexenEitherOrSession(ti.Next());
|
||||
if ( !hs )
|
||||
{
|
||||
hs = new("HexenEitherOrSession");
|
||||
hs.ChangeStatNum(Thinker.STAT_STATIC);
|
||||
hs.done.Clear();
|
||||
}
|
||||
return hs.EitherOr(a,b,allowed);
|
||||
}
|
||||
override void CheckReplacement( ReplaceEvent e )
|
||||
{
|
||||
if ( e.IsFinal ) return;
|
||||
|
|
@ -1140,16 +1206,16 @@ Class UnrealMainHandler : EventHandler
|
|||
else if ( Random[Replacements](0,1) ) e.Replacement = 'UBioAmmo';
|
||||
else e.Replacement = 'URifleAmmo';
|
||||
}
|
||||
else if ( (e.Replacee == 'InvulnerabilitySphere') || (e.Replacee == 'ArtiInvulnerability') ) e.Replacement = 'PowerShield';
|
||||
else if ( (e.Replacee == 'InvulnerabilitySphere') || (e.Replacee == 'ArtiInvulnerability') || (e.Replacee == 'ArtiInvulnerability2') ) e.Replacement = 'PowerShield';
|
||||
else if ( (e.Replacee == 'Berserk') || (e.Replacee == 'ArtiTomeOfPower') )
|
||||
{
|
||||
if ( sting_msentry && !Random[Replacements](0,9) ) e.Replacement = 'SentryItem';
|
||||
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 == 'ArtiEgg') || (e.Replacee == 'ArtiPork') ) 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 == 'Megasphere') || (e.Replacee == 'ArtiBoostArmor') ) e.Replacement = 'ShieldBelt';
|
||||
else if ( (e.Replacee == 'Allmap') || (e.Replacee == 'SuperMap') )
|
||||
{
|
||||
if ( sting_proto && Random[Replacements](0,2) ) e.Replacement = 'MotionDetector';
|
||||
|
|
@ -1158,16 +1224,18 @@ Class UnrealMainHandler : EventHandler
|
|||
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';
|
||||
else if ( e.Replacee == 'ArtiFly' ) e.Replacement = 'UJumpBoots';
|
||||
else if ( (e.Replacee == 'Backpack') || (e.Replacee == 'BagOfHolding') ) e.Replacement = 'UnrealBackpack';
|
||||
else if ( (e.Replacee == 'ArmorBonus') || (e.Replacee == 'ArtiTimeBomb') )
|
||||
else if ( (e.Replacee == 'ArtiFly') || (e.Replacee == 'ArtiSpeedBoots') ) e.Replacement = 'UJumpBoots';
|
||||
else if ( (e.Replacee == 'Backpack') || (e.Replacee == 'BagOfHolding') || (e.Replacee == 'ArtiHealingRadius') ) e.Replacement = 'UnrealBackpack';
|
||||
else if ( (e.Replacee == 'ArmorBonus') || (e.Replacee == 'ArtiTimeBomb') || (e.Replacee is 'ArtiPoisonBag') || (e.Replacee is 'ArtiBlastRadius') )
|
||||
{
|
||||
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';
|
||||
else if ( (e.Replacee == 'GreenArmor') || (e.Replacee == 'Silvershield') ) e.Replacement = 'KevlarSuit';
|
||||
else if ( (e.Replacee == 'BlueArmor') || (e.Replacee == 'EnchantedShield') ) e.Replacement = 'UArmor';
|
||||
else if ( (e.Replacee == 'GreenArmor') || (e.Replacee == 'Silvershield') || (e.Replacee == 'PlatinumHelm') ) e.Replacement = 'KevlarSuit';
|
||||
else if ( (e.Replacee == 'BlueArmor') || (e.Replacee == 'EnchantedShield') || (e.Replacee == 'MeshArmor') ) e.Replacement = 'UArmor';
|
||||
else if ( e.Replacee == 'AmuletOfWarding' ) e.Replacement = 'AsbestosSuit';
|
||||
else if ( e.Replacee == 'FalconShield' ) e.Replacement = 'ToxinSuit';
|
||||
else if ( (e.Replacee == 'Stimpack') || (e.Replacee == 'ArtiHealth') )
|
||||
{
|
||||
if ( Random[Replacements](0,1) ) e.Replacement = 'UHealth';
|
||||
|
|
@ -1175,7 +1243,7 @@ Class UnrealMainHandler : EventHandler
|
|||
else e.Replacement = 'Seeds';
|
||||
}
|
||||
else if ( e.Replacee == 'Medikit' ) e.Replacement = 'UHealth';
|
||||
else if ( e.Replacee == 'ArtiTeleport' )
|
||||
else if ( (e.Replacee == 'ArtiTeleport') || (e.Replacee == 'ArtiTeleportOther') || (e.Replacee == 'ArtiDarkServant') )
|
||||
{
|
||||
// I have no idea what to replace this with, so just have some random stuff
|
||||
switch( Random[Replacements](0,sting_proto?7:5) )
|
||||
|
|
@ -1207,6 +1275,40 @@ Class UnrealMainHandler : EventHandler
|
|||
}
|
||||
}
|
||||
else if ( e.Replacee == 'TeleportFog' ) e.Replacement = 'UTeleportFog';
|
||||
// Doomreal's weapon progression for Hexen is a bit more... involved when it comes to including proto content
|
||||
else if ( (e.Replacee == 'FWeapFist') || (e.Replacee == 'CWeapMace') || (e.Replacee == 'MWeapWand') )
|
||||
e.Replacement = 'DispersionPistol';
|
||||
else if ( e.Replacee == 'FWeapAxe' ) e.Replacement = EitherOr('Automag','Betamag',sting_proto);
|
||||
else if ( e.Replacee == 'CWeapStaff' ) e.Replacement = EitherOr('Stinger','Quadshot',sting_proto);
|
||||
else if ( e.Replacee == 'MWeapFrost' ) e.Replacement = EitherOr('ASMD','Stunner',sting_proto);
|
||||
else if ( (e.Replacee == 'FWeaponPiece3') || (e.Replacee == 'FWeapQuietus') || (e.Replacee.GetClassName() == 'mkFullQuietus') ) e.Replacement = 'Eightball';
|
||||
else if ( e.Replacee == 'CWeaponPiece3' ) e.Replacement = 'WeaponPowerUp';
|
||||
else if ( e.Replacee == 'MWeaponPiece3' ) e.Replacement = EitherOr('Automag','Betamag',sting_proto);
|
||||
else if ( e.Replacee == 'FWeapHammer' ) e.Replacement = EitherOr('UFlakCannon','FlameGun',sting_proto);
|
||||
else if ( e.Replacee == 'CWeapFlame' ) e.Replacement = EitherOr('Razorjack','UFlamethrower',sting_proto);
|
||||
else if ( e.Replacee == 'MWeapLightning' ) e.Replacement = EitherOr('UBioRifle','Impaler',sting_proto);
|
||||
else if ( e.Replacee == 'FWeaponPiece2' )
|
||||
{
|
||||
if ( sting_proto && sting_dubious ) e.Replacement = 'Bonesaw';
|
||||
else e.Replacement = 'WeaponPowerUp';
|
||||
}
|
||||
else if ( (e.Replacee == 'CWeaponPiece2') || (e.Replacee == 'CWeapWraithverge') || (e.Replacee.GetClassName() == 'mkFullWraithverge') ) e.Replacement = 'URifle';
|
||||
else if ( e.Replacee == 'MWeaponPiece2' ) e.Replacement = 'WeaponPowerUp';
|
||||
else if ( e.Replacee == 'FWeaponPiece1' )
|
||||
{
|
||||
if ( sting_proto && sting_dubious ) e.Replacement = 'BigGun';
|
||||
else e.Replacement = 'UnrealBackpack';
|
||||
}
|
||||
else if ( e.Replacee == 'CWeaponPiece1' )
|
||||
{
|
||||
if ( sting_proto && sting_dubious ) e.Replacement = 'SMiniGun';
|
||||
else e.Replacement = 'UnrealBackpack';
|
||||
}
|
||||
else if ( (e.Replacee == 'MWeaponPiece1') || (e.Replacee == 'MWeapBloodscourge') || (e.Replacee.GetClassName() == 'mkFullBloodscourge') )
|
||||
{
|
||||
if ( sting_olsmp ) e.Replacement = 'OLSMP';
|
||||
else e.Replacement = 'UnrealBackpack';
|
||||
}
|
||||
// replace UT items (prevents them from being cheated in)
|
||||
else if ( e.Replacee is 'ImpactHammer' ) e.Replacement = 'DispersionPistol';
|
||||
else if ( e.Replacee is 'Translocator' ) e.Replacement = 'UTranslocator';
|
||||
|
|
@ -1252,7 +1354,7 @@ Class UnrealMainHandler : EventHandler
|
|||
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';
|
||||
else if ( e.Replacee is 'UTActivatable' ) e.Replacement = 'UNothing';
|
||||
else if ( (e.Replacee is 'UTActivatable') && (!(e.Replacee is 'ActUTFullAmmoBox') || !(gameinfo.gametype&GAME_Hexen)) ) e.Replacement = 'UNothing';
|
||||
else if ( e.Replacee is 'UTActivatableHealth' ) e.Replacement = 'UNothing';
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue