swwmgz_m/zscript/handler/swwm_statichandler_achievements.zsc

569 lines
14 KiB
Text

// achievement tracking
// constants for finetuning them numbers
const SA_GCSANDWICH = 40;
const SA_GHOST = 30;
const SA_ALLITEMS = 75;
const SA_CONGA = 25;
const SA_EXPLOGUN = 5;
const SA_GRAVITY = 20;
const SA_FLIGHT = 1000;
const SA_PAR = 25;
const SA_GOLDEN = 24;
const SA_GIB = 500;
const SA_BARRIER = 30;
const SA_BOSSDASH = 20;
const SA_SNEEZE = 50;
const SA_FUEL = 200;
const SA_SLAYER = 40;
const SA_STOMP = 50;
const SA_THRUWALL = 30;
const SA_LEAD = 1500;
const SA_LOVE = 50;
const SA_BUTTS = 100;
const SA_PLUSH = 20;
const SA_BUSTIN = 40;
const SA_MOTH = 60;
const SA_BRAKE = 30;
const SA_RAGE = 40;
const SA_PARRY = 100;
const SA_ALLKILLS = 100;
const SA_ALLSECRETS = 50;
const SA_REFLECT = 50;
const SA_WAVE = 20;
const SA_FRIEND = 60;
const SA_SHOCK = 50;
const SA_BALLS = 30;
const SA_REFRESH = 40;
const SA_STEP = 60;
const SA_SUNNY = 30;
const SA_THICC = 80;
const SA_SLEMG = 100;
const SA_JUMP = 100;
const SA_EZKILL = 200;
const SA_ROAST = 30;
const SA_DAB = 60;
const SA_HND = 6;
const SA_GEPGUN = 50;
const SA_PENE = 20;
const SA_ACID = 200;
const SA_SANIC = 800;
const SA_BUNE = 150;
const SA_BONK = 300;
const SA_ANOM = 40;
// achievement unlock tracking
extend Class SWWMStaticHandler
{
ui int lastachievementnotify; // prevent overlap
private ui bool CheckAchievement( Name ac, String acname, int acnum, Name acprog )
{
let ev = CVar.FindCVar(ac);
int val = ev.GetInt();
// manually check progress
if ( acprog != 'None' )
{
int prog = CVar.FindCVar(acprog).GetInt();
int maxval = acnum;
// special cases
if ( ac == 'swwm_achievement_allcoll' )
{
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;
if ( val && (prog < maxval) )
{
ev.SetInt(0);
val = 0;
}
else if ( !val && (prog >= maxval) )
{
ev.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);
StatusBar.AttachMessage(notif,-3478);
lastachievementnotify = gametic+200;
}
return (val > 0);
}
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_hdoom',
'swwm_achievement_onestanding',
'swwm_achievement_oopsie',
'swwm_achievement_ghost',
'swwm_achievement_clonk',
'swwm_achievement_allitems',
'swwm_achievement_conga',
'swwm_achievement_explogun',
'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_broccolidoccoli',
'swwm_achievement_dime',
'swwm_achievement_stomp',
'swwm_achievement_cheat',
'swwm_achievement_god',
'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_tetris',
'swwm_achievement_pong',
'swwm_achievement_snake',
'swwm_achievement_smb',
'swwm_achievement_tyrian',
'swwm_achievement_bof'
};
// localized name
static const String names[] =
{
"$SWWM_ACHIEVEMENT_GCSANDWICH",
"$SWWM_ACHIEVEMENT_HDOOM",
"$SWWM_ACHIEVEMENT_ONESTANDING",
"$SWWM_ACHIEVEMENT_OOPSIE",
"$SWWM_ACHIEVEMENT_GHOST",
"$SWWM_ACHIEVEMENT_CLONK",
"$SWWM_ACHIEVEMENT_ALLITEMS",
"$SWWM_ACHIEVEMENT_CONGA",
"$SWWM_ACHIEVEMENT_EXPLOGUN",
"$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_BROCCOLIDOCCOLI",
"$SWWM_ACHIEVEMENT_DIME",
"$SWWM_ACHIEVEMENT_STOMP",
"$SWWM_ACHIEVEMENT_CHEAT",
"$SWWM_ACHIEVEMENT_GOD",
"$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_TETRIS",
"$SWWM_ACHIEVEMENT_PONG",
"$SWWM_ACHIEVEMENT_SNAKE",
"$SWWM_ACHIEVEMENT_SMB",
"$SWWM_ACHIEVEMENT_TYRIAN",
"$SWWM_ACHIEVEMENT_BOF"
};
// has number in txt
static const int number[] =
{
SA_GCSANDWICH,
0, // HDOOM
0, // ONESTANDING
0, // OOPSIE
SA_GHOST,
0, // CLONK
SA_ALLITEMS,
SA_CONGA,
SA_EXPLOGUN,
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, // BROCCOLIDOCCOLI
0, // DIME
SA_STOMP,
0, // CHEAT
0, // GOD
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
SA_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, // TETRIS
0, // PONG
0, // SNAKE
0, // SMB
0, // TYRIAN
0 // BOF
};
// is ignored (hide away achievements that can't be done yet)
static const bool ignoreme[] =
{
false, // GCSANDWICH
false, // HDOOM
false, // ONESTANDING
false, // OOPSIE
false, // GHOST
false, // CLONK
false, // ALLITEMS
false, // CONGA
false, // EXPLOGUN
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, // BROCCOLIDOCCOLI
false, // DIME
false, // STOMP
false, // CHEAT
false, // GOD
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
true, // TETRIS
true, // PONG
true, // SNAKE
true, // SMB
true, // TYRIAN
true // BOF
};
// progress tracking cvar (if any)
static const Name pvar[] =
{
'swwm_progress_gcsandwich', // GCSANDWICH
'None', // HDOOM
'None', // ONESTANDING
'None', // OOPSIE
'swwm_progress_ghost', // GHOST
'None', // CLONK
'swwm_progress_allitems', // ALLITEMS
'swwm_progress_conga', // CONGA
'swwm_progress_explogun', // EXPLOGUN
'swwm_progress_gravity', // GRAVITY
'swwm_progress_flight', // FLIGHT
'None', // CLIFFYB
'swwm_progress_par', // PAR
'None', // ONEGUY
'swwm_progress_golden', // GOLDEN
'swwm_progress_gib', // GIB
'swwm_progress_barrier', // BARRIER
'swwm_progress_bossdash', // BOSSDASH
'swwm_progress_sneeze', // SNEEZE
'swwm_progress_fuel', // FUEL
'swwm_progress_slayer', // SLAYER
'None', // BROCCOLIDOCCOLI
'None', // DIME
'swwm_progress_stomp', // STOMP
'None', // CHEAT
'None', // GOD
'swwm_progress_thruwall', // THRUWALL
'None', // MASHIRO
'swwm_progress_lead', // LEAD
'swwm_progress_love', // LOVE
'swwm_progress_butts', // BUTTS
'swwm_progress_plush', // PLUSH
'swwm_progress_bustin', // BUSTIN
'swwm_progress_moth', // MOTH
'None', // IWAD
'swwm_progress_brake', // BRAKE
'swwm_progress_rage', // RAGE
'None', // ABORT
'swwm_progress_parry', // PARRY
'swwm_progress_allkills', // ALLKILLS
'swwm_progress_allsecrets', // ALLSECRETS
'swwm_progress_reflect', // REFLECT
'None', // SEKIRO
'swwm_progress_wave', // WAVE
'swwm_progress_friend', // FRIEND
'swwm_progress_shock', // SHOCK
'swwm_progress_balls', // BALLS
'swwm_progress_refresh', // REFRESH
'swwm_progress_step', // STEP
'swwm_progress_sunny', // SUNNY
'swwm_progress_thicc', // THICC
'swwm_progress_allcoll', // ALLCOLL
'swwm_progress_slemg', // SLEMG
'swwm_progress_dosh', // DOSH
'swwm_progress_jump', // JUMP
'swwm_progress_ezkill', // EZKILL
'None', // LIGMA
'None', // YEET
'None', // MBF
'None', // LIGHTNING
'swwm_progress_dakka', // DAKKA
'swwm_progress_roast', // ROAST
'swwm_progress_dab', // DAB
'swwm_progress_hnd', // HND
'swwm_progress_gepgun', // GEPGUN
'None', // FULLER
'swwm_progress_pene', // PENE
'swwm_progress_acid', // ACID
'None', // SALT
'swwm_progress_mega', // MEGA
'swwm_progress_sanic', // SANIC
'None', // TELE
'swwm_progress_bune', // BUNE
'swwm_progress_bonk', // BONK
'swwm_progress_anom', // ANOM
'None', // ANONE
'None', // TETRIS
'None', // PONG
'None', // SNAKE
'None', // SMB
'None', // TYRIAN
'None' // BOF
};
bool alldone = true;
for ( int i=0; i<vars.Size(); i++ )
{
if ( ignoreme[i] ) continue;
if ( !CheckAchievement(vars[i],names[i],number[i],pvar[i]) )
alldone = false;
}
let ev = CVar.FindCVar('swwm_achievement_everything');
int val = ev.GetInt();
// not done!
if ( !alldone )
{
if ( val != 0 ) ev.SetInt(0);
return;
}
// all done!
if ( val == 0 ) ev.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");
StatusBar.AttachMessage(notif,-3478);
lastachievementnotify = gametic+200;
}
}
}