Oh boy, it begins.

Assigned all pickup models.
Implemented all ammo types.
Finished Flak Cannon.
Additional cleanup.
Slot reassignments and other adjustments to match known Unreal prototype info.
This commit is contained in:
Marisa the Magician 2019-09-04 02:37:59 +02:00
commit 912cad96c5
71 changed files with 1949 additions and 73 deletions

View file

@ -290,20 +290,25 @@ Class ViewASMDSpark : ShockSpark
Class ASMDHitbox : ShockHitbox
{
Default
override void Tick()
{
Health 1;
+SHOOTABLE;
+NOBLOOD;
}
override void Die( Actor source, Actor inflictor, int dmgflags, Name MeansOfDeath )
{
if ( target && target.InStateSequence(target.CurState,target.FindState("Spawn")) )
Super.Tick();
if ( !target ) return;
let t = ThinkerIterator.Create("ASMDHitbox");
Actor a;
while ( a = Actor(t.Next()) )
{
target.bAMBUSH = true;
target.ExplodeMissile();
if ( (a == self) || !(a is 'ASMDHitbox') || a.bAMBUSH || (Distance3D(a) > radius*2) ) continue;
a.bAMBUSH = true;
if ( a.target && a.target.InStateSequence(a.target.CurState,a.target.FindState("Spawn")) )
a.target.ExplodeMissile();
if ( !bAMBUSH )
{
bAMBUSH = true;
if ( target && target.InStateSequence(target.CurState,target.FindState("Spawn")) )
target.ExplodeMissile();
}
}
Super.Die(source,inflictor,dmgflags,MeansOfDeath);
}
}
@ -534,6 +539,8 @@ Class ASMDBeam : Actor
UTMainHandler.DoSwing(target,(FRandom[ASMD](-0.1,-0.6),FRandom[ASMD](-0.1,0.5)),10,-2,3,SWING_Spring,3,6);
}
let b = t.Results.HitActor.target;
b.bAMBUSH = true;
b.ExplodeMissile();
b.pitch = 90;
b.angle = 0;
b.roll = 0;

View file

