stinger_m/zscript/uarmoritems.zsc
Marisa Kirisame 0cb76eb03a Beta 5.
- [flak_m] Implement particle meshes.
- Append heal amount to health pickups (excl. superhealth).
- Armor Bonus item.
- Overhaul Stinger explosive charge behaviour, more in line with 0.83 and the novels.
- Fix: Dispersion Pistol should only have infinite ammo in deathmatch.
- Dispersion Pistol altfire always at level 0 if below 10 ammo.
- More Fireblaster tweaks and touches and whatnot. Now fires in 3 bursts of 3 projectiles. And there's more damage and whatnot, it should stop sucking.
- Capped fire effects for huge actors.
- Reduced flames per tic on Flamethrower, to see if this causes less performance issues. May roll back if this was a bad idea.
- Snuck in some longer versions of a couple player sounds.
- [oldsounds] Added higher quality dispersion pistol select sound.
2019-10-02 18:04:18 +02:00

278 lines
6 KiB
Text

Class UnrealArmor : UTArmor
{
int priority;
Property AbsorptionPriority : priority;
Default
{
-INVENTORY.ALWAYSPICKUP;
UnrealArmor.AbsorptionPriority 0;
}
override void AttachToOwner( Actor other )
{
Super.AttachToOwner(other);
// find last armor that's better than us
Inventory found = null;
for ( Inventory i=other.Inv; i; i=i.Inv )
{
if ( !(i is 'UnrealArmor') || (i == self) || (UnrealArmor(i).priority < priority) ) continue;
found = i;
}
if ( !found ) return;
// place ourselves right after it
Inventory saved = found.Inv;
found.Inv = self;
other.Inv = Inv;
Inv = saved;
}
}
Class UArmor : UnrealArmor
{
Default
{
Tag "$T_UARMOR";
Inventory.Amount 100;
Inventory.MaxAmount 100;
Inventory.InterHubAmount 100;
UTArmor.ArmorAbsorption 90;
UnrealArmor.AbsorptionPriority 7;
Inventory.PickupMessage "$I_UARMOR";
Inventory.PickupSound "misc/u1armor";
Inventory.Icon "I_Armor";
}
States
{
Spawn:
UARM A -1;
Stop;
}
}
Class AsbestosSuit : UnrealArmor
{
Default
{
Tag "$T_ASBSUIT";
Inventory.Amount 50;
Inventory.MaxAmount 50;
Inventory.InterHubAmount 50;
UTArmor.ArmorAbsorption 50;
UnrealArmor.AbsorptionPriority 6;
Inventory.PickupMessage "$I_ASBSUIT";
Inventory.PickupSound "misc/suit";
Inventory.Icon "I_Suit";
}
override void AbsorbDamage( int damage, Name damageType, out int newdamage )
{
if ( (damageType == 'Fire') || (damageType == 'Ice') ) damage = newdamage = 0;
Super.AbsorbDamage(damage,damageType,newdamage);
}
override void AttachToOwner( Actor other )
{
// remove other suits
Inventory i = other.FindInventory("ToxinSuit");
if ( i ) other.RemoveInventory(i);
i = other.FindInventory("KevlarSuit");
if ( i ) other.RemoveInventory(i);
Super.AttachToOwner(other);
}
States
{
Spawn:
ASBS A -1;
Stop;
}
}
Class ToxinSuit : UnrealArmor
{
Default
{
Tag "$T_TOXSUIT";
Inventory.Amount 50;
Inventory.MaxAmount 50;
Inventory.InterHubAmount 50;
UTArmor.ArmorAbsorption 50;
UnrealArmor.AbsorptionPriority 6;
Inventory.PickupMessage "$I_TOXSUIT";
Inventory.PickupSound "misc/suit";
Inventory.Icon "I_TSuit";
}
override void AbsorbDamage( int damage, Name damageType, out int newdamage )
{
if ( damageType == 'Slime' ) damage = newdamage = 0;
Super.AbsorbDamage(damage,damageType,newdamage);
}
override void AttachToOwner( Actor other )
{
Super.AttachToOwner(other);
// remove other suits
Inventory i = other.FindInventory("AsbestosSuit");
if ( i ) other.RemoveInventory(i);
i = other.FindInventory("KevlarSuit");
if ( i ) other.RemoveInventory(i);
}
States
{
Spawn:
TOXS A -1;
Stop;
}
}
Class KevlarSuit : UnrealArmor
{
Default
{
Tag "$T_KEVSUIT";
Inventory.Amount 100;
Inventory.MaxAmount 100;
Inventory.InterHubAmount 100;
UTArmor.ArmorAbsorption 80;
UnrealArmor.AbsorptionPriority 6;
Inventory.PickupMessage "$I_KEVSUIT";
Inventory.PickupSound "misc/suit";
Inventory.Icon "I_Kevlar";
}
override void AttachToOwner( Actor other )
{
Super.AttachToOwner(other);
// remove other suits
Inventory i = other.FindInventory("AsbestosSuit");
if ( i ) other.RemoveInventory(i);
i = other.FindInventory("ToxinSuit");
if ( i ) other.RemoveInventory(i);
}
States
{
Spawn:
KEVS A -1;
Stop;
}
}
Class ShieldBelt : UnrealArmor
{
override void AbsorbDamage( int damage, Name damageType, out int newdamage )
{
if ( (damage > 0) && (amount > 0) && !DamageTypeDefinition.IgnoreArmor(damageType) )
{
Owner.A_PlaySound("belt/absorb",CHAN_7);
UTMainHandler.DoFlash(Owner,Color(80,255,224,0),5);
}
int oldamt = amount;
Super.AbsorbDamage(damage,damageType,newdamage);
if ( (oldamt > 0) && (amount <= 0) && Owner.CheckLocalView() ) Console.Printf(StringTable.Localize("$D_SHIELDBELT"));
}
Default
{
Tag "$T_SHIELDBELT";
+COUNTITEM;
+INVENTORY.BIGPOWERUP;
+INVENTORY.ALWAYSPICKUP;
Inventory.Amount 100;
Inventory.MaxAmount 100;
Inventory.InterHubAmount 100;
UTArmor.ArmorAbsorption 100;
UnrealArmor.AbsorptionPriority 10;
Inventory.PickupMessage "$I_SHIELDBELT";
Inventory.PickupSound "belt/pickup";
Inventory.RespawnTics 2100;
Inventory.Icon "I_Shield";
}
States
{
Spawn:
BELT A -1;
Stop;
}
}
Class PowerShield : UnrealArmor
{
bool gothit;
override void AbsorbDamage( int damage, Name damageType, out int newdamage )
{
if ( (damage > 0) && (amount > 0) && !DamageTypeDefinition.IgnoreArmor(damageType) )
{
Owner.A_PlaySound("belt/absorb",CHAN_7);
UTMainHandler.DoFlash(Owner,Color(80,224,0,255),5);
gothit = true;
}
int oldamt = amount;
amount = int.max; // blocks all damage
Super.AbsorbDamage(damage,damageType,newdamage);
amount = oldamt; // does not drain here
}
override void Tick()
{
Super.Tick();
if ( !Owner || !Owner.player ) return;
if ( gothit )
{
amount--;
gothit = false;
}
if ( !(level.maptime%15) && !sting_pshield ) amount--;
if ( amount <= 0 )
{
if ( Owner.CheckLocalView() ) Console.Printf(StringTable.Localize("$D_POWERSHIELD"));
DepleteOrDestroy();
}
}
Default
{
Tag "$T_POWERSHIELD";
+COUNTITEM;
+INVENTORY.BIGPOWERUP;
+INVENTORY.ALWAYSPICKUP;
Inventory.Amount 200;
Inventory.MaxAmount 200;
Inventory.InterHubAmount 200;
UTArmor.ArmorAbsorption 100;
UnrealArmor.AbsorptionPriority 11; // wow dude
Inventory.PickupMessage "$I_POWERSHIELD";
Inventory.PickupSound "sbelt/pickup";
Inventory.RespawnTics 3500;
Inventory.Icon "I_PBelt";
}
States
{
Spawn:
BELT A -1;
Stop;
}
}
Class UArmorBonus : UArmor
{
override void AbsorbDamage( int damage, Name damageType, out int newdamage )
{
absorb = Clamp(Amount-50,25,100);
Super.AbsorbDamage(damage,damageType,newdamage);
}
Default
{
Tag "$T_ARMORBONUS";
+COUNTITEM;
+INVENTORY.ALWAYSPICKUP;
Inventory.Amount 5;
Inventory.MaxAmount 200;
Inventory.InterHubAmount 200;
UTArmor.ArmorAbsorption 25;
UnrealArmor.AbsorptionPriority 1;
Inventory.PickupMessage "$I_ARMORBONUS";
Inventory.PickupSound "misc/u1armor";
Inventory.Icon "I_Bonus";
}
States
{
Spawn:
XANH A -1;
Stop;
}
}