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

82
achievements.lst Normal file
View file

@ -0,0 +1,82 @@
# achievements listed here
# format: "basename,maxval,hasformat"
# basename: the base name used to construct cvars and localization strings
# maxval: limit progress value (if any), a value of -1 means it needs special
# handling in zscript (usually for cases where this is dynamic, like
# the "all collectibles" achievement)
# hasformat: the TXT string has a %d in it to substitute for maxval
abort,0,no
acid,200,yes
allcoll,-1,no
allitems,30,yes
allkills,30,yes
allsecrets,30,yes
anom,25,yes
anone,0,no
balls,10,yes
barrier,25,yes
bonk,300,yes
bossdash,10,yes
brake,30,yes
bune,200,yes
bustin,40,yes
butts,100,yes
cheat,0,no
cliffyb,0,no
clonk,0,no
conga,15,yes
#dab,100,yes
#dakka,60,no
dime,0,no
dosh,1000000000,no
everything,0,no
ezkill,100,yes
flight,2000,yes
friend,30,yes
fuel,400,yes
#fuller,0,no
gcsandwich,25,yes
#gepgun,30,yes
ghost,25,yes
gib,1000,yes
golden,24,yes
gravity,25,yes
#hnd,6,yes
iwad,7,no
jump,100,yes
lead,1500,yes
#lightning,0,no
ligma,0,no
love,20,yes
#mashiro,0,no
mbf,0,no
mega,1000000,no
moth,50,yes
nice,0,no
oneguy,0,no
onestanding,0,no
oopsie,0,no
par,30,yes
parry,100,yes
#pene,20,yes
plush,20,yes
rage,25,yes
reflect,20,yes
refresh,25,yes
#roast,30,yes
salt,0,no
sanic,800,yes
sekiro,0,no
shock,30,yes
slayer,40,yes
slemg,50,yes
sneeze,20,yes
step,60,yes
stomp,50,yes
sunny,25,yes
tele,0,no
thicc,100,yes
thruwall,25,yes
wantdie,0,no
wave,0,no
yeet,0,no

View file

@ -103,6 +103,7 @@ server int swwm_drlaskill = 3; // [DRLA Monsters] skill setting for monster sp
nosave bool swwm_itemsparkles = false; // visual aid for low visibility items
server bool swwm_singlefirst = false; // single weapons are selected before dual ones, has to be a server cvar due to limitations
nosave bool swwm_uniqstats = false; // only list stats from the same map once, rather than for each single visit
nosave int swwm_filterachievements = 1; // filter for achievements at 0%: 0 - no filter, 1 - obscure text, 2 - don't show
// minimap settings
nosave bool swwm_mm_enable = true; // show a minimap below the score counter
@ -145,132 +146,132 @@ server noarchive bool swwm_iseriouslywanttoplaythiswithbd = false; // self-expla
nosave int swwm_playtime = 0; // total playtime in seconds
// cross-session achievement cvars (0: locked, 1: unlocked, 2: notified)
nosave int swwm_achievement_gcsandwich = 0;
nosave int swwm_achievement_onestanding = 0;
nosave int swwm_achievement_oopsie = 0;
nosave int swwm_achievement_ghost = 0;
nosave int swwm_achievement_clonk = 0;
nosave int swwm_achievement_allitems = 0;
nosave int swwm_achievement_conga = 0;
nosave int swwm_achievement_gravity = 0;
nosave int swwm_achievement_flight = 0;
nosave int swwm_achievement_cliffyb = 0;
nosave int swwm_achievement_par = 0;
nosave int swwm_achievement_oneguy = 0;
nosave int swwm_achievement_golden = 0;
nosave int swwm_achievement_gib = 0;
nosave int swwm_achievement_barrier = 0;
nosave int swwm_achievement_bossdash = 0;
nosave int swwm_achievement_sneeze = 0;
nosave int swwm_achievement_fuel = 0;
nosave int swwm_achievement_slayer = 0;
nosave int swwm_achievement_dime = 0;
nosave int swwm_achievement_stomp = 0;
nosave int swwm_achievement_cheat = 0;
nosave int swwm_achievement_god = 0;
nosave int swwm_achievement_thruwall = 0;
nosave int swwm_achievement_mashiro = 0;
nosave int swwm_achievement_lead = 0;
nosave int swwm_achievement_love = 0;
nosave int swwm_achievement_butts = 0;
nosave int swwm_achievement_plush = 0;
nosave int swwm_achievement_bustin = 0;
nosave int swwm_achievement_moth = 0;
nosave int swwm_achievement_iwad = 0;
nosave int swwm_achievement_brake = 0;
nosave int swwm_achievement_rage = 0;
nosave int swwm_achievement_abort = 0;
nosave int swwm_achievement_parry = 0;
nosave int swwm_achievement_acid = 0;
nosave int swwm_achievement_allcoll = 0;
nosave int swwm_achievement_allitems = 0;
nosave int swwm_achievement_allkills = 0;
nosave int swwm_achievement_allsecrets = 0;
nosave int swwm_achievement_reflect = 0;
nosave int swwm_achievement_sekiro = 0;
nosave int swwm_achievement_wave = 0;
nosave int swwm_achievement_friend = 0;
nosave int swwm_achievement_shock = 0;
nosave int swwm_achievement_balls = 0;
nosave int swwm_achievement_refresh = 0;
nosave int swwm_achievement_step = 0;
nosave int swwm_achievement_sunny = 0;
nosave int swwm_achievement_thicc = 0;
nosave int swwm_achievement_everything = 0;
nosave int swwm_achievement_allcoll = 0;
nosave int swwm_achievement_slemg = 0;
nosave int swwm_achievement_dosh = 0;
nosave int swwm_achievement_jump = 0;
nosave int swwm_achievement_ezkill = 0;
nosave int swwm_achievement_ligma = 0;
nosave int swwm_achievement_yeet = 0;
nosave int swwm_achievement_mbf = 0;
nosave int swwm_achievement_lightning = 0;
nosave int swwm_achievement_dakka = 0;
nosave int swwm_achievement_roast = 0;
nosave int swwm_achievement_dab = 0;
nosave int swwm_achievement_hnd = 0;
nosave int swwm_achievement_gepgun = 0;
nosave int swwm_achievement_fuller = 0;
nosave int swwm_achievement_pene = 0;
nosave int swwm_achievement_acid = 0;
nosave int swwm_achievement_salt = 0;
nosave int swwm_achievement_mega = 0;
nosave int swwm_achievement_sanic = 0;
nosave int swwm_achievement_tele = 0;
nosave int swwm_achievement_bune = 0;
nosave int swwm_achievement_bonk = 0;
nosave int swwm_achievement_anom = 0;
nosave int swwm_achievement_anone = 0;
nosave int swwm_achievement_balls = 0;
nosave int swwm_achievement_barrier = 0;
nosave int swwm_achievement_bonk = 0;
nosave int swwm_achievement_bossdash = 0;
nosave int swwm_achievement_brake = 0;
nosave int swwm_achievement_bune = 0;
nosave int swwm_achievement_bustin = 0;
nosave int swwm_achievement_butts = 0;
nosave int swwm_achievement_cheat = 0;
nosave int swwm_achievement_cliffyb = 0;
nosave int swwm_achievement_clonk = 0;
nosave int swwm_achievement_conga = 0;
nosave int swwm_achievement_dab = 0;
nosave int swwm_achievement_dakka = 0;
nosave int swwm_achievement_dime = 0;
nosave int swwm_achievement_dosh = 0;
nosave int swwm_achievement_everything = 0;
nosave int swwm_achievement_ezkill = 0;
nosave int swwm_achievement_flight = 0;
nosave int swwm_achievement_friend = 0;
nosave int swwm_achievement_fuel = 0;
nosave int swwm_achievement_fuller = 0;
nosave int swwm_achievement_gcsandwich = 0;
nosave int swwm_achievement_gepgun = 0;
nosave int swwm_achievement_ghost = 0;
nosave int swwm_achievement_gib = 0;
nosave int swwm_achievement_golden = 0;
nosave int swwm_achievement_gravity = 0;
nosave int swwm_achievement_hnd = 0;
nosave int swwm_achievement_iwad = 0;
nosave int swwm_achievement_jump = 0;
nosave int swwm_achievement_lead = 0;
nosave int swwm_achievement_lightning = 0;
nosave int swwm_achievement_ligma = 0;
nosave int swwm_achievement_love = 0;
nosave int swwm_achievement_mashiro = 0;
nosave int swwm_achievement_mbf = 0;
nosave int swwm_achievement_mega = 0;
nosave int swwm_achievement_moth = 0;
nosave int swwm_achievement_nice = 0;
nosave int swwm_achievement_oneguy = 0;
nosave int swwm_achievement_onestanding = 0;
nosave int swwm_achievement_oopsie = 0;
nosave int swwm_achievement_par = 0;
nosave int swwm_achievement_parry = 0;
nosave int swwm_achievement_pene = 0;
nosave int swwm_achievement_plush = 0;
nosave int swwm_achievement_rage = 0;
nosave int swwm_achievement_reflect = 0;
nosave int swwm_achievement_refresh = 0;
nosave int swwm_achievement_roast = 0;
nosave int swwm_achievement_salt = 0;
nosave int swwm_achievement_sanic = 0;
nosave int swwm_achievement_sekiro = 0;
nosave int swwm_achievement_shock = 0;
nosave int swwm_achievement_slayer = 0;
nosave int swwm_achievement_slemg = 0;
nosave int swwm_achievement_sneeze = 0;
nosave int swwm_achievement_step = 0;
nosave int swwm_achievement_stomp = 0;
nosave int swwm_achievement_sunny = 0;
nosave int swwm_achievement_tele = 0;
nosave int swwm_achievement_thicc = 0;
nosave int swwm_achievement_thruwall = 0;
nosave int swwm_achievement_wantdie = 0;
nosave int swwm_achievement_wave = 0;
nosave int swwm_achievement_yeet = 0;
// cross-session progress cvars
nosave int swwm_progress_gcsandwich = 0;
nosave int swwm_progress_ghost = 0;
nosave int swwm_progress_acid = 0;
nosave int swwm_progress_allcoll = 0;
nosave int swwm_progress_allitems = 0;
nosave int swwm_progress_conga = 0;
nosave int swwm_progress_gravity = 0;
nosave int swwm_progress_flight = 0;
nosave int swwm_progress_par = 0;
nosave int swwm_progress_golden = 0;
nosave int swwm_progress_gib = 0;
nosave int swwm_progress_barrier = 0;
nosave int swwm_progress_bossdash = 0;
nosave int swwm_progress_sneeze = 0;
nosave float swwm_progress_fuel = 0; // this one has to be a double
nosave int swwm_progress_slayer = 0;
nosave int swwm_progress_stomp = 0;
nosave int swwm_progress_thruwall = 0;
nosave int swwm_progress_lead = 0;
nosave int swwm_progress_love = 0;
nosave int swwm_progress_butts = 0;
nosave int swwm_progress_plush = 0;
nosave int swwm_progress_bustin = 0;
nosave int swwm_progress_moth = 0;
nosave int swwm_progress_iwad = 0;
nosave int swwm_progress_brake = 0;
nosave int swwm_progress_rage = 0;
nosave int swwm_progress_parry = 0;
nosave int swwm_progress_allkills = 0;
nosave int swwm_progress_allsecrets = 0;
nosave int swwm_progress_reflect = 0;
nosave int swwm_progress_friend = 0;
nosave int swwm_progress_shock = 0;
nosave int swwm_progress_anom = 0;
nosave int swwm_progress_balls = 0;
nosave int swwm_progress_barrier = 0;
nosave int swwm_progress_bonk = 0;
nosave int swwm_progress_bossdash = 0;
nosave int swwm_progress_brake = 0;
nosave int swwm_progress_bune = 0;
nosave int swwm_progress_bustin = 0;
nosave int swwm_progress_butts = 0;
nosave int swwm_progress_conga = 0;
nosave int swwm_progress_dab = 0;
nosave int swwm_progress_dakka = 0;
nosave int swwm_progress_dosh = 0;
nosave int swwm_progress_ezkill = 0;
nosave int swwm_progress_flight = 0;
nosave int swwm_progress_friend = 0;
nosave float swwm_progress_fuel = 0; // this one needs to be float
nosave int swwm_progress_gcsandwich = 0;
nosave int swwm_progress_gepgun = 0;
nosave int swwm_progress_ghost = 0;
nosave int swwm_progress_gib = 0;
nosave int swwm_progress_golden = 0;
nosave int swwm_progress_gravity = 0;
nosave int swwm_progress_hnd = 0;
nosave int swwm_progress_iwad = 0;
nosave int swwm_progress_jump = 0;
nosave int swwm_progress_lead = 0;
nosave int swwm_progress_love = 0;
nosave int swwm_progress_mega = 0;
nosave int swwm_progress_moth = 0;
nosave int swwm_progress_par = 0;
nosave int swwm_progress_parry = 0;
nosave int swwm_progress_pene = 0;
nosave int swwm_progress_plush = 0;
nosave int swwm_progress_rage = 0;
nosave int swwm_progress_reflect = 0;
nosave int swwm_progress_refresh = 0;
nosave int swwm_progress_roast = 0;
nosave int swwm_progress_sanic = 0;
nosave int swwm_progress_shock = 0;
nosave int swwm_progress_slayer = 0;
nosave int swwm_progress_slemg = 0;
nosave int swwm_progress_sneeze = 0;
nosave int swwm_progress_step = 0;
nosave int swwm_progress_stomp = 0;
nosave int swwm_progress_sunny = 0;
nosave int swwm_progress_thicc = 0;
nosave int swwm_progress_allcoll = 0;
nosave int swwm_progress_slemg = 0;
nosave int swwm_progress_dosh = 0;
nosave int swwm_progress_jump = 0;
nosave int swwm_progress_ezkill = 0;
nosave int swwm_progress_dakka = 0;
nosave int swwm_progress_roast = 0;
nosave int swwm_progress_dab = 0;
nosave int swwm_progress_hnd = 0;
nosave int swwm_progress_gepgun = 0;
nosave int swwm_progress_pene = 0;
nosave int swwm_progress_acid = 0;
nosave int swwm_progress_mega = 0;
nosave int swwm_progress_sanic = 0;
nosave int swwm_progress_bune = 0;
nosave int swwm_progress_bonk = 0;
nosave int swwm_progress_anom = 0;
nosave int swwm_progress_thruwall = 0;

