New achievements coded (Most icons still not done).
Various random tweaks and fixes. Reformatted and cleaned up Future Plans file.
This commit is contained in:
parent
112129d8f8
commit
0420d511a6
28 changed files with 493 additions and 294 deletions
|
|
@ -423,6 +423,7 @@ extend Class SWWMHandler
|
|||
StatusBar.AttachMessage(m,-1232);
|
||||
CVar.FindCVar('swwm_oldcheat').SetBool(true);
|
||||
}
|
||||
SWWMUtility.MarkAchievement('swwm_achievement_cheat',players[consoleplayer]);
|
||||
if ( SWWMUtility.CheatsDisabled(consoleplayer) )
|
||||
{
|
||||
kfail = true;
|
||||
|
|
|
|||
|
|
@ -8,6 +8,9 @@ extend Class SWWMHandler
|
|||
int spreecount[MAXPLAYERS];
|
||||
int lastkill[MAXPLAYERS];
|
||||
int multilevel[MAXPLAYERS];
|
||||
bool dealtdamage[MAXPLAYERS];
|
||||
bool reallytookdamage[MAXPLAYERS];
|
||||
int onehpspree[MAXPLAYERS];
|
||||
|
||||
// gibbing
|
||||
private void DoGibThing( WorldEvent e )
|
||||
|
|
@ -91,6 +94,7 @@ extend Class SWWMHandler
|
|||
if ( e.Thing.player )
|
||||
{
|
||||
tookdamage[e.Thing.PlayerNumber()] = true;
|
||||
reallytookdamage[e.Thing.PlayerNumber()] = true; // does not reset on revive
|
||||
let s = SWWMStats.Find(e.Thing.player);
|
||||
if ( s ) // deathmatch telefrag-on-spawn may cause this to be null
|
||||
{
|
||||
|
|
@ -100,6 +104,7 @@ extend Class SWWMHandler
|
|||
}
|
||||
if ( e.DamageSource && e.DamageSource.player )
|
||||
{
|
||||
dealtdamage[e.DamageSource.PlayerNumber()] = true;
|
||||
let s = SWWMStats.Find(e.DamageSource.player);
|
||||
if ( s ) // deathmatch telefrag-on-spawn may cause this to be null
|
||||
{
|
||||
|
|
@ -121,6 +126,9 @@ extend Class SWWMHandler
|
|||
tk.special1 = 1;
|
||||
else tk.special1 = -1;
|
||||
}
|
||||
// barrel destruction
|
||||
if ( (e.Thing is 'ExplosiveBarrel') && (e.Thing.Health <= 0) )
|
||||
SWWMUtility.AchievementProgressInc('swwm_progress_barrel',1,e.DamageSource.player);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -176,6 +184,7 @@ extend Class SWWMHandler
|
|||
lastcombat = AddOneliner("scorekill",1,15);
|
||||
}
|
||||
}
|
||||
int pnum = src.PlayerNumber();
|
||||
// achievement stuff
|
||||
if ( e.Thing.IsHostile(src) )
|
||||
{
|
||||
|
|
@ -191,17 +200,28 @@ extend Class SWWMHandler
|
|||
SWWMUtility.AchievementProgressInc('swwm_progress_thicc',1,src.player);
|
||||
else if ( (e.DamageType == 'Love') && !(e.Thing is 'WolfensteinSS') && (e.Thing.Species != 'WolfensteinSS') )
|
||||
SWWMUtility.AchievementProgressInc('swwm_progress_love',1,src.player);
|
||||
if ( e.Inflictor && e.Inflictor.FindInventory('ParriedBuff') )
|
||||
Inventory buff = e.Inflictor?e.Inflictor.FindInventory('ParriedBuff'):null;
|
||||
if ( buff )
|
||||
{
|
||||
SWWMUtility.AchievementProgressInc('swwm_progress_reflect',1,src.player);
|
||||
if ( (e.Thing is 'Cyberdemon') && (e.Inflictor is 'Rocket') && (buff.tracer == e.Thing) )
|
||||
SWWMUtility.MarkAchievement('swwm_achievement_cybully',src.player);
|
||||
}
|
||||
if ( (e.Inflictor is 'PusherWeapon') || (e.Inflictor is 'PusherProjectile') )
|
||||
SWWMUtility.AchievementProgressInc('swwm_progress_tender',1,src.player);
|
||||
Inventory tk;
|
||||
if ( (tk = e.Thing.FindInventory("DeepImpactOnlyToken")) && (tk.special1 == 1) )
|
||||
SWWMUtility.MarkAchievement('swwm_achievement_shame',src.player);
|
||||
SWWMUtility.AchievementProgressInc('swwm_progress_mega',1,src.player);
|
||||
if ( src.player.Health == 1 )
|
||||
{
|
||||
onehpspree[pnum]++;
|
||||
SWWMUtility.AchievementProgress('swwm_progress_onehp',onehpspree[pnum],src.player);
|
||||
}
|
||||
}
|
||||
// no credits unless it's a counted kill or marine (that isn't friendly) or another player in DM
|
||||
if ( e.Thing.IsFriend(src) || (!e.Thing.default.bCountKill && !(e.Thing is 'ScriptedMarine') && !(deathmatch && e.Thing.player)) )
|
||||
return;
|
||||
int pnum = src.PlayerNumber();
|
||||
if ( level.maptime < (lastkill[pnum]+5*GameTicRate) )
|
||||
multilevel[pnum]++;
|
||||
else multilevel[pnum] = 0;
|
||||
|
|
|
|||
|
|
@ -57,6 +57,26 @@ extend Class SWWMHandler
|
|||
s.AddLevelStats();
|
||||
s.lastcluster = level.cluster;
|
||||
}
|
||||
// nazi cleanup
|
||||
let ti = ThinkerIterator.Create("Actor");
|
||||
Actor a;
|
||||
bool hasnazis = false;
|
||||
bool livenazis = false;
|
||||
while ( a = Actor(ti.Next()) )
|
||||
{
|
||||
// yes, the dogs don't count (they're just dogs)
|
||||
if ( !(a is 'SWWMGuard') && !(a is 'SWWMSS') && !(a is 'SWWMHans') )
|
||||
continue;
|
||||
hasnazis = true;
|
||||
if ( a.Health > 0 ) livenazis = true;
|
||||
}
|
||||
if ( hasnazis && !livenazis )
|
||||
{
|
||||
if ( level.levelnum == 31 ) s.nazicleanup |= 1;
|
||||
else if ( level.levelnum == 32 ) s.nazicleanup |= 2;
|
||||
}
|
||||
if ( s.nazicleanup == 3 )
|
||||
SWWMUtility.MarkAchievement('swwm_achievement_trash',s.myplayer);
|
||||
}
|
||||
// reset score on dead players (death exit™)
|
||||
for ( int i=0; i<MAXPLAYERS; i++ )
|
||||
|
|
@ -91,15 +111,29 @@ extend Class SWWMHandler
|
|||
}
|
||||
if ( !collected ) SWWMUtility.MarkAchievement('swwm_achievement_cliffyb',players[consoleplayer]);
|
||||
}
|
||||
// these can't be done on hexen
|
||||
if ( gameinfo.GameType&GAME_Hexen ) return;
|
||||
// beat the par time?
|
||||
if ( level.partime && (Thinker.Tics2Seconds(level.maptime) <= level.partime) )
|
||||
SWWMUtility.AchievementProgressInc('swwm_progress_par',1,players[consoleplayer]);
|
||||
// blaze it?
|
||||
if ( Thinker.Tics2Seconds(level.maptime) == 260 )
|
||||
SWWMUtility.MarkAchievement('swwm_achievement_blaze',players[consoleplayer]);
|
||||
// one standing?
|
||||
if ( (level.total_monsters-level.killed_monsters) == 1 )
|
||||
SWWMUtility.MarkAchievement('swwm_achievement_onestanding',players[consoleplayer]);
|
||||
// nice?
|
||||
if ( players[consoleplayer].Health == 69 )
|
||||
SWWMUtility.MarkAchievement('swwm_achievement_nice',players[consoleplayer]);
|
||||
// peaceful/untouchable?
|
||||
if ( !dealtdamage[consoleplayer] )
|
||||
SWWMUtility.MarkAchievement('swwm_achievement_peace',players[consoleplayer]);
|
||||
if ( !reallytookdamage[consoleplayer] )
|
||||
SWWMUtility.MarkAchievement('swwm_achievement_untouchable',players[consoleplayer]);
|
||||
// in a hurry?
|
||||
if ( ((level.total_monsters > 0) || (level.total_items > 0) || (level.total_secrets > 0))
|
||||
&& (level.killed_monsters == 0) && (level.found_items == 0) && (level.found_secrets == 0) )
|
||||
SWWMUtility.MarkAchievement('swwm_achievement_hurry',players[consoleplayer]);
|
||||
}
|
||||
|
||||
private void SetupLockdefsCache( SWWMCachedLockInfo cli )
|
||||
|
|
@ -226,42 +260,48 @@ extend Class SWWMHandler
|
|||
if ( !SWWMUtility.IsExitLine(l) )
|
||||
continue;
|
||||
if ( skipme.Find(l) < skipme.Size() ) continue;
|
||||
Vector3 lpos = SWWMUtility.UseLinePos(l);
|
||||
skipme.Push(l);
|
||||
// look for connected lines
|
||||
int xcnt = 1;
|
||||
Array<Line> con;
|
||||
con.Clear();
|
||||
con.Push(l);
|
||||
int found;
|
||||
if ( l.frontsector )
|
||||
{
|
||||
for ( int j=0; j<l.frontsector.Lines.Size(); j++ )
|
||||
do
|
||||
{
|
||||
let l2 = l.frontsector.Lines[j];
|
||||
if ( (l2 == l) || (l2.special != l.special) ) continue;
|
||||
// needs to have a point in common with this one or any of the added lines
|
||||
if ( (l2.v1 != l.v1) && (l2.v2 != l.v2) && (l2.v1 != l.v2) && (l2.v2 != l.v1) )
|
||||
found = 0;
|
||||
for ( int j=0; j<l.frontsector.Lines.Size(); j++ )
|
||||
{
|
||||
let l2 = l.frontsector.Lines[j];
|
||||
if ( (l2.special != l.special) || (con.Find(l2) < con.Size()) ) continue;
|
||||
// needs to have a point in common with this one or any of the added lines
|
||||
bool nomatches = true;
|
||||
for ( int k=0; k<skipme.Size(); k++ )
|
||||
for ( int k=0; k<con.Size(); k++ )
|
||||
{
|
||||
if ( (l2.v1 != skipme[k].v1) && (l2.v2 != skipme[k].v2) && (l2.v1 != skipme[k].v2) && (l2.v2 != skipme[k].v1) )
|
||||
if ( (l2.v1 != con[k].v1) && (l2.v2 != con[k].v2) && (l2.v1 != con[k].v2) && (l2.v2 != con[k].v1) )
|
||||
continue;
|
||||
nomatches = false;
|
||||
break;
|
||||
}
|
||||
if ( nomatches ) continue;
|
||||
skipme.Push(l2);
|
||||
con.Push(l2);
|
||||
found++;
|
||||
}
|
||||
skipme.Push(l2);
|
||||
xcnt++;
|
||||
lpos += SWWMUtility.UseLinePos(l2);
|
||||
}
|
||||
while ( found > 0 );
|
||||
}
|
||||
if ( l.backsector )
|
||||
{
|
||||
for ( int j=0; j<l.backsector.Lines.Size(); j++ )
|
||||
do
|
||||
{
|
||||
let l2 = l.backsector.Lines[j];
|
||||
if ( (l2 == l) || (l2.special != l.special) ) continue;
|
||||
// needs to have a point in common with this one or any of the added lines
|
||||
if ( (l2.v1 != l.v1) && (l2.v2 != l.v2) && (l2.v1 != l.v2) && (l2.v2 != l.v1) )
|
||||
found = 0;
|
||||
for ( int j=0; j<l.backsector.Lines.Size(); j++ )
|
||||
{
|
||||
let l2 = l.backsector.Lines[j];
|
||||
if ( (l2.special != l.special) || (con.Find(l2) < con.Size()) ) continue;
|
||||
// needs to have a point in common with this one or any of the added lines
|
||||
bool nomatches = true;
|
||||
for ( int k=0; k<skipme.Size(); k++ )
|
||||
{
|
||||
|
|
@ -271,13 +311,17 @@ extend Class SWWMHandler
|
|||
break;
|
||||
}
|
||||
if ( nomatches ) continue;
|
||||
skipme.Push(l2);
|
||||
con.Push(l2);
|
||||
found++;
|
||||
}
|
||||
skipme.Push(l2);
|
||||
xcnt++;
|
||||
lpos += SWWMUtility.UseLinePos(l2);
|
||||
}
|
||||
while ( found > 0 );
|
||||
}
|
||||
lpos /= xcnt;
|
||||
Vector3 lpos = (0,0,0);
|
||||
for ( int i=0; i<con.Size(); i++ )
|
||||
lpos += SWWMUtility.UseLinePos(con[i]);
|
||||
lpos /= con.Size();
|
||||
SWWMInterest.Spawn(lpos,theline:l);
|
||||
}
|
||||
// spawn loot
|
||||
|
|
|
|||
|
|
@ -70,6 +70,12 @@ extend Class SWWMHandler
|
|||
// combat tracking
|
||||
private void CombatTrack()
|
||||
{
|
||||
// if players are above 1HP, reset the "one hp kill" counter
|
||||
for ( int i=0; i<MAXPLAYERS; i++ )
|
||||
{
|
||||
if ( !playeringame[i] ) continue;
|
||||
if ( players[i].Health != 1 ) onehpspree[i] = 0;
|
||||
}
|
||||
// prune old entries
|
||||
for ( int i=0; i<combatactors.Size(); i++ )
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue