A collection of hackfixes related to items.

This commit is contained in:
Mari the Deer 2022-01-25 01:40:52 +01:00
commit 00f150b832
11 changed files with 104 additions and 251 deletions

View file

@ -1,3 +1,3 @@
[default]
SWWM_MODVER="\cyDEMOLITIONIST \cw1.2pre r128 \cu(Sun 23 Jan 20:49:20 CET 2022)\c-";
SWWM_SHORTVER="\cw1.2pre r128 \cu(2022-01-23 20:49:20)\c-";
SWWM_MODVER="\cyDEMOLITIONIST \cw1.2pre r129 \cu(Tue 25 Jan 01:40:52 CET 2022)\c-";
SWWM_SHORTVER="\cw1.2pre r129 \cu(2022-01-25 01:40:52)\c-";

View file

@ -27,7 +27,7 @@ extend Class SWWMHandler
{
if ( (gamestate != GS_LEVEL) || (players[consoleplayer].Health <= 0) || !(players[consoleplayer].mo is 'Demolitionist') )
return;
double maxval = players[consoleplayer].mo.FindInventory("Omnisight")?2.:1.;
double maxval = level.allmap?2.:1.;
double val = swwm_mm_zoom;
if ( val >= 1. ) val = min(maxval,val+.5);
else val = min(1.,val+.25);

View file

@ -239,7 +239,6 @@ extend Class SWWMHandler
return;
}
// update trackers for anything around the player
bool thesight = players[consoleplayer].mo.FindInventory("Omnisight");
double viewdist = SWWMStatusBar.MAPVIEWDIST*swwm_mm_zoom;
BlockThingsIterator bt = BlockThingsIterator.Create(players[consoleplayer].Camera,viewdist);
while ( bt.Next() )
@ -255,7 +254,7 @@ extend Class SWWMHandler
continue;
if ( !a.player && !a.bSOLID && !a.bSHOOTABLE && !a.bISMONSTER && !a.bFRIENDLY && !(a is 'Inventory') && !(a is 'Chancebox') )
continue;
if ( !thesight && !(deathmatch && (a is 'Inventory') && !a.bDROPPED) && !(a.IsFriend(players[consoleplayer].mo) && !(a.player && (a.player.mo != a))) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
if ( !level.allmap && !(deathmatch && (a is 'Inventory') && !a.bDROPPED) && !(a.IsFriend(players[consoleplayer].mo) && !(a.player && (a.player.mo != a))) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
continue;
if ( a.bKILLED || (a.Health <= 0) || a.bUnmorphed )
continue;
@ -273,7 +272,7 @@ extend Class SWWMHandler
Vector2 rv = a.pos.xy-players[consoleplayer].Camera.pos.xy;
if ( max(abs(rv.x)-a.radius,abs(rv.y)-a.radius) > viewdist )
continue;
if ( !thesight && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
if ( !level.allmap && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
continue;
SWWMSimpleTracker.Track(a);
}
@ -285,7 +284,7 @@ extend Class SWWMHandler
double rad = a.speed*cos(a.pitch);
if ( max(abs(rv.x)-rad,abs(rv.y)-rad) > viewdist )
continue;
if ( !thesight && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
if ( !level.allmap && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
continue;
SWWMSimpleTracker.Track(a);
}
@ -313,7 +312,7 @@ extend Class SWWMHandler
continue;
if ( !a.player && !a.bSOLID && !a.bSHOOTABLE && !a.bISMONSTER && !a.bFRIENDLY && !(a is 'Inventory') && !(a is 'Chancebox') )
continue;
if ( !thesight && !(deathmatch && (a is 'Inventory') && !a.bDROPPED) && !a.IsFriend(players[consoleplayer].mo) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
if ( !level.allmap && !(deathmatch && (a is 'Inventory') && !a.bDROPPED) && !a.IsFriend(players[consoleplayer].mo) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
continue;
if ( a.bKILLED || (a.Health <= 0) || a.bUnmorphed )
continue;
@ -331,7 +330,7 @@ extend Class SWWMHandler
Vector2 rv = a.pos.xy-relpos;
if ( max(abs(rv.x)-a.radius,abs(rv.y)-a.radius) > viewdist )
continue;
if ( !thesight && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
if ( !level.allmap && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
continue;
SWWMSimpleTracker.Track(a);
}
@ -343,7 +342,7 @@ extend Class SWWMHandler
double rad = a.speed*cos(a.pitch);
if ( max(abs(rv.x)-rad,abs(rv.y)-rad) > viewdist )
continue;
if ( !thesight && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
if ( !level.allmap && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) )
continue;
SWWMSimpleTracker.Track(a);
}

View file

@ -902,8 +902,7 @@ Class SWWMStatusBar : BaseStatusBar
// let weapons update their own interpolators
if ( CPlayer.ReadyWeapon is 'SWWMWeapon' )
SWWMWeapon(CPlayer.ReadyWeapon).HudTick();
bool thesight = CPlayer.mo.FindInventory("Omnisight");
double desiredzoom = clamp(swwm_mm_zoom,.5,thesight?2.:1.);
double desiredzoom = clamp(swwm_mm_zoom,.5,level.allmap?2.:1.);
if ( (minimapzoom != swwm_mm_zoom) || (oldminimapzoom != swwm_mm_zoom) )
{
oldminimapzoom = minimapzoom;
@ -915,7 +914,7 @@ Class SWWMStatusBar : BaseStatusBar
let cam = players[consoleplayer].camera;
Vector3 viewvec = (cos(viewrot.x)*cos(viewrot.y),sin(viewrot.x)*cos(viewrot.y),sin(-viewrot.y));
int sz;
if ( thesight && swwm_pois )
if ( level.allmap && swwm_pois )
{
// update omnisight stuff
if ( intpoints.Size() != hnd.intpoints_cnt )
@ -952,7 +951,7 @@ Class SWWMStatusBar : BaseStatusBar
if ( trk.mytarget == CPlayer.mo ) continue;
if ( trk.mytarget is 'PlayerGone' ) continue; // ignore "gone" players
int mtime = 35;
if ( thesight && (trk.lasthealth > 0) ) mtime += 105;
if ( level.allmap && (trk.lasthealth > 0) ) mtime += 105;
if ( level.maptime > trk.updated+mtime ) continue;
// ignore trackers clearly outside of player view
Vector3 tdir = level.Vec3Diff(viewpos,trk.pos);
@ -1028,7 +1027,7 @@ Class SWWMStatusBar : BaseStatusBar
i = 0;
for ( SWWMItemSense s=demo.itemsense; s; s=s.next )
{
if ( !thesight && (level.maptime > s.updated+35) ) continue;
if ( !level.allmap && (level.maptime > s.updated+35) ) continue;
// ignore points clearly outside of player view
Vector3 tdir = level.Vec3Diff(viewpos,s.pos);
if ( viewvec dot tdir < 0 ) continue;
@ -1183,10 +1182,9 @@ Class SWWMStatusBar : BaseStatusBar
SWWMUtility.PrepareProjData(projdata,ViewPos,ViewRot.x,ViewRot.y,ViewRot.z,players[consoleplayer].fov);
int cliptop = projdata.viewy, clipbottom = projdata.viewy+projdata.viewh,
clipleft = projdata.viewx, clipright = projdata.viewx+projdata.vieww;
bool thesight = !!CPlayer.mo.FindInventory("Omnisight");
// points of interest
String tag;
if ( thesight )
if ( level.allmap )
{
for ( int i=0; i<intpoints.Size(); i++ )
{
@ -1245,9 +1243,9 @@ Class SWWMStatusBar : BaseStatusBar
Vector3 ndc = SWWMUtility.ProjectPoint(projdata,ViewPos+tdir);
if ( ndc.z >= 1. ) continue;
Vector2 vpos = SWWMUtility.NDCToViewport(projdata,ndc);
int mtime = thesight?70:35;
int mtime = level.allmap?70:35;
double alph = clamp(((s.updated+mtime)-(level.maptime+fractic))/35.,0.,1.);
alph *= clamp(1.5-1.5*(tdir.length()/(thesight?1200.:800.)),0.,1.);
alph *= clamp(1.5-1.5*(tdir.length()/(level.allmap?1200.:800.)),0.,1.);
tag = s.tag;
Screen.DrawText(smallfont2,s.vipitem?Font.CR_PURPLE:s.scoreitem?Font.CR_GOLD:Font.CR_GREEN,(vpos.x-hsd*smallfont2.StringWidth(tag)/2.)/hsd,(vpos.y-hsd*smallfont2.GetHeight()/2.)/hsd,tag,DTA_VirtualWidthF,ssd.x,DTA_VirtualHeightF,ssd.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright);
tag = String.Format("\cu(%s\cu)\c-",FormatDist(tdir.length()));
@ -1283,7 +1281,7 @@ Class SWWMStatusBar : BaseStatusBar
if ( targ.bFRIENDLY ) tag = "\cg♥\c- "..tag.." \cg♥\c-";
}
int mtime = 35;
if ( thesight && (targ.lasthealth > 0) ) mtime += 105;
if ( level.allmap && (targ.lasthealth > 0) ) mtime += 105;
double alph = clamp(((targ.updated+mtime)-(level.maptime+fractic))/35.,0.,1.);
Vector2 barsiz = TexMan.GetScaledSize(EnemyBTex);
barsiz.x *= hsb;
@ -1976,7 +1974,6 @@ Class SWWMStatusBar : BaseStatusBar
}
private void DrawMapThings( Vector2 basepos )
{
bool thesight = !!CPlayer.mo.FindInventory("Omnisight");
double zoomlevel = oldminimapzoom*(1.-FracTic)+minimapzoom*FracTic;
double zoomview = MAPVIEWDIST*zoomlevel, zoomclip = CLIPDIST*zoomlevel;
Vector2 cpos = players[consoleplayer].Camera.prev.xy*(1.-FracTic)+players[consoleplayer].Camera.pos.xy*FracTic;
@ -2021,7 +2018,7 @@ Class SWWMStatusBar : BaseStatusBar
plainactor = true;
}
int mtime = 35;
if ( thesight && !t.expired && t.target ) mtime += 105;
if ( level.allmap && !t.expired && t.target ) mtime += 105;
Vector2 rv = pos-cpos;
bool isportal = false;
if ( swwm_mm_portaloverlay )

View file

@ -7,7 +7,7 @@ Class ArmorNugget : SWWMArmor
Inventory.Amount 1;
Inventory.MaxAmount 200;
Inventory.InterHubAmount 200;
SWWMArmor.ArmorPriority 1;
SWWMArmor.ArmorPriority 3;
SWWMArmor.GiverArmor "ArmorNuggetItem";
}
@ -73,7 +73,7 @@ Class BlastSuit : SWWMArmor
Inventory.MaxAmount 150;
Inventory.InterHubAmount 150;
Inventory.RestrictedTo "Demolitionist";
SWWMArmor.ArmorPriority 2;
SWWMArmor.ArmorPriority 4;
SWWMArmor.DrainMessage "$D_BLASTSUIT";
SWWMArmor.GiverArmor "BlastSuitItem";
}
@ -126,7 +126,7 @@ Class WarArmor : SWWMArmor
Inventory.MaxAmount 250;
Inventory.InterHubAmount 250;
Inventory.RestrictedTo "Demolitionist";
SWWMArmor.ArmorPriority 6;
SWWMArmor.ArmorPriority 5;
SWWMArmor.DrainMessage "$D_WARARMOR";
SWWMArmor.GiverArmor "WarArmorItem";
}

View file

@ -4,11 +4,17 @@ Class SWWMArmor : Armor abstract
int priority;
String drainmsg;
Class<SWWMSpareArmor> parent;
private int SArmorFlags;
Property ArmorPriority : priority;
Property DrainMessage : drainmsg;
Property GiverArmor : parent;
FlagDef NoHitFlash : SArmorFlags, 0; // doesn't flash when taking damage
FlagDef NoHitSound : SArmorFlags, 1; // doesn't play a sound when taking damage
FlagDef NoDrain : SArmorFlags, 2; // amount is not drained, will always reduce as long as amount is non-zero
// useful for powerup-given armors
Default
{
+INVENTORY.AUTOACTIVATE;
@ -39,22 +45,6 @@ Class SWWMArmor : Armor abstract
}
}
if ( !found )
{
// is first item plating or a collar?
if ( (other.Inv is 'AlmasteelPlating') || (other.Inv is 'SayaCollar') )
{
// we're good
return;
}
// find first item with plating or collar after it
for ( Inventory i=other.Inv; i; i=i.Inv )
{
if ( (i == self) || (!(i.Inv is 'AlmasteelPlating' ) && !(i.Inv is 'SayaCollar')) ) continue;
found = i;
break;
}
}
if ( !found )
{
// check if first item in inventory is health or a sandwich
if ( (other.Inv is 'SWWMHealth') || (other.Inv is 'GrilledCheeseSandwich') )
@ -70,15 +60,6 @@ Class SWWMArmor : Armor abstract
break;
}
}
if ( !found )
{
// find last of either invinciball/ragekit/barrier power
for ( Inventory i=other.Inv; i; i=i.Inv )
{
if ( !(i is 'InvinciballPower') && !(i is 'RagekitPower') && !(i is 'BarrierPower') ) continue;
found = i;
}
}
if ( !found ) return;
// place ourselves right after it
Inventory saved = found.Inv;
@ -96,12 +77,12 @@ Class SWWMArmor : Armor abstract
int saved;
if ( (amount <= 0) || DamageTypeDefinition.IgnoreArmor(damageType) || (damage <= 0) )
return;
SWWMHandler.DoFlash(Owner,Color(int(clamp(damage*.15,1,16)),255,224,192),3);
Owner.A_StartSound("armor/hit",CHAN_DAMAGE,CHANF_OVERLAP,clamp(damage*.03,0.,1.),2.5);
if ( !bNOHITFLASH ) SWWMHandler.DoFlash(Owner,Color(int(clamp(damage*.15,1,16)),255,224,192),3);
if ( !bNOHITSOUND ) Owner.A_StartSound("armor/hit",CHAN_DAMAGE,CHANF_OVERLAP,clamp(damage*.03,0.,1.),2.5);
saved = HandleDamage(damage,damageType,flags);
int healed = max(0,saved-damage);
saved = min(saved,damage);
if ( amount <= saved ) saved = amount;
if ( !bNODRAIN && (amount <= saved) ) saved = amount;
newdamage -= saved;
if ( healed > 0 ) Owner.GiveBody(healed);
if ( (swwm_strictuntouchable == 1) && (saved > 0) && Owner.player )
@ -109,7 +90,7 @@ Class SWWMArmor : Armor abstract
let hnd = SWWMHandler(EventHandler.Find("SWWMHandler"));
if ( hnd ) hnd.tookdamage[Owner.PlayerNumber()] = true;
}
amount -= saved;
if ( !bNODRAIN ) amount -= saved;
damage = newdamage;
bool shouldautouse = false;
if ( swwm_enforceautousearmor == 1 ) shouldautouse = true;

View file

@ -39,7 +39,7 @@ Class SWWMHealth : Inventory abstract
// find last armor item, plating or collar
for ( Inventory i=other.Inv; i; i=i.Inv )
{
if ( !(i is 'SWWMArmor') && !(i is 'AlmasteelPlating') && !(i is 'SayaCollar') ) continue;
if ( !(i is 'SWWMArmor') ) continue;
found = i;
}
}
@ -59,15 +59,6 @@ Class SWWMHealth : Inventory abstract
break;
}
}
if ( !found )
{
// find last of either invinciball/ragekit/barrier power
for ( Inventory i=other.Inv; i; i=i.Inv )
{
if ( !(i is 'InvinciballPower') && !(i is 'RagekitPower') && !(i is 'BarrierPower') ) continue;
found = i;
}
}
if ( !found ) return;
// place ourselves right after it
Inventory saved = found.Inv;