View file

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Before After
Before After

View file

@ -828,161 +828,153 @@ SWWM_FANART7 = "Marisa.jpg";
SWWM_FANART8 = "Marisa2.jpg";
SWWM_FANART9 = "Marisa3.jpg";
// achievements
SWWM_ACHIEVEMENT_GCSANDWICH_TAG = "A Little Sandwich, as a Treat";
SWWM_ACHIEVEMENT_GCSANDWICH_TXT = "Use %d Grilled Cheese Sandwiches";
SWWM_ACHIEVEMENT_GCSANDWICH_PIC = "graphics/Achievements/AchievementSandwich.png";
SWWM_ACHIEVEMENT_ONESTANDING_TAG = "A Warning to the Others";
SWWM_ACHIEVEMENT_ONESTANDING_TXT = "Finish a map with just one enemy left alive";
SWWM_ACHIEVEMENT_OOPSIE_TAG = "Big Oopsie";
SWWM_ACHIEVEMENT_OOPSIE_TXT = "Erase yourself with the Ynykron Artifact";
SWWM_ACHIEVEMENT_GHOST_TAG = "Cloak Engaged";
SWWM_ACHIEVEMENT_GHOST_TXT = "Use %d Ghost Artifacts";
SWWM_ACHIEVEMENT_GHOST_PIC = "graphics/Achievements/AchievementGhost.png";
SWWM_ACHIEVEMENT_CLONK_TAG = "CLONK";
SWWM_ACHIEVEMENT_CLONK_TXT = "Kill a boss with a Lead Ball crit";
SWWM_ACHIEVEMENT_ALLITEMS_TAG = "Collector";
SWWM_ACHIEVEMENT_ALLITEMS_TXT = "Obtain 100%% items in %d maps";
SWWM_ACHIEVEMENT_CONGA_TAG = "Conga Line of Death";
SWWM_ACHIEVEMENT_CONGA_TXT = "Kill %d enemies with a single XSB round";
SWWM_ACHIEVEMENT_GRAVITY_TAG = "Decent Ascent";
SWWM_ACHIEVEMENT_GRAVITY_TXT = "Use %d Gravity Suppressors";
SWWM_ACHIEVEMENT_GRAVITY_PIC = "graphics/Achievements/AchievementGravity.png";
SWWM_ACHIEVEMENT_FLIGHT_TAG = "Demolitionist Space Program";
SWWM_ACHIEVEMENT_FLIGHT_TXT = "Send a single enemy flying over %d map units";
SWWM_ACHIEVEMENT_CLIFFYB_TAG = "Errand Boy Bullshit";
SWWM_ACHIEVEMENT_CLIFFYB_TXT = "Finish a map without collecting any keys";
SWWM_ACHIEVEMENT_PAR_TAG = "Fast";
SWWM_ACHIEVEMENT_PAR_TXT = "Beat the par time in %d maps";
SWWM_ACHIEVEMENT_ONEGUY_TAG = "Fuck that Guy in Particular";
SWWM_ACHIEVEMENT_ONEGUY_TXT = "Use the Ynykron Artifact to kill a single non-boss enemy";
SWWM_ACHIEVEMENT_GOLDEN_TAG = "Golden Shower";
SWWM_ACHIEVEMENT_GOLDEN_TXT = "Use %d golden shells";
SWWM_ACHIEVEMENT_GIB_TAG = "Gibbitude";
SWWM_ACHIEVEMENT_GIB_TXT = "Overkill %d enemies";
SWWM_ACHIEVEMENT_BARRIER_TAG = "Green Filter";
SWWM_ACHIEVEMENT_BARRIER_TXT = "Use %d Elemental Barriers";
SWWM_ACHIEVEMENT_BARRIER_PIC = "graphics/Achievements/AchievementBarrier.png";
SWWM_ACHIEVEMENT_BOSSDASH_TAG = "Headstrong";
SWWM_ACHIEVEMENT_BOSSDASH_TXT = "Kill %d bosses by dashing into them";
SWWM_ACHIEVEMENT_SNEEZE_TAG = "Humiliator";
SWWM_ACHIEVEMENT_SNEEZE_TXT = "Kill %d enemies with the Deep Impact primary fire";
SWWM_ACHIEVEMENT_FUEL_TAG = "Hydrogenated";
SWWM_ACHIEVEMENT_FUEL_TXT = "Consume a total of %dL of fuel";
SWWM_ACHIEVEMENT_SLAYER_TAG = "I am Become Death";
SWWM_ACHIEVEMENT_SLAYER_TXT = "Kill %d enemies with a single Slayer Warhead";
SWWM_ACHIEVEMENT_DIME_TAG = "Icarus Dimes";
SWWM_ACHIEVEMENT_DIME_TXT = "Blow yourself up with your own explosives";
SWWM_ACHIEVEMENT_STOMP_TAG = "Italian Plumber Complex";
SWWM_ACHIEVEMENT_STOMP_TXT = "Kill %d enemies by standing on them";
SWWM_ACHIEVEMENT_CHEAT_TAG = "It's Been Ten Years";
SWWM_ACHIEVEMENT_CHEAT_TXT = "Use a cheat code from SWWM Platinum";
SWWM_ACHIEVEMENT_THRUWALL_TAG = "Knock Knock";
SWWM_ACHIEVEMENT_THRUWALL_TXT = "Kill %d enemies through walls with the Silver Bullet";
SWWM_ACHIEVEMENT_MASHIRO_TAG = "Layers of White";
SWWM_ACHIEVEMENT_MASHIRO_TXT = "Summon the White Lady";
SWWM_ACHIEVEMENT_LEAD_TAG = "Lead Delivery";
SWWM_ACHIEVEMENT_LEAD_TXT = "Hit an enemy dead-on with the Eviscerator secondary from over %d map units away";
SWWM_ACHIEVEMENT_LOVE_TAG = "Lethal Love";
SWWM_ACHIEVEMENT_LOVE_TXT = "Kill %d enemies with a blown kiss (not counting insta-kills)";
SWWM_ACHIEVEMENT_BUTTS_TAG = "Let's get to Bashing Butts";
SWWM_ACHIEVEMENT_BUTTS_TXT = "Kill %d enemies by dashing backwards";
SWWM_ACHIEVEMENT_PLUSH_TAG = "Lovestruck";
SWWM_ACHIEVEMENT_PLUSH_TXT = "Play with the Saya or Kirin plushies %d times in the same session";
SWWM_ACHIEVEMENT_BUSTIN_TAG = "Makes me Feel Good";
SWWM_ACHIEVEMENT_BUSTIN_TXT = "Bust %d walls";
SWWM_ACHIEVEMENT_BUSTIN_PIC = "graphics/Achievements/AchievementBustin.png";
SWWM_ACHIEVEMENT_MOTH_TAG = "Mother";
SWWM_ACHIEVEMENT_MOTH_TXT = "Gather %d moths";
SWWM_ACHIEVEMENT_IWAD_TAG = "Mx. Worldwide";
SWWM_ACHIEVEMENT_IWAD_TXT = "Play on all supported games";
SWWM_ACHIEVEMENT_IWAD_PIC = "graphics/Achievements/AchievementMxWorldwide.png";
SWWM_ACHIEVEMENT_BRAKE_TAG = "No Brakes";
SWWM_ACHIEVEMENT_BRAKE_TXT = "Consume your full fuel supply in a single dash %d times";
SWWM_ACHIEVEMENT_RAGE_TAG = "No Talk me Angy";
SWWM_ACHIEVEMENT_RAGE_TXT = "Use %d Ragekits";
SWWM_ACHIEVEMENT_RAGE_PIC = "graphics/Achievements/AchievementRagekit.png";
SWWM_ACHIEVEMENT_ABORT_TAG = "Oops I Broke It";
SWWM_ACHIEVEMENT_ABORT_TXT = "Cause a VM abort";
SWWM_ACHIEVEMENT_PARRY_TAG = "Parry King";
SWWM_ACHIEVEMENT_PARRY_TXT = "Deflect %d projectiles";
SWWM_ACHIEVEMENT_ACID_TAG = "Fizzy Goodness";
SWWM_ACHIEVEMENT_ACID_TXT = "Melt %d enemies with Telebrium Flechettes";
SWWM_ACHIEVEMENT_ALLCOLL_TAG = "The Full Set";
SWWM_ACHIEVEMENT_ALLCOLL_TXT = "Obtain all collectibles in a single session";
SWWM_ACHIEVEMENT_ALLITEMS_TAG = "Collector";
SWWM_ACHIEVEMENT_ALLITEMS_TXT = "Obtain 100%% items in %d maps";
SWWM_ACHIEVEMENT_ALLKILLS_TAG = "Pest Control";
SWWM_ACHIEVEMENT_ALLKILLS_TXT = "Obtain 100%% kills in %d maps";
SWWM_ACHIEVEMENT_ALLSECRETS_TAG = "Premium Detective";
SWWM_ACHIEVEMENT_ALLSECRETS_TXT = "Obtain 100%% secrets in %d maps";
SWWM_ACHIEVEMENT_REFLECT_TAG = "Return to Sender";
SWWM_ACHIEVEMENT_REFLECT_TXT = "Kill %d enemies with parried projectiles";
SWWM_ACHIEVEMENT_SEKIRO_TAG = "Hesitation is Defeat";
SWWM_ACHIEVEMENT_SEKIRO_TXT = "Die and reboot two times in the same map";
SWWM_ACHIEVEMENT_WAVE_TAG = "Sayonara, Scumbag";
SWWM_ACHIEVEMENT_WAVE_TXT = "Wave at a dying enemy";
SWWM_ACHIEVEMENT_FRIEND_TAG = "Shaped like a Friend";
SWWM_ACHIEVEMENT_FRIEND_TXT = "Befriend %d Cacodemons, Weredragons or Ettins with headpats";
SWWM_ACHIEVEMENT_SHOCK_TAG = "Shockmaster";
SWWM_ACHIEVEMENT_SHOCK_TXT = "Perform %d Biospark combos";
SWWM_ACHIEVEMENT_BALLS_TAG = "Slam your Balls";
SWWM_ACHIEVEMENT_BALLS_TXT = "Land %d Lead Ball crits";
SWWM_ACHIEVEMENT_REFRESH_TAG = "Stay Fresh";
SWWM_ACHIEVEMENT_REFRESH_TXT = "Use %d Refreshers";
SWWM_ACHIEVEMENT_REFRESH_PIC = "graphics/Achievements/AchievementRefresh.png";
SWWM_ACHIEVEMENT_STEP_TAG = "Steppy";
SWWM_ACHIEVEMENT_STEP_TXT = "Stand on a single enemy's head for %d seconds";
SWWM_ACHIEVEMENT_SUNNY_TAG = "Sunny D";
SWWM_ACHIEVEMENT_SUNNY_TXT = "Use %d Invinciballs";
SWWM_ACHIEVEMENT_SUNNY_PIC = "graphics/Achievements/AchievementInvinciball.png";
SWWM_ACHIEVEMENT_THICC_TAG = "The Ass was Fat";
SWWM_ACHIEVEMENT_THICC_TXT = "Kill %d enemies by ground pounding";
SWWM_ACHIEVEMENT_EVERYTHING_TAG = "The Demolitionist";
SWWM_ACHIEVEMENT_EVERYTHING_TXT = "Unlock all achievements";
SWWM_ACHIEVEMENT_ALLCOLL_TAG = "The Full Set";
SWWM_ACHIEVEMENT_ALLCOLL_TXT = "Obtain all collectibles in a single session";
SWWM_ACHIEVEMENT_SLEMG_TAG = "The Sledge Method";
SWWM_ACHIEVEMENT_SLEMG_TXT = "Activate %d switches by punching them";
SWWM_ACHIEVEMENT_DOSH_TAG = "Unchecked Capitalism";
SWWM_ACHIEVEMENT_DOSH_TXT = "Have ¥1,000,000,000 in bank";
SWWM_ACHIEVEMENT_JUMP_TAG = "Verticality";
SWWM_ACHIEVEMENT_JUMP_TXT = "Walljump %d times";
SWWM_ACHIEVEMENT_EZKILL_TAG = "Well That was Easy";
SWWM_ACHIEVEMENT_EZKILL_TXT = "Kill %d enemies with a single Ynykron Artifact shot (excluding altfire)";
SWWM_ACHIEVEMENT_LIGMA_TAG = "Who's Steve Jobs?";
SWWM_ACHIEVEMENT_LIGMA_TXT = "Kill an endgame boss with the Ynykron Artifact";
SWWM_ACHIEVEMENT_YEET_TAG = "YEET";
SWWM_ACHIEVEMENT_YEET_TXT = "Throw a Candygun right into the Icon of Sin's brains";
SWWM_ACHIEVEMENT_MBF_TAG = "You can Pet the Dog";
SWWM_ACHIEVEMENT_MBF_TXT = "Pet a dog";
SWWM_ACHIEVEMENT_LIGHTNING_TAG = "John Romero's Curse";
SWWM_ACHIEVEMENT_LIGHTNING_TXT = "Fry yourself by discharging an electric weapon in water";
SWWM_ACHIEVEMENT_DAKKA_TAG = "Dakka";
SWWM_ACHIEVEMENT_DAKKA_TXT = "Fire the Sheen HMG for one minute straight";
SWWM_ACHIEVEMENT_ROAST_TAG = "Gravely Roast";
SWWM_ACHIEVEMENT_ROAST_TXT = "Perform %d bayonet combos with the Quadravol";
SWWM_ACHIEVEMENT_DAB_TAG = "HAHA DAB";
SWWM_ACHIEVEMENT_DAB_TXT = "Gib %d enemies with the Itamex Hammer";
SWWM_ACHIEVEMENT_HND_TAG = "High Noon";
SWWM_ACHIEVEMENT_HND_TXT = "Land %d killing shots in a single Puntzer Beta reload";
SWWM_ACHIEVEMENT_GEPGUN_TAG = "The Most Silent Takedown";
SWWM_ACHIEVEMENT_GEPGUN_TXT = "Kill %d enemies with the Ray-Khom primary without alerting them";
SWWM_ACHIEVEMENT_FULLER_TAG = "You Gained Brouzouf";
SWWM_ACHIEVEMENT_FULLER_TXT = "Unload an entire mag in fuller auto with the Puntzer Gamma without missing a single shot";
SWWM_ACHIEVEMENT_PENE_TAG = "Penetrator";
SWWM_ACHIEVEMENT_PENE_TXT = "Strike through %d enemies in a row with a single Grand Lance secondary";
SWWM_ACHIEVEMENT_ACID_TAG = "Fizzy Goodness";
SWWM_ACHIEVEMENT_ACID_TXT = "Melt %d enemies with Telebrium Flechettes";
SWWM_ACHIEVEMENT_SALT_TAG = "Maximum Oversalt";
SWWM_ACHIEVEMENT_SALT_TXT = "Shoot 25 Saltshot rounds simultaneously";
SWWM_ACHIEVEMENT_MEGA_TAG = "Megadeath";
SWWM_ACHIEVEMENT_MEGA_TXT = "Kill a grand total of one million enemies";
SWWM_ACHIEVEMENT_SANIC_TAG = "CHILLI DOGS";
SWWM_ACHIEVEMENT_SANIC_TXT = "Reach a top speed of %d km/h";
SWWM_ACHIEVEMENT_TELE_TAG = "A Soldier's Pastime";
SWWM_ACHIEVEMENT_TELE_TXT = "Teleport some bread (a sandwich works too)";
SWWM_ACHIEVEMENT_BUNE_TAG = "Legendary Lagomorph";
SWWM_ACHIEVEMENT_BUNE_TXT = "Bunnyhop %d times";
SWWM_ACHIEVEMENT_BONK_TAG = "Shock Resistant";
SWWM_ACHIEVEMENT_BONK_TXT = "Bump into stuff %d times";
SWWM_ACHIEVEMENT_ANOM_TAG = "Anomalous";
SWWM_ACHIEVEMENT_ANOM_TXT = "Use %d Mykradvo Artifacts";
SWWM_ACHIEVEMENT_ANOM_PIC = "graphics/Achievements/AchievementAnomaly.png";
SWWM_ACHIEVEMENT_ANONE_TAG = "Completely Necessary Use of Force";
SWWM_ACHIEVEMENT_ANONE_TXT = "Use the Mykradvo Artifact against a single non-boss enemy";
SWWM_ACHIEVEMENT_BALLS_TAG = "Slam your Balls";
SWWM_ACHIEVEMENT_BALLS_TXT = "Land %d Lead Ball crits";
SWWM_ACHIEVEMENT_BARRIER_TAG = "Green Filter";
SWWM_ACHIEVEMENT_BARRIER_TXT = "Use %d Elemental Barriers";
SWWM_ACHIEVEMENT_BONK_TAG = "Shock Resistant";
SWWM_ACHIEVEMENT_BONK_TXT = "Bump into stuff %d times";
SWWM_ACHIEVEMENT_BOSSDASH_TAG = "Headstrong";
SWWM_ACHIEVEMENT_BOSSDASH_TXT = "Kill %d bosses by dashing into them";
SWWM_ACHIEVEMENT_BRAKE_TAG = "No Brakes";
SWWM_ACHIEVEMENT_BRAKE_TXT = "Consume your full fuel supply in a single dash %d times";
SWWM_ACHIEVEMENT_BUNE_TAG = "Legendary Lagomorph";
SWWM_ACHIEVEMENT_BUNE_TXT = "Bunnyhop %d times";
SWWM_ACHIEVEMENT_BUSTIN_TAG = "Makes me Feel Good";
SWWM_ACHIEVEMENT_BUSTIN_TXT = "Bust %d walls";
SWWM_ACHIEVEMENT_BUTTS_TAG = "Let's get to Bashing Butts";
SWWM_ACHIEVEMENT_BUTTS_TXT = "Kill %d enemies by dashing backwards";
SWWM_ACHIEVEMENT_CHEAT_TAG = "It's Been Ten Years";
SWWM_ACHIEVEMENT_CHEAT_TXT = "Use a cheat code from SWWM Platinum";
SWWM_ACHIEVEMENT_CLIFFYB_TAG = "Errand Boy Bullshit";
SWWM_ACHIEVEMENT_CLIFFYB_TXT = "Finish a map without collecting any keys";
SWWM_ACHIEVEMENT_CLONK_TAG = "CLONK";
SWWM_ACHIEVEMENT_CLONK_TXT = "Kill a boss with a Lead Ball crit";
SWWM_ACHIEVEMENT_CONGA_TAG = "Conga Line of Death";
SWWM_ACHIEVEMENT_CONGA_TXT = "Kill %d enemies with a single XSB round";
SWWM_ACHIEVEMENT_DAB_TAG = "HAHA DAB";
SWWM_ACHIEVEMENT_DAB_TXT = "Gib %d enemies with the Itamex Hammer";
SWWM_ACHIEVEMENT_DAKKA_TAG = "Dakka";
SWWM_ACHIEVEMENT_DAKKA_TXT = "Fire the Sheen HMG for one minute straight";
SWWM_ACHIEVEMENT_DIME_TAG = "Icarus Dimes";
SWWM_ACHIEVEMENT_DIME_TXT = "Blow yourself up with your own explosives";
SWWM_ACHIEVEMENT_DOSH_TAG = "Unchecked Capitalism";
SWWM_ACHIEVEMENT_DOSH_TXT = "Have ¥1,000,000,000 in bank";
SWWM_ACHIEVEMENT_EVERYTHING_TAG = "The Demolitionist";
SWWM_ACHIEVEMENT_EVERYTHING_TXT = "Unlock all achievements";
SWWM_ACHIEVEMENT_EZKILL_TAG = "Well That was Easy";
SWWM_ACHIEVEMENT_EZKILL_TXT = "Kill %d enemies with a single Ynykron Artifact shot (excluding altfire)";
SWWM_ACHIEVEMENT_FLIGHT_TAG = "Demolitionist Space Program";
SWWM_ACHIEVEMENT_FLIGHT_TXT = "Send a single enemy flying over %d map units";
SWWM_ACHIEVEMENT_FRIEND_TAG = "Shaped like a Friend";
SWWM_ACHIEVEMENT_FRIEND_TXT = "Befriend %d Cacodemons, Weredragons or Ettins with headpats";
SWWM_ACHIEVEMENT_FUEL_TAG = "Hydrogenated";
SWWM_ACHIEVEMENT_FUEL_TXT = "Consume a total of %dL of fuel";
SWWM_ACHIEVEMENT_FULLER_TAG = "You Gained Brouzouf";
SWWM_ACHIEVEMENT_FULLER_TXT = "Unload an entire mag in fuller auto with the Puntzer Gamma without missing a single shot";
SWWM_ACHIEVEMENT_GCSANDWICH_TAG = "A Little Sandwich, as a Treat";
SWWM_ACHIEVEMENT_GCSANDWICH_TXT = "Use %d Grilled Cheese Sandwiches";
SWWM_ACHIEVEMENT_GEPGUN_TAG = "The Most Silent Takedown";
SWWM_ACHIEVEMENT_GEPGUN_TXT = "Kill %d enemies with the Ray-Khom primary without alerting them";
SWWM_ACHIEVEMENT_GHOST_TAG = "Cloak Engaged";
SWWM_ACHIEVEMENT_GHOST_TXT = "Use %d Ghost Artifacts";
SWWM_ACHIEVEMENT_GIB_TAG = "Gibbitude";
SWWM_ACHIEVEMENT_GIB_TXT = "Overkill %d enemies";
SWWM_ACHIEVEMENT_GOLDEN_TAG = "Golden Shower";
SWWM_ACHIEVEMENT_GOLDEN_TXT = "Use %d golden shells";
SWWM_ACHIEVEMENT_GRAVITY_TAG = "Decent Ascent";
SWWM_ACHIEVEMENT_GRAVITY_TXT = "Use %d Gravity Suppressors";
SWWM_ACHIEVEMENT_HND_TAG = "High Noon";
SWWM_ACHIEVEMENT_HND_TXT = "Land %d killing shots in a single Puntzer Beta reload";
SWWM_ACHIEVEMENT_IWAD_TAG = "Mx. Worldwide";
SWWM_ACHIEVEMENT_IWAD_TXT = "Play on all supported games";
SWWM_ACHIEVEMENT_JUMP_TAG = "Verticality";
SWWM_ACHIEVEMENT_JUMP_TXT = "Walljump %d times";
SWWM_ACHIEVEMENT_LEAD_TAG = "Lead Delivery";
SWWM_ACHIEVEMENT_LEAD_TXT = "Hit an enemy dead-on with the Eviscerator secondary from over %d map units away";
SWWM_ACHIEVEMENT_LIGHTNING_TAG = "John Romero's Curse";
SWWM_ACHIEVEMENT_LIGHTNING_TXT = "Fry yourself by discharging an electric weapon in water";
SWWM_ACHIEVEMENT_LIGMA_TAG = "Who's Steve Jobs?";
SWWM_ACHIEVEMENT_LIGMA_TXT = "Kill an endgame boss with the Ynykron Artifact";
SWWM_ACHIEVEMENT_LOVE_TAG = "Lethal Love";
SWWM_ACHIEVEMENT_LOVE_TXT = "Kill %d enemies with a blown kiss (not counting insta-kills)";
SWWM_ACHIEVEMENT_MASHIRO_TAG = "Layers of White";
SWWM_ACHIEVEMENT_MASHIRO_TXT = "Summon the White Lady";
SWWM_ACHIEVEMENT_MBF_TAG = "You can Pet the Dog";
SWWM_ACHIEVEMENT_MBF_TXT = "Pet a dog";
SWWM_ACHIEVEMENT_MEGA_TAG = "Megadeath";
SWWM_ACHIEVEMENT_MEGA_TXT = "Kill a grand total of one million enemies";
SWWM_ACHIEVEMENT_MOTH_TAG = "Mother";
SWWM_ACHIEVEMENT_MOTH_TXT = "Gather %d moths";
SWWM_ACHIEVEMENT_NICE_TAG = "NICE";
SWWM_ACHIEVEMENT_NICE_TXT = "Finish a level with 69 health";
SWWM_ACHIEVEMENT_ONEGUY_TAG = "Fuck that Guy in Particular";
SWWM_ACHIEVEMENT_ONEGUY_TXT = "Use the Ynykron Artifact to kill a single non-boss enemy";
SWWM_ACHIEVEMENT_ONESTANDING_TAG = "A Warning to the Others";
SWWM_ACHIEVEMENT_ONESTANDING_TXT = "Finish a map with just one enemy left alive";
SWWM_ACHIEVEMENT_OOPSIE_TAG = "Big Oopsie";
SWWM_ACHIEVEMENT_OOPSIE_TXT = "Erase yourself with the Ynykron Artifact";
SWWM_ACHIEVEMENT_PARRY_TAG = "Parry King";
SWWM_ACHIEVEMENT_PARRY_TXT = "Deflect %d projectiles";
SWWM_ACHIEVEMENT_PAR_TAG = "Fast";
SWWM_ACHIEVEMENT_PAR_TXT = "Beat the par time in %d maps";
SWWM_ACHIEVEMENT_PENE_TAG = "Penetrator";
SWWM_ACHIEVEMENT_PENE_TXT = "Strike through %d enemies in a row with a single Grand Lance secondary";
SWWM_ACHIEVEMENT_PLUSH_TAG = "Lovestruck";
SWWM_ACHIEVEMENT_PLUSH_TXT = "Play with the Saya or Kirin plushies %d times in the same session";
SWWM_ACHIEVEMENT_RAGE_TAG = "No Talk me Angy";
SWWM_ACHIEVEMENT_RAGE_TXT = "Use %d Ragekits";
SWWM_ACHIEVEMENT_REFLECT_TAG = "Return to Sender";
SWWM_ACHIEVEMENT_REFLECT_TXT = "Kill %d enemies with parried projectiles";
SWWM_ACHIEVEMENT_REFRESH_TAG = "Stay Fresh";
SWWM_ACHIEVEMENT_REFRESH_TXT = "Use %d Refreshers";
SWWM_ACHIEVEMENT_ROAST_TAG = "Gravely Roast";
SWWM_ACHIEVEMENT_ROAST_TXT = "Perform %d bayonet combos with the Quadravol";
SWWM_ACHIEVEMENT_SALT_TAG = "Maximum Oversalt";
SWWM_ACHIEVEMENT_SALT_TXT = "Shoot 25 Saltshot rounds simultaneously";
SWWM_ACHIEVEMENT_SANIC_TAG = "CHILLI DOGS";
SWWM_ACHIEVEMENT_SANIC_TXT = "Reach a top speed of %d km/h";
SWWM_ACHIEVEMENT_SEKIRO_TAG = "Hesitation is Defeat";
SWWM_ACHIEVEMENT_SEKIRO_TXT = "Die and reboot two times in the same map";
SWWM_ACHIEVEMENT_SHOCK_TAG = "Shockmaster";
SWWM_ACHIEVEMENT_SHOCK_TXT = "Perform %d Biospark combos";
SWWM_ACHIEVEMENT_SLAYER_TAG = "I am Become Death";
SWWM_ACHIEVEMENT_SLAYER_TXT = "Kill %d enemies with a single Slayer Warhead";
SWWM_ACHIEVEMENT_SLEMG_TAG = "The Sledge Method";
SWWM_ACHIEVEMENT_SLEMG_TXT = "Activate %d switches by punching them";
SWWM_ACHIEVEMENT_SNEEZE_TAG = "Humiliator";
SWWM_ACHIEVEMENT_SNEEZE_TXT = "Kill %d enemies with the Deep Impact primary fire";
SWWM_ACHIEVEMENT_STEP_TAG = "Steppy";
SWWM_ACHIEVEMENT_STEP_TXT = "Stand on a single enemy's head for %d seconds";
SWWM_ACHIEVEMENT_STOMP_TAG = "Italian Plumber Complex";
SWWM_ACHIEVEMENT_STOMP_TXT = "Kill %d enemies by standing on them";
SWWM_ACHIEVEMENT_SUNNY_TAG = "Sunny D";
SWWM_ACHIEVEMENT_SUNNY_TXT = "Use %d Invinciballs";
SWWM_ACHIEVEMENT_TELE_TAG = "A Soldier's Pastime";
SWWM_ACHIEVEMENT_TELE_TXT = "Teleport some bread (a sandwich works too)";
SWWM_ACHIEVEMENT_THICC_TAG = "The Ass was Fat";
SWWM_ACHIEVEMENT_THICC_TXT = "Kill %d enemies by ground pounding";
SWWM_ACHIEVEMENT_THRUWALL_TAG = "Knock Knock";
SWWM_ACHIEVEMENT_THRUWALL_TXT = "Kill %d enemies through walls with the Silver Bullet";
SWWM_ACHIEVEMENT_WANTDIE_TAG = "E N D M I I";
SWWM_ACHIEVEMENT_WANTDIE_TXT = "Fully clear a single map in the hardest difficulty (without dying)";
SWWM_ACHIEVEMENT_WAVE_TAG = "Sayonara, Scumbag";
SWWM_ACHIEVEMENT_WAVE_TXT = "Wave at a dying enemy";
SWWM_ACHIEVEMENT_YEET_TAG = "YEET";
SWWM_ACHIEVEMENT_YEET_TXT = "Throw a Candygun right into the Icon of Sin's brains";

View file

@ -731,144 +731,145 @@ SWWM_INTERTIP120 = "Me he dado cuenta de que si te pones a hablar, a tu boca se
// intermission fanart
SWWM_FANART = "Arte: ";
// achievements
SWWM_ACHIEVEMENT_GCSANDWICH_TAG = "Un Poco de Sandwich, de Propina";
SWWM_ACHIEVEMENT_GCSANDWICH_TXT = "Usa %d Sándwiches de Queso a la Plancha";
SWWM_ACHIEVEMENT_ONESTANDING_TAG = "Una Advertencia a los Otros";
SWWM_ACHIEVEMENT_ONESTANDING_TXT = "Termina un mapa con solo un enemigo vivo";
SWWM_ACHIEVEMENT_OOPSIE_TAG = "Gran Errorcito";
SWWM_ACHIEVEMENT_OOPSIE_TXT = "Bórrate con el Artefacto Ynykron";
SWWM_ACHIEVEMENT_GHOST_TAG = "Camuflaje Activado";
SWWM_ACHIEVEMENT_GHOST_TXT = "Usa %d Artefactos Fantasma";
SWWM_ACHIEVEMENT_CLONK_TAG = "CLONK";
SWWM_ACHIEVEMENT_CLONK_TXT = "Mata a un jefe con un crítico de Bola de Plomo";
SWWM_ACHIEVEMENT_ALLITEMS_TAG = "Recolector";
SWWM_ACHIEVEMENT_ALLITEMS_TXT = "Obtén 100%% ítems en %d mapas";
SWWM_ACHIEVEMENT_CONGA_TAG = "Conga de la Muerte";
SWWM_ACHIEVEMENT_CONGA_TXT = "Mata %d enemigos con una sola bala XSB";
SWWM_ACHIEVEMENT_GRAVITY_TAG = "Ascenso Decente";
SWWM_ACHIEVEMENT_GRAVITY_TXT = "Usa %d Supresores de Gravedad";
SWWM_ACHIEVEMENT_FLIGHT_TAG = "Programa Espacial Demolicionista";
SWWM_ACHIEVEMENT_FLIGHT_TXT = "Lanza a un enemigo en volandas más allá de %d unidades de mapa";
SWWM_ACHIEVEMENT_CLIFFYB_TAG = "Mierdas de Recadero";
SWWM_ACHIEVEMENT_CLIFFYB_TXT = "Termina un mapa sin obtener ninguna llave";
SWWM_ACHIEVEMENT_PAR_TAG = "Rápido";
SWWM_ACHIEVEMENT_PAR_TXT = "Supera el tiempo par en %d mapas";
SWWM_ACHIEVEMENT_ONEGUY_TAG = "A la Mierda el Tío Ese";
SWWM_ACHIEVEMENT_ONEGUY_TXT = "Usa el Artefacto Ynykron para matar a un único enemigo no-jefe";
SWWM_ACHIEVEMENT_GOLDEN_TAG = "Lluvia Dorada";
SWWM_ACHIEVEMENT_GOLDEN_TXT = "Usa %d cartuchos dorados";
SWWM_ACHIEVEMENT_GIB_TAG = "Carnaza";
SWWM_ACHIEVEMENT_GIB_TXT = "Haz overkill a %d enemigos";
SWWM_ACHIEVEMENT_BARRIER_TAG = "Filtro Verde";
SWWM_ACHIEVEMENT_BARRIER_TXT = "Usa %d Barreras Elementales";
SWWM_ACHIEVEMENT_BOSSDASH_TAG = "Cabezonería";
SWWM_ACHIEVEMENT_BOSSDASH_TXT = "Mata %d jefes esprintando contra ellos";
SWWM_ACHIEVEMENT_SNEEZE_TAG = "Humillador";
SWWM_ACHIEVEMENT_SNEEZE_TXT = "Mata %d enemigos con el fuego primario del Deep Impact";
SWWM_ACHIEVEMENT_FUEL_TAG = "Hidrogenado";
SWWM_ACHIEVEMENT_FUEL_TXT = "Consume un total de %dL de combustible";
SWWM_ACHIEVEMENT_SLAYER_TAG = "Me he Convertido en Muerte";
SWWM_ACHIEVEMENT_SLAYER_TXT = "Mata %d enemigos con una sola Cabeza Nuclear Slayer";
SWWM_ACHIEVEMENT_DIME_TXT = "Reviéntate con tus propios explosivos";
SWWM_ACHIEVEMENT_STOMP_TAG = "Complejo de Fontanero Italiano";
SWWM_ACHIEVEMENT_STOMP_TXT = "Mata %d enemigos saltando encima";
SWWM_ACHIEVEMENT_CHEAT_TAG = "Han Pasado Diez Años";
SWWM_ACHIEVEMENT_CHEAT_TXT = "Usa un código trampa de SWWM Platinum";
SWWM_ACHIEVEMENT_THRUWALL_TAG = "Toc Toc";
SWWM_ACHIEVEMENT_THRUWALL_TXT = "Mata %d enemigos a través de las paredes con el Silver Bullet";
SWWM_ACHIEVEMENT_MASHIRO_TAG = "Capas de Blanco";
SWWM_ACHIEVEMENT_MASHIRO_TXT = "Invoca a la Dama Blanca";
SWWM_ACHIEVEMENT_LEAD_TAG = "Reparto de Plomo";
SWWM_ACHIEVEMENT_LEAD_TXT = "Alcanza a un enemigo de lleno con el secundario del Eviscerator desde más de %d unidades de mapa";
SWWM_ACHIEVEMENT_LOVE_TAG = "Amor Letal";
SWWM_ACHIEVEMENT_LOVE_TXT = "Mata %d enemigos con un beso lanzado (sin contar insta-kills)";
SWWM_ACHIEVEMENT_BUTTS_TAG = "Esos Glúteos Firmes";
SWWM_ACHIEVEMENT_BUTTS_TXT = "Mata %d enemigos esprintando marcha atrás";
SWWM_ACHIEVEMENT_PLUSH_TAG = "Amorcito";
SWWM_ACHIEVEMENT_PLUSH_TXT = "Juega con los peluches de Saya o Kirin %d veces en la misma partida";
SWWM_ACHIEVEMENT_BUSTIN_TAG = "Me Hace Sentir Bien";
SWWM_ACHIEVEMENT_BUSTIN_TXT = "Revienta %d paredes";
SWWM_ACHIEVEMENT_MOTH_TAG = "Madre Polilla";
SWWM_ACHIEVEMENT_MOTH_TXT = "Reúne %d polillas";
SWWM_ACHIEVEMENT_IWAD_TXT = "Juega en todos los juegos soportados";
SWWM_ACHIEVEMENT_BRAKE_TAG = "Sin Frenos";
SWWM_ACHIEVEMENT_BRAKE_TXT = "Consume toda tu capacidad de combustible en un solo esprint %d veces";
SWWM_ACHIEVEMENT_RAGE_TAG = "No Hablo me Enfado";
SWWM_ACHIEVEMENT_RAGE_TXT = "Usa %d Ragekits";
SWWM_ACHIEVEMENT_ABORT_TAG = "Uy lo He Roto";
SWWM_ACHIEVEMENT_ABORT_TXT = "Causa un aborto de MV";
SWWM_ACHIEVEMENT_PARRY_TAG = "Rey del Parry";
SWWM_ACHIEVEMENT_PARRY_TXT = "Desvía %d proyectiles";
SWWM_ACHIEVEMENT_ACID_TAG = "La Buena Efervescencia";
SWWM_ACHIEVEMENT_ACID_TXT = "Derrite %d enemigos con Flechettes de Telebrium";
SWWM_ACHIEVEMENT_ALLCOLL_TAG = "El Set Completo";
SWWM_ACHIEVEMENT_ALLCOLL_TXT = "Obtén todos los coleccionables en una sola partida";
SWWM_ACHIEVEMENT_ALLITEMS_TAG = "Recolector";
SWWM_ACHIEVEMENT_ALLITEMS_TXT = "Obtén 100%% ítems en %d mapas";
SWWM_ACHIEVEMENT_ALLKILLS_TAG = "Control de Plagas";
SWWM_ACHIEVEMENT_ALLKILLS_TXT = "Obtén 100%% muertes en %d mapas";
SWWM_ACHIEVEMENT_ALLSECRETS_TAG = "Detective Excelente";
SWWM_ACHIEVEMENT_ALLSECRETS_TXT = "Obtén 100%% secretos en %d mapas";
SWWM_ACHIEVEMENT_REFLECT_TAG = "Devuelto a Remitente";
SWWM_ACHIEVEMENT_REFLECT_TXT = "Mata %d enemigos con proyectiles desviados";
SWWM_ACHIEVEMENT_SEKIRO_TAG = "Dudar es Fracasar";
SWWM_ACHIEVEMENT_SEKIRO_TXT = "Muere y reinicia dos veces en el mismo mapa";
SWWM_ACHIEVEMENT_WAVE_TAG = "Sayonara, Capullo";
SWWM_ACHIEVEMENT_WAVE_TXT = "Saluda a un enemigo muriéndose";
SWWM_ACHIEVEMENT_FRIEND_TAG = "Con Forma de Amigo";
SWWM_ACHIEVEMENT_FRIEND_TXT = "Entabla amistad con %d Cacodemonios, Hombres-Dragón o Ettins a base de caricias";
SWWM_ACHIEVEMENT_SHOCK_TXT = "Realiza %d combos de Biospark";
SWWM_ACHIEVEMENT_BALLS_TAG = "Machácate las Bolas";
SWWM_ACHIEVEMENT_BALLS_TXT = "Consigue %d críticos de Bola de Plomo";
SWWM_ACHIEVEMENT_REFRESH_TAG = "Siempre Fresco";
SWWM_ACHIEVEMENT_REFRESH_TXT = "Usa %d Refrescadores";
SWWM_ACHIEVEMENT_STEP_TAG = "Pisadita";
SWWM_ACHIEVEMENT_STEP_TXT = "Mantente de pie en la cabeza de un solo enemigo durante %d segundos";
SWWM_ACHIEVEMENT_SUNNY_TXT = "Usa %d Invincibolas";
SWWM_ACHIEVEMENT_THICC_TAG = "El Culo era Gordo";
SWWM_ACHIEVEMENT_THICC_TXT = "Mata %d enemigos a base de estampidas en el suelo";
SWWM_ACHIEVEMENT_EVERYTHING_TAG = "La Demolicionista";
SWWM_ACHIEVEMENT_EVERYTHING_TXT = "Desbloquea todos los logros";
SWWM_ACHIEVEMENT_ALLCOLL_TAG = "El Set Completo";
SWWM_ACHIEVEMENT_ALLCOLL_TXT = "Obtén todos los coleccionables en una sola partida";
SWWM_ACHIEVEMENT_SLEMG_TAG = "El Método Sledge";
SWWM_ACHIEVEMENT_SLEMG_TXT = "Activa %d interruptores a puñetazos";
SWWM_ACHIEVEMENT_DOSH_TAG = "Capitalismo Desenfrenado";
SWWM_ACHIEVEMENT_DOSH_TXT = "Ten ¥1.000.000.000 en mano";
SWWM_ACHIEVEMENT_JUMP_TAG = "Verticalidad";
SWWM_ACHIEVEMENT_JUMP_TXT = "Salta paredes %d veces";
SWWM_ACHIEVEMENT_EZKILL_TAG = "Eso Estuvo Fácil";
SWWM_ACHIEVEMENT_EZKILL_TXT = "Mata %d enemigos con un solo disparo de Artefacto Ynykron (excluyendo modo secundario)";
SWWM_ACHIEVEMENT_LIGMA_TAG = "¿Quien es Steve Jobs?";
SWWM_ACHIEVEMENT_LIGMA_TXT = "Mata a un jefe final con el Artefacto Ynykron";
SWWM_ACHIEVEMENT_YEET_TXT = "Lanza una Pistola Caramelo justo dentro del cerebro del Icono del Pecado";
SWWM_ACHIEVEMENT_MBF_TAG = "Puedes Acariciar el Perro";
SWWM_ACHIEVEMENT_MBF_TXT = "Acaricia un perro";
SWWM_ACHIEVEMENT_LIGHTNING_TAG = "Maldición de John Romero";
SWWM_ACHIEVEMENT_LIGHTNING_TXT = "Achichárrate descargando un arma eléctrica en el agua";
SWWM_ACHIEVEMENT_DAKKA_TXT = "Dispara la Ametralladora Sheen durante un minuto entero";
SWWM_ACHIEVEMENT_ROAST_TAG = "Ensarta en los Fuegos del Hades";
SWWM_ACHIEVEMENT_ROAST_TXT = "Realiza %d combos de bayoneta con la Quadravol";
SWWM_ACHIEVEMENT_DAB_TXT = "Revienta %d enemigos con el Mazo Itamex";
SWWM_ACHIEVEMENT_HND_TAG = "Mediodía";
SWWM_ACHIEVEMENT_HND_TXT = "Realiza %d disparos mortales en una única recarga de Puntzer Beta";
SWWM_ACHIEVEMENT_GEPGUN_TAG = "El Derribo Más Silencioso";
SWWM_ACHIEVEMENT_GEPGUN_TXT = "Mata %d enemigos con el fuego primario de la Ray-Khom sin alertarlos";
SWWM_ACHIEVEMENT_FULLER_TAG = "Has Ganado Brouzouf";
SWWM_ACHIEVEMENT_FULLER_TXT = "Vacía un cargador entero en super-automático con el Puntzer Gamma sin fallar un solo disparo";
SWWM_ACHIEVEMENT_PENE_TAG = "Penetrador";
SWWM_ACHIEVEMENT_PENE_TXT = "Atraviesa %d enemigos en fila con un solo secundario de la Gran Lanza";
SWWM_ACHIEVEMENT_ACID_TAG = "La Buena Efervescencia";
SWWM_ACHIEVEMENT_ACID_TXT = "Derrite %d enemigos con Flechettes de Telebrium";
SWWM_ACHIEVEMENT_SALT_TAG = "Sobresalado Máximo";
SWWM_ACHIEVEMENT_SALT_TXT = "Dispara 25 cartuchos de sal al mismo tiempo";
SWWM_ACHIEVEMENT_MEGA_TAG = "Megamuerte";
SWWM_ACHIEVEMENT_MEGA_TXT = "Mata un gran total de un millón de enemigos";
SWWM_ACHIEVEMENT_SANIC_TAG = "PERRITOS DE CHILE";
SWWM_ACHIEVEMENT_SANIC_TXT = "Alcanza una velocidad punta de %d km/h";
SWWM_ACHIEVEMENT_TELE_TAG = "Pasatiempo de Soldado";
SWWM_ACHIEVEMENT_TELE_TXT = "Teletransporta pan (un sandwich también vale)";
SWWM_ACHIEVEMENT_BUNE_TAG = "Lagomorfo Legendario";
SWWM_ACHIEVEMENT_BUNE_TXT = "Realiza %d bunnyhops";
SWWM_ACHIEVEMENT_BONK_TAG = "Resistente a Choques";
SWWM_ACHIEVEMENT_BONK_TXT = "Choca %d veces";
SWWM_ACHIEVEMENT_ANOM_TAG = "Anómalo";
SWWM_ACHIEVEMENT_ANOM_TXT = "Usa %d Artefactos Mykradvo";
SWWM_ACHIEVEMENT_ANONE_TAG = "Uso Completamente Necesario de Fuerza";
SWWM_ACHIEVEMENT_ANONE_TXT = "Usa el Artefacto Mykradvo contra un único enemigo no-jefe";
SWWM_ACHIEVEMENT_BALLS_TAG = "Machácate las Bolas";
SWWM_ACHIEVEMENT_BALLS_TXT = "Consigue %d críticos de Bola de Plomo";
SWWM_ACHIEVEMENT_BARRIER_TAG = "Filtro Verde";
SWWM_ACHIEVEMENT_BARRIER_TXT = "Usa %d Barreras Elementales";
SWWM_ACHIEVEMENT_BONK_TAG = "Resistente a Choques";
SWWM_ACHIEVEMENT_BONK_TXT = "Choca %d veces";
SWWM_ACHIEVEMENT_BOSSDASH_TAG = "Cabezonería";
SWWM_ACHIEVEMENT_BOSSDASH_TXT = "Mata %d jefes esprintando contra ellos";
SWWM_ACHIEVEMENT_BRAKE_TAG = "Sin Frenos";
SWWM_ACHIEVEMENT_BRAKE_TXT = "Consume toda tu capacidad de combustible en un solo esprint %d veces";
SWWM_ACHIEVEMENT_BUNE_TAG = "Lagomorfo Legendario";
SWWM_ACHIEVEMENT_BUNE_TXT = "Realiza %d bunnyhops";
SWWM_ACHIEVEMENT_BUSTIN_TAG = "Me Hace Sentir Bien";
SWWM_ACHIEVEMENT_BUSTIN_TXT = "Revienta %d paredes";
SWWM_ACHIEVEMENT_BUTTS_TAG = "Esos Glúteos Firmes";
SWWM_ACHIEVEMENT_BUTTS_TXT = "Mata %d enemigos esprintando marcha atrás";
SWWM_ACHIEVEMENT_CHEAT_TAG = "Han Pasado Diez Años";
SWWM_ACHIEVEMENT_CHEAT_TXT = "Usa un código trampa de SWWM Platinum";
SWWM_ACHIEVEMENT_CLIFFYB_TAG = "Mierdas de Recadero";
SWWM_ACHIEVEMENT_CLIFFYB_TXT = "Termina un mapa sin obtener ninguna llave";
SWWM_ACHIEVEMENT_CLONK_TAG = "CLONK";
SWWM_ACHIEVEMENT_CLONK_TXT = "Mata a un jefe con un crítico de Bola de Plomo";
SWWM_ACHIEVEMENT_CONGA_TAG = "Conga de la Muerte";
SWWM_ACHIEVEMENT_CONGA_TXT = "Mata %d enemigos con una sola bala XSB";
SWWM_ACHIEVEMENT_DAB_TXT = "Revienta %d enemigos con el Mazo Itamex";
SWWM_ACHIEVEMENT_DAKKA_TXT = "Dispara la Ametralladora Sheen durante un minuto entero";
SWWM_ACHIEVEMENT_DIME_TXT = "Reviéntate con tus propios explosivos";
SWWM_ACHIEVEMENT_DOSH_TAG = "Capitalismo Desenfrenado";
SWWM_ACHIEVEMENT_DOSH_TXT = "Ten ¥1.000.000.000 en mano";
SWWM_ACHIEVEMENT_EVERYTHING_TAG = "La Demolicionista";
SWWM_ACHIEVEMENT_EVERYTHING_TXT = "Desbloquea todos los logros";
SWWM_ACHIEVEMENT_EZKILL_TAG = "Eso Estuvo Fácil";
SWWM_ACHIEVEMENT_EZKILL_TXT = "Mata %d enemigos con un solo disparo de Artefacto Ynykron (excluyendo modo secundario)";
SWWM_ACHIEVEMENT_FLIGHT_TAG = "Programa Espacial Demolicionista";
SWWM_ACHIEVEMENT_FLIGHT_TXT = "Lanza a un enemigo en volandas más allá de %d unidades de mapa";
SWWM_ACHIEVEMENT_FRIEND_TAG = "Con Forma de Amigo";
SWWM_ACHIEVEMENT_FRIEND_TXT = "Entabla amistad con %d Cacodemonios, Hombres-Dragón o Ettins a base de caricias";
SWWM_ACHIEVEMENT_FUEL_TAG = "Hidrogenado";
SWWM_ACHIEVEMENT_FUEL_TXT = "Consume un total de %dL de combustible";
SWWM_ACHIEVEMENT_FULLER_TAG = "Has Ganado Brouzouf";
SWWM_ACHIEVEMENT_FULLER_TXT = "Vacía un cargador entero en super-automático con el Puntzer Gamma sin fallar un solo disparo";
SWWM_ACHIEVEMENT_GCSANDWICH_TAG = "Un Poco de Sandwich, de Propina";
SWWM_ACHIEVEMENT_GCSANDWICH_TXT = "Usa %d Sándwiches de Queso a la Plancha";
SWWM_ACHIEVEMENT_GEPGUN_TAG = "El Derribo Más Silencioso";
SWWM_ACHIEVEMENT_GEPGUN_TXT = "Mata %d enemigos con el fuego primario de la Ray-Khom sin alertarlos";
SWWM_ACHIEVEMENT_GHOST_TAG = "Camuflaje Activado";
SWWM_ACHIEVEMENT_GHOST_TXT = "Usa %d Artefactos Fantasma";
SWWM_ACHIEVEMENT_GIB_TAG = "Carnaza";
SWWM_ACHIEVEMENT_GIB_TXT = "Haz overkill a %d enemigos";
SWWM_ACHIEVEMENT_GOLDEN_TAG = "Lluvia Dorada";
SWWM_ACHIEVEMENT_GOLDEN_TXT = "Usa %d cartuchos dorados";
SWWM_ACHIEVEMENT_GRAVITY_TAG = "Ascenso Decente";
SWWM_ACHIEVEMENT_GRAVITY_TXT = "Usa %d Supresores de Gravedad";
SWWM_ACHIEVEMENT_HND_TAG = "Mediodía";
SWWM_ACHIEVEMENT_HND_TXT = "Realiza %d disparos mortales en una única recarga de Puntzer Beta";
SWWM_ACHIEVEMENT_IWAD_TXT = "Juega en todos los juegos soportados";
SWWM_ACHIEVEMENT_JUMP_TAG = "Verticalidad";
SWWM_ACHIEVEMENT_JUMP_TXT = "Salta paredes %d veces";
SWWM_ACHIEVEMENT_LEAD_TAG = "Reparto de Plomo";
SWWM_ACHIEVEMENT_LEAD_TXT = "Alcanza a un enemigo de lleno con el secundario del Eviscerator desde más de %d unidades de mapa";
SWWM_ACHIEVEMENT_LIGHTNING_TAG = "Maldición de John Romero";
SWWM_ACHIEVEMENT_LIGHTNING_TXT = "Achichárrate descargando un arma eléctrica en el agua";
SWWM_ACHIEVEMENT_LIGMA_TAG = "¿Quien es Steve Jobs?";
SWWM_ACHIEVEMENT_LIGMA_TXT = "Mata a un jefe final con el Artefacto Ynykron";
SWWM_ACHIEVEMENT_LOVE_TAG = "Amor Letal";
SWWM_ACHIEVEMENT_LOVE_TXT = "Mata %d enemigos con un beso lanzado (sin contar insta-kills)";
SWWM_ACHIEVEMENT_MASHIRO_TAG = "Capas de Blanco";
SWWM_ACHIEVEMENT_MASHIRO_TXT = "Invoca a la Dama Blanca";
SWWM_ACHIEVEMENT_MBF_TAG = "Puedes Acariciar el Perro";
SWWM_ACHIEVEMENT_MBF_TXT = "Acaricia un perro";
SWWM_ACHIEVEMENT_MEGA_TAG = "Megamuerte";
SWWM_ACHIEVEMENT_MEGA_TXT = "Mata un gran total de un millón de enemigos";
SWWM_ACHIEVEMENT_MOTH_TAG = "Madre Polilla";
SWWM_ACHIEVEMENT_MOTH_TXT = "Reúne %d polillas";
SWWM_ACHIEVEMENT_NICE_TXT = "Termina un nivel con 69 de vida";
SWWM_ACHIEVEMENT_ONEGUY_TAG = "A la Mierda el Tío Ese";
SWWM_ACHIEVEMENT_ONEGUY_TXT = "Usa el Artefacto Ynykron para matar a un único enemigo no-jefe";
SWWM_ACHIEVEMENT_ONESTANDING_TAG = "Una Advertencia a los Otros";
SWWM_ACHIEVEMENT_ONESTANDING_TXT = "Termina un mapa con solo un enemigo vivo";
SWWM_ACHIEVEMENT_OOPSIE_TAG = "Gran Errorcito";
SWWM_ACHIEVEMENT_OOPSIE_TXT = "Bórrate con el Artefacto Ynykron";
SWWM_ACHIEVEMENT_PARRY_TAG = "Rey del Parry";
SWWM_ACHIEVEMENT_PARRY_TXT = "Desvía %d proyectiles";
SWWM_ACHIEVEMENT_PAR_TAG = "Rápido";
SWWM_ACHIEVEMENT_PAR_TXT = "Supera el tiempo par en %d mapas";
SWWM_ACHIEVEMENT_PENE_TAG = "Penetrador";
SWWM_ACHIEVEMENT_PENE_TXT = "Atraviesa %d enemigos en fila con un solo secundario de la Gran Lanza";
SWWM_ACHIEVEMENT_PLUSH_TAG = "Amorcito";
SWWM_ACHIEVEMENT_PLUSH_TXT = "Juega con los peluches de Saya o Kirin %d veces en la misma partida";
SWWM_ACHIEVEMENT_RAGE_TAG = "No Hablo me Enfado";
SWWM_ACHIEVEMENT_RAGE_TXT = "Usa %d Ragekits";
SWWM_ACHIEVEMENT_REFLECT_TAG = "Devuelto a Remitente";
SWWM_ACHIEVEMENT_REFLECT_TXT = "Mata %d enemigos con proyectiles desviados";
SWWM_ACHIEVEMENT_REFRESH_TAG = "Siempre Fresco";
SWWM_ACHIEVEMENT_REFRESH_TXT = "Usa %d Refrescadores";
SWWM_ACHIEVEMENT_ROAST_TAG = "Ensarta en los Fuegos del Hades";
SWWM_ACHIEVEMENT_ROAST_TXT = "Realiza %d combos de bayoneta con la Quadravol";
SWWM_ACHIEVEMENT_SALT_TAG = "Sobresalado Máximo";
SWWM_ACHIEVEMENT_SALT_TXT = "Dispara 25 cartuchos de sal al mismo tiempo";
SWWM_ACHIEVEMENT_SANIC_TAG = "PERRITOS DE CHILE";
SWWM_ACHIEVEMENT_SANIC_TXT = "Alcanza una velocidad punta de %d km/h";
SWWM_ACHIEVEMENT_SEKIRO_TAG = "Dudar es Fracasar";
SWWM_ACHIEVEMENT_SEKIRO_TXT = "Muere y reinicia dos veces en el mismo mapa";
SWWM_ACHIEVEMENT_SHOCK_TXT = "Realiza %d combos de Biospark";
SWWM_ACHIEVEMENT_SLAYER_TAG = "Me he Convertido en Muerte";
SWWM_ACHIEVEMENT_SLAYER_TXT = "Mata %d enemigos con una sola Cabeza Nuclear Slayer";
SWWM_ACHIEVEMENT_SLEMG_TAG = "El Método Sledge";
SWWM_ACHIEVEMENT_SLEMG_TXT = "Activa %d interruptores a puñetazos";
SWWM_ACHIEVEMENT_SNEEZE_TAG = "Humillador";
SWWM_ACHIEVEMENT_SNEEZE_TXT = "Mata %d enemigos con el fuego primario del Deep Impact";
SWWM_ACHIEVEMENT_STEP_TAG = "Pisadita";
SWWM_ACHIEVEMENT_STEP_TXT = "Mantente de pie en la cabeza de un solo enemigo durante %d segundos";
SWWM_ACHIEVEMENT_STOMP_TAG = "Complejo de Fontanero Italiano";
SWWM_ACHIEVEMENT_STOMP_TXT = "Mata %d enemigos saltando encima";
SWWM_ACHIEVEMENT_SUNNY_TXT = "Usa %d Invincibolas";
SWWM_ACHIEVEMENT_TELE_TAG = "Pasatiempo de Soldado";
SWWM_ACHIEVEMENT_TELE_TXT = "Teletransporta pan (un sandwich también vale)";
SWWM_ACHIEVEMENT_THICC_TAG = "El Culo era Gordo";
SWWM_ACHIEVEMENT_THICC_TXT = "Mata %d enemigos a base de estampidas en el suelo";
SWWM_ACHIEVEMENT_THRUWALL_TAG = "Toc Toc";
SWWM_ACHIEVEMENT_THRUWALL_TXT = "Mata %d enemigos a través de las paredes con el Silver Bullet";
SWWM_ACHIEVEMENT_WANTDIE_TAG = "Mata a tu Jefe";
SWWM_ACHIEVEMENT_WANTDIE_TXT = "Despeja un mapa en la dificultad más alta (sin morir)";
SWWM_ACHIEVEMENT_WAVE_TAG = "Sayonara, Capullo";
SWWM_ACHIEVEMENT_WAVE_TXT = "Saluda a un enemigo muriéndose";
SWWM_ACHIEVEMENT_YEET_TXT = "Lanza una Pistola Caramelo justo dentro del cerebro del Icono del Pecado";

