swwmgz_m/zscript/handler/swwm_statichandler_achievements.zsc
Marisa Kirisame d0afd69d34 Optimize achievement loading.
Add a new achievement (heh).
Don't show achievement notifications while the level is ending.
2021-03-24 17:41:38 +01:00

76 lines
2.1 KiB
Text

// achievement tracking
extend Class SWWMStaticHandler
{
ui int lastachievementnotify; // prevent overlap
Array<SWWMAchievement> achievements;
private ui bool CheckAchievement( SWWMAchievement a )
{
int val = a.state.GetInt();
// manually check progress
if ( a.progress )
{
int prog = a.progress.GetInt();
// special cases
if ( val && (prog < a.maxval) )
{
a.state.SetInt(0);
val = 0;
}
else if ( !val && (prog >= a.maxval) )
{
a.state.SetInt(1);
val = 1;
}
}
if ( (val == 1) && (gametic > lastachievementnotify) )
{
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;
}
return (val > 0);
}
private ui void CheckAllAchievements()
{
// 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;
int ev = -1;
for ( int i=0; i<achievements.Size(); i++ )
{
// this one is updated outside the loop
if ( achievements[i].basename == "everything" )
{
ev = i;
continue;
}
if ( !CheckAchievement(achievements[i]) )
alldone = false;
}
if ( ev == -1 ) return; // should not happen, though
int val = achievements[ev].state.GetInt();
// not done!
if ( !alldone )
{
if ( val != 0 ) achievements[ev].state.SetInt(0);
return;
}
// all done!
if ( val == 0 ) achievements[ev].state.SetInt(1);
else if ( (val == 1) && (gametic > lastachievementnotify) )
{
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;
}
}
}