@ -38,6 +38,11 @@ Class Automag : UnrealWeapon
}
return Super.HandlePickup(item);
}
override String PickupMessage()
{
if ( Owner ) return Super.PickupMessage();
return StringTable.Localize("$I_AUTOMAG2");
}
override Inventory CreateTossable( int amt )
{
Inventory inv = Super.CreateTossable(amt);

View file

@ -1,3 +1,29 @@
Class Betamag : UnrealWeapon
{
Default
{
Tag "$T_BETAMAG";
Inventory.Icon "I_ClipAm";
Inventory.PickupMessage "$I_BETAMAG";
Inventory.MaxAmount 1;
Inventory.InterHubAmount 2;
Weapon.UpSound "betamag/select";
Weapon.SlotNumber 2;
Weapon.SelectionOrder 1;
Weapon.AmmoType "UMiniAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "UMiniAmmo";
Weapon.AmmoUse2 1;
Weapon.AmmoGive 20;
Weapon.Kickback 320;
UTWeapon.DropAmmo 10;
}
States
{
Spawn:
AUTP A -1;
Stop;
AUTP B -1;
Stop;
}
}

View file

@ -1,11 +1,79 @@
Class BigAmmo : Ammo
{
Default
{
Tag "$T_BIGAMMO";
Inventory.Icon "I_BigM";
Inventory.PickupMessage "";
Inventory.Amount 10;
Inventory.MaxAmount 30;
Ammo.BackpackAmount 0;
Ammo.BackpackMaxAmount 60;
Ammo.DropAmount 10;
Inventory.RespawnTics 2100;
+INVENTORY.IGNORESKILL;
}
override String PickupMessage()
{
if ( PickupMsg.Length() > 0 ) return Super.PickupMessage();
return String.Format("%s%d%s",StringTable.Localize("$I_BIGAMMOL"),Amount,StringTable.Localize("$I_BIGAMMOR"));
}
States
{
Spawn:
BIGA A -1;
Stop;
}
}
Class BigAmmo2 : BigAmmo
{
Default
{
Tag "$T_BIGAMMO2";
Inventory.Amount 3;
Ammo.DropAmount 3;
+INVENTORY.IGNORESKILL;
}
}
Class BigAmmo3 : BigAmmo
{
Default
{
Tag "$T_BIGAMMO3";
Inventory.PickupMessage "$I_BIGAMMO3";
Inventory.Amount 1;
Ammo.DropAmount 1;
+INVENTORY.IGNORESKILL;
}
}
Class BigGun : UnrealWeapon
{
Default
{
Tag "$T_BIGGUN";
Inventory.PickupMessage "$I_BIGGUN";
Weapon.UpSound "big/select";
Weapon.SlotNumber 0;
Weapon.SelectionOrder 0;
Weapon.AmmoType "BigAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "BigAmmo";
Weapon.AmmoUse2 1;
Weapon.AmmoGive 10;
Inventory.RespawnTics 2100;
+INVENTORY.IGNORESKILL;
+WEAPON.NOAUTOFIRE;
UTWeapon.DropAmmo 5;
}
States
{
Spawn:
BIGP A -1;
Stop;
BIGP B -1;
Stop;
}
}

View file

@ -1,3 +1,22 @@
Class Bonesaw : UnrealWeapon
{
Default
{
Tag "$T_BONESAW";
Inventory.PickupMessage "$I_BONESAW";
Weapon.UpSound "bonesaw/select";
Weapon.SlotNumber 1;
Weapon.SelectionOrder 9;
+WEAPON.MELEEWEAPON;
+FORCEPAIN;
+NOEXTREMEDEATH;
}
States
{
Spawn:
CSWP A -1;
Stop;
CSWP B -1;
Stop;
}
}

View file

@ -18,19 +18,16 @@ Class WeaponPowerUp : Inventory
damo.Amount = min(damo.MaxAmount,damo.Amount+10);
}
let dpis = DispersionPistol(toucher.FindInventory("DispersionPistol"));
if ( dpis && (dpis.upgradelevel < 4) )
if ( dpis && (dpis.pendingupgrade < 4) )
{
dpis.pendingupgrade++;
if ( toucher.player && (toucher.player.ReadyWeapon == dpis) && (toucher.player.PendingWeapon == WP_NOCHANGE) )
{
dpis.upgradelevel++;
let psp = toucher.player.FindPSprite(PSP_Weapon);
psp.SetState(dpis.FindState("Upgrade"));
}
else
{
dpis.pendingupgrade = true;
ScriptUtil.SetWeapon(toucher,"DispersionPistol");
if ( toucher.player.WeaponState&WF_WEAPONREADY )
psp.SetState(dpis.FindState("Upgrade"));
}
else ScriptUtil.SetWeapon(toucher,"DispersionPistol");
}
GoAwayAndDie();
return true;
@ -478,8 +475,7 @@ Class DispLight5 : EnforcerLight
Class DispersionPistol : UnrealWeapon
{
int upgradelevel;
bool pendingupgrade;
int upgradelevel, pendingupgrade;
double chargesize, count;
bool bCharging;
int MainUse, ChargeUse;
@ -725,12 +721,8 @@ Class DispersionPistol : UnrealWeapon
Idle:
#### # 0
{
if ( invoker.pendingupgrade )
{
invoker.pendingupgrade = false;
invoker.upgradelevel++;
if ( invoker.pendingupgrade > invoker.upgradelevel )
return ResolveState("Upgrade");
}
A_Overlay(-9999,"Dummy");
if ( invoker.upgradelevel == 0 ) return ResolveState("Idle1");
else if ( invoker.upgradelevel == 1 ) return ResolveState("Idle2");
@ -845,10 +837,11 @@ Class DispersionPistol : UnrealWeapon
DPI5 A 6;
Goto Idle;
Upgrade:
#### # 0
#### # 1
{
A_Overlay(-9999,"Null");
invoker.MainUse = min(6,invoker.upgradelevel+1);
invoker.upgradelevel++;
if ( invoker.upgradelevel == 0 ) return ResolveState("Idle");
else if ( invoker.upgradelevel == 1 ) return ResolveState("Upgrade1");
else if ( invoker.upgradelevel == 2 ) return ResolveState("Upgrade2");

View file

@ -1,3 +1,25 @@
Class FlameGun : UnrealWeapon
{
Default
{
Tag "$T_FLAMEGUN";
Inventory.PickupMessage "$I_FLAMEGUN";
Weapon.UpSound "flamegun/select";
Weapon.SlotNumber 5;
Weapon.SelectionOrder 2;
Weapon.AmmoType "FlameAmmo";
Weapon.AmmoUse 10;
Weapon.AmmoType2 "FlameAmmo";
Weapon.AmmoUse2 20;
Weapon.AmmoGive 100;
UTWeapon.DropAmmo 25;
}
States
{
Spawn:
FGNP A -1;
Stop;
FGNP B -1;
Stop;
}
}

View file

@ -1,7 +1,40 @@
Class SMiniAmmo : Ammo
{
Default
{
Inventory.Icon "I_SMini";
Inventory.Amount 4;
Inventory.MaxAmount 16;
Ammo.BackpackAmount 0;
Ammo.BackpackMaxAmount 32;
}
}
Class SMiniGun : UnrealWeapon
{
Default
{
Tag "$T_SMINI";
Inventory.PickupMessage "$I_SMINI";
Weapon.UpSound "smini/select";
Weapon.SlotNumber 0;
Weapon.SelectionOrder 1;
Weapon.AmmoType "SMiniAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "SMiniAmmo";
Weapon.AmmoUse2 4;
Weapon.AmmoGive 8;
Inventory.RespawnTics 2100;
+INVENTORY.IGNORESKILL;
+WEAPON.NOAUTOFIRE;
UTWeapon.DropAmmo 4;
}
States
{
Spawn:
SMIP A -1;
Stop;
SMIP B -1;
Stop;
}
}

View file

@ -1,10 +1,73 @@
Class ImpalerAmmo : Ammo
{
Default
{
Tag "$T_IMPAMMO";
Inventory.Icon "I_Impale";
Inventory.PickupMessage "$T_IMPAMMO";
Inventory.Amount 3;
Inventory.MaxAmount 15;
Ammo.BackpackAmount 3;
Ammo.BackpackMaxAmount 30;
Ammo.DropAmount 3;
+INVENTORY.IGNORESKILL;
}
States
{
Spawn:
IAMO A -1;
Stop;
}
}
Class ImpalerAmmo2 : ImpalerAmmo
{
Default
{
Tag "$T_IMPAMMO2";
Inventory.PickupMessage "$T_IMPAMMO2";
Inventory.Amount 1;
Ammo.DropAmount 1;
+INVENTORY.IGNORESKILL;
}
}
Class ImpalerCharge : Ammo
{
Default
{
Inventory.Amount 100;
Inventory.MaxAmount 100;
Ammo.BackpackAmount 0;
Ammo.BackpackMaxAmount 100;
+INVENTORY.IGNORESKILL;
}
}
Class Impaler : UnrealWeapon
{
Default
{
Tag "$T_IMPALER";
Inventory.PickupMessage "$I_IMPALER";
Weapon.UpSound "impaler/select";
Weapon.SlotNumber 7;
Weapon.SelectionOrder 0;
Weapon.AmmoType "ImpalerAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "ImpalerCharge";
Weapon.AmmoUse2 1;
Weapon.AmmoGive1 60;
Weapon.AmmoGive2 0;
UTWeapon.DropAmmo 30;
+WEAPON.AMMO_OPTIONAL;
+WEAPON.ALT_AMMO_OPTIONAL;
}
States
{
Spawn:
IMPP A -1;
Stop;
IMPP B -1;
Stop;
}
}

View file

@ -708,14 +708,31 @@ Class BetaFlare : UnrealInventory
if ( !sting_flares ) return false; // not allowed
return Super.TryPickup(toucher);
}
Default
{
Inventory.MaxAmount 1;
UnrealInventory.Charge 100;
+INVENTORY.UNDROPPABLE;
+INVENTORY.UNTOSSABLE;
}
}
Class LightFlare : BetaFlare
{
Default
{
Tag "$T_LFLARES";
Inventory.Icon "I_FlarBL";
}
}
Class DarkFlare : BetaFlare
{
Default
{
Tag "$T_DFLARES";
Inventory.Icon "I_FlarBD";
}
}
Class Dampener : UnrealInventory
@ -907,16 +924,101 @@ Class ForcefieldEffect : Actor
Class UFlashlight : UnrealInventory
{
Actor lt[3];
Default
{
Tag "$T_FLASHLIGHT";
Inventory.Icon "I_Flashl";
Inventory.MaxAmount 3;
Inventory.PickupMessage "$I_FLASHLIGHT";
UnrealInventory.Charge 2800;
}
States
{
Spawn:
SLIT A -1;
Stop;
}
}
Class USearchlight : UnrealInventory
Class USearchlight : UFlashlight
{
Default
{
Tag "$T_SEARCHLIGHT";
Inventory.Icon "I_BigFl";
Inventory.MaxAmount 1;
Inventory.PickupMessage "$I_SEARCHLIGHT";
Inventory.RespawnTics 1050;
UnrealInventory.Charge 70000;
}
}
Class SentryItem : UnrealInventory
{
Default
{
Tag "$T_SENTRY";
Inventory.Icon "I_Sentry";
Inventory.MaxAmount 1;
Inventory.PickupMessage "$I_SENTRY";
Inventory.RespawnTics 1050;
UnrealInventory.Charge 300;
}
States
{
Spawn:
SENT A -1;
Stop;
}
}
// The "head" of the sentry, attaches to the body
Class MinigunSentry : Actor
{
States
{
Spawn:
SENT A 15;
SENT A 0 A_PlaySound("sentry/raise");
SENR ABCDEFGHIJKLMNO 3;
Goto Idle;
Idle:
SENI A 1;
Wait;
Fire:
SENW ABCDEFGHIJKLMNOPQR 1;
Goto FireLoop;
FireLoop:
SENF ABCDEFGHIJKLMNOPQR 1;
Loop;
FireEnd:
SENU ABCDEFGHIJKLMNOPQR 1;
Goto Idle;
}
}
// The body of the sentry
Class MinigunSentryBase : Actor
{
States
{
Spawn:
SENT A 15;
SENR ABCDEFGHIJKLMNO 3;
Goto Idle;
Idle:
SENI A 1;
Wait;
Fire:
SENW ABCDEFGHIJKLMNOPQR 1;
Goto FireLoop;
FireLoop:
SENF ABCDEFGHIJKLMNOPQR 1;
Loop;
FireEnd:
SENU ABCDEFGHIJKLMNOPQR 1;
Goto Idle;
}
}

View file

@ -1,7 +1,50 @@
Class FlameAmmo : Ammo
{
Default
{
Tag "$T_FLAMEAMMO";
Inventory.Icon "I_Napalm";
Inventory.PickupMessage "$I_FLAMEAMMO";
Inventory.Amount 75;
Inventory.MaxAmount 450;
Ammo.BackpackAmount 0;
Ammo.BackpackMaxAmount 900;
Ammo.DropAmount 30;
}
States
{
Spawn:
FLMA A -1;
Stop;
}
}
Class UFlamethrower : UnrealWeapon
{
Default
{
Tag "$T_FLAMETHROWER";
Inventory.PickupMessage "$I_FLAMETHROWER";
Weapon.UpSound "flamet/select";
Weapon.SlotNumber 6;
Weapon.SelectionOrder 4;
Weapon.AmmoType "FlameAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "FlameAmmo";
Weapon.AmmoUse2 30;
Weapon.AmmoGive 100;
UTWeapon.DropAmmo 50;
}
States
{
Spawn:
FLMP A 1 A_JumpIf(sting_flamet,2);
Wait;
FLMP B 1 A_JumpIf(sting_flamet,2);
Wait;
OFLP A 1 A_JumpIf(!sting_flamet,"Spawn");
Wait;
OFLP B 1 A_JumpIf(!sting_flamet,"Spawn+1");
Wait;
}
}

View file

@ -1,7 +1,35 @@
Class PeaceAmmo : Ammo
{
Default
{
Inventory.Icon "I_Peace";
Inventory.Amount 1;
Inventory.MaxAmount 8;
Ammo.BackpackAmount 0;
Ammo.BackpackMaxAmount 16;
}
}
Class Peacemaker : UnrealWeapon
{
Default
{
Tag "$T_PEACE";
Inventory.PickupMessage "$I_PEACE";
Weapon.UpSound "peace/select";
Weapon.SlotNumber 8;
Weapon.SelectionOrder 1;
Weapon.AmmoType "PeaceAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoGive 1;
UTWeapon.DropAmmo 1;
}
States
{
Spawn:
PEAP A -1;
Stop;
PEAP B -1;
Stop;
}
}

View file

@ -1,11 +1,63 @@
Class UShells : Ammo
{
Default
{
Tag "$T_SHELLS";
Inventory.Icon "I_ShotSh";
Inventory.PickupMessage "";
Inventory.Amount 12;
Inventory.MaxAmount 60;
Ammo.BackpackAmount 12;
Ammo.BackpackMaxAmount 120;
Ammo.DropAmount 6;
}
override String PickupMessage()
{
if ( PickupMsg.Length() > 0 ) return Super.PickupMessage();
return String.Format("%s%d%s",StringTable.Localize("$I_SHELLSL"),Amount,StringTable.Localize("$I_SHELLSR"));
}
States
{
Spawn:
QAMO A -1;
Stop;
}
}
Class UShells2 : UShells
{
Default
{
Tag "$T_SHELLS2";
Inventory.Amount 4;
Ammo.DropAmount 4;
+INVENTORY.IGNORESKILL;
}
}
Class QuadShot : UnrealWeapon
{
Default
{
Tag "$T_QUADSHOT";
Inventory.PickupMessage "$I_QUADSHOT";
Weapon.UpSound "quadshot/select";
Weapon.SlotNumber 3;
Weapon.SelectionOrder 2;
Weapon.AmmoType "UShells";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "UShells";
Weapon.AmmoUse2 1;
Weapon.AmmoGive 20;
Weapon.Kickback 320;
UTWeapon.DropAmmo 10;
}
States
{
Spawn:
QUAP A -1;
Stop;
QUAP B -1;
Stop;
}
}

View file

@ -1,7 +1,51 @@
Class RazorAmmo : Ammo
{
Default
{
Tag "$T_RIPPERAMMO";
Inventory.Icon "I_RazorA";
Inventory.PickupMessage "$I_RIPPERAMMO";
Inventory.Amount 25;
Inventory.MaxAmount 75;
Ammo.BackpackAmount 20;
Ammo.BackpackMaxAmount 150;
Ammo.DropAmount 15;
}
States
{
Spawn:
BHOP A 8 A_CheckProximity(1,"PlayerPawn",80,1,CPXF_ANCESTOR|CPXF_CHECKSIGHT);
Wait;
BHOP AA 16;
BHOP B 8 A_CheckProximity(1,"PlayerPawn",80,0,CPXF_ANCESTOR|CPXF_CHECKSIGHT|CPXF_EXACT);
Goto Spawn+3;
BHOP BB 16;
Goto Spawn;
}
}
Class Razorjack : UnrealWeapon
{
Default
{
Tag "$T_RAZORJACK";
Inventory.PickupMessage "$I_RAZORJACK";
Weapon.UpSound "razorjack/select";
Weapon.SlotNumber 7;
Weapon.SelectionOrder 7;
Weapon.AmmoType "RazorAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "RazorAmmo";
Weapon.AmmoUse2 1;
Weapon.AmmoGive 15;
UTWeapon.DropAmmo 10;
}
States
{
Spawn:
RZRP A -1;
Stop;
RZRP B -1;
Stop;
}
}

View file

@ -1,11 +1,69 @@
Class URifleAmmo : Ammo
{
Default
{
Tag "$T_RIFLEAMMO";
Inventory.PickupMessage "";
Inventory.Amount 8;
Inventory.MaxAmount 50;
Ammo.BackpackAmount 12;
Ammo.BackpackMaxAmount 100;
Ammo.DropAmount 8;
+INVENTORY.IGNORESKILL;
}
override String PickupMessage()
{
if ( PickupMsg.Length() > 0 ) return Super.PickupMessage();
return String.Format("%s%d%s",StringTable.Localize("$I_RIFLEAMMOL"),Amount,StringTable.Localize("$I_RIFLEAMMOR"));
}
States
{
Spawn:
SBOX A -1;
Stop;
}
}
Class URifleAmmo2 : URifleAmmo
{
Default
{
Tag "$T_RIFLEAMMO2";
Inventory.PickupMessage "$I_RIFLEAMMO2";
Inventory.Amount 1;
Ammo.DropAmount 1;
+INVENTORY.IGNORESKILL;
}
States
{
Spawn:
SRND A -1;
Stop;
}
}
Class URifle : UnrealWeapon
{
Default
{
Tag "$T_RIFLE";
Inventory.PickupMessage "$I_RIFLE";
Weapon.UpSound "rifle/select";
Weapon.SlotNumber 9;
Weapon.SelectionOrder 9;
Weapon.AmmoType "URifleAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "URifleAmmo";
Weapon.AmmoUse2 1;
Weapon.AmmoGive 8;
UTWeapon.DropAmmo 4;
}
States
{
Spawn:
SRFP A -1;
Stop;
SRFP B -1;
Stop;
}
}

View file

@ -1,7 +1,50 @@
Class StunnerAmmo : Ammo
{
double rechargephase, rechargespeed;
Default
{
Inventory.Icon "I_Stun";
Inventory.Amount 10;
Inventory.MaxAmount 50;
Ammo.BackpackAmount 0;
Ammo.BackpackMaxAmount 50;
}
override void Tick()
{
Super.Tick();
if ( !Owner ) return;
if ( Amount < 10 ) rechargespeed = 1.1;
else rechargespeed = 0.11*Amount;
rechargephase += 1./rechargespeed;
if ( rechargephase < 7 ) return;
rechargephase = 0;
Amount = min(Amount+1,MaxAmount);
}
}
Class Stunner : UnrealWeapon
{
Default
{
Tag "$T_STUNNER";
Inventory.PickupMessage "$I_STUNNER";
Weapon.UpSound "stun/select";
Weapon.SlotNumber 4;
Weapon.SelectionOrder 9;
Weapon.AmmoType "StunnerAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "StunnerAmmo";
Weapon.AmmoUse2 1;
Weapon.AmmoGive 50;
UTWeapon.DropAmmo 50;
}
States
{
Spawn:
STNP A -1;
Stop;
STNP B -1;
Stop;
}
}

View file

@ -1,10 +1,67 @@
Class UBioAmmo : Ammo
{
Default
{
Tag "$T_SLUDGE";
Inventory.Icon "I_Sludge";
Inventory.PickupMessage "";
Inventory.Amount 25;
Inventory.MaxAmount 100;
Ammo.BackpackAmount 50;
Ammo.BackpackMaxAmount 200;
Ammo.DropAmount 10;
}
override String PickupMessage()
{
if ( PickupMsg.Length() > 0 ) return Super.PickupMessage();
return String.Format("%s%d%s",StringTable.Localize("$I_SLUDGEL"),Amount,StringTable.Localize("$I_SLUDGER"));
}
States
{
Spawn:
BIOA ABCDEFGHIJKLMNOPQRSTUVWYZ 1;
BIA2 ABCD 1;
Loop;
}
}
Class UBioAmmo2 : UBioAmmo
{
Default
{
Tag "$T_SLUDGE2";
Inventory.Amount 10;
Ammo.DropAmount 5;
}
States
{
Spawn:
BIOA ABCDEFGHIJKL 2;
Loop;
}
}
Class UBioRifle : UnrealWeapon
{
Default
{
Tag "$T_BIORIFLE";
Inventory.PickupMessage "$I_BIORIFLE";
Weapon.UpSound "ges/select";
Weapon.SlotNumber 8;
Weapon.SelectionOrder 8;
Weapon.AmmoType "UBioAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "UBioAmmo";
Weapon.AmmoUse2 1;
Weapon.AmmoGive 25;
UTWeapon.DropAmmo 5;
}
States
{
Spawn:
BIOP A -1;
Stop;
BIOP B -1;
Stop;
}
}

View file

@ -1,10 +1,78 @@
Class URocketAmmo : Ammo
{
Default
{
Tag "$T_ROCKETCAN";
Inventory.Icon "I_Rocket";
Inventory.PickupMessage "";
Inventory.Amount 12;
Inventory.MaxAmount 48;
Ammo.BackpackAmount 9;
Ammo.BackpackMaxAmount 96;
Ammo.DropAmount 6;
+INVENTORY.IGNORESKILL;
}
override String PickupMessage()
{
if ( PickupMsg.Length() > 0 ) return Super.PickupMessage();
return String.Format("%s%d%s",StringTable.Localize("$I_ROCKETCANL"),Amount,StringTable.Localize("$I_ROCKETCANR"));
}
States
{
Spawn:
RPAK A 8 A_CheckProximity(1,"PlayerPawn",80,1,CPXF_ANCESTOR|CPXF_CHECKSIGHT);
Wait;
RPAK AABCDEFGHIJ 8;
RPAK J 8 A_CheckProximity(1,"PlayerPawn",80,0,CPXF_ANCESTOR|CPXF_CHECKSIGHT|CPXF_EXACT);
Goto Spawn+12;
RPAK JJIHGFEDCBA 8;
Goto Spawn;
}
}
Class URocketAmmo2 : URocketAmmo
{
Default
{
Tag "$T_ROCKETCAN2";
Inventory.Amount 2;
Ammo.DropAmount 2;
+INVENTORY.IGNORESKILL;
}
States
{
Spawn:
RCKT A 8 A_CheckProximity(1,"PlayerPawn",80,1,CPXF_ANCESTOR|CPXF_CHECKSIGHT);
Wait;
RCKT AA 8;
RCKT B 8 A_CheckProximity(1,"PlayerPawn",80,0,CPXF_ANCESTOR|CPXF_CHECKSIGHT|CPXF_EXACT);
Goto Spawn+3;
RCKT BB 8;
Goto Spawn;
}
}
Class Eightball : UnrealWeapon
{
Default
{
Tag "$T_EIGHTBALL";
Inventory.PickupMessage "$I_EIGHTBALL";
Weapon.UpSound "eightball/select";
Weapon.SlotNumber 5;
Weapon.SelectionOrder 5;
Weapon.AmmoType "URocketAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "URocketAmmo";
Weapon.AmmoUse2 1;
Weapon.AmmoGive 6;
UTWeapon.DropAmmo 3;
}
States
{
Spawn:
EBLP A -1;
Stop;
EBLP B -1;
Stop;
}
}

View file

@ -43,6 +43,139 @@ Class UFlakAmmo : UFlakBox
}
}
// subclass to save time, much of the behavior is the same anyway
Class UFlakChunk : FlakChunk
{
override void PostBeginPlay()
{
Actor.PostBeginPlay();
// no trail, spin much slower
lifetime = 0;
rollvel = FRandom[Flak](5,10)*RandomPick[Flak](-1,1);
pitchvel = FRandom[Flak](5,10)*RandomPick[Flak](-1,1);
yawvel = FRandom[Flak](5,10)*RandomPick[Flak](-1,1);
scale *= Frandom[Flak](0.8,1.2);
SetState(ResolveState("Spawn")+Random[Flak](0,3));
}
override void Tick()
{
oldvel = vel;
Actor.Tick();
if ( isFrozen() ) return;
// no slowing down in water, only set to falling
if ( waterlevel > 0 )
{
bNOGRAVITY = false;
bAMBUSH = true;
}
lifetime += lifespeed;
// no frame changes, smoke based on speed + age
if ( (waterlevel <= 0) && !bAMBUSH && !(GetAge()%2) )
{
let s = Spawn("UTSmoke",pos);
s.vel = (FRandom[Flak](-0.1,0.1),FRandom[Flak](-0.1,0.1),FRandom[Flak](-0.1,0.1));
s.alpha = (scale.x*clamp((120-GetAge())/120.+(vel.length()/20.),0.5,2.0))/0.5;
s.SetShade("AAAAAA");
}
else if ( waterlevel > 0 )
{
let s = Spawn("UTBubble",pos);
s.vel = (FRandom[Flak](-0.1,0.1),FRandom[Flak](-0.1,0.1),FRandom[Flak](-0.1,0.1));
s.scale *= scale.x*0.5;
}
if ( InStateSequence(CurState,FindState("Death")) ) return;
roll += rollvel;
pitch += pitchvel;
angle += pitchvel;
}
Default
{
DamageFunction 17; // exactly 1 point higher than UT
Scale 0.5;
}
States
{
Bounce:
#### # 0
{
A_HandleBounce();
// override spin velocity changes from parent class
rollvel = FRandom[Flak](5,10)*RandomPick[Flak](-1,1);
pitchvel = FRandom[Flak](5,10)*RandomPick[Flak](-1,1);
yawvel = FRandom[Flak](5,10)*RandomPick[Flak](-1,1);
}
Goto Idle;
}
}
// Also subclassed to save time, only the explosion needs to change
Class UFlakSlug : FlakSlug
{
action void A_UFlakExplode()
{
bForceXYBillboard = true;
A_SetRenderStyle(1.0,STYLE_Add);
A_SprayDecal("RocketBlast",50);
A_NoGravity();
A_SetScale(1.2);
UTMainHandler.DoBlast(self,120,75000);
A_Explode(70,120);
A_QuakeEx(4,4,4,8,0,170,"",QF_RELATIVE|QF_SCALEDOWN,falloff:120,rollIntensity:0.2);
A_PlaySound("flak/explode",CHAN_VOICE);
A_AlertMonsters();
if ( !Tracer ) Spawn("SlugSmoke",pos);
Spawn("SlugLight",pos);
Vector3 x, y, z;
double a, s;
[x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll);
Actor p;
Vector3 spawnofs;
if ( BlockingMobj ) spawnofs = level.Vec3Diff(pos,BlockingMobj.Vec3Offset(0,0,BlockingMobj.height/2)).unit()*8;
else if ( BlockingFloor ) spawnofs = BlockingFloor.floorplane.Normal*8;
else if ( BlockingCeiling ) spawnofs = BlockingCeiling.ceilingplane.Normal*8;
else if ( BlockingLine )
{
spawnofs = (-BlockingLine.delta.y,BlockingLine.delta.x,0).unit()*8;
if ( !BlockingLine.sidedef[1] || (CurSector == BlockingLine.frontsector) )
spawnofs *= -1;
}
for ( int i=0; i<5; i++ )
{
p = Spawn("UFlakChunk",Vec3Offset(spawnofs.x,spawnofs.y,spawnofs.z));
p.bHITOWNER = true;
a = FRandom[Flak](0,360);
s = FRandom[Flak](0,0.1);
Vector3 dir = (x+y*cos(a)*s+z*sin(a)*s).unit();
p.angle = atan2(dir.y,dir.x);
p.pitch = -asin(dir.z);
p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*(p.speed+FRandom[Flak](-3,3));
p.target = target;
}
int numpt = Random[Flak](8,12);
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = (FRandom[Flak](-1,1),FRandom[Flak](-1,1),FRandom[Flak](-1,1)).unit()*FRandom[Flak](2,8);
let s = Spawn("UTSpark",pos);
s.vel = pvel;
}
numpt = Random[Flak](15,30);
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = (FRandom[Flak](-1,1),FRandom[Flak](-1,1),FRandom[Flak](-1,1)).unit()*FRandom[Flak](6,16);
let s = Spawn("UTChip",pos);
s.vel = pvel;
s.scale *= FRandom[Flak](0.9,1.8);
}
}
States
{
Death:
FEXP A 0 A_UFlakExplode();
FEXP ABCDEFGHIJ 2 BRIGHT;
Stop;
}
}
Class UFlakCannon : UnrealWeapon
{
action void A_Loading( bool first = false )
@ -65,6 +198,49 @@ Class UFlakCannon : UnrealWeapon
UTMainHandler.DoSwing(self,(FRandom[Flak](-0.3,-0.8),FRandom[Flak](-0.5,0.5)),4,-1.5,2,SWING_Spring,2,2);
if ( !Dampener.Active(self) ) A_AlertMonsters();
A_QuakeEx(1,1,1,3,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.05);
Vector3 x, y, z;
double a, s;
[x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll);
Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+5.0*y-4.0*z;
[x, y, z] = dt_CoordUtil.GetAxes(BulletSlope(),angle,roll);
Vector3 offsets[8]; // vanilla adds these to each chunk
offsets[0] = (0,0,0);
offsets[1] = -z;
offsets[2] = 2*y+z;
offsets[3] = -y;
offsets[4] = 2*y-z;
offsets[5] = (0,0,0);
offsets[6] = y-z;
offsets[7] = 2*y+z;
Actor p;
for ( int i=0; i<8; i++ )
{
p = Spawn("UFlakChunk",level.Vec3Offset(origin,offsets[i]));
a = FRandom[Flak](0,360);
s = FRandom[Flak](0,0.1);
Vector3 dir = (x+y*cos(a)*s+z*sin(a)*s).unit();
p.angle = atan2(dir.y,dir.x);
p.pitch = -asin(dir.z);
p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*(p.speed+FRandom[Flak](-3,3));
p.target = self;
}
int numpt = Random[Flak](20,30);
for ( int i=0; i<numpt; i++ )
{
let s = Spawn("UTViewSpark",origin);
UTViewSpark(s).ofs = (10,5,-4);
UTViewSpark(s).vvel = (FRandom[Flak](3,12),FRandom[Flak](-4,4),FRandom[Flak](-4,4));
s.target = self;
}
for ( int i=0; i<10; i++ )
{
let s = Spawn("UTViewSmoke",origin);
UTViewSmoke(s).ofs = (10,5,-4);
UTViewSmoke(s).vvel = (FRandom[Flak](0,1.2),FRandom[Flak](-.4,.4),FRandom[Flak](-.4,.4));
s.target = self;
s.scale *= 1.6;
s.alpha *= 0.5;
}
}
action void A_FireSlug()
{
@ -81,6 +257,32 @@ Class UFlakCannon : UnrealWeapon
UTMainHandler.DoSwing(self,(FRandom[Flak](-0.4,-0.8),FRandom[Flak](0.4,0.8)),4,-1,3,SWING_Spring,3,5);
if ( !Dampener.Active(self) ) A_AlertMonsters();
A_QuakeEx(2,2,2,6,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1);
Vector3 x, y, z;
double a, s;
[x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll);
Vector3 origin = (pos.x,pos.y,player.viewz)+10.0*x+5.0*y-4.0*z;
Actor p = Spawn("UFlakSlug",origin);
p.angle = angle;
p.pitch = BulletSlope();
p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed;
p.target = self;
int numpt = Random[Flak](10,15);
for ( int i=0; i<numpt; i++ )
{
let s = Spawn("UTViewSpark",origin);
UTViewSpark(s).ofs = (10,5,-4);
UTViewSpark(s).vvel = (FRandom[Flak](3,12),FRandom[Flak](-4,4),FRandom[Flak](-4,4));
s.target = self;
}
for ( int i=0; i<8; i++ )
{
let s = Spawn("UTViewSmoke",origin);
UTViewSmoke(s).ofs = (10,5,-4);
UTViewSmoke(s).vvel = (FRandom[Flak](0,1.2),FRandom[Flak](-.8,.8),FRandom[Flak](-.8,.8));
s.target = self;
s.scale *= 1.6;
s.alpha *= 0.5;
}
}
Default
{

View file

@ -3,6 +3,7 @@ Class UMiniAmmo : Ammo
Default
{
Tag "$T_MINIAMMO";
Inventory.Icon "I_ShellA";
Inventory.PickupMessage "";
Inventory.Amount 50;
Inventory.MaxAmount 200;
@ -15,8 +16,36 @@ Class UMiniAmmo : Ammo
if ( PickupMsg.Length() > 0 ) return Super.PickupMessage();
return String.Format("%s%d%s",StringTable.Localize("$I_MINIAMMOL"),Amount,StringTable.Localize("$I_MINIAMMOR"));
}
States
{
Spawn:
MAMO A -1;
Stop;
}
}
Class UMinigun : UnrealWeapon
{
Default
{
Tag "$T_MINIGUN";
Inventory.PickupMessage "$I_MINIGUN";
Weapon.UpSound "minigun/select";
Weapon.SlotNumber 0;
Weapon.SelectionOrder 10;
Weapon.AmmoType "UMiniAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "UMiniAmmo";
Weapon.AmmoUse2 1;
Weapon.AmmoGive 50;
UTWeapon.DropAmmo 25;
}
States
{
Spawn:
MGNP A -1;
Stop;
MGNP B -1;
Stop;
}
}

View file

@ -78,6 +78,7 @@ Class UPlayer : UTPlayer
{
if ( !(AllActorClasses[i].GetParentClass() is "UnrealArmor") ) continue;
let item = Inventory(Spawn(AllActorClasses[i]));
item.ClearCounters(); // don't increase item counts
if ( !item.CallTryPickup(self) ) item.Destroy();
}
if ( !giveall ) return;
@ -735,21 +736,13 @@ Class UnrealMainHandler : EventHandler
if ( (e.Replacee == 'Chainsaw') || (e.Replacee == 'Gauntlets') )
{
if ( !Random[Replacements](0,3) ) e.Replacement = 'WeaponPowerUp';
else switch ( Random[Replacements](0,3) )
else if ( Random[Replacements](0,2) )
{
case 0:
e.Replacement = 'Bonesaw';
break;
case 1:
e.Replacement = 'Stunner';
break;
case 2:
e.Replacement = 'Betamag';
break;
case 3:
e.Replacement = 'Automag';
break;
if ( Random[Replacements](0,1) ) e.Replacement = 'Bonesaw';
else e.Replacement = 'Stunner';
}
else if ( !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') )
@ -794,7 +787,7 @@ Class UnrealMainHandler : EventHandler
}
else if ( (e.Replacee == 'PlasmaRifle') || (e.Replacee == 'SkullRod') )
{
if ( !Random[Replacements](0,3) ) e.Replacement = 'Impaler';
if ( !Random[Replacements](0,2) ) e.Replacement = 'Impaler';
else if ( Random[Replacements](0,1) ) e.Replacement = 'URifle';
else e.Replacement = 'UBioRifle';
}
@ -868,7 +861,11 @@ Class UnrealMainHandler : EventHandler
}
else if ( (e.Replacee == 'Cell') || (e.Replacee == 'SkullRodAmmo') )
{
if ( !Random[Replacements](0,4) ) e.Replacement = 'BigAmmo2';
if ( !Random[Replacements](0,4) )
{
if ( !Random[Replacements](0,2) ) e.Replacement = 'BigAmmo2';
else e.Replacement = 'BigAmmo3';
}
else if ( !Random[Replacements](0,3) )
{
if ( !Random[Replacements](0,3) ) e.Replacement = 'ImpalerAmmo';
@ -887,7 +884,11 @@ Class UnrealMainHandler : EventHandler
}
else if ( (e.Replacee == 'CellPack') || (e.Replacee == 'SkullRodHefty') )
{
if ( !Random[Replacements](0,4) ) e.Replacement = 'BigAmmo';
if ( !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 ( Random[Replacements](0,1) ) e.Replacement = 'UBioAmmo';
else e.Replacement = 'URifleAmmo';

View file

@ -233,7 +233,7 @@ Class UnrealHUD : BaseStatusBar
Screen.DrawTexture(IconBase,false,CurX,CurY,DTA_VirtualWidthF,ClipX,DTA_VirtualHeightF,ClipY,DTA_KeepRatio,true);
Screen.DrawTexture(i.Icon,false,dx,dy,DTA_VirtualWidthF,dw,DTA_VirtualHeightF,dh,DTA_KeepRatio,true,DTA_TopOffset,0,DTA_LeftOffset,0);
}
if ( (i is 'UnrealInventory') && (UnrealInventory(i).DefaultCharge > 0) )
if ( (i is 'UnrealInventory') && (UnrealInventory(i).DefaultCharge > 0) && (UnrealInventory(i).bActive || (UnrealInventory(i).Charge < UnrealInventory(i).DefaultCharge)) )
Screen.DrawTexture(HudLine,false,CurX+2,CurY+29,DTA_VirtualWidthF,ClipX,DTA_VirtualHeightF,ClipY,DTA_KeepRatio,true,DTA_WindowRightF,Min(28.*(UnrealInventory(i).Charge/double(UnrealInventory(i).DefaultCharge)),28.));
else if ( (i is 'UTArmor') && !HudMode )
Screen.DrawTexture(HudLine,false,CurX+2,CurY+29,DTA_VirtualWidthF,ClipX,DTA_VirtualHeightF,ClipY,DTA_KeepRatio,true,DTA_WindowRightF,Min(28.*(i.Amount/double(i.MaxAmount)),28.));

View file

@ -270,8 +270,41 @@ Class UJumpBoots : UnrealInventory
Class MotionDetector : UnrealInventory
{
Default
{
Tag "$T_DETECTOR";
+COUNTITEM;
+INVENTORY.BIGPOWERUP;
+INVENTORY.ALWAYSPICKUP;
Inventory.MaxAmount 1;
Inventory.Icon "I_Detect";
Inventory.PickupMessage "$I_DETECTOR";
Inventory.RespawnTics 1050;
UnrealInventory.Charge 3500;
}
States
{
Spawn:
MDET A -1;
Stop;
}
}
Class SCUBAGear : UnrealInventory
{
Default
{
Tag "$T_SCUBA";
Inventory.MaxAmount 1;
Inventory.Icon "I_Scuba";
Inventory.PickupMessage "$I_SCUBA";
Inventory.RespawnTics 700;
UnrealInventory.Charge 4200;
}
States
{
Spawn:
SCUB A -1;
Stop;
}
}

View file

@ -1,5 +1,14 @@
Class UTranslocatorAmmo : Ammo
{
Default
{
Inventory.Icon "I_Tele";
Inventory.Amount 1;
Inventory.MaxAmount 2;
Ammo.BackpackAmount 0;
Ammo.BackpackMaxAmount 2;
+INVENTORY.IGNORESKILL;
}
}
Class UTranslocator : UnrealWeapon
@ -9,4 +18,27 @@ Class UTranslocator : UnrealWeapon
if ( !sting_telegun ) return false; // not allowed
return Super.TryPickup(toucher);
}
Default
{
Tag "$T_TELEGUN";
Inventory.PickupMessage "$I_TELEGUN";
Weapon.SlotNumber 9;
Weapon.SelectionOrder 10;
Weapon.AmmoType1 "UTranslocatorAmmo";
Weapon.AmmoUse1 1;
Weapon.AmmoType2 "UTranslocatorAmmo";
Weapon.AmmoUse2 1;
Weapon.AmmoGive 2;
UTWeapon.DropAmmo 2;
+WEAPON.NO_AUTO_SWITCH;
+WEAPON.CHEATNOTWEAPON;
}
States
{
Spawn:
TLCP A -1;
Stop;
TLCP B -1;
Stop;
}
}