Initial 1.1 development setup.
This commit is contained in:
parent
685b7d6f91
commit
dc4bd4d45d
144 changed files with 2487 additions and 165 deletions
|
|
@ -18,22 +18,21 @@ Class SWWMShellAmmoSmall : SWWMAmmoSpawner
|
|||
{
|
||||
/*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('PuntzerBeta') || SWWMUtility.ItemExists('PuntzerGamma')) )
|
||||
return Random[Replacements](0,2)?'SMW05SmallAmmo':'SMW05BundleSpawn';*/
|
||||
switch( Random[Replacements](0,9) )
|
||||
switch( Random[Replacements](0,8) )
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
return 'RedShell';
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
return 'GreenShell';
|
||||
case 6:
|
||||
case 7:
|
||||
case 8:
|
||||
return 'PurpleShell';
|
||||
}
|
||||
// case 9
|
||||
// case 8
|
||||
return 'BlueShell';
|
||||
}
|
||||
}
|
||||
|
|
@ -58,28 +57,27 @@ Class SWWMShellAmmoBig : SWWMAmmoSpawner
|
|||
case 2:
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
return redpool[Random[Replacements](0,2)];
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
case 8:
|
||||
case 9:
|
||||
case 10:
|
||||
return greenpool[Random[Replacements](0,2)];
|
||||
case 10:
|
||||
case 11:
|
||||
case 12:
|
||||
case 13:
|
||||
case 14:
|
||||
return purplepool[Random[Replacements](0,2)];
|
||||
case 14:
|
||||
case 15:
|
||||
case 16:
|
||||
case 17:
|
||||
return bluepool[Random[Replacements](0,2)];
|
||||
case 17:
|
||||
case 18:
|
||||
case 19:
|
||||
return whitepool[Random[Replacements](0,1)];
|
||||
}
|
||||
// case 20
|
||||
// case 19-20
|
||||
return 'BlackShell';
|
||||
}
|
||||
}
|
||||
|
|
@ -122,6 +120,7 @@ Class SWWMRocketAmmoSmall : SWWMAmmoSpawner
|
|||
|
||||
static Class<Actor> PickAmmo( bool notondemand = false )
|
||||
{
|
||||
/*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('ModernSparkster')) ) return Random[Replacements](0,2)?'SparksterBAmmo':'SparksterRAmmo';*/
|
||||
/*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('Quadravol')) ) return 'QuadravolAmmo';*/
|
||||
return Random[Replacements](0,2)?'HellblazerMissiles':'HellblazerCrackshots';
|
||||
}
|
||||
|
|
@ -132,6 +131,8 @@ Class SWWMRocketAmmoBig : SWWMAmmoSpawner
|
|||
|
||||
static Class<Actor> PickAmmo( bool notondemand = false )
|
||||
{
|
||||
/*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('ModernSparkster')) )
|
||||
return Random[Replacements](0,2)?'SparksterAmmoBundleSpawn':'SparksterBigAmmoBundleSpawn';*/
|
||||
/*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('Quadravol')) )
|
||||
return Random[Replacements](0,2)?'QuadravolAmmo':'QuadravolAmmoBundleSpawn';*/
|
||||
switch ( Random[Replacements](0,11) )
|
||||
|
|
@ -166,6 +167,7 @@ Class SWWMCellAmmoSmall : SWWMAmmoSpawner
|
|||
{
|
||||
if ( !Random[Replacements](0,3) )
|
||||
{
|
||||
/*if ( !Random[Replacements](0,2) && (notondemand || SWWMUtility.ItemExists('MisterRifle')) ) return 'MisterGAmmo';*/
|
||||
/*if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('RayKhom')) ) return 'RayBolt';*/
|
||||
if ( notondemand || SWWMUtility.ItemExists('CandyGun') ) return 'CandyGunBullets';
|
||||
}
|
||||
|
|
@ -185,6 +187,7 @@ Class SWWMCellAmmoBig : SWWMAmmoSpawner
|
|||
/*if ( Random[Replacements](0,1) )
|
||||
{
|
||||
if ( !Random[Replacements](0,2) && (notondemand || SWWMUtility.ItemExists('EMPCarbine')) ) return Random[Replacements](0,3)?'EMPCoreBundleSpawn':'EMPCore';
|
||||
if ( Random[Replacements](0,1) && (notondemand || SWWMUtility.ItemExists('MisterRifle')) ) return Random[Replacements](0,2)?'MisterRoundBundleSpawn':'MisterAmmo';
|
||||
if ( notondemand || SWWMUtility.ItemExists('RayKhom') ) return Random[Replacements](0,2)?'RayBoltBundleSpawn':'RayAmmo';
|
||||
}*/
|
||||
if ( !Random[Replacements](0,2) && (notondemand || SWWMUtility.ItemExists('SilverBullet')) )
|
||||
|
|
|
|||
|
|
@ -194,7 +194,6 @@ Class MothPlushy : SWWMCollectible
|
|||
{
|
||||
Tag "$T_MOTHPLUSH";
|
||||
Inventory.PickupMessage "$T_MOTHPLUSH";
|
||||
SWWMCollectible.Availability AVAIL_None;
|
||||
SWWMCollectible.GestureWeapon "MothPlushyGesture";
|
||||
Stamina 7000;
|
||||
}
|
||||
|
|
@ -205,7 +204,6 @@ Class AA12Model : SWWMCollectible
|
|||
{
|
||||
Tag "$T_AA12";
|
||||
Inventory.PickupMessage "$T_AA12";
|
||||
SWWMCollectible.Availability AVAIL_None;
|
||||
SWWMCollectible.GestureWeapon "AA12ModelGesture";
|
||||
Stamina 10000;
|
||||
}
|
||||
|
|
@ -216,7 +214,6 @@ Class CactusHege : SWWMCollectible
|
|||
{
|
||||
Tag "$T_HEGE";
|
||||
Inventory.PickupMessage "$T_HEGE";
|
||||
SWWMCollectible.Availability AVAIL_None;
|
||||
SWWMCollectible.GestureWeapon "CactusHegeGesture";
|
||||
Stamina 3000;
|
||||
}
|
||||
|
|
@ -227,7 +224,6 @@ Class TastyHoagie : SWWMCollectible
|
|||
{
|
||||
Tag "$T_HOAGIE";
|
||||
Inventory.PickupMessage "$T_HOAGIE";
|
||||
SWWMCollectible.Availability AVAIL_None;
|
||||
SWWMCollectible.GestureWeapon "TastyHoagieGesture";
|
||||
Stamina 2000;
|
||||
}
|
||||
|
|
@ -238,7 +234,6 @@ Class IbukiMilk : SWWMCollectible
|
|||
{
|
||||
Tag "$T_IBUKIMILK";
|
||||
Inventory.PickupMessage "$T_IBUKIMILK";
|
||||
SWWMCollectible.Availability AVAIL_None;
|
||||
SWWMCollectible.GestureWeapon "IbukiMilkGesture";
|
||||
Stamina 800;
|
||||
}
|
||||
|
|
@ -249,7 +244,6 @@ Class BRCAlbum : SWWMCollectible
|
|||
{
|
||||
Tag "$T_BRCALBUM";
|
||||
Inventory.PickupMessage "$T_BRCALBUM";
|
||||
SWWMCollectible.Availability AVAIL_None;
|
||||
SWWMCollectible.GestureWeapon "BRCAlbumGesture";
|
||||
Stamina 4000;
|
||||
}
|
||||
|
|
@ -274,7 +268,7 @@ Class Manarokou : SWWMCollectible
|
|||
{
|
||||
Tag "$T_MANAROKOU";
|
||||
Inventory.PickupMessage "$T_MANAROKOU";
|
||||
SWWMCollectible.Availability AVAIL_None;
|
||||
SWWMCollectible.Availability AVAIL_Heretic;
|
||||
SWWMCollectible.GestureWeapon "ManarokouGesture";
|
||||
Stamina 9000;
|
||||
}
|
||||
|
|
@ -285,7 +279,7 @@ Class LithiumNovel : SWWMCollectible
|
|||
{
|
||||
Tag "$T_LITHIUM";
|
||||
Inventory.PickupMessage "$T_LITHIUM";
|
||||
SWWMCollectible.Availability AVAIL_None;
|
||||
SWWMCollectible.Availability AVAIL_Heretic;
|
||||
SWWMCollectible.GestureWeapon "LithiumNovelGesture";
|
||||
Stamina 2000;
|
||||
}
|
||||
|
|
@ -349,7 +343,7 @@ Class Psykkonovexx : SWWMCollectible
|
|||
{
|
||||
Tag "$T_PSYKKONOVEXX";
|
||||
Inventory.PickupMessage "$T_PSYKKONOVEXX";
|
||||
SWWMCollectible.Availability AVAIL_None;
|
||||
SWWMCollectible.Availability AVAIL_Hexen;
|
||||
SWWMCollectible.GestureWeapon "PsykkonovexxGesture";
|
||||
Stamina 15000;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -723,13 +723,31 @@ Class ChanceboxSpawner : Actor
|
|||
return;
|
||||
}
|
||||
int numbox = 0;
|
||||
let ti = ThinkerIterator.Create("ChanceboxSpawner");
|
||||
ThinkerIterator ti = ThinkerIterator.Create("Chancebox");
|
||||
while ( ti.Next() ) numbox++;
|
||||
ti = ThinkerIterator.Create("Chancebox");
|
||||
while ( ti.Next() ) numbox++;
|
||||
if ( numbox > 3 )
|
||||
if ( numbox >= 3 )
|
||||
{
|
||||
// there's three boxes in the map already (plus ourselves)
|
||||
// there's three boxes in the map already
|
||||
Destroy();
|
||||
return;
|
||||
}
|
||||
BlockLinesIterator bl = BlockLinesIterator.CreateFromPos(pos,32,32,CurSector);
|
||||
double tbox[4];
|
||||
// top, bottom, left, right
|
||||
tbox[0] = pos.y+32;
|
||||
tbox[1] = pos.y-32;
|
||||
tbox[2] = pos.x-32;
|
||||
tbox[3] = pos.x+32;
|
||||
while ( bl.Next() )
|
||||
{
|
||||
Line l = bl.CurLine;
|
||||
if ( !l ) continue;
|
||||
if ( tbox[2] > l.bbox[3] ) continue;
|
||||
if ( tbox[3] < l.bbox[2] ) continue;
|
||||
if ( tbox[0] < l.bbox[1] ) continue;
|
||||
if ( tbox[1] > l.bbox[0] ) continue;
|
||||
if ( SWWMUtility.BoxOnLineSide(tbox[0],tbox[1],tbox[2],tbox[3],l) != -1 ) continue;
|
||||
// there isn't enough space to spawn a box here
|
||||
Destroy();
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1970,7 +1970,7 @@ Class SWWMLamp : Inventory
|
|||
bActive = false;
|
||||
bActivated = false;
|
||||
}
|
||||
clearscope bool isBlinking()
|
||||
clearscope bool isBlinking() const
|
||||
{
|
||||
return ( (Charge < 10) && (level.maptime&8) );
|
||||
}
|
||||
|
|
@ -2970,3 +2970,548 @@ Class MykradvoX2 : GhostArtifactX
|
|||
Stop;
|
||||
}
|
||||
}
|
||||
|
||||
// 1.1 extra items
|
||||
|
||||
Class SafetyTether : Inventory
|
||||
{
|
||||
Mixin SWWMAutoUseFix;
|
||||
Mixin SWWMOverlapPickupSound;
|
||||
Mixin SWWMUseToPickup;
|
||||
Mixin SWWMRespawn;
|
||||
Mixin SWWMPickupGlow;
|
||||
|
||||
Default
|
||||
{
|
||||
//$Title Safety Tether
|
||||
//$Group Powerups
|
||||
//$Sprite graphics/HUD/Icons/I_Safety.png
|
||||
//$Icon powerup
|
||||
Tag "$T_SAFETY";
|
||||
Stamina 160000;
|
||||
Inventory.Icon "graphics/HUD/Icons/I_Safety.png";
|
||||
Inventory.PickupSound "misc/p_pkup";
|
||||
Inventory.UseSound "powerup/safety";
|
||||
Inventory.PickupMessage "$T_SAFETY";
|
||||
Inventory.MaxAmount 5;
|
||||
Inventory.InterHubAmount 5;
|
||||
Inventory.PickupFlash "SWWMPurplePickupFlash";
|
||||
+INVENTORY.ALWAYSPICKUP;
|
||||
+INVENTORY.AUTOACTIVATE;
|
||||
+INVENTORY.INVBAR;
|
||||
+COUNTITEM;
|
||||
+INVENTORY.BIGPOWERUP;
|
||||
+FLOATBOB;
|
||||
FloatBobStrength 0.25;
|
||||
}
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
XZW1 A -1;
|
||||
Stop;
|
||||
}
|
||||
}
|
||||
|
||||
Class AngeryLight : PointLightAttenuated
|
||||
{
|
||||
Default
|
||||
{
|
||||
Args 224,0,255,80;
|
||||
}
|
||||
override void Tick()
|
||||
{
|
||||
Super.Tick();
|
||||
if ( !target || !master )
|
||||
{
|
||||
Destroy();
|
||||
return;
|
||||
}
|
||||
if ( target.player )
|
||||
SetOrigin(target.Vec2OffsetZ(0,0,target.player.viewz),true);
|
||||
else SetOrigin(target.Vec3Offset(0,0,target.height/2),true);
|
||||
args[LIGHT_INTENSITY] = Random[Invinciball](10,12)*8;
|
||||
bDORMANT = Powerup(master).isBlinking();
|
||||
}
|
||||
}
|
||||
Class AngerySnd : Actor
|
||||
{
|
||||
Default
|
||||
{
|
||||
+NOBLOCKMAP;
|
||||
+NOGRAVITY;
|
||||
+NOINTERACTION;
|
||||
}
|
||||
override void Tick()
|
||||
{
|
||||
if ( !target || !master )
|
||||
{
|
||||
Destroy();
|
||||
return;
|
||||
}
|
||||
SetOrigin(target.pos,true);
|
||||
if ( players[consoleplayer].Camera == target )
|
||||
{
|
||||
A_SoundVolume(CHAN_VOICE,0.);
|
||||
A_SoundVolume(CHAN_7,.5);
|
||||
}
|
||||
else
|
||||
{
|
||||
A_SoundVolume(CHAN_VOICE,.4);
|
||||
A_SoundVolume(CHAN_7,0.);
|
||||
}
|
||||
}
|
||||
override void PostBeginPlay()
|
||||
{
|
||||
Super.PostBeginPlay();
|
||||
A_StartSound("powerup/devastationact",CHAN_VOICE,CHANF_LOOP,.4,1.5);
|
||||
A_StartSound("powerup/devastationact",CHAN_7,CHANF_LOOP,.5,ATTN_NONE);
|
||||
}
|
||||
override void OnDestroy()
|
||||
{
|
||||
Super.OnDestroy();
|
||||
A_StopSound(CHAN_VOICE);
|
||||
A_StopSound(CHAN_7);
|
||||
}
|
||||
}
|
||||
Class AngeryPower : Powerup
|
||||
{
|
||||
Actor l, snd;
|
||||
int lasteffect;
|
||||
|
||||
Default
|
||||
{
|
||||
Powerup.Duration -20;
|
||||
Inventory.Icon "graphics/HUD/Icons/I_Devastation.png";
|
||||
Powerup.Color "C0 00 FF", 0.2;
|
||||
+INVENTORY.ADDITIVETIME;
|
||||
}
|
||||
|
||||
override void InitEffect()
|
||||
{
|
||||
Super.InitEffect();
|
||||
if ( !Owner ) return;
|
||||
Owner.A_AlertMonsters(swwm_uncapalert?0:5000);
|
||||
SWWMHandler.DoFlash(Owner,Color(64,224,0,255),30);
|
||||
Owner.A_QuakeEx(8,8,8,20,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:1.);
|
||||
lasteffect = int.min;
|
||||
if ( Owner is 'Demolitionist' )
|
||||
Demolitionist(Owner).lastbump *= .95;
|
||||
l = Spawn("AngeryLight",Owner.pos);
|
||||
l.target = Owner;
|
||||
l.master = self;
|
||||
}
|
||||
override void DoEffect()
|
||||
{
|
||||
Super.DoEffect();
|
||||
if ( !Owner ) return;
|
||||
if ( !snd ) snd = Spawn("AngerySnd",Owner.pos);
|
||||
snd.target = Owner;
|
||||
snd.master = self;
|
||||
}
|
||||
|
||||
override void EndEffect()
|
||||
{
|
||||
Super.EndEffect();
|
||||
if ( !Owner ) return;
|
||||
Owner.A_StartSound("powerup/devastationend",CHAN_ITEMEXTRA);
|
||||
SWWMHandler.DoFlash(Owner,Color(128,224,0,255),30);
|
||||
Owner.A_QuakeEx(4,4,4,20,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:1.);
|
||||
Owner.A_AlertMonsters(2000);
|
||||
if ( Owner is 'Demolitionist' )
|
||||
Demolitionist(Owner).lastbump *= .9;
|
||||
if ( (EffectTics <= 0) && Owner && Owner.CheckLocalView() ) Console.Printf(StringTable.Localize("$D_DEVASTATION"));
|
||||
}
|
||||
|
||||
void DoHitFX()
|
||||
{
|
||||
if ( level.maptime <= lasteffect+5 ) return;
|
||||
Owner.A_AlertMonsters(swwm_uncapalert?0:5000);
|
||||
SWWMHandler.DoFlash(Owner,Color(64,224,0,255),10);
|
||||
Owner.A_QuakeEx(8,8,8,Random[Rage](3,8),0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:1.);
|
||||
Owner.A_StartSound("powerup/devastationhit",CHAN_POWERUP);
|
||||
lasteffect = level.maptime;
|
||||
if ( Owner is 'Demolitionist' )
|
||||
Demolitionist(Owner).lastbump *= .9;
|
||||
}
|
||||
|
||||
override void ModifyDamage( int damage, Name damageType, out int newdamage, bool passive, Actor inflictor, Actor source, int flags )
|
||||
{
|
||||
if ( passive || (damage <= 0) ) return;
|
||||
// (2^31-1)/25 : guarantee that it caps rather than overflowing
|
||||
if ( damage > 85899345 ) newdamage = int.max;
|
||||
else newdamage = damage*25;
|
||||
DoHitFX();
|
||||
}
|
||||
}
|
||||
Class AngerySigil : Inventory
|
||||
{
|
||||
Mixin SWWMAutoUseFix;
|
||||
Mixin SWWMOverlapPickupSound;
|
||||
Mixin SWWMUseToPickup;
|
||||
Mixin SWWMRespawn;
|
||||
Mixin SWWMPickupGlow;
|
||||
|
||||
override bool Use( bool pickup )
|
||||
{
|
||||
if ( pickup && !deathmatch ) return false;
|
||||
if ( pickup && ((Owner.player == players[consoleplayer]) || bBigPowerup) ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA);
|
||||
SWWMUtility.AchievementProgressInc('swwm_progress_deva',1,Owner.player);
|
||||
let r = AngeryPower(Owner.FindInventory("AngeryPower"));
|
||||
if ( r )
|
||||
{
|
||||
r.EffectTics += r.default.EffectTics;
|
||||
SWWMHandler.DoFlash(Owner,Color(64,224,0,255),30);
|
||||
Owner.A_QuakeEx(8,8,8,20,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:1.);
|
||||
if ( Owner is 'Demolitionist' )
|
||||
Demolitionist(Owner).lastbump *= .95;
|
||||
}
|
||||
else Owner.GiveInventory("AngeryPower",1);
|
||||
return true;
|
||||
}
|
||||
override void Travelled()
|
||||
{
|
||||
Super.Travelled();
|
||||
if ( !tracer )
|
||||
{
|
||||
tracer = Spawn("AngerySigilX",pos);
|
||||
tracer.angle = angle;
|
||||
tracer.target = self;
|
||||
tracer.FloatBobPhase = FloatBobPhase;
|
||||
}
|
||||
}
|
||||
override void PostBeginPlay()
|
||||
{
|
||||
Super.PostBeginPlay();
|
||||
tracer = Spawn("AngerySigilX",pos);
|
||||
tracer.angle = angle;
|
||||
tracer.target = self;
|
||||
tracer.FloatBobPhase = FloatBobPhase;
|
||||
}
|
||||
Default
|
||||
{
|
||||
//$Title Devastation Sigil
|
||||
//$Group Powerups
|
||||
//$Sprite graphics/HUD/Icons/I_Devastation.png
|
||||
//$Icon powerup
|
||||
Tag "$T_DEVASTATION";
|
||||
Stamina 1500000;
|
||||
Inventory.Icon "graphics/HUD/Icons/I_Devastation.png";
|
||||
Inventory.PickupSound "misc/p_pkup";
|
||||
Inventory.UseSound "powerup/devastation";
|
||||
Inventory.PickupMessage "$T_DEVASTATION";
|
||||
Inventory.MaxAmount 5;
|
||||
Inventory.InterHubAmount 5;
|
||||
Inventory.PickupFlash "SWWMPurplePickupFlash";
|
||||
+INVENTORY.ALWAYSPICKUP;
|
||||
+INVENTORY.AUTOACTIVATE;
|
||||
+INVENTORY.INVBAR;
|
||||
+COUNTITEM;
|
||||
+INVENTORY.BIGPOWERUP;
|
||||
+FLOATBOB;
|
||||
FloatBobStrength 0.25;
|
||||
Radius 8;
|
||||
Height 28;
|
||||
}
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
XZW1 A -1;
|
||||
Stop;
|
||||
}
|
||||
}
|
||||
Class AngerySigilX : GhostArtifactX
|
||||
{
|
||||
Default
|
||||
{
|
||||
Scale .5;
|
||||
Alpha .35;
|
||||
RenderStyle "Subtract";
|
||||
+FORCEXYBILLBOARD;
|
||||
}
|
||||
override void PostBeginPlay()
|
||||
{
|
||||
Super.PostBeginPlay();
|
||||
A_StartSound("powerup/devastationamb",CHAN_VOICE,CHANF_LOOP);
|
||||
}
|
||||
override void Tick()
|
||||
{
|
||||
if ( !target )
|
||||
{
|
||||
Destroy();
|
||||
return;
|
||||
}
|
||||
prev = target.prev+(0,0,20);
|
||||
vel = target.vel;
|
||||
if ( (target.pos != pos+(0,0,20)) || (target.vel != (0,0,0)) ) SetOrigin(target.pos+(0,0,20)+vel,true);
|
||||
if ( angle != target.angle ) A_SetAngle(target.angle,SPF_INTERPOLATE);
|
||||
FloatBobPhase = target.FloatBobPhase;
|
||||
if ( !bsprite ) bsprite = GetSpriteIndex('XZW1');
|
||||
bInvisible = target.bInvisible||(target.sprite!=bsprite);
|
||||
SetState(SpawnState+bInvisible);
|
||||
A_SoundVolume(CHAN_VOICE,bInvisible?0.:1.);
|
||||
}
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
BLPS C -1 Bright;
|
||||
TNT1 A -1;
|
||||
Stop;
|
||||
}
|
||||
}
|
||||
|
||||
Class DivineSpriteLight : PointLightAttenuated
|
||||
{
|
||||
Default
|
||||
{
|
||||
Args 255,255,255,100;
|
||||
}
|
||||
override void Tick()
|
||||
{
|
||||
Super.Tick();
|
||||
if ( !target || !master )
|
||||
{
|
||||
Destroy();
|
||||
return;
|
||||
}
|
||||
if ( target.player )
|
||||
SetOrigin(target.Vec2OffsetZ(0,0,target.player.viewz),true);
|
||||
else SetOrigin(target.Vec3Offset(0,0,target.height/2),true);
|
||||
double vol = clamp((target.Health-1000)/6000.,0.,1.);
|
||||
int lv = clamp(int(vol*255),0,255);
|
||||
args[LIGHT_RED] = lv;
|
||||
args[LIGHT_GREEN] = lv;
|
||||
args[LIGHT_BLUE] = lv;
|
||||
args[LIGHT_INTENSITY] = Random[Invinciball](10,12)*10;
|
||||
}
|
||||
}
|
||||
Class DivineSpriteSnd : Actor
|
||||
{
|
||||
Default
|
||||
{
|
||||
+NOBLOCKMAP;
|
||||
+NOGRAVITY;
|
||||
+NOINTERACTION;
|
||||
}
|
||||
override void Tick()
|
||||
{
|
||||
if ( !target || !master )
|
||||
{
|
||||
Destroy();
|
||||
return;
|
||||
}
|
||||
SetOrigin(target.pos,true);
|
||||
double vol = clamp((target.Health-1000)/6000.,0.,1.);
|
||||
if ( players[consoleplayer].Camera == target )
|
||||
{
|
||||
A_SoundVolume(CHAN_VOICE,0.);
|
||||
A_SoundVolume(CHAN_7,.8*vol);
|
||||
}
|
||||
else
|
||||
{
|
||||
A_SoundVolume(CHAN_VOICE,.4*vol);
|
||||
A_SoundVolume(CHAN_7,0.);
|
||||
}
|
||||
}
|
||||
override void PostBeginPlay()
|
||||
{
|
||||
Super.PostBeginPlay();
|
||||
double vol = target?clamp((target.Health-1000)/9000.,0.,1.):.1;
|
||||
A_StartSound("powerup/divineact",CHAN_VOICE,CHANF_LOOP,.4*vol,1.5);
|
||||
A_StartSound("powerup/divineact",CHAN_7,CHANF_LOOP,.8*vol,ATTN_NONE);
|
||||
}
|
||||
override void OnDestroy()
|
||||
{
|
||||
Super.OnDestroy();
|
||||
A_StopSound(CHAN_VOICE);
|
||||
A_StopSound(CHAN_7);
|
||||
}
|
||||
}
|
||||
Class DivineSpriteEffect : Inventory
|
||||
{
|
||||
int healcnt;
|
||||
int healtim;
|
||||
bool bHealDone;
|
||||
Actor l, snd;
|
||||
|
||||
Property HealTimer : healtim;
|
||||
|
||||
default
|
||||
{
|
||||
Inventory.Icon "graphics/HUD/Icons/I_Divine.png";
|
||||
DivineSpriteEffect.HealTimer 1050;
|
||||
+INVENTORY.UNDROPPABLE;
|
||||
+INVENTORY.UNTOSSABLE;
|
||||
}
|
||||
|
||||
clearscope bool isBlinking() const
|
||||
{
|
||||
return ( (healtim <= BLINKTHRESHOLD) && (healtim&8) );
|
||||
}
|
||||
|
||||
override void Travelled()
|
||||
{
|
||||
Super.Travelled();
|
||||
bHealDone = true;
|
||||
}
|
||||
|
||||
override void DoEffect()
|
||||
{
|
||||
Super.DoEffect();
|
||||
if ( !l ) l = Spawn("DivineSpriteLight",Owner.pos);
|
||||
l.target = Owner;
|
||||
l.master = self;
|
||||
if ( !snd ) snd = Spawn("DivineSpriteSnd",Owner.pos);
|
||||
snd.target = Owner;
|
||||
snd.master = self;
|
||||
int numpt = Random[ExploS](5,10);
|
||||
double alph = clamp((Owner.Health-1000.)/6000.,0.,1.);
|
||||
double scl = clamp((Owner.Health-1000.)/6000.,2.,4.);
|
||||
for ( int i=0; i<numpt; i++ )
|
||||
{
|
||||
double ang = FRandom[ExploS](0,360);
|
||||
double pt = FRandom[ExploS](-90,90);
|
||||
double dst = FRandom[ExploS](.25,.75)*Owner.height;
|
||||
Vector3 dir = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt));
|
||||
Vector3 ppos = Owner.Vec3offset(0,0,Owner.height/2)+dir*dst;
|
||||
A_SpawnParticle("White",SPF_FULLBRIGHT,30,scl,0,ppos.x,ppos.y,ppos.z,dir.x*.2,dir.y*.2,dir.z*.2,0,0,.05,alph,-1,-scl/30.);
|
||||
}
|
||||
if ( bHealDone )
|
||||
{
|
||||
if ( Owner.Health <= 1000 ) DepleteOrDestroy();
|
||||
return;
|
||||
}
|
||||
healcnt++;
|
||||
healtim--;
|
||||
if ( healtim <= 0 )
|
||||
{
|
||||
Owner.A_StartSound("powerup/divineend",CHAN_ITEMEXTRA);
|
||||
SWWMHandler.DoFlash(Owner,Color(80,255,255,255),40);
|
||||
if ( Owner is 'Demolitionist' )
|
||||
Demolitionist(Owner).lastbump *= 0.95;
|
||||
bHealDone = true;
|
||||
}
|
||||
else if ( Owner.Health < 1000 )
|
||||
{
|
||||
healcnt = 0;
|
||||
Owner.GiveBody(1000,1000);
|
||||
SWWMScoreObj.Spawn(1000,Owner.Vec3Offset(FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8)+Owner.Height/2),ST_Health);
|
||||
SWWMHandler.DoFlash(Owner,Color(40,255,255,255),20);
|
||||
if ( Owner is 'Demolitionist' )
|
||||
Demolitionist(Owner).lastbump *= 0.97;
|
||||
}
|
||||
else if ( !(healcnt%3) )
|
||||
{
|
||||
Owner.GiveBody(100,10000);
|
||||
SWWMScoreObj.Spawn(100,Owner.Vec3Offset(FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8)+Owner.Height/2),ST_Health);
|
||||
SWWMHandler.DoFlash(Owner,Color(10,255,255,255),5);
|
||||
}
|
||||
}
|
||||
}
|
||||
Class DivineSprite : Inventory
|
||||
{
|
||||
Mixin SWWMAutoUseFix;
|
||||
Mixin SWWMOverlapPickupSound;
|
||||
Mixin SWWMUseToPickup;
|
||||
Mixin SWWMRespawn;
|
||||
Mixin SWWMPickupGlow;
|
||||
|
||||
override bool Use( bool pickup )
|
||||
{
|
||||
// never get auto-used on pickup unless we're in deathmatch
|
||||
if ( pickup && !deathmatch ) return false;
|
||||
let p = Owner.FindInventory("DivineSpriteEffect");
|
||||
if ( p ) return false;
|
||||
if ( pickup && ((Owner.player == players[consoleplayer]) || bBigPowerup) ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA);
|
||||
Owner.GiveInventory("DivineSpriteEffect",1);
|
||||
SWWMUtility.AchievementProgressInc('swwm_progress_divine',1,Owner.player);
|
||||
return true;
|
||||
}
|
||||
override void Travelled()
|
||||
{
|
||||
Super.Travelled();
|
||||
if ( !tracer )
|
||||
{
|
||||
tracer = Spawn("DivineSpriteX",pos);
|
||||
tracer.angle = angle;
|
||||
tracer.target = self;
|
||||
tracer.FloatBobPhase = FloatBobPhase;
|
||||
}
|
||||
}
|
||||
override void PostBeginPlay()
|
||||
{
|
||||
Super.PostBeginPlay();
|
||||
tracer = Spawn("DivineSpriteX",pos);
|
||||
tracer.angle = angle;
|
||||
tracer.target = self;
|
||||
tracer.FloatBobPhase = FloatBobPhase;
|
||||
}
|
||||
|
||||
Default
|
||||
{
|
||||
//$Title Divine Sprite
|
||||
//$Group Powerups
|
||||
//$Sprite graphics/HUD/Icons/I_Divine.png
|
||||
//$Icon powerup
|
||||
Tag "$T_DIVINE";
|
||||
Stamina 3600000;
|
||||
Inventory.Icon "graphics/HUD/Icons/I_Divine.png";
|
||||
Inventory.PickupSound "misc/p_pkup";
|
||||
Inventory.UseSound "powerup/divineuse";
|
||||
Inventory.PickupMessage "$T_DIVINE";
|
||||
Inventory.MaxAmount 5;
|
||||
Inventory.InterHubAmount 5;
|
||||
Inventory.PickupFlash "SWWMPurplePickupFlash";
|
||||
+INVENTORY.ALWAYSPICKUP;
|
||||
+INVENTORY.AUTOACTIVATE;
|
||||
+INVENTORY.INVBAR;
|
||||
+COUNTITEM;
|
||||
+INVENTORY.BIGPOWERUP;
|
||||
+FLOATBOB;
|
||||
FloatBobStrength 0.25;
|
||||
Radius 8;
|
||||
Height 24;
|
||||
}
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
XZW1 A -1;
|
||||
Stop;
|
||||
}
|
||||
}
|
||||
Class DivineSpriteX : GhostArtifactX
|
||||
{
|
||||
Default
|
||||
{
|
||||
Scale .5;
|
||||
+FORCEXYBILLBOARD;
|
||||
}
|
||||
override void PostBeginPlay()
|
||||
{
|
||||
Super.PostBeginPlay();
|
||||
A_StartSound("powerup/divineamb",CHAN_VOICE,CHANF_LOOP);
|
||||
}
|
||||
override void Tick()
|
||||
{
|
||||
if ( !target )
|
||||
{
|
||||
Destroy();
|
||||
return;
|
||||
}
|
||||
prev = target.prev+(0,0,16);
|
||||
vel = target.vel;
|
||||
if ( (target.pos != pos+(0,0,16)) || (target.vel != (0,0,0)) ) SetOrigin(target.pos+(0,0,16)+vel,true);
|
||||
if ( angle != target.angle ) A_SetAngle(target.angle,SPF_INTERPOLATE);
|
||||
FloatBobPhase = target.FloatBobPhase;
|
||||
if ( !bsprite ) bsprite = GetSpriteIndex('XZW1');
|
||||
bInvisible = target.bInvisible||(target.sprite!=bsprite);
|
||||
SetState(SpawnState+bInvisible);
|
||||
A_SoundVolume(CHAN_VOICE,bInvisible?0.:1.);
|
||||
}
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
DVSP A -1 Bright;
|
||||
TNT1 A -1;
|
||||
Stop;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue