Initial 1.1 development setup.

This commit is contained in:
Mari the Deer 2021-09-01 09:55:32 +02:00
commit dc4bd4d45d
144 changed files with 2487 additions and 165 deletions

View file

@ -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')) )

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;
}
}