diff --git a/assets/Discord-Symbol-White.png b/assets/Discord-Symbol-White.png new file mode 100644 index 00000000..c406d4ec Binary files /dev/null and b/assets/Discord-Symbol-White.png differ diff --git a/assets/GitHub_Invertocat_White.png b/assets/GitHub_Invertocat_White.png new file mode 100644 index 00000000..5b096a1d Binary files /dev/null and b/assets/GitHub_Invertocat_White.png differ diff --git a/assets/achievements/achv_icons.png b/assets/achievements/achv_icons.png index 5ebacbcd..6824bf63 100644 Binary files a/assets/achievements/achv_icons.png and b/assets/achievements/achv_icons.png differ diff --git a/assets/achievements/biggest_fan.png b/assets/achievements/biggest_fan.png deleted file mode 100644 index 839ec003..00000000 Binary files a/assets/achievements/biggest_fan.png and /dev/null differ diff --git a/assets/achievements/perfectlybalanced.png b/assets/achievements/perfectlybalanced.png deleted file mode 100644 index 2f13b532..00000000 Binary files a/assets/achievements/perfectlybalanced.png and /dev/null differ diff --git a/assets/achievements/programmingsmithy.png b/assets/achievements/programmingsmithy.png deleted file mode 100644 index 39ab078b..00000000 Binary files a/assets/achievements/programmingsmithy.png and /dev/null differ diff --git a/assets/achievements/toofast.png b/assets/achievements/toofast.png deleted file mode 100644 index 9746709e..00000000 Binary files a/assets/achievements/toofast.png and /dev/null differ diff --git a/assets/achievements/toolong.png b/assets/achievements/toolong.png deleted file mode 100644 index f7286018..00000000 Binary files a/assets/achievements/toolong.png and /dev/null differ diff --git a/assets/badges/cardiac_arrest.png b/assets/badges/cardiac_arrest.png new file mode 100644 index 00000000..5157a5ca Binary files /dev/null and b/assets/badges/cardiac_arrest.png differ diff --git a/assets/symbols.otf b/assets/symbols.otf new file mode 100644 index 00000000..4e03feb9 Binary files /dev/null and b/assets/symbols.otf differ diff --git a/module/achv_data.lua b/data/achievement.lua similarity index 98% rename from module/achv_data.lua rename to data/achievement.lua index abaa8b5a..e8ff5484 100644 --- a/module/achv_data.lua +++ b/data/achievement.lua @@ -56,7 +56,7 @@ end ---@field hide fun():boolean? ---@type Map -Achievements = { +local d = { { title = "General" }, { -- contender id = 'contender', @@ -693,6 +693,16 @@ Achievements = { scoreSimp = function(revive) return revive .. " Revives" end, rank = numberRank(0, 3, 5, 8, 10, 12, 15), }, + { -- the_responsible_one_plus + ex = true, + id = 'the_responsible_one_plus', + name = "The Responsible One+", + desc = [[Highest amount of revivals performed, multiplied by MP]], + quote = [["Is this going to be a recurring theme?"]], + credit = "@FCSplayz", + scoreSimp = function(rank) return floor(rank) .. " ReviveĀ·MP" end, + rank = numberRank(0, 16, 26, 36, 49, 64, 81), + }, { -- the_unreliable_one ex = true, id = 'the_unreliable_one', @@ -703,16 +713,6 @@ Achievements = { rank = numberRank(0, 2, 3, 4, 5, 6, 8), hide = function() return GAME.completion.DP == 0 end, }, - { -- the_responsible_one_plus - ex = true, - id = 'the_responsible_one_plus', - name = "The Responsible One+", - desc = [[Highest amount of revivals performed, multiplied by MP]], - quote = [["Is this going to be a recurring theme?"]], - credit = "@FCSplayz", - scoreSimp = function(rank) return floor(rank) .. " Points" end, - rank = numberRank(0, 16, 26, 36, 49, 64, 81), - }, { -- guardian_angel id = 'guardian_angel', name = "Guardian Angel", @@ -730,14 +730,33 @@ Achievements = { credit = "@obsidian", rank = floorRank(1, 3, 5, 7, 9, 10, 2000), }, - { -- level_19_cap + { -- overprotection ex = true, - id = 'level_19_cap', - name = "Level 19 Cap", - desc = [[HAR before first fatigue effect, with NH]], - quote = [[Another test of sustained speed and efficiency.]], - credit = "@Ponies", - rank = floorRank(1, 9, 10, 2000, 2400, 2600, 3500), + id = 'overprotection', + name = "Overprotection", + desc = [[HFD while keeping both players' HP above 10/15, with rDP]], + quote = [["Are you hurt? Did I hurt you?"]], + credit = "@obsidian", + rank = floorRank(1, 3, 5, 6, 7, 8, 9), + hide = function() return GAME.completion.DP == 0 end, + }, + { -- a_mutual_agreement + ex = true, + id = 'a_mutual_agreement', + name = "A Mutual Agreement", + desc = [[HFD with DH AS DP with every commit sharing at least 1 mod with the previous one]], + quote = [[Signed in writing, binding hearts and hands alike.]], + credit = "@FCSplayz", + rank = floorRank(1, 3, 5, 7, 9, 10, 2200), + }, + { -- the_cheaters + ex = true, + id = 'the_cheaters', + name = "The Cheaters", + desc = [[HFD with VL AS DP with commit not sharing any mod with the previous one]], + quote = [[Hearts broken from whom you stay with, to bond with another.]], + credit = "@Patrickmlg", + rank = floorRank(1, 3, 5, 6, 7, 8, 10), }, { -- the_escape_artist id = 'the_escape_artist', @@ -757,15 +776,14 @@ Achievements = { rank = numberRank(0, 50, 100, 150, 200, 260, 420), hide = function() return GAME.completion.AS == 0 end, }, - { -- fel_magic + { -- level_19_cap ex = true, - id = 'fel_magic', - name = "Fel Magic", - desc = [[Quests passed with wounds triggered during GIGASPEED, with rAS]], - quote = [["And what, Gul'dan, must we give it return?"]], - scoreSimp = function(quest) return floor(quest) .. " Quests" end, - rank = numberRank(0, 6, 15, 26, 42, 62, 80), - hide = function() return GAME.completion.AS == 0 or STAT.totalGiga == 0 end, + id = 'level_19_cap', + name = "Level 19 Cap", + desc = [[HAR before first fatigue effect, with NH]], + quote = [[Another test of sustained speed and efficiency.]], + credit = "@Ponies", + rank = floorRank(1, 9, 10, 2000, 2400, 2600, 3500), }, { -- empurple ex = true, @@ -777,14 +795,27 @@ Achievements = { rank = floorRank(1, 3, 5, 7, 9, 10, 1800), hide = function() return GAME.completion.IN == 0 end, }, - { -- patience_is_a_virtue + { -- the_masterful_juggler ex = true, - id = 'patience_is_a_virtue', - name = "Patience is a Virtue", - desc = [[HFD without manually committing]], - quote = [[Opportunities always favor those who are prepared and wait.]], - credit = "@The_111thBlitzer", - rank = floorRank(1, 3, 5, 7, 9, 10, 2000), + id = 'the_masterful_juggler', + name = "The Masterful Juggler", + desc = [[Highest Back-to-Back chain reached, with rMS rGV rIN]], + quote = [[A perfect jester, putting memory, speed and technique into entertainment...]], + credit = "@FMichael", + scoreSimp = function(b2b) return "B2B x" .. b2b end, + rank = numberRank(0, 10, 18, 26, 42, 62, 94), + hide = function() return GAME.completion.MS == 0 or GAME.completion.GV == 0 or GAME.completion.IN == 0 end, + }, + { -- clutch_main + ex = true, + id = 'clutch_main', + name = "Clutch Main", + desc = [[Quests passed while HP is critical, with NH rGV]], + quote = [[Your horses had better be held onto!]], + credit = "@GameTilDead", + scoreSimp = function(quest) return floor(quest) .. " Quests" end, + rank = numberRank(0, 26, 42, 62, 94, 126, 162), + hide = function() return GAME.completion.GV == 0 end, }, { -- spotless ex = true, @@ -796,44 +827,16 @@ Achievements = { rank = floorRank(1, 3, 5, 7, 8, 9, 10), hide = function() return GAME.completion.GV == 0 end, }, - { -- a_mutual_agreement - ex = true, - id = 'a_mutual_agreement', - name = "A Mutual Agreement", - desc = [[HFD with DH AS DP with every commit sharing at least 1 mod with the previous one]], - quote = [[Signed in writing, binding hearts and hands alike.]], - credit = "@FCSplayz", - rank = floorRank(1, 3, 5, 7, 9, 10, 2200), - }, - { -- the_cheaters - ex = true, - id = 'the_cheaters', - name = "The Cheaters", - desc = [[HFD with VL AS DP with commit not sharing any mod with the previous one]], - quote = [[Hearts broken from whom you stay with, to bond with another.]], - credit = "@Patrickmlg", - rank = floorRank(1, 3, 5, 6, 7, 8, 10), - }, - { -- overprotection + { -- autoplay_is_awesome ex = true, - id = 'overprotection', - name = "Overprotection", - desc = [[HFD while keeping both players' HP above 10/15, with rDP]], - quote = [["Are you hurt? Did I hurt you?"]], + id = 'autoplay_is_awesome', + name = "Autoplay is Awesome", + desc = [[HFD without manually committing, with rNH MS rGV AS]], + quote = [["All the words, of a melody of rain. Resonating within ripples, Dreams of human remain."]], credit = "@obsidian", - rank = floorRank(1, 3, 5, 6, 7, 8, 9), - hide = function() return GAME.completion.DP == 0 end, - }, - { -- clutch_main - ex = true, - id = 'clutch_main', - name = "Clutch Main", - desc = [[Quests passed while HP is critical, with NH rGV]], - quote = [[Your horses had better be held onto!]], - credit = "@GameTilDead", - scoreSimp = function(quest) return floor(quest) .. " Quests" end, - rank = numberRank(0, 26, 42, 62, 94, 126, 162), - hide = function() return GAME.completion.GV == 0 end, + rank = floorRank(1, 3, 5, 6, 7, 8, 1500), + hide = function() return GAME.completion.NH == 0 or GAME.completion.GV == 0 end, + realHide = TRUE }, { -- sunk_cost ex = true, @@ -852,17 +855,6 @@ Achievements = { credit = "@Flowerling", rank = floorRank(1, 3, 5, 7, 8, 9, 10), }, - { -- the_masterful_juggler - ex = true, - id = 'the_masterful_juggler', - name = "The Masterful Juggler", - desc = [[Highest Back-to-Back chain reached, with rMS rGV rIN]], - quote = [[A perfect jester, putting memory, speed and technique into entertainment...]], - credit = "@FMichael", - scoreSimp = function(b2b) return "B2B x" .. b2b end, - rank = numberRank(0, 10, 18, 26, 42, 62, 94), - hide = function() return GAME.completion.MS == 0 or GAME.completion.GV == 0 or GAME.completion.IN == 0 end, - }, { -- the_oblivious_artist ex = true, id = 'the_oblivious_artist', @@ -895,6 +887,17 @@ Achievements = { scoreSimp = function(kill) return kill .. " Entries" end, rank = numberRank(0, 2, 3, 3, 4, 4, 5), }, + { -- under_the_radar + ex = true, + id = 'under_the_radar', + name = "Under the Radar", + desc = [[Fastest time reaching F6 without entering GIGASPEED with VL IN AS]], + quote = [[A face, blended into the crowd of mediocrity.]], + comp = '<', + credit = "@flomikel", + scoreSimp = function(time) return string.format("%.2fs", time) end, + rank = numberRankRev(260, 180, 162, 142, 135, 126, 120), + }, { -- arrogance ex = true, id = 'arrogance', @@ -1479,6 +1482,16 @@ Achievements = { hide = TRUE, type = 'issued', }, + { title = "Easy Mode Ex-Vanilla" }, + { -- patience_is_a_virtue + ex = true, + id = 'patience_is_a_virtue', + name = "Patience is a Virtue", + desc = [[HFD without manually committing]], + quote = [[Opportunities always favor those who are prepared and wait.]], + credit = "@The_111thBlitzer", + rank = floorRank(1, 3, 5, 7, 9, 10, 2000), + }, { title = "Easy Mode (v1.0) (No CR)" }, { -- Programmer & Pro Gamer ex = true, @@ -1840,7 +1853,7 @@ Achievements = { --id = 'eDHEXeNH', id = 'emperor_development', name = "Emperor's Development", - desc = [[Highest rank achieved on 40 quests WUT "EXPERT Mode", "Moderate Hold" and "Salvation" mods]], + desc = [[Highest rank achieved on 40 quests WUT "EXPERT Mode", "Moderate Hold" and "Salvation" mods and NOT Stacker Mode]], quote = [[Look at how much progress you've made in reforming your ways!]], scoreSimp = function(rank) return string.format("Rank %.2f", rank) end, rank = numberRank(9, 10, 11, 12, 13, 13.1, 13.2), @@ -1850,7 +1863,7 @@ Achievements = { --id = 'eEXeMS', id = 'quest_feast', name = "Quest Feast", - desc = [[Lowest altitude on 40 quests WUT "Easy Mode" and "Tidiness" mods]], + desc = [[Lowest altitude on 40 quests WUT "Easy Mode" and "Tidiness" mods and NOT Stacker Mode]], quote = [[The delicate aromas of an all-you-can-eat buffet linger in the air.]], comp = '<', scoreSimp = function(roundHeight) return string.format("%.2fm", roundHeight) end, @@ -2192,6 +2205,15 @@ Achievements = { credit = "@TrevorSmithy", type = 'issued', }, + { -- gigaplonk + id = 'gigaplonk', + name = "Gigaplonk", + desc = [[Finish a run with GIGASPEED but less than 2.6 quests completed]], + quote = [["Normally this wouldn't count, but you did get GIGASPEED..."]], + credit = "@Taha", + type = 'issued', + hide = TRUE, + }, { -- the_windup id = 'the_windup', name = "The Wind-Up", @@ -2199,7 +2221,6 @@ Achievements = { quote = [["WHY DO I HEAR BOSS MUSIC?!?!?"]], credit = "@TrevorSmithy", type = 'issued', - hide = TRUE, }, { -- im_gonna_be id = 'im_gonna_be', @@ -2220,22 +2241,22 @@ local compFunc = { do local i = 1 repeat - local achv = Achievements[i] + local achv = d[i] if achv.title then if i % 2 == 0 then - table.insert(Achievements, i, {}) + table.insert(d, i, {}) i = i + 1 end - table.insert(Achievements, i + 1, {}) + table.insert(d, i + 1, {}) end i = i + 1 - until i > #Achievements + until i > #d end -for i = 1, #Achievements do - local achv = Achievements[i] +for i = 1, #d do + local achv = d[i] local id = achv.id if id then - Achievements[id] = achv + d[id] = achv assert(type(id) == 'string', "Missing field 'name' - " .. id) assert(type(achv.name) == 'string', "Missing field 'name' - " .. id) @@ -2278,3 +2299,5 @@ for i = 1, #Achievements do achv.hide = achv.hide or FALSE achv.realHide = achv.realHide or FALSE end + +return d diff --git a/data/badge.lua b/data/badge.lua new file mode 100644 index 00000000..044764f3 --- /dev/null +++ b/data/badge.lua @@ -0,0 +1,115 @@ +local d = { + [0] = { + prio = 1e99, + name = "---", + desc = "???", + }, + { + id = 'champion', + name = "Clicker Champion", + desc = "Attain 25k CR", + }, + { + id = 'mastery_1', + name = "Mastery", + desc = "Reached F10 with all single upright mods", + }, + { + id = 'speedrun_1', + name = "Speedrunner", + desc = "Finished a speedrun with all single upright mods", + }, + { + id = 'mastery_2', + name = "Subjugation", + desc = "Reached F10 with all single reversed mods", + }, + { + id = 'speedrun_2', + name = "Omnipotence", + desc = "Finished a speedrun with all single reversed mods", + }, + { + id = 'subluminal', + name = "Sub-luminal", + desc = "Reached F10 in under 76.2s (max CR from Best Speedrun)", + }, + { + id = 'superluminal', + name = "Superluminal", + desc = "Reached F10 in under 42s", + }, + { + id = 'fomg', + name = "Interstellar", + desc = "Reached 6200m (max CR from Best Altitude)", + }, + { + id = 'fepsilon', + name = "Intergalactic", + desc = "Reached 12600m", + }, + { + id = 'true_expert', + name = "True Expert", + desc = "Finished a speedrun with rEX & Close Card", + }, + { + id = 'true_master', + name = "True Master", + desc = "Finished a speedrun with rGV & Nightcore", + }, + { + id = 'true_strength', + name = "True Strength", + desc = "Finished a speedrun with rVL & Fast Leak", + }, + { + id = 'true_invis', + name = "True Invisible", + desc = "Finished a speedrun with rIN & Invisible Card", + }, + { + id = 'true_couple', + name = "True Couple", + desc = "Finished a speedrun with rDP & Invisible UI", + }, + { + id = 'cardiac_arrest', + name = "Cardiac Arrest", + desc = "Die with max HP less than 5", + }, + { + id = 'universal_gravitation', + name = "Universal Gravitation", + desc = "Reached F10 but finished at negative altitude", + }, + { + id = 'rDP_meta', + name = "Mechanical Heartbreaker", + desc = "Abused the rDP mod to stay alive over 10 minutes", + }, + { + id = 'sc_cap', + name = "Surge Protector", + desc = "Reached the B2B cap", + }, + { + id = 'exceed_dev_half', + name = "Apprentice", + desc = "Have a better score than Dev on 26% achievements", + }, + { + id = 'exceed_dev', + name = "Successor", + desc = "Have a better score than Dev on 62% achievements", + }, +} + +for i = 1, #d do + local bd = d[i] + bd.prio = i + d[bd.id] = bd +end + +return d diff --git a/data/base.lua b/data/base.lua new file mode 100644 index 00000000..ff445bef --- /dev/null +++ b/data/base.lua @@ -0,0 +1,612 @@ +--------------------------------------------------------------------- +-- SPOILER WARNING -- +-- This file contains secrets that may spoil your game experience. -- +-- Be sure you've finished the game, including Ultra Reversed Mods -- +-- Read at your own risk. -- +--------------------------------------------------------------------- +AchvData = { + [0] = { id = 'achv_none', bg = COLOR.D, fg = COLOR.LD, fg2 = COLOR.LD }, + { id = 'achv_bronze', bg = COLOR.DO, fg = COLOR.lO, fg2 = COLOR.O }, + { id = 'achv_silver', bg = { .26, .26, .26 }, fg = COLOR.L, fg2 = COLOR.dL }, + { id = 'achv_gold', bg = COLOR.DY, fg = COLOR.lY, fg2 = COLOR.Y }, + { id = 'achv_platinum', bg = COLOR.DJ, fg = COLOR.lJ, fg2 = COLOR.J }, + { id = 'achv_diamond', bg = COLOR.DP, fg = COLOR.lP, fg2 = COLOR.lB }, + { id = 'achv_issued', bg = COLOR.DM, fg = COLOR.lM, fg2 = COLOR.lM }, +} + +GigaSpeedReq = { [0] = 7, 8, 8, 9, 9, 10, 1e99, 1e99, 1e99, 1e99, 1e99 } +TeraMusicReq = { [0] = 9, 11, 11, 12, 12, 13, 13, 1e99, 1e99, 1e99 } +PetaReq = { [0] = 11, 14, 14, 15, 15, 16, 16, 17, 1e99, 1e99 } +ExaReq = { [0] = 13, 17, 17, 18, 18, 19, 19, 20, 20, 1e99 } +ZettaReq = { [0] = 15, 20, 20, 21, 21, 22, 22, 23, 23, 24 } +YottaReq = { [0] = 17, 23, 23, 24, 24, 25, 25, 26, 26, 27 } +RonnaReq = { [0] = 19, 26, 26, 27, 27, 28, 28, 29, 29, 30 } +QuettaReq = { [0] = 21, 29, 29, 30, 30, 31, 31, 32, 32, 33 } + +GravityTimer = { + { 9.0, 8.0, 7.5, 7.0, 6.5, 6.0, 5.5, 5.0, 4.5, 4.0 }, + { 3.2, 3.0, 2.8, 2.6, 2.5, 2.4, 2.3, 2.2, 2.1, 2.0 }, + { 10.0, 9.0, 8.5, 8.0, 7.5, 7.0, 6.5, 6.0, 5.5, 5.0 }, +} + +PieceData = { + { id = 'nightcore', text = { COLOR.lR, "Z" }, piece = { COLOR.lR, CHAR.brik.Z }, popup = { COLOR.lR, "Z - Nightcore" } }, + { id = 'slowmo', text = { COLOR.lG, "S" }, piece = { COLOR.lG, CHAR.brik.S }, popup = { COLOR.lG, "S - Sloooooow-mo" } }, + { id = 'glassCard', text = { COLOR.lB, "J" }, piece = { COLOR.lB, CHAR.brik.J }, popup = { COLOR.lB, "J - Glass Card" } }, + { id = 'fastLeak', text = { COLOR.lO, "L" }, piece = { COLOR.lO, CHAR.brik.L }, popup = { COLOR.lO, "L - Fast Leak" } }, + { id = 'invisUI', text = { COLOR.lM, "T" }, piece = { COLOR.lM, CHAR.brik.T }, popup = { COLOR.lM, "T - Invisible UI" } }, + { id = 'invisCard', text = { COLOR.lY, "O" }, piece = { COLOR.lY, CHAR.brik.O }, popup = { COLOR.lY, "O - Invisible Card" } }, + { id = 'closeCard', text = { COLOR.lC, "I" }, piece = { COLOR.lC, CHAR.brik.I }, popup = { COLOR.lC, "I - Close Card" } }, + -- Trevor Smithy + { id = 'enightcore', text = { COLOR.lR, "eZ", }, piece = { COLOR.lR, CHAR.brik.C }, popup = { COLOR.lR, "eZ - Nightcore+" } }, + { id = 'eslowmo', text = { COLOR.lG, "eS", }, piece = { COLOR.lG, CHAR.brik.C }, popup = { COLOR.lG, "eS - Slow-mo+" } }, + { id = 'eglassCard', text = { COLOR.lB, "eJ", }, piece = { COLOR.lB, CHAR.brik.C }, popup = { COLOR.lB, "eJ - Glass Card+" } }, + { id = 'efastLeak', text = { COLOR.lO, "eL", }, piece = { COLOR.lO, CHAR.brik.C }, popup = { COLOR.lO, "eL - Slow Leak" } }, + { id = 'einvisUI', text = { COLOR.lM, "eT", }, piece = { COLOR.lM, CHAR.brik.C }, popup = { COLOR.lM, "eT - Transparent UI" } }, + { id = 'einvisCard', text = { COLOR.lY, "eO", }, piece = { COLOR.lY, CHAR.brik.C }, popup = { COLOR.lY, "eO - Transparent Card" } }, + { id = 'ecloseCard', text = { COLOR.lC, "eI", }, piece = { COLOR.lC, CHAR.brik.I3 }, popup = { COLOR.lC, "eI - Closer Card" } }, + -- + { id = 'allclear', text = { COLOR.LL, "-", }, piece = { COLOR.LL, CHAR.brik.O1 }, popup = { COLOR.LL, "All Clear" } }, +} + +RevSwampName = { + "Z", "S", "J", "L", "T", "O", "I", + [["BLIGHT"]], + [["DESOLATION"]], + [["HAVOC"]], + [["PANDEMONIUM"]], + [["INFERNO"]], + [["PURGATORY"]], + [["PERDITION"]], + [["CATACLYSM"]], + [["ANNIHILATION"]], + [["ARMAGEDDON"]], + [["ABYSS"]], + [["APOCALYPSE"]], -- not used +} + +Floors = { + [0] = { top = 0, name = "The Basement" }, + { top = 50, event = {}, name = "Hall of Beginnings" }, + { top = 150, event = { 'dmgDelay', -2, 'dmgWrong', 1 }, name = "The Hotel", MSshuffle = 1 }, + { top = 300, event = { 'dmgDelay', -2, 'dmgCycle', -.5 }, name = "The Casino" }, + { top = 450, event = { 'dmgDelay', -1, 'dmgCycle', -.5 }, name = "The Arena" }, + { top = 650, event = { 'dmgDelay', -1, 'dmgCycle', -.5, 'dmgWrong', 1 }, name = "The Museum", MSshuffle = 2 }, + { top = 850, event = { 'dmgDelay', -1, 'dmgTime', 1, 'maxQuestSize', 1 }, name = "Abandoned Offices" }, + { top = 1100, event = { 'dmgDelay', -1, 'dmgCycle', -.5 }, name = "The Laboratory", MSshuffle = 3 }, + { top = 1350, event = { 'dmgDelay', -1, 'dmgCycle', -.5 }, name = "The Core" }, + { top = 1650, event = { 'dmgDelay', -.5, 'dmgWrong', 1 }, name = "Corruption", MSshuffle = 4 }, + { top = 1e99, event = { 'dmgDelay', -.5, 'dmgCycle', -.5, 'dmgTime', 1 }, name = "Platform of the Gods" }, + { top = 1e99, name = "Stellar Nebula Frontier" }, -- Only name is used + -- Initial: Delay=15. Cycle=5, Wrong=1 + -- Total: Delay-10, Cycle-3, Wrong+4 +} + +NegFloors = { + [0] = { bottom = -1e99 }, + { bottom = -50, name = "The Basement" }, + { bottom = -150, name = "Zenith Restaurant" }, + { bottom = -300, name = "Underground Parking" }, + { bottom = -450, name = "The Bunker" }, + { bottom = -650, name = "The Infirmary" }, + { bottom = -850, name = "Decayed Catacombs" }, + { bottom = -1100, name = "Sacreligious Ruins" }, + { bottom = -1350, name = "Singularity Reactor" }, + { bottom = -1650, name = "Distorted Gateways" }, + { bottom = -1e99, name = "Endless Void" }, +} +NegTexts = { + b1 = { -- The Basement + desc = "A basic storage room for the floors above... and below.", + begin = [[You find yourself in an unfamiliar place.]], + noAS = [[You passed the security check without any prohibited items.]], + ASoff = [[To prevent mech heart users from entering, the AS mod has been confiscated.]], + -- egg = [[Garbo checks the imprisoned mech heart users here from time to time, except rtxtile, who kept escaping somehow?]], + }, + b2 = { -- Zenith Restaurant + desc = "A lively restaurant with a lovely atmosphere.\nThough the prices here are slightly outrageous...", + begin = [[The smell of food calms your senses...]], + effStart = [[Illusions dance before your eyes...]], + noVL = [[You feel yourself getting weaker...]], + VLoff = [[You feel your strength fading...]], + noIN = [[The illusion before your eyes hasn't entirely faded...]], + INoff = [[Your mind is becoming clearer...]], + }, + b3 = { -- Underground Parking + desc = "A boundless parking lot for all of these visitors.", + begin = [[The vast lot's tranquility reassures you.]], + effStart = [[But a realization dawned - you were lost.]], + mid1 = [["Where am I?"]], + noGV = [[You feel like you're not going fast enough...]], + GVoff = [[You subconsciously quickened your pace...]], + mid2 = [["Where am I going?"]], + }, + b4 = { -- The Bunker + desc = "A regular bunker...\nafter witnessing the Corruption, you definitely know why it was built.", + begin = [[You feel safe away from the above.]], + effStart = [[The barren bunker begins to feel ghostly.]], + noMS = [[It seems that luck was against you...]], + MSoff = [[You organized your thoughts...]], + }, + b5 = { -- The Infirmary + desc = "The medical sector of the tower, filled with incomprehensible technology.\nThey look similar to the ones in the Laboratory...", + begin = [[Endless beeping echoes through the halls you roam.]], + effStart = [[One horrifying scene after another floods your vision.]], + noDH = [[A sinister thought crosses your mind...]], + DHoff = [[You shuddered while walking in this terrifying place.]], + }, + b6 = { -- Decayed Catacombs + desc = "A complex of the dead,\nnow decaying into an even more unsettling shell of itself.", + begin = [[The feeling of safety slipped away.]], + effStart = [[Your attention strays...]], + mid = [[You begin to hear something calling your name...]], + noNH = [[You cannot ignore the voice...]], + NHoff = [[You overcome your fear.]], + }, + b7 = { -- Sacreligious Ruins + desc = "The remains of a previously sacred chapel, the spirits of those,\nwho worshipped the gods above linger on...", + desc2 = [[Whispers of a missing artifact echo throughout the area...]], + begin = [[You pray that nothing dire becomes of you.]], + effStart = [[Spacetime ahead is heavily warped...]], + mid = [[You know you have to go as fast as possible.]], + }, + b8 = { -- Singularity Reactor + desc = "Fueled by the power of the cosmos and the stolen artifact, powering something...", + begin = [[You are overwhelmed by the reactor's magnitude.]], + mid1 = [[Dizzy spells.]], + mid2 = [[Blurred vision.]], + mid3 = [[Head throbbing.]], + -- mid = [[The mysterious voice is growing ever nearer...]], + }, + b9 = { -- Distorted Gateways + desc = "A hall of millions of gateways to different realities, towers and wastelands...\nThe mere thought of something like this is sickening...", + desc2 = [[The entrance to a false promise of paradise.]], + desc3 = [[You reach the bottom... or it seemed to be at first glance... one last gateway was left...]], + begin = [[The endless void beckons you...]], + mid = [[RUN.]], + -- begin = [[You feel nostalgia at the sight of a familiar tower.]], + }, + b10 = { -- Endless Void + desc = "A realm of absolutely nothing, none have ever returned.", + desc2 = [[You look back above... yet you've already gone too far in this insane abyss for you to see anything.]], + -- begin = [[...and you pass the point of no return.]], + -- mid1 = [[Everything begins to go quiet.]], + end1 = [[...this is it?]], + end2 = [[This is what's down below all of this?]], + end3 = [[It's so empty... and vast...]], + end4 = [[Yet it feels nostalgic somehow...]], + end5 = [[And peaceful.]], + }, +} +NegEvents = { + -- B1: The Basement + { h = -10 }, { text = 'b1.begin' }, + { h = -26 }, + { text = 'b1.noAS', color = 'lB', cond = function() return GAME.mod.AS == 0 end }, + { + text = 'b1.ASoff', + color = 'lO', + cond = function() return GAME.mod.AS > 0 end, + event = function() + GAME.attackMul = GAME.attackMul - .1 + GAME.dmgTimerMul = GAME.dmgTimerMul + .01 + GAME.mod.AS = 0 + GAME.refreshModIcon() + GAME.refreshRPC() + end, + }, + + -- B2: Zenith Restaurant + { h = -50 }, { event = { 'dmgDelay', -2 } }, + { event = { 'attackMul', -.1, 'timerMul', -.25 } }, + { h = -55 }, { text = 'b2.begin' }, + { h = -60 }, + { + text = 'b2.effStart', + event = function() + GAME.nightcore = true + GAME.refreshPieceFstr() + RefreshBGM() + end + }, + { h = -90 }, + { text = 'b2.noVL', color = 'lB', cond = function() return GAME.mod.VL == 0 end }, + { + text = 'b2.VLoff', + color = 'lO', + cond = function() return GAME.mod.VL > 0 end, + event = function() + GAME.attackMul = GAME.attackMul - .1 + GAME.dmgTimerMul = GAME.dmgTimerMul + .01 + GAME.mod.VL = 0 + GAME.refreshModIcon() + GAME.refreshRPC() + end, + }, + { h = -120 }, + { text = 'b2.noIN', color = 'lB', cond = function() return GAME.mod.IN == 0 end }, + { + text = 'b2.INoff', + color = 'lO', + cond = function() return GAME.mod.IN > 0 end, + event = function() + GAME.dmgCycle = GAME.dmgCycle + GAME.mod.IN * 1 + GAME.attackMul = GAME.attackMul - .1 + GAME.dmgTimerMul = GAME.dmgTimerMul + .01 + GAME.mod.IN = 0 + RefreshBGM() + for _, C in ipairs(Cards) do C:flip() end + GAME.refreshModIcon() + GAME.refreshRPC() + end, + }, + { h = -150 }, + { + event = function() + GAME.nightcore = false + GAME.refreshPieceFstr() + RefreshBGM() + end + }, + + + -- B3: Underground Parking + { h = -150 }, { event = { 'dmgDelay', -2, 'dmgCycle', -.5 } }, + { event = { 'attackMul', -.1, 'timerMul', -.15 } }, + { h = -155 }, { text = 'b3.begin' }, + { h = -160 }, { text = 'b3.effStart' }, + { h = -165 }, + { + event = function() + GAME.invisUI = true + GAME.refreshPieceFstr() + end + }, + { h = -170 }, + { + event = function() + GAME.invisUI = false + GAME.refreshPieceFstr() + end + }, + { h = -175 }, + { + event = function() + GAME.invisUI = true + GAME.refreshPieceFstr() + end + }, + { h = -180 }, { text = 'b3.mid1' }, + { h = -185 }, + { + event = function() + GAME.invisUI = false + GAME.refreshPieceFstr() + end + }, + { h = -195 }, + { + event = function() + GAME.invisUI = true + GAME.refreshPieceFstr() + end + }, + { h = -200 }, + { text = 'b3.noGV', color = 'lB', cond = function() return GAME.mod.GV == 0 end }, + { + text = 'b3.GVoff', + color = 'lO', + cond = function() return GAME.mod.GV > 0 end, + event = function() + GAME.dmgDelay = GAME.dmgDelay + GAME.mod.GV * 4 + GAME.attackMul = GAME.attackMul - .1 + GAME.dmgTimerMul = GAME.dmgTimerMul + .01 + GAME.mod.GV = 0 + GAME.refreshModIcon() + GAME.refreshRPC() + RefreshBGM() + end, + }, + { h = -200 }, + { + event = function() + GAME.invisUI = false + GAME.refreshPieceFstr() + end + }, + { h = -210 }, + { + event = function() + GAME.invisUI = true + GAME.refreshPieceFstr() + end + }, + { h = -220 }, { text = 'b3.mid2' }, + { h = -250 }, + { + event = function() + GAME.invisUI = false + GAME.refreshPieceFstr() + end + }, + { h = -260 }, + { + event = function() + GAME.invisUI = true + GAME.refreshPieceFstr() + end + }, + { h = -280 }, + { + event = function() + GAME.invisUI = false + GAME.refreshPieceFstr() + end + }, + + -- B4: The Bunker + { h = -300 }, { event = { 'dmgDelay', -1, 'dmgCycle', -.5 } }, + { event = { 'attackMul', -.1, 'timerMul', -.1 } }, + { h = -310 }, + { text = 'b4.begin' }, + { event = function() GAME.dmgWrong = math.min(GAME.dmgWrong, 2) end }, + { h = -320 }, + { + text = 'b4.effStart', + event = function() + GAME.glassCard = true + GAME.refreshPieceFstr() + end + }, + { h = -380 }, + { text = 'b4.noMS', color = 'lB', cond = function() return GAME.mod.MS == 0 end }, + { + text = 'b4.MSoff', + color = 'lO', + cond = function() return GAME.mod.MS > 0 end, + event = function() + GAME.extraQuestBase = GAME.extraQuestBase - GAME.mod.MS * .2 + GAME.attackMul = GAME.attackMul - .1 + GAME.dmgTimerMul = GAME.dmgTimerMul + .01 + GAME.mod.MS = 0 + GAME.sortCards() + GAME.refreshModIcon() + GAME.refreshRPC() + end, + }, + { h = -450 }, + { + event = function() + GAME.glassCard = false + GAME.refreshPieceFstr() + end + }, + + -- B5: The Infirmary + { h = -450 }, { event = { 'dmgDelay', -1, 'dmgCycle', -.5 } }, + { event = { 'attackMul', -.1 } }, + { event = function() GAME.dmgWrong = math.min(GAME.dmgWrong, 2) end }, + { h = -460 }, { text = 'b5.begin' }, + { h = -470 }, { text = 'b5.effStart' }, + { + event = function() + GAME.slowmo = true + GAME.refreshPieceFstr() + RefreshBGM() + end + }, + { h = -550 }, + { text = 'b5.noDH', color = 'lB', cond = function() return GAME.mod.DH == 0 end }, + { + text = 'b5.DHoff', + color = 'lO', + cond = function() return GAME.mod.DH > 0 end, + event = function() + GAME.extraQuestVar = GAME.extraQuestVar - GAME.mod.DH * .2 + GAME.attackMul = GAME.attackMul - .1 + GAME.dmgTimerMul = GAME.dmgTimerMul + .01 + GAME.mod.DH = 0 + GAME.refreshModIcon() + GAME.refreshRPC() + end, + }, + { h = -650 }, + { + event = function() + GAME.slowmo = false + GAME.refreshPieceFstr() + RefreshBGM() + end + }, + + -- B6: Decayed Catacombs + { h = -650 }, { event = { 'dmgDelay', -1, 'dmgTime', 1, 'maxQuestSize', 1 } }, + { event = { 'attackMul', -.1 } }, + { event = function() GAME.dmgWrong = math.min(GAME.dmgWrong, 2) end }, + { h = -660 }, { text = 'b6.begin' }, + { h = -670 }, + { + text = 'b6.effStart', + event = function() + GAME.invisCard = true + GAME.refreshPieceFstr() + end + }, + { h = -720 }, + { text = 'b6.noNH', color = 'lB', cond = function() return GAME.mod.NH == 0 end }, + { + text = 'b6.NHoff', + color = 'lO', + cond = function() return GAME.mod.NH > 0 end, + event = function() + GAME.dmgHeal = GAME.dmgHeal + GAME.mod.NH * 3 + GAME.attackMul = GAME.attackMul - .1 + GAME.dmgTimerMul = GAME.dmgTimerMul + .01 + GAME.mod.NH = 0 + GAME.maxQuestCount = 3 + GAME.xpLockLevelMax = 5 + GAME.refreshModIcon() + GAME.refreshRPC() + end, + }, + { h = -850 }, + { + event = function() + GAME.invisCard = false + GAME.refreshPieceFstr() + end + }, + + -- B7: Sacreligious Ruins + { h = -850 }, { event = { 'dmgDelay', -1, 'dmgCycle', -.5 } }, + { event = { 'attackMul', -.1 } }, + { event = function() GAME.dmgWrong = math.min(GAME.dmgWrong, 2) end }, + { h = -860 }, { text = 'b7.begin' }, + { h = -900 }, { text = 'b7.effStart' }, + { h = -950 }, { text = 'b7.mid' }, + + -- B8: Singularity Reactor + { h = -1100 }, { event = { 'dmgDelay', -1, 'dmgCycle', -.5 } }, + { event = function() GAME.dmgWrong = math.min(GAME.dmgWrong, 2) end }, + { h = -1115 }, { text = 'b8.begin' }, + { h = -1145 }, { text = 'b8.mid1', color = 'R', size = 1.26, sfx = 'b2bcharge_distance_3', duration = 1.26 }, + { h = -1160 }, { text = 'b8.mid2', color = 'R', size = 1.26, sfx = 'b2bcharge_distance_3', duration = 1.26 }, + { h = -1175 }, { text = 'b8.mid3', color = 'R', size = 1.26, sfx = 'b2bcharge_distance_3', duration = 1.26 }, + { h = -1182 }, { sfx = 'b2bcharge_distance_2' }, + { h = -1185 }, { sfx = 'b2bcharge_distance_2' }, + { h = -1188 }, { sfx = 'b2bcharge_distance_2' }, + { h = -1191 }, { sfx = 'b2bcharge_distance_1' }, + { h = -1194 }, { sfx = 'b2bcharge_distance_1' }, + { h = -1197 }, { sfx = 'b2bcharge_distance_1' }, + { h = -1200 }, + { + event = function() + GAME.nightcore = true + GAME.refreshPieceFstr() + RefreshBGM() + end + }, + + { h = -1350 }, + { + event = function() + GAME.nightcore = false + GAME.refreshPieceFstr() + RefreshBGM() + end + }, + + + -- B9: Distorted Gateways + { h = -1350 }, { event = { 'dmgDelay', -.5 } }, + { h = -1360 }, { text = 'b9.begin' }, + { event = function() GAME.rankLimit = math.min(GAME.rankLimit, 10) end }, + { + text = 'b9.mid', + color = 'lR', + size = 2.6, + duration = 16, + event = function() + GAME.time = math.max(GAME.time, 419) + end + }, + + -- B10: Endless Void + { h = -1650 }, + { + event = function() + GAME.invincible = true + GAME.timerMul = 0 + GAME.lifeLeak = 0 + GAME.dmgWrong = 1 + GAME.invisCard = true + GAME.refreshPieceFstr() + GAME.dmgTimerMul = 1e99 + GAME.height = -1650 + GAME.heightBonus = 0 + GAME.attackMul = -1 + GAME.chain = 0 + GAME.maxQuestCount = 1 + if GAME.rank > 8 then + GAME.rank = 8 + GAME.xp = 32 + end + GAME.xpLockLevelMax = 2600 + GAME.xpLockTimer = 2600 + GAME.xpLockLevel = 2600 + GAME.rankLimit = 8 + TEXTS.rank:set("R-" .. GAME.rank) + + GAME.mod.EX = 0 + GAME.refreshModIcon() + GAME.refreshRPC() + GAME.mod.EX = 2 + end, + }, + { h = -1660 }, { text = 'b10.end1', color = 'L', duration = 6.26, sfx = 'piece_change', event = function() BGM.setVol(STAT.bgm / 100 * .85) end }, + { h = -1690 }, { text = 'b10.end2', color = 'L', duration = 6.26, sfx = 'piece_change', event = function() BGM.setVol(STAT.bgm / 100 * .7) end }, + { h = -1720 }, { text = 'b10.end3', color = 'L', duration = 6.26, sfx = 'piece_change', event = function() BGM.setVol(STAT.bgm / 100 * .5) end }, + { h = -1750 }, { text = 'b10.end4', color = 'L', duration = 6.26, sfx = 'piece_change', event = function() BGM.setVol(STAT.bgm / 100 * .3) end }, + { h = -1780 }, { text = 'b10.end5', color = 'L', duration = 6.26, sfx = 'piece_change', event = function() BGM.setVol(STAT.bgm / 100 * 0) end }, + { h = -1800 }, + { + event = function() + GAME.heightBonus = 0 + GAME.height = -1800 + FloatOnCard = nil + GAME.refreshLayout() + STAT.clicker = true + SFX.play('warp') + SCN.go('ending', "warp") + end + }, + { h = -1e99 }, +} +local lastH = -0 +for _, e in next, NegEvents do + e.cond = e.cond or TRUE + e.text = e.text and TABLE.pathIndex(NegTexts, e.text) or e.text + e.text2 = e.text2 and TABLE.pathIndex(NegTexts, e.text2) or e.text2 + if e.h then + assert(e.h <= lastH) + lastH = e.h + else + e.h = lastH + end +end + +ModData = require 'data/mod' +ComboData = require 'data/combo' +Fatigue = require 'data/fatigue' +RevivePrompts = require 'data/revive' +Achievements = require 'data/achievement' +BadgeData = require 'data/badge' +DevScore = require 'data/devscore' +DevCommentary = require 'data/devcommentary' +DevCommentaryLink = require 'data/devCommentaryLink' + +MetricSpeedName = { + [["PETA"]], + [["EXA"]], + [["ZETTA"]], + [["YOTTA"]], + [["RONNA"]], + [["QUETTA"]], +} + +LifeLeakMessages = { + {time = 30, text = "YOU FEEL THE IMPENDING DOOM", desc = "30 Seconds Remain", duration = 12}, + {time = 15, text = "DIE!", desc = "15 Seconds Remain", duration = 4}, + {time = 10, text = "DIE!", desc = "10 Seconds Remain", duration = 0.5}, + {time = 9, text = "DIE!", desc = "9 Seconds Remain", duration = 0.5}, + {time = 8, text = "DIE!", desc = "8 Seconds Remain", duration = 0.5}, + {time = 7, text = "DIE!", desc = "7 Seconds Remain", duration = 0.5}, + {time = 6, text = "DIE!", desc = "6 Seconds Remain", duration = 0.5}, + {time = 5, text = "DIE!", desc = "5 Seconds Remain", duration = 0.5}, + {time = 4, text = "DIE!", desc = "4 Seconds Remain", duration = 0.5}, + {time = 3, text = "DIE!", desc = "3 Seconds Remain", duration = 0.5}, + {time = 2, text = "DIE!", desc = "2 Seconds Remain", duration = 0.5}, + {time = 1, text = "DIE!", desc = "1 Seconds Remain", duration = 0.5}, + {time = 0.1, text = "MWAHAHAHA!", desc = "CEASE!", duration = 26, color = 'lR'}, + {time = -1}, +} diff --git a/module/bgm_data.lua b/data/bgm.lua similarity index 100% rename from module/bgm_data.lua rename to data/bgm.lua diff --git a/data/combo.lua b/data/combo.lua new file mode 100644 index 00000000..8365ce5b --- /dev/null +++ b/data/combo.lua @@ -0,0 +1,1092 @@ +local d = {} + +d.menu = { + { set = "NH GV", name = "A Modern Classic" }, + { set = "NH MS DH", name = "Deadlock" }, + { set = "MS DH AS", name = "The Escape Artist" }, + { set = "GV IN", name = "The Grandmaster" }, + { set = "EX NH DH", name = "Emperor's Decadence" }, + { set = "EX MS VL DH", name = "Divine Mastery" }, + { set = "NH AS", name = "The Starving Artist" }, + { set = "EX VL AS", name = "The Con Artist" }, + { set = "EX DP", name = "Trained Professionals" }, + { set = "EX MS", name = "Block Rationing" }, + + { set = "rMS AS", name = "Naga Eyes" }, + { set = "rGV rIN", name = "The Grandmaster+" }, + { set = "EX NH rAS", name = "Magic School" }, + { set = "rNH rDH IN rAS", name = "The Spellcaster" }, + { set = "EX rGV DH", name = "Demonic Speed" }, + { set = "EX NH rMS GV", name = "Bnuuy" }, + { set = "rNH rMS GV AS DP", name = "Grand-Master! Rounds" }, + { set = "rEX rVL DH", name = "Sweat and Ruin" }, + { set = "rMS GV AS rDP", name = "Cupid's Gamble" }, + { set = "NH rGV VL rDP", name = "Despairful Longing" }, + { set = "rEX VL rIN", name = "Authoritarian Delusion" }, + { set = "rEX rDP", name = "Tyrannical Dyarchy" }, + { set = "rEX MS rDH IN", name = "Sisyphean Monarchy" }, + { set = "MS rDH rIN AS", name = "Kitsune Trickery" }, + { set = "EX NH MS VL DH rAS", name = "The Artist Trinity" }, + { set = "VL DH rIN", name = "Empurple" }, + { set = "rMS rGV rIN", name = "The Masterful Juggler" }, + { set = "rNH MS rGV AS", name = "Autoplay is Awesome" }, + { set = "DH AS DP", name = "A Mutual Agreement" }, + { set = "VL AS DP", name = "The Cheaters" }, + { set = "NH rGV", name = "Clutch Main" }, + { set = "EX VL", name = "Wax Wings" }, + { set = "DH rIN AS", name = "The Oblivious Artist" }, + { set = "NH rVL AS", name = "Zero-To-Sixty" }, + { set = "VL IN AS", name = "Under The Radar" }, + { set = "rNH MS DP", name = "Scarcity Mindset" }, + { set = "VL rGV", name = "Fickle Fuel" }, + + { set = "rEX rNH rVL", name = "Hardcore Beginning" }, + { set = "EX VL rIN rDP", name = "Love Hotel" }, + { set = "EX MS AS", name = "Financially Responsible" }, + { set = "EX rVL rDP", name = "Unfair Battle" }, + { set = "DH DP", name = "Museum Heist" }, + { set = "EX rGV VL", name = "Workaholic" }, + { set = "MS VL AS", name = "Human Experiment" }, + { set = "EX GV DH", name = "Thermal Anomaly" }, + { set = "MS GV AS", name = "Dazed" }, + + -- Trevor Smithy + -- ultras -- NOTICE: IF THESE ARE MOVED OUT OF THIS ORDER, MAKE SURE TO UPDATE generateRandomCombo() IN tower.lua to reflect this! + { set = "eEX rGV eDH eAS", name = "Patience is a Virtue" }, + { set = "rEX eNH eMS eGV eVL eDH eIN eAS", name = "Super Hard Bath Water"}, --whoops this should be peasant revolution (handled in game.lua) + --{ set = "rEX eNH eMS eGV eVL eDH eIN eAS", name = "Peasant Revolution"}, + { set = "eEX rNH eGV eDH", name = "Holy Ascension"}, + { set = "eEX rMS eIN eDP", name = "Stabilized Entropy"}, + { set = "eEX rGV eAS eDP", name = "Restrained Collapse"}, + { set = "eEX eDH eGV rVL", name = "Restored Volition"}, + { set = "eEX eMS rDH eIN", name = "Disproven Blasphemy"}, + { set = "eEX eNH rIN eAS", name = "Solved Paradox"}, + { set = "eEX eNH eVL rAS", name = "Demystified Grimoire"}, + { set = "eEX eMS eVL rDP", name = "Lasting Eden"}, + -- Bath Waters + { set = "eEX eNH eMS eGV eVL eDH eIN eAS", name = "Bath Water"}, + { set = "eNH eMS eGV eVL eDH eIN eAS", name = "Normal Bath Water"}, -- soft e, normal, hard ue, very hard + { set = "eEX eMS eGV eVL eDH eIN eAS", name = "Warm Bath Water"}, -- cool e, warm, hot + { set = "eEX eNH eGV eVL eDH eIN eAS", name = "Clean Bath Water"}, -- pure e, clean, dirty + { set = "eEX eNH eMS eVL eDH eIN eAS", name = "Jacuzzi Bath Water"}, -- jacuzzi, bubbly e, flat + { set = "eEX eNH eMS eGV eDH eIN eAS", name = "Still Bath Water"}, -- still, calm e, turbulent + { set = "eEX eNH eMS eGV eVL eIN eAS", name = "Holy Bath Water"}, -- sacred e, holy, unholy + { set = "eEX eNH eMS eGV eVL eDH eAS", name = "Cloudy Bath Water"}, -- clear e, cloudy, murky + { set = "eEX eNH eMS eGV eVL eDH eIN", name = "Plain Bath Water"}, -- plain, mystical e, magical + { set = "EX eNH eMS eGV eVL eDH eIN eAS", name = "Very Hard Bath Water"}, -- credit: TheBestNoob + { set = "eEX NH eMS eGV eVL eDH eIN eAS", name = "Hot Bath Water"}, + { set = "eEX eNH MS eGV eVL eDH eIN eAS", name = "Dirty Bath Water"}, + { set = "eEX eNH eMS GV eVL eDH eIN eAS", name = "Flat Bath Water"}, + { set = "eEX eNH eMS eGV VL eDH eIN eAS", name = "Turbulent Bath Water"}, + { set = "eEX eNH eMS eGV eVL DH eIN eAS", name = "Unholy Bath Water"}, + { set = "eEX eNH eMS eGV eVL eDH IN eAS", name = "Murky Bath Water"}, + { set = "eEX eNH eMS eGV eVL eDH eIN AS", name = "Magical Bath Water"}, + { set = "eEX eNH eMS eGV eVL eDH eIN eAS eDP", name = "Bath With A Friend"}, + { set = "eNH eMS eGV eVL eDH eIN eAS eDP", name = "Normal Bath With A Friend"}, + { set = "eEX eMS eGV eVL eDH eIN eAS eDP", name = "Warm Bath With A Friend"}, + { set = "eEX eNH eGV eVL eDH eIN eAS eDP", name = "Clean Bath With A Friend"}, + { set = "eEX eNH eMS eVL eDH eIN eAS eDP", name = "Jacuzzi Bath With A Friend"}, + { set = "eEX eNH eMS eGV eDH eIN eAS eDP", name = "Still Bath With A Friend"}, + { set = "eEX eNH eMS eGV eVL eIN eAS eDP", name = "Holy Bath With A Friend"}, + { set = "eEX eNH eMS eGV eVL eDH eAS eDP", name = "Cloudy Bath With A Friend"}, + { set = "eEX eNH eMS eGV eVL eDH eIN eDP", name = "Plain Bath With A Friend"}, + { set = "EX eNH eMS eGV eVL eDH eIN eAS eDP", name = "Very Hard Bath With A Friend"}, + { set = "rEX eNH eMS eGV eVL eDH eIN eAS eDP", name = "Super Hard Bath With A Friend"}, + { set = "eEX NH eMS eGV eVL eDH eIN eAS eDP", name = "Hot Bath With A Friend"}, + { set = "eEX eNH MS eGV eVL eDH eIN eAS eDP", name = "Dirty Bath With A Friend"}, + { set = "eEX eNH eMS GV eVL eDH eIN eAS eDP", name = "Flat Bath With A Friend"}, + { set = "eEX eNH eMS eGV VL eDH eIN eAS eDP", name = "Turbulent Bath With A Friend"}, + { set = "eEX eNH eMS eGV eVL DH eIN eAS eDP", name = "Unholy Bath With A Friend"}, + { set = "eEX eNH eMS eGV eVL eDH IN eAS eDP", name = "Murky Bath With A Friend"}, + { set = "eEX eNH eMS eGV eVL eDH eIN AS eDP", name = "Magical Bath With A Friend"}, + -- Any non-messy combination with AS and/or DP = Gamer Girl Bath Water + { set = "eEX eNH eGV eVL eDH eIN AS DP", name = "Gamer Girl Bath Water"}, + { set = "eEX eNH eGV eVL eDH eIN eAS DP", name = "Gamer Girl Bath Water"}, + { set = "eEX eNH eGV eVL eDH eIN AS eDP", name = "Gamer Girl Bath Water"}, + -- Credit: Rejuvenating rack/Mikamiyu + { set = "eEX eNH rMS eGV VL eDH eIN eAS", name = "Goth Mommy Bath Water"}, + -- Credit: FCSplayz + { set = "eEX eNH eMS eGV rVL rDH eAS rDP", name = "Shocking Bath With A Toaster"}, + -- Credit: Flowerling + { set = "rEX MS eIN", name = "Omniscence"}, + -- Credit: LovelyStar + { set = "eEX MS VL eIN", name = "Stargazing"}, + -- Credit: TheBestNoob + { set = "eEX NH MS GV VL DH IN AS", name = "Easy Swamp Water"}, + { set = "eEX NH MS GV VL DH IN AS eDP", name = "Easy Swamp Water With A Friend"}, + { set = "eEX NH MS GV VL DH IN AS DP", name = "Easy Swamp Water With A Lover"}, + -- Credit: F1e308 + { set = "eEX eNH eMS eGV eVL eDH eIN eAS DP", name = "Bath With A Lover"}, + { set = "eEX eNH eMS eGV eVL eDH eIN eAS rDP", name = "Bath With An Ex"}, + + --misc (no dev commentary except programming smithy) + { set = "eNH eGV", name = "Shameless Cashgrab"}, + { set = "eNH eMS eDH", name = "Clean Break"}, + { set = "eMS eDH eAS", name = "Clean Gamer"}, + { set = "eGV eIN", name = "Humble Pupil"}, + { set = "EX eNH eDH", name = "Emperor's Development"}, + { set = "eEX eMS eVL eDH", name = "Professional Cleaner"}, + { set = "eNH eAS", name = "Overweight Gamer"}, + { set = "eEX eVL eAS", name = "The Pro G(r)am(m)ing Smithy"}, + { set = "eEX eDP", name = "Best Friends"}, + { set = "eEX eMS", name = "Block Feast"}, + --future achievement update + { set = "eEX eNH", name = "Spending Spree"}, + -- eMS is already done as block feast + { set = "eEX eGV", name = "Comfy Bed"}, + { set = "eEX eVL", name = "Professional Weightlifter"}, + { set = "eEX eDH", name = "Heaven"}, + { set = "eEX eIN", name = "Perfect Vision"}, + { set = "eEX eAS", name = "Gaming Addict"}, + -- eDP is already done as best friends + { set = "eNH eMS eGV eDH eIN eDP", name = "Rold Smythy"}, + { set = "eEX eNH eMS eVL eDH eAS", name = "God Gamer"} +} + +d.game = { + { set = "NH GV", name = "A Modern Classic" }, + { set = "NH MS DH", name = "Deadlock" }, + { set = "MS DH AS", name = "The Escape Artist" }, + { set = "GV IN", name = "The Grandmaster" }, + { set = "EX NH DH", name = "Emperor's Decadence" }, + { set = "EX MS VL DH", name = "Divine Mastery" }, + { set = "NH AS", name = "The Starving Artist" }, + { set = "EX VL AS", name = "The Con Artist" }, + { set = "EX DP", name = "Trained Professionals" }, + { set = "EX MS", name = "Block Rationing" }, +} + +-- rDH database, from tetr.io's community: +-- https://docs.google.com/spreadsheets/d/1syh3q2oiduCZb1cJ5QI95Y2XhhedAfhv4YnEH9z2tbc +d.gameEX = { + { set = "rEX", name = "The Tyrant" }, + { set = "rNH", name = "Asceticism" }, + { set = "rMS", name = "Loaded Dice" }, + { set = "rGV", name = "Freefall" }, + { set = "rVL", name = "Last Stand" }, + { set = "rDH", name = "Damnation" }, + { set = "rIN", name = "The Exile" }, + { set = "rAS", name = "The Warlock" }, + { set = "rDP", name = "Bleeding Hearts" }, + { set = "urEX", name = "Psychotic Sovereign" }, + { set = "urNH", name = "Ascended Virtue" }, + { set = "urMS", name = "Entropy" }, + { set = "urGV", name = "Collapsing Galaxy" }, + { set = "urVL", name = "Diminishing Volition" }, + { set = "urDH", name = "Blasphemy" }, + { set = "urIN", name = "Paradoxical Nihility" }, + { set = "urAS", name = "Depraved Grimoire" }, + { set = "urDP", name = "Severed Eden" }, + + { set = "EX", name = "The Emperor" }, + { set = "NH", name = "Temperance" }, + { set = "MS", name = "Wheel of Fortune" }, + { set = "GV", name = "The Tower" }, + { set = "VL", name = "Strength" }, + { set = "DH", name = "The Devil" }, + { set = "IN", name = "The Hermit" }, + { set = "AS", name = "The Magician" }, + { set = "DP", name = "The Lovers" }, + { set = "EX NH", name = "A Fair Leader" }, + { set = "EX MS", name = "Block Rationing" }, + { set = "EX GV", name = "Invictus" }, + { set = "EX VL", name = "Icarus" }, + { set = "EX DH", name = "The Devil's Temptation" }, + { set = "EX IN", name = "Emperor's Dilemma" }, + { set = "EX AS", name = "Dancing Queen" }, + { set = "EX DP", name = "Trained Professionals" }, + { set = "NH MS", name = "All in" }, + { set = "NH GV", name = "A Modern Classic" }, + { set = "NH VL", name = "Resistance" }, + { set = "NH DH", name = "Purgatory Lite" }, + { set = "NH IN", name = "Helen Keller" }, + { set = "NH AS", name = "The Starving Artist" }, + { set = "NH DP", name = "Hand in Hand" }, + { set = "MS GV", name = "Cheese Race" }, + { set = "MS VL", name = "Swiss Cheese" }, + { set = "MS DH", name = "Dig In" }, + { set = "MS IN", name = "Blind Bet" }, + { set = "MS AS", name = "Roulette Wheel" }, + { set = "MS DP", name = "It's Complicated..." }, + { set = "GV VL", name = "Comfort Food" }, + { set = "GV DH", name = "The Speed Demon" }, + { set = "GV IN", name = "The Grandmaster" }, + { set = "GV AS", name = "The Juggler" }, + { set = "GV DP", name = "Heavy Hearts" }, + { set = "VL DH", name = "Lucifer" }, + { set = "VL IN", name = "Memorization" }, + { set = "VL AS", name = "Water From Stone" }, + { set = "VL DP", name = "Power Couple" }, + { set = "DH IN", name = "The Ghost" }, + { set = "DH AS", name = "The Deal with the Devil" }, + { set = "DH DP", name = "Forbidden Lovers" }, + { set = "IN AS", name = "The Abstract Artist" }, + { set = "IN DP", name = "Love is Blind" }, + { set = "AS DP", name = "Collaboration" }, + { set = "EX NH MS", name = "Online Gambling" }, + { set = "EX NH GV", name = "Beyond Death" }, + { set = "EX NH VL", name = "Archangel" }, + { set = "EX NH DH", name = "Emperor's Decadence" }, + { set = "EX NH IN", name = "The Friar" }, + { set = "EX NH AS", name = "Indecision" }, + { set = "EX NH DP", name = "The Prudent Parliament" }, + { set = "EX MS GV", name = "Mining Operation" }, + { set = "EX MS VL", name = "The Wolf of Wall Street" }, + { set = "EX MS DH", name = "No Warning" }, + { set = "EX MS IN", name = "Irrational" }, + { set = "EX MS AS", name = "The Rich Gambler" }, + { set = "EX MS DP", name = "Grand Feast" }, + { set = "EX GV VL", name = "Relaxation" }, + { set = "EX GV DH", name = "The Daredevil" }, + { set = "EX GV IN", name = "The Super GM" }, + { set = "EX GV AS", name = "Master of the T" }, + { set = "EX GV DP", name = "Sinking" }, + { set = "EX VL DH", name = "The Mad Lord" }, + { set = "EX VL IN", name = "Bounty Hunter" }, + { set = "EX VL AS", name = "The Con Artist" }, + { set = "EX VL DP", name = "Measures" }, + { set = "EX DH IN", name = "The Architect" }, + { set = "EX DH AS", name = "Loki" }, + { set = "EX DH DP", name = "Whispers of Sin" }, + { set = "EX IN AS", name = "Expertise" }, + { set = "EX IN DP", name = "Dominance" }, + { set = "EX AS DP", name = "Ballet Partners" }, + { set = "NH MS GV", name = "Atlas' Burden" }, + { set = "NH MS VL", name = "The Glass Cannon" }, + { set = "NH MS DH", name = "Deadlock" }, + { set = "NH MS IN", name = "The False Prophet" }, + { set = "NH MS AS", name = "Unpredictable Outcome" }, + { set = "NH MS DP", name = "Blackjack" }, + { set = "NH GV VL", name = "Traditional" }, + { set = "NH GV DH", name = "Unstable Footing" }, + { set = "NH GV IN", name = "Evanescence" }, + { set = "NH GV AS", name = "A Modern Twist" }, + { set = "NH GV DP", name = "Nostalgia" }, + { set = "NH VL DH", name = "Judgement" }, + { set = "NH VL IN", name = "Justice" }, + { set = "NH VL AS", name = "Bob Ross" }, + { set = "NH VL DP", name = "Insecure Neediness" }, + { set = "NH DH IN", name = "Blindside" }, + { set = "NH DH AS", name = "Shapeshifter" }, + { set = "NH DH DP", name = "Good and Evil" }, + { set = "NH IN AS", name = "The Blind Artist" }, + { set = "NH IN DP", name = "No contact Relationship" }, + { set = "NH AS DP", name = "Ecstatic Dance" }, + { set = "MS GV VL", name = "Survival" }, + { set = "MS GV DH", name = "Double Down" }, + { set = "MS GV IN", name = "Burrata" }, + { set = "MS GV AS", name = "Rough Sketch" }, + { set = "MS GV DP", name = "Torn Apart" }, + { set = "MS VL DH", name = "Utter Trash" }, + { set = "MS VL IN", name = "Starstruck" }, + { set = "MS VL AS", name = "Cream Cheese" }, + { set = "MS VL DP", name = "Couples Therapy" }, + { set = "MS DH IN", name = "The Stealth Ninja" }, + { set = "MS DH AS", name = "The Escape Artist" }, + { set = "MS DH DP", name = "Drillers' Squad" }, + { set = "MS IN AS", name = "Abstraction" }, + { set = "MS IN DP", name = "Miscommunications" }, + { set = "MS AS DP", name = "Paintball Fight" }, + { set = "GV VL DH", name = "Temptation" }, + { set = "GV VL IN", name = "Paranoia" }, + { set = "GV VL AS", name = "The Gladiator" }, + { set = "GV VL DP", name = "Diner Date" }, + { set = "GV DH IN", name = "The Drunk Driver" }, + { set = "GV DH AS", name = "The Texting Driver" }, + { set = "GV DH DP", name = "Race You There" }, + { set = "GV IN AS", name = "The Spinmaster" }, + { set = "GV IN DP", name = "Bronze Anniversary" }, + { set = "GV AS DP", name = "The Trapeze Artists" }, + { set = "VL DH IN", name = "The Flickering Spirit" }, + { set = "VL DH AS", name = "Forbidden Sorcery" }, + { set = "VL DH DP", name = "Yuri" }, + { set = "VL IN AS", name = "Eccentric Recluse" }, + { set = "VL IN DP", name = "Online Dating" }, + { set = "VL AS DP", name = "The Cheaters" }, + { set = "DH IN AS", name = "The Libertine" }, + { set = "DH IN DP", name = "Separation Anxiety" }, + { set = "DH AS DP", name = "A Mutual Agreement" }, + { set = "IN AS DP", name = "Blindfolded Collaboration" }, + { set = "EX NH MS GV", name = "Atlas' Lament" }, + { set = "EX NH MS VL", name = "The Fugitive" }, + { set = "EX NH MS DH", name = "Impasse" }, + { set = "EX NH MS IN", name = "Classic Prophet" }, + { set = "EX NH MS AS", name = "Fair Chance" }, + { set = "EX NH MS DP", name = "Sly Pair" }, + { set = "EX NH GV VL", name = "Cutting Edge" }, + { set = "EX NH GV DH", name = "Purgatory Pro" }, + { set = "EX NH GV IN", name = "Still Water" }, + { set = "EX NH GV AS", name = "Beyond the Afterdeath" }, + { set = "EX NH GV DP", name = "Double Maxout" }, + { set = "EX NH VL DH", name = "Azathoth" }, + { set = "EX NH VL IN", name = "Unreasonable" }, + { set = "EX NH VL AS", name = "The Scam Leader" }, + { set = "EX NH VL DP", name = "Heaven and Earth" }, + { set = "EX NH DH IN", name = "Invisible Decadence" }, + { set = "EX NH DH AS", name = "Amorphous" }, + { set = "EX NH DH DP", name = "The Decadent Court" }, + { set = "EX NH IN AS", name = "Black Magic" }, + { set = "EX NH IN DP", name = "Abandoned" }, + { set = "EX NH AS DP", name = "Royal Waltz" }, + { set = "EX MS GV VL", name = "Juggernaut" }, + { set = "EX MS GV DH", name = "Mining for Netherite" }, + { set = "EX MS GV IN", name = "Resourceful" }, + { set = "EX MS GV AS", name = "Irregular Sketch" }, + { set = "EX MS GV DP", name = "Mining Corporation" }, + { set = "EX MS VL DH", name = "Divine Mastery" }, + { set = "EX MS VL IN", name = "Interstellar" }, + { set = "EX MS VL AS", name = "The Hacker" }, + { set = "EX MS VL DP", name = "The Bull and Bear" }, + { set = "EX MS DH IN", name = "The Theocrat" }, + { set = "EX MS DH AS", name = "Imprisonment" }, + { set = "EX MS DH DP", name = "Checkmate" }, + { set = "EX MS IN AS", name = "The Mathematician" }, + { set = "EX MS IN DP", name = "Rulers in the Dark" }, + { set = "EX MS AS DP", name = "Double Cancelling" }, + { set = "EX GV VL DH", name = "The Autocrat" }, + { set = "EX GV VL IN", name = "Lateness" }, + { set = "EX GV VL AS", name = "Inertia" }, + { set = "EX GV VL DP", name = "The Irresponsible One" }, + { set = "EX GV DH IN", name = "Lament Rain" }, + { set = "EX GV DH AS", name = "Spin Overlord" }, + { set = "EX GV DH DP", name = "Shortcuts" }, + { set = "EX GV IN AS", name = "Mastermind" }, + { set = "EX GV IN DP", name = "Grandmasters of the World" }, + { set = "EX GV AS DP", name = "T Spinners" }, + { set = "EX VL DH IN", name = "Corruption" }, + { set = "EX VL DH AS", name = "Devilish Falsifier" }, + { set = "EX VL DH DP", name = "Dyarchy" }, + { set = "EX VL IN AS", name = "Insanity" }, + { set = "EX VL IN DP", name = "Dynasty" }, + { set = "EX VL AS DP", name = "The Loophole" }, + { set = "EX DH IN AS", name = "Reverse Quadruple Threat" }, + { set = "EX DH IN DP", name = "Construction Site" }, + { set = "EX DH AS DP", name = "The Devil's Advocate" }, + { set = "EX IN AS DP", name = "The Professional Artist" }, + { set = "NH MS GV VL", name = "Quadruple threat" }, + { set = "NH MS GV DH", name = "Futility" }, + { set = "NH MS GV IN", name = "Spelunking" }, + { set = "NH MS GV AS", name = "The Modern Artist" }, + { set = "NH MS GV DP", name = "Inside Out" }, + { set = "NH MS VL DH", name = "Deadbolt" }, + { set = "NH MS VL IN", name = "Blind Swinging" }, + { set = "NH MS VL AS", name = "Bluff" }, + { set = "NH MS VL DP", name = "Mistaken Desires" }, + { set = "NH MS DH IN", name = "Unfinished Business" }, + { set = "NH MS DH AS", name = "Locksmith" }, + { set = "NH MS DH DP", name = "Emotional Barriers" }, + { set = "NH MS IN AS", name = "Writer's Block" }, + { set = "NH MS IN DP", name = "Hajidere" }, + { set = "NH MS AS DP", name = "Unpredictable Relationship" }, + { set = "NH GV VL DH", name = "Nephalem" }, + { set = "NH GV VL IN", name = "The Black Hole" }, + { set = "NH GV VL AS", name = "Recreation" }, + { set = "NH GV VL DP", name = "One Night Stand" }, + { set = "NH GV DH IN", name = "Live Fast Die Young" }, + { set = "NH GV DH AS", name = "Dance Dance Revolution" }, + { set = "NH GV DH DP", name = "Ice Climbers" }, + { set = "NH GV IN AS", name = "Divine Failure" }, + { set = "NH GV IN DP", name = "Silver Anniversary" }, + { set = "NH GV AS DP", name = "Can't Let Go" }, + { set = "NH VL DH IN", name = "Spilled Milk" }, + { set = "NH VL DH AS", name = "The Restrained Artist" }, + { set = "NH VL DH DP", name = "Hell and Heaven" }, + { set = "NH VL IN AS", name = "Vigilante" }, + { set = "NH VL IN DP", name = "Unspoken Love" }, + { set = "NH VL AS DP", name = "The Inner Alchemist" }, + { set = "NH DH IN AS", name = "Impressionism" }, + { set = "NH DH IN DP", name = "Deep Blindness" }, + { set = "NH DH AS DP", name = "Cosplay Party" }, + { set = "NH IN AS DP", name = "Fatal Artistry" }, + { set = "MS GV VL DH", name = "Quadruple Down" }, + { set = "MS GV VL IN", name = "Eleventh Hour" }, + { set = "MS GV VL AS", name = "Gambled Faith" }, + { set = "MS GV VL DP", name = "Royale" }, + { set = "MS GV DH IN", name = "Intoxication" }, + { set = "MS GV DH AS", name = "The Spacial Artist" }, + { set = "MS GV DH DP", name = "Triple Down" }, + { set = "MS GV IN AS", name = "Parmigiano Reggiano" }, + { set = "MS GV IN DP", name = "Lonesome Feeling" }, + { set = "MS GV AS DP", name = "I Miss You" }, + { set = "MS VL DH IN", name = "The Night Watchman" }, + { set = "MS VL DH AS", name = "Blue Cheese" }, + { set = "MS VL DH DP", name = "Quadruples Therapy" }, + { set = "MS VL IN AS", name = "Creative Explosion" }, + { set = "MS VL IN DP", name = "Lovestruck" }, + { set = "MS VL AS DP", name = "Entangled Cheater" }, + { set = "MS DH IN AS", name = "Nascent" }, + { set = "MS DH IN DP", name = "The Unseen Depths" }, + { set = "MS DH AS DP", name = "Partners in Crime" }, + { set = "MS IN AS DP", name = "Inception" }, + { set = "GV VL DH IN", name = "Nightmare" }, + { set = "GV VL DH AS", name = "Sword Box" }, + { set = "GV VL DH DP", name = "The Tempting Ones" }, + { set = "GV VL IN AS", name = "Immense Pressure" }, + { set = "GV VL IN DP", name = "Blind Date" }, + { set = "GV VL AS DP", name = "The Colosseum" }, + { set = "GV DH IN AS", name = "Horror Thriller" }, + { set = "GV DH IN DP", name = "Timid Adoration" }, + { set = "GV DH AS DP", name = "The Text Chat" }, + { set = "GV IN AS DP", name = "All Spinners" }, + { set = "VL DH IN AS", name = "The Prodigy" }, + { set = "VL DH IN DP", name = "The Illusion of Love" }, + { set = "VL DH AS DP", name = "A Dance of Fire and Ice" }, + { set = "VL IN AS DP", name = "The Introverted Lovers" }, + { set = "DH IN AS DP", name = "Alter Ego" }, + { set = "EX NH MS GV VL", name = "Oppression" }, + { set = "EX NH MS GV DH", name = "Adversity" }, + { set = "EX NH MS GV IN", name = "Pessimism" }, + { set = "EX NH MS GV AS", name = "Existencial Crisis" }, + { set = "EX NH MS VL DH", name = "No Holds Barred" }, + { set = "EX NH MS VL IN", name = "The Torchbearer" }, + { set = "EX NH MS VL AS", name = "Crimson Witch" }, + { set = "EX NH MS VL DP", name = "The Fleeting Partners" }, + { set = "EX NH MS DH IN", name = "Breach of Faith" }, + { set = "EX NH MS DH AS", name = "Sinfully Scarred" }, + { set = "EX NH MS DH DP", name = "Stalemate" }, + { set = "EX NH MS IN AS", name = "Monarch's Hallucinations" }, + { set = "EX NH MS AS DP", name = "The Highroller" }, + { set = "EX NH GV VL DH", name = "The Veteran" }, + { set = "EX NH GV VL IN", name = "Foresight" }, + { set = "EX NH GV VL AS", name = "Recursion of Death" }, + { set = "EX NH GV DH IN", name = "Readlock" }, + { set = "EX NH GV DH AS", name = "The Kill Screen" }, + { set = "EX NH GV DH DP", name = "The hanged down pair" }, + { set = "EX NH GV IN AS", name = "Paragon" }, + { set = "EX NH GV IN DP", name = "Golden Anniversary" }, + { set = "EX NH GV AS DP", name = "Thirty Lives" }, + { set = "EX NH VL DH IN", name = "Spoiled Milk" }, + { set = "EX NH VL DH AS", name = "Loss of Control" }, + { set = "EX NH VL DH DP", name = "The Forbidden Fruit" }, + { set = "EX NH VL IN AS", name = "Loading Screen" }, + { set = "EX NH VL AS DP", name = "The Black Market" }, + { set = "EX NH DH IN AS", name = "Futile Spectacle" }, + { set = "EX NH DH IN DP", name = "The Heretics" }, + { set = "EX NH IN AS DP", name = "The Sorcerer's Apprentice" }, + { set = "EX MS GV VL DH", name = "Hell's Gate" }, + { set = "EX MS GV VL IN", name = "Hunted" }, + { set = "EX MS GV VL AS", name = "Deadline" }, + { set = "EX MS GV VL DP", name = "Comfort Zone" }, + { set = "EX MS GV DH IN", name = "Demonic Earthquake" }, + { set = "EX MS GV DH AS", name = "The Temporal Artist" }, + { set = "EX MS GV DH DP", name = "Omni Diggers" }, + { set = "EX MS GV IN AS", name = "Spin in Fourth Dimension" }, + { set = "EX MS VL DH IN", name = "The Knight" }, + { set = "EX MS VL DH AS", name = "False Security" }, + { set = "EX MS VL DH DP", name = "Brilliant Cartomancy" }, + { set = "EX MS VL IN AS", name = "Reload" }, + { set = "EX MS VL IN DP", name = "Space Station" }, + { set = "EX MS VL AS DP", name = "Arbitrary Code Execution" }, + { set = "EX MS DH IN AS", name = "Deadluck" }, + { set = "EX MS DH IN DP", name = "Non Euclidean Stacking" }, + { set = "EX MS DH AS DP", name = "The Great Escape" }, + { set = "EX MS IN AS DP", name = "Connectifia Abortus" }, + { set = "EX GV VL DH IN", name = "Unexpectancy" }, + { set = "EX GV VL DH AS", name = "Trembling Power" }, + { set = "EX GV VL DH DP", name = "Reign of Terror" }, + { set = "EX GV VL IN AS", name = "Speed the Collapse" }, + { set = "EX GV VL IN DP", name = "Despondent Dread" }, + { set = "EX GV VL AS DP", name = "Rising Legends" }, + { set = "EX GV DH IN AS", name = "Fight or Flight" }, + { set = "EX GV DH IN DP", name = "Skyscrapers" }, + { set = "EX GV DH AS DP", name = "Omni Spinners" }, + { set = "EX GV IN AS DP", name = "Masterclass" }, + { set = "EX VL DH IN AS", name = "Reverse Quintuple Threat" }, + { set = "EX VL DH AS DP", name = "Hello BPM Year" }, + { set = "EX VL IN AS DP", name = "Oblivious Spider" }, + { set = "EX DH IN AS DP", name = "Lost and Forgotten" }, + { set = "NH MS GV VL DH", name = "Quintuple threat" }, + { set = "NH MS GV VL IN", name = "The Guardian of Change" }, + { set = "NH MS GV VL AS", name = "Dreadlock" }, + { set = "NH MS GV VL DP", name = "Reminiscence Therapy" }, + { set = "NH MS GV DH IN", name = "Misdrop Haven" }, + { set = "NH MS GV DH AS", name = "A Classic Escape" }, + { set = "NH MS GV IN AS", name = "Lost and Dizzy" }, + { set = "NH MS GV AS DP", name = "The Modern Workshop" }, + { set = "NH MS VL DH IN", name = "Blind Faith" }, + { set = "NH MS VL DH AS", name = "Boltsmith" }, + { set = "NH MS VL DH DP", name = "Double Sided" }, + { set = "NH MS VL IN AS", name = "Ballet Dancing" }, + { set = "NH MS VL IN DP", name = "Card Counting" }, + { set = "NH MS VL AS DP", name = "Bewitched Canvas" }, + { set = "NH MS DH IN AS", name = "Disappearance" }, + { set = "NH MS DH AS DP", name = "Jailbreakers" }, + { set = "NH GV VL DH IN", name = "Entropy" }, + { set = "NH GV VL DH AS", name = "Demonic Possession" }, + { set = "NH GV VL DH DP", name = "Duality" }, + { set = "NH GV VL IN AS", name = "Ergosphere" }, + { set = "NH GV VL IN DP", name = "Abysmal Connection" }, + { set = "NH GV VL AS DP", name = "Forced Evolution" }, + { set = "NH GV DH IN AS", name = "Cheat Code" }, + { set = "NH GV DH IN DP", name = "Living in the Past" }, + { set = "NH GV DH AS DP", name = "Just Dance" }, + { set = "NH GV IN AS DP", name = "Latent Lifeline" }, + { set = "NH VL DH IN AS", name = "Magic" }, + { set = "NH VL DH IN DP", name = "Spill on the Dinner" }, + { set = "NH VL DH AS DP", name = "Neo Cosmos" }, + { set = "NH VL IN AS DP", name = "Expelled" }, + { set = "NH DH IN AS DP", name = "The Trinity of Blindness" }, + { set = "MS GV VL DH IN", name = "Slaughterhouse" }, + { set = "MS GV VL DH AS", name = "Killer Clown" }, + { set = "MS GV VL DH DP", name = "Sextuple Down" }, + { set = "MS GV VL IN AS", name = "Mortal Chaos" }, + { set = "MS GV VL IN DP", name = "Alone in the Dinner" }, + { set = "MS GV DH IN AS", name = "Doubled Symbolism" }, + { set = "MS GV DH IN DP", name = "Tipsy Twosome" }, + { set = "MS GV DH AS DP", name = "Four Dimensional Golf" }, + { set = "MS GV IN AS DP", name = "Granular Synthesis" }, + { set = "MS VL DH IN AS", name = "Beethoven" }, + { set = "MS VL DH IN DP", name = "The Incomprehensible Spirit" }, + { set = "MS VL DH AS DP", name = "Chaotic Resonance" }, + { set = "MS VL IN AS DP", name = "Couple of Creativity" }, + { set = "MS DH IN AS DP", name = "Crazy Personalities" }, + { set = "GV VL DH IN AS", name = "Lost Genius" }, + { set = "GV VL DH IN DP", name = "Haunting Hallucinations" }, + { set = "GV VL DH AS DP", name = "Dual System Failure" }, + { set = "GV VL IN AS DP", name = "Hardships" }, + { set = "GV DH IN AS DP", name = "Sleepy Pilots" }, + { set = "VL DH IN AS DP", name = "The Duel of Geniuses" }, +} + +-- rDH + Easy Names, from ... me :sob: +d.gameeEX = { + { set = "eEX", name = "Comfort" }, --Soft Comfort + { set = "eNH", name = "Meditation" }, --Cool Meditation + { set = "eMS", name = "Food" }, --Pure Food + { set = "eGV", name = "Bed" }, --Bubbly Bed + { set = "eVL", name = "Weightlifter" }, --Calm Weightlifter + { set = "eDH", name = "Place" }, --Sacred Place + { set = "eIN", name = "Vision" }, --Clear Vision + { set = "eAS", name = "Gamer" }, --Mystical Gamer + { set = "eDP", name = "Buddies" }, --Friendly Buddies + { set = "eEX eNH", name = "Spending Spree" }, + { set = "eEX eMS", name = "Block Feast" }, + { set = "eEX eGV", name = "Comfy Bed" }, + { set = "eEX eVL", name = "Professional Weightlifter" }, + { set = "eEX eDH", name = "Heaven" }, + { set = "eEX eIN", name = "Perfect Vision" }, -- aka perfection + { set = "eEX eAS", name = "Gaming Addict" }, + { set = "eEX eDP", name = "Best Friends" }, + { set = "eNH eMS", name = "Snack" }, -- snack = moderate food + { set = "eNH eGV", name = "Shameless Cashgrab" }, + { set = "eNH eVL", name = "Chill" }, -- chill = calm + meditation + { set = "eNH eDH", name = "Cool Place" }, + { set = "eNH eIN", name = "Cool Sight" }, + { set = "eNH eAS", name = "Overweight Gamer" }, + { set = "eNH eDP", name = "Yoga Buddies" }, + { set = "eMS eGV", name = "Made Bed" }, + { set = "eMS eVL", name = "Organized" }, --organized = tidy + calm + { set = "eMS eDH", name = "Clean" }, + { set = "eMS eIN", name = "Spotless" }, --spotless = tidy + visible + { set = "eMS eAS", name = "Hungry Gamer" }, + { set = "eMS eDP", name = "Eating Buddies" }, + { set = "eGV eVL", name = "True Lifter" }, + { set = "eGV eDH", name = "Bedroom" }, --bed place + { set = "eGV eIN", name = "Humble Pupil" }, + { set = "eGV eAS", name = "Bedtime Gaming" }, + { set = "eGV eDP", name = "Cuddle Buddies" }, + { set = "eVL eDH", name = "Gym" }, -- workout place + { set = "eVL eIN", name = "Obvious Weightlifter" }, + { set = "eVL eAS", name = "Game Developer" }, + { set = "eVL eDP", name = "Workout Buddies" }, + { set = "eDH eIN", name = "Observatory" }, + { set = "eDH eAS", name = "Gaming Den" }, + { set = "eDH eDP", name = "Friend's Place" }, + { set = "eIN eAS", name = "Mystical Vision" }, + { set = "eIN eDP", name = "Memories" }, + { set = "eAS eDP", name = "Gaming Buddies" }, + { set = "eEX eNH eMS", name = "Comforting Snack" }, + { set = "eEX eNH eGV", name = "Easy Cashgrab" }, + { set = "eEX eNH eVL", name = "Expensive Weights" }, + { set = "eEX eNH eDH", name = "Educator's Development" }, + { set = "eEX eNH eIN", name = "Expensive Vision" }, + { set = "eEX eNH eAS", name = "Reformed Gaming Addict" }, -- addict + moderation = reform + { set = "eEX eNH eDP", name = "Spending Spree Buddies" }, + { set = "eEX eMS eGV", name = "Eat and Sleep" }, + { set = "eEX eMS eVL", name = "Eat and Work" }, + { set = "eEX eMS eDH", name = "Easy to Clean" }, + { set = "eEX eMS eIN", name = "Perfect Meal" }, + { set = "eEX eMS eAS", name = "Hungry Gaming Addict" }, + { set = "eEX eMS eDP", name = "Grand Feasts" }, + { set = "eEX eGV eVL", name = "Professional True Lifter" }, + { set = "eEX eGV eDH", name = "Comfy Bedroom" }, + { set = "eEX eGV eIN", name = "Comfy Pupil" }, + { set = "eEX eGV eAS", name = "Bedtime Gaming Addict" }, + { set = "eEX eGV eDP", name = "Comfy Cuddling" }, + { set = "eEX eVL eDH", name = "Professional Gym" }, + { set = "eEX eVL eIN", name = "Professional Weightlifter's Insight" }, + { set = "eEX eVL eAS", name = "The Pro G(r)am(m)ing Smithy" }, + { set = "eEX eVL eDP", name = "Professional Spotlifter" }, -- pro gym buddies + { set = "eEX eDH eIN", name = "Comet Observatory" }, + { set = "eEX eDH eAS", name = "Gaming Addict's Den" }, + { set = "eEX eDH eDP", name = "Best Friend's Place" }, + { set = "eEX eIN eAS", name = "Gaming Perfection" }, + { set = "eEX eIN eDP", name = "Comfy Memories" }, + { set = "eEX eAS eDP", name = "Comfy Gaming Buddies" }, + { set = "eNH eMS eGV", name = "Bedtime Snack" }, + { set = "eNH eMS eVL", name = "Workout Snack" }, + { set = "eNH eMS eDH", name = "Clean Break" }, + { set = "eNH eMS eIN", name = "Snack Vision" }, + { set = "eNH eMS eAS", name = "Gamer Snack" }, + { set = "eNH eMS eDP", name = "Snack with a Friend" }, + { set = "eNH eGV eVL", name = "Calm Cashgrab" }, + { set = "eNH eGV eDH", name = "Cool Bedroom" }, + { set = "eNH eGV eIN", name = "Obvious Cashgrab" }, + { set = "eNH eGV eAS", name = "Shameless Gamer" }, + { set = "eNH eGV eDP", name = "Bedtime 'Yoga'" }, + { set = "eNH eVL eDH", name = "Chill Place" }, + { set = "eNH eVL eIN", name = "Chill Vision" }, + { set = "eNH eVL eAS", name = "Chill Gamer" }, + { set = "eNH eVL eDP", name = "Chill Buddies" }, + { set = "eNH eDH eIN", name = "Cool Observatory" }, + { set = "eNH eDH eAS", name = "Overweight Gamer's Den" }, + { set = "eNH eDH eDP", name = "Yoga Studio" }, + { set = "eNH eIN eAS", name = "Clearly Overweight Gamer" }, + { set = "eNH eIN eDP", name = "Cool Memories" }, + { set = "eNH eAS eDP", name = "Gamer Yoga" }, + { set = "eMS eGV eVL", name = "Organized Bed" }, + { set = "eMS eGV eDH", name = "Clean Bed" }, + { set = "eMS eGV eIN", name = "Hungry Pupil" }, + { set = "eMS eGV eAS", name = "Hungry Bedtime Gamer" }, + { set = "eMS eGV eDP", name = "Hungry Cuddle Buddies" }, + { set = "eMS eVL eDH", name = "Clean Weightlifter" }, + { set = "eMS eVL eIN", name = "Organized Vision" }, + { set = "eMS eVL eAS", name = "Organized Gamer" }, + { set = "eMS eVL eDP", name = "Organized Buddies" }, + { set = "eMS eDH eIN", name = "Clean and Clear" }, + { set = "eMS eDH eAS", name = "Clean Gamer" }, + { set = "eMS eDH eDP", name = "Clean Buddies" }, + { set = "eMS eIN eAS", name = "Spotless Gamer" }, + { set = "eMS eIN eDP", name = "Spotless Buddies" }, + { set = "eMS eAS eDP", name = "Hungry Gaming Buddies" }, + { set = "eGV eVL eDH", name = "Bedroom Workout" }, + { set = "eGV eVL eIN", name = "Humble Weightlifter" }, + { set = "eGV eVL eAS", name = "Bedtime Game Dev" }, + { set = "eGV eVL eDP", name = "True Lifting Buddies" }, + { set = "eGV eDH eIN", name = "Bedtime Observatory" }, + { set = "eGV eDH eAS", name = "Bedroom Gaming" }, + { set = "eGV eDH eDP", name = "Friend's Bedroom" }, + { set = "eGV eIN eAS", name = "Humble Gamer" }, + { set = "eGV eIN eDP", name = "Humble Buddies" }, + { set = "eGV eAS eDP", name = "Cuddling Gamers" }, + { set = "eVL eDH eIN", name = "Calm Observatory" }, + { set = "eVL eDH eAS", name = "Game Dev's Den" }, + { set = "eVL eDH eDP", name = "Gym Buddies" }, + { set = "eVL eIN eAS", name = "Oblivious Game Dev" }, --to be clear, i know this should be "obvious" not "oblivious" but it's funny cause I'm "oblivious" to my mistake + { set = "eVL eIN eDP", name = "Calm Memories" }, + { set = "eVL eAS eDP", name = "Game Dev Buddies" }, + { set = "eDH eIN eAS", name = "Mystical Observatory" }, + { set = "eDH eIN eDP", name = "Friendly Observatory" }, + { set = "eDH eAS eDP", name = "Friend's Gaming Den" }, + { set = "eIN eAS eDP", name = "Gaming Memories" }, + { set = "eEX eNH eMS eGV", name = "Shameless Feast" }, + { set = "eEX eNH eMS eVL", name = "Chill Feast" }, + { set = "eEX eNH eMS eDH", name = "Chef's Development" }, + { set = "eEX eNH eMS eIN", name = "Perfect Snack" }, + { set = "eEX eNH eMS eAS", name = "Obese Gamer" }, -- feast + overweight gamer + { set = "eEX eNH eMS eDP", name = "Best Friend's Snack" }, + { set = "eEX eNH eGV eVL", name = "Chill Comfy Bed" }, + { set = "eEX eNH eGV eDH", name = "Cashgrab Heaven" }, + { set = "eEX eNH eGV eIN", name = "Perfect Cashgrab" }, + { set = "eEX eNH eGV eAS", name = "Reformed Bedtime Gamer" }, + { set = "eEX eNH eGV eDP", name = "Comfy Bedtime 'Yoga'" }, + { set = "eEX eNH eVL eDH", name = "Chill Heaven" }, + { set = "eEX eNH eVL eIN", name = "Chill Perfection" }, + { set = "eEX eNH eVL eAS", name = "The Meditating Smithy" }, + { set = "eEX eNH eVL eDP", name = "Chill Best Friends" }, + { set = "eEX eNH eDH eIN", name = "Astronomer's Development" }, + { set = "eEX eNH eDH eAS", name = "Gamer's Development" }, + { set = "eEX eNH eDH eDP", name = "Best Friend's Development" }, + { set = "eEX eNH eIN eAS", name = "Clearly Reformed Gamer" }, + { set = "eEX eNH eIN eDP", name = "Expensive Memories" }, + { set = "eEX eNH eAS eDP", name = "Reformed Gaming Buddies" }, + { set = "eEX eMS eGV eVL", name = "Eat, Sleep, Work" }, + { set = "eEX eMS eGV eDH", name = "Bedroom Feast" }, + { set = "eEX eMS eGV eIN", name = "Humble Feast" }, + { set = "eEX eMS eGV eAS", name = "Eat, Sleep, Game" }, + { set = "eEX eMS eGV eDP", name = "Grand Bedtime Feasts" }, + { set = "eEX eMS eVL eDH", name = "Professional Cleaner" }, + { set = "eEX eMS eVL eIN", name = "Organized Perfection" }, + { set = "eEX eMS eVL eAS", name = "The Cooking Smithy" }, + { set = "eEX eMS eVL eDP", name = "Organized Best Friends" }, + { set = "eEX eMS eDH eIN", name = "Perfectly Clean" }, + { set = "eEX eMS eDH eAS", name = "Clean Gaming Addict" }, + { set = "eEX eMS eDH eDP", name = "Clean Best Friends" }, + { set = "eEX eMS eIN eAS", name = "Spotless Gaming Addict" }, + { set = "eEX eMS eIN eDP", name = "Feast Memories" }, + { set = "eEX eMS eAS eDP", name = "Gaming Buddies' Feast" }, + { set = "eEX eGV eVL eDH", name = "Comfy Bedroom Workout" }, + { set = "eEX eGV eVL eIN", name = "Professional Pupil" }, + { set = "eEX eGV eVL eAS", name = "The Sleeping Smithy" }, + { set = "eEX eGV eVL eDP", name = "Professional Cuddling" }, + { set = "eEX eGV eDH eIN", name = "Perfect Bedroom" }, + { set = "eEX eGV eDH eAS", name = "Comfy Bedroom Gaming" }, + { set = "eEX eGV eDH eDP", name = "Cuddle Heaven" }, + { set = "eEX eGV eIN eAS", name = "Humble Gaming Addict" }, + { set = "eEX eGV eIN eDP", name = "Perfect Cuddling" }, + { set = "eEX eGV eAS eDP", name = "Comfy Cuddling Gamers" }, + { set = "eEX eVL eDH eIN", name = "Calm Comet Observatory" }, + { set = "eEX eVL eDH eAS", name = "The Homely Smithy" }, + { set = "eEX eVL eDH eDP", name = "Professional Gym Buddies" }, + { set = "eEX eVL eIN eAS", name = "The Oblivious Smithy" }, + { set = "eEX eVL eIN eDP", name = "Perfect Workout Buddies" }, + { set = "eEX eVL eAS eDP", name = "The Pro G(r)am(m)ing Spider" }, + { set = "eEX eDH eIN eAS", name = "Perfect Gaming Den" }, + { set = "eEX eDH eIN eDP", name = "Rosalina in the Observatory" }, + { set = "eEX eDH eAS eDP", name = "Best Friend's Gaming Den" }, + { set = "eEX eIN eAS eDP", name = "Comfy Gaming Memories" }, + { set = "eNH eMS eGV eVL", name = "Bedtime Workout Snack" }, -- snack + true lifter + { set = "eNH eMS eGV eDH", name = "Bedroom Snack" }, + { set = "eNH eMS eGV eIN", name = "Humble Snack" }, + { set = "eNH eMS eGV eAS", name = "Bedtime Gamer Snack" }, + { set = "eNH eMS eGV eDP", name = "Cuddling Snack" }, + { set = "eNH eMS eVL eDH", name = "Gym Snack" }, + { set = "eNH eMS eVL eIN", name = "Spotless Chill" }, + { set = "eNH eMS eVL eAS", name = "Game Dev Snack" }, + { set = "eNH eMS eVL eDP", name = "Organized Yoga" }, + { set = "eNH eMS eDH eIN", name = "Observatory Snack" }, + { set = "eNH eMS eDH eAS", name = "Gaming Den Snacks" }, + { set = "eNH eMS eDH eDP", name = "Clean Yoga" }, + { set = "eNH eMS eIN eAS", name = "Spotless Overweight Gamer" }, + { set = "eNH eMS eIN eDP", name = "Snack Memories" }, + { set = "eNH eMS eAS eDP", name = "Snack with a Gaming Buddy" }, + { set = "eNH eGV eVL eDH", name = "Chill Bedroom" }, + { set = "eNH eGV eVL eIN", name = "Chill Pupil" }, + { set = "eNH eGV eVL eAS", name = "Shameless Game Dev" }, + { set = "eNH eGV eVL eDP", name = "Chill Cuddling" }, + { set = "eNH eGV eDH eIN", name = "Shameless Observatory" }, + { set = "eNH eGV eDH eAS", name = "Overweight Gamer's Bedroom" }, + { set = "eNH eGV eDH eDP", name = "Bedroom Yoga" }, + { set = "eNH eGV eIN eAS", name = "Overweight Gaming Pupil" }, + { set = "eNH eGV eIN eDP", name = "Humble Yoga" }, + { set = "eNH eGV eAS eDP", name = "Shameless Gaming Buddies" }, + { set = "eNH eVL eDH eIN", name = "Chill Observatory" }, + { set = "eNH eVL eDH eAS", name = "Chill Gaming Den" }, + { set = "eNH eVL eDH eDP", name = "Chilling at a Friend's Place" }, + { set = "eNH eVL eIN eAS", name = "Chill Gamer Vision" }, + { set = "eNH eVL eIN eDP", name = "Chill Memories" }, + { set = "eNH eVL eAS eDP", name = "Chill Gaming Buddies" }, + { set = "eNH eDH eIN eAS", name = "Clearly Overweight Gamer's Den" }, + { set = "eNH eDH eIN eDP", name = "Observatory Yoga" }, + { set = "eNH eDH eAS eDP", name = "Gaming Den Yoga" }, + { set = "eNH eIN eAS eDP", name = "Cool Gaming Memories" }, + { set = "eMS eGV eVL eDH", name = "Organized Bedroom" }, + { set = "eMS eGV eVL eIN", name = "Organized Pupil" }, + { set = "eMS eGV eVL eAS", name = "Organized Bedtime Gaming" }, + { set = "eMS eGV eVL eDP", name = "Organized Cuddling" }, + { set = "eMS eGV eDH eIN", name = "Spotless Bedroom" }, + { set = "eMS eGV eDH eAS", name = "Hungry Bedroom Gaming" }, + { set = "eMS eGV eDH eDP", name = "Clean Cuddling" }, + { set = "eMS eGV eIN eAS", name = "Hungry Humble Gamer" }, + { set = "eMS eGV eIN eDP", name = "Spotless Cuddling" }, + { set = "eMS eGV eAS eDP", name = "Hungry Cuddling Gamers" }, + { set = "eMS eVL eDH eIN", name = "Organized Observatory" }, + { set = "eMS eVL eDH eAS", name = "Clean Game Dev" }, + { set = "eMS eVL eDH eDP", name = "Clean Workout Buddies" }, + { set = "eMS eVL eIN eAS", name = "Spotless Game Dev" }, + { set = "eMS eVL eIN eDP", name = "Organized Memories" }, + { set = "eMS eVL eAS eDP", name = "Organized Gaming Buddies" }, + { set = "eMS eDH eIN eAS", name = "Spotless Gaming Den" }, + { set = "eMS eDH eIN eDP", name = "Clean Memories" }, + { set = "eMS eDH eAS eDP", name = "Clean Gaming Buddies" }, + { set = "eMS eIN eAS eDP", name = "Spotless Gaming Buddies" }, + { set = "eGV eVL eDH eIN", name = "Humble Gym" }, + { set = "eGV eVL eDH eAS", name = "Game Dev's Bedroom" }, + { set = "eGV eVL eDH eDP", name = "Gym Cuddling" }, + { set = "eGV eVL eIN eAS", name = "Humble Game Dev" }, + { set = "eGV eVL eIN eDP", name = "Calm Bedtime Memories" }, + { set = "eGV eVL eAS eDP", name = "Cuddly Game Dev" }, + { set = "eGV eDH eIN eAS", name = "Humble Gaming Den" }, + { set = "eGV eDH eIN eDP", name = "Observatory Cuddling" }, + { set = "eGV eDH eAS eDP", name = "Game Den Cuddling" }, + { set = "eGV eIN eAS eDP", name = "Humble Gaming Buddies" }, + { set = "eVL eDH eIN eAS", name = "Game Dev's Observatory" }, + { set = "eVL eDH eIN eDP", name = "Gym Memories" }, + { set = "eVL eDH eAS eDP", name = "Gym-Going Gaming Buddies" }, + { set = "eVL eIN eAS eDP", name = "Game Dev's Memories" }, + { set = "eDH eIN eAS eDP", name = "Friendly Mystical Observatory" }, + + { set = "eEX eNH eMS eGV eVL", name = "Eat, Sleep, Chill" }, + { set = "eEX eNH eMS eGV eDH", name = "Comfy Bedroom Snack" }, + { set = "eEX eNH eMS eGV eIN", name = "Perfect Bedtime Snack" }, + { set = "eEX eNH eMS eGV eAS", name = "Obese Bedtime Gamer" }, + { set = "eEX eNH eMS eGV eDP", name = "Eat, Sleep, Yoga" }, + { set = "eEX eNH eMS eVL eDH", name = "Organizer's Development" }, + { set = "eEX eNH eMS eVL eIN", name = "Perfect Workout Snack" }, + { set = "eEX eNH eMS eVL eAS", name = "The Snacking Smithy" }, + { set = "eEX eNH eMS eVL eDP", name = "Eat, Work, Yoga" }, + { set = "eEX eNH eMS eDH eIN", name = "Comet Observatory Snack" }, + { set = "eEX eNH eMS eDH eAS", name = "Clean Reformed Gamer" }, + { set = "eEX eNH eMS eDH eDP", name = "Clean Break with a Friend" }, + { set = "eEX eNH eMS eIN eAS", name = "Spotless Reformed Gamer" }, + { set = "eEX eNH eMS eIN eDP", name = "Perfect Snack with a Friend" }, + { set = "eEX eNH eMS eAS eDP", name = "Obese Gaming Buddies" }, + { set = "eEX eNH eGV eVL eDH", name = "Chill Comfy Bedroom" }, + { set = "eEX eNH eGV eVL eIN", name = "Chill Comfy Pupil" }, + { set = "eEX eNH eGV eVL eAS", name = "The Shameless Smithy" }, + { set = "eEX eNH eGV eVL eDP", name = "Chill Comfy Cuddling" }, + { set = "eEX eNH eGV eDH eIN", name = "Pupil's Development" }, + { set = "eEX eNH eGV eDH eAS", name = "Reformed Gamer's Bedroom" }, + { set = "eEX eNH eGV eDH eDP", name = "Cuddlers' Development" }, + { set = "eEX eNH eGV eIN eAS", name = "Humble Reformed Gamer" }, + { set = "eEX eNH eGV eIN eDP", name = "Perfect Bedtime 'Yoga'" }, + { set = "eEX eNH eGV eAS eDP", name = "Reformed Cuddling Gamers" }, + { set = "eEX eNH eVL eDH eIN", name = "Chill Comet Observatory" }, + { set = "eEX eNH eVL eDH eAS", name = "The Freezing Smithy" }, + { set = "eEX eNH eVL eDH eDP", name = "Chill Best Friend's Place" }, + { set = "eEX eNH eVL eIN eAS", name = "The Awestruck Smithy" }, + { set = "eEX eNH eVL eIN eDP", name = "Chill Comfy Memories" }, + { set = "eEX eNH eVL eAS eDP", name = "The Meditating Spider" }, + { set = "eEX eNH eDH eIN eAS", name = "Reformed Mystical Observatory" }, + { set = "eEX eNH eDH eIN eDP", name = "Cool Rosalina" }, + { set = "eEX eNH eDH eAS eDP", name = "Sacred Reformed Gaming Buddies" }, + { set = "eEX eNH eIN eAS eDP", name = "Reformed Gamer's Memories" }, + { set = "eEX eMS eGV eVL eDH", name = "Eat, Sleep, Gym" }, + { set = "eEX eMS eGV eVL eIN", name = "Eat, Work, Learn" }, + { set = "eEX eMS eGV eVL eAS", name = "The Routine Smithy" }, -- aka eat, sleep, work, game + { set = "eEX eMS eGV eVL eDP", name = "Eat, Work, Cuddle" }, + { set = "eEX eMS eGV eDH eIN", name = "Perfectly Clean Bed" }, + { set = "eEX eMS eGV eDH eAS", name = "Bedroom Gaming Feast" }, + { set = "eEX eMS eGV eDH eDP", name = "Clean Comfy Cuddling" }, + { set = "eEX eMS eGV eIN eAS", name = "Humble Gamer's Feast" }, + { set = "eEX eMS eGV eIN eDP", name = "Spotless Comfy Cuddling" }, + { set = "eEX eMS eGV eAS eDP", name = "Eat, Cuddle, Game" }, + { set = "eEX eMS eVL eDH eIN", name = "Organized Comet Observatory" }, + { set = "eEX eMS eVL eDH eAS", name = "The Clean Smithy" }, + { set = "eEX eMS eVL eDH eDP", name = "Professional Cleaning With A Friend" }, + { set = "eEX eMS eVL eIN eAS", name = "The Spotless Smithy" }, + { set = "eEX eMS eVL eIN eDP", name = "Organized Comfy Memories" }, + { set = "eEX eMS eVL eAS eDP", name = "The Hungry Spider" }, + { set = "eEX eMS eDH eIN eAS", name = "Perfectly Clean Gamer" }, + { set = "eEX eMS eDH eIN eDP", name = "Hungry Rosalina" }, + { set = "eEX eMS eDH eAS eDP", name = "Clean Comfy Gaming Buddies" }, + { set = "eEX eMS eIN eAS eDP", name = "Spotless Comfy Gaming Buddies" }, + { set = "eEX eGV eVL eDH eIN", name = "Comfy Humble Gym" }, + { set = "eEX eGV eVL eDH eAS", name = "The Bedroom Smithy" }, + { set = "eEX eGV eVL eDH eDP", name = "Comfy Gym Cuddling" }, + { set = "eEX eGV eVL eIN eAS", name = "The Humble Smithy" }, + { set = "eEX eGV eVL eIN eDP", name = "Professional True Lifter Memories" }, + { set = "eEX eGV eVL eAS eDP", name = "The Sleeping Spider" }, + { set = "eEX eGV eDH eIN eAS", name = "Perfect Bedroom Gaming" }, + { set = "eEX eGV eDH eIN eDP", name = "Sleeping Rosalina" }, + { set = "eEX eGV eDH eAS eDP", name = "Heavenly Cuddling Gamers" }, + { set = "eEX eGV eIN eAS eDP", name = "Perfect Cuddling Gamers" }, + { set = "eEX eVL eDH eIN eAS", name = "The Observational Smithy" }, + { set = "eEX eVL eDH eIN eDP", name = "Calm Rosalina" }, + { set = "eEX eVL eDH eAS eDP", name = "The Homely Spider" }, + { set = "eEX eVL eIN eAS eDP", name = "The Oblivious Spider" }, + { set = "eEX eDH eIN eAS eDP", name = "Gaming Rosalina" }, + { set = "eNH eMS eGV eVL eDH", name = "Cool Organized Bedroom" }, + { set = "eNH eMS eGV eVL eIN", name = "Humble Workout Snack" }, + { set = "eNH eMS eGV eVL eAS", name = "Bedtime Game Dev Snack" }, + { set = "eNH eMS eGV eVL eDP", name = "Organized Bedtime 'Yoga'" }, + { set = "eNH eMS eGV eDH eIN", name = "Bedtime Observatory Snack" }, + { set = "eNH eMS eGV eDH eAS", name = "Bedroom Gaming Snack" }, + { set = "eNH eMS eGV eDH eDP", name = "Clean Bedtime 'Yoga'" }, + { set = "eNH eMS eGV eIN eAS", name = "Humble Gamer Snack" }, + { set = "eNH eMS eGV eIN eDP", name = "Spotless Bedtime 'Yoga'" }, + { set = "eNH eMS eGV eAS eDP", name = "Cuddling Gamers' Snack" }, + { set = "eNH eMS eVL eDH eIN", name = "Calm Observatory Snack" }, + { set = "eNH eMS eVL eDH eAS", name = "Chill Clean Gamer" }, + { set = "eNH eMS eVL eDH eDP", name = "Gym Snack with a Friend" }, + { set = "eNH eMS eVL eIN eAS", name = "Spotless Chill Gamer" }, + { set = "eNH eMS eVL eIN eDP", name = "Spotless Chill Buddies" }, + { set = "eNH eMS eVL eAS eDP", name = "Organized Gamer Yoga" }, + { set = "eNH eMS eDH eIN eAS", name = "Mystical Observatory Snack" }, + { set = "eNH eMS eDH eIN eDP", name = "Friendly Observatory Snack" }, + { set = "eNH eMS eDH eAS eDP", name = "Clean Gamer Yoga" }, + { set = "eNH eMS eIN eAS eDP", name = "Spotless Gamer Yoga" }, + { set = "eNH eGV eVL eDH eIN", name = "Chill Bedtime Observatory" }, + { set = "eNH eGV eVL eDH eAS", name = "Chill Bedroom Gaming" }, + { set = "eNH eGV eVL eDH eDP", name = "Chill Bedroom Buddies" }, + { set = "eNH eGV eVL eIN eAS", name = "Chill Humble Gamer" }, + { set = "eNH eGV eVL eIN eDP", name = "Chill Humble Buddies" }, + { set = "eNH eGV eVL eAS eDP", name = "Chill Cuddling Gamers" }, + { set = "eNH eGV eDH eIN eAS", name = "Clearly Overweight Gamer's Bedroom" }, + { set = "eNH eGV eDH eIN eDP", name = "Cool Observatory Cuddling" }, + { set = "eNH eGV eDH eAS eDP", name = "Bedroom Gamer Yoga" }, + { set = "eNH eGV eIN eAS eDP", name = "Humble Gamer Yoga" }, + { set = "eNH eVL eDH eIN eAS", name = "Chill Mystical Observatory" }, + { set = "eNH eVL eDH eIN eDP", name = "Chill Friendly Observatory" }, + { set = "eNH eVL eDH eAS eDP", name = "Game Dev in a Freezer" }, + { set = "eNH eVL eIN eAS eDP", name = "Chill Gaming Memories" }, + { set = "eNH eDH eIN eAS eDP", name = "Mystical Observatory Yoga" }, + { set = "eMS eGV eVL eDH eIN", name = "Organized Bedtime Observatory" }, + { set = "eMS eGV eVL eDH eAS", name = "Organized Bedroom Gaming" }, + { set = "eMS eGV eVL eDH eDP", name = "Organized Friend's Bedroom" }, + { set = "eMS eGV eVL eIN eAS", name = "Organized Humble Gamer" }, + { set = "eMS eGV eVL eIN eDP", name = "Organized Bedtime Memories" }, + { set = "eMS eGV eVL eAS eDP", name = "Organized Cuddling Gamers" }, + { set = "eMS eGV eDH eIN eAS", name = "Clean Humble Gamer" }, + { set = "eMS eGV eDH eIN eDP", name = "Clean Humble Buddies" }, + { set = "eMS eGV eDH eAS eDP", name = "Clean Cuddling Gamers" }, + { set = "eMS eGV eIN eAS eDP", name = "Spotless Cuddling Gamers" }, + { set = "eMS eVL eDH eIN eAS", name = "Organized Mystical Observatory" }, + { set = "eMS eVL eDH eIN eDP", name = "Organized Friendly Observatory" }, + { set = "eMS eVL eDH eAS eDP", name = "Clean Game Dev Buddies" }, + { set = "eMS eVL eIN eAS eDP", name = "Organized Gaming Memories" }, + { set = "eMS eDH eIN eAS eDP", name = "Clean Gaming Memories" }, + { set = "eGV eVL eDH eIN eAS", name = "Game Dev's Bedtime Observatory" }, + { set = "eGV eVL eDH eIN eDP", name = "Humble Gym Buddies" }, + { set = "eGV eVL eDH eAS eDP", name = "Cuddly Game Dev's Room" }, + { set = "eGV eVL eIN eAS eDP", name = "Game Dev's Bedtime Memories" }, + { set = "eGV eDH eIN eAS eDP", name = "Mystical Observatory Cuddling" }, + { set = "eVL eDH eIN eAS eDP", name = "Friendly Game Dev's Observatory" }, + + + -- 6 mods + { set = "eEX eNH eMS eGV eVL eDP", name = "Eat, Chill, Cuddle" }, + { set = "eEX eNH eMS eGV eDH eDP", name = "Comfy Bedroom Snack with a Friend" }, + { set = "eEX eNH eMS eGV eIN eDP", name = "Perfect Cuddling Snack" }, + { set = "eEX eNH eMS eGV eAS eDP", name = "Obese Cuddling Gamers" }, + { set = "eEX eNH eMS eVL eDH eDP", name = "Professional Clean Yoga" }, + { set = "eEX eNH eMS eVL eIN eDP", name = "Organized Perfect Yoga" }, + { set = "eEX eNH eMS eVL eAS eDP", name = "The Snacking Spider" }, + { set = "eEX eNH eMS eDH eIN eDP", name = "Snacking Rosalina" }, + { set = "eEX eNH eMS eDH eAS eDP", name = "Clean Comfy Gamer Yoga" }, + { set = "eEX eNH eMS eIN eAS eDP", name = "Spotless Comfy Gamer Yoga" }, + { set = "eEX eNH eGV eVL eDH eDP", name = "Chill Heavenly Cuddling" }, + { set = "eEX eNH eGV eVL eIN eDP", name = "Chill Perfect Cuddling" }, + { set = "eEX eNH eGV eVL eAS eDP", name = "The Shameless Spider" }, + { set = "eEX eNH eGV eDH eIN eDP", name = "Shameless Rosalina" }, + { set = "eEX eNH eGV eDH eAS eDP", name = "Cuddling Gamers' Development" }, + { set = "eEX eNH eGV eIN eAS eDP", name = "Perfect Shameless Gaming Buddies" }, + { set = "eEX eNH eVL eDH eIN eDP", name = "Chill Rosalina" }, + { set = "eEX eNH eVL eDH eAS eDP", name = "The Freezing Spider" }, + { set = "eEX eNH eVL eIN eAS eDP", name = "The Awestruck Spider" }, + { set = "eEX eNH eDH eIN eAS eDP", name = "Heavyweight Racer Rosalina" }, + { set = "eEX eMS eGV eVL eDH eDP", name = "Eat, Gym, Cuddle" }, + { set = "eEX eMS eGV eVL eIN eDP", name = "Perfect Organized Cuddling" }, + { set = "eEX eMS eGV eVL eAS eDP", name = "The Routine Spider" }, -- aka eat, sleep, work, game + { set = "eEX eMS eGV eDH eIN eDP", name = "Perfectly Clean Cuddling" }, + { set = "eEX eMS eGV eDH eAS eDP", name = "Bedroom Gaming Feast with a Friend" }, + { set = "eEX eMS eGV eIN eAS eDP", name = "Humble Gamer's Feast with a Friend" }, + { set = "eEX eMS eVL eDH eIN eDP", name = "Organized Rosalina" }, + { set = "eEX eMS eVL eDH eAS eDP", name = "The Clean Spider" }, + { set = "eEX eMS eVL eIN eAS eDP", name = "The Spotless Spider" }, + { set = "eEX eMS eDH eIN eAS eDP", name = "Perfectly Clean Gaming Buddies" }, + { set = "eEX eGV eVL eDH eIN eDP", name = "Comfy Humble Gym Buddies" }, + { set = "eEX eGV eVL eDH eAS eDP", name = "The Bedroom Spider" }, + { set = "eEX eGV eVL eIN eAS eDP", name = "The Humble Spider" }, + { set = "eEX eGV eDH eIN eAS eDP", name = "Perfect Bedroom Gaming Buddies" }, + { set = "eEX eVL eDH eIN eAS eDP", name = "The Observational Spider" }, + { set = "eNH eMS eGV eVL eDH eDP", name = "Organized Bedroom Yoga" }, + { set = "eNH eMS eGV eVL eIN eDP", name = "Humble Workout Snack with a Friend" }, + { set = "eNH eMS eGV eVL eAS eDP", name = "Cuddling Game Dev's Snack" }, + { set = "eNH eMS eGV eDH eIN eDP", name = "Rold Smythy"}, + { set = "eNH eMS eGV eDH eAS eDP", name = "Gaming Den Cuddling Snack" }, + { set = "eNH eMS eGV eIN eAS eDP", name = "Humble Gamer Snack with a Friend" }, + { set = "eNH eMS eVL eDH eIN eDP", name = "Organized Observatory Yoga" }, + { set = "eNH eMS eVL eDH eAS eDP", name = "Chill Clean Gaming Buddies" }, + { set = "eNH eMS eVL eIN eAS eDP", name = "Spotless Chill Gaming Buddies" }, + { set = "eNH eMS eDH eIN eAS eDP", name = "Gaming Den Snack Memories" }, + { set = "eNH eGV eVL eDH eIN eDP", name = "Chill Cuddling Observatory" }, + { set = "eNH eGV eVL eDH eAS eDP", name = "Cuddly Game Dev in a Freezer" }, + { set = "eNH eGV eVL eIN eAS eDP", name = "Chill Humble Gaming Buddies" }, + { set = "eNH eGV eDH eIN eAS eDP", name = "Cool Mystical Observatory Cuddling" }, + { set = "eNH eVL eDH eIN eAS eDP", name = "Game Dev's Observatory Yoga" }, + { set = "eMS eGV eVL eDH eIN eDP", name = "Organized Cuddling Observatory" }, + { set = "eMS eGV eVL eDH eAS eDP", name = "Clean Cuddly Game Dev" }, + { set = "eMS eGV eVL eIN eAS eDP", name = "Spotless Cuddly Game Dev" }, + { set = "eMS eGV eDH eIN eAS eDP", name = "Spotless Gaming Den Cuddling" }, + { set = "eMS eVL eDH eIN eAS eDP", name = "Organized Friendly Mystical Observatory" }, + { set = "eGV eVL eDH eIN eAS eDP", name = "Cuddly Game Dev's Observatory" }, + -- no duo + { set = "eEX eNH eMS eGV eVL eDH", name = "Plain Cloudy Shower"}, + { set = "eEX eNH eMS eGV eVL eIN", name = "Plain Holy Shower"}, + { set = "eEX eNH eMS eGV eVL eAS", name = "Cloudy Holy Shower"}, + { set = "eEX eNH eMS eGV eDH eIN", name = "Plain Still Shower"}, + { set = "eEX eNH eMS eGV eDH eAS", name = "Still Cloudy Shower"}, + { set = "eEX eNH eMS eGV eIN eAS", name = "Still Holy Shower"}, + { set = "eEX eNH eMS eVL eDH eIN", name = "Plain Jacuzzi Shower"}, + { set = "eEX eNH eMS eVL eDH eAS", name = "God Gamer"}, + { set = "eEX eNH eMS eVL eIN eAS", name = "Holy Jacuzzi Shower"}, + { set = "eEX eNH eMS eDH eIN eAS", name = "Still Jacuzzi Shower"}, + { set = "eEX eNH eGV eVL eDH eIN", name = "Plain Clean Shower"}, + { set = "eEX eNH eGV eVL eDH eAS", name = "Clean Cloudy Shower"}, + { set = "eEX eNH eGV eVL eIN eAS", name = "Clean Holy Shower"}, + { set = "eEX eNH eGV eDH eIN eAS", name = "Clean Still Shower"}, + { set = "eEX eNH eVL eDH eIN eAS", name = "Clean Jacuzzi Shower"}, + { set = "eEX eMS eGV eVL eDH eIN", name = "Plain Warm Shower"}, + { set = "eEX eMS eGV eVL eDH eAS", name = "Warm Cloudy Shower"}, + { set = "eEX eMS eGV eVL eIN eAS", name = "Warm Holy Shower"}, + { set = "eEX eMS eGV eDH eIN eAS", name = "Warm Still Shower"}, + { set = "eEX eMS eVL eDH eIN eAS", name = "Warm Jacuzzi Shower"}, + { set = "eEX eGV eVL eDH eIN eAS", name = "Warm Clean Shower"}, + { set = "eNH eMS eGV eVL eDH eIN", name = "Plain Normal Shower"}, + { set = "eNH eMS eGV eVL eDH eAS", name = "Normal Cloudy Shower"}, + { set = "eNH eMS eGV eVL eIN eAS", name = "Normal Holy Shower"}, + { set = "eNH eMS eGV eDH eIN eAS", name = "Normal Still Shower"}, + { set = "eNH eMS eVL eDH eIN eAS", name = "Normal Jacuzzi Shower"}, + { set = "eNH eGV eVL eDH eIN eAS", name = "Normal Clean Shower"}, + { set = "eMS eGV eVL eDH eIN eAS", name = "Normal Warm Shower"}, + + --AS = Plain, EX = Normal, NH = Warm, MS = Clean, VL = Still, IN = Cloudy, DH = Holy, GV = Jacuzzi + -- 7 mods + { set = "eEX eNH eMS eGV eVL eDH eIN", name = "Plain Bath Water"}, + + { set = "eEX eNH eMS eGV eVL eDH eAS", name = "Cloudy Bath Water"}, -- clear e, cloudy, murky + { set = "eEX eNH eMS eGV eVL eDH eDP", name = "Plain Cloudy Shower With A Friend"}, + + { set = "eEX eNH eMS eGV eVL eIN eAS", name = "Holy Bath Water"}, -- sacred e, holy, unholy + { set = "eEX eNH eMS eGV eVL eIN eDP", name = "Plain Holy Shower With A Friend"}, + { set = "eEX eNH eMS eGV eVL eAS eDP", name = "Cloudy Holy Shower With A Friend"}, + + { set = "eEX eNH eMS eGV eDH eIN eAS", name = "Still Bath Water"}, -- still, calm e, turbulent + { set = "eEX eNH eMS eGV eDH eIN eDP", name = "Plain Still Shower With A Friend"}, + { set = "eEX eNH eMS eGV eDH eAS eDP", name = "Still Cloudy Shower With A Friend"}, + { set = "eEX eNH eMS eGV eIN eAS eDP", name = "Still Holy Shower With A Friend"}, + + { set = "eEX eNH eMS eVL eDH eIN eAS", name = "Jacuzzi Bath Water"}, -- jacuzzi, bubbly e, flat + { set = "eEX eNH eMS eVL eDH eIN eDP", name = "Plain Jacuzzi Shower With A Friend"}, + { set = "eEX eNH eMS eVL eDH eAS eDP", name = "God Gaming With A Friend"}, --would normally be Cloudy Jacuzzi Shower With A Friend + { set = "eEX eNH eMS eVL eIN eAS eDP", name = "Holy Jacuzzi Shower With A Friend"}, + { set = "eEX eNH eMS eDH eIN eAS eDP", name = "Still Jacuzzi Shower With A Friend"}, + + { set = "eEX eNH eGV eVL eDH eIN eAS", name = "Clean Bath Water"}, -- pure e, clean, dirty + { set = "eEX eNH eGV eVL eDH eIN eDP", name = "Plain Clean Shower With A Friend"}, + { set = "eEX eNH eGV eVL eDH eAS eDP", name = "Clean Cloudy Shower With A Friend"}, + { set = "eEX eNH eGV eVL eIN eAS eDP", name = "Clean Holy Shower With A Friend"}, + { set = "eEX eNH eGV eDH eIN eAS eDP", name = "Clean Still Shower With A Friend"}, + { set = "eEX eNH eVL eDH eIN eAS eDP", name = "Clean Jacuzzi Shower With A Friend"}, + + { set = "eEX eMS eGV eVL eDH eIN eAS", name = "Warm Bath Water"}, -- cool e, warm, hot + { set = "eEX eMS eGV eVL eDH eIN eDP", name = "Plain Warm Shower With A Friend"}, + { set = "eEX eMS eGV eVL eDH eAS eDP", name = "Warm Cloudy Shower With A Friend"}, + { set = "eEX eMS eGV eVL eIN eAS eDP", name = "Warm Holy Shower With A Friend"}, + { set = "eEX eMS eGV eDH eIN eAS eDP", name = "Warm Still Shower With A Friend"}, + { set = "eEX eMS eVL eDH eIN eAS eDP", name = "Warm Jacuzzi Shower With A Friend"}, + { set = "eEX eGV eVL eDH eIN eAS eDP", name = "Warm Clean Shower With A Friend"}, + + { set = "eNH eMS eGV eVL eDH eIN eAS", name = "Normal Bath Water"}, -- soft e, normal, hard ue, very hard + { set = "eNH eMS eGV eVL eDH eIN eDP", name = "Plain Normal Shower With A Friend"}, + { set = "eNH eMS eGV eVL eDH eAS eDP", name = "Normal Cloudy Shower With A Friend"}, + { set = "eNH eMS eGV eVL eIN eAS eDP", name = "Normal Holy Shower With A Friend"}, + { set = "eNH eMS eGV eDH eIN eAS eDP", name = "Normal Still Shower With A Friend"}, + { set = "eNH eMS eVL eDH eIN eAS eDP", name = "Normal Jacuzzi Shower With A Friend"}, + { set = "eNH eGV eVL eDH eIN eAS eDP", name = "Normal Clean Shower With A Friend"}, + { set = "eMS eGV eVL eDH eIN eAS eDP", name = "Normal Warm Shower With A Friend"}, + -- 8 mods + { set = "eEX eNH eMS eGV eVL eDH eIN eAS", name = "Bath Water"}, + { set = "eEX eNH eMS eGV eVL eDH eIN eDP", name = "Plain Bath With A Friend"}, + { set = "eEX eNH eMS eGV eVL eDH eAS eDP", name = "Cloudy Bath With A Friend"}, + { set = "eEX eNH eMS eGV eVL eIN eAS eDP", name = "Holy Bath With A Friend"}, + { set = "eEX eNH eMS eGV eDH eIN eAS eDP", name = "Still Bath With A Friend"}, + { set = "eEX eNH eMS eVL eDH eIN eAS eDP", name = "Jacuzzi Bath With A Friend"}, + { set = "eEX eNH eGV eVL eDH eIN eAS eDP", name = "Clean Bath With A Friend"}, + { set = "eEX eMS eGV eVL eDH eIN eAS eDP", name = "Warm Bath With A Friend"}, + { set = "eNH eMS eGV eVL eDH eIN eAS eDP", name = "Normal Bath With A Friend"}, + -- 9 mods + { set = "eEX eNH eMS eGV eVL eDH eIN eAS eDP", name = "Bath With A Friend"}, +} + +for _, sets in next, d do + for i = 1, #sets do + local cmb = sets[i] + cmb.name = '"' .. cmb.name:upper() .. '"' + local cmbStr = table.concat(TABLE.sort(cmb.set:trim():split('%s+', true)), ' ') + sets[cmbStr] = sets[cmbStr] or cmb + end +end + +return d diff --git a/module/devCommentaryLink.lua b/data/devCommentaryLink.lua similarity index 91% rename from module/devCommentaryLink.lua rename to data/devCommentaryLink.lua index e0f925c5..315f7fe2 100644 --- a/module/devCommentaryLink.lua +++ b/data/devCommentaryLink.lua @@ -11,5 +11,6 @@ return { ['eEX eGV uVL eDH'] = "https://www.nationalchurchillmuseum.org/never-give-in-never-never-never.html#:~:text=You%20cannot%20tell,of%20the%20enemy.", ['eNH eMS eGV eDH eIN eDP'] = "https://www.youtube.com/watch?v=dQw4w9WgXcQ", ['uEX eNH eMS eGV eDH eIN eAS eDP'] = "https://tenor.com/view/alien-stage-alien-stage-karma-vivinos-qmeng-mizisua-gif-10286800856421634964", - ['eIN'] = "https://github.com/MrZ626/ZenithClicker/commit/4429e7123a4e8b5caf54e30e10d7df81cf11199d" + ['eIN'] = "https://github.com/MrZ626/ZenithClicker/commit/4429e7123a4e8b5caf54e30e10d7df81cf11199d", + ['eEX uGV eDH eAS'] = "https://www.youtube.com/shorts/zcX4Pf6Lmlk", } \ No newline at end of file diff --git a/module/devCommentary.lua b/data/devcommentary.lua similarity index 94% rename from module/devCommentary.lua rename to data/devcommentary.lua index 48ecab72..6c43db79 100644 --- a/module/devCommentary.lua +++ b/data/devcommentary.lua @@ -277,11 +277,20 @@ return { Empurple, an original combo from ZC community. Main difficulty should come from "hard mode" of reverse mod, reducing XP you could get. ]], + ['rMS rGV rIN'] = STRING.trimIndent [[ + The Masterful Juggler, an original combo from ZC community. + Combined with the target "Highest B2B chain reached", this makes more sense. + ]], ['rNH MS rGV AS'] = STRING.trimIndent [[ Autoplay is Awesome, an original combo from ZC community. This achievement replaced "Patience is a Virtue" with mods specified, which makes it play much better. Well, it does in vanilla, but here I (Trevor), kept it as is due to "But It Isn't One Of Mine" ]], + ['EX NH MS VL rAS'] = STRING.trimIndent [[ + Faltered, an original combo from ZC community. + This is actually a multitask challenge. No surge forces imperfect passes, which send 0 with rAS. + So you just count to 4 while finding cards in shuffled deck. + ]], ['DH AS DP'] = STRING.trimIndent [[ A Mutual Agreement, an original combo from ZC community. This was changed from "Honeymoon" with a better title, it had same target but without mods limit. @@ -301,10 +310,6 @@ return { Playing "without losing a rank" with EX VL fits so well with the community combo "Icarus"'s myth story. It's so unbelievable that it successfully combines mod combo & rank system & texts and plays interesting. ]], - ['rMS rGV rIN'] = STRING.trimIndent [[ - The Masterful Juggler, an original combo from ZC community. - Combined with the target "Highest B2B chain reached", this makes more sense. - ]], ['DH rIN AS'] = STRING.trimIndent [[ The Oblivious Artist, an original combo from ZC community. This one was "doing the inverse first", but I felt it sounds too forcing, so it got changed to this. @@ -313,6 +318,10 @@ return { Zero-to-sixty, an original combo from ZC community. Though this combo includes AS, it's actually easier to play with mouse lol ]], + ['VL IN AS'] = STRING.trimIndent [[ + Under The Radar, an original combo from ZC community. + "What's the exact condition of entering Gigaspeed?" + ]], ['rNH MS DP'] = STRING.trimIndent [[ Scarcity Mindset, an original combo from ZC community. This is more complex and interesting than psychokinesis, the only regret is that we cannot play this with 3 nexts... @@ -387,6 +396,29 @@ return { You're going too fast.... They're coming for me. Run, climb while you still can! Whatever you do, DON'T STOP CLIMBIN' AND CLIMBIN' AND CLIMBIN' AND CLI— ]], + ['eEX NH MS GV eVL DH IN eAS DP'] = STRING.trimIndent [[ + The Swamped Smithy, because, well, I'm Trevor Smithy and I'm... kinda stressed out sometimes. + Mistakes are easy to make and hard to fix, and it's a bit much, ya know? Add to that the pressures of work, + chores, and taking care of myself, and it can be quite the handful to overcome. + Who could've guessed that achieving a balanced lifestyle, and maintaining a healthy routine can be so hard? + ]], + ['ueEX NH MS GV eVL DH IN eAS DP'] = STRING.trimIndent [[ + The Bogged-Down Smithy, because, well, I'm Trevor Smithy and lately I've been feeling a bit stuck. + This project has been my driving force, my motivation, and now it's nearly done. What will I do now? + I guess I'll have to just keep on going, pulling myself forward. If I wait around too long, I'll never get anything done. + ]], + ['eEX rNH rMS rGV eVL rDH rIN eAS rDP'] = STRING.trimIndent [[ + The Overwhelemed Smithy, because, well, I'm Trevor Smithy and I feel like I get overwhelmed easily. + Too many things happening at once, too many conditions to handle, too many things to account for with my plans. + Makes it necessary to step back and determine what's truly important, what truly necessitates my attention. + Some things have to be discarded in order to clear a path to your goals. + ]], + ['eEX uNH uMS uGV eVL uDH uIN eAS uDP'] = STRING.trimIndent [[ + The Paralyzed Smithy, because, well, you know how sometimes you get stuck? Like, not just lost. + Truly, genuinely stuck, with no idea of what you want to do next, or no idea of how you'd get to a point where you would. + I guess, after all this, I've come to realize that eventually you just have to accept that things won't get done if... + well, if you don't do them. And that's okay. Not every project has to finished, not every dream seen through. + ]], --one of mine ['eEX uGV eDH eAS'] = STRING.trimIndent [[ But It Isn't One Of Mine, the Easy Mode counterpart to the Patience Is A Virtue achievement. @@ -494,7 +526,7 @@ return { *silence* - Looking for a game to capture - ]], - -- Future achievement update + -- v1.1 -- Easy Mods ['eEX'] = STRING.trimIndent [[ Easy Mode, aka "Easy", originally softlocked the game in 0.2.0 if you tried to select it. 0.3.0's release made it the 4th eMod @@ -558,7 +590,6 @@ return { ]], -- Profligacy ueEX, eNH+J, fastest time to floor 10 -- Diogenes Syndrome ueEX, eMS+eJ, fastest time to floor 10 - -- Dysania ueEX, eGV+S, fastest time to floor 10 ['ueEX eGV'] = STRING.trimIndent [[ "You're up early." "HEY, BUDDY. HOW'S IT GOING?" "Woah! Yo what?" "WHAT?" "Why is your voice so deep?" "OH IT'S JUST A LITTLE DEEPER IN THE MORNING. YOURS DOESN'T DO THAT?" diff --git a/data/devscore.lua b/data/devscore.lua new file mode 100644 index 00000000..c433eb43 --- /dev/null +++ b/data/devscore.lua @@ -0,0 +1,33 @@ +local d = {ASMSrDHrIN=848.9,swamp_water_lite_plus=4878.84,swamp_water_plus=2714.92,talentless=7817.15,quest_rationing=631.02,the_responsible_one=18,the_unreliable_one=14,the_responsible_one_plus=144,guardian_angel=6061.19,carried=5528.27,level_19_cap=7207.94,the_escape_artist=132,the_artist_trinity=503.8,fel_magic=107,empurple=2919.81,autoplay_is_awesome=1658.4,spotless=2916.6,a_mutual_agreement=3620.9,the_cheaters=1786.5,overprotection=1986.85,clutch_main=191,sunk_cost=4278.1,wax_wings=2412.74,the_masterful_juggler=122,the_oblivious_artist=172,zero_to_sixty=5.4,speed_bonus=10,under_the_radar=119.726,arrogance=772.74,scarcity_mindset=57,detail_oriented=0,psychokinesis=1692,divine_rejection=1649.9,moon_struck=0,lovers_promise=10598.95,hardcore_beginning=13.88,love_hotel=2.597011165,financially_responsible=5.898309714,unfair_battle=4.344901018,museum_heist=2.4841288230001,workaholic=2.3799148589999,human_experiment=2.733007991,thermal_anomaly=0.467,ultra_dash=0.496,identity=0,the_perfectionist=8310.52,cruise_control=23,dazed=16,drag_racing=29,space_race=209,fickle_fuel=851.3,the_spike_of_all_time_plus=498,blight=7733.35,desolation=6284.45,havoc=3656.14,pandemonium=3481.3,inferno=2875.1,purgatory=1840,perdition=1624.7,cataclysm=1395.49,annihilation=777.19,armageddon=423.31,abyss=196.02,cut_off=0,worn_out=0,the_harbinger=0,final_defiance=0,speedrun_speedrunning=0,abyss_weaver=0,royal_resistance=0,lovers_stand=0,romantic_homicide=0,benevolent_ambition=0,blazing_speed=0,dusty_memories=0,its_kinda_rare=0,fruitless_effort=0,false_god=0,respectful=0,zenith_relocation=0,intended_glitch=0,lucky_coincidence=0,zenith_traveler=0,dark_force=0,return_to_the_light=true,smooth_dismount=0,naga_eyes=26.456631063,clicker_speedrun=15.466656532,zenith_explorer_plus=18681.62,zenith_explorer=10666.27,plonk=148.99,speed_player=6735,rMS=3982.7,rNH=6282.1,rVL=6036.9,DH=9644.52,elegance=443220,clicker=1144046,perfect_speedrun=23.747579831,VL=11377.6,NH=10586.4,MS=6326.3,IN=10929.7,GV=10604.39,EX=8612.63,DP=10598.95,contender=10266,AS=18681.62,garbage_offensive=2239880,tower_climber=6651015.7,tower_regular=31857,rIN=5503.13,rGV=8520,rEX=2807.73,rDP=3980.74,rDH=4273.85,rAS=13294.7,supercharged=288,supercharged_plus=447,multitasker=61866.8,effective=41446.887071386,zenith_speedrun=48.891,zenith_speedrun_plus=28.87,zenith_challenger=97361.9,divine_challenger=54681.7,zenith_speedrunner=480.712,divine_speedrunner=691.846,the_spike_of_all_time=437,the_spike_of_all_time_minus=192,clock_out=874,vip_list=126,GVIN=9358.41,ASNH=14508.3,DPEX=5417.82,GVNH=8373.29,DHMSNH=7020.5,DHEXNH=6784.1,DHEXMSVL=2766.57,ASEXVL=4432.7,swamp_water_lite=4878.84,swamp_water=2985.03,rGVrIN=6076.5,EXNHrAS=5891.7,INrASrDHrNH=2711.9,DHEXrGV=6096.52,EXGVNHrMS=2860.57,ASDPGVrMSrNH=2005.6,DHrEXrVL=1664.66,ASGVrDPrMS=1853.87,NHVLrDPrGV=2178.42,VLrEXrIN=1688.17,rDPrEX=2279.1,INMSrDHrEX=1244.64, +--deleted MrZ score + patience_is_a_virtue=2627.37, +-- Trevor Smithy Dev scores + --Easy Mode (v1.0) (No CR) + programmer_gamer=42909.0,one_of_mine=26856.9,ggbw=69085.8,perfect_speedrun_plus=361.02,perfectly_balanced=10783.0,peasant_revolution=15511.8,holy_ascention=4814.9,stabilized_entropy=3115.4,restrained_collapse=17205.3,restored_volition=8606.7,disproven_blasphemy=5223.9,solved_paradox=4103.1,demystified_grimoire=17952.5,restored_eden=2650.3,your_too_fast=187, + --Easy Mods (v1.1) (No CR) + eEX=2405.8,eNH=2921.1,eMS=2805.6,eGV=3584.5,eVL=6687.3,eDH=14814.9,eIN=6097.8,eAS=22177.6,eDP=4751.4, + --Uneasy Easy Mods (v1.1) (No CR) + ueEX=255.55,ueEXeNH=273.50,ueEXeMS=269.57,ueEXeGV=241.6,ueEXeVL=206.59,ueEXeDH=357.59,ueEXeIN=240.77,ueEXeAS=130.82,ueEXeDP=262.65, + --Easy Mode - Special (v1.1) (No CR) + emperor_development=13.23,quest_feast=281.00,best_friends=101,humble_pupil=5.67,shameless_cashgrab=130,overweight_gamer=69,clean_gamer=319,clean_break=312,professional_cleaner=100,rold_smythy=520, +} +-- Trevor Smithy Placeholder Dev Scores +d["-3"] = 26000 +d["-4"] = 26000*2 +d["-5"] = 26000*3 +d["-6"] = 26000*4 +d["-7"] = 26000*5 +d["-8"] = 26000*6 +d["-9"] = 26000*7 + +d.contender = 6200 +d.clicker = 620e3 +d.elegance = 260e3 +d.garbage_offensive = 1260e3 +d.tower_climber = 4200e3 +d.tower_regular = 2e4 +d.speed_player = 2600 +d.clock_out = 420 +d.vip_list = 42 + +return d diff --git a/data/fatigue.lua b/data/fatigue.lua new file mode 100644 index 00000000..b3de1dab --- /dev/null +++ b/data/fatigue.lua @@ -0,0 +1,120 @@ +local d = {} + +d.normal = { + { time = 90, event = { 'extraQuestBase', .2, 'animDuration', .5 } }, + { time = 180, event = { 'extraQuestBase', .2, 'animDuration', .5 } }, + { time = 240, event = { 'extraQuestBase', .2, 'animDuration', 1 } }, + { time = 300, event = { 'dmgTimerMul', -.1, 'animDuration', 1 }, text = "FATIGUE SETS IN_", desc = "TimerSpeed++" }, + { time = 330, event = { 'dmgCycle', -.5, 'dmgWrong', 1 }, text = "YOUR BODY GROWS WEAK_", desc = "DmgCycle-- Damage++" }, + { time = 360, event = { 'dmgTimerMul', -.1, 'dmgHeal', -1, 'animDuration', 1 }, text = "ALL SENSES BLUR TOGETHER_", desc = "TimerSpeed++ Heal--" }, + { time = 390, event = { 'dmgTimerMul', -.1, 'dmgWrong', 1 }, text = "YOUR CONSCIOUSNESS FADES_", desc = "TimerSpeed++ Damage++" }, + { time = 420, event = { 'dmgTimerMul', -.05, 'dmgCycle', -.5, 'animDuration', 1 }, text = "THIS IS THE END.", desc = "TimerSpeed++ DmgCycle--", final = true }, + { time = 422, event = { 'dmgTimerMul', -.05 } }, + { time = 425, event = { 'dmgTimerMul', -.05 } }, + { time = 430, event = { 'dmgTimerMul', -.05 } }, + { time = 480, event = { 'atkBufferCap', 6, 'animDuration', 2, 'maxQuestSize', 1 }, text = "FAREWELL.", desc = "QuestDifficulty++++++", duration = 26, color = 'lB', }, + { time = 485, event = { 'atkBufferCap', 6, 'animDuration', 4, 'extraQuestVar', 1 } }, + { time = 490, event = { 'atkBufferCap', 6, 'animDuration', 4 } }, + { time = 500, event = { 'animDuration', 5 }, --[[21]] }, + { time = 510, event = { 'animDuration', 5 }, --[[26]] text = "" }, + { time = 520, event = { 'animDuration', 10, 'lifeLeak', .2 }, --[[36]] text = "ANGINA.", desc = "HP leak", color = 'DR' }, + { time = 540, event = { 'animDuration', 12 }, --[[48]] }, + { time = 560, event = { 'animDuration', 14 }, --[[62]] text = "" }, + { time = 1e99 }, -- Total: dmgTimerMul-50%, Cycle-1, Wrong+2, killscreen at 520+100(150)s +} + +d.rEX = { + { time = 90, event = { 'extraQuestBase', .2, 'animDuration', .5 } }, + { time = 180, event = { 'extraQuestBase', .2, 'animDuration', .5 } }, + { time = 240, event = { 'extraQuestBase', .2, 'animDuration', 1 } }, + { time = 240, event = { 'dmgTimerMul', -.2 }, text = "YOUR POWER SLIPS_", desc = "TimerSpeed++" }, + { time = 270, event = { 'dmgWrong', 2 }, text = "WHISPERS OF DISCONTENT SPREAD_", desc = "Damage++" }, + { time = 300, event = { 'dmgCycle', -1, 'animDuration', 1 }, text = "PROTESTERS LINE THE STREETS_", desc = "DmgCycle--" }, + { time = 330, event = { 'dmgTimerMul', -.2, 'dmgWrong', 2 }, text = "YOUR CLOSEST ALLIES DEFECT_", desc = "TimerSpeed++ Damage++" }, + { time = 360, event = { 'dmgTimerMul', -.1, 'dmgHeal', -1, 'animDuration', 1 }, text = "PARANOIA CLOUDS YOUR JUDGEMENT_", desc = "TimerSpeed++ Heal--" }, + { time = 362, event = { 'dmgTimerMul', -.05 } }, + { time = 365, event = { 'dmgTimerMul', -.05 } }, + { time = 390, event = { 'dmgCycle', -.5, 'dmgWrong', 1 }, text = "THE REVOLUTION HAS BEGUN_", desc = "DmgCycle-- Damage++" }, + { time = 420, event = { 'dmgTimerMul', -.1, 'animDuration', 1 }, text = "THE END OF AN ERA.", desc = "TimerSpeed++++", duration = 10, final = true }, + { time = 423, event = { 'dmgTimerMul', -.05 } }, + { time = 426, event = { 'dmgTimerMul', -.05 } }, + { time = 430, event = { 'dmgTimerMul', -.05 } }, + { time = 435, event = { 'dmgTimerMul', -.03 } }, + { time = 440, event = { 'dmgTimerMul', -.02, 'lifeLeak', .5 }, text = "BLACK OUT.", desc = "HP leak", color = 'DR' }, + { time = 1e99 }, -- Total: dmgTimerMul-90%, Cycle-1.5, Wrong+5, killscreen at 440+40(60)s +} + +d.rDP = { + { time = 20, event = { 'dmgHeal', -1 }, --[[ 2 ]] text = "YOUR PASSION FADES_", desc = "Heal-", duration = 10 }, + { time = 40, event = { 'dmgHeal', -.5 }, --[[ 1.5 ]] text = "THEIR REPLIES BECOME LESS ENGAGED_", desc = "Heal--", duration = 10 }, + { time = 60, event = { 'dmgHeal', -.5, 'animDuration', .5 }, --[[ 1 ]] text = "YOU FEEL NEGLECTED_", desc = "Heal---", duration = 10 }, + { time = 80, event = { 'dmgHeal', 1 }, --[[ 2 ]] text = "THEY SUCCESSFULLY APOLOGIZE_?", desc = "Heal+", duration = 10, color = 'lO' }, + { time = 90, event = { 'extraQuestBase', .2 } }, + { time = 100, event = { 'dmgHeal', 1 }, --[[ 3 ]] text = "THINGS ARE BACK TO HOW THEY USED TO BE_!", desc = "Heal+++", duration = 10, color = 'lO' }, + { time = 120, event = { 'dmgHeal', -1, 'animDuration', .5 }, --[[ 2 ]] text = "MINOR ISSUES BECOME LARGE CONFLICTS_", desc = "Heal--", duration = 10 }, + { time = 140, event = { 'dmgHeal', -1 }, --[[ 1 ]] text = "YOU BLAME THEM FOR YOUR OWN PROBLEMS_", desc = "Heal---", duration = 10 }, + { time = 160, event = { 'reviveDifficulty', 3 }, text = "THEY WOULD RATHER SPEND TIME ALONE_", desc = "Revive++", duration = 10 }, + { time = 180, event = { 'extraQuestBase', .2 } }, + { time = 180, event = { 'dmgHeal', 1.5, 'animDuration', 1 }, --[[ 2.5 ]] text = "YOU PROMISE TO CHANGE_", desc = "Heal++", duration = 10, color = 'lO' }, + { time = 200, event = { 'dmgTimerMul', -.2 }, text = "PROMISES ARE BROKEN_", desc = "TimerSpeed++", duration = 10 }, + { time = 220, event = { 'dmgHeal', -.5 }, --[[ 2 ]] text = "CONVERSATIONS DEVOLVE TO SHOUTING MATCHES_", desc = "Heal---", duration = 10 }, + { time = 240, event = { 'extraQuestBase', .2, 'animDuration', 1 } }, + { time = 240, event = { 'dmgHeal', -.5 }, --[[ 1.5 ]] text = "ALL TRUST HAS WITHERED AWAY_", desc = "Heal--", duration = 10 }, + { time = 260, event = { 'dmgHeal', -.5 }, --[[ 1 ]] text = "THEY SET AN ULTIMATUM_", desc = "Heal--", duration = 10 }, + { time = 280, event = { 'dmgHeal', -.5 }, --[[ .5 ]] text = "YOU CAN'T BE BOTHERED ANYMORE_", desc = "Heal--", duration = 10 }, + { time = 300, event = { 'dmgWrong', 2, 'animDuration', 1 }, text = "ONE LAST PAINFUL ARGUMENT_", desc = "Dmg+", duration = 10 }, + { time = 320, event = { 'reviveDifficulty', 9999 }, text = "GOODBYE.", desc = "NO REVIVE", duration = 10, color = 'R' }, + { time = 360, event = { 'dmgHeal', 1, 'animDuration', 1 }, --[[ 1.5 ]] text = "\"I MISS YOU\"", desc = "Heal+++", duration = 10, color = 'lO' }, + { time = 380, event = { 'dmgHeal', 1 }, --[[ 2.5 ]] text = "MAYBE IT CAN STILL WORK_?", desc = "Heal+", duration = 10, color = 'lO' }, + { time = 400, event = { 'dmgTimerMul', -.1, 'animDuration', 4 }, text = "GOODBYE.", desc = "TimerSpeed++++", duration = 10, final = true }, + { time = 405, event = { 'dmgTimerMul', -.05 } }, + { time = 410, event = { 'dmgTimerMul', -.05 } }, + { time = 415, event = { 'dmgTimerMul', -.05 } }, + { time = 420, event = { 'dmgTimerMul', -.03 } }, + { time = 425, event = { 'dmgTimerMul', -.02 } }, + { time = 476, event = { 'lifeLeak', .2 }, text = "CARDIAC RUPTURE.", desc = "HP leak", color = 'DR' }, + { time = 1e99 }, -- Total: dmgTimerMul-50%, killscreen at 476+150s +} + +-- Trevor Smithy +d.eEX = { + { time = 90, event = { 'extraQuestBase', .2, 'animDuration', .5 } }, + { time = 180, event = { 'extraQuestBase', .2, 'animDuration', .5 } }, + { time = 240, event = { 'extraQuestBase', .2, 'animDuration', 1 } }, + { time = 360, event = { 'dmgTimerMul', -.1, 'animDuration', 1 }, text = "FATIGUE SETS IN_", desc = "TimerSpeed++" }, + { time = 390, event = { 'dmgCycle', -.5, 'dmgWrong', 1 }, text = "YOUR BODY GROWS WEAK_", desc = "DmgCycle-- Damage++" }, + { time = 420, event = { 'dmgTimerMul', -.1, 'dmgHeal', -1, 'animDuration', 1 }, text = "ALL SENSES BLUR TOGETHER_", desc = "TimerSpeed++ Heal--" }, + { time = 450, event = { 'dmgTimerMul', -.1, 'dmgWrong', 1 }, text = "YOUR CONSCIOUSNESS FADES_", desc = "TimerSpeed++ Damage++" }, + { time = 480, event = { 'dmgTimerMul', -.05, 'dmgCycle', -.5, 'animDuration', 1 }, text = "THIS IS THE END.", desc = "TimerSpeed++ DmgCycle--" }, + { time = 482, event = { 'dmgTimerMul', -.05 } }, + { time = 485, event = { 'dmgTimerMul', -.05 } }, + { time = 490, event = { 'dmgTimerMul', -.05 } }, + { time = 540, event = { 'atkBufferCap', 6, 'animDuration', 1, 'maxQuestSize', 1 }, text = "FAREWELL.", desc = "QuestDifficulty++++++", duration = 26, color = 'lB', }, + { time = 545, event = { 'atkBufferCap', 6, 'animDuration', 3, 'extraQuestVar', 1 } }, + { time = 550, event = { 'atkBufferCap', 6, 'animDuration', 5 } }, + { time = 570, event = { 'animDuration', 11 }, --[[26]] text = "" }, + { time = 600, event = { 'animDuration', 16 }, --[[42]] text = "" }, + { time = 630, event = { 'animDuration', 20 }, --[[62]] text = "" }, + { time = 660, event = { 'animDuration', 64 }, --[[126]] text = "YOUR VISION WEAKENS_", desc = "QuestSpeed------", duration = 26, color = 'lB', }, + { time = 750, event = { 'animDuration', -16, 'dmgHeal', 1 }, --[[110]] text = "YOU'RE STILL GOING?", desc = "QuestSpeed++++, Heal++", duration = 26, color = 'lB', }, + { time = 840, event = { 'atkBufferCap', 6, 'extraQuestVar', 1, 'maxQuestSize', 1 }, text = "IT'S TIME TO STOP!", desc = "QuestDifficulty++++++", duration = 26, color = 'lB', final = true }, + { time = 870, event = { 'extraQuestBase', .01 }, text = "YOU FEEL THE IMPENDING DOOM_", desc = "30 Seconds Remain", duration = 12, color = 'lB', }, + { time = 885, event = { 'extraQuestBase', .01 }, text = "DIE!", desc = "15 Seconds Remain", duration = 4, color = 'lB', }, + { time = 890, event = { 'extraQuestBase', .01 }, text = "DIE!", desc = "10 Seconds Remain", duration = 0.5, color = 'lB', }, + { time = 891, event = { 'extraQuestBase', .01 }, text = "DIE!", desc = "9 Seconds Remain", duration = 0.5, color = 'lB', }, + { time = 892, event = { 'extraQuestBase', .01 }, text = "DIE!", desc = "8 Seconds Remain", duration = 0.5, color = 'lB', }, + { time = 893, event = { 'extraQuestBase', .01 }, text = "DIE!", desc = "7 Seconds Remain", duration = 0.5, color = 'lB', }, + { time = 894, event = { 'extraQuestBase', .01 }, text = "DIE!", desc = "6 Seconds Remain", duration = 0.5, color = 'lB', }, + { time = 895, event = { 'extraQuestBase', .01 }, text = "DIE!", desc = "5 Seconds Remain", duration = 0.5, color = 'lB', }, + { time = 896, event = { 'extraQuestBase', .01 }, text = "DIE!", desc = "4 Seconds Remain", duration = 0.5, color = 'lB', }, + { time = 897, event = { 'extraQuestBase', .01 }, text = "DIE!", desc = "3 Seconds Remain", duration = 0.5, color = 'lB', }, + { time = 898, event = { 'extraQuestBase', .01 }, text = "DIE!", desc = "2 Seconds Remain", duration = 0.5, color = 'lB', }, + { time = 899, event = { 'extraQuestBase', .01 }, text = "DIE!", desc = "1 Second Remains", duration = 0.5, color = 'lB', }, + { time = 900, event = { 'dmgCycle', -3.99, 'dmgTimerMul', -.49, 'dmgTime', 666 }, text = "Thank you so much for playing my mod!", desc = "WAH-BAAM!", duration = 26, color = 'lB', }, + { time = 1e99 }, -- Total: dmgTimerMul-50%, Cycle-1, Wrong+2, killscreen at 900+5 with eNH +} + +-- My formatter doesn't work if there's "…" inside +for _, f in next, d do for _, v in next, f do if v.text then v.text = v.text:gsub("_", "…") end end end + +return d diff --git a/data/mod.lua b/data/mod.lua new file mode 100644 index 00000000..acafb77c --- /dev/null +++ b/data/mod.lua @@ -0,0 +1,256 @@ +return { + deck = { + { id = 'EX', initOrder = 1, lockfull = false }, + { id = 'NH', initOrder = 2, lockfull = true }, + { id = 'MS', initOrder = 3, lockfull = true }, + { id = 'GV', initOrder = 4, lockfull = true }, + { id = 'VL', initOrder = 5, lockfull = true }, + { id = 'DH', initOrder = 6, lockfull = true }, + { id = 'IN', initOrder = 7, lockfull = true }, + { id = 'AS', initOrder = 8, lockfull = true }, + { id = 'DP', initOrder = 9, lockfull = false }, + }, + name = { + EX = 'expert', + NH = 'nohold', + MS = 'messy', + GV = 'gravity', + VL = 'volatile', + DH = 'doublehole', + IN = 'invisible', + AS = 'allspin', + DP = 'duo', + }, + fullName = { + EX = "< EXPERT MODE >", + NH = "< NO HOLD >", + MS = "< MESSINESS >", + GV = "< GRAVITY >", + VL = "< VOLATILITY >", + DH = "< DOUBLE HOLE >", + IN = "< INVISIBLE >", + AS = "< ALL-SPIN >", + DP = "< DUO >", + lock = "< LOCKED >", + lockDP = "< LOCKED? >", + }, + desc = { + EX = "A LESS LENIENT CHALLENGE, FOR THOSE WHO DARE", + NH = "CANCELING IS DISABLED", + MS = "SHUFFLE CARDS BY FLOOR", + GV = "AUTO COMMITS OCCUR PERIODICALLY", + VL = "LARGER GAPS BETWEEN CARDS, MUST CLICK TWICE", + DH = "COMBO DIFFICULTY IS INCREASED", + IN = "CARDS ARE FACED DOWN AND FLASH ONCE EVERY TWO SECONDS", + AS = "ENABLE KEYBOARD CONTROLS, BUT DOUBLE CLICKING IS PENALIZED", + DP = "FLOOD THE TOWER WITH SOMEONE WHO DOESN'T EXIST", + lock = "REACH A HIGHER FLOOR TO UNLOCK", + lockDP = "PLAY THIS MOD ONCE TO UNLOCK", + }, + revName = { + EX = "> THE TYRANT <", + NH = "> ASCETICISM <", + MS = "> LOADED DICE <", + GV = "> FREEFALL <", + VL = "> LAST STAND <", + DH = "> DAMNATION <", + IN = "> THE EXILE <", + AS = "> THE WARLOCK <", + DP = "> BLEEDING HEARTS <", + }, + revDesc = { + EX = "FEAR, OPPRESSION, AND LIMITLESS AMBITION", + NH = "A DETACHMENT FROM EVEN THAT WHICH IS MODERATE", + MS = "IN A RIGGED GAME, YOUR MIND IS THE ONLY FAIR ADVANTAGE", + GV = "THE GROUND YOU STOOD ON NEVER EXISTED IN THE FIRST PLACE", + VL = "STRENGTH ISN'T NECESSARY FOR THOSE WITH NOTHING TO LOSE", + DH = "NEITHER THE FREEDOM OF LIFE OR PEACE OF DEATH", + IN = "NEVER UNDERESTIMATE BLIND FAITH", + AS = "INTO REALMS BEYOND HEAVEN AND EARTH", + DP = "EVEN AS WE BLEED, WE KEEP HOLDING ON...", + }, + ultraName = { + EX = "- PSYCHOTIC SOVEREIGN -", + NH = "- ASCENDED VIRTUE -", + MS = "- ENTROPY -", + GV = "- COLLAPSING GALAXY -", + VL = "- DIMINISHING VOLITION -", + DH = "- BLASPHEMY -", + IN = "- PARADOXICAL NIHILITY -", + AS = "- DEPRAVED GRIMOIRE -", + DP = "- SEVERED EDEN -", + }, + ultraDesc = { + EX = "ROTTEN AUTHORITY AND UNJUST LAW, USURPED THY MORAL AND PEASANTRY", + NH = "FOR THY SACRIFICES, TRANSCENDENCE AWAITS, MORTAL...", + MS = "A DISTORTED FATE RESULTED FROM UNGOVERNED ENIGMATA", + GV = "THE UNIVERSE CRUMBLES, WITH ESCAPE MERELY TEMPORARY", + VL = "CRUSHED BENEATH DESPAIR, RESISTANCE FADES TO NOTHING", + DH = "HARK! THE HOPELESS, DAMNED WEEPING OF THY WILL...", + IN = "ETERNALLY DROWNING IN ENIGMATIC DOUBTS, UNCERTAINTY AND HYSTERIA", + AS = "ILL-NATURED, TENEBRIOUS, LIFE-DRAINING MAGIC CLASPS THY SOUL...", + DP = "WHAT ONCE WAS INTERTWINED NOW NEVER TO COEXIST", + }, + ultraImpactTone = { + EX = { 0, nil, 0 }, -- 6 6 + NH = { 0, 5 }, -- 6 2 + MS = { 3, 5, 7 }, -- 1 2 3 + GV = { -4, 8 }, -- 4 4 + VL = { -5, 0 }, -- 3 6 + DH = { 1, 6, 9 }, -- #6 #2 #4 + IN = {}, + AS = { 0, 3 }, -- 6 1 + DP = { -2, 5 }, -- 5 2 + }, + weight = { + EX = 13, -- 8 + 5 + NH = 12, -- 8 + 4 + MS = 14, -- 10 + 4 + GV = 12, -- 10 + 2 + VL = 17, -- 15 + 2 + DH = 12, -- 8 + 4 + IN = 7, -- 6 + 1 + AS = 13, -- 10 + 3 + DP = 4, -- 3 + 1 + }, + color = { + EX = { COLOR.HEX "89590BFF" }, + NH = { COLOR.HEX "FF00D4FF" }, + MS = { COLOR.HEX "FFB400FF" }, + GV = { COLOR.HEX "FFFF00FF" }, + VL = { COLOR.HEX "FF1500FF" }, + DH = { COLOR.HEX "47ACFFFF" }, + IN = { COLOR.HEX "BD24FFFF" }, + AS = { COLOR.HEX "00FED4FF" }, + DP = { COLOR.HEX "FF8C9DFF" }, + }, + textColor = { + EX = { COLOR.HEX "C29F68FF" }, + NH = { COLOR.HEX "FF98E2FF" }, + MS = { COLOR.HEX "FFD572FF" }, + GV = { COLOR.HEX "EDFF96FF" }, + VL = { COLOR.HEX "FF978DFF" }, + DH = { COLOR.HEX "99D0FFFF" }, + IN = { COLOR.HEX "D3AAFFFF" }, + AS = { COLOR.HEX "8AFFDEFF" }, + DP = { COLOR.HEX "FFC0C9FF" }, + eEX = { COLOR.HEX "C29F68FF" }, + eNH = { COLOR.HEX "FF98E2FF" }, + eMS = { COLOR.HEX "FFD572FF" }, + eGV = { COLOR.HEX "EDFF96FF" }, + eVL = { COLOR.HEX "FF978DFF" }, + eDH = { COLOR.HEX "99D0FFFF" }, + eIN = { COLOR.HEX "D3AAFFFF" }, + eAS = { COLOR.HEX "8AFFDEFF" }, + eDP = { COLOR.HEX "FFC0C9FF" }, + }, + prio_name = { IN = 1, MS = 3, VL = 5, NH = 7, DH = 9, AS = 11, GV = 13, EX = 15, DP = 18, rIN = 1, rMS = 3, rVL = 5, rNH = 7, rDH = 9, rAS = 11, rGV = 13, rEX = 15, rDP = 16, eEX = 0, eIN = 2, eMS = 4, eVL = 6, eNH = 8, eDH = 10, eGV = 12, eDP = 14, eAS = 17 }, + prio_icon = { EX = 0, DP = 1, DH = 2, VL = 3, GV = 4, NH = 5, MS = 6, IN = 7, AS = 8, rEX = 0, rDP = 1, rDH = 2, rVL = 3, rGV = 4, rNH = 5, rMS = 6, rIN = 7, rAS = 8, eEX = 0, eDP = 1, eDH = 2, eVL = 3, eGV = 4, eNH = 5, eMS = 6, eIN = 7, eAS = 8 }, + prio_card = { EX = 0, NH = 1, MS = 2, GV = 3, VL = 4, DH = 5, IN = 6, AS = 7, DP = 8, rEX = 0, rNH = 1, rMS = 2, rGV = 3, rVL = 4, rDH = 5, rIN = 6, rAS = 7, rDP = 8, eEX = 0, eNH = 1, eMS = 2, eGV = 3, eVL = 4, eDH = 5, eIN = 6, eAS = 7, eDP = 8 }, + adj = { + EX = "EXPERT", + NH = "HOLDLESS", + MS = "MESSY", + GV = "GRAVITY", + VL = "VOLATILE", + DH = "DOUBLE HOLE", + IN = "INVISIBLE", + AS = "ALL-SPIN", + DP = "DUO", + rEX = "TYRANNICAL", + rNH = "ASCENDANT", + rMS = "DECEPTIVE", + rGV = "COLLAPSED", + rVL = "DESPERATE", + rDH = "DAMNED", + rIN = "BELIEVED", + rAS = "OMNI-SPIN", + rDP = "PIERCING", + -- Trevor Smithy + eEX = "EASY", + eNH = "MODERATE", + eMS = "TIDY", + eGV = "LIFTED", + eVL = "TRANQUIL", + eDH = "SAVED", + eIN = "VISIBLE", + eAS = "SPUN", + eDP = "FRIENDLY", + }, + noun = { + EX = "EXPERT", + NH = "NO HOLD", + MS = "MESSINESS", + GV = "GRAVITY", + VL = "VOLATILITY", + DH = "DOUBLE HOLE", + IN = "INVISIBILITY", + AS = "ALL-SPIN", + DP = "DUO", + rEX = "TYRANNY", + rNH = "ASCENSION", + rMS = "DECEPTION", + rGV = "COLLAPSE", + rVL = "DESPERATION", + rDH = "DAMNATION", + rIN = "BELIEF", + rAS = "OMNI-SPIN", + rDP = "HEARTACHE", + -- Trevor Smithy + eEX = "EASY", + eNH = "MODERATION", + eMS = "TIDINESS", + eGV = "LIFT", + eVL = "TRANQUILITY", + eDH = "SALVATION", + eIN = "VISIBILITY", + eAS = "SPIN", + eDP = "FRIEND", + }, + -- Trevor Smithy + easyName = { + EX = "< EASY MODE >", + NH = "< MODERATE HOLD >", + MS = "< TIDINESS >", + GV = "< LIFT >", + VL = "< TRANQUILITY >", + DH = "< SALVATION >", + IN = "< VISIBLE >", + AS = "< SPIN >", + DP = "< FRIEND >", + }, + easyDesc = { + EX = "A MORE LENIENT CHALLENGE", + NH = "CANCELING IS DIFFICULT, MUST CLICK TWICE", + MS = "SHUFFLES SOME CARDS", + GV = "AUTO COMMITS OCCUR", + VL = "LARGER GAPS BETWEEN CARDS", + DH = "COMBO DIFFICULTY IS DECREASED", + IN = "CARDS ARE FACED DOWN AND ARE HIGHLIGHTED", + AS = "ENABLE KEYBOARD CONTROLS", + DP = "FLOOD THE TOWER WITH AN IMAGINARY FRIEND", + }, + uneasyName = { + EX = "< UNEASY MODE >", + NH = "< MODERATE HOLD >", + MS = "< TIDINESS >", + GV = "< LIFT >", + VL = "< TRANQUILITY >", + DH = "< SALVATION >", + IN = "< VISIBLE >", + AS = "< SPIN >", + DP = "< FRIEND >", + }, + uneasyDesc = { + EX = "THE WEIGHT OF REALITY PRESENTS ITS OWN CHALLENGE", + NH = "CANCELING IS DIFFICULT, MUST CLICK TWICE", + MS = "SHUFFLES SOME CARDS", + GV = "AUTO COMMITS OCCUR", + VL = "LARGER GAPS BETWEEN CARDS", + DH = "COMBO DIFFICULTY IS DECREASED", + IN = "CARDS ARE FACED DOWN AND ARE HIGHLIGHTED", + AS = "ENABLE KEYBOARD CONTROLS", + DP = "FLOOD THE TOWER WITH AN IMAGINARY FRIEND", + }, + -- +} diff --git a/data/placeholder.txt b/data/placeholder.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/data/revive.lua b/data/revive.lua new file mode 100644 index 00000000..4176444f --- /dev/null +++ b/data/revive.lua @@ -0,0 +1,140 @@ +local function rndMod(t) + local d = MATH.randFreqAll(ModData.weight) + t.prompt = t.prompt:repD(d) + if STAT.easyName then d = 'e' .. d end + t.text = STAT.easyName and t.text:repD(ModData.noun[d]) or t.text:repD(ModData.adj[d]) + t.short = t.short:repD(d) +end +local function rndMod2(t) + local d = ModData.deck[math.random(9)].id + t.prompt = t.prompt:repD(d) + if STAT.easyName then d = 'e' .. d end + t.text = STAT.easyName and t.text:repD(ModData.noun[d]) or t.text:repD(ModData.adj[d]) + t.short = t.short:repD(d) +end +local function f5() return math.max(GAME.floor, GAME.negFloor) <= 5 end +local function F6() return math.max(GAME.floor, GAME.negFloor) >= 6 end +local function F9() return math.max(GAME.floor, GAME.negFloor) >= 9 end +local function F9wind() return math.max(GAME.floor, GAME.negFloor) >= 9 and GAME.maxQuestSize >= 4 and GAME.mod.DH ~= -1 end +local function F9wind3() return math.max(GAME.floor, GAME.negFloor) >= 9 and GAME.maxQuestSize >= 5 and GAME.mod.DH ~= -1 end +--ZCEM conditions +local function notENH() return GAME.mod.NH ~= -1 end +local function notENHorF9wind() return math.max(GAME.floor, GAME.negFloor) >= 9 and GAME.maxQuestSize >= 4 and GAME.mod.DH ~= -1 and GAME.mod.NH ~= -1 end +local function notENHorF9wind3() return math.max(GAME.floor, GAME.negFloor) >= 9 and GAME.maxQuestSize >= 5 and GAME.mod.DH ~= -1 and GAME.mod.NH ~= -1 end +local function notEMS() return GAME.mod.MS ~= -1 end +local function notEMSorF6() return math.max(GAME.floor, GAME.negFloor) >= 6 and GAME.mod.MS ~= -1 end +local function notEasyName() return not STAT.easyName end -- whether or not to use SWAMP WATER or BATH WATER +local function easyName() return STAT.easyName end +local function EDP() return GAME.mod.DP == -1 and GAME.mod.NH ~= 2 and GAME.animDuration < 26 end --3rd quest, don't do if rNH or excessive animDuration +local function notUASandEDP() return not (GAME.mod.AS == 2 and URM and GAME.mod.DP == -1) end -- friend won't let you kill yourself +local function notEDHandEDP() return GAME.mod.DH ~= -1 and GAME.mod.DP ~= -1 end -- friend removes annoying revive task +local function notRGVandEDP() return not (GAME.mod.GV == 2 and GAME.mod.DP == -1) and math.max(GAME.floor, GAME.negFloor) <= 5 end --- no commit for 6 seconds + +---@class Prompt +---@field rank number[] +---@field prompt string +---@field target number +---@field short string +---@field text string +---@field cond fun():boolean? +---@field init fun(t:Prompt)? +---@field _prompt string? for repeating check + +---@type Prompt[] +local d = { + { rank = { 1, 2 }, prompt = 'activate', target = 30, short = "Activate 30", text = "Activate 30 cards" }, + { rank = { 3, 4 }, prompt = 'activate', target = 80, short = "Activate 80", text = "Activate 80 cards" }, + { rank = { 2, 2 }, prompt = 'cancel', target = 40, short = "Cancel 40", text = "Cancel 40 cards" }, + { rank = { 3, 4 }, prompt = 'cancel', target = 100, short = "Cancel 100", text = "Cancel 100 cards" }, + { rank = { 1, 2 }, prompt = 'flip', target = 50, short = "Flip 50", text = "Flip 50 cards" }, + { rank = { 3, 4 }, prompt = 'flip', target = 120, short = "Flip 120", text = "Flip 120 cards" }, + { rank = { 5, 6 }, prompt = 'flip', target = 300, short = "Flip 300", text = "Flip 300 cards" }, + { rank = { 1, 2 }, prompt = 'flip_single', target = 10, short = "Flip single 10", text = "Flip a single card\n10 times in a row", cond = notUASandEDP }, + { rank = { 2, 4 }, prompt = 'flip_single', target = 20, short = "Flip single 20", text = "Flip a single card\n20 times in a row", cond = notUASandEDP }, + { rank = { 1, 2 }, prompt = 'commit', target = 6, short = "Commit 6x", text = "Commit 6 times" }, + { rank = { 2, 3 }, prompt = 'commit', target = 15, short = "Commit 15x", text = "Commit 15 times" }, + { rank = { 3, 5 }, prompt = 'commit', target = 30, short = "Commit 30x", text = "Commit 30 times" }, + { rank = { 1, 2 }, prompt = 'commit_$1', target = 2, short = "Commit $1 2x", text = "Commit 2 times\nwith $1", init = rndMod }, + { rank = { 3, 4 }, prompt = 'commit_$1', target = 4, short = "Commit $1 4x", text = "Commit 4 times\nwith $1", init = rndMod }, + { rank = { 2, 4 }, prompt = 'commit_$1_row', target = 2, short = "2 Chain with $1", text = "Commit 2 times\nwith $1 in a row", init = rndMod }, + { rank = { 3, 6 }, prompt = 'commit_$1_row', target = 3, short = "3 Chain with $1", text = "Commit 3 times\nwith $1 in a row", init = rndMod }, + { rank = { 1, 3 }, prompt = 'commit_no_$1_row', target = 2, short = "2 chain without $1", text = "Commit 2 times\nwithout $1 in a row", init = rndMod2 }, + { rank = { 3, 5 }, prompt = 'commit_no_$1_row', target = 3, short = "3 chain without $1", text = "Commit 3 times\nwithout $1 in a row", init = rndMod2 }, + { rank = { 1, 2 }, prompt = 'commit_0', target = 2, short = "Commit NOTHING 2x", text = "Commit NOTHING\n2 times" }, + { rank = { 2, 4 }, prompt = 'commit_0', target = 5, short = "Commit NOTHING 5x", text = "Commit NOTHING\n5 times" }, + { rank = { 4, 6 }, prompt = 'commit_0', target = 8, short = "Commit NOTHING 8x", text = "Commit NOTHING\n8 times" }, + { rank = { 1, 3 }, prompt = 'commit_0_row', target = 3, short = "3x Spam commit", text = "Commit NOTHING\n3 times in a row" }, + { rank = { 3, 5 }, prompt = 'commit_no_conn', target = 1, short = "Commit no consec", text = "Commit without consecutive cards", cond = F6 }, + { rank = { 1, 4 }, prompt = 'commit_conn_2', target = 1, short = "Commit 2 consec", text = "Commit with 2 consecutive cards", cond = f5 }, + { rank = { 2, 4 }, prompt = 'commit_conn_3', target = 1, short = "Commit 3 consec", text = "Commit with 3 consecutive cards", cond = f5 }, + { rank = { 3, 5 }, prompt = 'commit_conn_4', target = 1, short = "Commit 4 consec", text = "Commit with 4 consecutive cards" }, + { rank = { 3, 5 }, prompt = 'commit_swamp_l', target = 1, short = "SWAMP WATER LITE", text = "Commit SWAMP WATER LITE", cond = notEasyName}, + { rank = { 4, 6 }, prompt = 'commit_swamp', target = 1, short = "SWAMP WATER", text = "Commit SWAMP WATER", cond = notEasyName}, + { rank = { 3, 5 }, prompt = 'commit_swamp_l', target = 1, short = "BATH WATER LITE", text = "Commit BATH WATER variant", cond = easyName}, + { rank = { 4, 6 }, prompt = 'commit_swamp', target = 1, short = "BATH WATER", text = "Commit BATH WATER", cond = easyName}, + { rank = { 3, 6 }, prompt = 'commit_reversed', target = 1, short = "Commit inversed", text = "Commit all cards\nthat aren't requested" }, + { rank = { 1, 4 }, prompt = 'commit_1card', target = 3, short = "Commit 1 cards 3x", text = "Commit 3 times with\n1 card on first commit" }, + { rank = { 2, 5 }, prompt = 'commit_2card', target = 4, short = "Commit 2 cards 4x", text = "Commit 4 times with\n2 cards on first commit" }, + { rank = { 3, 6 }, prompt = 'commit_3card', target = 5, short = "Commit 3 cards 5x", text = "Commit 5 times with\n3 cards on first commit" }, + { rank = { 4, 6 }, prompt = 'commit_4card', target = 4, short = "Commit 4 cards 4x", text = "Commit 4 times with\n4 cards on first commit" }, + { rank = { 5, 6 }, prompt = 'commit_5card', target = 3, short = "Commit 5 cards 3x", text = "Commit 3 times with\n5 cards on first commit" }, + { rank = { 1, 4 }, prompt = 'pass', target = 10, short = "Pass 10", text = "Pass 10 times" }, + { rank = { 5, 6 }, prompt = 'pass', target = 20, short = "Pass 20", text = "Pass 20 times" }, + { rank = { 2, 5 }, prompt = 'pass_$1', target = 2, short = "Pass 2 with $1", text = "Pass 2 times\nwith $1", init = rndMod, cond = notEDHandEDP }, + { rank = { 3, 5 }, prompt = 'pass_$1', target = 3, short = "Pass 3 with $1", text = "Pass 3 times\nwith $1", init = rndMod, cond = notEDHandEDP }, + { rank = { 4, 6 }, prompt = 'pass_$1', target = 4, short = "Pass 4 with $1", text = "Pass 4 times\nwith $1", init = rndMod, cond = notEDHandEDP }, + { rank = { 2, 4 }, prompt = 'pass_perfect', target = 6, short = "6x perf", text = "Get 6 perfect passes" }, + { rank = { 5, 6 }, prompt = 'pass_perfect', target = 12, short = "12x perf", text = "Get 12 perfect passes" }, + { rank = { 2, 4 }, prompt = 'pass_imperfect', target = 6, short = "6x im-perf", text = "Get 6 imperfect passes", cond = notENH }, + { rank = { 5, 6 }, prompt = 'pass_imperfect', target = 12, short = "12x im-perf", text = "Get 12 imperfect passes", cond = notENH }, + { rank = { 4, 5 }, prompt = 'pass_imperfect_row', target = 3, short = "3x chain im-perf", text = "Get 3 imperfect\npasses in a row", cond = notENH }, + { rank = { 5, 6 }, prompt = 'pass_imperfect_row', target = 8, short = "8x chain im-perf", text = "Get 8 imperfect\npasses in a row", cond = notENH }, + { rank = { 2, 4 }, prompt = 'pass_perfect_row', target = 4, short = "4x chain perf", text = "Get 4 perfect\npasses in a row" }, + { rank = { 3, 5 }, prompt = 'pass_perfect_row', target = 6, short = "6x chain perf", text = "Get 6 perfect\npasses in a row" }, + { rank = { 4, 5 }, prompt = 'pass_perfect_row', target = 8, short = "8x chain perf", text = "Get 8 perfect\npasses in a row" }, + { rank = { 4, 6 }, prompt = 'pass_perfect_row', target = 10, short = "10x chain perf", text = "Get 10 perfect\npasses in a row" }, + { rank = { 2, 3 }, prompt = 'pass_second', target = 4, short = "2nd quest 4x", text = "Pass the second\nquest 4 times" }, + { rank = { 3, 4 }, prompt = 'pass_second', target = 8, short = "2nd quest 8x", text = "Pass the second\nquest 8 times" }, + { rank = { 4, 5 }, prompt = 'pass_second', target = 12, short = "2nd quest 12x", text = "Pass the second\nquest 12 times" }, + { rank = { 2, 3 }, prompt = 'pass_third', target = 1, short = "3rd quest", text = "Pass the third\nquest once", cond = EDP }, + { rank = { 3, 4 }, prompt = 'pass_third', target = 2, short = "3rd quest 2x", text = "Pass the third\nquest 2 times", cond = EDP }, + { rank = { 4, 5 }, prompt = 'pass_third', target = 3, short = "3rd quest 3x", text = "Pass the third\nquest 3 times", cond = EDP }, + { rank = { 2, 4 }, prompt = 'b2b_break_4', target = 1, short = "Break B2B 4x", text = "Break B2B chain\nat B2B x4", cond = notENH }, + { rank = { 3, 4 }, prompt = 'b2b_break_6', target = 1, short = "Break B2B 6x", text = "Break B2B chain\nat B2B x6", cond = notENH }, + { rank = { 4, 5 }, prompt = 'b2b_break_8', target = 1, short = "Break B2B 8x", text = "Break B2B chain\nat B2B x8", cond = notENH }, + { rank = { 4, 6 }, prompt = 'b2b_break_10', target = 1, short = "Break B2B 10x", text = "Break B2B chain\nat B2B x10", cond = notENH }, + { rank = { 4, 6 }, prompt = 'b2b_break_windup', target = 1, short = "Break B2B at a windup", text = "Break B2B at a windup", cond = notENHorF9wind }, + { rank = { 5, 6 }, prompt = 'b2b_break_windup3', target = 1, short = "Break B2B at a windup3+", text = "Break B2B at\na Lv.3+ windup", cond = notENHorF9wind3 }, + { rank = { 1, 3 }, prompt = 'heal', target = 8, short = "Heal 8 HP", text = "Heal 8 HP", cond = notEMS }, + { rank = { 2, 4 }, prompt = 'heal', target = 20, short = "Heal 20 HP", text = "Heal 20 HP", cond = notEMS }, + { rank = { 1, 2 }, prompt = 'send', target = 6, short = "Send 6", text = "Send 6 Attack" }, + { rank = { 3, 4 }, prompt = 'send', target = 20, short = "Send 20", text = "Send 20 Attack" }, + { rank = { 5, 6 }, prompt = 'send', target = 40, short = "Send 40", text = "Send 40 Attack" }, + { rank = { 3, 4 }, prompt = 'pass_windup', target = 1, short = "Windup", text = "Pass a windup", cond = F9wind }, + { rank = { 3, 5 }, prompt = 'pass_windup3', target = 1, short = "Windup3+", text = "Pass a Lv.3+ windup", cond = F9wind3 }, + { rank = { 5, 5 }, prompt = 'pass_windup_inb2b', target = 1, short = "Windup with B2B", text = "Pass a windup\nduring B2B charge", cond = F9wind }, + { rank = { 4, 5 }, prompt = 'pass_windup', target = 4, short = "Windup x 4", text = "Pass 4 windups", cond = F9wind }, + { rank = { 4, 4 }, prompt = 'pass_windup_perfect', target = 1, short = "Windup perf", text = "Pass a windup\nperfectly", cond = F9wind }, + { rank = { 6, 6 }, prompt = 'pass_windup_inb2b', target = 3, short = "Windup x 3 with B2B", text = "Pass 4 windups\nduring a B2B charge", cond = F9wind }, + { rank = { 5, 5 }, prompt = 'pass_windup_perfect', target = 4, short = "Windup perf x 4", text = "Pass 4 windups\nperfectly", cond = F9wind }, + { rank = { 5, 5 }, prompt = 'pass_windup3_perfect', target = 1, short = "Windup3+ perf", text = "Pass a Lv.3+\nwindup perfectly", cond = F9wind3 }, + { rank = { 6, 6 }, prompt = 'pass_windup3_perfect', target = 4, short = "Windup3+ perf x 4", text = "Pass 4 Lv.3+\nwindups perfectly", cond = F9wind3 }, + { rank = { 2, 2 }, prompt = 'dmg_time', target = 4, short = "Take Dmg 4x", text = "Take damage 4 times", cond = notEMS }, + { rank = { 3, 3 }, prompt = 'dmg_time', target = 8, short = "Take Dmg 8x", text = "Take damage 8 times", cond = notEMS }, + { rank = { 2, 4 }, prompt = 'dmg_amount', target = 10, short = "Lose 10 HP", text = "Take 10 damage total", cond = notEMS }, + { rank = { 4, 6 }, prompt = 'dmg_amount', target = 20, short = "Lose 20 HP", text = "Take 20 damage total", cond = notEMS }, + { rank = { 3, 4 }, prompt = 'timedmg_time', target = 2, short = "Take Time Dmg 2x", text = "Take time damage 2 times", cond = F6 }, + { rank = { 5, 6 }, prompt = 'timedmg_time', target = 4, short = "Take Time Dmg 4x", text = "Take time damage 4 times", cond = F6 }, + { rank = { 4, 6 }, prompt = 'keep_health_safe', target = 8, short = "Safe HP 8s", text = "Keep HP safe\nfor 8 seconds", cond = F6 }, + { rank = { 4, 5 }, prompt = 'keep_health_danger', target = 3, short = "Critical HP 3s", text = "Keep HP critical\nfor 3 seconds", cond = notEMSorF6 }, + { rank = { 2, 5 }, prompt = 'keep_no_mouse', target = 4, short = "No mouse 4s", text = "Don't use the mouse\nfor 4 seconds", cond = f5 }, + { rank = { 2, 4 }, prompt = 'keep_no_commit', target = 6, short = "No commit 6s", text = "Don't commit\nfor 6 seconds", cond = notRGVandEDP }, + { rank = { 3, 6 }, prompt = 'keep_no_cancel', target = 8, short = "No cancel 8s", text = "Don't cancel\nfor 8 seconds" }, + { rank = { 2, 5 }, prompt = 'keep_no_keyboard', target = 10, short = "No keyboard 10s", text = "Don't use the keyboard\nfor 10 seconds", cond = F6 }, + { rank = { 3, 5 }, prompt = 'keep_no_perfect', target = 12, short = "No perfect 12s", text = "Have no perfect\npasses for 12 seconds", cond = notENH }, + { rank = { 4, 6 }, prompt = 'keep_no_imperfect', target = 14, short = "No imperfect 14s", text = "Have no imperfect\npasses for 14 seconds", cond = F6 }, + { rank = { 3, 5 }, prompt = 'keep_no_reset', target = 16, short = "No reset 16s", text = "Don't reset\nfor 16 seconds" }, +} +for i = 1, #d do d[i]._prompt = d[i].prompt end + +return d diff --git a/module/sfx_data.lua b/data/sfx.lua similarity index 100% rename from module/sfx_data.lua rename to data/sfx.lua diff --git a/main.lua b/main.lua index 5980e610..3d4752ab 100644 --- a/main.lua +++ b/main.lua @@ -291,27 +291,27 @@ TEXTURE = { talentless = aq(3, 7), quest_rationing = aq(2, 7), the_responsible_one = aq(1, 6), - the_unreliable_one = aq(15, 2), the_responsible_one_plus = aq(1, 6), + the_unreliable_one = aq(15, 2), guardian_angel = aq(3, 6), carried = aq(3, 8), - level_19_cap = aq(16, 2), - the_escape_artist = aq(1, 5), - the_artist_trinity = aq(1, 5), - fel_magic = aq(9, 7), - empurple = aq(13, 7), - patience_is_a_virtue = aq(10, 6), - spotless = aq(16, 4), + overprotection = aq(12, 7), a_mutual_agreement = aq(13, 4), the_cheaters = aq(12, 4), - overprotection = aq(12, 7), + the_escape_artist = aq(1, 5), + the_artist_trinity = aq(11, 3), + level_19_cap = aq(16, 2), + empurple = aq(13, 7), + the_masterful_juggler = aq(11, 7), clutch_main = aq(14, 3), + spotless = aq(16, 4), + autoplay_is_awesome = aq(10, 6), sunk_cost = aq(11, 5), wax_wings = aq(12, 5), - the_masterful_juggler = aq(11, 7), the_oblivious_artist = aq(14, 7), zero_to_sixty = aq(10, 5), speed_bonus = aq(9, 4), + under_the_radar = aq(16, 8), arrogance = aq(3, 5), scarcity_mindset = aq(4, 1), detail_oriented = aq(8, 6), @@ -449,6 +449,18 @@ TEXTURE = { yotta = aq(0, 0), ronna = aq(0, 0), quetta = aq(0, 0), + -- Easy Mode - Issued (v1.2) (No CR) + patience_is_a_virtue = aq(10, 6), + multiple_pieces = aq(1,3), + hyperplonk = aq(6, 1), + gigaplonk = aq(7, 1), + the_windup = aq(8, 1), + what_have_you_done = aq(14, 8), + music_man = aq(15, 8), + im_gonna_be = aq(6, 7), + lazy_bastard = aq(16, 8), + easy_name = aq(16, 1), + biased = aq(4, 5), }, frame = { [0] = assets 'achievements/frames/none.png', @@ -481,7 +493,9 @@ TEXTURE = { logo = assets 'iconZCEM.png', logo_old = assets 'icon_old.png', - programmingsmithy = assets 'programmingsmithy.png' + programmingsmithy = assets 'programmingsmithy.png', + github = assets 'GitHub_Invertocat_White.png', + discord = assets 'Discord-Symbol-White.png', } TEXTURE = TABLE.linkSource({}, TEXTURE, function(path) if type(path) ~= 'string' then return path end @@ -556,6 +570,16 @@ TEXTURE.lightDot = GC.initCanvas(32, 32, function() GC.blurCircle(.26, 16, 16, 16) end) +TEXTURE.surgeIcon = GC.initCanvas(512, 512, function() + GC.clear(1, 1, 1, 0) + GC.setColor(1, 1, 1) + GC.translate(256, 256) + for _ = 0, 2 do + GC.circle('fill', 0, 0, 180, 4) + GC.rotate(.5236) + end +end) + TEXTURE.windup = GC.initCanvas(128, 128, function() GC.clear(1, 1, 1, 0) local l = {} @@ -636,6 +660,7 @@ FONT.load { serif = "assets/AbhayaLibre-Regular.ttf", sans = "assets/DINPro-Medium.otf", led = "assets/UniDreamLED.ttf", + symbol = "assets/symbols.otf", } FontLoaded = SYSTEM == 'Web' or MATH.roll(.62) FONT.setDefaultFont(FontLoaded and 'sans' or 'serif') @@ -668,6 +693,8 @@ TEXTS = { -- Font size can only be 30 and 50 here !!! chain = GC.newText(FONT.get(50)), chain2 = GC.newText(FONT.get(50, 'led')), b2b = GC.newText(FONT.get(30), "B2B x"), + comboText = GC.newText(FONT.get(50), "COMBO"), + combo = GC.newText(FONT.get(50)), spike = GC.newText(FONT.get(50)), gigaspeed = GC.newText(FONT.get(50), { COLOR.dR, "G", COLOR.dO, "I", COLOR.dY, "G", @@ -820,6 +847,7 @@ STAT = { oldTransparentCard = false, unlockAll = false, easyModeClicker = false, + greenClicker = false, } ACHV = {} @@ -834,23 +862,6 @@ function SaveStat() if not (TestMode or GAME.multiplePiecesActive) then love.fil function SaveAchv() if not (TestMode or GAME.multiplePiecesActive) then love.filesystem.write('achv.luaon', 'return' .. TABLE.dumpDeflate(ACHV)) end end -MSG.setSafeY(75) -MSG.addCategory('dark', COLOR.D, COLOR.L) -MSG.addCategory('bright', COLOR.L, COLOR.D) - -AchvData = { - [0] = { id = 'achv_none', bg = COLOR.D, fg = COLOR.LD, fg2 = COLOR.LD }, - { id = 'achv_bronze', bg = COLOR.DO, fg = COLOR.lO, fg2 = COLOR.O }, - { id = 'achv_silver', bg = { .26, .26, .26 }, fg = COLOR.L, fg2 = COLOR.dL }, - { id = 'achv_gold', bg = COLOR.DY, fg = COLOR.lY, fg2 = COLOR.Y }, - { id = 'achv_platinum', bg = COLOR.DJ, fg = COLOR.lJ, fg2 = COLOR.J }, - { id = 'achv_diamond', bg = COLOR.DP, fg = COLOR.lP, fg2 = COLOR.lB }, - { id = 'achv_issued', bg = COLOR.DM, fg = COLOR.lM, fg2 = COLOR.lM }, -} -for i = 0, 6 do MSG.addCategory(AchvData[i].id, AchvData[i].bg, COLOR.L, TEXTURE.achievement.frame[i]) end -for i = 1, 6 do MSG.addCategory("wreath_" .. i, AchvData[5].bg, COLOR.L, GC.load { w = 256, { 'draw', TEXTURE.achievement.frame[5] }, { 'draw', TEXTURE.achievement.wreath[i] } }) end -MSG.addCategory('achv_badTime', {.126, 0, 0}, COLOR.L, TEXTURE.achievement.frame[6]) - local msgTime = 0 local bufferedMsg = {} @@ -1011,10 +1022,10 @@ end BgScale = 1 -require 'module/game_data' -require 'module/achv_data' -require 'module/shader' -require 'module/game' +CHAR = require 'module/char' +require 'data/base' +SHADER = require 'module/shader' +GAME = require 'module/game' for i = 1, #ModData.deck do table.insert(Cards, require 'module/card'.new(ModData.deck[i])) end GAME.refreshLayout() @@ -1022,17 +1033,24 @@ for i, C in ipairs(Cards) do Cards[C.id], C.x, C.y = C, C.tx, C.ty + 260 + 26 * 1.6 ^ i end +MSG.setSafeY(75) +MSG.addCategory('dark', COLOR.D, COLOR.L) +MSG.addCategory('bright', COLOR.L, COLOR.D) +for i = 0, 6 do MSG.addCategory(AchvData[i].id, AchvData[i].bg, COLOR.L, TEXTURE.achievement.frame[i]) end +for i = 1, 6 do MSG.addCategory("wreath_" .. i, AchvData[5].bg, COLOR.L, GC.load { w = 256, { 'draw', TEXTURE.achievement.frame[5] }, { 'draw', TEXTURE.achievement.wreath[i] } }) end +MSG.addCategory('achv_badTime', {.126, 0, 0}, COLOR.L, TEXTURE.achievement.frame[6]) + SCN.addSwapStyle('warp', require 'module/warp_swap') -SCN.add('joining', require 'module/scene/joining') -SCN.add('tower', require 'module/scene/tower') -SCN.add('stat', require 'module/scene/stat') -SCN.add('records', require 'module/scene/records') -SCN.add('achv', require 'module/scene/achv') -SCN.add('conf', require 'module/scene/conf') -SCN.add('about', require 'module/scene/about') -SCN.add('zcem', require 'module/scene/zcem') -SCN.add('ending', require 'module/scene/ending') +SCN.add('joining', require 'scene/joining') +SCN.add('tower', require 'scene/tower') +SCN.add('stat', require 'scene/stat') +SCN.add('records', require 'scene/records') +SCN.add('achv', require 'scene/achv') +SCN.add('conf', require 'scene/conf') +SCN.add('about', require 'scene/about') +SCN.add('ending', require 'scene/ending') +SCN.add('zcem', require 'scene/zcem') ZENITHA.setFirstScene('joining') local gc = love.graphics @@ -1243,8 +1261,8 @@ function RefreshBGM(mode) if GAME.slowmo then pitch = pitch / 2 end if GAME.nightcore then pitch = pitch * 2 end -- Trevor Smithy - if GAME.eslowmo then pitch = pitch * 2^(-1/2) end - if GAME.enightcore then pitch = pitch * 2 end + if GAME.eslowmo and not (GAME.badTime and GAME.playing) then pitch = pitch * 2^(-1/2) end + if GAME.enightcore and not (GAME.badTime and GAME.playing) then pitch = pitch * 2 end -- else pitch = GAME.nightcore and GAME.manualBGMPitch or GAME.slowmo and 1/GAME.manualBGMPitch or pitch @@ -1405,7 +1423,7 @@ end function ReloadTexts() local sep = (TEXTS.mod:getFont():getHeight() + TEXTS.title:getFont():getHeight()) / 2 for _, text in next, TEXTS do text:setFont(FONT.get(text:getFont():getHeight() < sep and 30 or 50)) end - for _, text in next, ShortCut do text:setFont(FONT.get(text:getFont():getHeight() < sep and 30 or 50)) end + for _, text in next, CardHintText do text:setFont(FONT.get(text:getFont():getHeight() < sep and 30 or 50)) end for _, quest in next, GAME.quests do quest.name:setFont(FONT.get(70)) end TEXTS.height:setFont(FONT.get(30)) TEXTS.time:setFont(FONT.get(30)) @@ -1679,6 +1697,16 @@ function WIDGET._prototype.button:draw() -- Drawable gc.setColor(self.textColor) WIDGET._alignDraw(self, self._text, 0, 0, 0, 1.2, 1.2 - 2.4 * GAME.revTimer) + if self._image then + local startX = self.alignX == 'center' and 0 or self.alignX == 'left' and -w * .5 + self.marginX or w * .5 - self.marginX + local startY = self.alignY == 'center' and 0 or self.alignY == 'top' and -h * .5 + self.marginY or h * .5 - self.marginY + gc.setColor(self.imageColor) + if self.quad then + WIDGET._alignDrawQ(self, self._image, self.quad, startX, startY) + else + WIDGET._alignDraw(self, self._image, startX, startY) + end + end -- Highlight if self._hoverTime > 0 then diff --git a/module/card.lua b/module/card.lua index b5d7af60..9592cb50 100644 --- a/module/card.lua +++ b/module/card.lua @@ -146,7 +146,6 @@ function Card:setActive(auto, key) end if not auto and not self.active and GAME.comboStr == 'eASeNH' and GAME.playing then GAME.noManualActivate = false - --MSG("dark", "Manual activation") end -- Trevor Smithy self.active = not self.active -- the main flip @@ -159,10 +158,7 @@ function Card:setActive(auto, key) end local leftCard local rightCard - local mvl - if M.VL == -1 then mvl = 1 else mvl = M.VL end - --local baseDist = 110 + (M.EX > 0 and (URM and M.EX == 2 and -30 or -10) or 0) + mvl * 20 + (GAME.closeCard and -30 or GAME.ecloseCard and -50 or 0) - local maxCardDistance = 1 + (M.EX == 2 and URM and 2 or M.EX == 2 and 1 or M.EX == 1 and 1 or 0) - mvl + (GAME.closeCard and 1 or 0) + local maxCardDistance = 1 + max((M.EX == 2 and URM and 2 or M.EX == 2 and 1 or M.EX == 1 and 1 or 0) - abs(M.VL) + (GAME.closeCard and 1 or 0),0) local otherCardActivated = false for i = 1, maxCardDistance do if self.tempOrder > i then leftCard = CD[self.tempOrder - i] end @@ -893,13 +889,13 @@ function Card:draw() gc_setAlpha(1.26/temp + sin(love.timer.getTime() * 5.2/temp)/(2*temp)) end if self.active and GAME.playing then - if (q2 and TABLE.equal(hand, q2)) or (M.DP == -1 and GAME[GAME.getLifeKey(true)] > 0 and q3 and q1 and TABLE.equal(hand, q3) and TABLE.equal(hand, q1)) then + if (q2 and TABLE.equal(hand, q2)) or (M.DP == -1 and GAME[GAME.getLifeKey(true)] > 0 and M.NH < 2 and q3 and q1 and TABLE.equal(hand, q3) and TABLE.equal(hand, q1)) then gc_setColor(0.13,1,0) else gc_setColor(1,1,0) end gc_setAlpha(min(1, 3/temp)) - elseif GAME.playing and (M.DP == -1 and GAME[GAME.getLifeKey(true)] > 0 and q3 and q1 and TABLE.equal(hand, q3) and TABLE.equal(hand, q1)) then + elseif GAME.playing and (M.DP == -1 and GAME[GAME.getLifeKey(true)] > 0 and M.NH < 2 and q3 and q1 and TABLE.equal(hand, q3) and TABLE.equal(hand, q1)) then gc_setColor(0.13,1,0) end gc_setLineWidth(width/2) diff --git a/module/char.lua b/module/char.lua new file mode 100644 index 00000000..5a811543 --- /dev/null +++ b/module/char.lua @@ -0,0 +1,372 @@ +local L={ + icon={ + menu ='E000', + music ='E001', + back ='E002', + earth ='E003', + info ='E004', + help ='E005', + history ='E006', + check_circ ='E007', + cross_circ ='E008', + warning_circ ='E009', + info_circ ='E00A', + note_circ ='E00B', + stopwatch ='E00C', + moon ='E00D', + bombBlock ='E00E', + retry ='E00F', + power ='E010', + headphones ='E011', + home ='E012', + funnel ='E013', + controller ='E014', + sun_strong ='E015', + sun_weak ='E016', + eye ='E017', + eye_slash ='E018', + play ='E019', + pause ='E01A', + playPause ='E01B', + stop ='E01C', + cloud ='E01D', + clouddn ='E01E', + cloudup ='E01F', + cloud_sync ='E020', + cloud_slash ='E021', + read ='E022', + read1 ='E023', + read2 ='E024', + save ='E025', + save1 ='E026', + save2 ='E027', + speedOneEighth ='E028', + speedHalf ='E029', + speedOne ='E02A', + speedTwo ='E02B', + speedFive ='E02C', + toUp ='E02D', + toDown ='E02E', + toLeft ='E02F', + toRight ='E030', + nextFrame ='E031', + volUp ='E032', + volDown ='E033', + mute ='E034', + download ='E035', + upload ='E036', + thumbsUp ='E037', + thumbsDn ='E038', + thumbsUp_fill ='E039', + thumbsDn_fill ='E03A', + star ='E03B', + star_fill ='E03C', + console ='E03D', + video ='E03E', + wallet ='E03F', + zictionary ='E040', + mail ='E041', + keyboard ='E042', + openInBrowser ='E043', + image ='E044', + camera ='E045', + clipboard ='E046', + copy ='E047', + delete ='E048', + boneBlock ='E049', + invisBlock ='E04A', + bookmark ='E04B', + message ='E04C', + lock ='E04D', + videoCam ='E04E', + warning ='E04F', + spin_0 ='E050', + spin_1 ='E051', + spin_2 ='E052', + spin_3 ='E053', + spin_4 ='E054', + phone ='E055', + tablet ='E056', + laptop ='E057', + devices ='E058', + pencil ='E059', + bell ='E05A', + at_symbol ='E05B', + profile ='E05C', + passwd ='E05D', + settings ='E05E', + newBag ='E05F', + sync ='E060', + cross_big ='E061', + techmino ='E062', + TAS ='E063', + OneTwoThree ='E064', + Aa ='E065', + ABC ='E066', + macOS ='E067', + finder ='E068', + iOS ='E069', + iPadOS ='E06A', + linux ='E06B', + android ='E06C', + unlock ='E06D', + language ='E06E', + wifi ='E06F', + mobileData ='E070', + wifi_slash ='E071', + mobileData_slash='E072', + upload_alt ='E073', + download_alt ='E074', + folder ='E075', + folder_add ='E076', + folder_minus ='E077', + bluetooth ='E078', + cursor ='E079', + statistics ='E07A', + ctrl_alt ='E07B', + person ='E07C', + person_add ='E07D', + person_minus ='E07E', + person_slash ='E07F', + people ='E080', + forward_5s ='E081', + forward_10s ='E082', + forward_15s ='E083', + forward_30s ='E084', + forward_45s ='E085', + forward_1m ='E086', + forward_5m ='E087', + backward_5s ='E088', + backward_10s ='E089', + backward_15s ='E08A', + backward_30s ='E08B', + backward_45s ='E08C', + backward_1m ='E08D', + backward_5m ='E08E', + ctrl_slash ='E08F', + tv ='E090', + previous ='E091', + next ='E092', + back_chevron ='E093', + }, + brik={ + Z='E100', + S='E101', + J='E102', + L='E103', + T='E104', + O='E105', + I='E106', + Z5='E107', + S5='E108', + P='E109', + Q='E10A', + F='E10B', + E='E10C', + T5='E10D', + U='E10E', + V='E10F', + W='E110', + X='E111', + J5='E112', + L5='E113', + R='E114', + Y='E115', + N='E116', + H='E117', + I5='E118', + I3='E119', + C='E11A', + I2='E11B', + O1='E11C', + }, + key={ + mac_command ='E190', + mac_option ='E191', + mac_control ='E192', + shift ='E193', + capslock ='E194', + returnKey ='E195', + backspace ='E196', + mac_clear ='E197', + mac_fwdel ='E198', + mac_escape ='E199', + mac_pgup ='E19A', + mac_pgdn ='E19B', + mac_home ='E19C', + mac_end ='E19D', + mac_pgup_alt ='E19E', + mac_pgdn_alt ='E19F', + mac_home_alt ='E1A0', + mac_end_alt ='E1A1', + mac_tab ='E1A2', + up ='E1A3', + down ='E1A4', + left ='E1A5', + right ='E1A6', + mac_enter ='E1A7', + windows ='E1A8', + fn ='E1A9', + ctrl ='E1AA', + alt ='E1AB', + del ='E1AC', + pgup ='E1AD', + pgdn ='E1AE', + home ='E1AF', + endKey ='E1B0', + enter ='E1B1', + esc ='E1B2', + mediaEject ='E1B3', + tab ='E1B4', + iso_control ='E1B5', + iso_alt ='E1B6', + iso_enter ='E1B7', + menu ='E1B8', + xbox ='E1B9', + dpad ='E1BA', + dpad_u ='E1BB', + dpad_d ='E1BC', + dpad_l ='E1BD', + dpad_r ='E1BE', + js_l ='E1BF', + js_l_u ='E1C0', + js_l_d ='E1C1', + js_l_l ='E1C2', + js_l_r ='E1C3', + js_l_press ='E1C4', + js_r ='E1C5', + js_r_u ='E1C6', + js_r_d ='E1C7', + js_r_r ='E1C8', + js_r_l ='E1C9', + js_r_press ='E1CA', + ctrl_A ='E1CB', + ctrl_B ='E1CC', + ctrl_X ='E1CD', + ctrl_Y ='E1CE', + ctrl_lb ='E1CF', + ctrl_rb ='E1D0', + ctrl_lt ='E1D1', + ctrl_rt ='E1D2', + ctrl_view ='E1D3', + ctrl_menu ='E1D4', + ctrl_conectmenu ='E1D5', + ctrl_share ='E1D6', + ctrl_triangle ='E1D7', + ctrl_square ='E1D8', + ctrl_cross ='E1D9', + ctrl_circle ='E1DA', + ctrl_mutemenu ='E1DB', + ctrl_optionmenu ='E1DC', + ctrl_createmenu ='E1DD', + playStation ='E1DE', + numlock ='E1DF', + circleGrid ='E1E0', + circleGrid_up ='E1E1', + circleGrid_down ='E1E2', + circleGrid_left ='E1E3', + circleGrid_right ='E1E4', + ctrl_l ='E1E5', + ctrl_l1 ='E1E6', + ctrl_l2 ='E1E7', + ctrl_r ='E1E8', + ctrl_r1 ='E1E9', + ctrl_r2 ='E1EA', + ctrl_zl ='E1EB', + ctrl_zr ='E1EC', + space ='E1ED', + }, + zchan={ + mrz ='E200', + brik ='E201', + happy ='E202', + grinning ='E203', + frowning ='E204', + confused ='E205', + tears ='E206', + anxious ='E207', + rage ='E208', + question ='E209', + ellipsis ='E20A', + sweatdrop ='E20B', + shocked ='E20C', + fear ='E20D', + crying ='E20E', + bulb ='E20F', + qualified ='E210', + unqualified ='E211', + spark ='E212', + angry ='E213', + cracked ='E214', + thinking ='E215', + universe ='E216', + }, + mahjong={ + z1 ='1F000', + z2 ='1F001', + z3 ='1F002', + z4 ='1F003', + z7 ='1F004', + z6 ='1F005', + z5 ='1F006', + m1 ='1F007', + m2 ='1F008', + m3 ='1F009', + m4 ='1F00A', + m5 ='1F00B', + m6 ='1F00C', + m7 ='1F00D', + m8 ='1F00E', + m9 ='1F00F', + s1 ='1F010', + s2 ='1F011', + s3 ='1F012', + s4 ='1F013', + s5 ='1F014', + s6 ='1F015', + s7 ='1F016', + s8 ='1F017', + s9 ='1F018', + p1 ='1F019', + p2 ='1F01A', + p3 ='1F01B', + p4 ='1F01C', + p5 ='1F01D', + p6 ='1F01E', + p7 ='1F01F', + p8 ='1F020', + p9 ='1F021', + z12 ='1F022', + z13 ='1F023', + z15 ='1F024', + z14 ='1F025', + z8 ='1F026', + z9 ='1F027', + z10 ='1F028', + z11 ='1F029', + m5_d ='1F02A', + p5_d ='1F02B', + s5_d ='1F02C', + z5_cn ='1F02D', + z6_cn ='1F02E', + }, + other={ + apple='F8FF', + } +} + +for packName,set in next,L do + if type(set)=='table' then + setmetatable(set,{ + __index=function(t,k) + t[k]='?' + LOG('warn',"char set '"..packName.."' has no char '"..k.."'") + end + }) + for name,code in next,set do + set[name]=STRING.u8char(tonumber(code,16)) + end + end +end + +return L diff --git a/module/game.lua b/module/game.lua index cd4c597e..6143b522 100644 --- a/module/game.lua +++ b/module/game.lua @@ -97,8 +97,9 @@ local ins, rem = table.insert, table.remove ---@field maxSpike number ---@field maxSpikeWeak number --- ----@field gravDelay number? ----@field gravTimer number? +---@field gravDelay false | number +---@field gravTimer false | number +---@field resetCount number --- ---@field omega boolean ---@field negFloor number @@ -151,6 +152,7 @@ local ins, rem = table.insert, table.remove ---@field achv_professionalCleanerQuest number ---@field achv_roldSmythyQuest number ---@field comboSFX number +---@field comboBounceTime number ---@field multiplePiecesActive boolean True if multiple pieces are active together. If so, disables achievements and record submission viability ---@field badTime boolean? True if ZCEM basement is active ---@field badTimeStarted boolean? True if ZCEM basement run has started @@ -176,6 +178,8 @@ local GAME = { comboZP = 1, isUltraRun = false, endFloorFstr = {}, + pieceFstr = {}, + pieceFstrObj = GC.newText(FONT.get(70, 'symbol')), completion = { -- 0=not mastered, 1=mastered, 2=rev mastered EX = 0, @@ -260,7 +264,6 @@ local GAME = { achv_felMagicBurnt = nil, achv_felMagicQuest = nil, achv_artistTrinityH = nil, - achv_resetCount = nil, achv_noResetH = nil, achv_obliviousQuest = nil, achv_doublePass = nil, @@ -286,6 +289,7 @@ GAME.xp = 0 GAME.height = 0 GAME.chain = 0 GAME.comboSFX = 0 +GAME.comboBounceTime = 0 local M = GAME.mod local MD = ModData @@ -306,18 +310,6 @@ function GAME.getHand(real) if M.IN ~= 0 then ins(list, M.IN == 1 and 'IN' or M.IN == -1 and 'eIN' or 'rIN') end if M.AS ~= 0 then ins(list, M.AS == 1 and 'AS' or M.AS == -1 and 'eAS' or 'rAS') end if M.DP ~= 0 then ins(list, M.DP == 1 and 'DP' or M.DP == -1 and 'eDP' or 'rDP') end - -- Trevor Smithy - --if M.EX == -1 then ins(list, 'eEX') end - --if M.NH == -1 then ins(list, 'eNH') end - --if M.MS == -1 then ins(list, 'eMS') end - --if M.GV == -1 then ins(list, 'eGV') end - --if M.VL == -1 then ins(list, 'eVL') end - --if M.DH == -1 then ins(list, 'eDH') end - --if M.IN == -1 then ins(list, 'eIN') end - --if M.AS == -1 then ins(list, 'eAS') end - --if M.DP == -1 then ins(list, 'eDP') end - -- - -- for i = 1, #MD.deck do -- local D = MD.deck[i] -- local level = M[D.id] @@ -353,13 +345,7 @@ end function GAME.getComboZP(list) local m = TABLE.getValueSet(list) local zp = 1 - if m.EX then zp = zp * 1.4 elseif m.rEX then zp = zp * 2.6 elseif m.eEX then - if URM and table.concat(list):count('r') == 0 then - zp = zp * 2.7 - else - zp = zp * 0.9 - end - end + if m.EX then zp = zp * 1.4 elseif m.rEX then zp = zp * 2.6 elseif m.eEX then zp = zp * ((URM and table.concat(list):count('r') == 0) and 2.7 or 0.9) end if m.NH then zp = zp * 1.1 elseif m.rNH then zp = zp * (1.4 + .05 * (#list - 1)) elseif m.eNH then zp = zp * 0.90 end if m.MS then zp = zp * 1.2 elseif m.rMS then zp = zp * 1.7 elseif m.eMS then zp = zp * 10/9 end if m.GV then zp = zp * 1.1 elseif m.rGV then zp = zp * 1.2 elseif m.eGV then zp = zp * 0.85 end @@ -398,6 +384,7 @@ function GAME.getComboZP(list) end local function modNameSorter(a, b) return MD.prio_name[a] < MD.prio_name[b] end +local function modCardSorter(a, b) return MD.prio_card[a] < MD.prio_card[b] end local function trimR(s) return s:sub(2) end ---@param list string[] WILL BE SORTED!!! @@ -490,6 +477,8 @@ function GAME.getComboName(list, mode) list[r1], list[r2] = list[r2], list[r1] end end + + -- https://www.nationalchurchillmuseum.org/never-give-in-never-never-never.html#:~:text=You%20cannot%20tell,of%20the%20enemy. local colorModNumber = 1 local messyText = "" for i = 1, len - 1 do @@ -688,77 +677,6 @@ function GAME.getComboName(list, mode) if len_noDP >= 7 and not STAT.easyName then return len_noDP == 7 and [["SWAMP WATER LITE"]] or [["SWAMP WATER"]] end - --[[if #easyList == 4 and STAT.easyName and M.DH == 2 then --display for helping name 4 mod easyName combos - MSG.clear() - local alist1, alist2, blist1, blist2, clist1, clist2, dlist1, dlist2, elist1, elist2, flist1, flist2, glist1, glist2 = {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {} - local a1, a2, b1, b2, c1, c2, d1, d2, e1, e2, f1, f2, g1, g2 = {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {} - ins(alist1, list[1]); ins(alist2, list[2]); ins(alist2, list[3]); ins(alist2, list[4]) - a1 = GAME.getComboName(alist1, 'ingame'); a2 = GAME.getComboName(alist2, 'ingame') - for _, v in ipairs(a2) do - table.insert(a1, v) - end - MSG("dark", a1, 300) - - ins(blist1, list[2]); ins(blist2, list[1]); ins(blist2, list[3]); ins(blist2, list[4]) - b1 = GAME.getComboName(blist1, 'ingame'); b2 = GAME.getComboName(blist2, 'ingame') - for _, v in ipairs(b2) do - table.insert(b1, v) - end - MSG("dark", b1, 300) - - ins(clist1, list[3]); ins(clist2, list[1]); ins(clist2, list[2]); ins(clist2, list[4]) - c1 = GAME.getComboName(clist1, 'ingame'); c2 = GAME.getComboName(clist2, 'ingame') - for _, v in ipairs(c2) do - table.insert(c1, v) - end - MSG("dark", c1, 300) - - ins(dlist1, list[4]); ins(dlist2, list[1]); ins(dlist2, list[2]); ins(dlist2, list[3]) - d1 = GAME.getComboName(dlist1, 'ingame'); d2 = GAME.getComboName(dlist2, 'ingame') - for _, v in ipairs(d2) do - table.insert(d1, v) - end - MSG("dark", d1, 300) - - ins(elist1, list[1]); ins(elist1, list[2]); ins(elist2, list[3]); ins(elist2, list[4]) - e1 = GAME.getComboName(elist1, 'ingame'); e2 = GAME.getComboName(elist2, 'ingame') - for _, v in ipairs(e2) do - table.insert(e1, v) - end - MSG("dark", e1, 300) - - ins(flist1, list[1]); ins(flist1, list[3]); ins(flist2, list[2]); ins(flist2, list[4]) - f1 = GAME.getComboName(flist1, 'ingame'); f2 = GAME.getComboName(flist2, 'ingame') - for _, v in ipairs(f2) do - table.insert(f1, v) - end - MSG("dark", f1, 300) - - ins(glist1, list[1]); ins(glist1, list[4]); ins(glist2, list[2]); ins(glist2, list[3]) - g1 = GAME.getComboName(glist1, 'ingame'); g2 = GAME.getComboName(glist2, 'ingame') - for _, v in ipairs(g2) do - table.insert(g1, v) - end - MSG("dark", g1, 300) - end]] - --[[if #easyList == 5 and STAT.easyName and M.DH == 2 then - local sets = {{{1},{2, 3, 4, 5}},{{2},{1, 3, 4, 5}},{{3},{1, 2, 4, 5}},{{4},{1, 2, 3, 5}},{{5},{1, 2, 3, 4}},{{1, 2},{3, 4, 5}},{{1, 3},{2, 4, 5}}, - {{1, 4},{2, 3, 5}},{{1, 5},{2, 3, 4}},{{2, 3},{1, 4, 5}},{{2, 4},{1, 3, 5}},{{2, 5},{1, 3, 4}},{{3, 4},{1, 2, 5}},{{3, 5},{1, 2, 4}},{{4, 5},{1, 2, 3}}} - MSG.clear() - for i = 1, #sets do - local endList1, endList2, list1, list2 = {}, {},{},{} - for j = 1, #sets[i] do - for k = 1, #sets[i][j] do - ins(j == 1 and list1 or list2, list[ sets[i][j][k] ]) - end - end - endList1 = GAME.getComboName(list1, 'ingame'); endList2 = GAME.getComboName(list2, 'ingame') - for _, v in ipairs(endList2) do - table.insert(endList1, v) - end - MSG("dark", endList1, 300) - end - end]] else local cmbID = table.concat(list) if cmbID:count('r') >= 2 then @@ -953,6 +871,7 @@ function GAME.genQuest() end GAME.atkBuffer = clamp(GAME.atkBuffer - (max(floor / 3, GAME.atkBufferCap / 4) + MATH.rand(-.62, .62)), 0, GAME.atkBufferCap) if M.DP > 0 then r = r * (GAME[GAME.getLifeKey(true)] == 0 and 1.26 or 1.1) end + if M.DH == -1 then r = r * 5/8 end local pool = TABLE.copyAll(MD.weight) @@ -971,16 +890,30 @@ function GAME.genQuest() if #GAME.questStack then for i = 1, #GAME.questStack do for j = 1, #GAME.questStack[i].combo do - pool[GAME.questStack[i].combo[j]] = pool[GAME.questStack[i].combo[j]] - 0.9*pool[GAME.questStack[i].combo[j]] + if M.NH == 2 then + -- More probability to repeat stack quest's mods on rNH + pool[GAME.questStack[i].combo[j]] = pool[GAME.questStack[i].combo[j]] + 0.2*pool[GAME.questStack[i].combo[j]] + else + pool[GAME.questStack[i].combo[j]] = pool[GAME.questStack[i].combo[j]] - 0.8*pool[GAME.questStack[i].combo[j]] + end end end end local questCount = MATH.clamp(MATH.roundRnd(r), 1, GAME.maxQuestSize) - if questCount == 1 and M.DP ~= -1 then + if M.DP == -1 then + if questCount == 1 then + pool.DP = pool.DP * .2 + if #GAME.questStack then + pool.DP = pool.DP / 1.1 ^ (#GAME.questStack) + end + end + elseif questCount == 1 then -- Prevent 1-mod quest being DP - pool.DP = 0 if #GAME.questStack then - pool.DP = 0.1 + pool.DP = pool.DP * .1 + pool.DP = pool.DP / 1.1 ^ (#GAME.questStack) + else + pool.DP = 0 end elseif M.DH == 2 then -- Reduce DP on rDH @@ -1013,6 +946,7 @@ function GAME.genQuest() end end end + ins(combo, mod) else combo = {'EX','NH','MS','GV','VL','DH','IN','AS','DP'} -- ALL THE MODS @@ -1031,7 +965,11 @@ function GAME.genQuest() if #combo >= 7 then pwr = #combo end - SFX.play('garbagewindup_' .. MATH.clamp(pwr, 1, 9), 1, 0) + local tone = GAME.nightcore and 16.54 or 0 + if GAME.slowmo then tone = tone - 12 end + for i = 1, tone == 0 and 1 or 2 do + SFX.play('garbagewindup_' .. MATH.clamp(pwr, 1, 9), 1 / i, 0, tone) + end if pwr == 9 then IssueAchv("the_windup") end GAME.showWindup(pwr) end @@ -1050,7 +988,7 @@ function GAME.genQuest() GAME.faultWrong = false GAME.dmgWrongExtra = 0 GAME.gravTimer = false - GAME.achv_resetCount = 0 + GAME.resetCount = 0 for _, C in ipairs(CD) do C.touchCount, C.required, C.required2 = 0, false, false end if STAT.stacker and GAME.questStack[1] then for _, v in next, GAME.questStack[1].combo do CD[v].required = true end @@ -1063,7 +1001,9 @@ local windupTest = 0 function GAME.testWindup() windupTest = windupTest + 1 if windupTest > 9 then windupTest = 1 end - SFX.play('garbagewindup_' .. windupTest, 1, 0) + local tone = GAME.nightcore and 16.54 or 0 + if GAME.slowmo then tone = tone - 12 end + SFX.play('garbagewindup_' .. windupTest, 1, 0, tone) if windupTest == 9 and not ACHV.the_windup then TASK.new(function() TASK.yieldT(2.6) @@ -1540,6 +1480,7 @@ end function GAME.upFloor() local roundFloorTime = roundUnit(GAME.floorTime, .001) + local roundTime = roundUnit(GAME.time, .001) if GAME.floor == 1 then if GAME.comboStr == 'rEXrNHrVL' then SubmitAchv('hardcore_beginning', roundFloorTime) end elseif GAME.floor == 2 then @@ -1550,6 +1491,7 @@ function GAME.upFloor() if GAME.comboStr == 'EXrDPrVL' then SubmitAchv('unfair_battle', roundFloorTime) end elseif GAME.floor == 5 then if GAME.comboStr == 'DHDP' then SubmitAchv('museum_heist', roundFloorTime) end + if GAME.comboStr == 'ASINVL' and GAME.gigaCount == 0 then SubmitAchv('under_the_radar', roundTime) end elseif GAME.floor == 6 then if GAME.comboStr == 'EXVLrGV' then SubmitAchv('workaholic', roundFloorTime) end elseif GAME.floor == 7 then @@ -1619,7 +1561,6 @@ function GAME.upFloor() -- End game if GAME.floor >= 10 then - local roundTime = roundUnit(GAME.time, .001) if GAME.gigaspeed and #GAME.getHand(true) == 0 and GAME.pieceCount() == 0 and GAME.totalQuest <= 7 then IssueAchv('hyperplonk') end if GAME.gigaspeed or GAME.smithyMode then if GAME.time < STAT.minTime then @@ -1689,9 +1630,7 @@ function GAME.upFloor() end if GAME.time <= 76.2 then IssueSecret('subluminal') end if GAME.time <= 42 then IssueSecret('superluminal') end - if GAME.gigaspeed then - if GAME.time - GAME.gigaspeedEntered >= 300 then IssueAchv('worn_out') end - end + if GAME.time - GAME.gigaspeedEntered >= 300 then IssueAchv('worn_out') end if GAME.closeCard and GAME.comboStr == 'rEX' then IssueSecret('true_expert') end if GAME.nightcore and GAME.comboStr == 'rGV' then IssueSecret('true_master') end if GAME.fastLeak and GAME.comboStr == 'rVL' then IssueSecret('true_strength') end @@ -1807,7 +1746,7 @@ function GAME.downFloor() - GAME.floor * 3 ) -- Trevor Smithy - if M.GV == -1 then GAME.gravDelay = GravityTimer[3][GAME.negFloor] end + if M.GV == -1 then GAME.gravDelay = GravityTimer[3][GAME.negFloor] end -- not possible but kept here just in case if M.GV > 0 then GAME.gravDelay = GravityTimer[M.GV][GAME.negFloor] end -- Text & SFX @@ -1922,14 +1861,14 @@ function GAME.refreshModIcon() if hand[i] == 'eEX' then hand[i] = 'ueEX' end end end - if #hand == 1 then --if one mod + if #hand == 1 then quad = URM and TEXTURE.modQuad_ultra[hand[1]] or TEXTURE.modQuad_ig[hand[1]] _, _, w = quad:getViewport() GAME.modIB:add( quad, 0, 0, 0, .62, nil, w * .5, w * .5 ) - elseif #hand == 2 then --if two mods + elseif #hand == 2 then quad = URM and TEXTURE.modQuad_ultra[hand[2]] or TEXTURE.modQuad_ig[hand[2]] _, _, w = quad:getViewport() GAME.modIB:add( @@ -1942,7 +1881,7 @@ function GAME.refreshModIcon() quad, -35, 0, 0, .5, nil, w * .5, w * .5 ) - else --if 3+ mods + else local r = 35 for x = 4, 2, -1 do for i = #hand, 1, -1 do @@ -2091,6 +2030,8 @@ function GAME.refreshCurrentCombo() GAME.customUltraCombo = false elseif comboName == 'EASY VISIBLE TIDY ASCENDANT DAMNED LIFT' then comboName = '"BLASPHEMOUS ASCENSION"' + GAME.forceRev = GAME.pieceCount() < 2 + RefreshBGM() GAME.customUltraCombo = true elseif comboName == 'EASY BELIEVED DECEPTIVE MODERATE FRIENDLY SPIN' then comboName = '"PARADOXICAL ENTROPY"' @@ -2104,6 +2045,8 @@ function GAME.refreshCurrentCombo() GAME.customUltraCombo = true elseif comboName == 'EASY TIDY DESPERATE SAVED LIFTED HEARTACHE' then comboName = '"SEVERED VOLITION"' + GAME.forceRev = GAME.pieceCount() < 2 + RefreshBGM() GAME.customUltraCombo = true else GAME.customUltraCombo = false @@ -2161,13 +2104,7 @@ function GAME.refreshCurrentCombo() if not GAME.playing then GAME.comboMP = GAME.getComboMP(hand) GAME.comboZP = GAME.getComboZP(hand) - mp = GAME.comboMP - if GAME.comboMP < 0 then - mp = mp * -1 - TEXTS.mpPreview:set("-" .. mp .. " MP") - else - TEXTS.mpPreview:set(GAME.comboMP .. " MP") - end + TEXTS.mpPreview:set(GAME.comboMP .. " MP") TEXTS.zpPreview:set(("%.2fx ZP"):format(GAME.comboZP)) DailyActived = #GAME.getHand(true) == #DAILY and @@ -2179,14 +2116,7 @@ end function GAME.refreshLayout() -- Trevor Smithy - local mvl - if M.VL == -1 then - mvl = 1 - else - mvl = M.VL - end - local baseDist = 110 + (M.EX > 0 and (URM and M.EX == 2 and -30 or -10) or 0) + mvl * 20 + (GAME.closeCard and -30 or 0) + (GAME.ecloseCard and -50 or 0) - -- + local baseDist = 110 + (M.EX > 0 and (URM and M.EX == 2 and -30 or -10) or 0) + abs(M.VL) * 20 + (GAME.closeCard and -30 or 0) + (GAME.ecloseCard and -50 or 0) local baseL, baseR = 800 - 4 * baseDist - 70, 800 + 4 * baseDist + 70 local baseY = 726 + (URM and M.GV == 2 and 50 or 15 * M.GV) if FloatOnCard then @@ -2242,6 +2172,8 @@ function GAME.refreshLockState() CD.DP.lock = not ACHV.intended_glitch and not STAT.unlockAll end +---@author: Trevor Smithy +---Unlocks all mods function GAME.unlockAll() RevUnlocked = true STAT.unlockAll = true @@ -2376,7 +2308,7 @@ function GAME.refreshDailyChallengeText() or "" ) DailyAvailable = false --true - for _, v in next, DAILY do + --[[for _, v in next, DAILY do if v:find('r') then if GAME.completion[v:sub(2)] == 0 then DailyAvailable = false @@ -2388,7 +2320,7 @@ function GAME.refreshDailyChallengeText() break end end - end + end]] local str if DailyAvailable then local sortedDaily = TABLE.copy(DAILY) @@ -2412,6 +2344,14 @@ function GAME.refreshDailyChallengeText() SCN.scenes.tower.widgetList.daily:reset() end +function GAME.refreshPieceFstr() + TABLE.clear(GAME.pieceFstr) + for i = 1, #PieceData - 1 do + if GAME[PieceData[i].id] then TABLE.append(GAME.pieceFstr, PieceData[i].piece) end + end + GAME.pieceFstrObj:set(GAME.pieceFstr) +end + function GAME.swapControl() if GAME[GAME.getLifeKey(true)] > 0 then GAME.onAlly = not GAME.onAlly @@ -2425,15 +2365,15 @@ function GAME.cancelAll(instant) TASK.removeTask_code(GAME.task_cancelAll) TASK.new(GAME.task_cancelAll, instant) - if GAME.gravTimer and (not (URM and M.GV == 2) and GAME.achv_resetCount < 15) then GAME.gravTimer = GAME.gravDelay end + if GAME.gravTimer and GAME.resetCount < 15 and not (URM and M.GV == 2) then GAME.gravTimer = GAME.gravDelay end end function GAME.task_cancelAll(instant) if GAME.playing and not instant then - if GAME.achv_resetCount == 0 then + if GAME.resetCount == 0 then GAME.achv_noResetH = GAME.roundHeight end - GAME.achv_resetCount = GAME.achv_resetCount + 1 + GAME.resetCount = GAME.resetCount + 1 -- if GAME.achv_totalResetCount == 0 then -- if GAME.comboStr == 'ASDHNHVL' then -- SubmitAchv('minimalism', GAME.achv_maxChain) @@ -2498,6 +2438,16 @@ function GAME.task_toggleEasy() local mnh = 0 -- mod no hold if M.NH == -1 then mnh = 1.5 else mnh = M.NH end --if easy, don't be negative because then negative interval local pitch = M.GV < 0 and 2^(-1/2) or M.GV > 0 and 2 ^ ((URM and M.GV == 2 and 3 or M.GV) / 12) or 1 + local uneasy = (URM and M.EX == -1 and M.NH < 2 and M.MS < 2 and M.GV < 2 and M.VL < 2 and M.DH < 2 and M.IN < 2 and M.AS < 2 and M.DP < 2) and not GAME.anyRev + if uneasy then + pitch = pitch * 1.0145 + end + if GAME.slowmo then pitch = pitch / 2 end + if GAME.nightcore then pitch = pitch * 2 end + -- Trevor Smithy + if GAME.eslowmo then pitch = pitch * 2^(-1/2) end + if GAME.enightcore then pitch = pitch * 2 end + -- local interval = 0.2 / pitch for i = 1, #list do if needFlip[i] then @@ -2532,6 +2482,7 @@ function GAME.commit(auto, falseCommit) local hand = TABLE.sort(GAME.getHand(false)) local allyWasDead = GAME[GAME.getLifeKey(true)] == 0 + if not falseCommit then if #hand == 0 and GAME.questTime < .1 then return SFX.play('no') end @@ -2550,6 +2501,7 @@ function GAME.commit(auto, falseCommit) end end end + for _, id in next, GAME.lastCommit do CD[id].inLastCommit = false end GAME.lastCommit = TABLE.copy(hand) for _, id in next, GAME.lastCommit do CD[id].inLastCommit = true end @@ -2666,6 +2618,8 @@ function GAME.commit(auto, falseCommit) if stackCorrect and not falseCommit then -- if stackerMode then GAME.comboSFX = GAME.comboSFX + 1 if GAME.comboSFX > 16 then GAME.comboSFX = 16 end + TEXTS.combo:set(tostring(GAME.comboSFX)) + GAME.comboBounceTime = 4 if GAME.spikeCounter < 10 then SFX.play('combo_' .. GAME.comboSFX) else @@ -2717,7 +2671,7 @@ function GAME.commit(auto, falseCommit) if attack > 0 then GAME.addHeight(attack * GAME.attackMul) end GAME.addXP(attack + xp) rem(GAME.questStack, 1) - GAME.cancelAll(true) + if M.NH < 2 then GAME.cancelAll(true) end GAME.cancelBurn() GAME.fault = true GAME.questTime = 0 @@ -2737,7 +2691,7 @@ function GAME.commit(auto, falseCommit) local comboAttackMul = 1 local comboXPMul = 1 if GAME.comboSFX > 0 then - comboAttackMul = GAME.comboSFX/16 * 40 --40x height gain + comboAttackMul = GAME.comboSFX/16 * 30 --30x height gain comboXPMul = GAME.comboSFX/16 * 10 --10x XP gain end if #GAME.questStack > 16 and GAME.comboSFX == 0 then @@ -2755,6 +2709,7 @@ function GAME.commit(auto, falseCommit) if GAME.currentTask then GAME.incrementPrompt('pass') for i = 1, #hand do GAME.incrementPrompt('pass_' .. hand[i]) end + if #hand >= 4 then GAME.incrementPrompt('pass_windup') if #hand >= 5 then @@ -2762,6 +2717,7 @@ function GAME.commit(auto, falseCommit) end end end + if #hand == 7 and not TABLE.find(hand, 'DP') and M.EX == -1 and M.GV == -1 and M.IN == -1 then IssueAchv('trip_to_hell') end @@ -2791,9 +2747,10 @@ function GAME.commit(auto, falseCommit) GAME.bonusRecoveryHealth = GAME.bonusRecoveryHealth - 1 GAME.dmgTimerMul = GAME.dmgTimerMul - 1/3 end - GAME.heal(((dblCorrect or (eDPCorrect and correct == 1)) and 3 or 1) * GAME.dmgHeal + GAME.bonusRecoveryHealth) + if #GAME.questStack < 20 then GAME.heal(((dblCorrect or (eDPCorrect and correct == 1)) and 3 or 1) * GAME.dmgHeal + GAME.bonusRecoveryHealth) end if MATH.between(Floors[GAME.floor].top - (GAME.height + GAME.heightBuffer), 0, GAME.eglassCard and 4 or 2) then GAME.addHeight(GAME.eglassCard and 5 or 3, true) end - end + end + local dp = TABLE.find(hand, 'DP') local attack = 3 local surge = 0 @@ -3019,6 +2976,7 @@ function GAME.commit(auto, falseCommit) SubmitAchv('perfect_speedrun_plus', GAME.time) end end + if not falseCommit then SFX.play(dp and 'zenith_start_duo' or 'zenith_start', .626, 0, Tone(12)) @@ -3028,13 +2986,14 @@ function GAME.commit(auto, falseCommit) else if GAME.comboStr == 'DHEXMSNHVLrAS' and not GAME.achv_artistTrinityH then GAME.achv_artistTrinityH = GAME.roundHeight + if GAME.totalQuest >= 6 then SFX.play('btb_break') end end end if GAME.achv_felMagicBurnt then GAME.achv_felMagicBurnt = false GAME.achv_felMagicQuest = GAME.achv_felMagicQuest + 1 end - if GAME.achv_resetCount % 2 == 1 then + if GAME.resetCount % 2 == 1 then GAME.achv_obliviousQuest = GAME.achv_obliviousQuest + 1 end @@ -3061,6 +3020,7 @@ function GAME.commit(auto, falseCommit) attack = attack/((5/4)^((totalAssistPenalty-2)^1.6351896075)) end end + local roundedAttack = MATH.roundRnd(attack * GAME.attackMul * comboAttackMul / (1 + (#GAME.questStack)/4) / (GAME.badTime and 3 or 1)) if not falseCommit then GAME.spikeCounter = GAME.spikeCounter + roundedAttack + surge @@ -3069,6 +3029,7 @@ function GAME.commit(auto, falseCommit) GAME.maxSpikeWeak = max(GAME.maxSpikeWeak, GAME.spikeCounterWeak) if GAME.spikeCounter >= 8 then TEXTS.spike:set(tostring(GAME.spikeCounter)) end end + if URM and M.NH == 2 then xp = xp + surge surge = 0 @@ -3109,6 +3070,7 @@ function GAME.commit(auto, falseCommit) end attack = MATH.roundRnd(attack) + if not falseCommit then GAME.incrementPrompt('send', attack) GAME.totalAttack = GAME.totalAttack + attack @@ -3161,7 +3123,7 @@ function GAME.commit(auto, falseCommit) if eDPCorrect and correct == 1 then rem(GAME.quests, 3) GAME.totalQuest = GAME.totalQuest + 1 - if not allyWasDead then + if not allyWasDead and M.NH < 2 then for i = 1, #CD do if CD[i].active ~= CD[i].required2 then CD[i]:setActive(false) @@ -3177,7 +3139,7 @@ function GAME.commit(auto, falseCommit) SFX.play('card_slide_' .. rnd(4), .62) SFX.play(GAME.alleyoopCheck and 'social_notify_major' or 'social_notify_minor') end - elseif eDPCorrect and not allyWasDead then + elseif eDPCorrect and not allyWasDead and M.NH < 2 then for i = 1, #CD do if CD[i].active ~= CD[i].required then CD[i]:setActive(false) @@ -3200,10 +3162,10 @@ function GAME.commit(auto, falseCommit) if GAME.comboStr == 'DPMSrNH' then SubmitAchv('scarcity_mindset', GAME.totalFlip) end elseif GAME.totalQuest == 41 then if GAME.comboStr == 'EXMS' then SubmitAchv('quest_rationing', GAME.roundHeight) end - if GAME.comboStr == 'eEXeMS' and not URM then + if GAME.comboStr == 'eEXeMS' and not URM and not STAT.stacker then SubmitAchv('quest_feast', GAME.roundHeight) end - if GAME.comboStr == 'EXeDHeNH' then + if GAME.comboStr == 'EXeDHeNH' and not STAT.stacker then SubmitAchv('emperor_development', GAME.rank == GAME.peakRank and GAME.rank + (GAME.xp/(4*(GAME.rank+1))) or GAME.peakRank) end end @@ -3259,30 +3221,29 @@ function GAME.commit(auto, falseCommit) rem(GAME.quests, 1) GAME.genQuest() SFX.play("hold") - if #GAME.questStack > 26 then - GAME.takeDamage(GAME.dmgWrong * (#GAME.questStack-26)/10) + if #GAME.questStack >= 20 then + if #GAME.questStack > 20 then + GAME.takeDamage((M.MS == -1 and (GAME.dmgWrong + 1)/2 or GAME.dmgWrong) * (#GAME.questStack-20)/(M.MS == -1 and 20 or 10)) + end + if TASK.lock('hyperalert', 2) then + SFX.play("hyperalert", 1, 0, Tone(0)) + end end return end GAME.fault = true GAME.faultWrong = true - local minimumDmgWrong = 1 - if M.MS == -1 and (#hand ~= 0 or GAME[GAME.getLifeKey(true)] == 0) --[[and M.DP == 0]] then --just because there are quests that require taking damage - minimumDmgWrong = 0 -- NO, instead eMS should just disable those revive tasks! (done) - end -- but if the player really WANTS to kill themselves to start revive, then commit NOTHING still takes at least 1 damage if ally is alive + + local minimumDmgWrong = (M.MS == -1 and (#hand ~= 0 or GAME[GAME.getLifeKey(true)] == 0)) and 0 or 1 GAME.takeDamage(max(GAME.dmgWrong + GAME.dmgWrongExtra, minimumDmgWrong), 'wrong') if not GAME.playing then return end - if M.MS ~= -1 then - GAME.dmgWrongExtra = GAME.dmgWrongExtra + .5 - end + if M.MS ~= -1 then GAME.dmgWrongExtra = GAME.dmgWrongExtra + .5 end + -- Trevor Smithy + if M.EX > 0 and M.NH < 2 then GAME.cancelAll(true) end if M.GV ~= 0 then GAME.gravTimer = GAME.gravDelay end - if M.EX > 0 then - if M.NH < 2 then GAME.cancelAll(true) end - elseif M.AS == 1 then - GAME.cancelBurn() - end + if M.AS == 1 then GAME.cancelBurn() end end end @@ -3317,14 +3278,20 @@ function GAME.start() end if URM and M.VL == 2 and not UltraVlCheck('start') then return end TASK.removeTask_code(Task_MusicEnd) - TASK.removeTask_code(GAME.task_uneasyTeraspeed) MusicPlayer = false + + GAME.omega = false + GAME.negFloor = 1 + GAME.negEvent = 1 + GAME.timerMul = 1 + GAME.isUltraRun = GAME.anyUltra + + TASK.removeTask_code(GAME.task_uneasyTeraspeed) GAME.smithyMode = false GAME.OSPActivated = false GAME.finalFatigueOSPActivated = false GAME.teraComplete = false GAME.teraLostHeight = 0 - GAME.achv_bestFriendQuest = 0 GAME.achv_shamelessCashgrabQuest = 0 GAME.achv_overweightGamerQuest = 0 @@ -3332,18 +3299,12 @@ function GAME.start() GAME.achv_cleanBreakQuest = 0 GAME.achv_professionalCleanerQuest = 0 GAME.achv_roldSmythyQuest = 0 - GAME.noManualActivate = true GAME.noMouseOrSpin = true GAME.noKeyboardOrReset = true GAME.setupCheck = false GAME.dunk = false GAME.bigDunk = false - GAME.omega = false - GAME.negFloor = 1 - GAME.negEvent = 1 - GAME.timerMul = 1 - GAME.isUltraRun = GAME.anyUltra GAME.uneasyModIconSelected = false GAME.manualBGMPitch = nil @@ -3363,20 +3324,11 @@ function GAME.start() GAME.attackMul = (GAME.isUltraRun and .62 or (M.EX == -1 and URM and M.NH < 2 and M.MS < 2 and M.GV < 2 and M.VL < 2 and M.DH < 2 and M.IN < 2 and M.AS < 2 and M.DP < 2) and 0.33 or 1) * attackMulMod -- Trevor Smithy GAME.bonusRecoveryHealth = 0 - local slowMo = 0 - if GAME.eslowmo then - slowMo = 0.5 - end - --GAME.xpLockLevelMax = URM and M.NH == 2 and 1 or 5 - --GAME.leakSpeed = ((M.EX > 0 or M.DP == 2) and 5 or 3) + (GAME.fastLeak and 8 or 0) - GAME.xpLockLevelMax = (((URM and M.NH == 2 and 1) or (M.EX == -1 and 0) or (5)) + (GAME.efastLeak and 5 or 0) + (M.NH == -1 and 2 or 0)) * (1 + slowMo) - if GAME.xpLockLevelMax == 0 and GAME.eslowmo then - GAME.xpLockLevelMax = 1.5 - end + local slowMo = GAME.eslowmo and 0.5 or 0 + GAME.xpLockLevelMax = (((URM and M.NH == 2 and 1) or (M.EX == -1 and 0) or 5) + (GAME.efastLeak and 5 or 0) + (M.NH == -1 and 2 or 0)) * (1 + slowMo) + if GAME.xpLockLevelMax == 0 and GAME.eslowmo then GAME.xpLockLevelMax = 1.5 end -- fast leak increases leakSpeed to 2.666 times normal rate, slow leak decreases leakSpeed to 1/2.666 times normal rate, eslowmo halves leak speed - --GAME.leakSpeed = ((M.EX > 0 and 5 or 3) + (GAME.fastLeak and 8 or 0) + (M.EX == -1 and -1.2 or 0) + (GAME.efastLeak and -1.875 or 0) + (GAME.efastLeak and M.EX == -1 and (0.075 + 0.15) or 0)) / (1 + slowMo) GAME.leakSpeed = (((M.EX > 0 or (M.DP == 2 and M.EX ~= -1)) and 5 or 3) + (GAME.fastLeak and 8 or GAME.efastLeak and -1.875 or 0)) / (1 + slowMo) - -- GAME.invincible = false TASK.unlock('sure_quit') @@ -3392,6 +3344,7 @@ function GAME.start() GAME.playing = true -- Statistics + GAME.refreshPieceFstr() GAME.comboStr = table.concat(TABLE.sort(GAME.getHand(true))) GAME.prevPB = BEST.highScore[(GAME.isUltraRun and 'u' or '') .. GAME.comboStr] if GAME.prevPB == 0 then GAME.prevPB = -2600 end @@ -3526,6 +3479,8 @@ function GAME.start() TABLE.clear(GAME.quests) TABLE.clear(GAME.questStack) + GAME.comboSFX = 0 + GAME.comboBounceTime = 0 GAME.genQuest() TASK.removeTask_code(task_startSpin) @@ -3556,13 +3511,12 @@ function GAME.start() GAME.achv_felMagicQuest = 0 GAME.achv_artistTrinityH = nil GAME.achv_artistTrinityBurnt = false - GAME.achv_resetCount = 0 GAME.achv_obliviousQuest = 0 GAME.achv_doublePass = 0 GAME.achv_level19capH = nil GAME.achv_totalResetCount = 0 GAME.achv_altFromSurge = 0 - if M.DP > 0 then IssueAchv('intended_glitch') end + if M.DP ~= 0 then IssueAchv('intended_glitch') end end ---@param reason 'forfeit' | 'wrong' | 'time' @@ -3687,20 +3641,16 @@ function GAME.finish(reason) end GAME.currentTask = false - local unlockDuo - if GAME.totalQuest > 2.6 then + if GAME.totalQuest > 2.6 or GAME.gigaspeedEntered then LOG('info', ("[%s] (%s) F%d %.1fm in %.3fs"):format(reason, table.concat(GAME.getHand(true), ', '), GAME.floor, GAME.roundHeight, GAME.time)) + if GAME.totalQuest <= 2.6 and not ACHV.gigaplonk then IssueAchv('gigaplonk') end if GAME.floor >= 10 then local unlockRev = 0 for k, v in next, M do if v > GAME.completion[k] then if GAME.completion[k] == 0 then - if k == 'DP' then - unlockDuo = true - else - unlockRev = unlockRev + 1 - end + unlockRev = unlockRev + 1 RevUnlocked = true end GAME.completion[k] = v @@ -3784,7 +3734,7 @@ function GAME.finish(reason) IssueAchv('its_kinda_rare') end end - if STAT.mod == 'vanilla' and not TestMode and SupportCurl then + if GAME.totalQuest >= 20 and STAT.mod == 'vanilla' and not TestMode and SupportCurl then local curl = SYSTEM == 'Windows' and [[curl -s -X POST https://vercel-leaderboard-one.vercel.app/api -H "Content-Type: application/json" -d "$1"]] or [[curl -s -X POST https://vercel-leaderboard-one.vercel.app/api -H 'Content-Type: application/json' -d '$1']] @@ -4029,10 +3979,8 @@ function GAME.finish(reason) SubmitAchv('multitasker', roundUnit(GAME.height * GAME.comboMP, .1)) SubmitAchv('effective', zpGain) - SubmitAchv('drag_racing', GAME.peakRank) - if GAME.peakRank >= 26 then - SubmitAchv('your_too_fast', GAME.peakRank) - end + SubmitAchv('drag_racing', GAME.peakRank, GAME.peakRank < 26) + if GAME.peakRank >= 26 then SubmitAchv('your_too_fast', GAME.peakRank) end SubmitAchv('space_race', GAME.peakRank * GAME.comboMP) table.sort(maxCSP, function(a, b) return a[1] > b[1] end) for i = 1, #maxCSP do @@ -4044,9 +3992,6 @@ function GAME.finish(reason) SubmitAchv('empty_box', GAME.achv_noResetH or GAME.roundHeight) SubmitAchv('the_perfectionist', GAME.achv_perfectH or GAME.roundHeight) SubmitAchv('sunk_cost', GAME.achv_demoteH or GAME.roundHeight) - if M.GV ~= -1 then - SubmitAchv('patience_is_a_virtue', GAME.achv_noManualCommitH or GAME.roundHeight) - end SubmitAchv(GAME.comboStr, GAME.roundHeight) local soat = SubmitAchv('the_spike_of_all_time', GAME.maxSpikeWeak) SubmitAchv('the_spike_of_all_time_plus', GAME.maxSpike, soat) @@ -4078,13 +4023,16 @@ function GAME.finish(reason) SubmitAchv('spotless', GAME.achv_noDamageH or GAME.roundHeight) elseif GAME.comboStr == 'rAS' then SubmitAchv('arrogance', GAME.achv_noPerfectH or GAME.roundHeight) - SubmitAchv('fel_magic', GAME.achv_felMagicQuest) elseif GAME.comboStr == 'rDP' then SubmitAchv('overprotection', GAME.achv_protectH or GAME.roundHeight) - elseif GAME.comboStr == 'rGVrINrMS' then - SubmitAchv('the_masterful_juggler', GAME.achv_maxChain) elseif GAME.comboStr == 'DHVLrIN' then SubmitAchv('empurple', GAME.achv_noChargeH or GAME.roundHeight) + elseif GAME.comboStr == 'rGVrINrMS' then + SubmitAchv('the_masterful_juggler', GAME.achv_maxChain) + elseif GAME.comboStr == 'ASMSrGVrNH' then + SubmitAchv('autoplay_is_awesome', GAME.achv_noManualCommitH or GAME.roundHeight) + elseif GAME.comboStr == 'EXMSNHVLrAS' then + SubmitAchv('faltered', GAME.achv_noChargeH or GAME.roundHeight) elseif GAME.comboStr == 'ASDHDP' then SubmitAchv('a_mutual_agreement', GAME.achv_shareModH or GAME.roundHeight) elseif GAME.comboStr == 'ASDPVL' then @@ -4123,6 +4071,7 @@ function GAME.finish(reason) MSG("dark", "The Biggest Fan Score: " .. (GAME.achv_carriedH or GAME.roundHeight) .. " meters", 60) end end + if M.GV ~= -1 then SubmitAchv('patience_is_a_virtue', GAME.achv_noManualCommitH or GAME.roundHeight) end if M.EX < 2 and M.DP < 2 then SubmitAchv('speed_bonus', GAME.gigaCount + GAME.teraCount) end @@ -4169,7 +4118,7 @@ function GAME.finish(reason) end SubmitAchv('zenith_explorer_plus', GAME.roundHeight) SubmitAchv('supercharged_plus', GAME.achv_maxChain) - -- TODO if GAME.fullHealth <= 5 then IssueSecret('cardiac_arrest') end + if GAME.fullHealth <= 5 then IssueSecret('cardiac_arrest') end if GAME.time <= 600 then GAME.submitTimedAchievements() end @@ -4185,7 +4134,8 @@ function GAME.finish(reason) GAME.resIB:clear() end ReleaseAchvBuffer() - GAME.badTime = false + + GAME.badTime = nil GAME.setGigaspeedAnim(false) GAME.stopTeraspeed('fin') TASK.removeTask_code(task_startSpin) @@ -4196,18 +4146,7 @@ function GAME.finish(reason) GAME.refreshDailyChallengeText() GAME.prevPB = max(GAME.prevPB, GAME.height) - if unlockDuo then - CD.DP.lock = true - TASK.new(function() - TASK.yieldT(0.42) - CD.DP.lock = false - CD.DP:spin() - CD.DP:bounce(1200, .62) - SFX.play('supporter') - end) - end - - if URM and GAME.height < 0 then + if URM and GAME.height < -10 then PieceSFXID = 0 GAME.nightcore = false GAME.slowmo = false @@ -4241,7 +4180,7 @@ local questStyleDP = { { k = 0.85, y = 30, a = .7 }, } ----Submits timed achievements if its cdombo is active +---Submits timed achievements if its combo is active ---@author: Trevor Smithy function GAME.submitTimedAchievements() if GAME.comboStr == 'eDPeEX' and not URM then @@ -4294,11 +4233,11 @@ end local KBisDown = love.keyboard.isDown local damned = false -function GAME.update(dt,realDT) +function GAME.update(dt) GAME.spikeTimer = GAME.spikeTimer - dt for i = #GAME.windupAnim, 1, -1 do local w = GAME.windupAnim[i] - w.bumpTime = w.bumpTime - realDT + w.bumpTime = w.bumpTime - (GAME.slowmo and dt / 2 or dt) if w.lv < w.lvFin then if w.bumpTime <= 0 then w.lv = w.lv + 1 @@ -4307,7 +4246,7 @@ function GAME.update(dt,realDT) end end end - w.time = w.time + realDT + w.time = w.time + dt w.alpha = min((w.totalTime - w.time) * 5, 1) if w.time > w.totalTime then rem(GAME.windupAnim, i) end end @@ -4358,14 +4297,7 @@ function GAME.update(dt,realDT) -- Timers -- Trevor Smithy - local timerMulMod = 1 - if GAME.eslowmo then - timerMulMod = timerMulMod * 0.75 - end - if GAME.ecloseCard then - timerMulMod = timerMulMod * 2 - end - + local timerMulMod = 1 * (GAME.eslowmo and not GAME.badTime and 0.75 or 1) * (GAME.ecloseCard and not GAME.badTime and 2 or 1) GAME.time = GAME.time + dt * (GAME.timerMul * timerMulMod) local r = min(GAME.rank, 62) GAME.rankTimer[r] = GAME.rankTimer[r] + dt @@ -4384,6 +4316,12 @@ function GAME.update(dt,realDT) GAME.dmgHeal = GAME.dmgHeal - 0.05 * dt end end + + if GAME.comboBounceTime > 0 then + GAME.comboBounceTime = GAME.comboBounceTime - dt + else + GAME.comboBounceTime = 0 + end local uneasyMode = (M.EX == -1 and URM and M.NH < 2 and M.MS < 2 and M.GV < 2 and M.VL < 2 and M.DH < 2 and M.IN < 2 and M.AS < 2 and M.DP < 2) if ((GAME.slowmo and GAME.time >= 2.6) or (not GAME.slowmo and GAME.time >= 1)) and not GAME.uneasyModIconSelected then @@ -4507,21 +4445,7 @@ function GAME.update(dt,realDT) -- Height change -- Trevor Smithy - local passiveClimbSpeedMod = 1 - if GAME.enightcore then - passiveClimbSpeedMod = passiveClimbSpeedMod * 2 - end - if GAME.eglassCard then - passiveClimbSpeedMod = passiveClimbSpeedMod * 8 - end - if GAME.slowmo and uneasyMode then --if uneasy, slightly counter slowmo's reduced passive climb speed - passiveClimbSpeedMod = passiveClimbSpeedMod * 1.26 - end - - if GAME.badTime then - passiveClimbSpeedMod = -1 + (-1 * GAME.attackMul) - end - + local passiveClimbSpeedMod = (GAME.badTime and -1 + (-1 * GAME.attackMul)) or (GAME.enightcore and 2 or 1) * (GAME.eglassCard and 8 or 1) * (GAME.slowmo and uneasyMode and 1.26 or 1) * 1 --if uneasy, slightly counter slowmo's reduced passive climb speed local releaseHeight = GAME.heightBuffer GAME.heightBuffer = max(MATH.expApproach(GAME.heightBuffer, 0, dt * 6.3216), GAME.heightBuffer - 6000 * dt) releaseHeight = releaseHeight - GAME.heightBuffer @@ -4554,7 +4478,13 @@ function GAME.update(dt,realDT) end if GAME.height < NegFloors[GAME.negFloor].bottom and not GAME.einvisUI then GAME.downFloor() end if GAME.height < NegEvents[GAME.negEvent].h then GAME.nextNegEvent() end - if GAME.height <= 1800 and GAME.badTime then STAT.easyModeClicker = true end + if GAME.height <= -1650 and GAME.badTime and BgmPlaying ~= "fomg" then + PlayBGM('fomg', true) + end + if GAME.height <= -1800 and GAME.badTime and not STAT.greenClicker then + STAT.greenClicker = true + MSG("bright", "YOU DID A THING!") + end end else GAME.height = GAME.height + GAME.rank / 4 * passiveClimbSpeedMod * dt * (GAME.einvisUI and 1 or icLerp(GAME.eglassCard and 0.5 or 1, GAME.eglassCard and 3 or 6, Floors[GAME.floor].top - GAME.height)) @@ -4577,10 +4507,7 @@ function GAME.update(dt,realDT) if GAME.xpLockTimer > 0 then GAME.xpLockTimer = GAME.xpLockTimer - dt else - local closerCardLeakSpeedMod = 1 - if GAME.ecloseCard and GAME.height > 0 then - closerCardLeakSpeedMod = min((1+(GAME.height/1000000)), 2) - end + local closerCardLeakSpeedMod = (GAME.ecloseCard and GAME.height > 0) and min((1+(GAME.height/1000000)), 2) or 1 GAME.xp = GAME.xp - dt * GAME.leakSpeed * closerCardLeakSpeedMod * GAME.rank * (GAME.rank + 1) / 60 if GAME.xp <= 0 then GAME.xp = 0 @@ -4622,13 +4549,7 @@ function GAME.update(dt,realDT) -- Gravity -- Trevor Smithy - local gravTimerMod = 1 -- larger = slower, smaller = faster - if GAME.eslowmo then - gravTimerMod = 1.5 - end - if GAME.enightcore then - gravTimerMod = 0.5 - end + local gravTimerMod = 1 * (GAME.eslowmo and 1.5 or 1) * (GAME.enightcore and 0.5 or 1) if M.GV ~= 0 and GAME.gravTimer then GAME.gravTimer = GAME.gravTimer - dt / gravTimerMod if GAME.gravTimer <= 0 then @@ -4654,7 +4575,7 @@ function GAME.update(dt,realDT) GAME.omega = true GAME.showFloorText("Ī©", Floors[11].name, 6.2) SFX.play('zenith_levelup_a', 1, 0, Tone(1)) - PlayBGM('fomg', force) + PlayBGM('fomg', true) ins(GAME.secTime, GAME.floorTime) GAME.refreshSectionTime() GAME.floorTime = 0 @@ -4709,12 +4630,7 @@ function GAME.update(dt,realDT) -- Damage -- Trevor Smithy - local dmgTimerMulMod = 1 - if M.GV == -1 and GAME.eslowmo then - dmgTimerMulMod = 1.5 - elseif M.GV == -1 or GAME.eslowmo then - dmgTimerMulMod = 1.25 - end + local dmgTimerMulMod = 1 + (M.GV == -1 and 0.25 or 0) + (GAME.eslowmo and 0.25 or 0) GAME.dmgTimer = GAME.dmgTimer - dt / (GAME.dmgTimerMul * dmgTimerMulMod) if GAME.dmgTimer <= 0 then GAME.dmgTimer = GAME.dmgCycle @@ -4722,4 +4638,4 @@ function GAME.update(dt,realDT) end end -_G.GAME = GAME +return GAME diff --git a/module/game_data.lua b/module/game_data.lua deleted file mode 100644 index 36ba1d1b..00000000 --- a/module/game_data.lua +++ /dev/null @@ -1,2243 +0,0 @@ ---------------------------------------------------------------------- --- SPOILER WARNING -- --- This file contains secrets that may spoil your game experience. -- --- Be sure you've finished the game, including Ultra Reversed Mods -- --- Read at your own risk. -- ---------------------------------------------------------------------- - -GigaSpeedReq = { [0] = 7, 8, 8, 9, 9, 10, 1e99, 1e99, 1e99, 1e99, 1e99 } -TeraMusicReq = { [0] = 9, 11, 11, 12, 12, 13, 13, 1e99, 1e99, 1e99 } -PetaReq = { [0] = 11, 14, 14, 15, 15, 16, 16, 17, 1e99, 1e99 } -ExaReq = { [0] = 13, 17, 17, 18, 18, 19, 19, 20, 20, 1e99 } -ZettaReq = { [0] = 15, 20, 20, 21, 21, 22, 22, 23, 23, 24 } -YottaReq = { [0] = 17, 23, 23, 24, 24, 25, 25, 26, 26, 27 } -RonnaReq = { [0] = 19, 26, 26, 27, 27, 28, 28, 29, 29, 30 } -QuettaReq = { [0] = 21, 29, 29, 30, 30, 31, 31, 32, 32, 33 } - -GravityTimer = { - { 9.0, 8.0, 7.5, 7.0, 6.5, 6.0, 5.5, 5.0, 4.5, 4.0 }, - { 3.2, 3.0, 2.8, 2.6, 2.5, 2.4, 2.3, 2.2, 2.1, 2.0 }, - { 10.0, 9.0, 8.5, 8.0, 7.5, 7.0, 6.5, 6.0, 5.5, 5.0 }, -} - -ModData = { - deck = { - { id = 'EX', initOrder = 1, lockfull = false }, - { id = 'NH', initOrder = 2, lockfull = true }, - { id = 'MS', initOrder = 3, lockfull = true }, - { id = 'GV', initOrder = 4, lockfull = true }, - { id = 'VL', initOrder = 5, lockfull = true }, - { id = 'DH', initOrder = 6, lockfull = true }, - { id = 'IN', initOrder = 7, lockfull = true }, - { id = 'AS', initOrder = 8, lockfull = true }, - { id = 'DP', initOrder = 9, lockfull = false }, - }, - name = { - EX = 'expert', - NH = 'nohold', - MS = 'messy', - GV = 'gravity', - VL = 'volatile', - DH = 'doublehole', - IN = 'invisible', - AS = 'allspin', - DP = 'duo', - }, - fullName = { - EX = "< EXPERT MODE >", - NH = "< NO HOLD >", - MS = "< MESSINESS >", - GV = "< GRAVITY >", - VL = "< VOLATILITY >", - DH = "< DOUBLE HOLE >", - IN = "< INVISIBLE >", - AS = "< ALL-SPIN >", - DP = "< DUO >", - lock = "< LOCKED >", - lockDP = "< LOCKED? >", - }, - desc = { - EX = "A LESS LENIENT CHALLENGE, FOR THOSE WHO DARE", - NH = "CANCELING IS DISABLED", - MS = "SHUFFLE CARDS BY FLOOR", - GV = "AUTO COMMITS OCCUR PERIODICALLY", - VL = "LARGER GAPS BETWEEN CARDS, MUST CLICK TWICE", - DH = "COMBO DIFFICULTY IS INCREASED", - IN = "CARDS ARE FACED DOWN AND FLASH ONCE EVERY TWO SECONDS", - AS = "ENABLE KEYBOARD CONTROLS, BUT DOUBLE CLICKING IS PENALIZED", - DP = "FLOOD THE TOWER WITH SOMEONE WHO DOESN'T EXIST", - lock = "REACH A HIGHER FLOOR TO UNLOCK", - lockDP = "PLAY THIS MOD ONCE TO UNLOCK", - }, - revName = { - EX = "> THE TYRANT <", - NH = "> ASCETICISM <", - MS = "> LOADED DICE <", - GV = "> FREEFALL <", - VL = "> LAST STAND <", - DH = "> DAMNATION <", - IN = "> THE EXILE <", - AS = "> THE WARLOCK <", - DP = "> BLEEDING HEARTS <", - }, - revDesc = { - EX = "FEAR, OPPRESSION, AND LIMITLESS AMBITION", - NH = "A DETACHMENT FROM EVEN THAT WHICH IS MODERATE", - MS = "IN A RIGGED GAME, YOUR MIND IS THE ONLY FAIR ADVANTAGE", - GV = "THE GROUND YOU STOOD ON NEVER EXISTED IN THE FIRST PLACE", - VL = "STRENGTH ISN'T NECESSARY FOR THOSE WITH NOTHING TO LOSE", - DH = "NEITHER THE FREEDOM OF LIFE OR PEACE OF DEATH", - IN = "NEVER UNDERESTIMATE BLIND FAITH", - AS = "INTO REALMS BEYOND HEAVEN AND EARTH", - DP = "EVEN AS WE BLEED, WE KEEP HOLDING ON...", - }, - ultraName = { - EX = "- PSYCHOTIC SOVEREIGN -", - NH = "- ASCENDED VIRTUE -", - MS = "- ENTROPY -", - GV = "- COLLAPSING GALAXY -", - VL = "- DIMINISHING VOLITION -", - DH = "- BLASPHEMY -", - IN = "- PARADOXICAL NIHILITY -", - AS = "- DEPRAVED GRIMOIRE -", - DP = "- SEVERED EDEN -", - }, - ultraDesc = { - EX = "ROTTEN AUTHORITY AND UNJUST LAW, USURPED THY MORAL AND PEASANTRY", - NH = "FOR THY SACRIFICES, TRANSCENDENCE AWAITS, MORTAL...", - MS = "A DISTORTED FATE RESULTED FROM UNGOVERNED ENIGMATA", - GV = "THE UNIVERSE CRUMBLES, WITH ESCAPE MERELY TEMPORARY", - VL = "CRUSHED BENEATH DESPAIR, RESISTANCE FADES TO NOTHING", - DH = "HARK! THE HOPELESS, DAMNED WEEPING OF THY WILL...", - IN = "ETERNALLY DROWNING IN ENIGMATIC DOUBTS, UNCERTAINTY AND HYSTERIA", - AS = "ILL-NATURED, TENEBRIOUS, LIFE-DRAINING MAGIC CLASPS THY SOUL...", - DP = "WHAT ONCE WAS INTERTWINED NOW NEVER TO COEXIST", - }, - -- Trevor Smithy - easyName = { - EX = "< EASY MODE >", - NH = "< MODERATE HOLD >", - MS = "< TIDINESS >", - GV = "< LIFT >", - VL = "< TRANQUILITY >", - DH = "< SALVATION >", - IN = "< VISIBLE >", - AS = "< SPIN >", - DP = "< FRIEND >", - }, - easyDesc = { - EX = "A MORE LENIENT CHALLENGE", - NH = "CANCELING IS DIFFICULT, MUST CLICK TWICE", - MS = "SHUFFLES SOME CARDS", - GV = "AUTO COMMITS OCCUR", - VL = "LARGER GAPS BETWEEN CARDS", - DH = "COMBO DIFFICULTY IS DECREASED", - IN = "CARDS ARE FACED DOWN AND ARE HIGHLIGHTED", - AS = "ENABLE KEYBOARD CONTROLS", - DP = "FLOOD THE TOWER WITH AN IMAGINARY FRIEND", - }, - uneasyName = { - EX = "< UNEASY MODE >", - NH = "< MODERATE HOLD >", - MS = "< TIDINESS >", - GV = "< LIFT >", - VL = "< TRANQUILITY >", - DH = "< SALVATION >", - IN = "< VISIBLE >", - AS = "< SPIN >", - DP = "< FRIEND >", - }, - uneasyDesc = { - EX = "THE WEIGHT OF REALITY PRESENTS ITS OWN CHALLENGE", - NH = "CANCELING IS DIFFICULT, MUST CLICK TWICE", - MS = "SHUFFLES SOME CARDS", - GV = "AUTO COMMITS OCCUR", - VL = "LARGER GAPS BETWEEN CARDS", - DH = "COMBO DIFFICULTY IS DECREASED", - IN = "CARDS ARE FACED DOWN AND ARE HIGHLIGHTED", - AS = "ENABLE KEYBOARD CONTROLS", - DP = "FLOOD THE TOWER WITH AN IMAGINARY FRIEND", - }, - -- - ultraImpactTone = { - EX = { 0, nil, 0 }, -- 6 6 - NH = { 0, 5 }, -- 5 2 - MS = { 3, 5, 7 }, -- 1 2 3 - GV = { -4, 8 }, -- 4 4 - VL = { -5, 0 }, -- 3 6 - DH = { 1, 6, 9 }, -- #6 #2 #4 - IN = {}, - AS = { 0, 3 }, -- 6 1 - DP = { -2, 5 }, -- 5 2 - }, - weight = { - EX = 13, -- 8 + 5 - NH = 12, -- 8 + 4 - MS = 14, -- 10 + 4 - GV = 12, -- 10 + 2 - VL = 17, -- 15 + 2 - DH = 12, -- 8 + 4 - IN = 7, -- 6 + 1 - AS = 13, -- 10 + 3 - DP = 4, -- 3 + 1 - }, - color = { - EX = { COLOR.HEX "89590BFF" }, - NH = { COLOR.HEX "FF00D4FF" }, - MS = { COLOR.HEX "FFB400FF" }, - GV = { COLOR.HEX "FFFF00FF" }, - VL = { COLOR.HEX "FF1500FF" }, - DH = { COLOR.HEX "47ACFFFF" }, - IN = { COLOR.HEX "BD24FFFF" }, - AS = { COLOR.HEX "00FED4FF" }, - DP = { COLOR.HEX "FF8C9DFF" }, - }, - textColor = { - EX = { COLOR.HEX "C29F68FF" }, - NH = { COLOR.HEX "FF98E2FF" }, - MS = { COLOR.HEX "FFD572FF" }, - GV = { COLOR.HEX "EDFF96FF" }, - VL = { COLOR.HEX "FF978DFF" }, - DH = { COLOR.HEX "99D0FFFF" }, - IN = { COLOR.HEX "D3AAFFFF" }, - AS = { COLOR.HEX "8AFFDEFF" }, - DP = { COLOR.HEX "FFC0C9FF" }, - eEX = { COLOR.HEX "C29F68FF" }, - eNH = { COLOR.HEX "FF98E2FF" }, - eMS = { COLOR.HEX "FFD572FF" }, - eGV = { COLOR.HEX "EDFF96FF" }, - eVL = { COLOR.HEX "FF978DFF" }, - eDH = { COLOR.HEX "99D0FFFF" }, - eIN = { COLOR.HEX "D3AAFFFF" }, - eAS = { COLOR.HEX "8AFFDEFF" }, - eDP = { COLOR.HEX "FFC0C9FF" }, - }, - -- Trevor Smithy - --prio_name = { IN = 0, MS = 1, VL = 2, NH = 3, DH = 4, AS = 5, GV = 6, EX = 7, DP = 8, rIN = 0, rMS = 1, rVL = 2, rNH = 3, rDH = 4, rAS = 5, rGV = 6, rEX = 7, rDP = 8 }, - --prio_icon = { EX = 0, DP = 1, DH = 2, VL = 3, GV = 4, NH = 5, MS = 6, IN = 7, AS = 8, rEX = 0, rDP = 1, rDH = 2, rVL = 3, rGV = 4, rNH = 5, rMS = 6, rIN = 7, rAS = 8 }, - --prio_card = { EX = 0, NH = 1, MS = 2, GV = 3, VL = 4, DH = 5, IN = 6, AS = 7, DP = 8, rEX = 0, rNH = 1, rMS = 2, rGV = 3, rVL = 4, rDH = 5, rIN = 6, rAS = 7, rDP = 8 }, - prio_name = { IN = 1, MS = 3, VL = 5, NH = 7, DH = 9, AS = 11, GV = 13, EX = 15, DP = 18, rIN = 1, rMS = 3, rVL = 5, rNH = 7, rDH = 9, rAS = 11, rGV = 13, rEX = 15, rDP = 16, eEX = 0, eIN = 2, eMS = 4, eVL = 6, eNH = 8, eDH = 10, eGV = 12, eDP = 14, eAS = 17 }, - prio_icon = { EX = 0, DP = 1, DH = 2, VL = 3, GV = 4, NH = 5, MS = 6, IN = 7, AS = 8, rEX = 0, rDP = 1, rDH = 2, rVL = 3, rGV = 4, rNH = 5, rMS = 6, rIN = 7, rAS = 8, eEX = 0, eDP = 1, eDH = 2, eVL = 3, eGV = 4, eNH = 5, eMS = 6, eIN = 7, eAS = 8 }, - prio_card = { EX = 0, NH = 1, MS = 2, GV = 3, VL = 4, DH = 5, IN = 6, AS = 7, DP = 8, rEX = 0, rNH = 1, rMS = 2, rGV = 3, rVL = 4, rDH = 5, rIN = 6, rAS = 7, rDP = 8, eEX = 0, eNH = 1, eMS = 2, eGV = 3, eVL = 4, eDH = 5, eIN = 6, eAS = 7, eDP = 8 }, - -- - adj = { - EX = "EXPERT", - NH = "HOLDLESS", - MS = "MESSY", - GV = "GRAVITY", - VL = "VOLATILE", - DH = "DOUBLE HOLE", - IN = "INVISIBLE", - AS = "ALL-SPIN", - DP = "DUO", - rEX = "TYRANNICAL", - rNH = "ASCENDANT", - rMS = "DECEPTIVE", - rGV = "COLLAPSED", - rVL = "DESPERATE", - rDH = "DAMNED", - rIN = "BELIEVED", - rAS = "OMNI-SPIN", - rDP = "PIERCING", - -- Trevor Smithy - eEX = "EASY", -- 0 7 - eNH = "MODERATE", -- 4 3 - eMS = "TIDY", -- 2 1 - eGV = "LIFTED", -- 6 6 - eVL = "TRANQUIL", -- 3 2 - eDH = "SAVED", -- 5 4 - eIN = "VISIBLE", -- 1 0 - eAS = "SPUN", -- 8 5 - eDP = "FRIENDLY", -- 7 8 - }, - noun = { - EX = "EXPERT", - NH = "NO HOLD", - MS = "MESSINESS", - GV = "GRAVITY", - VL = "VOLATILITY", - DH = "DOUBLE HOLE", - IN = "INVISIBILITY", - AS = "ALL-SPIN", - DP = "DUO", - rEX = "TYRANNY", - rNH = "ASCENSION", - rMS = "DECEPTION", - rGV = "COLLAPSE", - rVL = "DESPERATION", - rDH = "DAMNATION", - rIN = "BELIEF", - rAS = "OMNI-SPIN", - rDP = "HEARTACHE", - -- Trevor Smithy - eEX = "EASY", - eNH = "MODERATION", - eMS = "TIDINESS", - eGV = "LIFT", - eVL = "TRANQUILITY", - eDH = "SALVATION", - eIN = "VISIBILITY", - eAS = "SPIN", --8 - eDP = "FRIEND", - }, -} - -ComboData = { - menu = { - { set = "NH GV", name = "A Modern Classic" }, - { set = "NH MS DH", name = "Deadlock" }, - { set = "MS DH AS", name = "The Escape Artist" }, - { set = "GV IN", name = "The Grandmaster" }, - { set = "EX NH DH", name = "Emperor's Decadence" }, - { set = "EX MS VL DH", name = "Divine Mastery" }, - { set = "NH AS", name = "The Starving Artist" }, - { set = "EX VL AS", name = "The Con Artist" }, - { set = "EX DP", name = "Trained Professionals" }, - { set = "EX MS", name = "Block Rationing" }, - - { set = "rMS AS", name = "Naga Eyes" }, - { set = "rGV rIN", name = "The Grandmaster+" }, - { set = "EX NH rAS", name = "Magic School" }, - { set = "rNH rDH IN rAS", name = "The Spellcaster" }, - { set = "EX rGV DH", name = "Demonic Speed" }, - { set = "EX NH rMS GV", name = "Bnuuy" }, - { set = "rNH rMS GV AS DP", name = "Grand-Master! Rounds" }, - { set = "rEX rVL DH", name = "Sweat and Ruin" }, - { set = "rMS GV AS rDP", name = "Cupid's Gamble" }, - { set = "NH rGV VL rDP", name = "Despairful Longing" }, - { set = "rEX VL rIN", name = "Authoritarian Delusion" }, - { set = "rEX rDP", name = "Tyrannical Dyarchy" }, - { set = "rEX MS rDH IN", name = "Sisyphean Monarchy" }, - { set = "MS rDH rIN AS", name = "Kitsune Trickery" }, - { set = "EX NH MS VL DH rAS", name = "The Artist Trinity" }, - { set = "VL DH rIN", name = "Empurple" }, - { set = "rNH MS rGV AS", name = "Autoplay is Awesome" }, - { set = "DH AS DP", name = "A Mutual Agreement" }, - { set = "VL AS DP", name = "The Cheaters" }, - { set = "NH rGV", name = "Clutch Main" }, - { set = "EX VL", name = "Wax Wings" }, - { set = "rMS rGV rIN", name = "The Masterful Juggler" }, - { set = "DH rIN AS", name = "The Oblivious Artist" }, - { set = "NH rVL AS", name = "Zero-To-Sixty" }, - { set = "rNH MS DP", name = "Scarcity Mindset" }, - { set = "VL rGV", name = "Fickle Fuel" }, - - { set = "rEX rNH rVL", name = "Hardcore Beginning" }, - { set = "EX VL rIN rDP", name = "Love Hotel" }, - { set = "EX MS AS", name = "Financially Responsible" }, - { set = "EX rVL rDP", name = "Unfair Battle" }, - { set = "DH DP", name = "Museum Heist" }, - { set = "EX rGV VL", name = "Workaholic" }, - { set = "MS VL AS", name = "Human Experiment" }, - { set = "EX GV DH", name = "Thermal Anomaly" }, - { set = "MS GV AS", name = "Dazed" }, - - -- Trevor Smithy - -- ultras -- NOTICE: IF THESE ARE MOVED OUT OF THIS ORDER, MAKE SURE TO UPDATE generateRandomCombo() IN tower.lua to reflect this! - { set = "eEX rGV eDH eAS", name = "Patience is a Virtue" }, - { set = "rEX eNH eMS eGV eVL eDH eIN eAS", name = "Super Hard Bath Water"}, --whoops this should be peasant revolution (handled in game.lua) - --{ set = "rEX eNH eMS eGV eVL eDH eIN eAS", name = "Peasant Revolution"}, - { set = "eEX rNH eGV eDH", name = "Holy Ascension"}, - { set = "eEX rMS eIN eDP", name = "Stabilized Entropy"}, - { set = "eEX rGV eAS eDP", name = "Restrained Collapse"}, - { set = "eEX eDH eGV rVL", name = "Restored Volition"}, - { set = "eEX eMS rDH eIN", name = "Disproven Blasphemy"}, - { set = "eEX eNH rIN eAS", name = "Solved Paradox"}, - { set = "eEX eNH eVL rAS", name = "Demystified Grimoire"}, - { set = "eEX eMS eVL rDP", name = "Lasting Eden"}, - -- Bath Waters - { set = "eEX eNH eMS eGV eVL eDH eIN eAS", name = "Bath Water"}, - { set = "eNH eMS eGV eVL eDH eIN eAS", name = "Normal Bath Water"}, -- soft e, normal, hard ue, very hard - { set = "eEX eMS eGV eVL eDH eIN eAS", name = "Warm Bath Water"}, -- cool e, warm, hot - { set = "eEX eNH eGV eVL eDH eIN eAS", name = "Clean Bath Water"}, -- pure e, clean, dirty - { set = "eEX eNH eMS eVL eDH eIN eAS", name = "Jacuzzi Bath Water"}, -- jacuzzi, bubbly e, flat - { set = "eEX eNH eMS eGV eDH eIN eAS", name = "Still Bath Water"}, -- still, calm e, turbulent - { set = "eEX eNH eMS eGV eVL eIN eAS", name = "Holy Bath Water"}, -- sacred e, holy, unholy - { set = "eEX eNH eMS eGV eVL eDH eAS", name = "Cloudy Bath Water"}, -- clear e, cloudy, murky - { set = "eEX eNH eMS eGV eVL eDH eIN", name = "Plain Bath Water"}, -- plain, mystical e, magical - { set = "EX eNH eMS eGV eVL eDH eIN eAS", name = "Very Hard Bath Water"}, -- credit: TheBestNoob - { set = "eEX NH eMS eGV eVL eDH eIN eAS", name = "Hot Bath Water"}, - { set = "eEX eNH MS eGV eVL eDH eIN eAS", name = "Dirty Bath Water"}, - { set = "eEX eNH eMS GV eVL eDH eIN eAS", name = "Flat Bath Water"}, - { set = "eEX eNH eMS eGV VL eDH eIN eAS", name = "Turbulent Bath Water"}, - { set = "eEX eNH eMS eGV eVL DH eIN eAS", name = "Unholy Bath Water"}, - { set = "eEX eNH eMS eGV eVL eDH IN eAS", name = "Murky Bath Water"}, - { set = "eEX eNH eMS eGV eVL eDH eIN AS", name = "Magical Bath Water"}, - { set = "eEX eNH eMS eGV eVL eDH eIN eAS eDP", name = "Bath With A Friend"}, - { set = "eNH eMS eGV eVL eDH eIN eAS eDP", name = "Normal Bath With A Friend"}, - { set = "eEX eMS eGV eVL eDH eIN eAS eDP", name = "Warm Bath With A Friend"}, - { set = "eEX eNH eGV eVL eDH eIN eAS eDP", name = "Clean Bath With A Friend"}, - { set = "eEX eNH eMS eVL eDH eIN eAS eDP", name = "Jacuzzi Bath With A Friend"}, - { set = "eEX eNH eMS eGV eDH eIN eAS eDP", name = "Still Bath With A Friend"}, - { set = "eEX eNH eMS eGV eVL eIN eAS eDP", name = "Holy Bath With A Friend"}, - { set = "eEX eNH eMS eGV eVL eDH eAS eDP", name = "Cloudy Bath With A Friend"}, - { set = "eEX eNH eMS eGV eVL eDH eIN eDP", name = "Plain Bath With A Friend"}, - { set = "EX eNH eMS eGV eVL eDH eIN eAS eDP", name = "Very Hard Bath With A Friend"}, - { set = "rEX eNH eMS eGV eVL eDH eIN eAS eDP", name = "Super Hard Bath With A Friend"}, - { set = "eEX NH eMS eGV eVL eDH eIN eAS eDP", name = "Hot Bath With A Friend"}, - { set = "eEX eNH MS eGV eVL eDH eIN eAS eDP", name = "Dirty Bath With A Friend"}, - { set = "eEX eNH eMS GV eVL eDH eIN eAS eDP", name = "Flat Bath With A Friend"}, - { set = "eEX eNH eMS eGV VL eDH eIN eAS eDP", name = "Turbulent Bath With A Friend"}, - { set = "eEX eNH eMS eGV eVL DH eIN eAS eDP", name = "Unholy Bath With A Friend"}, - { set = "eEX eNH eMS eGV eVL eDH IN eAS eDP", name = "Murky Bath With A Friend"}, - { set = "eEX eNH eMS eGV eVL eDH eIN AS eDP", name = "Magical Bath With A Friend"}, - -- Any non-messy combination with AS and/or DP = Gamer Girl Bath Water - { set = "eEX eNH eGV eVL eDH eIN AS DP", name = "Gamer Girl Bath Water"}, - { set = "eEX eNH eGV eVL eDH eIN eAS DP", name = "Gamer Girl Bath Water"}, - { set = "eEX eNH eGV eVL eDH eIN AS eDP", name = "Gamer Girl Bath Water"}, - -- Credit: Rejuvenating rack/Mikamiyu - { set = "eEX eNH rMS eGV VL eDH eIN eAS", name = "Goth Mommy Bath Water"}, - -- Credit: FCSplayz - { set = "eEX eNH eMS eGV rVL rDH eAS rDP", name = "Shocking Bath With A Toaster"}, - -- Credit: Flowerling - { set = "rEX MS eIN", name = "Omniscence"}, - -- Credit: LovelyStar - { set = "eEX MS VL eIN", name = "Stargazing"}, - -- Credit: TheBestNoob - { set = "eEX NH MS GV VL DH IN AS", name = "Easy Swamp Water"}, - { set = "eEX NH MS GV VL DH IN AS eDP", name = "Easy Swamp Water With A Friend"}, - { set = "eEX NH MS GV VL DH IN AS DP", name = "Easy Swamp Water With A Lover"}, - -- Credit: F1e308 - { set = "eEX eNH eMS eGV eVL eDH eIN eAS DP", name = "Bath With A Lover"}, - { set = "eEX eNH eMS eGV eVL eDH eIN eAS rDP", name = "Bath With An Ex"}, - - --misc (no dev commentary except programming smithy) - { set = "eNH eGV", name = "Shameless Cashgrab"}, - { set = "eNH eMS eDH", name = "Clean Break"}, - { set = "eMS eDH eAS", name = "Clean Gamer"}, - { set = "eGV eIN", name = "Humble Pupil"}, - { set = "EX eNH eDH", name = "Emperor's Development"}, - { set = "eEX eMS eVL eDH", name = "Professional Cleaner"}, - { set = "eNH eAS", name = "Overweight Gamer"}, - { set = "eEX eVL eAS", name = "The Pro G(r)am(m)ing Smithy"}, - { set = "eEX eDP", name = "Best Friends"}, - { set = "eEX eMS", name = "Block Feast"}, - --future achievement update - { set = "eEX eNH", name = "Spending Spree"}, - -- eMS is already done as block feast - { set = "eEX eGV", name = "Comfy Bed"}, - { set = "eEX eVL", name = "Professional Weightlifter"}, - { set = "eEX eDH", name = "Heaven"}, - { set = "eEX eIN", name = "Perfect Vision"}, - { set = "eEX eAS", name = "Gaming Addict"}, - -- eDP is already done as best friends - { set = "eNH eMS eGV eDH eIN eDP", name = "Rold Smythy"}, - { set = "eEX eNH eMS eVL eDH eAS", name = "God Gamer"} - }, - - game = { - { set = "NH GV", name = "A Modern Classic" }, - { set = "NH MS DH", name = "Deadlock" }, - { set = "MS DH AS", name = "The Escape Artist" }, - { set = "GV IN", name = "The Grandmaster" }, - { set = "EX NH DH", name = "Emperor's Decadence" }, - { set = "EX MS VL DH", name = "Divine Mastery" }, - { set = "NH AS", name = "The Starving Artist" }, - { set = "EX VL AS", name = "The Con Artist" }, - { set = "EX DP", name = "Trained Professionals" }, - { set = "EX MS", name = "Block Rationing" }, - }, - - -- rDH database, from tetr.io's community: - -- https://docs.google.com/spreadsheets/d/1syh3q2oiduCZb1cJ5QI95Y2XhhedAfhv4YnEH9z2tbc - gameEX = { - { set = "rEX", name = "The Tyrant" }, - { set = "rNH", name = "Asceticism" }, - { set = "rMS", name = "Loaded Dice" }, - { set = "rGV", name = "Freefall" }, - { set = "rVL", name = "Last Stand" }, - { set = "rDH", name = "Damnation" }, - { set = "rIN", name = "The Exile" }, - { set = "rAS", name = "The Warlock" }, - { set = "rDP", name = "Bleeding Hearts" }, - { set = "urEX", name = "Psychotic Sovereign" }, - { set = "urNH", name = "Ascended Virtue" }, - { set = "urMS", name = "Entropy" }, - { set = "urGV", name = "Collapsing Galaxy" }, - { set = "urVL", name = "Diminishing Volition" }, - { set = "urDH", name = "Blasphemy" }, - { set = "urIN", name = "Paradoxical Nihility" }, - { set = "urAS", name = "Depraved Grimoire" }, - { set = "urDP", name = "Severed Eden" }, - - { set = "EX", name = "The Emperor" }, - { set = "NH", name = "Temperance" }, - { set = "MS", name = "Wheel of Fortune" }, - { set = "GV", name = "The Tower" }, - { set = "VL", name = "Strength" }, - { set = "DH", name = "The Devil" }, - { set = "IN", name = "The Hermit" }, - { set = "AS", name = "The Magician" }, - { set = "DP", name = "The Lovers" }, - { set = "EX NH", name = "A Fair Leader" }, - { set = "EX MS", name = "Block Rationing" }, - { set = "EX GV", name = "Invictus" }, - { set = "EX VL", name = "Icarus" }, - { set = "EX DH", name = "The Devil's Temptation" }, - { set = "EX IN", name = "Emperor's Dilemma" }, - { set = "EX AS", name = "Dancing Queen" }, - { set = "EX DP", name = "Trained Professionals" }, - { set = "NH MS", name = "All in" }, - { set = "NH GV", name = "A Modern Classic" }, - { set = "NH VL", name = "Resistance" }, - { set = "NH DH", name = "Purgatory Lite" }, - { set = "NH IN", name = "Helen Keller" }, - { set = "NH AS", name = "The Starving Artist" }, - { set = "NH DP", name = "Hand in Hand" }, - { set = "MS GV", name = "Cheese Race" }, - { set = "MS VL", name = "Swiss Cheese" }, - { set = "MS DH", name = "Dig In" }, - { set = "MS IN", name = "Blind Bet" }, - { set = "MS AS", name = "Roulette Wheel" }, - { set = "MS DP", name = "It's Complicated..." }, - { set = "GV VL", name = "Comfort Food" }, - { set = "GV DH", name = "The Speed Demon" }, - { set = "GV IN", name = "The Grandmaster" }, - { set = "GV AS", name = "The Juggler" }, - { set = "GV DP", name = "Heavy Hearts" }, - { set = "VL DH", name = "Lucifer" }, - { set = "VL IN", name = "Memorization" }, - { set = "VL AS", name = "Water From Stone" }, - { set = "VL DP", name = "Power Couple" }, - { set = "DH IN", name = "The Ghost" }, - { set = "DH AS", name = "The Deal with the Devil" }, - { set = "DH DP", name = "Forbidden Lovers" }, - { set = "IN AS", name = "The Abstract Artist" }, - { set = "IN DP", name = "Love is Blind" }, - { set = "AS DP", name = "Collaboration" }, - { set = "EX NH MS", name = "Online Gambling" }, - { set = "EX NH GV", name = "Beyond Death" }, - { set = "EX NH VL", name = "Archangel" }, - { set = "EX NH DH", name = "Emperor's Decadence" }, - { set = "EX NH IN", name = "The Friar" }, - { set = "EX NH AS", name = "Indecision" }, - { set = "EX NH DP", name = "The Prudent Parliament" }, - { set = "EX MS GV", name = "Mining Operation" }, - { set = "EX MS VL", name = "The Wolf of Wall Street" }, - { set = "EX MS DH", name = "No Warning" }, - { set = "EX MS IN", name = "Irrational" }, - { set = "EX MS AS", name = "The Rich Gambler" }, - { set = "EX MS DP", name = "Grand Feast" }, - { set = "EX GV VL", name = "Relaxation" }, - { set = "EX GV DH", name = "The Daredevil" }, - { set = "EX GV IN", name = "The Super GM" }, - { set = "EX GV AS", name = "Master of the T" }, - { set = "EX GV DP", name = "Sinking" }, - { set = "EX VL DH", name = "The Mad Lord" }, - { set = "EX VL IN", name = "Bounty Hunter" }, - { set = "EX VL AS", name = "The Con Artist" }, - { set = "EX VL DP", name = "Measures" }, - { set = "EX DH IN", name = "The Architect" }, - { set = "EX DH AS", name = "Loki" }, - { set = "EX DH DP", name = "Whispers of Sin" }, - { set = "EX IN AS", name = "Expertise" }, - { set = "EX IN DP", name = "Dominance" }, - { set = "EX AS DP", name = "Ballet Partners" }, - { set = "NH MS GV", name = "Atlas' Burden" }, - { set = "NH MS VL", name = "The Glass Cannon" }, - { set = "NH MS DH", name = "Deadlock" }, - { set = "NH MS IN", name = "The False Prophet" }, - { set = "NH MS AS", name = "Unpredictable Outcome" }, - { set = "NH MS DP", name = "Blackjack" }, - { set = "NH GV VL", name = "Traditional" }, - { set = "NH GV DH", name = "Unstable Footing" }, - { set = "NH GV IN", name = "Evanescence" }, - { set = "NH GV AS", name = "A Modern Twist" }, - { set = "NH GV DP", name = "Nostalgia" }, - { set = "NH VL DH", name = "Judgement" }, - { set = "NH VL IN", name = "Justice" }, - { set = "NH VL AS", name = "Bob Ross" }, - { set = "NH VL DP", name = "Insecure Neediness" }, - { set = "NH DH IN", name = "Blindside" }, - { set = "NH DH AS", name = "Shapeshifter" }, - { set = "NH DH DP", name = "Good and Evil" }, - { set = "NH IN AS", name = "The Blind Artist" }, - { set = "NH IN DP", name = "No contact Relationship" }, - { set = "NH AS DP", name = "Ecstatic Dance" }, - { set = "MS GV VL", name = "Survival" }, - { set = "MS GV DH", name = "Double Down" }, - { set = "MS GV IN", name = "Burrata" }, - { set = "MS GV AS", name = "Rough Sketch" }, - { set = "MS GV DP", name = "Torn Apart" }, - { set = "MS VL DH", name = "Utter Trash" }, - { set = "MS VL IN", name = "Starstruck" }, - { set = "MS VL AS", name = "Cream Cheese" }, - { set = "MS VL DP", name = "Couples Therapy" }, - { set = "MS DH IN", name = "The Stealth Ninja" }, - { set = "MS DH AS", name = "The Escape Artist" }, - { set = "MS DH DP", name = "Drillers' Squad" }, - { set = "MS IN AS", name = "Abstraction" }, - { set = "MS IN DP", name = "Miscommunications" }, - { set = "MS AS DP", name = "Paintball Fight" }, - { set = "GV VL DH", name = "Temptation" }, - { set = "GV VL IN", name = "Paranoia" }, - { set = "GV VL AS", name = "The Gladiator" }, - { set = "GV VL DP", name = "Diner Date" }, - { set = "GV DH IN", name = "The Drunk Driver" }, - { set = "GV DH AS", name = "The Texting Driver" }, - { set = "GV DH DP", name = "Race You There" }, - { set = "GV IN AS", name = "The Spinmaster" }, - { set = "GV IN DP", name = "Bronze Anniversary" }, - { set = "GV AS DP", name = "The Trapeze Artists" }, - { set = "VL DH IN", name = "The Flickering Spirit" }, - { set = "VL DH AS", name = "Forbidden Sorcery" }, - { set = "VL DH DP", name = "Yuri" }, - { set = "VL IN AS", name = "Eccentric Recluse" }, - { set = "VL IN DP", name = "Online Dating" }, - { set = "VL AS DP", name = "The Cheaters" }, - { set = "DH IN AS", name = "The Libertine" }, - { set = "DH IN DP", name = "Separation Anxiety" }, - { set = "DH AS DP", name = "A Mutual Agreement" }, - { set = "IN AS DP", name = "Blindfolded Collaboration" }, - { set = "EX NH MS GV", name = "Atlas' Lament" }, - { set = "EX NH MS VL", name = "The Fugitive" }, - { set = "EX NH MS DH", name = "Impasse" }, - { set = "EX NH MS IN", name = "Classic Prophet" }, - { set = "EX NH MS AS", name = "Fair Chance" }, - { set = "EX NH MS DP", name = "Sly Pair" }, - { set = "EX NH GV VL", name = "Cutting Edge" }, - { set = "EX NH GV DH", name = "Purgatory Pro" }, - { set = "EX NH GV IN", name = "Still Water" }, - { set = "EX NH GV AS", name = "Beyond the Afterdeath" }, - { set = "EX NH GV DP", name = "Double Maxout" }, - { set = "EX NH VL DH", name = "Azathoth" }, - { set = "EX NH VL IN", name = "Unreasonable" }, - { set = "EX NH VL AS", name = "The Scam Leader" }, - { set = "EX NH VL DP", name = "Heaven and Earth" }, - { set = "EX NH DH IN", name = "Invisible Decadence" }, - { set = "EX NH DH AS", name = "Amorphous" }, - { set = "EX NH DH DP", name = "The Decadent Court" }, - { set = "EX NH IN AS", name = "Black Magic" }, - { set = "EX NH IN DP", name = "Abandoned" }, - { set = "EX NH AS DP", name = "Royal Waltz" }, - { set = "EX MS GV VL", name = "Juggernaut" }, - { set = "EX MS GV DH", name = "Mining for Netherite" }, - { set = "EX MS GV IN", name = "Resourceful" }, - { set = "EX MS GV AS", name = "Irregular Sketch" }, - { set = "EX MS GV DP", name = "Mining Corporation" }, - { set = "EX MS VL DH", name = "Divine Mastery" }, - { set = "EX MS VL IN", name = "Interstellar" }, - { set = "EX MS VL AS", name = "The Hacker" }, - { set = "EX MS VL DP", name = "The Bull and Bear" }, - { set = "EX MS DH IN", name = "The Theocrat" }, - { set = "EX MS DH AS", name = "Imprisonment" }, - { set = "EX MS DH DP", name = "Checkmate" }, - { set = "EX MS IN AS", name = "The Mathematician" }, - { set = "EX MS IN DP", name = "Rulers in the Dark" }, - { set = "EX MS AS DP", name = "Double Cancelling" }, - { set = "EX GV VL DH", name = "The Autocrat" }, - { set = "EX GV VL IN", name = "Lateness" }, - { set = "EX GV VL AS", name = "Inertia" }, - { set = "EX GV VL DP", name = "The Irresponsible One" }, - { set = "EX GV DH IN", name = "Lament Rain" }, - { set = "EX GV DH AS", name = "Spin Overlord" }, - { set = "EX GV DH DP", name = "Shortcuts" }, - { set = "EX GV IN AS", name = "Mastermind" }, - { set = "EX GV IN DP", name = "Grandmasters of the World" }, - { set = "EX GV AS DP", name = "T Spinners" }, - { set = "EX VL DH IN", name = "Corruption" }, - { set = "EX VL DH AS", name = "Devilish Falsifier" }, - { set = "EX VL DH DP", name = "Dyarchy" }, - { set = "EX VL IN AS", name = "Insanity" }, - { set = "EX VL IN DP", name = "Dynasty" }, - { set = "EX VL AS DP", name = "The Loophole" }, - { set = "EX DH IN AS", name = "Reverse Quadruple Threat" }, - { set = "EX DH IN DP", name = "Construction Site" }, - { set = "EX DH AS DP", name = "The Devil's Advocate" }, - { set = "EX IN AS DP", name = "The Professional Artist" }, - { set = "NH MS GV VL", name = "Quadruple threat" }, - { set = "NH MS GV DH", name = "Futility" }, - { set = "NH MS GV IN", name = "Spelunking" }, - { set = "NH MS GV AS", name = "The Modern Artist" }, - { set = "NH MS GV DP", name = "Inside Out" }, - { set = "NH MS VL DH", name = "Deadbolt" }, - { set = "NH MS VL IN", name = "Blind Swinging" }, - { set = "NH MS VL AS", name = "Bluff" }, - { set = "NH MS VL DP", name = "Mistaken Desires" }, - { set = "NH MS DH IN", name = "Unfinished Business" }, - { set = "NH MS DH AS", name = "Locksmith" }, - { set = "NH MS DH DP", name = "Emotional Barriers" }, - { set = "NH MS IN AS", name = "Writer's Block" }, - { set = "NH MS IN DP", name = "Hajidere" }, - { set = "NH MS AS DP", name = "Unpredictable Relationship" }, - { set = "NH GV VL DH", name = "Nephalem" }, - { set = "NH GV VL IN", name = "The Black Hole" }, - { set = "NH GV VL AS", name = "Recreation" }, - { set = "NH GV VL DP", name = "One Night Stand" }, - { set = "NH GV DH IN", name = "Live Fast Die Young" }, - { set = "NH GV DH AS", name = "Dance Dance Revolution" }, - { set = "NH GV DH DP", name = "Ice Climbers" }, - { set = "NH GV IN AS", name = "Divine Failure" }, - { set = "NH GV IN DP", name = "Silver Anniversary" }, - { set = "NH GV AS DP", name = "Can't Let Go" }, - { set = "NH VL DH IN", name = "Spilled Milk" }, - { set = "NH VL DH AS", name = "The Restrained Artist" }, - { set = "NH VL DH DP", name = "Hell and Heaven" }, - { set = "NH VL IN AS", name = "Vigilante" }, - { set = "NH VL IN DP", name = "Unspoken Love" }, - { set = "NH VL AS DP", name = "The Inner Alchemist" }, - { set = "NH DH IN AS", name = "Impressionism" }, - { set = "NH DH IN DP", name = "Deep Blindness" }, - { set = "NH DH AS DP", name = "Cosplay Party" }, - { set = "NH IN AS DP", name = "Fatal Artistry" }, - { set = "MS GV VL DH", name = "Quadruple Down" }, - { set = "MS GV VL IN", name = "Eleventh Hour" }, - { set = "MS GV VL AS", name = "Gambled Faith" }, - { set = "MS GV VL DP", name = "Royale" }, - { set = "MS GV DH IN", name = "Intoxication" }, - { set = "MS GV DH AS", name = "The Spacial Artist" }, - { set = "MS GV DH DP", name = "Triple Down" }, - { set = "MS GV IN AS", name = "Parmigiano Reggiano" }, - { set = "MS GV IN DP", name = "Lonesome Feeling" }, - { set = "MS GV AS DP", name = "I Miss You" }, - { set = "MS VL DH IN", name = "The Night Watchman" }, - { set = "MS VL DH AS", name = "Blue Cheese" }, - { set = "MS VL DH DP", name = "Quadruples Therapy" }, - { set = "MS VL IN AS", name = "Creative Explosion" }, - { set = "MS VL IN DP", name = "Lovestruck" }, - { set = "MS VL AS DP", name = "Entangled Cheater" }, - { set = "MS DH IN AS", name = "Nascent" }, - { set = "MS DH IN DP", name = "The Unseen Depths" }, - { set = "MS DH AS DP", name = "Partners in Crime" }, - { set = "MS IN AS DP", name = "Inception" }, - { set = "GV VL DH IN", name = "Nightmare" }, - { set = "GV VL DH AS", name = "Sword Box" }, - { set = "GV VL DH DP", name = "The Tempting Ones" }, - { set = "GV VL IN AS", name = "Immense Pressure" }, - { set = "GV VL IN DP", name = "Blind Date" }, - { set = "GV VL AS DP", name = "The Colosseum" }, - { set = "GV DH IN AS", name = "Horror Thriller" }, - { set = "GV DH IN DP", name = "Timid Adoration" }, - { set = "GV DH AS DP", name = "The Text Chat" }, - { set = "GV IN AS DP", name = "All Spinners" }, - { set = "VL DH IN AS", name = "The Prodigy" }, - { set = "VL DH IN DP", name = "The Illusion of Love" }, - { set = "VL DH AS DP", name = "A Dance of Fire and Ice" }, - { set = "VL IN AS DP", name = "The Introverted Lovers" }, - { set = "DH IN AS DP", name = "Alter Ego" }, - { set = "EX NH MS GV VL", name = "Oppression" }, - { set = "EX NH MS GV DH", name = "Adversity" }, - { set = "EX NH MS GV IN", name = "Pessimism" }, - { set = "EX NH MS GV AS", name = "Existencial Crisis" }, - { set = "EX NH MS VL DH", name = "No Holds Barred" }, - { set = "EX NH MS VL IN", name = "The Torchbearer" }, - { set = "EX NH MS VL AS", name = "Crimson Witch" }, - { set = "EX NH MS VL DP", name = "The Fleeting Partners" }, - { set = "EX NH MS DH IN", name = "Breach of Faith" }, - { set = "EX NH MS DH AS", name = "Sinfully Scarred" }, - { set = "EX NH MS DH DP", name = "Stalemate" }, - { set = "EX NH MS IN AS", name = "Monarch's Hallucinations" }, - { set = "EX NH MS AS DP", name = "The Highroller" }, - { set = "EX NH GV VL DH", name = "The Veteran" }, - { set = "EX NH GV VL IN", name = "Foresight" }, - { set = "EX NH GV VL AS", name = "Recursion of Death" }, - { set = "EX NH GV DH IN", name = "Readlock" }, - { set = "EX NH GV DH AS", name = "The Kill Screen" }, - { set = "EX NH GV DH DP", name = "The hanged down pair" }, - { set = "EX NH GV IN AS", name = "Paragon" }, - { set = "EX NH GV IN DP", name = "Golden Anniversary" }, - { set = "EX NH GV AS DP", name = "Thirty Lives" }, - { set = "EX NH VL DH IN", name = "Spoiled Milk" }, - { set = "EX NH VL DH AS", name = "Loss of Control" }, - { set = "EX NH VL DH DP", name = "The Forbidden Fruit" }, - { set = "EX NH VL IN AS", name = "Loading Screen" }, - { set = "EX NH VL AS DP", name = "The Black Market" }, - { set = "EX NH DH IN AS", name = "Futile Spectacle" }, - { set = "EX NH IN AS DP", name = "The Sorcerer's Apprentice" }, - { set = "EX MS GV VL DH", name = "Hell's Gate" }, - { set = "EX MS GV VL IN", name = "Hunted" }, - { set = "EX MS GV VL AS", name = "Deadline" }, - { set = "EX MS GV VL DP", name = "Comfort Zone" }, - { set = "EX MS GV DH IN", name = "Demonic Earthquake" }, - { set = "EX MS GV DH AS", name = "The Temporal Artist" }, - { set = "EX MS GV DH DP", name = "Omni Diggers" }, - { set = "EX MS GV IN AS", name = "Spin in Fourth Dimension" }, - { set = "EX MS VL DH IN", name = "The Knight" }, - { set = "EX MS VL DH AS", name = "False Security" }, - { set = "EX MS VL DH DP", name = "Dynamic Duo" }, - { set = "EX MS VL IN AS", name = "Reload" }, - { set = "EX MS VL IN DP", name = "Space Station" }, - { set = "EX MS VL AS DP", name = "Arbitrary Code Execution" }, - { set = "EX MS DH IN AS", name = "Deadluck" }, - { set = "EX MS DH IN DP", name = "Complex Number" }, - { set = "EX MS DH AS DP", name = "The Great Escape" }, - { set = "EX MS IN AS DP", name = "Dual Number" }, - { set = "EX GV VL DH IN", name = "Unexpectancy" }, - { set = "EX GV VL DH AS", name = "Trembling Power" }, - { set = "EX GV VL DH DP", name = "Reign of Terror" }, - { set = "EX GV VL IN AS", name = "Speed the Collapse" }, - { set = "EX GV VL IN DP", name = "Despondent Dread" }, - { set = "EX GV VL AS DP", name = "Rising Legends" }, - { set = "EX GV DH IN AS", name = "Fight or Flight" }, - { set = "EX GV DH IN DP", name = "Skyscrapers" }, - { set = "EX GV DH AS DP", name = "Omni Spinners" }, - { set = "EX GV IN AS DP", name = "Masterclass" }, - { set = "EX VL DH IN AS", name = "Reverse Quintuple Threat" }, - { set = "EX VL DH AS DP", name = "Hello BPM Year" }, - { set = "EX DH IN AS DP", name = "Lost and Forgotten" }, - { set = "NH MS GV VL DH", name = "Quintuple threat" }, - { set = "NH MS GV VL IN", name = "The Guardian of Change" }, - { set = "NH MS GV VL AS", name = "Dreadlock" }, - { set = "NH MS GV VL DP", name = "Reminiscence Therapy" }, - { set = "NH MS GV DH IN", name = "Misdrop Haven" }, - { set = "NH MS GV DH AS", name = "A Classic Escape" }, - { set = "NH MS GV IN AS", name = "Lost and Dizzy" }, - { set = "NH MS GV AS DP", name = "Generation Beta" }, - { set = "NH MS VL DH IN", name = "Blind Faith" }, - { set = "NH MS VL DH AS", name = "Boltsmith" }, - { set = "NH MS VL DH DP", name = "Double Sided" }, - { set = "NH MS VL IN AS", name = "Ballet Dancing" }, - { set = "NH MS VL IN DP", name = "Card Counting" }, - { set = "NH MS VL AS DP", name = "Bewitched Canvas" }, - { set = "NH MS DH IN AS", name = "Disappearance" }, - { set = "NH MS DH AS DP", name = "Jailbreakers" }, - { set = "NH GV VL DH IN", name = "Entropy" }, - { set = "NH GV VL DH AS", name = "Demonic Possession" }, - { set = "NH GV VL IN AS", name = "Ergosphere" }, - { set = "NH GV VL IN DP", name = "Abysmal Connection" }, - { set = "NH GV DH IN AS", name = "Cheat Code" }, - { set = "NH GV DH IN DP", name = "Living in the Past" }, - { set = "NH GV DH AS DP", name = "Just Dance" }, - { set = "NH GV IN AS DP", name = "Latent Lifeline" }, - { set = "NH VL DH IN AS", name = "Magic" }, - { set = "NH VL DH IN DP", name = "Spill on the Dinner" }, - { set = "NH VL DH AS DP", name = "Neo Cosmos" }, - { set = "NH VL IN AS DP", name = "Expelled" }, - { set = "NH DH IN AS DP", name = "The Trinity of Blindness" }, - { set = "MS GV VL DH IN", name = "Slaughterhouse" }, - { set = "MS GV VL DH AS", name = "Killer Clown" }, - { set = "MS GV VL DH DP", name = "Sextuple Down" }, - { set = "MS GV VL IN AS", name = "Mortal Chaos" }, - { set = "MS GV VL IN DP", name = "Twenty Third Hour" }, - { set = "MS GV DH IN AS", name = "Doubled Symbolism" }, - { set = "MS GV DH IN DP", name = "Tipsy Twosome" }, - { set = "MS GV DH AS DP", name = "Four Dimensional Golf" }, - { set = "MS VL DH IN AS", name = "Beethoven" }, - { set = "MS VL DH IN DP", name = "The Incomprehensible Spirit" }, - { set = "MS VL DH AS DP", name = "Chaotic Resonance" }, - { set = "MS VL IN AS DP", name = "Couple of Creativity" }, - { set = "MS DH IN AS DP", name = "Crazy Personalities" }, - { set = "GV VL DH IN AS", name = "Lost Genius" }, - { set = "GV VL DH IN DP", name = "Haunting Hallucinations" }, - { set = "GV VL DH AS DP", name = "Dual System Failure" }, - { set = "GV VL IN AS DP", name = "Hardships" }, - { set = "GV DH IN AS DP", name = "Sleepy Pilots" }, - { set = "VL DH IN AS DP", name = "The Duel of Geniuses" }, - }, - - -- rDH + Easy Names, from ... me :sob: - gameeEX = { - { set = "eEX", name = "Comfort" }, --Soft Comfort - { set = "eNH", name = "Meditation" }, --Cool Meditation - { set = "eMS", name = "Food" }, --Pure Food - { set = "eGV", name = "Bed" }, --Bubbly Bed - { set = "eVL", name = "Weightlifter" }, --Calm Weightlifter - { set = "eDH", name = "Place" }, --Sacred Place - { set = "eIN", name = "Vision" }, --Clear Vision - { set = "eAS", name = "Gamer" }, --Mystical Gamer - { set = "eDP", name = "Buddies" }, --Friendly Buddies - { set = "eEX eNH", name = "Spending Spree" }, - { set = "eEX eMS", name = "Block Feast" }, - { set = "eEX eGV", name = "Comfy Bed" }, - { set = "eEX eVL", name = "Professional Weightlifter" }, - { set = "eEX eDH", name = "Heaven" }, - { set = "eEX eIN", name = "Perfect Vision" }, -- aka perfection - { set = "eEX eAS", name = "Gaming Addict" }, - { set = "eEX eDP", name = "Best Friends" }, - { set = "eNH eMS", name = "Snack" }, -- snack = moderate food - { set = "eNH eGV", name = "Shameless Cashgrab" }, - { set = "eNH eVL", name = "Chill" }, -- chill = calm + meditation - { set = "eNH eDH", name = "Cool Place" }, - { set = "eNH eIN", name = "Cool Sight" }, - { set = "eNH eAS", name = "Overweight Gamer" }, - { set = "eNH eDP", name = "Yoga Buddies" }, - { set = "eMS eGV", name = "Made Bed" }, - { set = "eMS eVL", name = "Organized" }, --organized = tidy + calm - { set = "eMS eDH", name = "Clean" }, - { set = "eMS eIN", name = "Spotless" }, --spotless = tidy + visible - { set = "eMS eAS", name = "Hungry Gamer" }, - { set = "eMS eDP", name = "Eating Buddies" }, - { set = "eGV eVL", name = "True Lifter" }, - { set = "eGV eDH", name = "Bedroom" }, --bed place - { set = "eGV eIN", name = "Humble Pupil" }, - { set = "eGV eAS", name = "Bedtime Gaming" }, - { set = "eGV eDP", name = "Cuddle Buddies" }, - { set = "eVL eDH", name = "Gym" }, -- workout place - { set = "eVL eIN", name = "Obvious Weightlifter" }, - { set = "eVL eAS", name = "Game Developer" }, - { set = "eVL eDP", name = "Workout Buddies" }, - { set = "eDH eIN", name = "Observatory" }, - { set = "eDH eAS", name = "Gaming Den" }, - { set = "eDH eDP", name = "Friend's Place" }, - { set = "eIN eAS", name = "Mystical Vision" }, - { set = "eIN eDP", name = "Memories" }, - { set = "eAS eDP", name = "Gaming Buddies" }, - { set = "eEX eNH eMS", name = "Comforting Snack" }, - { set = "eEX eNH eGV", name = "Easy Cashgrab" }, - { set = "eEX eNH eVL", name = "Expensive Weights" }, - { set = "eEX eNH eDH", name = "Educator's Development" }, - { set = "eEX eNH eIN", name = "Expensive Vision" }, - { set = "eEX eNH eAS", name = "Reformed Gaming Addict" }, -- addict + moderation = reform - { set = "eEX eNH eDP", name = "Spending Spree Buddies" }, - { set = "eEX eMS eGV", name = "Eat and Sleep" }, - { set = "eEX eMS eVL", name = "Eat and Work" }, - { set = "eEX eMS eDH", name = "Easy to Clean" }, - { set = "eEX eMS eIN", name = "Perfect Meal" }, - { set = "eEX eMS eAS", name = "Hungry Gaming Addict" }, - { set = "eEX eMS eDP", name = "Grand Feasts" }, - { set = "eEX eGV eVL", name = "Professional True Lifter" }, - { set = "eEX eGV eDH", name = "Comfy Bedroom" }, - { set = "eEX eGV eIN", name = "Comfy Pupil" }, - { set = "eEX eGV eAS", name = "Bedtime Gaming Addict" }, - { set = "eEX eGV eDP", name = "Comfy Cuddling" }, - { set = "eEX eVL eDH", name = "Professional Gym" }, - { set = "eEX eVL eIN", name = "Professional Weightlifter's Insight" }, - { set = "eEX eVL eAS", name = "The Pro G(r)am(m)ing Smithy" }, - { set = "eEX eVL eDP", name = "Professional Spotlifter" }, -- pro gym buddies - { set = "eEX eDH eIN", name = "Comet Observatory" }, - { set = "eEX eDH eAS", name = "Gaming Addict's Den" }, - { set = "eEX eDH eDP", name = "Best Friend's Place" }, - { set = "eEX eIN eAS", name = "Gaming Perfection" }, - { set = "eEX eIN eDP", name = "Comfy Memories" }, - { set = "eEX eAS eDP", name = "Comfy Gaming Buddies" }, - { set = "eNH eMS eGV", name = "Bedtime Snack" }, - { set = "eNH eMS eVL", name = "Workout Snack" }, - { set = "eNH eMS eDH", name = "Clean Break" }, - { set = "eNH eMS eIN", name = "Snack Vision" }, - { set = "eNH eMS eAS", name = "Gamer Snack" }, - { set = "eNH eMS eDP", name = "Snack with a Friend" }, - { set = "eNH eGV eVL", name = "Calm Cashgrab" }, - { set = "eNH eGV eDH", name = "Cool Bedroom" }, - { set = "eNH eGV eIN", name = "Obvious Cashgrab" }, - { set = "eNH eGV eAS", name = "Shameless Gamer" }, - { set = "eNH eGV eDP", name = "Bedtime 'Yoga'" }, - { set = "eNH eVL eDH", name = "Chill Place" }, - { set = "eNH eVL eIN", name = "Chill Vision" }, - { set = "eNH eVL eAS", name = "Chill Gamer" }, - { set = "eNH eVL eDP", name = "Chill Buddies" }, - { set = "eNH eDH eIN", name = "Cool Observatory" }, - { set = "eNH eDH eAS", name = "Overweight Gamer's Den" }, - { set = "eNH eDH eDP", name = "Yoga Studio" }, - { set = "eNH eIN eAS", name = "Clearly Overweight Gamer" }, - { set = "eNH eIN eDP", name = "Cool Memories" }, - { set = "eNH eAS eDP", name = "Gamer Yoga" }, - { set = "eMS eGV eVL", name = "Organized Bed" }, - { set = "eMS eGV eDH", name = "Clean Bed" }, - { set = "eMS eGV eIN", name = "Hungry Pupil" }, - { set = "eMS eGV eAS", name = "Hungry Bedtime Gamer" }, - { set = "eMS eGV eDP", name = "Hungry Cuddle Buddies" }, - { set = "eMS eVL eDH", name = "Clean Weightlifter" }, - { set = "eMS eVL eIN", name = "Organized Vision" }, - { set = "eMS eVL eAS", name = "Organized Gamer" }, - { set = "eMS eVL eDP", name = "Organized Buddies" }, - { set = "eMS eDH eIN", name = "Clean and Clear" }, - { set = "eMS eDH eAS", name = "Clean Gamer" }, - { set = "eMS eDH eDP", name = "Clean Buddies" }, - { set = "eMS eIN eAS", name = "Spotless Gamer" }, - { set = "eMS eIN eDP", name = "Spotless Buddies" }, - { set = "eMS eAS eDP", name = "Hungry Gaming Buddies" }, - { set = "eGV eVL eDH", name = "Bedroom Workout" }, - { set = "eGV eVL eIN", name = "Humble Weightlifter" }, - { set = "eGV eVL eAS", name = "Bedtime Game Dev" }, - { set = "eGV eVL eDP", name = "True Lifting Buddies" }, - { set = "eGV eDH eIN", name = "Bedtime Observatory" }, - { set = "eGV eDH eAS", name = "Bedroom Gaming" }, - { set = "eGV eDH eDP", name = "Friend's Bedroom" }, - { set = "eGV eIN eAS", name = "Humble Gamer" }, - { set = "eGV eIN eDP", name = "Humble Buddies" }, - { set = "eGV eAS eDP", name = "Cuddling Gamers" }, - { set = "eVL eDH eIN", name = "Calm Observatory" }, - { set = "eVL eDH eAS", name = "Game Dev's Den" }, - { set = "eVL eDH eDP", name = "Gym Buddies" }, - { set = "eVL eIN eAS", name = "Oblivious Game Dev" }, --to be clear, i know this should be "obvious" not "oblivious" but it's funny cause I'm "oblivious" to my mistake - { set = "eVL eIN eDP", name = "Calm Memories" }, - { set = "eVL eAS eDP", name = "Game Dev Buddies" }, - { set = "eDH eIN eAS", name = "Mystical Observatory" }, - { set = "eDH eIN eDP", name = "Friendly Observatory" }, - { set = "eDH eAS eDP", name = "Friend's Gaming Den" }, - { set = "eIN eAS eDP", name = "Gaming Memories" }, - { set = "eEX eNH eMS eGV", name = "Shameless Feast" }, - { set = "eEX eNH eMS eVL", name = "Chill Feast" }, - { set = "eEX eNH eMS eDH", name = "Chef's Development" }, - { set = "eEX eNH eMS eIN", name = "Perfect Snack" }, - { set = "eEX eNH eMS eAS", name = "Obese Gamer" }, -- feast + overweight gamer - { set = "eEX eNH eMS eDP", name = "Best Friend's Snack" }, - { set = "eEX eNH eGV eVL", name = "Chill Comfy Bed" }, - { set = "eEX eNH eGV eDH", name = "Cashgrab Heaven" }, - { set = "eEX eNH eGV eIN", name = "Perfect Cashgrab" }, - { set = "eEX eNH eGV eAS", name = "Reformed Bedtime Gamer" }, - { set = "eEX eNH eGV eDP", name = "Comfy Bedtime 'Yoga'" }, - { set = "eEX eNH eVL eDH", name = "Chill Heaven" }, - { set = "eEX eNH eVL eIN", name = "Chill Perfection" }, - { set = "eEX eNH eVL eAS", name = "The Meditating Smithy" }, - { set = "eEX eNH eVL eDP", name = "Chill Best Friends" }, - { set = "eEX eNH eDH eIN", name = "Astronomer's Development" }, - { set = "eEX eNH eDH eAS", name = "Gamer's Development" }, - { set = "eEX eNH eDH eDP", name = "Best Friend's Development" }, - { set = "eEX eNH eIN eAS", name = "Clearly Reformed Gamer" }, - { set = "eEX eNH eIN eDP", name = "Expensive Memories" }, - { set = "eEX eNH eAS eDP", name = "Reformed Gaming Buddies" }, - { set = "eEX eMS eGV eVL", name = "Eat, Sleep, Work" }, - { set = "eEX eMS eGV eDH", name = "Bedroom Feast" }, - { set = "eEX eMS eGV eIN", name = "Humble Feast" }, - { set = "eEX eMS eGV eAS", name = "Eat, Sleep, Game" }, - { set = "eEX eMS eGV eDP", name = "Grand Bedtime Feasts" }, - { set = "eEX eMS eVL eDH", name = "Professional Cleaner" }, - { set = "eEX eMS eVL eIN", name = "Organized Perfection" }, - { set = "eEX eMS eVL eAS", name = "The Cooking Smithy" }, - { set = "eEX eMS eVL eDP", name = "Organized Best Friends" }, - { set = "eEX eMS eDH eIN", name = "Perfectly Clean" }, - { set = "eEX eMS eDH eAS", name = "Clean Gaming Addict" }, - { set = "eEX eMS eDH eDP", name = "Clean Best Friends" }, - { set = "eEX eMS eIN eAS", name = "Spotless Gaming Addict" }, - { set = "eEX eMS eIN eDP", name = "Feast Memories" }, - { set = "eEX eMS eAS eDP", name = "Gaming Buddies' Feast" }, - { set = "eEX eGV eVL eDH", name = "Comfy Bedroom Workout" }, - { set = "eEX eGV eVL eIN", name = "Professional Pupil" }, - { set = "eEX eGV eVL eAS", name = "The Sleeping Smithy" }, - { set = "eEX eGV eVL eDP", name = "Professional Cuddling" }, - { set = "eEX eGV eDH eIN", name = "Perfect Bedroom" }, - { set = "eEX eGV eDH eAS", name = "Comfy Bedroom Gaming" }, - { set = "eEX eGV eDH eDP", name = "Cuddle Heaven" }, - { set = "eEX eGV eIN eAS", name = "Humble Gaming Addict" }, - { set = "eEX eGV eIN eDP", name = "Perfect Cuddling" }, - { set = "eEX eGV eAS eDP", name = "Comfy Cuddling Gamers" }, - { set = "eEX eVL eDH eIN", name = "Calm Comet Observatory" }, - { set = "eEX eVL eDH eAS", name = "The Homely Smithy" }, - { set = "eEX eVL eDH eDP", name = "Professional Gym Buddies" }, - { set = "eEX eVL eIN eAS", name = "The Oblivious Smithy" }, - { set = "eEX eVL eIN eDP", name = "Perfect Workout Buddies" }, - { set = "eEX eVL eAS eDP", name = "The Pro G(r)am(m)ing Spider" }, - { set = "eEX eDH eIN eAS", name = "Perfect Gaming Den" }, - { set = "eEX eDH eIN eDP", name = "Rosalina in the Observatory" }, - { set = "eEX eDH eAS eDP", name = "Best Friend's Gaming Den" }, - { set = "eEX eIN eAS eDP", name = "Comfy Gaming Memories" }, - { set = "eNH eMS eGV eVL", name = "Bedtime Workout Snack" }, -- snack + true lifter - { set = "eNH eMS eGV eDH", name = "Bedroom Snack" }, - { set = "eNH eMS eGV eIN", name = "Humble Snack" }, - { set = "eNH eMS eGV eAS", name = "Bedtime Gamer Snack" }, - { set = "eNH eMS eGV eDP", name = "Cuddling Snack" }, - { set = "eNH eMS eVL eDH", name = "Gym Snack" }, - { set = "eNH eMS eVL eIN", name = "Spotless Chill" }, - { set = "eNH eMS eVL eAS", name = "Game Dev Snack" }, - { set = "eNH eMS eVL eDP", name = "Organized Yoga" }, - { set = "eNH eMS eDH eIN", name = "Observatory Snack" }, - { set = "eNH eMS eDH eAS", name = "Gaming Den Snacks" }, - { set = "eNH eMS eDH eDP", name = "Clean Yoga" }, - { set = "eNH eMS eIN eAS", name = "Spotless Overweight Gamer" }, - { set = "eNH eMS eIN eDP", name = "Snack Memories" }, - { set = "eNH eMS eAS eDP", name = "Snack with a Gaming Buddy" }, - { set = "eNH eGV eVL eDH", name = "Chill Bedroom" }, - { set = "eNH eGV eVL eIN", name = "Chill Pupil" }, - { set = "eNH eGV eVL eAS", name = "Shameless Game Dev" }, - { set = "eNH eGV eVL eDP", name = "Chill Cuddling" }, - { set = "eNH eGV eDH eIN", name = "Shameless Observatory" }, - { set = "eNH eGV eDH eAS", name = "Overweight Gamer's Bedroom" }, - { set = "eNH eGV eDH eDP", name = "Bedroom Yoga" }, - { set = "eNH eGV eIN eAS", name = "Overweight Gaming Pupil" }, - { set = "eNH eGV eIN eDP", name = "Humble Yoga" }, - { set = "eNH eGV eAS eDP", name = "Shameless Gaming Buddies" }, - { set = "eNH eVL eDH eIN", name = "Chill Observatory" }, - { set = "eNH eVL eDH eAS", name = "Chill Gaming Den" }, - { set = "eNH eVL eDH eDP", name = "Chilling at a Friend's Place" }, - { set = "eNH eVL eIN eAS", name = "Chill Gamer Vision" }, - { set = "eNH eVL eIN eDP", name = "Chill Memories" }, - { set = "eNH eVL eAS eDP", name = "Chill Gaming Buddies" }, - { set = "eNH eDH eIN eAS", name = "Clearly Overweight Gamer's Den" }, - { set = "eNH eDH eIN eDP", name = "Observatory Yoga" }, - { set = "eNH eDH eAS eDP", name = "Gaming Den Yoga" }, - { set = "eNH eIN eAS eDP", name = "Cool Gaming Memories" }, - { set = "eMS eGV eVL eDH", name = "Organized Bedroom" }, - { set = "eMS eGV eVL eIN", name = "Organized Pupil" }, - { set = "eMS eGV eVL eAS", name = "Organized Bedtime Gaming" }, - { set = "eMS eGV eVL eDP", name = "Organized Cuddling" }, - { set = "eMS eGV eDH eIN", name = "Spotless Bedroom" }, - { set = "eMS eGV eDH eAS", name = "Hungry Bedroom Gaming" }, - { set = "eMS eGV eDH eDP", name = "Clean Cuddling" }, - { set = "eMS eGV eIN eAS", name = "Hungry Humble Gamer" }, - { set = "eMS eGV eIN eDP", name = "Spotless Cuddling" }, - { set = "eMS eGV eAS eDP", name = "Hungry Cuddling Gamers" }, - { set = "eMS eVL eDH eIN", name = "Organized Observatory" }, - { set = "eMS eVL eDH eAS", name = "Clean Game Dev" }, - { set = "eMS eVL eDH eDP", name = "Clean Workout Buddies" }, - { set = "eMS eVL eIN eAS", name = "Spotless Game Dev" }, - { set = "eMS eVL eIN eDP", name = "Organized Memories" }, - { set = "eMS eVL eAS eDP", name = "Organized Gaming Buddies" }, - { set = "eMS eDH eIN eAS", name = "Spotless Gaming Den" }, - { set = "eMS eDH eIN eDP", name = "Clean Memories" }, - { set = "eMS eDH eAS eDP", name = "Clean Gaming Buddies" }, - { set = "eMS eIN eAS eDP", name = "Spotless Gaming Buddies" }, - { set = "eGV eVL eDH eIN", name = "Humble Gym" }, - { set = "eGV eVL eDH eAS", name = "Game Dev's Bedroom" }, - { set = "eGV eVL eDH eDP", name = "Gym Cuddling" }, - { set = "eGV eVL eIN eAS", name = "Humble Game Dev" }, - { set = "eGV eVL eIN eDP", name = "Calm Bedtime Memories" }, - { set = "eGV eVL eAS eDP", name = "Cuddly Game Dev" }, - { set = "eGV eDH eIN eAS", name = "Humble Gaming Den" }, - { set = "eGV eDH eIN eDP", name = "Observatory Cuddling" }, - { set = "eGV eDH eAS eDP", name = "Game Den Cuddling" }, - { set = "eGV eIN eAS eDP", name = "Humble Gaming Buddies" }, - { set = "eVL eDH eIN eAS", name = "Game Dev's Observatory" }, - { set = "eVL eDH eIN eDP", name = "Gym Memories" }, - { set = "eVL eDH eAS eDP", name = "Gym-Going Gaming Buddies" }, - { set = "eVL eIN eAS eDP", name = "Game Dev's Memories" }, - { set = "eDH eIN eAS eDP", name = "Friendly Mystical Observatory" }, - - { set = "eEX eNH eMS eGV eVL", name = "Eat, Sleep, Chill" }, - { set = "eEX eNH eMS eGV eDH", name = "Comfy Bedroom Snack" }, - { set = "eEX eNH eMS eGV eIN", name = "Perfect Bedtime Snack" }, - { set = "eEX eNH eMS eGV eAS", name = "Obese Bedtime Gamer" }, - { set = "eEX eNH eMS eGV eDP", name = "Eat, Sleep, Yoga" }, - { set = "eEX eNH eMS eVL eDH", name = "Organizer's Development" }, - { set = "eEX eNH eMS eVL eIN", name = "Perfect Workout Snack" }, - { set = "eEX eNH eMS eVL eAS", name = "The Snacking Smithy" }, - { set = "eEX eNH eMS eVL eDP", name = "Eat, Work, Yoga" }, - { set = "eEX eNH eMS eDH eIN", name = "Comet Observatory Snack" }, - { set = "eEX eNH eMS eDH eAS", name = "Clean Reformed Gamer" }, - { set = "eEX eNH eMS eDH eDP", name = "Clean Break with a Friend" }, - { set = "eEX eNH eMS eIN eAS", name = "Spotless Reformed Gamer" }, - { set = "eEX eNH eMS eIN eDP", name = "Perfect Snack with a Friend" }, - { set = "eEX eNH eMS eAS eDP", name = "Obese Gaming Buddies" }, - { set = "eEX eNH eGV eVL eDH", name = "Chill Comfy Bedroom" }, - { set = "eEX eNH eGV eVL eIN", name = "Chill Comfy Pupil" }, - { set = "eEX eNH eGV eVL eAS", name = "The Shameless Smithy" }, - { set = "eEX eNH eGV eVL eDP", name = "Chill Comfy Cuddling" }, - { set = "eEX eNH eGV eDH eIN", name = "Pupil's Development" }, - { set = "eEX eNH eGV eDH eAS", name = "Reformed Gamer's Bedroom" }, - { set = "eEX eNH eGV eDH eDP", name = "Cuddlers' Development" }, - { set = "eEX eNH eGV eIN eAS", name = "Humble Reformed Gamer" }, - { set = "eEX eNH eGV eIN eDP", name = "Perfect Bedtime 'Yoga'" }, - { set = "eEX eNH eGV eAS eDP", name = "Reformed Cuddling Gamers" }, - { set = "eEX eNH eVL eDH eIN", name = "Chill Comet Observatory" }, - { set = "eEX eNH eVL eDH eAS", name = "The Freezing Smithy" }, - { set = "eEX eNH eVL eDH eDP", name = "Chill Best Friend's Place" }, - { set = "eEX eNH eVL eIN eAS", name = "The Awestruck Smithy" }, - { set = "eEX eNH eVL eIN eDP", name = "Chill Comfy Memories" }, - { set = "eEX eNH eVL eAS eDP", name = "The Meditating Spider" }, - { set = "eEX eNH eDH eIN eAS", name = "Reformed Mystical Observatory" }, - { set = "eEX eNH eDH eIN eDP", name = "Cool Rosalina" }, - { set = "eEX eNH eDH eAS eDP", name = "Sacred Reformed Gaming Buddies" }, - { set = "eEX eNH eIN eAS eDP", name = "Reformed Gamer's Memories" }, - { set = "eEX eMS eGV eVL eDH", name = "Eat, Sleep, Gym" }, - { set = "eEX eMS eGV eVL eIN", name = "Eat, Work, Learn" }, - { set = "eEX eMS eGV eVL eAS", name = "The Routine Smithy" }, -- aka eat, sleep, work, game - { set = "eEX eMS eGV eVL eDP", name = "Eat, Work, Cuddle" }, - { set = "eEX eMS eGV eDH eIN", name = "Perfectly Clean Bed" }, - { set = "eEX eMS eGV eDH eAS", name = "Bedroom Gaming Feast" }, - { set = "eEX eMS eGV eDH eDP", name = "Clean Comfy Cuddling" }, - { set = "eEX eMS eGV eIN eAS", name = "Humble Gamer's Feast" }, - { set = "eEX eMS eGV eIN eDP", name = "Spotless Comfy Cuddling" }, - { set = "eEX eMS eGV eAS eDP", name = "Eat, Cuddle, Game" }, - { set = "eEX eMS eVL eDH eIN", name = "Organized Comet Observatory" }, - { set = "eEX eMS eVL eDH eAS", name = "The Clean Smithy" }, - { set = "eEX eMS eVL eDH eDP", name = "Professional Cleaning With A Friend" }, - { set = "eEX eMS eVL eIN eAS", name = "The Spotless Smithy" }, - { set = "eEX eMS eVL eIN eDP", name = "Organized Comfy Memories" }, - { set = "eEX eMS eVL eAS eDP", name = "The Hungry Spider" }, - { set = "eEX eMS eDH eIN eAS", name = "Perfectly Clean Gamer" }, - { set = "eEX eMS eDH eIN eDP", name = "Hungry Rosalina" }, - { set = "eEX eMS eDH eAS eDP", name = "Clean Comfy Gaming Buddies" }, - { set = "eEX eMS eIN eAS eDP", name = "Spotless Comfy Gaming Buddies" }, - { set = "eEX eGV eVL eDH eIN", name = "Comfy Humble Gym" }, - { set = "eEX eGV eVL eDH eAS", name = "The Bedroom Smithy" }, - { set = "eEX eGV eVL eDH eDP", name = "Comfy Gym Cuddling" }, - { set = "eEX eGV eVL eIN eAS", name = "The Humble Smithy" }, - { set = "eEX eGV eVL eIN eDP", name = "Professional True Lifter Memories" }, - { set = "eEX eGV eVL eAS eDP", name = "The Sleeping Spider" }, - { set = "eEX eGV eDH eIN eAS", name = "Perfect Bedroom Gaming" }, - { set = "eEX eGV eDH eIN eDP", name = "Sleeping Rosalina" }, - { set = "eEX eGV eDH eAS eDP", name = "Heavenly Cuddling Gamers" }, - { set = "eEX eGV eIN eAS eDP", name = "Perfect Cuddling Gamers" }, - { set = "eEX eVL eDH eIN eAS", name = "The Observational Smithy" }, - { set = "eEX eVL eDH eIN eDP", name = "Calm Rosalina" }, - { set = "eEX eVL eDH eAS eDP", name = "The Homely Spider" }, - { set = "eEX eVL eIN eAS eDP", name = "The Oblivious Spider" }, - { set = "eEX eDH eIN eAS eDP", name = "Gaming Rosalina" }, - { set = "eNH eMS eGV eVL eDH", name = "Cool Organized Bedroom" }, - { set = "eNH eMS eGV eVL eIN", name = "Humble Workout Snack" }, - { set = "eNH eMS eGV eVL eAS", name = "Bedtime Game Dev Snack" }, - { set = "eNH eMS eGV eVL eDP", name = "Organized Bedtime 'Yoga'" }, - { set = "eNH eMS eGV eDH eIN", name = "Bedtime Observatory Snack" }, - { set = "eNH eMS eGV eDH eAS", name = "Bedroom Gaming Snack" }, - { set = "eNH eMS eGV eDH eDP", name = "Clean Bedtime 'Yoga'" }, - { set = "eNH eMS eGV eIN eAS", name = "Humble Gamer Snack" }, - { set = "eNH eMS eGV eIN eDP", name = "Spotless Bedtime 'Yoga'" }, - { set = "eNH eMS eGV eAS eDP", name = "Cuddling Gamers' Snack" }, - { set = "eNH eMS eVL eDH eIN", name = "Calm Observatory Snack" }, - { set = "eNH eMS eVL eDH eAS", name = "Chill Clean Gamer" }, - { set = "eNH eMS eVL eDH eDP", name = "Gym Snack with a Friend" }, - { set = "eNH eMS eVL eIN eAS", name = "Spotless Chill Gamer" }, - { set = "eNH eMS eVL eIN eDP", name = "Spotless Chill Buddies" }, - { set = "eNH eMS eVL eAS eDP", name = "Organized Gamer Yoga" }, - { set = "eNH eMS eDH eIN eAS", name = "Mystical Observatory Snack" }, - { set = "eNH eMS eDH eIN eDP", name = "Friendly Observatory Snack" }, - { set = "eNH eMS eDH eAS eDP", name = "Clean Gamer Yoga" }, - { set = "eNH eMS eIN eAS eDP", name = "Spotless Gamer Yoga" }, - { set = "eNH eGV eVL eDH eIN", name = "Chill Bedtime Observatory" }, - { set = "eNH eGV eVL eDH eAS", name = "Chill Bedroom Gaming" }, - { set = "eNH eGV eVL eDH eDP", name = "Chill Bedroom Buddies" }, - { set = "eNH eGV eVL eIN eAS", name = "Chill Humble Gamer" }, - { set = "eNH eGV eVL eIN eDP", name = "Chill Humble Buddies" }, - { set = "eNH eGV eVL eAS eDP", name = "Chill Cuddling Gamers" }, - { set = "eNH eGV eDH eIN eAS", name = "Clearly Overweight Gamer's Bedroom" }, - { set = "eNH eGV eDH eIN eDP", name = "Cool Observatory Cuddling" }, - { set = "eNH eGV eDH eAS eDP", name = "Bedroom Gamer Yoga" }, - { set = "eNH eGV eIN eAS eDP", name = "Humble Gamer Yoga" }, - { set = "eNH eVL eDH eIN eAS", name = "Chill Mystical Observatory" }, - { set = "eNH eVL eDH eIN eDP", name = "Chill Friendly Observatory" }, - { set = "eNH eVL eDH eAS eDP", name = "Game Dev in a Freezer" }, - { set = "eNH eVL eIN eAS eDP", name = "Chill Gaming Memories" }, - { set = "eNH eDH eIN eAS eDP", name = "Mystical Observatory Yoga" }, - { set = "eMS eGV eVL eDH eIN", name = "Organized Bedtime Observatory" }, - { set = "eMS eGV eVL eDH eAS", name = "Organized Bedroom Gaming" }, - { set = "eMS eGV eVL eDH eDP", name = "Organized Friend's Bedroom" }, - { set = "eMS eGV eVL eIN eAS", name = "Organized Humble Gamer" }, - { set = "eMS eGV eVL eIN eDP", name = "Organized Bedtime Memories" }, - { set = "eMS eGV eVL eAS eDP", name = "Organized Cuddling Gamers" }, - { set = "eMS eGV eDH eIN eAS", name = "Clean Humble Gamer" }, - { set = "eMS eGV eDH eIN eDP", name = "Clean Humble Buddies" }, - { set = "eMS eGV eDH eAS eDP", name = "Clean Cuddling Gamers" }, - { set = "eMS eGV eIN eAS eDP", name = "Spotless Cuddling Gamers" }, - { set = "eMS eVL eDH eIN eAS", name = "Organized Mystical Observatory" }, - { set = "eMS eVL eDH eIN eDP", name = "Organized Friendly Observatory" }, - { set = "eMS eVL eDH eAS eDP", name = "Clean Game Dev Buddies" }, - { set = "eMS eVL eIN eAS eDP", name = "Organized Gaming Memories" }, - { set = "eMS eDH eIN eAS eDP", name = "Clean Gaming Memories" }, - { set = "eGV eVL eDH eIN eAS", name = "Game Dev's Bedtime Observatory" }, - { set = "eGV eVL eDH eIN eDP", name = "Humble Gym Buddies" }, - { set = "eGV eVL eDH eAS eDP", name = "Cuddly Game Dev's Room" }, - { set = "eGV eVL eIN eAS eDP", name = "Game Dev's Bedtime Memories" }, - { set = "eGV eDH eIN eAS eDP", name = "Mystical Observatory Cuddling" }, - { set = "eVL eDH eIN eAS eDP", name = "Friendly Game Dev's Observatory" }, - - - -- 6 mods - { set = "eEX eNH eMS eGV eVL eDP", name = "Eat, Chill, Cuddle" }, - { set = "eEX eNH eMS eGV eDH eDP", name = "Comfy Bedroom Snack with a Friend" }, - { set = "eEX eNH eMS eGV eIN eDP", name = "Perfect Cuddling Snack" }, - { set = "eEX eNH eMS eGV eAS eDP", name = "Obese Cuddling Gamers" }, - { set = "eEX eNH eMS eVL eDH eDP", name = "Professional Clean Yoga" }, - { set = "eEX eNH eMS eVL eIN eDP", name = "Organized Perfect Yoga" }, - { set = "eEX eNH eMS eVL eAS eDP", name = "The Snacking Spider" }, - { set = "eEX eNH eMS eDH eIN eDP", name = "Snacking Rosalina" }, - { set = "eEX eNH eMS eDH eAS eDP", name = "Clean Comfy Gamer Yoga" }, - { set = "eEX eNH eMS eIN eAS eDP", name = "Spotless Comfy Gamer Yoga" }, - { set = "eEX eNH eGV eVL eDH eDP", name = "Chill Heavenly Cuddling" }, - { set = "eEX eNH eGV eVL eIN eDP", name = "Chill Perfect Cuddling" }, - { set = "eEX eNH eGV eVL eAS eDP", name = "The Shameless Spider" }, - { set = "eEX eNH eGV eDH eIN eDP", name = "Shameless Rosalina" }, - { set = "eEX eNH eGV eDH eAS eDP", name = "Cuddling Gamers' Development" }, - { set = "eEX eNH eGV eIN eAS eDP", name = "Perfect Shameless Gaming Buddies" }, - { set = "eEX eNH eVL eDH eIN eDP", name = "Chill Rosalina" }, - { set = "eEX eNH eVL eDH eAS eDP", name = "The Freezing Spider" }, - { set = "eEX eNH eVL eIN eAS eDP", name = "The Awestruck Spider" }, - { set = "eEX eNH eDH eIN eAS eDP", name = "Heavyweight Racer Rosalina" }, - { set = "eEX eMS eGV eVL eDH eDP", name = "Eat, Gym, Cuddle" }, - { set = "eEX eMS eGV eVL eIN eDP", name = "Perfect Organized Cuddling" }, - { set = "eEX eMS eGV eVL eAS eDP", name = "The Routine Spider" }, -- aka eat, sleep, work, game - { set = "eEX eMS eGV eDH eIN eDP", name = "Perfectly Clean Cuddling" }, - { set = "eEX eMS eGV eDH eAS eDP", name = "Bedroom Gaming Feast with a Friend" }, - { set = "eEX eMS eGV eIN eAS eDP", name = "Humble Gamer's Feast with a Friend" }, - { set = "eEX eMS eVL eDH eIN eDP", name = "Organized Rosalina" }, - { set = "eEX eMS eVL eDH eAS eDP", name = "The Clean Spider" }, - { set = "eEX eMS eVL eIN eAS eDP", name = "The Spotless Spider" }, - { set = "eEX eMS eDH eIN eAS eDP", name = "Perfectly Clean Gaming Buddies" }, - { set = "eEX eGV eVL eDH eIN eDP", name = "Comfy Humble Gym Buddies" }, - { set = "eEX eGV eVL eDH eAS eDP", name = "The Bedroom Spider" }, - { set = "eEX eGV eVL eIN eAS eDP", name = "The Humble Spider" }, - { set = "eEX eGV eDH eIN eAS eDP", name = "Perfect Bedroom Gaming Buddies" }, - { set = "eEX eVL eDH eIN eAS eDP", name = "The Observational Spider" }, - { set = "eNH eMS eGV eVL eDH eDP", name = "Organized Bedroom Yoga" }, - { set = "eNH eMS eGV eVL eIN eDP", name = "Humble Workout Snack with a Friend" }, - { set = "eNH eMS eGV eVL eAS eDP", name = "Cuddling Game Dev's Snack" }, - { set = "eNH eMS eGV eDH eIN eDP", name = "Rold Smythy"}, - { set = "eNH eMS eGV eDH eAS eDP", name = "Gaming Den Cuddling Snack" }, - { set = "eNH eMS eGV eIN eAS eDP", name = "Humble Gamer Snack with a Friend" }, - { set = "eNH eMS eVL eDH eIN eDP", name = "Organized Observatory Yoga" }, - { set = "eNH eMS eVL eDH eAS eDP", name = "Chill Clean Gaming Buddies" }, - { set = "eNH eMS eVL eIN eAS eDP", name = "Spotless Chill Gaming Buddies" }, - { set = "eNH eMS eDH eIN eAS eDP", name = "Gaming Den Snack Memories" }, - { set = "eNH eGV eVL eDH eIN eDP", name = "Chill Cuddling Observatory" }, - { set = "eNH eGV eVL eDH eAS eDP", name = "Cuddly Game Dev in a Freezer" }, - { set = "eNH eGV eVL eIN eAS eDP", name = "Chill Humble Gaming Buddies" }, - { set = "eNH eGV eDH eIN eAS eDP", name = "Cool Mystical Observatory Cuddling" }, - { set = "eNH eVL eDH eIN eAS eDP", name = "Game Dev's Observatory Yoga" }, - { set = "eMS eGV eVL eDH eIN eDP", name = "Organized Cuddling Observatory" }, - { set = "eMS eGV eVL eDH eAS eDP", name = "Clean Cuddly Game Dev" }, - { set = "eMS eGV eVL eIN eAS eDP", name = "Spotless Cuddly Game Dev" }, - { set = "eMS eGV eDH eIN eAS eDP", name = "Spotless Gaming Den Cuddling" }, - { set = "eMS eVL eDH eIN eAS eDP", name = "Organized Friendly Mystical Observatory" }, - { set = "eGV eVL eDH eIN eAS eDP", name = "Cuddly Game Dev's Observatory" }, - -- no duo - { set = "eEX eNH eMS eGV eVL eDH", name = "Plain Cloudy Shower"}, - { set = "eEX eNH eMS eGV eVL eIN", name = "Plain Holy Shower"}, - { set = "eEX eNH eMS eGV eVL eAS", name = "Cloudy Holy Shower"}, - { set = "eEX eNH eMS eGV eDH eIN", name = "Plain Still Shower"}, - { set = "eEX eNH eMS eGV eDH eAS", name = "Still Cloudy Shower"}, - { set = "eEX eNH eMS eGV eIN eAS", name = "Still Holy Shower"}, - { set = "eEX eNH eMS eVL eDH eIN", name = "Plain Jacuzzi Shower"}, - { set = "eEX eNH eMS eVL eDH eAS", name = "God Gamer"}, - { set = "eEX eNH eMS eVL eIN eAS", name = "Holy Jacuzzi Shower"}, - { set = "eEX eNH eMS eDH eIN eAS", name = "Still Jacuzzi Shower"}, - { set = "eEX eNH eGV eVL eDH eIN", name = "Plain Clean Shower"}, - { set = "eEX eNH eGV eVL eDH eAS", name = "Clean Cloudy Shower"}, - { set = "eEX eNH eGV eVL eIN eAS", name = "Clean Holy Shower"}, - { set = "eEX eNH eGV eDH eIN eAS", name = "Clean Still Shower"}, - { set = "eEX eNH eVL eDH eIN eAS", name = "Clean Jacuzzi Shower"}, - { set = "eEX eMS eGV eVL eDH eIN", name = "Plain Warm Shower"}, - { set = "eEX eMS eGV eVL eDH eAS", name = "Warm Cloudy Shower"}, - { set = "eEX eMS eGV eVL eIN eAS", name = "Warm Holy Shower"}, - { set = "eEX eMS eGV eDH eIN eAS", name = "Warm Still Shower"}, - { set = "eEX eMS eVL eDH eIN eAS", name = "Warm Jacuzzi Shower"}, - { set = "eEX eGV eVL eDH eIN eAS", name = "Warm Clean Shower"}, - { set = "eNH eMS eGV eVL eDH eIN", name = "Plain Normal Shower"}, - { set = "eNH eMS eGV eVL eDH eAS", name = "Normal Cloudy Shower"}, - { set = "eNH eMS eGV eVL eIN eAS", name = "Normal Holy Shower"}, - { set = "eNH eMS eGV eDH eIN eAS", name = "Normal Still Shower"}, - { set = "eNH eMS eVL eDH eIN eAS", name = "Normal Jacuzzi Shower"}, - { set = "eNH eGV eVL eDH eIN eAS", name = "Normal Clean Shower"}, - { set = "eMS eGV eVL eDH eIN eAS", name = "Normal Warm Shower"}, - - --AS = Plain, EX = Normal, NH = Warm, MS = Clean, VL = Still, IN = Cloudy, DH = Holy, GV = Jacuzzi - -- 7 mods - { set = "eEX eNH eMS eGV eVL eDH eIN", name = "Plain Bath Water"}, - - { set = "eEX eNH eMS eGV eVL eDH eAS", name = "Cloudy Bath Water"}, -- clear e, cloudy, murky - { set = "eEX eNH eMS eGV eVL eDH eDP", name = "Plain Cloudy Shower With A Friend"}, - - { set = "eEX eNH eMS eGV eVL eIN eAS", name = "Holy Bath Water"}, -- sacred e, holy, unholy - { set = "eEX eNH eMS eGV eVL eIN eDP", name = "Plain Holy Shower With A Friend"}, - { set = "eEX eNH eMS eGV eVL eAS eDP", name = "Cloudy Holy Shower With A Friend"}, - - { set = "eEX eNH eMS eGV eDH eIN eAS", name = "Still Bath Water"}, -- still, calm e, turbulent - { set = "eEX eNH eMS eGV eDH eIN eDP", name = "Plain Still Shower With A Friend"}, - { set = "eEX eNH eMS eGV eDH eAS eDP", name = "Still Cloudy Shower With A Friend"}, - { set = "eEX eNH eMS eGV eIN eAS eDP", name = "Still Holy Shower With A Friend"}, - - { set = "eEX eNH eMS eVL eDH eIN eAS", name = "Jacuzzi Bath Water"}, -- jacuzzi, bubbly e, flat - { set = "eEX eNH eMS eVL eDH eIN eDP", name = "Plain Jacuzzi Shower With A Friend"}, - { set = "eEX eNH eMS eVL eDH eAS eDP", name = "God Gaming With A Friend"}, --would normally be Cloudy Jacuzzi Shower With A Friend - { set = "eEX eNH eMS eVL eIN eAS eDP", name = "Holy Jacuzzi Shower With A Friend"}, - { set = "eEX eNH eMS eDH eIN eAS eDP", name = "Still Jacuzzi Shower With A Friend"}, - - { set = "eEX eNH eGV eVL eDH eIN eAS", name = "Clean Bath Water"}, -- pure e, clean, dirty - { set = "eEX eNH eGV eVL eDH eIN eDP", name = "Plain Clean Shower With A Friend"}, - { set = "eEX eNH eGV eVL eDH eAS eDP", name = "Clean Cloudy Shower With A Friend"}, - { set = "eEX eNH eGV eVL eIN eAS eDP", name = "Clean Holy Shower With A Friend"}, - { set = "eEX eNH eGV eDH eIN eAS eDP", name = "Clean Still Shower With A Friend"}, - { set = "eEX eNH eVL eDH eIN eAS eDP", name = "Clean Jacuzzi Shower With A Friend"}, - - { set = "eEX eMS eGV eVL eDH eIN eAS", name = "Warm Bath Water"}, -- cool e, warm, hot - { set = "eEX eMS eGV eVL eDH eIN eDP", name = "Plain Warm Shower With A Friend"}, - { set = "eEX eMS eGV eVL eDH eAS eDP", name = "Warm Cloudy Shower With A Friend"}, - { set = "eEX eMS eGV eVL eIN eAS eDP", name = "Warm Holy Shower With A Friend"}, - { set = "eEX eMS eGV eDH eIN eAS eDP", name = "Warm Still Shower With A Friend"}, - { set = "eEX eMS eVL eDH eIN eAS eDP", name = "Warm Jacuzzi Shower With A Friend"}, - { set = "eEX eGV eVL eDH eIN eAS eDP", name = "Warm Clean Shower With A Friend"}, - - { set = "eNH eMS eGV eVL eDH eIN eAS", name = "Normal Bath Water"}, -- soft e, normal, hard ue, very hard - { set = "eNH eMS eGV eVL eDH eIN eDP", name = "Plain Normal Shower With A Friend"}, - { set = "eNH eMS eGV eVL eDH eAS eDP", name = "Normal Cloudy Shower With A Friend"}, - { set = "eNH eMS eGV eVL eIN eAS eDP", name = "Normal Holy Shower With A Friend"}, - { set = "eNH eMS eGV eDH eIN eAS eDP", name = "Normal Still Shower With A Friend"}, - { set = "eNH eMS eVL eDH eIN eAS eDP", name = "Normal Jacuzzi Shower With A Friend"}, - { set = "eNH eGV eVL eDH eIN eAS eDP", name = "Normal Clean Shower With A Friend"}, - { set = "eMS eGV eVL eDH eIN eAS eDP", name = "Normal Warm Shower With A Friend"}, - -- 8 mods - { set = "eEX eNH eMS eGV eVL eDH eIN eAS", name = "Bath Water"}, - { set = "eEX eNH eMS eGV eVL eDH eIN eDP", name = "Plain Bath With A Friend"}, - { set = "eEX eNH eMS eGV eVL eDH eAS eDP", name = "Cloudy Bath With A Friend"}, - { set = "eEX eNH eMS eGV eVL eIN eAS eDP", name = "Holy Bath With A Friend"}, - { set = "eEX eNH eMS eGV eDH eIN eAS eDP", name = "Still Bath With A Friend"}, - { set = "eEX eNH eMS eVL eDH eIN eAS eDP", name = "Jacuzzi Bath With A Friend"}, - { set = "eEX eNH eGV eVL eDH eIN eAS eDP", name = "Clean Bath With A Friend"}, - { set = "eEX eMS eGV eVL eDH eIN eAS eDP", name = "Warm Bath With A Friend"}, - { set = "eNH eMS eGV eVL eDH eIN eAS eDP", name = "Normal Bath With A Friend"}, - -- 9 mods - { set = "eEX eNH eMS eGV eVL eDH eIN eAS eDP", name = "Bath With A Friend"}, - } -} - -for _, sets in next, ComboData do - for i = 1, #sets do - local cmb = sets[i] - cmb.name = '"' .. cmb.name:upper() .. '"' - local cmbStr = table.concat(TABLE.sort(cmb.set:trim():split('%s+', true)), ' ') - sets[cmbStr] = sets[cmbStr] or cmb - end -end - -PieceData = { - { id = 'nightcore', text = { COLOR.lR, "Z", }, popup = { COLOR.lR, "Z - Nightcore" } }, - { id = 'slowmo', text = { COLOR.lG, "S", }, popup = { COLOR.lG, "S - Sloooooow-mo" } }, - { id = 'glassCard', text = { COLOR.lB, "J", }, popup = { COLOR.lB, "J - Glass Card" } }, - { id = 'fastLeak', text = { COLOR.lO, "L", }, popup = { COLOR.lO, "L - Fast Leak" } }, - { id = 'invisUI', text = { COLOR.lM, "T", }, popup = { COLOR.lM, "T - Invisible UI" } }, - { id = 'invisCard', text = { COLOR.lY, "O", }, popup = { COLOR.lY, "O - Invisible Card" } }, - { id = 'closeCard', text = { COLOR.lC, "I", }, popup = { COLOR.lC, "I - Close Card" } }, - -- Trevor Smithy - { id = 'enightcore', text = { COLOR.lR, "eZ", }, popup = { COLOR.lR, "eZ - Nightcore+" } }, - { id = 'eslowmo', text = { COLOR.lG, "eS", }, popup = { COLOR.lG, "eS - Slow-mo+" } }, - { id = 'eglassCard', text = { COLOR.lB, "eJ", }, popup = { COLOR.lB, "eJ - Glass Card+" } }, - { id = 'efastLeak', text = { COLOR.lO, "eL", }, popup = { COLOR.lO, "eL - Slow Leak" } }, - { id = 'einvisUI', text = { COLOR.lM, "eT", }, popup = { COLOR.lM, "eT - Transparent UI" } }, - { id = 'einvisCard', text = { COLOR.lY, "eO", }, popup = { COLOR.lY, "eO - Transparent Card" } }, - { id = 'ecloseCard', text = { COLOR.lC, "eI", }, popup = { COLOR.lC, "eI - Closer Card" } }, - -- - { id = 'allclear', text = { COLOR.LL, "-", }, popup = { COLOR.LL, "All Clear" } }, -} - -RevSwampName = { - "Z", "S", "J", "L", "T", "O", "I", - [["BLIGHT"]], - [["DESOLATION"]], - [["HAVOC"]], - [["PANDEMONIUM"]], - [["INFERNO"]], - [["PURGATORY"]], - [["PERDITION"]], - [["CATACLYSM"]], - [["ANNIHILATION"]], - [["ARMAGEDDON"]], - [["ABYSS"]], - [["APOCALYPSE"]], -- not used -} - -MetricSpeedName = { - [["PETA"]], - [["EXA"]], - [["ZETTA"]], - [["YOTTA"]], - [["RONNA"]], - [["QUETTA"]], -} - -Floors = { - [0] = { top = 0, name = "The Basement" }, - { top = 50, event = {}, name = "Hall of Beginnings" }, - { top = 150, event = { 'dmgDelay', -2, 'dmgWrong', 1 }, name = "The Hotel", MSshuffle = 1 }, - { top = 300, event = { 'dmgDelay', -2, 'dmgCycle', -.5 }, name = "The Casino" }, - { top = 450, event = { 'dmgDelay', -1, 'dmgCycle', -.5 }, name = "The Arena" }, - { top = 650, event = { 'dmgDelay', -1, 'dmgCycle', -.5, 'dmgWrong', 1 }, name = "The Museum", MSshuffle = 2 }, - { top = 850, event = { 'dmgDelay', -1, 'dmgTime', 1, 'maxQuestSize', 1 }, name = "Abandoned Offices" }, - { top = 1100, event = { 'dmgDelay', -1, 'dmgCycle', -.5 }, name = "The Laboratory", MSshuffle = 3 }, - { top = 1350, event = { 'dmgDelay', -1, 'dmgCycle', -.5 }, name = "The Core" }, - { top = 1650, event = { 'dmgDelay', -.5, 'dmgWrong', 1 }, name = "Corruption", MSshuffle = 4 }, - { top = 1e99, event = { 'dmgDelay', -.5, 'dmgCycle', -.5, 'dmgTime', 1 }, name = "Platform of the Gods", eMSshuffle = 1 }, - { top = 1e99, name = "Stellar Nebula Frontier" }, -- Only name is used - -- Initial: Delay=15. Cycle=5, Wrong=1 - -- Total: Delay-10, Cycle-3, Wrong+4 -} - -NegFloors = { - [0] = { bottom = -1e99 }, - { bottom = -50, name = "The Basement" }, - { bottom = -150, name = "Zenith Restaurant" }, - { bottom = -300, name = "Underground Parking" }, - { bottom = -450, name = "The Bunker" }, - { bottom = -650, name = "The Infirmary" }, - { bottom = -850, name = "Decayed Catacombs" }, - { bottom = -1100, name = "Sacreligious Ruins" }, - { bottom = -1350, name = "Singularity Reactor" }, - { bottom = -1650, name = "Distorted Gateways" }, - { bottom = -1e99, name = "Endless Void" }, -} -NegTexts = { - b1 = { -- The Basement - desc = "A basic storage room for the floors above... and below.", - begin = [[You find yourself in an unfamiliar place.]], - noAS = [[You passed the security check without any prohibited items.]], - ASoff = [[To prevent mech heart users from entering, the AS mod has been confiscated.]], - -- egg = [[Garbo checks the imprisoned mech heart users here from time to time, except rtxtile, who kept escaping somehow?]], - }, - b2 = { -- Zenith Restaurant - desc = "A lively restaurant with a lovely atmosphere.\nThough the prices here are slightly outrageous...", - begin = [[The smell of food calms your senses...]], - effStart = [[Illusions dance before your eyes...]], - noVL = [[You feel yourself getting weaker...]], - VLoff = [[You feel your strength fading...]], - noIN = [[The illusion before your eyes hasn't entirely faded...]], - INoff = [[Your mind is becoming clearer...]], - }, - b3 = { -- Underground Parking - desc = "A boundless parking lot for all of these visitors.", - begin = [[The vast lot's tranquility reassures you.]], - effStart = [[But a realization dawned - you were lost.]], - mid1 = [["Where am I?"]], - noGV = [[You feel like you're not going fast enough...]], - GVoff = [[You subconsciously quickened your pace...]], - mid2 = [["Where am I going?"]], - }, - b4 = { -- The Bunker - desc = "A regular bunker...\nafter witnessing the Corruption, you definitely know why it was built.", - begin = [[You feel safe away from the above.]], - effStart = [[The barren bunker begins to feel ghostly.]], - noMS = [[It seems that luck was against you...]], - MSoff = [[You organized your thoughts...]], - }, - b5 = { -- The Infirmary - desc = "The medical sector of the tower, filled with incomprehensible technology.\nThey look similar to the ones in the Laboratory...", - begin = [[Endless beeping echoes through the halls you roam.]], - effStart = [[One horrifying scene after another floods your vision.]], - noDH = [[A sinister thought crosses your mind...]], - DHoff = [[You shuddered while walking in this terrifying place.]], - }, - b6 = { -- Decayed Catacombs - desc = "A complex of the dead,\nnow decaying into an even more unsettling shell of itself.", - begin = [[The feeling of safety slipped away.]], - effStart = [[Your attention strays...]], - mid = [[You begin to hear something calling your name...]], - noNH = [[You cannot ignore the voice...]], - NHoff = [[You overcome your fear.]], - }, - b7 = { -- Sacreligious Ruins - desc = "The remains of a previously sacred chapel, the spirits of those,\nwho worshipped the gods above linger on...", - desc2 = [[Whispers of a missing artifact echo throughout the area...]], - begin = [[You pray that nothing dire becomes of you.]], - effStart = [[Spacetime ahead is heavily warped...]], - mid = [[You know you have to go as fast as possible.]], - }, - b8 = { -- Singularity Reactor - desc = "Fueled by the power of the cosmos and the stolen artifact, powering something...", - begin = [[You are overwhelmed by the reactor's magnitude.]], - mid1 = [[Dizzy spells.]], - mid2 = [[Blurred vision.]], - mid3 = [[Head throbbing.]], - -- mid = [[The mysterious voice is growing ever nearer...]], - }, - b9 = { -- Distorted Gateways - desc = "A hall of millions of gateways to different realities, towers and wastelands...\nThe mere thought of something like this is sickening...", - desc2 = [[The entrance to a false promise of paradise.]], - desc3 = [[You reach the bottom... or it seemed to be at first glance... one last gateway was left...]], - begin = [[The endless void beckons you...]], - mid = [[RUN.]], - -- begin = [[You feel nostalgia at the sight of a familiar tower.]], - }, - b10 = { -- Endless Void - desc = "A realm of absolutely nothing, none have ever returned.", - desc2 = [[You look back above... yet you've already gone too far in this insane abyss for you to see anything.]], - -- begin = [[...and you pass the point of no return.]], - -- mid1 = [[Everything begins to go quiet.]], - end1 = [[...this is it?]], - end2 = [[This is what's down below all of this?]], - end3 = [[It's so empty... and vast...]], - end4 = [[Yet it feels nostalgic somehow...]], - end5 = [[And peaceful.]], - }, -} -NegEvents = { - -- B1: The Basement - { h = -10 }, { text = 'b1.begin' }, - { h = -26 }, - { text = 'b1.noAS', color = 'lB', cond = function() return GAME.mod.AS == 0 end }, - { - text = 'b1.ASoff', - color = 'lO', - cond = function() return GAME.mod.AS > 0 end, - event = function() - GAME.attackMul = GAME.attackMul - .1 - GAME.dmgTimerMul = GAME.dmgTimerMul + .01 - GAME.mod.AS = 0 - GAME.refreshModIcon() - GAME.refreshRPC() - end, - }, - - -- B2: Zenith Restaurant - { h = -50 }, { event = { 'dmgDelay', -2 } }, - { event = { 'attackMul', -.1, 'timerMul', -.25 } }, - { h = -55 }, { text = 'b2.begin' }, - { h = -60 }, - { - text = 'b2.effStart', - event = function() - GAME.nightcore = true - RefreshBGM() - end - }, - { h = -90 }, - { text = 'b2.noVL', color = 'lB', cond = function() return GAME.mod.VL == 0 end }, - { - text = 'b2.VLoff', - color = 'lO', - cond = function() return GAME.mod.VL > 0 end, - event = function() - GAME.attackMul = GAME.attackMul - .1 - GAME.dmgTimerMul = GAME.dmgTimerMul + .01 - GAME.mod.VL = 0 - GAME.refreshModIcon() - GAME.refreshRPC() - end, - }, - { h = -120 }, - { text = 'b2.noIN', color = 'lB', cond = function() return GAME.mod.IN == 0 end }, - { - text = 'b2.INoff', - color = 'lO', - cond = function() return GAME.mod.IN > 0 end, - event = function() - GAME.dmgCycle = GAME.dmgCycle + GAME.mod.IN * 1 - GAME.attackMul = GAME.attackMul - .1 - GAME.dmgTimerMul = GAME.dmgTimerMul + .01 - GAME.mod.IN = 0 - RefreshBGM() - for _, C in ipairs(Cards) do C:flip() end - GAME.refreshModIcon() - GAME.refreshRPC() - end, - }, - { h = -150 }, - { - event = function() - GAME.nightcore = false - RefreshBGM() - end - }, - - - -- B3: Underground Parking - { h = -150 }, { event = { 'dmgDelay', -2, 'dmgCycle', -.5 } }, - { event = { 'attackMul', -.1, 'timerMul', -.15 } }, - { h = -155 }, { text = 'b3.begin' }, - { h = -160 }, { text = 'b3.effStart' }, - { h = -165 }, { event = { 'invisUI', true } }, - { h = -170 }, { event = { 'invisUI', false } }, - { h = -175 }, { event = { 'invisUI', true } }, - { h = -180 }, { text = 'b3.mid1' }, - { h = -185 }, { event = { 'invisUI', false } }, - { h = -195 }, { event = { 'invisUI', true } }, - { h = -200 }, - { text = 'b3.noGV', color = 'lB', cond = function() return GAME.mod.GV == 0 end }, - { - text = 'b3.GVoff', - color = 'lO', - cond = function() return GAME.mod.GV > 0 end, - event = function() - GAME.dmgDelay = GAME.dmgDelay + GAME.mod.GV * 4 - GAME.attackMul = GAME.attackMul - .1 - GAME.dmgTimerMul = GAME.dmgTimerMul + .01 - GAME.mod.GV = 0 - GAME.refreshModIcon() - GAME.refreshRPC() - RefreshBGM() - end, - }, - { h = -200 }, { event = { 'invisUI', false } }, - { h = -210 }, { event = { 'invisUI', true } }, - { h = -220 }, { text = 'b3.mid2' }, - { h = -250 }, { event = { 'invisUI', false } }, - { h = -260 }, { event = { 'invisUI', true } }, - { h = -280 }, { event = { 'invisUI', false } }, - - -- B4: The Bunker - { h = -300 }, { event = { 'dmgDelay', -1, 'dmgCycle', -.5 } }, - { event = { 'attackMul', -.1, 'timerMul', -.1 } }, - { h = -310 }, - { text = 'b4.begin' }, - { event = function() GAME.dmgWrong = math.min(GAME.dmgWrong, 2) end }, - { h = -320 }, { text = 'b4.effStart', event = { 'glassCard', true } }, - { h = -380 }, - { text = 'b4.noMS', color = 'lB', cond = function() return GAME.mod.MS == 0 end }, - { - text = 'b4.MSoff', - color = 'lO', - cond = function() return GAME.mod.MS > 0 end, - event = function() - GAME.extraQuestBase = GAME.extraQuestBase - GAME.mod.MS * .2 - GAME.attackMul = GAME.attackMul - .1 - GAME.dmgTimerMul = GAME.dmgTimerMul + .01 - GAME.mod.MS = 0 - GAME.sortCards() - GAME.refreshModIcon() - GAME.refreshRPC() - end, - }, - { h = -450 }, { event = { 'glassCard', false } }, - - -- B5: The Infirmary - { h = -450 }, { event = { 'dmgDelay', -1, 'dmgCycle', -.5 } }, - { event = { 'attackMul', -.1 } }, - { event = function() GAME.dmgWrong = math.min(GAME.dmgWrong, 2) end }, - { h = -460 }, { text = 'b5.begin' }, - { h = -470 }, { text = 'b5.effStart' }, - { - event = function() - GAME.slowmo = true - RefreshBGM() - end - }, - { h = -550 }, - { text = 'b5.noDH', color = 'lB', cond = function() return GAME.mod.DH == 0 end }, - { - text = 'b5.DHoff', - color = 'lO', - cond = function() return GAME.mod.DH > 0 end, - event = function() - GAME.extraQuestVar = GAME.extraQuestVar - GAME.mod.DH * .2 - GAME.attackMul = GAME.attackMul - .1 - GAME.dmgTimerMul = GAME.dmgTimerMul + .01 - GAME.mod.DH = 0 - GAME.refreshModIcon() - GAME.refreshRPC() - end, - }, - { h = -650 }, - { - event = function() - GAME.slowmo = false - RefreshBGM() - end - }, - - -- B6: Decayed Catacombs - { h = -650 }, { event = { 'dmgDelay', -1, 'dmgTime', 1, 'maxQuestSize', 1 } }, - { event = { 'attackMul', -.1 } }, - { event = function() GAME.dmgWrong = math.min(GAME.dmgWrong, 2) end }, - { h = -660 }, { text = 'b6.begin' }, - { h = -670 }, { text = 'b6.effStart', event = { 'invisCard', true } }, - { h = -720 }, - { text = 'b6.noNH', color = 'lB', cond = function() return GAME.mod.NH == 0 end }, - { - text = 'b6.NHoff', - color = 'lO', - cond = function() return GAME.mod.NH > 0 end, - event = function() - GAME.dmgHeal = GAME.dmgHeal + GAME.mod.NH * 3 - GAME.attackMul = GAME.attackMul - .1 - GAME.dmgTimerMul = GAME.dmgTimerMul + .01 - GAME.mod.NH = 0 - GAME.maxQuestCount = 3 - GAME.xpLockLevelMax = 5 - GAME.refreshModIcon() - GAME.refreshRPC() - end, - }, - { h = -850 }, { event = { 'invisCard', false } }, - - -- B7: Sacreligious Ruins - { h = -850 }, { event = { 'dmgDelay', -1, 'dmgCycle', -.5 } }, - { event = { 'attackMul', -.1 } }, - { event = function() GAME.dmgWrong = math.min(GAME.dmgWrong, 2) end }, - { h = -860 }, { text = 'b7.begin' }, - { h = -900 }, { text = 'b7.effStart' }, - { h = -950 }, { text = 'b7.mid' }, - - -- B8: Singularity Reactor - { h = -1100 }, { event = { 'dmgDelay', -1, 'dmgCycle', -.5 } }, - { event = function() GAME.dmgWrong = math.min(GAME.dmgWrong, 2) end }, - { h = -1115 }, { text = 'b8.begin' }, - { h = -1145 }, { text = 'b8.mid1', color = 'R', size = 1.26, sfx = 'b2bcharge_distance_3', duration = 1.26 }, - { h = -1160 }, { text = 'b8.mid2', color = 'R', size = 1.26, sfx = 'b2bcharge_distance_3', duration = 1.26 }, - { h = -1175 }, { text = 'b8.mid3', color = 'R', size = 1.26, sfx = 'b2bcharge_distance_3', duration = 1.26 }, - { h = -1182 }, { sfx = 'b2bcharge_distance_2' }, - { h = -1185 }, { sfx = 'b2bcharge_distance_2' }, - { h = -1188 }, { sfx = 'b2bcharge_distance_2' }, - { h = -1191 }, { sfx = 'b2bcharge_distance_1' }, - { h = -1194 }, { sfx = 'b2bcharge_distance_1' }, - { h = -1197 }, { sfx = 'b2bcharge_distance_1' }, - { h = -1200 }, - { - event = function() - GAME.nightcore = true - RefreshBGM() - end - }, - - { h = -1350 }, - { - event = function() - GAME.nightcore = false - RefreshBGM() - end - }, - - - -- B9: Distorted Gateways - { h = -1350 }, { event = { 'dmgDelay', -.5 } }, - { h = -1360 }, { text = 'b9.begin' }, - { event = function() GAME.rankLimit = math.min(GAME.rankLimit, 10) end }, - { - text = 'b9.mid', - color = 'lR', - size = 2.6, - duration = 16, - event = function() - GAME.time = math.max(GAME.time, 419) - end - }, - - -- B10: Endless Void - { h = -1650 }, - { - event = function() - GAME.invincible = true - GAME.timerMul = 0 - GAME.dmgWrong = 1 - GAME.invisCard = true - GAME.dmgTimerMul = 1e99 - GAME.height = -1650 - GAME.heightBonus = 0 - GAME.attackMul = -1 - GAME.chain = 0 - GAME.maxQuestCount = 1 - if GAME.rank > 8 then - GAME.rank = 8 - GAME.xp = 32 - end - GAME.xpLockLevelMax = 2600 - GAME.xpLockTimer = 2600 - GAME.xpLockLevel = 2600 - GAME.rankLimit = 8 - TEXTS.rank:set("R-" .. GAME.rank) - - GAME.mod.EX = 0 - GAME.refreshModIcon() - GAME.refreshRPC() - GAME.mod.EX = 2 - end, - }, - { h = -1660 }, { text = 'b10.end1', color = 'L', duration = 6.26, sfx = 'piece_change', event = function() BGM.setVol(STAT.bgm / 100 * .85) end }, - { h = -1690 }, { text = 'b10.end2', color = 'L', duration = 6.26, sfx = 'piece_change', event = function() BGM.setVol(STAT.bgm / 100 * .7) end }, - { h = -1720 }, { text = 'b10.end3', color = 'L', duration = 6.26, sfx = 'piece_change', event = function() BGM.setVol(STAT.bgm / 100 * .5) end }, - { h = -1750 }, { text = 'b10.end4', color = 'L', duration = 6.26, sfx = 'piece_change', event = function() BGM.setVol(STAT.bgm / 100 * .3) end }, - { h = -1780 }, { text = 'b10.end5', color = 'L', duration = 6.26, sfx = 'piece_change', event = function() BGM.setVol(STAT.bgm / 100 * 0) end }, - { h = -1800 }, - { - event = function() - GAME.heightBonus = 0 - GAME.height = -1800 - FloatOnCard = nil - GAME.refreshLayout() - STAT.clicker = true - SFX.play('warp') - SCN.go('ending', "warp") - end - }, - { h = -1e99 }, -} -local lastH = -0 -for _, e in next, NegEvents do - e.cond = e.cond or TRUE - e.text = e.text and TABLE.pathIndex(NegTexts, e.text) or e.text - e.text2 = e.text2 and TABLE.pathIndex(NegTexts, e.text2) or e.text2 - if e.h then - assert(e.h <= lastH) - lastH = e.h - else - e.h = lastH - end -end - -Fatigue = { - normal = { - { time = 90, event = { 'extraQuestBase', .2, 'animDuration', .5 } }, - { time = 180, event = { 'extraQuestBase', .2, 'animDuration', .5 } }, - { time = 240, event = { 'extraQuestBase', .2, 'animDuration', 1 } }, - { time = 300, event = { 'dmgTimerMul', -.1, 'animDuration', 1 }, text = "FATIGUE SETS IN_", desc = "TimerSpeed++" }, - { time = 330, event = { 'dmgCycle', -.5, 'dmgWrong', 1 }, text = "YOUR BODY GROWS WEAK_", desc = "DmgCycle-- Damage++" }, - { time = 360, event = { 'dmgTimerMul', -.1, 'dmgHeal', -1, 'animDuration', 1 }, text = "ALL SENSES BLUR TOGETHER_", desc = "TimerSpeed++ Heal--" }, - { time = 390, event = { 'dmgTimerMul', -.1, 'dmgWrong', 1 }, text = "YOUR CONSCIOUSNESS FADES_", desc = "TimerSpeed++ Damage++" }, - { time = 420, event = { 'dmgTimerMul', -.05, 'dmgCycle', -.5, 'animDuration', 1 }, text = "THIS IS THE END.", desc = "TimerSpeed++ DmgCycle--", final = true }, - { time = 422, event = { 'dmgTimerMul', -.05 } }, - { time = 425, event = { 'dmgTimerMul', -.05 } }, - { time = 430, event = { 'dmgTimerMul', -.05 } }, - { time = 480, event = { 'atkBufferCap', 6, 'animDuration', 1, 'maxQuestSize', 1 }, text = "FAREWELL.", desc = "QuestDifficulty++++++", duration = 26, color = 'lB', }, - { time = 485, event = { 'atkBufferCap', 6, 'animDuration', 3, 'extraQuestVar', 1 } }, - { time = 490, event = { 'atkBufferCap', 6, 'animDuration', 4 } }, - { time = 500, event = { 'animDuration', 5 }, --[[21]] }, - { time = 510, event = { 'animDuration', 5 }, --[[26]] text = "" }, - { time = 520, event = { 'animDuration', 10, 'lifeLeak', .2 }, --[[36]] text = "ANGINA.", desc = "HP leak", color = 'DR' }, - { time = 540, event = { 'animDuration', 12 }, --[[48]] }, - { time = 560, event = { 'animDuration', 14 }, --[[62]] text = "" }, - { time = 1e99 }, -- Total: dmgTimerMul-50%, Cycle-1, Wrong+2, killscreen at 520+100(200)s - }, - rEX = { - { time = 90, event = { 'extraQuestBase', .2, 'animDuration', .5 } }, - { time = 180, event = { 'extraQuestBase', .2, 'animDuration', .5 } }, - { time = 240, event = { 'extraQuestBase', .2, 'animDuration', 1 } }, - { time = 240, event = { 'dmgTimerMul', -.2 }, text = "YOUR POWER SLIPS_", desc = "TimerSpeed++" }, - { time = 270, event = { 'dmgWrong', 2 }, text = "WHISPERS OF DISCONTENT SPREAD_", desc = "Damage++" }, - { time = 300, event = { 'dmgCycle', -1, 'animDuration', 1 }, text = "PROTESTERS LINE THE STREETS_", desc = "DmgCycle--" }, - { time = 330, event = { 'dmgTimerMul', -.2, 'dmgWrong', 2 }, text = "YOUR CLOSEST ALLIES DEFECT_", desc = "TimerSpeed++ Damage++" }, - { time = 360, event = { 'dmgTimerMul', -.1, 'dmgHeal', -1, 'animDuration', 1 }, text = "PARANOIA CLOUDS YOUR JUDGEMENT_", desc = "TimerSpeed++ Heal--" }, - { time = 362, event = { 'dmgTimerMul', -.05 } }, - { time = 365, event = { 'dmgTimerMul', -.05 } }, - { time = 390, event = { 'dmgCycle', -.5, 'dmgWrong', 1 }, text = "THE REVOLUTION HAS BEGUN_", desc = "DmgCycle-- Damage++" }, - { time = 420, event = { 'dmgTimerMul', -.1, 'animDuration', 1 }, text = "THE END OF AN ERA.", desc = "TimerSpeed++++", duration = 10, final = true }, - { time = 423, event = { 'dmgTimerMul', -.05 } }, - { time = 426, event = { 'dmgTimerMul', -.05 } }, - { time = 430, event = { 'dmgTimerMul', -.05 } }, - { time = 435, event = { 'dmgTimerMul', -.03 } }, - { time = 440, event = { 'dmgTimerMul', -.02, 'lifeLeak', .5 }, text = "BLACK OUT.", desc = "HP leak", color = 'DR' }, - { time = 1e99 }, -- Total: dmgTimerMul-90%, Cycle-1.5, Wrong+5, killscreen at 440+40(60)s - }, - -- Trevor Smithy - eEX = { - { time = 90, event = { 'extraQuestBase', .2, 'animDuration', .5 } }, - { time = 180, event = { 'extraQuestBase', .2, 'animDuration', .5 } }, - { time = 240, event = { 'extraQuestBase', .2, 'animDuration', 1 } }, - { time = 360, event = { 'dmgTimerMul', -.1, 'animDuration', 1 }, text = "FATIGUE SETS IN_", desc = "TimerSpeed++" }, - { time = 390, event = { 'dmgCycle', -.5, 'dmgWrong', 1 }, text = "YOUR BODY GROWS WEAK_", desc = "DmgCycle-- Damage++" }, - { time = 420, event = { 'dmgTimerMul', -.1, 'dmgHeal', -1, 'animDuration', 1 }, text = "ALL SENSES BLUR TOGETHER_", desc = "TimerSpeed++ Heal--" }, - { time = 450, event = { 'dmgTimerMul', -.1, 'dmgWrong', 1 }, text = "YOUR CONSCIOUSNESS FADES_", desc = "TimerSpeed++ Damage++" }, - { time = 480, event = { 'dmgTimerMul', -.05, 'dmgCycle', -.5, 'animDuration', 1 }, text = "THIS IS THE END.", desc = "TimerSpeed++ DmgCycle--" }, - { time = 482, event = { 'dmgTimerMul', -.05 } }, - { time = 485, event = { 'dmgTimerMul', -.05 } }, - { time = 490, event = { 'dmgTimerMul', -.05 } }, - { time = 540, event = { 'atkBufferCap', 6, 'animDuration', 1, 'maxQuestSize', 1 }, text = "FAREWELL.", desc = "QuestDifficulty++++++", duration = 26, color = 'lB', }, - { time = 545, event = { 'atkBufferCap', 6, 'animDuration', 3, 'extraQuestVar', 1 } }, - { time = 550, event = { 'atkBufferCap', 6, 'animDuration', 5 } }, - { time = 570, event = { 'animDuration', 11 }, --[[26]] text = "" }, - { time = 600, event = { 'animDuration', 16 }, --[[42]] text = "" }, - { time = 630, event = { 'animDuration', 20 }, --[[62]] text = "" }, - { time = 660, event = { 'animDuration', 64 }, --[[126]] text = "YOUR VISION WEAKENS_", desc = "QuestSpeed------", duration = 26, color = 'lB', }, - { time = 750, event = { 'animDuration', -16, 'dmgHeal', 1 }, --[[110]] text = "YOU'RE STILL GOING?", desc = "QuestSpeed++++, Heal++", duration = 26, color = 'lB', }, - { time = 840, event = { 'atkBufferCap', 6, 'extraQuestVar', 1, 'maxQuestSize', 1 }, text = "IT'S TIME TO STOP!", desc = "QuestDifficulty++++++", duration = 26, color = 'lB', final = true }, - { time = 870, event = { 'extraQuestBase', .01 }, text = "YOU FEEL THE IMPENDING DOOM_", desc = "30 Seconds Remain", duration = 12, color = 'lB', }, - { time = 885, event = { 'extraQuestBase', .01 }, text = "DIE!", desc = "15 Seconds Remain", duration = 4, color = 'lB', }, - { time = 890, event = { 'extraQuestBase', .01 }, text = "DIE!", desc = "10 Seconds Remain", duration = 0.5, color = 'lB', }, - { time = 891, event = { 'extraQuestBase', .01 }, text = "DIE!", desc = "9 Seconds Remain", duration = 0.5, color = 'lB', }, - { time = 892, event = { 'extraQuestBase', .01 }, text = "DIE!", desc = "8 Seconds Remain", duration = 0.5, color = 'lB', }, - { time = 893, event = { 'extraQuestBase', .01 }, text = "DIE!", desc = "7 Seconds Remain", duration = 0.5, color = 'lB', }, - { time = 894, event = { 'extraQuestBase', .01 }, text = "DIE!", desc = "6 Seconds Remain", duration = 0.5, color = 'lB', }, - { time = 895, event = { 'extraQuestBase', .01 }, text = "DIE!", desc = "5 Seconds Remain", duration = 0.5, color = 'lB', }, - { time = 896, event = { 'extraQuestBase', .01 }, text = "DIE!", desc = "4 Seconds Remain", duration = 0.5, color = 'lB', }, - { time = 897, event = { 'extraQuestBase', .01 }, text = "DIE!", desc = "3 Seconds Remain", duration = 0.5, color = 'lB', }, - { time = 898, event = { 'extraQuestBase', .01 }, text = "DIE!", desc = "2 Seconds Remain", duration = 0.5, color = 'lB', }, - { time = 899, event = { 'extraQuestBase', .01 }, text = "DIE!", desc = "1 Second Remains", duration = 0.5, color = 'lB', }, - { time = 900, event = { 'dmgCycle', -3.99, 'dmgTimerMul', -.49, 'dmgTime', 666 }, text = "Thank you so much for playing my mod!", desc = "WAH-BAAM!", duration = 26, color = 'lB', }, - { time = 1e99 }, -- Total: dmgTimerMul-50%, Cycle-1, Wrong+2 - }, - -- - rDP = { - { time = 20, event = { 'dmgHeal', -1 }, --[[ 2 ]] text = "YOUR PASSION FADES_", desc = "Heal-", duration = 10 }, - { time = 40, event = { 'dmgHeal', -.5 }, --[[ 1.5 ]] text = "THEIR REPLIES BECOME LESS ENGAGED_", desc = "Heal--", duration = 10 }, - { time = 60, event = { 'dmgHeal', -.5, 'animDuration', .5 }, --[[ 1 ]] text = "YOU FEEL NEGLECTED_", desc = "Heal---", duration = 10 }, - { time = 80, event = { 'dmgHeal', 1 }, --[[ 2 ]] text = "THEY SUCCESSFULLY APOLOGIZE_?", desc = "Heal+", duration = 10, color = 'lO' }, - { time = 90, event = { 'extraQuestBase', .2 } }, - { time = 100, event = { 'dmgHeal', 1 }, --[[ 3 ]] text = "THINGS ARE BACK TO HOW THEY USED TO BE_!", desc = "Heal+++", duration = 10, color = 'lO' }, - { time = 120, event = { 'dmgHeal', -1, 'animDuration', .5 }, --[[ 2 ]] text = "MINOR ISSUES BECOME LARGE CONFLICTS_", desc = "Heal--", duration = 10 }, - { time = 140, event = { 'dmgHeal', -1 }, --[[ 1 ]] text = "YOU BLAME THEM FOR YOUR OWN PROBLEMS_", desc = "Heal---", duration = 10 }, - { time = 160, event = { 'reviveDifficulty', 3 }, text = "THEY WOULD RATHER SPEND TIME ALONE_", desc = "Revive++", duration = 10 }, - { time = 180, event = { 'extraQuestBase', .2 } }, - { time = 180, event = { 'dmgHeal', 1.5, 'animDuration', 1 }, --[[ 2.5 ]] text = "YOU PROMISE TO CHANGE_", desc = "Heal++", duration = 10, color = 'lO' }, - { time = 200, event = { 'dmgTimerMul', -.2 }, text = "PROMISES ARE BROKEN_", desc = "TimerSpeed++", duration = 10 }, - { time = 220, event = { 'dmgHeal', -.5 }, --[[ 2 ]] text = "CONVERSATIONS DEVOLVE TO SHOUTING MATCHES_", desc = "Heal---", duration = 10 }, - { time = 240, event = { 'extraQuestBase', .2, 'animDuration', 1 } }, - { time = 240, event = { 'dmgHeal', -.5 }, --[[ 1.5 ]] text = "ALL TRUST HAS WITHERED AWAY_", desc = "Heal--", duration = 10 }, - { time = 260, event = { 'dmgHeal', -.5 }, --[[ 1 ]] text = "THEY SET AN ULTIMATUM_", desc = "Heal--", duration = 10 }, - { time = 280, event = { 'dmgHeal', -.5 }, --[[ .5 ]] text = "YOU CAN'T BE BOTHERED ANYMORE_", desc = "Heal--", duration = 10 }, - { time = 300, event = { 'dmgWrong', 2, 'animDuration', 1 }, text = "ONE LAST PAINFUL ARGUMENT_", desc = "Dmg+", duration = 10 }, - { time = 320, event = { 'reviveDifficulty', 9999 }, text = "GOODBYE.", desc = "NO REVIVE", duration = 10, color = 'R' }, - { time = 360, event = { 'dmgHeal', 1, 'animDuration', 1 }, --[[ 1.5 ]] text = "\"I MISS YOU\"", desc = "Heal+++", duration = 10, color = 'lO' }, - { time = 380, event = { 'dmgHeal', 1 }, --[[ 2.5 ]] text = "MAYBE IT CAN STILL WORK_?", desc = "Heal+", duration = 10, color = 'lO' }, - { time = 400, event = { 'dmgTimerMul', -.1, 'animDuration', 4 }, text = "GOODBYE.", desc = "TimerSpeed++++", duration = 10, final = true }, - { time = 402, event = { 'dmgTimerMul', -.1 } }, - { time = 405, event = { 'dmgTimerMul', -.1 } }, - { time = 408, event = { 'dmgTimerMul', -.05 } }, - { time = 412, event = { 'dmgTimerMul', -.05 } }, - { time = 416, event = { 'dmgTimerMul', -.05 } }, - { time = 420, event = { 'dmgTimerMul', -.03 } }, - { time = 425, event = { 'dmgTimerMul', -.02 } }, - { time = 476, event = { 'lifeLeak', .2 }, text = "CARDIAC RUPTURE.", desc = "HP leak", color = 'DR' }, - { time = 1e99 }, -- Total: dmgTimerMul-50%, killscreen at 476+150s - }, -} --- My formatter doesn't work if there's "…" inside -for _, f in next, Fatigue do for _, v in next, f do if v.text then v.text = v.text:gsub("_", "…") end end end - -local function rndMod(t) - local d = MATH.randFreqAll(ModData.weight) - t.prompt = t.prompt:repD(d) - if STAT.easyName then d = 'e' .. d end - t.text = STAT.easyName and t.text:repD(ModData.noun[d]) or t.text:repD(ModData.adj[d]) - t.short = t.short:repD(d) -end -local function rndMod2(t) - local d = ModData.deck[math.random(9)].id - t.prompt = t.prompt:repD(d) - if STAT.easyName then d = 'e' .. d end - t.text = STAT.easyName and t.text:repD(ModData.noun[d]) or t.text:repD(ModData.adj[d]) - t.short = t.short:repD(d) -end -local function f5() return math.max(GAME.floor, GAME.negFloor) <= 5 end -local function F6() return math.max(GAME.floor, GAME.negFloor) >= 6 end -local function F9() return math.max(GAME.floor, GAME.negFloor) >= 9 end -local function F9wind() return math.max(GAME.floor, GAME.negFloor) >= 9 and GAME.maxQuestSize >= 4 and GAME.mod.DH ~= -1 end -local function F9wind3() return math.max(GAME.floor, GAME.negFloor) >= 9 and GAME.maxQuestSize >= 5 and GAME.mod.DH ~= -1 end ---ZCEM conditions -local function notENH() return GAME.mod.NH ~= -1 end -local function notENHorF9wind() return math.max(GAME.floor, GAME.negFloor) >= 9 and GAME.maxQuestSize >= 4 and GAME.mod.DH ~= -1 and GAME.mod.NH ~= -1 end -local function notENHorF9wind3() return math.max(GAME.floor, GAME.negFloor) >= 9 and GAME.maxQuestSize >= 5 and GAME.mod.DH ~= -1 and GAME.mod.NH ~= -1 end -local function notEMS() return GAME.mod.MS ~= -1 end -local function notEMSorF6() return math.max(GAME.floor, GAME.negFloor) >= 6 and GAME.mod.MS ~= -1 end -local function notEasyName() return not STAT.easyName end -- whether or not to use SWAMP WATER or BATH WATER -local function easyName() return STAT.easyName end -local function EDP() return GAME.mod.DP == -1 and GAME.mod.NH ~= 2 and GAME.animDuration < 26 end --3rd quest, don't do if rNH or excessive animDuration -local function notUASandEDP() return not (GAME.mod.AS == 2 and URM and GAME.mod.DP == -1) end -- friend won't let you kill yourself -local function notEDHandEDP() return GAME.mod.DH ~= -1 and GAME.mod.DP ~= -1 end -- friend removes annoying revive task -local function notRGVandEDP() return not (GAME.mod.GV == 2 and GAME.mod.DP == -1) and math.max(GAME.floor, GAME.negFloor) <= 5 end --- no commit for 6 seconds - ----@class Prompt ----@field rank number[] ----@field prompt string ----@field target number ----@field short string ----@field text string ----@field cond fun():boolean? ----@field init fun(t:Prompt)? ----@field _prompt string? for repeating check - ----@type Prompt[] -RevivePrompts = { - { rank = { 1, 2 }, prompt = 'activate', target = 30, short = "Activate 30", text = "Activate 30 cards" }, - { rank = { 3, 4 }, prompt = 'activate', target = 80, short = "Activate 80", text = "Activate 80 cards" }, - { rank = { 2, 2 }, prompt = 'cancel', target = 40, short = "Cancel 40", text = "Cancel 40 cards" }, - { rank = { 3, 4 }, prompt = 'cancel', target = 100, short = "Cancel 100", text = "Cancel 100 cards" }, - { rank = { 1, 2 }, prompt = 'flip', target = 50, short = "Flip 50", text = "Flip 50 cards" }, - { rank = { 3, 4 }, prompt = 'flip', target = 120, short = "Flip 120", text = "Flip 120 cards" }, - { rank = { 5, 6 }, prompt = 'flip', target = 300, short = "Flip 300", text = "Flip 300 cards" }, - { rank = { 1, 2 }, prompt = 'flip_single', target = 10, short = "Flip single 10", text = "Flip a single card\n10 times in a row", cond = notUASandEDP }, - { rank = { 2, 4 }, prompt = 'flip_single', target = 20, short = "Flip single 20", text = "Flip a single card\n20 times in a row", cond = notUASandEDP }, - { rank = { 1, 2 }, prompt = 'commit', target = 6, short = "Commit 6x", text = "Commit 6 times" }, - { rank = { 2, 3 }, prompt = 'commit', target = 15, short = "Commit 15x", text = "Commit 15 times" }, - { rank = { 3, 5 }, prompt = 'commit', target = 30, short = "Commit 30x", text = "Commit 30 times" }, - { rank = { 1, 2 }, prompt = 'commit_$1', target = 2, short = "Commit $1 2x", text = "Commit 2 times\nwith $1", init = rndMod }, - { rank = { 3, 4 }, prompt = 'commit_$1', target = 4, short = "Commit $1 4x", text = "Commit 4 times\nwith $1", init = rndMod }, - { rank = { 2, 4 }, prompt = 'commit_$1_row', target = 2, short = "2 Chain with $1", text = "Commit 2 times\nwith $1 in a row", init = rndMod }, - { rank = { 3, 6 }, prompt = 'commit_$1_row', target = 3, short = "3 Chain with $1", text = "Commit 3 times\nwith $1 in a row", init = rndMod }, - { rank = { 1, 3 }, prompt = 'commit_no_$1_row', target = 2, short = "2 chain without $1", text = "Commit 2 times\nwithout $1 in a row", init = rndMod2 }, - { rank = { 3, 5 }, prompt = 'commit_no_$1_row', target = 3, short = "3 chain without $1", text = "Commit 3 times\nwithout $1 in a row", init = rndMod2 }, - { rank = { 1, 2 }, prompt = 'commit_0', target = 2, short = "Commit NOTHING 2x", text = "Commit NOTHING\n2 times" }, - { rank = { 2, 4 }, prompt = 'commit_0', target = 5, short = "Commit NOTHING 5x", text = "Commit NOTHING\n5 times" }, - { rank = { 4, 6 }, prompt = 'commit_0', target = 8, short = "Commit NOTHING 8x", text = "Commit NOTHING\n8 times" }, - { rank = { 1, 3 }, prompt = 'commit_0_row', target = 3, short = "3x Spam commit", text = "Commit NOTHING\n3 times in a row" }, - { rank = { 3, 5 }, prompt = 'commit_no_conn', target = 1, short = "Commit no consec", text = "Commit without consecutive cards", cond = F6 }, - { rank = { 1, 4 }, prompt = 'commit_conn_2', target = 1, short = "Commit 2 consec", text = "Commit with 2 consecutive cards", cond = f5 }, - { rank = { 2, 4 }, prompt = 'commit_conn_3', target = 1, short = "Commit 3 consec", text = "Commit with 3 consecutive cards", cond = f5 }, - { rank = { 3, 5 }, prompt = 'commit_conn_4', target = 1, short = "Commit 4 consec", text = "Commit with 4 consecutive cards" }, - { rank = { 3, 5 }, prompt = 'commit_swamp_l', target = 1, short = "SWAMP WATER LITE", text = "Commit SWAMP WATER LITE", cond = notEasyName}, - { rank = { 4, 6 }, prompt = 'commit_swamp', target = 1, short = "SWAMP WATER", text = "Commit SWAMP WATER", cond = notEasyName}, - { rank = { 3, 5 }, prompt = 'commit_swamp_l', target = 1, short = "BATH WATER LITE", text = "Commit BATH WATER variant", cond = easyName}, - { rank = { 4, 6 }, prompt = 'commit_swamp', target = 1, short = "BATH WATER", text = "Commit BATH WATER", cond = easyName}, - { rank = { 3, 6 }, prompt = 'commit_reversed', target = 1, short = "Commit inversed", text = "Commit all cards\nthat aren't requested" }, - { rank = { 1, 4 }, prompt = 'commit_1card', target = 3, short = "Commit 1 cards 3x", text = "Commit 3 times with\n1 card on first commit" }, - { rank = { 2, 5 }, prompt = 'commit_2card', target = 4, short = "Commit 2 cards 4x", text = "Commit 4 times with\n2 cards on first commit" }, - { rank = { 3, 6 }, prompt = 'commit_3card', target = 5, short = "Commit 3 cards 5x", text = "Commit 5 times with\n3 cards on first commit" }, - { rank = { 4, 6 }, prompt = 'commit_4card', target = 4, short = "Commit 4 cards 4x", text = "Commit 4 times with\n4 cards on first commit" }, - { rank = { 5, 6 }, prompt = 'commit_5card', target = 3, short = "Commit 5 cards 3x", text = "Commit 3 times with\n5 cards on first commit" }, - { rank = { 1, 4 }, prompt = 'pass', target = 10, short = "Pass 10", text = "Pass 10 times" }, - { rank = { 5, 6 }, prompt = 'pass', target = 20, short = "Pass 20", text = "Pass 20 times" }, - { rank = { 2, 5 }, prompt = 'pass_$1', target = 2, short = "Pass 2 with $1", text = "Pass 2 times\nwith $1", init = rndMod, cond = notEDHandEDP }, - { rank = { 3, 5 }, prompt = 'pass_$1', target = 3, short = "Pass 3 with $1", text = "Pass 3 times\nwith $1", init = rndMod, cond = notEDHandEDP }, - { rank = { 4, 6 }, prompt = 'pass_$1', target = 4, short = "Pass 4 with $1", text = "Pass 4 times\nwith $1", init = rndMod, cond = notEDHandEDP }, - { rank = { 2, 4 }, prompt = 'pass_perfect', target = 6, short = "6x perf", text = "Get 6 perfect passes" }, - { rank = { 5, 6 }, prompt = 'pass_perfect', target = 12, short = "12x perf", text = "Get 12 perfect passes" }, - { rank = { 2, 4 }, prompt = 'pass_imperfect', target = 6, short = "6x im-perf", text = "Get 6 imperfect passes", cond = notENH }, - { rank = { 5, 6 }, prompt = 'pass_imperfect', target = 12, short = "12x im-perf", text = "Get 12 imperfect passes", cond = notENH }, - { rank = { 4, 5 }, prompt = 'pass_imperfect_row', target = 3, short = "3x chain im-perf", text = "Get 3 imperfect\npasses in a row", cond = notENH }, - { rank = { 5, 6 }, prompt = 'pass_imperfect_row', target = 8, short = "8x chain im-perf", text = "Get 8 imperfect\npasses in a row", cond = notENH }, - { rank = { 2, 4 }, prompt = 'pass_perfect_row', target = 4, short = "4x chain perf", text = "Get 4 perfect\npasses in a row" }, - { rank = { 3, 5 }, prompt = 'pass_perfect_row', target = 6, short = "6x chain perf", text = "Get 6 perfect\npasses in a row" }, - { rank = { 4, 5 }, prompt = 'pass_perfect_row', target = 8, short = "8x chain perf", text = "Get 8 perfect\npasses in a row" }, - { rank = { 4, 6 }, prompt = 'pass_perfect_row', target = 10, short = "10x chain perf", text = "Get 10 perfect\npasses in a row" }, - { rank = { 2, 3 }, prompt = 'pass_second', target = 4, short = "2nd quest 4x", text = "Pass the second\nquest 4 times" }, - { rank = { 3, 4 }, prompt = 'pass_second', target = 8, short = "2nd quest 8x", text = "Pass the second\nquest 8 times" }, - { rank = { 4, 5 }, prompt = 'pass_second', target = 12, short = "2nd quest 12x", text = "Pass the second\nquest 12 times" }, - { rank = { 2, 3 }, prompt = 'pass_third', target = 1, short = "3rd quest", text = "Pass the third\nquest once", cond = EDP }, - { rank = { 3, 4 }, prompt = 'pass_third', target = 2, short = "3rd quest 2x", text = "Pass the third\nquest 2 times", cond = EDP }, - { rank = { 4, 5 }, prompt = 'pass_third', target = 3, short = "3rd quest 3x", text = "Pass the third\nquest 3 times", cond = EDP }, - { rank = { 2, 4 }, prompt = 'b2b_break_4', target = 1, short = "Break B2B 4x", text = "Break B2B chain\nat B2B x4", cond = notENH }, - { rank = { 3, 4 }, prompt = 'b2b_break_6', target = 1, short = "Break B2B 6x", text = "Break B2B chain\nat B2B x6", cond = notENH }, - { rank = { 4, 5 }, prompt = 'b2b_break_8', target = 1, short = "Break B2B 8x", text = "Break B2B chain\nat B2B x8", cond = notENH }, - { rank = { 4, 6 }, prompt = 'b2b_break_10', target = 1, short = "Break B2B 10x", text = "Break B2B chain\nat B2B x10", cond = notENH }, - { rank = { 4, 6 }, prompt = 'b2b_break_windup', target = 1, short = "Break B2B at a windup", text = "Break B2B at a windup", cond = notENHorF9wind }, - { rank = { 5, 6 }, prompt = 'b2b_break_windup3', target = 1, short = "Break B2B at a windup3+", text = "Break B2B at\na Lv.3+ windup", cond = notENHorF9wind3 }, - { rank = { 1, 3 }, prompt = 'heal', target = 8, short = "Heal 8 HP", text = "Heal 8 HP", cond = notEMS }, - { rank = { 2, 4 }, prompt = 'heal', target = 20, short = "Heal 20 HP", text = "Heal 20 HP", cond = notEMS }, - { rank = { 1, 2 }, prompt = 'send', target = 6, short = "Send 6", text = "Send 6 Attack" }, - { rank = { 3, 4 }, prompt = 'send', target = 20, short = "Send 20", text = "Send 20 Attack" }, - { rank = { 5, 6 }, prompt = 'send', target = 40, short = "Send 40", text = "Send 40 Attack" }, - { rank = { 3, 4 }, prompt = 'pass_windup', target = 1, short = "Windup", text = "Pass a windup", cond = F9wind }, - { rank = { 3, 5 }, prompt = 'pass_windup3', target = 1, short = "Windup3+", text = "Pass a Lv.3+ windup", cond = F9wind3 }, - { rank = { 5, 5 }, prompt = 'pass_windup_inb2b', target = 1, short = "Windup with B2B", text = "Pass a windup\nduring B2B charge", cond = F9wind }, - { rank = { 4, 5 }, prompt = 'pass_windup', target = 4, short = "Windup x 4", text = "Pass 4 windups", cond = F9wind }, - { rank = { 4, 4 }, prompt = 'pass_windup_perfect', target = 1, short = "Windup perf", text = "Pass a windup\nperfectly", cond = F9wind }, - { rank = { 6, 6 }, prompt = 'pass_windup_inb2b', target = 3, short = "Windup x 3 with B2B", text = "Pass 4 windups\nduring a B2B charge", cond = F9wind }, - { rank = { 5, 5 }, prompt = 'pass_windup_perfect', target = 4, short = "Windup perf x 4", text = "Pass 4 windups\nperfectly", cond = F9wind }, - { rank = { 5, 5 }, prompt = 'pass_windup3_perfect', target = 1, short = "Windup3+ perf", text = "Pass a Lv.3+\nwindup perfectly", cond = F9wind3 }, - { rank = { 6, 6 }, prompt = 'pass_windup3_perfect', target = 4, short = "Windup3+ perf x 4", text = "Pass 4 Lv.3+\nwindups perfectly", cond = F9wind3 }, - { rank = { 2, 2 }, prompt = 'dmg_time', target = 4, short = "Take Dmg 4x", text = "Take damage 4 times", cond = notEMS }, - { rank = { 3, 3 }, prompt = 'dmg_time', target = 8, short = "Take Dmg 8x", text = "Take damage 8 times", cond = notEMS }, - { rank = { 2, 4 }, prompt = 'dmg_amount', target = 10, short = "Lose 10 HP", text = "Take 10 damage total", cond = notEMS }, - { rank = { 4, 6 }, prompt = 'dmg_amount', target = 20, short = "Lose 20 HP", text = "Take 20 damage total", cond = notEMS }, - { rank = { 3, 4 }, prompt = 'timedmg_time', target = 2, short = "Take Time Dmg 2x", text = "Take time damage 2 times", cond = F6 }, - { rank = { 5, 6 }, prompt = 'timedmg_time', target = 4, short = "Take Time Dmg 4x", text = "Take time damage 4 times", cond = F6 }, - { rank = { 4, 6 }, prompt = 'keep_health_safe', target = 8, short = "Safe HP 8s", text = "Keep HP safe\nfor 8 seconds", cond = F6 }, - { rank = { 4, 5 }, prompt = 'keep_health_danger', target = 3, short = "Critical HP 3s", text = "Keep HP critical\nfor 3 seconds", cond = notEMSorF6 }, - { rank = { 2, 5 }, prompt = 'keep_no_mouse', target = 4, short = "No mouse 4s", text = "Don't use the mouse\nfor 4 seconds", cond = f5 }, - { rank = { 2, 4 }, prompt = 'keep_no_commit', target = 6, short = "No commit 6s", text = "Don't commit\nfor 6 seconds", cond = notRGVandEDP }, - { rank = { 3, 6 }, prompt = 'keep_no_cancel', target = 8, short = "No cancel 8s", text = "Don't cancel\nfor 8 seconds" }, - { rank = { 2, 5 }, prompt = 'keep_no_keyboard', target = 10, short = "No keyboard 10s", text = "Don't use the keyboard\nfor 10 seconds", cond = F6 }, - { rank = { 3, 5 }, prompt = 'keep_no_perfect', target = 12, short = "No perfect 12s", text = "Have no perfect\npasses for 12 seconds", cond = notENH }, - { rank = { 4, 6 }, prompt = 'keep_no_imperfect', target = 14, short = "No imperfect 14s", text = "Have no imperfect\npasses for 14 seconds", cond = F6 }, - { rank = { 3, 5 }, prompt = 'keep_no_reset', target = 16, short = "No reset 16s", text = "Don't reset\nfor 16 seconds" }, -} -for i = 1, #RevivePrompts do RevivePrompts[i]._prompt = RevivePrompts[i].prompt end - -BadgeData = { - [0] = { - prio = 1e99, - name = "---", - desc = "???", - }, - { - id = 'champion', - name = "Clicker Champion", - desc = "Attain 25k CR", - }, - { - id = 'mastery_1', - name = "Mastery", - desc = "Reached F10 with all single upright mods", - }, - { - id = 'speedrun_1', - name = "Speedrunner", - desc = "Finished a speedrun with all single upright mods", - }, - { - id = 'mastery_2', - name = "Subjugation", - desc = "Reached F10 with all single reversed mods", - }, - { - id = 'speedrun_2', - name = "Omnipotence", - desc = "Finished a speedrun with all single reversed mods", - }, - { - id = 'subluminal', - name = "Sub-luminal", - desc = "Reached F10 in under 76.2s (max CR from Best Speedrun)", - }, - { - id = 'superluminal', - name = "Superluminal", - desc = "Reached F10 in under 42s", - }, - { - id = 'fomg', - name = "Interstellar", - desc = "Reached 6200m (max CR from Best Altitude)", - }, - { - id = 'fepsilon', - name = "Intergalactic", - desc = "Reached 12600m", - }, - { - id = 'true_expert', - name = "True Expert", - desc = "Finished a speedrun with rEX & Close Card", - }, - { - id = 'true_master', - name = "True Master", - desc = "Finished a speedrun with rGV & Nightcore", - }, - { - id = 'true_strength', - name = "True Strength", - desc = "Finished a speedrun with rVL & Fast Leak", - }, - { - id = 'true_invis', - name = "True Invisible", - desc = "Finished a speedrun with rIN & Invisible Card", - }, - { - id = 'true_couple', - name = "True Couple", - desc = "Finished a speedrun with rDP & Invisible UI", - }, - { - id = 'universal_gravitation', - name = "Universal Gravitation", - desc = "Reached F10 but finished at negative altitude", - }, - { - id = 'rDP_meta', - name = "Mechanical Heartbreaker", - desc = "Abused the rDP mod to stay alive over 10 minutes", - }, - { - id = 'sc_cap', - name = "Surge Protector", - desc = "Reached the B2B cap", - }, - { - id = 'exceed_dev_half', - name = "Apprentice", - desc = "Have a better score than Dev on 26% achievements", - }, - { - id = 'exceed_dev', - name = "Successor", - desc = "Have a better score than Dev on 62% achievements", - }, -} -for i = 1, #BadgeData do - local bd = BadgeData[i] - bd.prio = i - BadgeData[bd.id] = bd -end - -DevScore = {lovers_promise=10598.95,hardcore_beginning=13.88,love_hotel=2.597011165,financially_responsible=5.898309714,unfair_battle=4.344901018,museum_heist=2.4841288230001,workaholic=2.3799148589999,human_experiment=2.733007991,thermal_anomaly=0.467,VL=11377.6,NH=10586.4,MS=6326.3,IN=10929.7,GV=10604.39,EX=8612.63,DP=10598.95,DH=9644.52,AS=18681.62,rVL=6036.9,rNH=6282.1,rMS=3982.7,rIN=5503.13,rGV=8520,rEX=2807.73,rDP=3980.74,rDH=4273.85,rAS=12983.4,ultra_dash=0.496,perfect_speedrun=23.747579831,the_perfectionist=8310.52,cruise_control=23,dazed=16,drag_racing=29,space_race=209,fickle_fuel=851.3,the_spike_of_all_time_plus=498,blight=7733.35,desolation=6284.45,havoc=3656.14,pandemonium=3481.3,inferno=2875.1,purgatory=1840,perdition=1624.7,cataclysm=1395.49,annihilation=777.19,armageddon=423.31,abyss=196.02,cut_off=0,worn_out=0,the_harbinger=0,final_defiance=0,speedrun_speedrunning=0,abyss_weaver=0,royal_resistance=0,lovers_stand=0,romantic_homicide=0,benevolent_ambition=0,blazing_speed=0,dusty_memories=0,its_kinda_rare=0,fruitless_effort=0,false_god=0,respectful=0,zenith_relocation=0,intended_glitch=0,lucky_coincidence=0,zenith_traveler=0,dark_force=0,return_to_the_light=true,smooth_dismount=0,clicker=1138498,identity=0,contender=10237,elegance=441374,garbage_offensive=2229561,tower_climber=6616232.5,tower_regular=31770,speed_player=6709,plonk=148.99,zenith_explorer=10666.27,zenith_explorer_plus=18681.62,clicker_speedrun=15.466656532,naga_eyes=26.456631063,supercharged=288,supercharged_plus=447,multitasker=61866.8,effective=41446.887071386,zenith_speedrun=48.891,zenith_speedrun_plus=28.87,zenith_challenger=97361.9,divine_challenger=54370.4,zenith_speedrunner=480.712,divine_speedrunner=691.846,the_spike_of_all_time=437,the_spike_of_all_time_minus=192,clock_out=873,vip_list=125,GVIN=9358.41,ASNH=14508.3,DPEX=5417.82,GVNH=8373.29,DHMSNH=7020.5,DHEXNH=6784.1,DHEXMSVL=2766.57,ASEXVL=4432.7,swamp_water_lite=4878.84,swamp_water=2985.03,rGVrIN=6076.5,EXNHrAS=5891.7,INrASrDHrNH=2711.9,DHEXrGV=6096.52,EXGVNHrMS=2860.57,ASDPGVrMSrNH=2005.6,DHrEXrVL=1664.66,ASGVrDPrMS=1853.87,NHVLrDPrGV=2178.42,VLrEXrIN=1688.17,rDPrEX=2279.1,INMSrDHrEX=1244.64,ASMSrDHrIN=848.9,swamp_water_lite_plus=4878.84,swamp_water_plus=2714.92,talentless=7817.15,quest_rationing=631.02,the_responsible_one=18,the_unreliable_one=14,the_responsible_one_plus=144,guardian_angel=6061.19,carried=5528.27,level_19_cap=7207.94,the_escape_artist=132,the_artist_trinity=503.8,fel_magic=107,empurple=2919.81,autoplay_is_awesome=1658.4,spotless=2916.6,a_mutual_agreement=3620.9,the_cheaters=1786.5,overprotection=1986.85,clutch_main=191,sunk_cost=4278.1,wax_wings=2412.74,the_masterful_juggler=122,the_oblivious_artist=172,zero_to_sixty=5.4,speed_bonus=10,arrogance=772.74,scarcity_mindset=57,detail_oriented=0,psychokinesis=1692,divine_rejection=1649.9,moon_struck=0, - --deleted MrZ score - patience_is_a_virtue=2627.37, --- Trevor Smithy Dev scores - --Easy Mode (v1.0) (No CR) - programmer_gamer=42909.0,one_of_mine=26856.9,ggbw=69085.8,perfect_speedrun_plus=361.02,perfectly_balanced=10783.0,peasant_revolution=15511.8,holy_ascention=4814.9,stabilized_entropy=3115.4,restrained_collapse=17205.3,restored_volition=8606.7,disproven_blasphemy=5223.9,solved_paradox=4103.1,demystified_grimoire=17952.5,restored_eden=2650.3,your_too_fast=187, - --Easy Mods (v1.1) (No CR) - eEX=2405.8,eNH=2921.1,eMS=2805.6,eGV=3584.5,eVL=6687.3,eDH=14814.9,eIN=6097.8,eAS=22177.6,eDP=4751.4, - --Uneasy Easy Mods (v1.1) (No CR) - ueEX=255.55,ueEXeNH=273.50,ueEXeMS=269.57,ueEXeGV=241.6,ueEXeVL=206.59,ueEXeDH=357.59,ueEXeIN=240.77,ueEXeAS=130.82,ueEXeDP=262.65, - --Easy Mode - Special (v1.1) (No CR) - emperor_development=13.23,quest_feast=281.00,best_friends=101,humble_pupil=5.67,shameless_cashgrab=130,overweight_gamer=69,clean_gamer=319,clean_break=312,professional_cleaner=100,rold_smythy=520, -} --- Trevor Smithy Placeholder Dev Scores -DevScore["-3"] = 26000 -DevScore["-4"] = 26000*2 -DevScore["-5"] = 26000*3 -DevScore["-6"] = 26000*4 -DevScore["-7"] = 26000*5 -DevScore["-8"] = 26000*6 -DevScore["-9"] = 26000*7 - -DevScore.contender = 6200 -DevScore.clicker = 620e3 -DevScore.elegance = 260e3 -DevScore.garbage_offensive = 1260e3 -DevScore.tower_climber = 4200e3 -DevScore.tower_regular = 2e4 -DevScore.speed_player = 2600 -DevScore.clock_out = 420 -DevScore.vip_list = 42 - -LifeLeakMessages = { - {time = 30, text = "YOU FEEL THE IMPENDING DOOM", desc = "30 Seconds Remain", duration = 12}, - {time = 15, text = "DIE!", desc = "15 Seconds Remain", duration = 4}, - {time = 10, text = "DIE!", desc = "10 Seconds Remain", duration = 0.5}, - {time = 9, text = "DIE!", desc = "9 Seconds Remain", duration = 0.5}, - {time = 8, text = "DIE!", desc = "8 Seconds Remain", duration = 0.5}, - {time = 7, text = "DIE!", desc = "7 Seconds Remain", duration = 0.5}, - {time = 6, text = "DIE!", desc = "6 Seconds Remain", duration = 0.5}, - {time = 5, text = "DIE!", desc = "5 Seconds Remain", duration = 0.5}, - {time = 4, text = "DIE!", desc = "4 Seconds Remain", duration = 0.5}, - {time = 3, text = "DIE!", desc = "3 Seconds Remain", duration = 0.5}, - {time = 2, text = "DIE!", desc = "2 Seconds Remain", duration = 0.5}, - {time = 1, text = "DIE!", desc = "1 Seconds Remain", duration = 0.5}, - {time = 0.1, text = "MWAHAHAHA!", desc = "CEASE!", duration = 26, color = 'lR'}, - {time = -1}, -} diff --git a/module/initialize.lua b/module/initialize.lua index e55a5fb9..2c1f7260 100644 --- a/module/initialize.lua +++ b/module/initialize.lua @@ -262,6 +262,17 @@ function Initialize(save) MSG('dark', "Save fixed to correctly be for mod:'easyMode'") SaveStat() end + if STAT.easyModeClicker then + if STAT.clicker and STAT.unlockAll then + STAT.greenClicker = true + STAT.easyModeClicker = false + else + STAT.easyModeClicker = false + MSG('dark', "Illegitimate Easy Mode Clicker status revoked!") + end + SaveStat() + end + GAME.refreshLockState() GAME.refreshPBText() love.window.setFullscreen(STAT.fullscreen) diff --git a/module/shader.lua b/module/shader.lua index 9f29657a..d22684c4 100644 --- a/module/shader.lua +++ b/module/shader.lua @@ -1,21 +1,23 @@ -SHADER = {} +local sd = {} -SHADER.coloring = GC.newShader [[ +sd.coloring = GC.newShader [[ vec4 effect(vec4 color, sampler2D tex, vec2 texCoord, vec2 scrCoord) { return vec4(color.rgb, color.a * texture2D(tex, texCoord).a); } ]] -SHADER.throb = GC.newShader [[ +sd.throb = GC.newShader [[ vec4 effect(vec4 color, sampler2D tex, vec2 texCoord, vec2 scrCoord) { vec4 t = texture2D(tex, texCoord); return vec4(1., 0., 0., (1.-step(t.a, .999)) * color.a * (1. - t.r) * (1. - length(texCoord.xy - .5))); } ]] -SHADER.swapRG = GC.newShader [[ +sd.swapRG = GC.newShader [[ vec4 effect(vec4 color, sampler2D tex, vec2 texCoord, vec2 scrCoord) { vec4 t = texture2D(tex, texCoord); return vec4(t.grb, color.a * t.a); } ]] + +return sd diff --git a/module/scene/about.lua b/scene/about.lua similarity index 74% rename from module/scene/about.lua rename to scene/about.lua index 48538ce3..97330717 100644 --- a/module/scene/about.lua +++ b/scene/about.lua @@ -167,15 +167,12 @@ local function specialDevCommentaryCheck(cID, uneasy) end local timer -local devCommentary, devCommentaryLink, link function scene.load() MSG.clear() timer = 0 SetMouseVisible(true) scroll, scroll1 = 0, -620 - devCommentary = require('module.devCommentary') - devCommentaryLink = require('module.devCommentaryLink') local setStr = table.concat(TABLE.sort(GAME.getHand(true))) local cID = table.concat(GAME.getHand(true), " ") if GAME.anyUltra then @@ -189,18 +186,18 @@ function scene.load() uneasy = true end local text - if devCommentary[cID] and specialDevCommentaryCheck(cID, uneasy) then + if DevCommentary[cID] and specialDevCommentaryCheck(cID, uneasy) then if BEST.highScore[setStr] < Floors[9].top then - text = devCommentary.notFinished + text = DevCommentary.notFinished else - text = devCommentary[cID] - link = devCommentaryLink[cID] + text = DevCommentary[cID] + link = DevCommentaryLink[cID] end else if cID:count('e') > 0 then - text = devCommentary.noCommentTS + text = DevCommentary.noCommentTS else - text = devCommentary.noComment + text = DevCommentary.noComment end end DevNoteText:setf(text:repD(STAT.uid), 2000, 'center') @@ -208,6 +205,7 @@ end function scene.unload() link = nil + scene.widgetList.link.sound_hover = '' end function scene.mouseMove(_, _, _, dy) @@ -226,7 +224,7 @@ function scene.keyDown(key, isRep) SFX.play('menuclick') SCN.back('none') end - ZENITHA._cursor.active=true + ZENITHA._cursor.active = true return true end @@ -268,7 +266,9 @@ function scene.draw() gc_setColor(1, 1, 1) local icon, kx, ky - local smithyMode = GAME.mod.EX == -1 and GAME.mod.NH == 0 and GAME.mod.MS == 0 and GAME.mod.GV == 0 and GAME.mod.VL == -1 and GAME.mod.DH == 0 and GAME.mod.IN == 0 and GAME.mod.AS == -1 and GAME.mod.DP == 0 + local smithyMode = TABLE.equal(GAME.getHand(true),{'eEX','eVL','eAS'}) + or TABLE.equal(GAME.getHand(true),{'eEX','NH','MS','GV','eVL','DH','IN','eAS','DP'}) + or TABLE.equal(GAME.getHand(true),{'eEX','rNH','rMS','rGV','eVL','rDH','rIN','eAS','rDP'}) if GAME.mod.EX > 0 then icon = TEXTURE.logo_old kx, ky = .5, .5 @@ -288,12 +288,20 @@ function scene.draw() gc_draw(AboutText) if link then gc_setColor(0, 0.62, 1) + scene.widgetList.link.sound_hover = 'menutap' + end + if smithyMode and (GAME.anyRev or URM) then + gc_setColor(1, 0.62, 0.62) end gc_draw(DevNoteText, 0, 285 - DevNoteText:getHeight() * (.68 / 2), 0, .68, .68, 1000, 0) gc_setColor(1, 1, 1, .2) if smithyMode then - gc_setColor(0, 1, 0, .2) + if URM or GAME.anyRev then + gc_setColor(1, 0, 0, .2) + else + gc_setColor(0, 1, 0, .2) + end end gc_setLineWidth(0.5) for i = 1, #lines do @@ -315,15 +323,33 @@ function scene.draw() -- Top bar & title gc_replaceTransform(SCR.xOy_u) gc_setColor(clr.D) - if smithyMode then gc_setColor(COLOR.dG) end + if smithyMode then + if URM or GAME.anyRev then + gc_setColor(COLOR.dR) + else + gc_setColor(COLOR.dG) + end + end gc_rectangle('fill', -1300, 0, 2600, 70) gc_setColor(clr.L) - if smithyMode then gc_setColor(COLOR.LG) end + if smithyMode then + if URM or GAME.anyRev then + gc_setColor(COLOR.LR) + else + gc_setColor(COLOR.LG) + end + end gc_setAlpha(.626) gc_rectangle('fill', -1300, 70, 2600, 3) gc_replaceTransform(SCR.xOy_ul) gc_setColor(clr.L) - if smithyMode then gc_setColor(COLOR.LG) end + if smithyMode then + if URM or GAME.anyRev then + gc_setColor(COLOR.LR) + else + gc_setColor(COLOR.LG) + end + end FONT.set(50) if GAME.anyRev then gc_print("ABOUT", 15, 68, 0, 1, -1) @@ -334,19 +360,38 @@ function scene.draw() -- Bottom bar & thanks gc_replaceTransform(SCR.xOy_d) gc_setColor(clr.D) - if smithyMode then gc_setColor(COLOR.dG) end + if smithyMode then + if URM or GAME.anyRev then + gc_setColor(COLOR.dR) + else + gc_setColor(COLOR.dG) + end + end gc_rectangle('fill', -1300, 0, 2600, -50) gc_setColor(clr.L) - if smithyMode then gc_setColor(COLOR.LG) end + if smithyMode then + if URM or GAME.anyRev then + gc_setColor(COLOR.LR) + else + gc_setColor(COLOR.LG) + end + end gc_setAlpha(.626) gc_rectangle('fill', -1300, -50, 2600, -3) gc_replaceTransform(SCR.xOy_dl) gc_setColor(clr.L) - if smithyMode then gc_setColor(COLOR.LG) end + if smithyMode then + if URM or GAME.anyRev then + gc_setColor(COLOR.LR) + else + gc_setColor(COLOR.LG) + end + end FONT.set(30) - gc_print("THANK YOU FOR PLAYING ZENITH CLICKER!", 15, -45, 0, .85, 1) + gc_print("THANK YOU FOR PLAYING ZENITH CLICKER" .. (smithyMode and " EASY MODE" or "") .. (smithyMode and (URM or GAME.anyRev) and "?" or "!"), 15, -45, 0, .85, 1) end +local githubX, discordX, bottomY, bottomW, bottomH = -40, -115, 0, 60, 120 scene.widgetList = { WIDGET.new { name = 'back', type = 'button', @@ -368,6 +413,46 @@ scene.widgetList = { end end, }, + WIDGET.new { + type = 'button', + pos = {1, 1}, x = githubX, y = bottomY, w = bottomW, h = bottomH, + color = {.15, .15, .15}, + sound_hover = 'menutap', + imageColor = { .58, .58, .58 }, + alignY = 'top', + marginY = 10, + image = TEXTURE.github, + onClick = function() + SFX.play('menuconfirm') + love.system.openURL("https://github.com/trevor-smithy/ZenithClickerEasyMode") + end, + }, + --[[WIDGET.new { + type = 'image', + pos = {1, 1}, x = githubX, y = bottomY-30, w = bottomW-20, h = bottomW-20, + imageColor = { .58, .58, .58 }, + image = love.graphics.newImage('/assets/GitHub_Invertocat_White.png'), + },]] + WIDGET.new { + type = 'button', + pos = {1, 1}, x = discordX, y = bottomY, w = bottomW, h = bottomH, + color = {.15, .15, .15}, + sound_hover = 'menutap', + imageColor = { .58, .58, .58 }, + alignY = 'top', + marginY = 15, + image = TEXTURE.discord, + onClick = function() + SFX.play('menuconfirm') + love.system.openURL("https://discord.gg/thqhzSn72j") + end, + }, + --[[WIDGET.new { + type = 'image', -- 526 x 400 + pos = {1, 1}, x = discordX, y = bottomY-30, w = bottomW-20, h = bottomW-30, + imageColor = { .58, .58, .58 }, + image = love.graphics.newImage('/assets/Discord-Symbol-White.png'), + },]] } return scene diff --git a/module/scene/achv.lua b/scene/achv.lua similarity index 74% rename from module/scene/achv.lua rename to scene/achv.lua index cb5b8d94..16ae3146 100644 --- a/module/scene/achv.lua +++ b/scene/achv.lua @@ -90,7 +90,7 @@ function RefreshAchvList(canShuffle) wreath = r >= 5 and floor(MATH.clampInterpolate(0, 0, .9999, 6, r % 1)) or 0 if A.type ~= 'issued' then overallProgress.rank[rank] = overallProgress.rank[rank] + 1 - if wreath > 0 then overallProgress.wreath[wreath] = overallProgress.wreath[wreath] + 1 end + overallProgress.wreath[wreath] = overallProgress.wreath[wreath] + 1 if A.type == 'competitive' then overallProgress.ptGet = overallProgress.ptGet + floor(rank) overallProgress.ptAll = overallProgress.ptAll + 5 @@ -219,6 +219,7 @@ function RefreshAchvList(canShuffle) end end end + print(TABLE.dump(overallProgress)) end local function submit(id, score, silent, realSilent) @@ -368,7 +369,22 @@ local function refreshAchivement() RefreshAchvList() end +local achvIconInit function scene.load() + if not achvIconInit then + achvIconInit = true + TEXTURE.achievement.icons = GC.initCanvas(4096, 2048, function() + GC.setShader(GC.newShader [[ + vec4 effect(vec4 color, sampler2D tex, vec2 texCoord, vec2 scrCoord) { + vec4 t = texture2D(tex, texCoord); + return vec4(1., 1., 1., (t.r+t.g+t.b)/3.); + } + ]]) + GC.draw(TEXTURE.achievement.icons) + GC.setShader() + TEXTURE.achievement.icons:release() + end) + end SetMouseVisible(true) if GAME.anyRev ~= colorRev then colorRev = GAME.anyRev @@ -398,25 +414,13 @@ function scene.unload() end function scene.mouseMove(_, _, _, dy) - local mvl - if M.VL == -1 then - mvl = 1 - else - mvl = M.VL - end if love.mouse.isDown(1, 2) then - scroll = MATH.clamp(scroll - dy * (1 + mvl), 0, maxScroll) + scroll = MATH.clamp(scroll - dy * (1 + MATH.abs(M.VL)), 0, maxScroll) end end function scene.touchMove(_, _, _, dy) - local mvl - if M.VL == -1 then - mvl = 1 - else - mvl = M.VL - end - scroll = MATH.clamp(scroll - dy * (1 + mvl), 0, maxScroll) + scroll = MATH.clamp(scroll - dy * (1 + MATH.abs(M.VL)), 0, maxScroll) end function scene.keyDown(key, isRep) @@ -430,13 +434,7 @@ function scene.keyDown(key, isRep) end function scene.wheelMove(_, dy) - local mvl - if M.VL == -1 then - mvl = 1 - else - mvl = M.VL - end - scroll = MATH.clamp(scroll - dy * 100 * (1 + mvl), 0, maxScroll) + scroll = MATH.clamp(scroll - dy * 100 * (1 + MATH.abs(M.VL)), 0, maxScroll) end function scene.update(dt) @@ -565,145 +563,145 @@ function scene.draw() gc_ucs_move(i % 2 == 1 and -626 or 26, floor((i - 1) / 2) * 140) end if a.id ~= '' then - -- Bottom rectangle - if hyper then - if overallProgress.countStart == 6 then - gc_setColor(COLOR.rainbow_dark(i / 2.6 - t * 2.6, .42)) - elseif a.type == 'competitive' and (notAllRank5 and a.rank or a.wreath) == overallProgress.countStart then - gc_setColor(.26 + .1 * sin(t * 2.6 + ceil(i / 2) * 1.2), 0, 0, .626) + -- Bottom rectangle + if hyper then + if overallProgress.countStart == 6 then + gc_setColor(COLOR.rainbow_dark(i / 2.6 - t * 2.6, .42)) + elseif a.type == 'competitive' and (notAllRank5 and a.rank or a.wreath) == overallProgress.countStart then + gc_setColor(.26 + .1 * sin(t * 2.6 + ceil(i / 2) * 1.2), 0, 0, .626) + else + gc_setColor(0, 0, 0, .626) + end else gc_setColor(0, 0, 0, .626) end - else - gc_setColor(0, 0, 0, .626) - end - gc_rectangle('fill', 0, 0, 600, 130) - - -- Flashing notice - if AchvNotice[a.id] then - gc_setColor(1, 1, 1, .1 + .1 * sin(t * (6.2 + M.VL * 4.2))) gc_rectangle('fill', 0, 0, 600, 130) - end - -- Badge base - gc_setColor(1, 1, 1) - gc_mDraw(texture.frame[a.rank], 65, 65, 0, .42) - - -- Progress ring - if a.progress > 0 then - if colorRev then gc_setColor(COLOR.lR) end - if a.progress < 1 then - gc_stc_setComp() - gc_stc_arc('pie', 65, 65, - ea + -2.0944, - ea + -2.0944 + ka * a.progress, - 63, 26) - gc_stc_arc('pie', 65, 65, - ea + 1.0472, - ea + 1.0472 + ka * a.progress, - 63, 26) + -- Flashing notice + if AchvNotice[a.id] then + gc_setColor(1, 1, 1, .1 + .1 * sin(t * (6.2 + M.VL * 4.2))) + gc_rectangle('fill', 0, 0, 600, 130) end - gc_mDraw(texture.ring, 65, 65, 0, .42) - gc_mDraw(texture.ring, 65, 65, 3.1416, .42) - gc_stc_stop() - end - - -- Glint - if a.rank >= 1 then - gc_setBlendMode('add') - gc_setColor(1, 1, 1, .1 + .2 * sin(i * 2.6 + t * 2.1)) - gc_mDraw(texture.glint_1, 65, 65, 0, .42) - gc_setColor(1, 1, 1, .1 + .2 * sin(i * 2.6 + t * 2.3)) - gc_mDraw(texture.glint_2, 65, 65, 0, .42) - gc_setColor(1, 1, 1, .1 + .2 * sin(i * 2.6 + t * 2.6)) - gc_mDraw(texture.glint_3, 65, 65, 0, .42) - gc_setBlendMode('alpha') - end - -- Icon - local slice = texture.iconQuad[a.id] - if slice and (a.rank > 0 or a.progress > 0) then - if a.rank > 0 then - gc_setColor(0, 0, 0, .872) - else - gc_setColor(1, 1, 1, .26) + -- Badge base + gc_setColor(1, 1, 1) + gc_mDraw(texture.frame[a.rank], 65, 65, 0, .42) + + -- Progress ring + if a.progress > 0 then + if colorRev then gc_setColor(COLOR.lR) end + if a.progress < 1 then + gc_stc_setComp() + gc_stc_arc('pie', 65, 65, + ea + -2.0944, + ea + -2.0944 + ka * a.progress, + 63, 26) + gc_stc_arc('pie', 65, 65, + ea + 1.0472, + ea + 1.0472 + ka * a.progress, + 63, 26) + end + gc_mDraw(texture.ring, 65, 65, 0, .42) + gc_mDraw(texture.ring, 65, 65, 3.1416, .42) + gc_stc_stop() end - if a.id == "-3" or a.id == "-4"or a.id == "-5" or a.id == "-6" or a.id == "-7" or a.id == "-8" or a.id == "-9" then - gc_mDrawQ(texture.icons, slice or texture.iconQuad._undef, 65, 65, math.pi, .24) - else - gc_mDrawQ(texture.icons, slice or texture.iconQuad._undef, 65, 65, 0, .24) + + -- Glint + if a.rank >= 1 then + gc_setBlendMode('add') + gc_setColor(1, 1, 1, .1 + .2 * sin(i * 2.6 + t * 2.1)) + gc_mDraw(texture.glint_1, 65, 65, 0, .42) + gc_setColor(1, 1, 1, .1 + .2 * sin(i * 2.6 + t * 2.3)) + gc_mDraw(texture.glint_2, 65, 65, 0, .42) + gc_setColor(1, 1, 1, .1 + .2 * sin(i * 2.6 + t * 2.6)) + gc_mDraw(texture.glint_3, 65, 65, 0, .42) + gc_setBlendMode('alpha') end - end - -- Wreath - if a.wreath > 0 then - gc_setColor(1, 1, 1) - gc_mDraw(texture.wreath[a.wreath], 65, 65, 0, .42) - end + -- Icon + local slice = texture.iconQuad[a.id] + if slice and (a.rank > 0 or a.progress > 0) then + if a.rank > 0 then + gc_setColor(0, 0, 0, .872) + else + gc_setColor(1, 1, 1, .26) + end + if a.id == "-3" or a.id == "-4"or a.id == "-5" or a.id == "-6" or a.id == "-7" or a.id == "-8" or a.id == "-9" then + gc_mDrawQ(texture.icons, slice or texture.iconQuad._undef, 65, 65, math.pi, .24) + else + gc_mDrawQ(texture.icons, slice or texture.iconQuad._undef, 65, 65, 0, .24) + end + end - -- Credit - gc_setColor(colorRev and COLOR.dR or COLOR.LD) - gc_printf(A.credit, 65, 113, 130 / .37, 'center', 0, .37, .37, 65 / .37) + -- Wreath + if a.wreath > 0 then + gc_setColor(1, 1, 1) + gc_mDraw(texture.wreath[a.wreath], 65, 65, 0, .42) + end - -- Tags - local x = 600 - 15 - if A.ex then - gc_mDraw(texture.extra, x, 15, 0, .42) - x = x - 30 - end - if a.hidden then - gc_mDraw(texture.hidden, x, 15, 0, .2) - x = x - 30 - end - if A.type == 'event' then - gc_mDraw(texture.event, x, 15, 0, .2) - x = x - 30 - end - if A.type == 'competitive' then - gc_mDraw(texture.competitive, x, 15, 0, .2) - x = x - 30 - else - gc_mDraw(texture.unranked, x, 15, 0, .2) - x = x - 30 - end + -- Credit + gc_setColor(colorRev and COLOR.dR or COLOR.LD) + gc_printf(A.credit, 65, 113, 130 / .37, 'center', 0, .37, .37, 65 / .37) - -- Dev - if a.overDev then - if a.id == 'programmer_gamer' or a.id == 'one_of_mine' or a.id == 'ggbw' or a.id == 'perfect_speedrun_plus' or a.id == 'perfectly_balanced' or a.id == 'peasant_revolution' - or a.id == 'holy_ascention' or a.id == 'stabilized_entropy' or a.id == 'restrained_collapse' or a.id == 'restored_volition' or a.id == 'disproven_blasphemy' - or a.id == 'solved_paradox' or a.id == 'demystified_grimoire' or a.id == 'restored_eden' or a.id == 'your_too_fast' - or a.id == 'eEX' or a.id == 'eNH' or a.id == 'eMS' or a.id == 'eGV' or a.id == 'eVL' or a.id == 'eDH' or a.id == 'eIN' or a.id == 'eAS' or a.id == 'eDP' - or a.id == 'emperor_development' or a.id == 'quest_feast' or a.id == 'best_friends' or a.id == 'humble_pupil' or a.id == 'shameless_cashgrab' - or a.id == 'overweight_gamer' or a.id == 'clean_gamer' or a.id == 'clean_break' or a.id == 'professional_cleaner' or a.id == 'rold_smythy' - or a.id == "-3" or a.id == "-4"or a.id == "-5" or a.id == "-6" or a.id == "-7" or a.id == "-8" or a.id == "-9" then - gc_setColor(0, 1, 0, .1) - elseif a.id == 'ueEX' or a.id == 'ueEXeNH' or a.id == 'ueEXeMS' or a.id == 'ueEXeGV' or a.id == 'ueEXeVL' or a.id == 'ueEXeDH' or a.id == 'ueEXeIN' or a.id == 'ueEXeAS' or a.id == 'ueEXeDP' then - gc_setColor(1, 0, 0, .2) + -- Tags + local x = 600 - 15 + if A.ex then + gc_mDraw(texture.extra, x, 15, 0, .42) + x = x - 30 + end + if a.hidden then + gc_mDraw(texture.hidden, x, 15, 0, .2) + x = x - 30 + end + if A.type == 'event' then + gc_mDraw(texture.event, x, 15, 0, .2) + x = x - 30 + end + if A.type == 'competitive' then + gc_mDraw(texture.competitive, x, 15, 0, .2) + x = x - 30 else - gc_setColor(1, 1, 1, .1) + gc_mDraw(texture.unranked, x, 15, 0, .2) + x = x - 30 end - gc_mDraw(texture.overDev, 565, 75, 0, .26) - end - -- Texts - gc_setColor(AchvData[a.rank].fg2) - gc_print(a.score, 130, 35, 0) - gc_setColor(colorRev and COLOR.LR or COLOR.L) - gc_print(a.name, 130, 7, 0, .7) - if a.descWidth < 1050 then - gc_print(a.desc, 130, 77, 0, min(400 / a.descWidth, .4), .4) - else - gc_printf(a.desc, 130, 73, 1050, 'left', 0, .4) - end - gc_setColor(colorRev and COLOR.dR or COLOR.LD) - gc_print(A.quote, 130, a.descWidth <= 1050 and 98 or 103, 0, .42) + -- Dev + if a.overDev then + if a.id == 'programmer_gamer' or a.id == 'one_of_mine' or a.id == 'ggbw' or a.id == 'perfect_speedrun_plus' or a.id == 'perfectly_balanced' or a.id == 'peasant_revolution' + or a.id == 'holy_ascention' or a.id == 'stabilized_entropy' or a.id == 'restrained_collapse' or a.id == 'restored_volition' or a.id == 'disproven_blasphemy' + or a.id == 'solved_paradox' or a.id == 'demystified_grimoire' or a.id == 'restored_eden' or a.id == 'your_too_fast' + or a.id == 'eEX' or a.id == 'eNH' or a.id == 'eMS' or a.id == 'eGV' or a.id == 'eVL' or a.id == 'eDH' or a.id == 'eIN' or a.id == 'eAS' or a.id == 'eDP' + or a.id == 'emperor_development' or a.id == 'quest_feast' or a.id == 'best_friends' or a.id == 'humble_pupil' or a.id == 'shameless_cashgrab' + or a.id == 'overweight_gamer' or a.id == 'clean_gamer' or a.id == 'clean_break' or a.id == 'professional_cleaner' or a.id == 'rold_smythy' + or a.id == "-3" or a.id == "-4"or a.id == "-5" or a.id == "-6" or a.id == "-7" or a.id == "-8" or a.id == "-9" then + gc_setColor(0, 1, 0, .1) + elseif a.id == 'ueEX' or a.id == 'ueEXeNH' or a.id == 'ueEXeMS' or a.id == 'ueEXeGV' or a.id == 'ueEXeVL' or a.id == 'ueEXeDH' or a.id == 'ueEXeIN' or a.id == 'ueEXeAS' or a.id == 'ueEXeDP' then + gc_setColor(1, 0, 0, .2) + else + gc_setColor(1, 1, 1, .1) + end + gc_mDraw(texture.overDev, 565, 75, 0, .26) + end - -- Hidden covering - if M.IN > 0 then - gc_setColor(clr.D) - gc_setAlpha(M.IN * (.3 + .1 * sin(ceil(i / 2) * 1.2 - t * 2.6))) - gc_rectangle('fill', 0, 0, 600, 130) - end + -- Texts + gc_setColor(AchvData[a.rank].fg2) + gc_print(a.score, 130, 35, 0) + gc_setColor(colorRev and COLOR.LR or COLOR.L) + gc_print(a.name, 130, 7, 0, .7) + if a.descWidth < 1050 then + gc_print(a.desc, 130, 77, 0, min(400 / a.descWidth, .4), .4) + else + gc_printf(a.desc, 130, 73, 1050, 'left', 0, .4) + end + gc_setColor(colorRev and COLOR.dR or COLOR.LD) + gc_print(A.quote, 130, a.descWidth <= 1050 and 98 or 103, 0, .42) + + -- Hidden covering + if M.IN > 0 then + gc_setColor(clr.D) + gc_setAlpha(M.IN * (.3 + .1 * sin(ceil(i / 2) * 1.2 - t * 2.6))) + gc_rectangle('fill', 0, 0, 600, 130) + end end gc_ucs_back() end diff --git a/module/scene/conf.lua b/scene/conf.lua similarity index 99% rename from module/scene/conf.lua rename to scene/conf.lua index 50213b5c..9b321865 100644 --- a/module/scene/conf.lua +++ b/scene/conf.lua @@ -950,7 +950,8 @@ scene.widgetList = { if res1.mod == "A Fool's Mod" then modText = "The Creator thinks you're foolish for trying to use that here" elseif res1.mod == "evilvile" then modText = "The Creator wants nothing to do with something that evil" elseif res1.mod == "shimmer" then modText = "The Creator asks you to keep your sparkling water away from his creation" - elseif res1.mod == "unabstracted" then modText = "The Creator prefers his work abstract" end + elseif res1.mod == "unabstracted" then modText = "The Creator prefers his work abstract" + elseif res1.mod == "finalmixbeg" then modText = "The Creator rejects your chakras and magics" end MSG('dark', modText) SFX.play('staffwarning') return diff --git a/module/scene/ending.lua b/scene/ending.lua similarity index 99% rename from module/scene/ending.lua rename to scene/ending.lua index b7fbf334..3e03e2bb 100644 --- a/module/scene/ending.lua +++ b/scene/ending.lua @@ -1,6 +1,6 @@ ---@type Zenitha.Scene local scene = {} -local badTime = false +local badTime = nil EndText = GC.newText(FONT.get(70)) EndText2 = GC.newText(FONT.get(70), "ZENITH CLICKER!") @@ -202,7 +202,7 @@ function scene.unload() TEXTS.endHeight:set(badTime and "Thanks for playing my mod!" or "Thanks for playing!") if badTime then TEXTS.endFloor:set("WAH-BAAM!") end badTime = false - GAME.badTime = false + GAME.badTime = nil TASK.new(function() for i = 1, 100 do TASK.yieldT(.01) diff --git a/module/scene/joining.lua b/scene/joining.lua similarity index 92% rename from module/scene/joining.lua rename to scene/joining.lua index 5c7cd523..d4edd421 100644 --- a/module/scene/joining.lua +++ b/scene/joining.lua @@ -17,8 +17,8 @@ function scene.update(dt) if t1 <= 0 then TEXTS.load:set("GETTING READY TO SPECTATE...") BGM.setMaxSources(42) - BGM.load(FILE.load('module/bgm_data.lua', '-luaon')) - SFX.load('assets/sfx.ogg', FILE.load('module/sfx_data.lua', '-luaon')) + BGM.load(FILE.load('data/bgm.lua', '-luaon')) + SFX.load('assets/sfx.ogg', FILE.load('data/sfx.lua', '-luaon')) for i = 1, 9 do SFX.load('garbagewindup_'..i, 'assets/windup_'..i..'.ogg') end diff --git a/scene/placeholder.txt b/scene/placeholder.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/module/scene/records.lua b/scene/records.lua similarity index 97% rename from module/scene/records.lua rename to scene/records.lua index b8fe745c..93f8099b 100644 --- a/module/scene/records.lua +++ b/scene/records.lua @@ -205,8 +205,6 @@ local function query() -- mp check if not (set.mpComp == '>' and set.mp == -9 or set.mpComp == '<' and set.mp == 18) then - --local mp = (#setStr - (ultra and 1 or 0) + setStr:count('r')) / 2 - -- add each r, subtract each e twice (once to cancel, another to make negative), EX NH MS GV VL DH IN AS DP add two letters each so half them local mp = setStr:count('r') - setStr:count('e')*2 + setStr:count('[A-Z]')/2 if set.mpComp == '>' and mp < set.mp or @@ -328,25 +326,13 @@ function scene.unload() end function scene.mouseMove(_, _, _, dy) - local mvl - if M.VL == -1 then - mvl = 1 - else - mvl = M.VL - end if love.mouse.isDown(1, 2) then - scroll = clamp(scroll - dy * (1 + mvl), 0, maxScroll) + scroll = clamp(scroll - dy * (1 + MATH.abs(M.VL)), 0, maxScroll) end end function scene.touchMove(_, _, _, dy) - local mvl - if M.VL == -1 then - mvl = 1 - else - mvl = M.VL - end - scroll = clamp(scroll - dy * (1 + mvl), 0, maxScroll) + scroll = clamp(scroll - dy * (1 + MATH.abs(M.VL)), 0, maxScroll) end function scene.mouseClick(x, y, k) @@ -496,13 +482,7 @@ function scene.keyDown(key, isRep) end function scene.wheelMove(_, dy) - local mvl - if M.VL == -1 then - mvl = 1 - else - mvl = M.VL - end - scroll = clamp(scroll - dy * 100 * (1 + mvl), 0, maxScroll) + scroll = clamp(scroll - dy * 100 * (1 + MATH.abs(M.VL)), 0, maxScroll) end function scene.resize() diff --git a/module/scene/stat.lua b/scene/stat.lua similarity index 99% rename from module/scene/stat.lua rename to scene/stat.lua index 18b14a5d..188251b0 100644 --- a/module/scene/stat.lua +++ b/scene/stat.lua @@ -245,7 +245,7 @@ function RefreshProfile() for i = 0, clickerLV - 1 do GC.mDraw(TEXTURE.stat.clicker_star, 879 - i * 34, 182, 0, .626) end - if STAT.easyModeClicker then + if STAT.greenClicker then GC.setColor(0, 1, 0) GC.mDraw(TEXTURE.stat.clicker, 800 - clickerLV * 34, 182, 0, .626) end diff --git a/module/scene/tower.lua b/scene/tower.lua similarity index 96% rename from module/scene/tower.lua rename to scene/tower.lua index f7e56b3f..d1251bb1 100644 --- a/module/scene/tower.lua +++ b/scene/tower.lua @@ -10,9 +10,8 @@ local lerp, iLerp, cLerp, icLerp, lLerp = MATH.lerp, MATH.iLerp, MATH.cLerp, MAT local GAME = GAME local M = GAME.mod local MD = ModData -ShortCut = {} -local ShortCut = ShortCut -for i = 1, #MD.deck do ShortCut[i] = GC.newText(FONT.get(50)) end +CardHintText = {} +for i = 1, #MD.deck do CardHintText[i] = GC.newText(FONT.get(50)) end HoldingButtons = {} local HoldingButtons = HoldingButtons @@ -254,7 +253,17 @@ local function keyTrigger(key) if not GAME.playing then local hand = GAME.getHand(true) local revCount = table.concat(hand):count('r') - SFX.play('garbagewindup_' .. #hand-revCount, 1, 0, Tone(0)) + local pitch = M.GV < 0 and -6 or M.GV > 0 and (URM and M.GV == 2 and 3 or M.GV) or 0 + local uneasy = (URM and M.EX == -1 and M.NH < 2 and M.MS < 2 and M.GV < 2 and M.VL < 2 and M.DH < 2 and M.IN < 2 and M.AS < 2 and M.DP < 2) and not GAME.anyRev + if uneasy then + pitch = pitch + 0.25 + end + if GAME.slowmo then pitch = pitch - 12 end + if GAME.nightcore then pitch = pitch + 12 end + -- Trevor Smithy + if GAME.eslowmo then pitch = pitch - 6 end + if GAME.enightcore then pitch = pitch + 12 end + SFX.play('garbagewindup_' .. #hand-revCount, 1, 0, pitch) --SFX.play('allclear') else SFX.play('staffwarning') @@ -317,6 +326,7 @@ local function keyTrigger(key) GAME.invisUI = false GAME.invisCard = false GAME.closeCard = false + STAT.unlockAll = true local set = {} applyCombo(set) set.ultra = true @@ -328,7 +338,7 @@ local function keyTrigger(key) TABLE.insert(set, 'rDH') TABLE.insert(set, 'rIN') TABLE.insert(set, 'rAS') - TABLE.insert(set, 'rDP') + if ACHV.intended_glitch then TABLE.insert(set, 'rDP') end applyCombo(set) GAME.badTime = true GAME.badTimeStarted = false @@ -431,13 +441,13 @@ local function generateRandomCombo() local easy = TABLE.find(set, 'eEX') set.ultra = (math.random(20) > (easy and not anyRev and -5 or 0) + 15) and (easy or anyRev) --d20 else - local index = math.random(45, #ComboData.menu) + local index = math.random(47, #ComboData.menu) local comboSet = ComboData.menu[index].set local tempSet = STRING.split(comboSet, ' ') for i = 1, #tempSet do TABLE.insert(set, tempSet[i]) end - if index <= 54 then + if index <= 57 then set.ultra = true else local anyRev = TABLE.find(set, 'rEX') or TABLE.find(set, 'rNH') or TABLE.find(set, 'rMS') or TABLE.find(set, 'rGV') or TABLE.find(set, 'rVL') or TABLE.find(set, 'rDH') or TABLE.find(set, 'rIN') or TABLE.find(set, 'rAS') or TABLE.find(set, 'rDP') @@ -475,7 +485,7 @@ local function generateRandomCombo() end end end - if TABLE.equal(GAME.getHand(true),{'eEX','eVL','eAS'}) then + if TABLE.equal(set,{'eEX','eVL','eAS'}) then IssueAchv('biased') SFX.play(set.ultra and 'zenith_split_missed' or 'zenith_split_cleared') end @@ -493,7 +503,7 @@ function scene.load() end RevUnlocked = TABLE.countAll(GAME.completion, 0) < 9 or STAT.unlockAll - for i = 1, #MD.deck do ShortCut[i]:set(STAT.keybind[i]:upper()) end + for i = 1, #MD.deck do CardHintText[i]:set(STAT.keybind[i]:upper()) end GAME.refreshDailyChallengeText() TASK.unlock('sure_quit') @@ -503,6 +513,14 @@ function scene.load() applyCombo(PendingComboFromRecord) PendingComboFromRecord = nil end + if STAT.unlockAll and not ACHV.lazy_bastard then + IssueAchv('lazy_bastard', true) + MSG('achv_issued', { + AchvData[6].fg, "Lazy Bastard" .. "\n", + COLOR.dL, [[Unlock all mods by activating BAD TIME]] .. "\n", + COLOR.LD, "The secret way to get this achievement :D"}) + SFX.play('achievement_1', .7) + end end function scene.unload() @@ -556,7 +574,6 @@ function scene.mouseDown(x, y, k) GAME.nixPrompt('keep_no_mouse') GAME.noMouseOrSpin = false -- Trevor Smithy - --if getBtnPressed() > 1 + (URM and M.VL == 2 and 0 or floor(M.VL / 2)) then return true end if getBtnPressed() > 1 + (URM and M.VL == 2 and 0 or M.VL == -1 and 0 or floor(M.VL / 2)) then return true end if M.EX <= 0 then SFX.play('move') @@ -681,12 +698,12 @@ end local KBIsDown, MSIsDown = love.keyboard.isDown, love.mouse.isDown local expApproach = MATH.expApproach function scene.update(dt) + if dt > .26 then dt = .26 end if not GAME.playing then randomizeRNG() end comboTimer = comboTimer - dt if comboTimer <= 0 then combo = 0 end - local realDT=dt if kbIsDown('left', 'right', 'up', 'down') then local spd = ZENITHA._cursor.speed * dt * (kbIsDown('lctrl', 'rctrl') and .6 or 1) if kbIsDown('left') then MX = MX - spd end @@ -700,8 +717,7 @@ function scene.update(dt) local f = GAME.calculateFloor(GAME.bgH) GAME.height = max(GAME.height - dt * (f * (f + 1) + 10) * (M.VL >= 0 and M.VL + 1 or 1), 0) end - if dt > .26 then dt = .26 end - GAME.update(dt,realDT) + GAME.update(dt) GAME.lifeShow = expApproach(GAME.lifeShow, GAME.life, dt * 10) GAME.lifeShow2 = expApproach(GAME.lifeShow2, GAME.life2, dt * 10) GAME.bgH = expApproach(GAME.bgH, GAME.height, dt * 2.6) @@ -808,29 +824,37 @@ local gc_blurCircle, gc_strokePrint = GC.blurCircle, GC.strokePrint local gc_setColorMask = GC.setColorMask local setFont = FONT.set -local chargeIcon = GC.load { - w = 512, h = 512, - { 'move', 256, 256 }, - { 'fCirc', 0, 0, 180, 4 }, - { 'rotate', .5236 }, - { 'fCirc', 0, 0, 180, 4 }, - { 'rotate', .5236 }, - { 'fCirc', 0, 0, 180, 4 }, -} - local TEXTURE = TEXTURE local Cards = Cards local TextColor = TextColor local ShadeColor = ShadeColor local bgQuad = GC.newQuad(0, 0, 0, 0, 0, 0) local rulerQuad = GC.newQuad(0, 0, 32, 300, TEXTURE.ruler) -local reviveQuad = { - GC.newQuad(0, 0, 1042, 296, TEXTURE.revive.norm), - GC.newQuad(0, 355, 1042, 342, TEXTURE.revive.norm), - GC.newQuad(0, 740, 1042, 354, TEXTURE.revive.norm), + +local reviveInfo = { + quad = { + GC.newQuad(0, 0, 1042, 296, TEXTURE.revive.norm), + GC.newQuad(0, 355, 1042, 342, TEXTURE.revive.norm), + GC.newQuad(0, 740, 1042, 354, TEXTURE.revive.norm), + }, + move = { -155, -147, -154 }, + rotation = { -.095, .15, -.17 }, +} +local gvTimerColor1 = { 1, .942, .872, 0 } +local gvTimerColor2 = { 0, 0, 0, 0 } +local altitudeText = { 0, COLOR.dL, "m" } +local windupColor = { + { COLOR.HEX "F5BE3FFF" }, + { COLOR.HEX "ED7F2EFF" }, + { COLOR.HEX "E74322FF" }, + { COLOR.HEX "E63676FF" }, + { COLOR.HEX "E83AD5FF" }, + { COLOR.HEX "9E2DF6FF" }, + { COLOR.HEX "002FF5FF" }, + { COLOR.HEX "4295F8FF" }, + { COLOR.HEX "79FA52FF" }, + { COLOR.HEX "C6FC4FFF" }, } -local reviveMove = { -155, -147, -154 } -local reviveRot = { -.095, .15, -.17 } function DrawBG(brightness, showRuler) gc_replaceTransform(SCR.origin) @@ -995,6 +1019,11 @@ local function stackerStartButtonColor() W.color[2] = 0.05 W.color[3] = 0.35 end + if #GAME.questStack >= 20 then + W.color[1] = 1 + W.color[2] = 0 + W.color[3] = 0 + end W:reset() end @@ -1164,26 +1193,12 @@ function scene.draw() gc_setAlpha(.42 + .1 * sin(t * 6.2)) gc_mRect('fill', -200, 126, 200, 80, 40) end + TABLE.clear(GAME.questStack) end if STAT.stacker then stackerStartButtonColor() end end -local gvTimerColor1 = { 1, .942, .872, 0 } -local gvTimerColor2 = { 0, 0, 0, 0 } -local altitudeText = { 0, COLOR.dL, "m" } -local windupColor = { - { COLOR.HEX "F5BE3FFF" }, - { COLOR.HEX "ED7F2EFF" }, - { COLOR.HEX "E74322FF" }, - { COLOR.HEX "E63676FF" }, - { COLOR.HEX "E83AD5FF" }, - { COLOR.HEX "9E2DF6FF" }, - { COLOR.HEX "002FF5FF" }, - { COLOR.HEX "4295F8FF" }, - { COLOR.HEX "79FA52FF" }, - { COLOR.HEX "C6FC4FFF" }, -} function scene.overDraw() local t = love.timer.getTime() local eTAlpha = GAME.einvisUI and 5 or 1 @@ -1311,6 +1326,7 @@ function scene.overDraw() gc_setAlpha(.42 + .26 * sin(t * 2.6)) gc_mDraw(TEXTS.mod, 800, 396, 0, min(1, 760 / TEXTS.mod:getWidth())) end + if GAME.playing then if not GAME.invisUI then -- Achievement state mark @@ -1367,7 +1383,7 @@ function scene.overDraw() ) gc_setColor(0, 0, 0) gc_setAlpha(1/eTAlpha) - gc_mDraw(chargeIcon, 326, 270, GAME.time * 2.6, .25 * k * bk) + gc_mDraw(TEXTURE.surgeIcon, 326, 270, GAME.time * 2.6, .25 * k * bk) end if URM and M.NH == 2 then @@ -1377,7 +1393,7 @@ function scene.overDraw() -- Spike ball gc_setColor(r, g, b, a/eTAlpha) gc_blurCircle(-.26, 326, 270, 100 * k) - gc_mDraw(chargeIcon, 326, 270, GAME.time * 2.6, .25 * k * bk) + gc_mDraw(TEXTURE.surgeIcon, 326, 270, GAME.time * 2.6, .25 * k * bk) -- Spark if not (URM and M.NH == 2) then @@ -1482,8 +1498,6 @@ function scene.overDraw() local newXP, newRank = GAME.addXP(xp, true) local revolutions = newRank - rank + (newXP/(4*(newRank))) -- 1/360 local tempRevolutions = newRank - rank - --MSG("bright", tempRevolutions) - --TASK.yieldT(0.2) if revolutions > 1 then while radius > 2 and tempRevolutions > 0 do for i = 1, floor(revolutions) do @@ -1522,7 +1536,7 @@ function scene.overDraw() local texture = TEXTURE.revive[M.DP < 2 and 'norm' or allyDie and 'rev_right' or 'rev_left'] local taskID for i = #GAME.reviveTasks, 1, -1 do - gc_mDrawQ(texture, reviveQuad[i], 0, 0, 0, .4) + gc_mDrawQ(texture, reviveInfo.quad[i], 0, 0, 0, .4) if GAME.reviveTasks[i] == GAME.currentTask then taskID = i break @@ -1530,8 +1544,8 @@ function scene.overDraw() end -- Text - gc_rotate(reviveRot[taskID]) - gc_translate(reviveMove[taskID], 0) + gc_rotate(reviveInfo.rotation[taskID]) + gc_translate(reviveInfo.move[taskID], 0) local txt = task.textObj local w, h = txt:getDimensions() local ky = h < 40 and 1 or .7 @@ -1604,6 +1618,21 @@ function scene.overDraw() gc_mDraw(text, 800, Q.y, 0, kx, ky) end end + if STAT.stacker and GAME.comboBounceTime > 0 then + gc_setColor(1, 1, 1) + local alpha = 1 + local x, y = 215, 315 + if GAME.comboBounceTime < 3 then + alpha = 1/(3/max(GAME.comboBounceTime, 0.01)) + end + if GAME.comboBounceTime > 3.8 then + y = y - 10 + (abs(3.9-GAME.comboBounceTime))*100 + end + gc_setAlpha(alpha) + TEXTS.combo:setFont(FONT.get(70)) + gc_draw(TEXTS.comboText, x, y) + gc_draw(TEXTS.combo, x - (TEXTS.combo:getWidth() > 50 and 95 or 60), y - 15) + end end -- Debug @@ -1620,7 +1649,6 @@ function scene.overDraw() -- Thruster (XP bar) local rank = GAME.rank gc_setColor(rankColor[rank - 1] or COLOR.dL) - gc_setAlpha(1/eTAlpha) if GAME.DPlock then gc_setAlpha(.26/eTAlpha) end gc_setLineWidth(26 / (GAME.leakSpeed + 2)) gc_setAlpha(1/eTAlpha) @@ -1673,12 +1701,9 @@ function scene.overDraw() elseif GAME.DPlock then gc_setAlpha(.26/eTAlpha) end - --gc_mRect('fill', 800, 965, 420 * GAME.xp / (4 * rank), 3 * min(GAME.xpLockLevel, 5)) - -- change this to: gc_mRect('fill', 800, 965, 420 * GAME.xp / (4 * rank), 3 * clamp(GAME.xpLockLevel, 1, 5)) -- Height & Time - --local imperial = true local height = GAME.height local miles = 0 local feet = 0 @@ -1763,8 +1788,9 @@ function scene.overDraw() if not GAME.invisUI then -- Allspin keyboard hint Trevor Smithy (any AS and eEX or no EX) if M.AS ~= 0 and M.EX <= 0 then + local texts = CardHintText for i = 1, #Cards do - local obj = ShortCut[i] + local obj = texts[i] local x, y = Cards[i].x + 90, Cards[i].y + 155 local k = min(60 / obj:getWidth(), 1) gc_setColor(ShadeColor) @@ -1951,6 +1977,12 @@ function scene.overDraw() end end + -- Piece Data + gc_replaceTransform(SCR.xOy_m) + GC.setColor(1, 1, 1, .26 * GAME.uiHide) + local w, h = GAME.pieceFstrObj:getDimensions() + GC.draw(GAME.pieceFstrObj, 0, -170 - (STAT.stacker and GAME.questStack[1] and 60 or 0), 0, min(4.2, 740 / w) * (STAT.stacker and GAME.questStack[1] and 0.62 or 1), nil, w / 2, h * .57) + -- Trevor Smithy local gravityMod = 1 if M.GV == 2 and URM then diff --git a/module/scene/zcem.lua b/scene/zcem.lua similarity index 99% rename from module/scene/zcem.lua rename to scene/zcem.lua index 668893a5..1e447e83 100644 --- a/module/scene/zcem.lua +++ b/scene/zcem.lua @@ -180,6 +180,11 @@ function scene.load() SFX.play('hyperalert') end refreshWidgets() + GAME.refreshCurrentCombo() +end + +function scene.unload() + GAME.refreshCurrentCombo() end function scene.update(dt) @@ -430,8 +435,10 @@ function scene.overDraw() gc_setAlpha(1) FONT.set(50) gc_print("MULTIPLE PIECES!!!", 770 - (GAME.ecloseCard and 20 or 0), baseY + 338 + dy) + GAME.refreshCurrentCombo() else GAME.multiplePiecesActive = false + GAME.refreshCurrentCombo() end if URM then gc_replaceTransform(SCR.origin) diff --git a/version.lua b/version.lua index e61e5954..0e9c1e80 100644 --- a/version.lua +++ b/version.lua @@ -1,8 +1,8 @@ return { ["appName"] = "Zenith Clicker: Easy Mode", - ["apkCode"] = 010108, - ["verCode"] = 010108, + ["apkCode"] = 010200, + ["verCode"] = 010200, - ["appVer"] = "eV1.01.08", - ["verStr"] = "1.01.08", + ["appVer"] = "eV1.02.00", + ["verStr"] = "1.02.00", }