Add a new achievement (heh). Don't show achievement notifications while the level is ending.
76 lines
2.1 KiB
Text
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;
|
|
}
|
|
}
|
|
}
|