Optimize achievement loading.

Add a new achievement (heh).
Don't show achievement notifications while the level is ending.
This commit is contained in:
Mari the Deer 2021-03-24 17:41:38 +01:00
commit d0afd69d34
16 changed files with 611 additions and 1337 deletions

View file

@ -90,6 +90,9 @@ extend Class SWWMHandler
// 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]);
}
private void SetupLockdefsCache( SWWMCachedLockInfo cli )

View file

@ -1,104 +1,34 @@
// achievement tracking
// constants for finetuning them numbers
const SA_GCSANDWICH = 25;
const SA_GHOST = 25;
const SA_ALLITEMS = 30;
const SA_CONGA = 15;
const SA_GRAVITY = 25;
const SA_FLIGHT = 2000;
const SA_PAR = 30;
const SA_GOLDEN = 24;
const SA_GIB = 500;
const SA_BARRIER = 25;
const SA_BOSSDASH = 10;
const SA_SNEEZE = 20;
const SA_FUEL = 400;
const SA_SLAYER = 40;
const SA_STOMP = 50;
const SA_THRUWALL = 25;
const SA_LEAD = 1500;
const SA_LOVE = 20;
const SA_BUTTS = 100;
const SA_PLUSH = 20;
const SA_BUSTIN = 40;
const SA_MOTH = 50;
const SA_BRAKE = 20;
const SA_RAGE = 25;
const SA_PARRY = 100;
const SA_ALLKILLS = 30;
const SA_ALLSECRETS = 30;
const SA_REFLECT = 20;
const SA_FRIEND = 30;
const SA_SHOCK = 30;
const SA_BALLS = 10;
const SA_REFRESH = 25;
const SA_STEP = 60;
const SA_SUNNY = 25;
const SA_THICC = 80;
const SA_SLEMG = 50;
const SA_JUMP = 80;
const SA_EZKILL = 100;
const SA_ROAST = 30;
const SA_DAB = 100;
const SA_HND = 6;
const SA_GEPGUN = 30;
const SA_PENE = 20;
const SA_ACID = 100;
const SA_SANIC = 800;
const SA_BUNE = 150;
const SA_BONK = 300;
const SA_ANOM = 25;
// achievement unlock tracking
extend Class SWWMStaticHandler
{
ui int lastachievementnotify; // prevent overlap
Array<SWWMAchievement> achievements;
private ui bool CheckAchievement( Name ac, String acname, int acnum, Name acprog )
private ui bool CheckAchievement( SWWMAchievement a )
{
let ev = CVar.FindCVar(ac);
int val = ev.GetInt();
int val = a.state.GetInt();
// manually check progress
if ( acprog != 'None' )
if ( a.progress )
{
int prog = CVar.FindCVar(acprog).GetInt();
int maxval = acnum;
int prog = a.progress.GetInt();
// special cases
if ( ac == 'swwm_achievement_allcoll' )
if ( val && (prog < a.maxval) )
{
int nc = 0;
for ( int i=0; i<AllActorClasses.Size(); i++ )
{
let c = (Class<SWWMCollectible>)(AllActorClasses[i]);
if ( !c || (c == 'SWWMCollectible') ) continue;
let def = GetDefaultByType(c);
// check that we can collect it in this IWAD
if ( !def.ValidGame() ) continue;
nc++;
}
maxval = nc;
}
else if ( ac == 'swwm_achievement_dakka' ) maxval = 60;
else if ( ac == 'swwm_achievement_dosh' ) maxval = 1000000000;
else if ( ac == 'swwm_achievement_mega' ) maxval = 1000000;
else if ( ac == 'swwm_achievement_iwad' ) maxval = 7;
if ( val && (prog < maxval) )
{
ev.SetInt(0);
a.state.SetInt(0);
val = 0;
}
else if ( !val && (prog >= maxval) )
else if ( !val && (prog >= a.maxval) )
{
ev.SetInt(1);
a.state.SetInt(1);
val = 1;
}
}
if ( (val == 1) && (gametic > lastachievementnotify) )
{
ev.SetInt(2);
EventHandler.SendNetworkEvent("swwmachievement."..acname.."_TAG",consoleplayer);
let notif = new("SWWMAchievementNotification").Init(acname,acnum);
a.state.SetInt(2);
EventHandler.SendNetworkEvent("swwmachievement."..a.basename,consoleplayer);
let notif = new("SWWMAchievementNotification").Init(a.basename,a.icon,a.hasformat?a.maxval:0);
StatusBar.AttachMessage(notif,-3478);
lastachievementnotify = gametic+200;
}
@ -107,415 +37,38 @@ extend Class SWWMStaticHandler
private ui void CheckAllAchievements()
{
// don't check constantly
if ( (maptime < 105) || (maptime%35) ) return;
// cvar assigned
static const Name vars[] =
{
'swwm_achievement_gcsandwich',
'swwm_achievement_onestanding',
'swwm_achievement_oopsie',
'swwm_achievement_ghost',
'swwm_achievement_clonk',
'swwm_achievement_allitems',
'swwm_achievement_conga',
'swwm_achievement_gravity',
'swwm_achievement_flight',
'swwm_achievement_cliffyb',
'swwm_achievement_par',
'swwm_achievement_oneguy',
'swwm_achievement_golden',
'swwm_achievement_gib',
'swwm_achievement_barrier',
'swwm_achievement_bossdash',
'swwm_achievement_sneeze',
'swwm_achievement_fuel',
'swwm_achievement_slayer',
'swwm_achievement_dime',
'swwm_achievement_stomp',
'swwm_achievement_cheat',
'swwm_achievement_thruwall',
'swwm_achievement_mashiro',
'swwm_achievement_lead',
'swwm_achievement_love',
'swwm_achievement_butts',
'swwm_achievement_plush',
'swwm_achievement_bustin',
'swwm_achievement_moth',
'swwm_achievement_iwad',
'swwm_achievement_brake',
'swwm_achievement_rage',
'swwm_achievement_abort',
'swwm_achievement_parry',
'swwm_achievement_allkills',
'swwm_achievement_allsecrets',
'swwm_achievement_reflect',
'swwm_achievement_sekiro',
'swwm_achievement_wave',
'swwm_achievement_friend',
'swwm_achievement_shock',
'swwm_achievement_balls',
'swwm_achievement_refresh',
'swwm_achievement_step',
'swwm_achievement_sunny',
'swwm_achievement_thicc',
'swwm_achievement_allcoll',
'swwm_achievement_slemg',
'swwm_achievement_dosh',
'swwm_achievement_jump',
'swwm_achievement_ezkill',
'swwm_achievement_ligma',
'swwm_achievement_yeet',
'swwm_achievement_mbf',
'swwm_achievement_lightning',
'swwm_achievement_dakka',
'swwm_achievement_roast',
'swwm_achievement_dab',
'swwm_achievement_hnd',
'swwm_achievement_gepgun',
'swwm_achievement_fuller',
'swwm_achievement_pene',
'swwm_achievement_acid',
'swwm_achievement_salt',
'swwm_achievement_mega',
'swwm_achievement_sanic',
'swwm_achievement_tele',
'swwm_achievement_bune',
'swwm_achievement_bonk',
'swwm_achievement_anom',
'swwm_achievement_anone',
'swwm_achievement_wantdie'
};
// localized name
static const String names[] =
{
"$SWWM_ACHIEVEMENT_GCSANDWICH",
"$SWWM_ACHIEVEMENT_ONESTANDING",
"$SWWM_ACHIEVEMENT_OOPSIE",
"$SWWM_ACHIEVEMENT_GHOST",
"$SWWM_ACHIEVEMENT_CLONK",
"$SWWM_ACHIEVEMENT_ALLITEMS",
"$SWWM_ACHIEVEMENT_CONGA",
"$SWWM_ACHIEVEMENT_GRAVITY",
"$SWWM_ACHIEVEMENT_FLIGHT",
"$SWWM_ACHIEVEMENT_CLIFFYB",
"$SWWM_ACHIEVEMENT_PAR",
"$SWWM_ACHIEVEMENT_ONEGUY",
"$SWWM_ACHIEVEMENT_GOLDEN",
"$SWWM_ACHIEVEMENT_GIB",
"$SWWM_ACHIEVEMENT_BARRIER",
"$SWWM_ACHIEVEMENT_BOSSDASH",
"$SWWM_ACHIEVEMENT_SNEEZE",
"$SWWM_ACHIEVEMENT_FUEL",
"$SWWM_ACHIEVEMENT_SLAYER",
"$SWWM_ACHIEVEMENT_DIME",
"$SWWM_ACHIEVEMENT_STOMP",
"$SWWM_ACHIEVEMENT_CHEAT",
"$SWWM_ACHIEVEMENT_THRUWALL",
"$SWWM_ACHIEVEMENT_MASHIRO",
"$SWWM_ACHIEVEMENT_LEAD",
"$SWWM_ACHIEVEMENT_LOVE",
"$SWWM_ACHIEVEMENT_BUTTS",
"$SWWM_ACHIEVEMENT_PLUSH",
"$SWWM_ACHIEVEMENT_BUSTIN",
"$SWWM_ACHIEVEMENT_MOTH",
"$SWWM_ACHIEVEMENT_IWAD",
"$SWWM_ACHIEVEMENT_BRAKE",
"$SWWM_ACHIEVEMENT_RAGE",
"$SWWM_ACHIEVEMENT_ABORT",
"$SWWM_ACHIEVEMENT_PARRY",
"$SWWM_ACHIEVEMENT_ALLKILLS",
"$SWWM_ACHIEVEMENT_ALLSECRETS",
"$SWWM_ACHIEVEMENT_REFLECT",
"$SWWM_ACHIEVEMENT_SEKIRO",
"$SWWM_ACHIEVEMENT_WAVE",
"$SWWM_ACHIEVEMENT_FRIEND",
"$SWWM_ACHIEVEMENT_SHOCK",
"$SWWM_ACHIEVEMENT_BALLS",
"$SWWM_ACHIEVEMENT_REFRESH",
"$SWWM_ACHIEVEMENT_STEP",
"$SWWM_ACHIEVEMENT_SUNNY",
"$SWWM_ACHIEVEMENT_THICC",
"$SWWM_ACHIEVEMENT_ALLCOLL",
"$SWWM_ACHIEVEMENT_SLEMG",
"$SWWM_ACHIEVEMENT_DOSH",
"$SWWM_ACHIEVEMENT_JUMP",
"$SWWM_ACHIEVEMENT_EZKILL",
"$SWWM_ACHIEVEMENT_LIGMA",
"$SWWM_ACHIEVEMENT_YEET",
"$SWWM_ACHIEVEMENT_MBF",
"$SWWM_ACHIEVEMENT_LIGHTNING",
"$SWWM_ACHIEVEMENT_DAKKA",
"$SWWM_ACHIEVEMENT_ROAST",
"$SWWM_ACHIEVEMENT_DAB",
"$SWWM_ACHIEVEMENT_HND",
"$SWWM_ACHIEVEMENT_GEPGUN",
"$SWWM_ACHIEVEMENT_FULLER",
"$SWWM_ACHIEVEMENT_PENE",
"$SWWM_ACHIEVEMENT_ACID",
"$SWWM_ACHIEVEMENT_SALT",
"$SWWM_ACHIEVEMENT_MEGA",
"$SWWM_ACHIEVEMENT_SANIC",
"$SWWM_ACHIEVEMENT_TELE",
"$SWWM_ACHIEVEMENT_BUNE",
"$SWWM_ACHIEVEMENT_BONK",
"$SWWM_ACHIEVEMENT_ANOM",
"$SWWM_ACHIEVEMENT_ANONE",
"$SWWM_ACHIEVEMENT_WANTDIE"
};
// has number in txt
static const int number[] =
{
SA_GCSANDWICH,
0, // ONESTANDING
0, // OOPSIE
SA_GHOST,
0, // CLONK
SA_ALLITEMS,
SA_CONGA,
SA_GRAVITY,
SA_FLIGHT,
0, // CLIFFYB
SA_PAR,
0, // ONEGUY
SA_GOLDEN,
SA_GIB,
SA_BARRIER,
SA_BOSSDASH,
SA_SNEEZE,
SA_FUEL,
SA_SLAYER,
0, // DIME
SA_STOMP,
0, // CHEAT
SA_THRUWALL,
0, // MASHIRO
SA_LEAD,
SA_LOVE,
SA_BUTTS,
SA_PLUSH,
SA_BUSTIN,
SA_MOTH,
0, // IWAD
SA_BRAKE,
SA_RAGE,
0, // ABORT
SA_PARRY,
SA_ALLKILLS,
SA_ALLSECRETS,
SA_REFLECT,
0, // SEKIRO
0, // WAVE
SA_FRIEND,
SA_SHOCK,
SA_BALLS,
SA_REFRESH,
SA_STEP,
SA_SUNNY,
SA_THICC,
0, // ALLCOLL
SA_SLEMG,
0, // DOSH
SA_JUMP,
SA_EZKILL,
0, // LIGMA
0, // YEET
0, // MBF
0, // LIGHTNING
0, // DAKKA
SA_ROAST,
SA_DAB,
SA_HND,
SA_GEPGUN,
0, // FULLER
SA_PENE,
SA_ACID,
0, // SALT
0, // MEGA
SA_SANIC,
0, // TELE
SA_BUNE,
SA_BONK,
SA_ANOM,
0, // ANONE
0 // WANTDIE
};
// is ignored (hide away achievements that can't be done yet)
static const bool ignoreme[] =
{
false, // GCSANDWICH
false, // ONESTANDING
false, // OOPSIE
false, // GHOST
false, // CLONK
false, // ALLITEMS
false, // CONGA
false, // GRAVITY
false, // FLIGHT
false, // CLIFFYB
false, // PAR
false, // ONEGUY
false, // GOLDEN
false, // GIB
false, // BARRIER
false, // BOSSDASH
false, // SNEEZE
false, // FUEL
false, // SLAYER
false, // DIME
false, // STOMP
false, // CHEAT
false, // THRUWALL
true, // MASHIRO
false, // LEAD
false, // LOVE
false, // BUTTS
false, // PLUSH
false, // BUSTIN
false, // MOTH
false, // IWAD
false, // BRAKE
false, // RAGE
false, // ABORT
false, // PARRY
false, // ALLKILLS
false, // ALLSECRETS
false, // REFLECT
false, // SEKIRO
false, // WAVE
false, // FRIEND
false, // SHOCK
false, // BALLS
false, // REFRESH
false, // STEP
false, // SUNNY
false, // THICC
false, // ALLCOLL
false, // SLEMG
false, // DOSH
false, // JUMP
false, // EZKILL
false, // LIGMA
false, // YEET
false, // MBF
true, // LIGHTNING
true, // DAKKA
true, // ROAST
true, // DAB
true, // HND
true, // GEPGUN
true, // FULLER
true, // PENE
false, // ACID
false, // SALT
false, // MEGA
false, // SANIC
false, // TELE
false, // BUNE
false, // BONK
false, // ANOM
false, // ANONE
false // WANTDIE
};
// progress tracking cvar (if any)
static const Name pvar[] =
{
'swwm_progress_gcsandwich',
'None', // ONESTANDING
'None', // OOPSIE
'swwm_progress_ghost',
'None', // CLONK
'swwm_progress_allitems',
'swwm_progress_conga',
'swwm_progress_gravity',
'swwm_progress_flight',
'None', // CLIFFYB
'swwm_progress_par',
'None', // ONEGUY
'swwm_progress_golden',
'swwm_progress_gib',
'swwm_progress_barrier',
'swwm_progress_bossdash',
'swwm_progress_sneeze',
'swwm_progress_fuel',
'swwm_progress_slayer',
'None', // DIME
'swwm_progress_stomp',
'None', // CHEAT
'swwm_progress_thruwall',
'None', // MASHIRO
'swwm_progress_lead',
'swwm_progress_love',
'swwm_progress_butts',
'swwm_progress_plush',
'swwm_progress_bustin',
'swwm_progress_moth',
'swwm_progress_iwad',
'swwm_progress_brake', // BRAKE
'swwm_progress_rage',
'None', // ABORT
'swwm_progress_parry',
'swwm_progress_allkills',
'swwm_progress_allsecrets',
'swwm_progress_reflect',
'None', // SEKIRO
'None', // WAVE
'swwm_progress_friend',
'swwm_progress_shock',
'swwm_progress_balls',
'swwm_progress_refresh',
'swwm_progress_step',
'swwm_progress_sunny',
'swwm_progress_thicc',
'swwm_progress_allcoll',
'swwm_progress_slemg',
'swwm_progress_dosh',
'swwm_progress_jump',
'swwm_progress_ezkill',
'None', // LIGMA
'None', // YEET
'None', // MBF
'None', // LIGHTNING
'swwm_progress_dakka',
'swwm_progress_roast',
'swwm_progress_dab',
'swwm_progress_hnd',
'swwm_progress_gepgun',
'None', // FULLER
'swwm_progress_pene',
'swwm_progress_acid',
'None', // SALT
'swwm_progress_mega',
'swwm_progress_sanic',
'None', // TELE
'swwm_progress_bune',
'swwm_progress_bonk',
'swwm_progress_anom',
'None', // ANONE
'None' // WANTDIE
};
// don't check constantly, and don't check during level transitions
if ( unloading || (maptime < 105) || (maptime%35) ) return;
// first load
if ( achievements.Size() <= 0 ) SWWMUtility.LoadAchievements(achievements);
bool alldone = true;
for ( int i=0; i<vars.Size(); i++ )
int ev = -1;
for ( int i=0; i<achievements.Size(); i++ )
{
if ( ignoreme[i] ) continue;
if ( !CheckAchievement(vars[i],names[i],number[i],pvar[i]) )
// this one is updated outside the loop
if ( achievements[i].basename == "everything" )
{
ev = i;
continue;
}
if ( !CheckAchievement(achievements[i]) )
alldone = false;
}
let ev = CVar.FindCVar('swwm_achievement_everything');
int val = ev.GetInt();
if ( ev == -1 ) return; // should not happen, though
int val = achievements[ev].state.GetInt();
// not done!
if ( !alldone )
{
if ( val != 0 ) ev.SetInt(0);
if ( val != 0 ) achievements[ev].state.SetInt(0);
return;
}
// all done!
if ( val == 0 ) ev.SetInt(1);
if ( val == 0 ) achievements[ev].state.SetInt(1);
else if ( (val == 1) && (gametic > lastachievementnotify) )
{
ev.SetInt(2);
EventHandler.SendNetworkEvent("swwmachievement.$SWWM_ACHIEVEMENT_EVERYTHING_TAG",consoleplayer);
let notif = new("SWWMAchievementNotification").Init("$SWWM_ACHIEVEMENT_EVERYTHING");
achievements[ev].state.SetInt(2);
EventHandler.SendNetworkEvent("swwmachievement."..achievements[ev].basename,consoleplayer);
let notif = new("SWWMAchievementNotification").Init(achievements[ev].basename,achievements[ev].icon);
StatusBar.AttachMessage(notif,-3478);
lastachievementnotify = gametic+200;
}