View file

@ -183,11 +183,11 @@ Class GrilledCheeseSandwich : Inventory
override void AttachToOwner( Actor other )
{
Super.AttachToOwner(other);
// find last armor/health item or invuln/ragekit/barrier or the collar
// find last armor/health item
Inventory found = null;
for ( Inventory i=other.Inv; i; i=i.Inv )
{
if ( !(i is 'SWWMHealth') && !(i is 'SWWMArmor') && !(i is 'InvinciballPower') && !(i is 'RagekitPower') && !(i is 'BarrierPower') && !(i is 'AlmasteelPlating') && !(i is 'SayaCollar') ) continue;
if ( !(i is 'SWWMHealth') && !(i is 'SWWMArmor') ) continue;
found = i;
}
if ( !found ) return;
@ -828,33 +828,9 @@ Class InvinciballPower : Powerup
if ( (EffectTics <= 0) && Owner && Owner.CheckLocalView() ) Console.Printf(StringTable.Localize("$D_INVINCIBALL"));
}
override void AttachToOwner( Actor other )
override void ModifyDamage( int damage, Name damageType, out int newdamage, bool passive, Actor inflictor, Actor source, int flags )
{
Super.AttachToOwner(other);
// find first with health/armor, plating/collar, sandwich after it
Inventory found = null;
for ( Inventory i=other.Inv; i; i=i.Inv )
{
if ( !(i.Inv is 'SWWMHealth') && !(i.Inv is 'SWWMArmor') && !(i.Inv is 'GrilledCheeseSandwich') && !(i.Inv is 'AlmasteelPlating') && !(i.Inv is 'SayaCollar') ) continue;
found = i;
break;
}
if ( !found )
{
// we're good
return;
}
// place ourselves right after it
Inventory saved = found.Inv;
found.Inv = self;
other.Inv = Inv;
Inv = saved;
}
override void AbsorbDamage( int damage, Name damageType, out int newdamage, Actor inflictor, Actor source, int flags )
{
if ( Owner.ApplyDamageFactor(damageType,damage) <= 0 )
return; // this damage type is ignored, so don't flash
if ( !passive ) return;
if ( damageType == 'EndLevel' )
return; // don't trigger on endlevel damage
if ( damage > 0 )
@ -1107,29 +1083,6 @@ Class RagekitPower : Powerup
if ( (EffectTics <= 0) && Owner && Owner.CheckLocalView() ) Console.Printf(StringTable.Localize("$D_RAGEKIT"));
}
override void AttachToOwner( Actor other )
{
Super.AttachToOwner(other);
// find first with health/armor, plating/collar, sandwich or barrier after it
Inventory found = null;
for ( Inventory i=other.Inv; i; i=i.Inv )
{
if ( !(i.Inv is 'SWWMHealth') && !(i.Inv is 'SWWMArmor') && !(i.Inv is 'GrilledCheeseSandwich') && !(i.Inv is 'AlmasteelPlating') && !(i.Inv is 'SayaCollar') && !(i.Inv is 'BarrierPower') ) continue;
found = i;
break;
}
if ( !found )
{
// we're good
return;
}
// place ourselves right after it
Inventory saved = found.Inv;
found.Inv = self;
other.Inv = Inv;
Inv = saved;
}
void DoHitFX()
{
if ( level.maptime <= lasteffect+5 ) return;
@ -1146,16 +1099,14 @@ Class RagekitPower : Powerup
Demolitionist(Owner).lastbump *= .9;
}
override void AbsorbDamage( int damage, Name damageType, out int newdamage, Actor inflictor, Actor source, int flags )
{
if ( damageType == 'EndLevel' )
return; // don't trigger on endlevel damage
if ( damage > 0 ) newdamage = damage/4;
}
override void ModifyDamage( int damage, Name damageType, out int newdamage, bool passive, Actor inflictor, Actor source, int flags )
{
if ( passive ) return;
if ( passive )
{
if ( (damageType != 'EndLevel') && (damage > 0) )
newdamage = damage/4;
return;
}
if ( (damageType == 'Melee') || (damageType == 'Jump') || (damageType == 'Dash') || (damageType == 'Buttslam') || (damageType == 'GroundPound') )
{
newdamage = damage*8;
@ -1265,64 +1216,42 @@ Class Omnisight : Inventory
Mixin SWWMUseToPickup;
Mixin SWWMRespawn;
override bool Use( bool pickup )
override bool TryPickup( in out Actor toucher )
{
if ( !level.allmap )
{
if ( Owner.player == players[consoleplayer] )
Actor rt = toucher;
if ( toucher.player ) rt = toucher.player.mo;
if ( rt.player == players[consoleplayer] )
{
Owner.A_StartSound("powerup/omnisight",CHAN_ITEMEXTRA,CHANF_OVERLAP);
rt.A_StartSound("powerup/omnisight",CHAN_ITEMEXTRA,CHANF_OVERLAP);
// automatically zoom out so the player can know how far this goes
CVar.FindCVar('swwm_mm_zoom').SetFloat(2.);
}
if ( Owner is 'Demolitionist' )
Demolitionist(Owner).lastbump *= 1.1;
if ( rt is 'Demolitionist' )
Demolitionist(rt).lastbump *= 1.1;
level.allmap = true;
}
// activate all interest markers
let ti = ThinkerIterator.Create("SWWMInterestMarker",STAT_MAPMARKER);
Actor a;
while ( a = Actor(ti.Next()) ) a.bDORMANT = false;
// spread to all players
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] || !players[i].mo || !(players[i].mo is 'Demolitionist') || players[i].mo.FindInventory(GetClass()) ) continue;
let o = Inventory(Spawn(GetClass()));
o.ClearCounters();
o.AttachToOwner(players[i].mo);
if ( i == consoleplayer )
// activate all interest markers
let ti = ThinkerIterator.Create("SWWMInterestMarker",STAT_MAPMARKER);
Actor a;
while ( a = Actor(ti.Next()) ) a.bDORMANT = false;
// "spread" to all players
for ( int i=0; i<MAXPLAYERS; i++ )
{
Console.Printf(StringTable.Localize("$D_OMNISHARE"),Owner.player.GetUserName());
players[i].mo.A_StartSound("powerup/omnisight",CHAN_ITEMEXTRA,CHANF_OVERLAP);
// automatically zoom out so the player can know how far this goes
CVar.FindCVar('swwm_mm_zoom').SetFloat(2.);
if ( !playeringame[i] || !players[i].mo || (players[i] == rt.player) ) continue;
if ( i == consoleplayer )
{
Console.Printf(StringTable.Localize("$D_OMNISHARE"),rt.player.GetUserName());
players[i].mo.A_StartSound("powerup/omnisight",CHAN_ITEMEXTRA,CHANF_OVERLAP);
// automatically zoom out so the player can know how far this goes
CVar.FindCVar('swwm_mm_zoom').SetFloat(2.);
}
if ( players[i].mo is 'Demolitionist' )
Demolitionist(players[i].mo).lastbump *= 1.1;
}
if ( players[i].mo is 'Demolitionist' )
Demolitionist(players[i].mo).lastbump *= 1.1;
}
// not used up, must be kept for the targetting features to work
return false;
}
override void DetachFromOwner()
{
// reset zoom on removal
if ( (Owner.player == players[consoleplayer]) && (swwm_mm_zoom > 1.) )
CVar.FindCVar('swwm_mm_zoom').SetFloat(1.);
Super.DetachFromOwner();
}
override bool HandlePickup( Inventory item )
{
if ( item.GetClass() == GetClass() )
{
item.bPickupGood = true;
return true;
}
return false;
}
override bool ShouldSpawn()
{
if ( deathmatch ) return false;
return Super.ShouldSpawn();
GoAwayAndDie();
return true;
}
Default
{
@ -1334,17 +1263,13 @@ Class Omnisight : Inventory
Inventory.Icon "graphics/HUD/Icons/I_Omnisight.png";
Inventory.PickupSound "misc/p_pkup";
Inventory.PickupMessage "$I_OMNISIGHT";
Inventory.MaxAmount 1;
Inventory.InterHubAmount 0;
Inventory.RestrictedTo "Demolitionist";
Inventory.PickupFlash "SWWMPurplePickupFlash";
+INVENTORY.ALWAYSPICKUP;
+INVENTORY.AUTOACTIVATE;
+COUNTITEM;
+INVENTORY.BIGPOWERUP;
+INVENTORY.UNDROPPABLE;
+INVENTORY.UNTOSSABLE;
+FLOATBOB;
+NOTDMATCH;
FloatBobStrength 0.25;
Radius 6;
Height 26;
@ -2116,31 +2041,9 @@ Class BarrierPower : PowerIronFeet
+INVENTORY.ADDITIVETIME;
}
override void AttachToOwner( Actor other )
{
Super.AttachToOwner(other);
// find first item with armor/health, plating/collar, sandwich, invincibility after it
Inventory found = null;
for ( Inventory i=other.Inv; i; i=i.Inv )
{
if ( !(i.Inv is 'SWWMHealth') && !(i.Inv is 'SWWMArmor') && !(i.Inv is 'GrilledCheeseSandwich') && !(i.Inv is 'AlmasteelPlating') && !(i.Inv is 'SayaCollar') && !(i.Inv is 'InvinciballPower') ) continue;
found = i;
break;
}
if ( !found )
{
// we're good
return;
}
// place ourselves right after it
Inventory saved = found.Inv;
found.Inv = self;
other.Inv = Inv;
Inv = saved;
}
override void AbsorbDamage( int damage, Name damageType, out int newdamage )
override void ModifyDamage( int damage, Name damageType, out int newdamage, bool passive, Actor inflictor, Actor source, int flags )
{
if ( !passive ) return;
// negate elemental damage
if ( (damageType == 'Fire') || (damageType == 'Ice') || (damageType == 'Slime') || (damageType == 'Electric') || (damageType == 'Plasma') || (damageType == 'Radiation') || (damageType == 'Wind') || (damageType == 'Water') || (damageType == 'Corroded') || (damageType == 'Lava') )
newdamage = 0;

View file

@ -416,20 +416,20 @@ Class Demolitionist : PlayerPawn
// we don't need hexen or basic armors
// we can simplify the code a lot here since no handling of many special conditions is needed
let sc = Inventory(Spawn('SayaCollar'));
sc.AttachToOwner(self);
if ( !sc.CallTryPickup(self) ) sc.Destroy();
let ap = Inventory(Spawn('AlmasteelPlating'));
ap.AttachToOwner(self);
if ( !ap.CallTryPickup(self) ) ap.Destroy();
let dp = Inventory(Spawn('DeepImpact'));
dp.AttachToOwner(self);
if ( !dp.CallTryPickup(self) ) dp.Destroy();
let eg = ExplodiumGun(Spawn('ExplodiumGun'));
eg.AttachToOwner(self);
eg.firstselect = true;
player.ReadyWeapon = player.PendingWeapon = eg;
if ( !eg.CallTryPickup(self) ) eg.Destroy();
else player.ReadyWeapon = player.PendingWeapon = eg;
// in hexdd, we start with the chaos sphere in our grasp
if ( SWWMUtility.IsDeathkings() && SWWMUtility.CheckMD5List("vanillahexen.list") )
{
let cs = Inventory(Spawn('SWWMChaosSphere'));
cs.AttachToOwner(self);
if ( !cs.CallTryPickup(self) ) cs.Destroy();
}
// in deathmatch, we start with 8 embiggeners
if ( deathmatch )
@ -448,7 +448,7 @@ Class Demolitionist : PlayerPawn
while ( last.inv )
{
let i = last.inv;
if ( (i is 'SWWMArmor') || (i is 'HammerspaceEmbiggener') )
if ( ((i is 'SWWMArmor') && !i.bUNCLEARABLE) || (i is 'HammerspaceEmbiggener') )
{
i.DepleteOrDestroy();
if ( !i.bDestroyed ) last = i;
@ -512,7 +512,6 @@ Class Demolitionist : PlayerPawn
}
void SenseItems()
{
let thesight = FindInventory("Omnisight");
let bt = BlockThingsIterator.Create(self,800);
while ( bt.Next() )
{
@ -521,7 +520,7 @@ Class Demolitionist : PlayerPawn
if ( (i is 'Inventory') && (i.bINVISIBLE || !i.bSPECIAL || Inventory(i).Owner) ) continue;
if ( (i is 'Chancebox') && (i.CurState != i.SpawnState) ) continue;
if ( !SWWMUtility.SphereIntersect(i,pos,800) ) continue;
if ( !thesight && !CheckSight(i,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) continue;
if ( !level.allmap && !CheckSight(i,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) continue;
SWWMItemSense.Spawn(self,i);
}
bt.Destroy();
@ -989,12 +988,12 @@ Class Demolitionist : PlayerPawn
if ( !FindInventory("AlmasteelPlating") )
{
let ap = Inventory(Spawn("AlmasteelPlating"));
ap.AttachToOwner(self);
if ( !ap.CallTryPickup(self) ) ap.Destroy();
}
if ( !FindInventory("SayaCollar") )
{
let sc = Inventory(Spawn("SayaCollar"));
sc.AttachToOwner(self);
if ( !sc.CallTryPickup(self) ) sc.Destroy();
}
// this is why we need mod cvar callbacks
if ( swwm_singlefirst != oldsinglefirst )
@ -2961,6 +2960,18 @@ Class Demolitionist : PlayerPawn
{
// clean up attached actors
if ( selflight ) selflight.Destroy();
// get rid of our internal armors to fix some nonsense
Actor last = player.mo;
while ( last.inv )
{
let inv = last.inv;
if ( (inv is 'AlmasteelPlating') || (inv is 'SayaCollar') )
{
inv.Destroy();
if ( !inv.bDestroyed ) last = inv;
}
else last = inv;
}
// inventory wipes
if ( invwipe && (player.playerstate != PST_DEAD) )
{

View file

@ -2,12 +2,14 @@
// lucky collar
// made by Ashley Knox, given to you and Ibuki by Saya
Class SayaCollar : Inventory
Class SayaCollar : SWWMArmor
{
Default
{
+INVENTORY.UNDROPPABLE;
+INVENTORY.UNTOSSABLE;
Inventory.Amount 1;
Inventory.MaxAmount 1;
Inventory.InterHubAmount 1;
SWWMArmor.ArmorPriority 1;
+INVENTORY.UNCLEARABLE;
}
override void AbsorbDamage( int damage, Name damageType, out int newdamage, Actor inflictor, Actor source, int flags )
@ -25,37 +27,22 @@ Class SayaCollar : Inventory
newdamage = splitdmg[0]+splitdmg[1];
}
}
override void AttachToOwner( Actor other )
{
Super.AttachToOwner(other);
// if first item is health or sandwich, ignore
if ( (other.Inv is 'SWWMHealth') || (other.Inv is 'GrilledCheeseSandwich') )
return;
// if there's items before health/sandwich, squeeze right in
for ( Inventory i=other.Inv; i; i=i.Inv )
{
if ( (i == self) || (!(i.Inv is 'SWWMHealth' ) && !(i.Inv is 'GrilledCheeseSandwich')) ) continue;
Inventory saved = i.Inv;
i.Inv = self;
other.Inv = Inv;
Inv = saved;
break;
}
}
}
// high-resonant almasteel plating
// EXTRA THICC as Saya requested
Class AlmasteelPlating : Inventory
Class AlmasteelPlating : SWWMArmor
{
Inventory dbf;
Default
{
+INVENTORY.UNDROPPABLE;
+INVENTORY.UNTOSSABLE;
+INVENTORY.UNCLEARABLE;
Inventory.Amount 1;
Inventory.MaxAmount 1;
Inventory.InterHubAmount 1;
Inventory.RestrictedTo "Demolitionist";
SWWMArmor.ArmorPriority 2;
+INVENTORY.UNCLEARABLE;
}
override void DoEffect()
{
@ -85,22 +72,6 @@ Class AlmasteelPlating : Inventory
}
return false;
}
override void AttachToOwner( Actor other )
{
Super.AttachToOwner(other);
// if first item is the collar, just ignore
if ( other.Inv is 'SayaCollar' ) return;
// if there's items before collar, squeeze right in
for ( Inventory i=other.Inv; i; i=i.Inv )
{
if ( (i == self) || !(i.Inv is 'SayaCollar') ) continue;
Inventory saved = i.Inv;
i.Inv = self;
other.Inv = Inv;
Inv = saved;
break;
}
}
}
Class ReviveCooldown : Powerup

View file

@ -61,7 +61,7 @@ Class SWWMStaticHandler : StaticEventHandler
SWWMHandler.ClearAllShaders(players[consoleplayer]);
// force a reset of the minimap zoom in case it's set beyond safe levels
double mmz = swwm_mm_zoom;
if ( players[consoleplayer].mo && players[consoleplayer].mo.FindInventory("Omnisight") && (mmz >= 2.) ) mmz = 2.;
if ( level.allmap && (mmz >= 2.) ) mmz = 2.;
else if ( mmz >= 1. ) mmz = 1.;
else mmz = .5;
CVar.FindCVar('swwm_mm_zoom').SetFloat(mmz);