View file

@ -1,3 +1,3 @@
[default]
SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r399 \cu(Wed 24 Mar 15:37:04 CET 2021)\c-";
SWWM_SHORTVER="\cw0.9.11b-pre r399 \cu(2021-03-24 15:37:04)\c-";
SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r400 \cu(Wed 24 Mar 17:41:38 CET 2021)\c-";
SWWM_SHORTVER="\cw0.9.11b-pre r400 \cu(2021-03-24 17:41:38)\c-";

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;
}

View file

@ -166,14 +166,12 @@ Class SWWMAchievementNotification : HUDMessageBase
double tics, holdtics, fadeintics, fadeouttics;
transient Font tewifont, mplusfont, miniwifont, k6x8font;
SWWMAchievementNotification Init( String bname, int bnum = 0 )
SWWMAchievementNotification Init( String bname, TextureID icon, int bnum = 0 )
{
tag = bname.."_TAG";
txt = bname.."_TXT";
tag = "$SWWM_ACHIEVEMENT_"..bname.."_TAG";
txt = "$SWWM_ACHIEVEMENT_"..bname.."_TXT";
num = bnum;
icon = TexMan.CheckForTexture(StringTable.Localize(bname.."_PIC"),TexMan.Type_Any);
// fallback icon
if ( !icon.IsValid() ) icon = TexMan.CheckForTexture("graphics/Achievements/AchievementNone.png",TexMan.Type_Any);
self.icon = icon;
frame = TexMan.CheckForTexture("graphics/HUD/AchievementNotification.png",TexMan.Type_Any);
holdtics = 150;
fadeintics = 20;

View file

@ -13,14 +13,6 @@ Class MenuTransaction
bool result, usedup;
}
Class MenuAchievement
{
String tag, txt;
TextureID icon;
CVar state, progress;
int num, maxval;
}
// FIXME this whole thing needs to be refactored eventually
Class DemolitionistMenu : GenericMenu
{
@ -65,7 +57,7 @@ Class DemolitionistMenu : GenericMenu
Array<MonsterKill> sorted_mstats; // sorted by killcount
Array<LevelStat> filtered_lstats; // filtered if necessary + entry for current map
LevelStat curlstat;
Array<MenuAchievement> achievements; // array created once, then sorted as needed
Array<SWWMAchievement> achievements; // array created once, then sorted as needed
// inventory lists
Array<Inventory> invlist;
// lore stuff
@ -346,440 +338,7 @@ Class DemolitionistMenu : GenericMenu
if ( tabs[curtab] == TAB_LIBRARY ) sel1 = swwm_lastloretab;
else if ( tabs[curtab] == TAB_STATS ) sel1 = swwm_laststattab;
// load achievements
LoadAchievements();
}
// this is very spaghetti, sorry
private void LoadAchievements()
{
// 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_everything',
'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_EVERYTHING",
"$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, // EVERYTHING
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, // EVERYTHING
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',
'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',
'None', // EVERYTHING
'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
};
achievements.Clear();
for ( int i=0; i<vars.Size(); i++ )
{
if ( ignoreme[i] ) continue;
let ac = new("MenuAchievement");
ac.state = CVar.FindCVar(vars[i]);
if ( (names[i] == "$SWWM_ACHIEVEMENT_EVERYTHING") && !ac.state.GetInt() )
continue; // this one must remain hidden until obtained
ac.progress = (pvar[i]!='None')?CVar.FindCVar(pvar[i]):null;
ac.maxval = ac.num = number[i];
// special cases
if ( vars[i] == '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++;
}
ac.maxval = nc;
}
else if ( vars[i] == 'swwm_achievement_dakka' ) ac.maxval = 60;
else if ( vars[i] == 'swwm_achievement_dosh' ) ac.maxval = 1000000000;
else if ( vars[i] == 'swwm_achievement_mega' ) ac.maxval = 1000000;
else if ( vars[i] == 'swwm_achievement_iwad' ) ac.maxval = 7;
ac.tag = names[i].."_TAG";
ac.txt = names[i].."_TXT";
ac.icon = TexMan.CheckForTexture(StringTable.Localize(names[i].."_PIC"),TexMan.Type_Any);
TextureID invalid;
invalid.SetInvalid();
if ( ac.icon == invalid )
ac.icon = TexMan.CheckForTexture("graphics/Achievements/AchievementNone.png",TexMan.Type_Any);
achievements.Push(ac);
}
SWWMUtility.LoadAchievements(achievements,true);
AchievementUnknown = TexMan.CheckForTexture("graphics/Achievements/AchievementUnknown.png",TexMan.Type_Any);
}
@ -2617,7 +2176,7 @@ Class DemolitionistMenu : GenericMenu
qsort_collectible(a,p+1,h);
}
private bool CmpAchievement( MenuAchievement a, MenuAchievement b )
private bool CmpAchievement( SWWMAchievement a, SWWMAchievement b )
{
bool adone = !!(a.state.GetInt()), bdone = !!(b.state.GetInt());
double afactor = adone?1.:0., bfactor = bdone?1.:0.;
@ -2625,7 +2184,7 @@ Class DemolitionistMenu : GenericMenu
{
int val = a.progress.GetInt();
int mval = a.maxval;
if ( a.tag == "$SWWM_ACHIEVEMENT_IWAD_TAG" )
if ( a.basename == "iwad" )
{
// special case
mval = 3;
@ -2640,7 +2199,7 @@ Class DemolitionistMenu : GenericMenu
{
int val = b.progress.GetInt();
int mval = b.maxval;
if ( b.tag == "$SWWM_ACHIEVEMENT_IWAD_TAG" )
if ( b.basename == "iwad" )
{
// special case
mval = 3;
@ -2654,8 +2213,8 @@ Class DemolitionistMenu : GenericMenu
if ( adone && bdone )
{
// alphabetic sort
String tag1 = StringTable.Localize(a.tag),
tag2 = StringTable.Localize(b.tag);
String tag1 = StringTable.Localize("$SWWM_ACHIEVEMENT_"..a.basename.."_TAG"),
tag2 = StringTable.Localize("$SWWM_ACHIEVEMENT_"..b.basename.."_TAG");
return tag1 > tag2;
}
if ( !adone && !bdone )
@ -2664,34 +2223,34 @@ Class DemolitionistMenu : GenericMenu
if ( afactor != bfactor )
return afactor < bfactor;
// alphabetic sort
String tag1 = StringTable.Localize(a.tag),
tag2 = StringTable.Localize(b.tag);
String tag1 = StringTable.Localize("$SWWM_ACHIEVEMENT_"..a.basename.."_TAG"),
tag2 = StringTable.Localize("$SWWM_ACHIEVEMENT_"..b.basename.."_TAG");
return tag1 > tag2;
}
// state sort
return bdone;
}
private int partition_achievements( Array<MenuAchievement> a, int l, int h )
private int partition_achievements( Array<SWWMAchievement> a, int l, int h )
{
MenuAchievement pv = a[h];
SWWMAchievement pv = a[h];
int i = (l-1);
for ( int j=l; j<=(h-1); j++ )
{
if ( CmpAchievement(pv,a[j]) )
{
i++;
MenuAchievement tmp = a[j];
SWWMAchievement tmp = a[j];
a[j] = a[i];
a[i] = tmp;
}
}
MenuAchievement tmp = a[h];
SWWMAchievement tmp = a[h];
a[h] = a[i+1];
a[i+1] = tmp;
return i+1;
}
private void qsort_achievements( Array<MenuAchievement> a, int l, int h )
private void qsort_achievements( Array<SWWMAchievement> a, int l, int h )
{
if ( l >= h ) return;
int p = partition_achievements(a,l,h);
@ -3584,20 +3143,21 @@ Class DemolitionistMenu : GenericMenu
let fnt2 = LangFont(MiniwiFont);
int barsz = (language~=="jp")?400:480;
int txtsz = (language~=="jp")?360:440;
bool obscure = (swwm_filterachievements==1);
for ( int i=ofs; i<cnt; i++ )
{
if ( yy >= 360 ) break;
let a = achievements[i];
bool completed = !!a.state.GetInt();
bool hasprogress = (a.progress && a.progress.GetInt());
Screen.DrawTexture((!completed&&!hasprogress)?AchievementUnknown:a.icon,false,origin.x+xx+1,origin.y+yy+1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_FillColor,(!completed&&!hasprogress)?Color(8,8,8):Color(16,16,16));
Screen.DrawTexture((!completed&&!hasprogress)?AchievementUnknown:a.icon,false,origin.x+xx,origin.y+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Desaturate,(!completed)*255,DTA_ColorOverlay,completed?Color(0,0,0,0):hasprogress?Color(96,0,0,0):Color(192,0,0,0));
Screen.DrawTexture((!completed&&!hasprogress&&obscure)?AchievementUnknown:a.icon,false,origin.x+xx+1,origin.y+yy+1,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_FillColor,(!completed&&!hasprogress&&obscure)?Color(8,8,8):Color(16,16,16));
Screen.DrawTexture((!completed&&!hasprogress&&obscure)?AchievementUnknown:a.icon,false,origin.x+xx,origin.y+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Desaturate,(!completed)*255,DTA_ColorOverlay,completed?Color(0,0,0,0):(hasprogress||!obscure)?Color(96,0,0,0):Color(192,0,0,0));
// progress bar
if ( a.progress )
{
int val = a.progress.GetInt();
int mval = a.maxval;
if ( a.tag == "$SWWM_ACHIEVEMENT_IWAD_TAG" )
if ( a.basename == "iwad" )
{
// special case
mval = 3;
@ -3620,11 +3180,11 @@ Class DemolitionistMenu : GenericMenu
Screen.DrawText(TewiFont,Font.CR_UNTRANSLATED,origin.x+xx,origin.y+yy+34,str,DTA_Spacing,-5,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
// the text itself
str = a.num?String.Format(StringTable.Localize(a.txt),a.num):StringTable.Localize(a.txt);
if ( !completed && !hasprogress ) SWWMUtility.ObscureText(str,(gametic/3)+i*2);
str = a.hasformat?String.Format(StringTable.Localize("$SWWM_ACHIEVEMENT_"..a.basename.."_TXT"),a.maxval):StringTable.Localize("$SWWM_ACHIEVEMENT_"..a.basename.."_TXT");
if ( !completed && !hasprogress && obscure ) SWWMUtility.ObscureText(str,(gametic/3)+i*2);
BrokenLines l = fnt2.BreakLines(str,txtsz);
str = StringTable.Localize(a.tag);
if ( !completed && !hasprogress ) SWWMUtility.ObscureText(str,(gametic/3)+i*2+1);
str = StringTable.Localize("$SWWM_ACHIEVEMENT_"..a.basename.."_TAG");
if ( !completed && !hasprogress && obscure ) SWWMUtility.ObscureText(str,(gametic/3)+i*2+1);
int oy = (32-(14+(9*l.Count())))/2;
Screen.DrawText(fnt,completed?Font.CR_GREEN:Font.CR_DARKGRAY,origin.x+xx+36,origin.y+yy+oy,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
for ( int j=0; j<l.Count(); j++ )

View file

@ -20,6 +20,7 @@ Class SWWMStaticHandler : StaticEventHandler
int checktic;
ui bool mpsent, checked;
int maptime;
bool unloading;
override void NewGame()
{
@ -32,6 +33,7 @@ Class SWWMStaticHandler : StaticEventHandler
override void WorldUnloaded( WorldEvent e )
{
SWWMHandler.ClearAllShaders(players[consoleplayer]);
unloading = true;
}
override void WorldTick()
@ -41,6 +43,7 @@ Class SWWMStaticHandler : StaticEventHandler
override void WorldLoaded( WorldEvent e )
{
unloading = false;
maptime = 0;
if ( e.IsSavegame || e.IsReopen )
{
@ -53,10 +56,19 @@ Class SWWMStaticHandler : StaticEventHandler
}
if ( players[consoleplayer].mo )
{
// recheck progress on collectibles
int nc = 0;
for ( Inventory i=players[consoleplayer].mo.inv; i; i=i.inv ) if ( i is 'SWWMCollectible' ) nc++;
if ( !swwm_achievement_allcoll ) CVar.FindCVar('swwm_progress_allcoll').SetInt(nc);
// recheck progress on some per-session achievements
if ( swwm_achievement_allcoll <= 0 )
{
int nc = 0;
for ( Inventory i=players[consoleplayer].mo.inv; i; i=i.inv ) if ( i is 'SWWMCollectible' ) nc++;
CVar.FindCVar('swwm_progress_allcoll').SetInt(nc);
}
if ( swwm_achievement_plush <= 0 )
{
let s = SWWMStats.Find(players[consoleplayer]);
if ( s ) CVar.FindCVar('swwm_progress_plush').SetInt(s.plushuses);
else CVar.FindCVar('swwm_progress_plush').SetInt(0);
}
}
SWWMHandler.ClearAllShaders(players[consoleplayer]);
// force a reset of the minimap zoom in case it's set beyond safe levels
@ -189,14 +201,14 @@ Class SWWMStaticHandler : StaticEventHandler
c.bSTANDSTILL = true;
if ( e.Args[0] == consoleplayer )
{
S_StartSound("misc/achievement",CHAN_ITEM,CHANF_UI|CHANF_OVERLAP);
S_StartSound("misc/achievement2",CHAN_VOICE,CHANF_UI|CHANF_OVERLAP);
c.A_StartSound("misc/achievement",CHAN_ITEM,CHANF_UI|CHANF_OVERLAP,attenuation:0.);
c.A_StartSound("misc/achievement2",CHAN_VOICE,CHANF_UI|CHANF_OVERLAP,attenuation:0.);
}
else
{
Console.Printf(String.Format(StringTable.Localize("$SWWM_CHEEVOREM"),players[e.Args[0]].GetUserName(),StringTable.Localize(e.Name.Mid(16))));
c.A_StartSound("misc/achievement",CHAN_ITEM,CHANF_OVERLAP);
c.A_StartSound("misc/achievement2",CHAN_ITEM,CHANF_OVERLAP);
c.A_StartSound("misc/achievement",CHAN_ITEM,CHANF_UI|CHANF_OVERLAP);
c.A_StartSound("misc/achievement2",CHAN_ITEM,CHANF_UI|CHANF_OVERLAP);
}
}
}

View file

@ -13,8 +13,121 @@ enum EDoExplosionFlags
DE_COUNTSTEALTH = 256, // only count hits for inactive monsters
};
Class SWWMAchievement
{
String basename;
transient CVar state, progress;
TextureID icon;
int maxval;
bool hasformat;
}
Class SWWMUtility
{
// loaded from a file, neater than having a bunch of static arrays
// filter: excludes unobtained achievements if swwm_filterachievements is 2
// also excludes the "everything" achievement unless unlocked
static clearscope void LoadAchievements( out Array<SWWMAchievement> achievements, bool filter = false )
{
achievements.Clear();
let lmp = Wads.FindLump("achievements.lst");
if ( lmp == -1 ) ThrowAbortException("'achievements.lst' not found");
String dat = Wads.ReadLump(lmp);
Array<String> list;
dat.Split(list,"\n");
bool hide = (filter&&(swwm_filterachievements==2));
for ( int i=0; i<list.Size(); i++ )
{
if ( (list[i].Length() == 0) || (list[i].Left(1) == "#") || (list[i].Left(1) == "") )
continue;
Array<String> ln;
list[i].Split(ln,",",0);
let ac = new("SWWMAchievement");
ac.basename = ln[0];
ac.maxval = ln[1].ToInt();
ac.hasformat = (ln[2]~=="yes");
ac.state = CVar.FindCVar("swwm_achievement_"..ac.basename);
// if filtering, always hide the full completion achievement until it's unlocked
if ( filter && (ac.basename == "everything") && (ac.state.GetInt() <= 0) )
{
ac.Destroy();
continue;
}
if ( !ac.state ) ThrowAbortException("could not find cvar 'swwm_achievement_"..ac.basename.."'");
if ( ac.maxval )
{
ac.progress = CVar.FindCVar("swwm_progress_"..ac.basename);
if ( !ac.progress ) ThrowAbortException("could not find cvar 'swwm_progress_"..ac.basename.."'");
// special case for maxval
if ( ac.basename == "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++;
}
ac.maxval = nc;
}
}
else ac.progress = null;
ac.icon = TexMan.CheckForTexture("graphics/Achievements/Achievement"..ac.basename..".png",TexMan.Type_Any);
// fallback icon if one is not found
if ( !ac.icon.IsValid() ) ac.icon = TexMan.CheckForTexture("graphics/Achievements/AchievementNone.png",TexMan.Type_Any);
// hide away achievements at 0%
if ( hide && (ac.state.GetInt() <= 0) && (!ac.progress || (ac.progress.GetInt() <= 0)) )
{
ac.Destroy();
continue;
}
achievements.Push(ac);
}
}
// achievement helpers
static clearscope void MarkAchievement( Name mvar, PlayerInfo p = null )
{
if ( !p || (p != players[consoleplayer]) ) return;
let cv = CVar.FindCVar(mvar);
if ( !cv ) return;
if ( cv.GetInt() < 1 ) cv.SetInt(1);
}
static clearscope void AchievementProgress( Name pvar, int val, PlayerInfo p = null )
{
if ( !p || (p != players[consoleplayer]) ) return;
let cv = CVar.FindCVar(pvar);
if ( !cv ) return;
int cval = cv.GetInt();
cv.SetInt(max(cval,val));
}
static clearscope void AchievementProgressInc( Name pvar, int inc, PlayerInfo p = null )
{
if ( !p || (p != players[consoleplayer]) ) return;
let cv = CVar.FindCVar(pvar);
if ( !cv ) return;
int cval = cv.GetInt();
cv.SetInt(cval+inc);
}
static clearscope void AchievementProgressIncDouble( Name pvar, double inc, PlayerInfo p = null )
{
if ( !p || (p != players[consoleplayer]) ) return;
let cv = CVar.FindCVar(pvar);
if ( !cv ) return;
double cval = cv.GetFloat();
cv.SetFloat(cval+inc);
}
static clearscope void AchievementProgressOr( Name pvar, int val, PlayerInfo p = null )
{
if ( !p || (p != players[consoleplayer]) ) return;
let cv = CVar.FindCVar(pvar);
if ( !cv ) return;
int cval = cv.GetInt();
cv.SetInt(cval|val);
}
// thanks zscript
static clearscope double fract( double a )
{
@ -1629,47 +1742,6 @@ Class SWWMUtility
return false, checkme;
}
// achievement helpers
static clearscope void MarkAchievement( Name mvar, PlayerInfo p = null )
{
if ( !p || (p != players[consoleplayer]) ) return;
let cv = CVar.FindCVar(mvar);
if ( !cv ) return;
if ( cv.GetInt() < 1 ) cv.SetInt(1);
}
static clearscope void AchievementProgress( Name pvar, int val, PlayerInfo p = null )
{
if ( !p || (p != players[consoleplayer]) ) return;
let cv = CVar.FindCVar(pvar);
if ( !cv ) return;
int cval = cv.GetInt();
cv.SetInt(max(cval,val));
}
static clearscope void AchievementProgressInc( Name pvar, int inc, PlayerInfo p = null )
{
if ( !p || (p != players[consoleplayer]) ) return;
let cv = CVar.FindCVar(pvar);
if ( !cv ) return;
int cval = cv.GetInt();
cv.SetInt(cval+inc);
}
static clearscope void AchievementProgressIncDouble( Name pvar, double inc, PlayerInfo p = null )
{
if ( !p || (p != players[consoleplayer]) ) return;
let cv = CVar.FindCVar(pvar);
if ( !cv ) return;
double cval = cv.GetFloat();
cv.SetFloat(cval+inc);
}
static clearscope void AchievementProgressOr( Name pvar, int val, PlayerInfo p = null )
{
if ( !p || (p != players[consoleplayer]) ) return;
let cv = CVar.FindCVar(pvar);
if ( !cv ) return;
int cval = cv.GetInt();
cv.SetInt(cval|val);
}
// full reset of inventory (excluding collectibles, and optionally resetting the score)
static play void WipeInventory( Actor mo, bool resetscore = false, bool allplayers = false )
{