Fix boss oneliners and boss detection.

This commit is contained in:
Mari the Deer 2021-10-20 00:15:43 +02:00
commit b9206521fd
23 changed files with 132 additions and 37 deletions

View file

@ -3,6 +3,45 @@
Class EndgameBossMarker : Inventory {}
Class BossMarker : Inventory {}
Class IconMessage : Inventory
{
override void DoEffect()
{
if ( Owner.InStateSequence(Owner.CurState,Owner.SeeState) )
{
Console.MidPrint(smallfont,StringTable.Localize("$BOSSLINE_IOS"));
DepleteOrDestroy();
return;
}
}
}
Class ArchangelusMessage : Inventory
{
override void DoEffect()
{
if ( Owner.InStateSequence(Owner.CurState,Owner.SeeState) )
{
Console.MidPrint(smallfont,StringTable.Localize("$BOSSLINE_ARCHANGELUS"));
DepleteOrDestroy();
return;
}
}
}
Class DSparilMessage : Inventory
{
override void DoEffect()
{
if ( Owner.InStateSequence(Owner.CurState,Owner.SeeState) )
{
Console.MidPrint(smallfont,StringTable.Localize("$BOSSLINE_DSPARIL"));
DepleteOrDestroy();
return;
}
}
}
extend Class SWWMHandler
{
String bosstag;
@ -179,7 +218,10 @@ extend Class SWWMHandler
e.Thing.GiveInventory('EndgameBossMarker',1);
}
if ( e.Thing is 'BossEye' )
{
bossviewactor = e.Thing;
e.Thing.GiveInventory('IconMessage',1);
}
bosstag = "$BT_IOS";
}
else if ( bossmap == MAP_DLVL08 )
@ -237,6 +279,7 @@ extend Class SWWMHandler
bosstag = "$BT_DSPARIL2";
e.Thing.GiveInventory('BossMarker',1);
e.Thing.GiveInventory('EndgameBossMarker',1);
e.Thing.GiveInventory('DSparilMessage',1);
}
}
else if ( bossmap == MAP_HMAP38 )
@ -321,8 +364,19 @@ extend Class SWWMHandler
}
else if ( bossmap == MAP_EVMAP30 )
{
if ( e.Thing.GetClassName() == "ArchangelusA" )
if ( e.Thing.GetClassName() == "Archangelus" )
{
bossactors.Push(e.Thing);
bossviewactor = e.Thing;
bosstag = "$BT_ARCHANGELUS";
e.Thing.GiveInventory('ArchangelusMessage',1);
}
else if ( e.Thing.GetClassName() == "ArchangelusA" )
{
// first phase
bossactors.Clear();
bossviewactor = null;
initialized = false;
bossactors.Push(e.Thing);
if ( upgrademe ) e.Thing.StartHealth = e.Thing.Health *= 5;
if ( trk ) trk.bBOSS = true;
@ -334,6 +388,7 @@ extend Class SWWMHandler
{
// second phase
bossactors.Clear();
bossviewactor = null;
initialized = false;
bossactors.Push(e.Thing);
if ( upgrademe ) e.Thing.StartHealth = e.Thing.Health *= 5;
@ -355,12 +410,28 @@ extend Class SWWMHandler
if ( (!bossactors[i].target || !bossactors[i].CheckSight(bossactors[i].target,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY))
&& (!bossviewactor || (bossviewactor && !bossviewactor.target)) ) continue;
initialized = true;
// hacky
// oneliners
if ( bossmap == MAP_DMAP30 )
{
highesttic = gametic;
lastcombat = AddOneliner("romero",1,200);
}
else if ( bossmap == MAP_HE3M8 )
{
highesttic = gametic;
if ( bosstag = "$BT_DSPARIL2" ) lastcombat = AddOneliner("dsparilb",1,100);
else lastcombat = AddOneliner("dsparila",1,80);
}
else if ( bossmap == MAP_HMAP40 )
{
highesttic = gametic;
lastcombat = AddOneliner("korax",1,40);
}
else if ( (bossmap == MAP_EVMAP30) && bossviewactor )
{
highesttic = gametic;
lastcombat = AddOneliner("archangelus",1,300);
}
break;
}
}

View file

@ -120,6 +120,18 @@ extend Class SWWMHandler
let t = new("UglyBoyGetsFuckedUp");
t.ChangeStatNum(Thinker.STAT_USER);
}
// Archangelus death
if ( e.Thing.GetClassName() == "ArchangelusB" )
{
// kill all other monsters
let ti = ThinkerIterator.Create("Actor");
Actor a;
while ( a = Actor(ti.Next()) )
{
if ( (a != e.Thing) && (a.Health > 0) && (a.bBossSpawned || a.bCOUNTKILL) )
a.DamageMobj(e.Thing,e.Thing,a.Health,'EndMii',DMG_FORCED|DMG_THRUSTLESS);
}
}
if ( swwm_partytime )
{
let pt = Actor.Spawn("PartyTime",e.Thing.pos);

View file

@ -19,7 +19,7 @@ extend Class SWWMHandler
int lastorder;
bool lastloop;
transient ThinkerIterator cti;
bool tauntedboss;
Actor tauntedboss;
private void LangRefresh()
{
@ -127,21 +127,10 @@ extend Class SWWMHandler
combatactors.Push(a);
combattics.Push(gametic);
enteredcombat = true;
if ( (a is 'Korax') || (a is 'Sorcerer1') || (a.GetClassName() == "ArchangelusA") )
keyactor = a;
if ( a.bBOSS || a.FindInventory("BossMarker") )
bossfound = true;
}
}
// special combat start lines
if ( enteredcombat && keyactor && !tauntedboss )
{
if ( keyactor is 'Korax' ) lastcombat = AddOneliner("korax",1,40);
else if ( keyactor is 'Sorcerer1' ) lastcombat = AddOneliner("dsparil",1,100);
else if ( keyactor.GetClassName() == "ArchangelusA" ) lastcombat = AddOneliner("archangelus",1,350);
tauntedboss = true;
return;
}
// be smart, demo-chan, don't shout if you're invisible, or you'll make it worse
if ( enteredcombat && ((bossfound && (!lastcombat || (gametic > lastcombat+120))) || (!bossfound && (!highesttic || (gametic > highesttic+700)))) && !players[consoleplayer].mo.FindInventory("GhostPower") )
lastcombat = AddOneliner("fightstart",1,10);