feat: add equipment set bonuses and boss bounty runestones

- Define EquipmentSet type + computeSetBonuses utility in packages/types
- Add setId field to Equipment type and assign sets to 27 equipment items
- Create 9 named equipment sets (Iron Vanguard → Eternal Throne) with 2pc/3pc bonuses
- Apply set combat multiplier in boss route
- Apply set gold/click multipliers in tick engine and click handler
- Include set bonuses in anti-cheat delta validation
- Show active set bonus strip + set badge per card in EquipmentPanel
- Add boss first-kill bounty runestones (scaling 1–10 per boss tier)
- Update AboutPanel and IDEAS.md
This commit is contained in:
2026-03-06 23:56:45 -08:00
committed by Naomi Carrigan
parent 48bf74e713
commit 078ae50e69
19 changed files with 488 additions and 20 deletions
+72
View File
@@ -18,6 +18,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["iron_sword", "chainmail", "mages_focus"],
prestigeRequirement: 0,
zoneId: "verdant_vale",
bountyRunestones: 1,
},
{
id: "lich_queen",
@@ -35,6 +36,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["enchanted_blade", "plate_armour", "arcane_orb"],
prestigeRequirement: 0,
zoneId: "verdant_vale",
bountyRunestones: 2,
},
{
id: "forest_giant",
@@ -52,6 +54,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["hide_armour"],
prestigeRequirement: 0,
zoneId: "verdant_vale",
bountyRunestones: 3,
},
// ── Shattered Ruins ───────────────────────────────────────────────────────
{
@@ -70,6 +73,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 0,
zoneId: "shattered_ruins",
bountyRunestones: 3,
},
{
id: "bone_colossus",
@@ -87,6 +91,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["frost_rune"],
prestigeRequirement: 0,
zoneId: "shattered_ruins",
bountyRunestones: 5,
},
{
id: "elder_dragon",
@@ -104,6 +109,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["vorpal_sword", "dragon_scale"],
prestigeRequirement: 0,
zoneId: "shattered_ruins",
bountyRunestones: 7,
},
// ── Shadow Marshes ────────────────────────────────────────────────────────
{
@@ -122,6 +128,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 0,
zoneId: "shadow_marshes",
bountyRunestones: 5,
},
{
id: "plague_lord",
@@ -139,6 +146,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["runestone_amulet"],
prestigeRequirement: 0,
zoneId: "shadow_marshes",
bountyRunestones: 8,
},
{
id: "mud_kraken",
@@ -156,6 +164,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["crystal_shard"],
prestigeRequirement: 0,
zoneId: "shadow_marshes",
bountyRunestones: 10,
},
// ── Frozen Peaks ──────────────────────────────────────────────────────────
{
@@ -174,6 +183,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 0,
zoneId: "frozen_peaks",
bountyRunestones: 8,
},
{
id: "ice_queen",
@@ -191,6 +201,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["frost_crystal"],
prestigeRequirement: 0,
zoneId: "frozen_peaks",
bountyRunestones: 12,
},
{
id: "void_titan",
@@ -208,6 +219,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["philosophers_stone"],
prestigeRequirement: 0,
zoneId: "frozen_peaks",
bountyRunestones: 15,
},
// ── Volcanic Depths ───────────────────────────────────────────────────────
{
@@ -226,6 +238,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["flame_lance"],
prestigeRequirement: 0,
zoneId: "volcanic_depths",
bountyRunestones: 12,
},
{
id: "magma_titan",
@@ -243,6 +256,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["volcanic_plate"],
prestigeRequirement: 0,
zoneId: "volcanic_depths",
bountyRunestones: 18,
},
{
id: "phoenix_lord",
@@ -260,6 +274,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["eternal_flame"],
prestigeRequirement: 0,
zoneId: "volcanic_depths",
bountyRunestones: 25,
},
// ── Astral Void (original) ────────────────────────────────────────────────
{
@@ -278,6 +293,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["astral_robe"],
prestigeRequirement: 0,
zoneId: "astral_void",
bountyRunestones: 20,
},
{
id: "cosmic_horror",
@@ -295,6 +311,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["celestial_blade"],
prestigeRequirement: 0,
zoneId: "astral_void",
bountyRunestones: 30,
},
{
id: "the_devourer",
@@ -312,6 +329,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["infinity_gem"],
prestigeRequirement: 0,
zoneId: "astral_void",
bountyRunestones: 40,
},
// ── Celestial Reaches ─────────────────────────────────────────────────────
{
@@ -330,6 +348,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["seraph_wing"],
prestigeRequirement: 6,
zoneId: "celestial_reaches",
bountyRunestones: 30,
},
{
id: "fallen_archangel",
@@ -347,6 +366,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["angels_halo"],
prestigeRequirement: 7,
zoneId: "celestial_reaches",
bountyRunestones: 40,
},
{
id: "divine_judge",
@@ -364,6 +384,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 8,
zoneId: "celestial_reaches",
bountyRunestones: 50,
},
{
id: "celestial_titan",
@@ -381,6 +402,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["celestial_armour"],
prestigeRequirement: 9,
zoneId: "celestial_reaches",
bountyRunestones: 60,
},
{
id: "the_first_light",
@@ -398,6 +420,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["divine_edge", "heaven_mantle"],
prestigeRequirement: 10,
zoneId: "celestial_reaches",
bountyRunestones: 75,
},
// ── Abyssal Trench ────────────────────────────────────────────────────────
{
@@ -416,6 +439,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["depth_blade"],
prestigeRequirement: 9,
zoneId: "abyssal_trench",
bountyRunestones: 40,
},
{
id: "kraken_elder",
@@ -433,6 +457,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["leviathan_eye"],
prestigeRequirement: 10,
zoneId: "abyssal_trench",
bountyRunestones: 55,
},
{
id: "abyssal_colossus",
@@ -450,6 +475,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["pressure_plate"],
prestigeRequirement: 11,
zoneId: "abyssal_trench",
bountyRunestones: 70,
},
{
id: "the_deep_one",
@@ -467,6 +493,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 12,
zoneId: "abyssal_trench",
bountyRunestones: 85,
},
{
id: "elder_abomination",
@@ -484,6 +511,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["abyssal_edge", "abyss_shroud"],
prestigeRequirement: 13,
zoneId: "abyssal_trench",
bountyRunestones: 100,
},
// ── Infernal Court ────────────────────────────────────────────────────────
{
@@ -502,6 +530,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["demon_hide"],
prestigeRequirement: 12,
zoneId: "infernal_court",
bountyRunestones: 55,
},
{
id: "hellfire_titan",
@@ -519,6 +548,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["hellfire_edge"],
prestigeRequirement: 13,
zoneId: "infernal_court",
bountyRunestones: 70,
},
{
id: "lord_of_sin",
@@ -536,6 +566,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["soul_gem"],
prestigeRequirement: 14,
zoneId: "infernal_court",
bountyRunestones: 90,
},
{
id: "infernal_sovereign",
@@ -553,6 +584,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 15,
zoneId: "infernal_court",
bountyRunestones: 110,
},
{
id: "the_fallen",
@@ -570,6 +602,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["infernal_edge", "sinslayer_aegis"],
prestigeRequirement: 16,
zoneId: "infernal_court",
bountyRunestones: 135,
},
// ── Crystalline Spire ─────────────────────────────────────────────────────
{
@@ -588,6 +621,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["prism_blade"],
prestigeRequirement: 15,
zoneId: "crystalline_spire",
bountyRunestones: 70,
},
{
id: "crystal_drake",
@@ -605,6 +639,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 16,
zoneId: "crystalline_spire",
bountyRunestones: 90,
},
{
id: "the_faceted",
@@ -622,6 +657,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["faceted_armour"],
prestigeRequirement: 17,
zoneId: "crystalline_spire",
bountyRunestones: 115,
},
{
id: "diamond_colossus",
@@ -639,6 +675,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["prism_eye"],
prestigeRequirement: 18,
zoneId: "crystalline_spire",
bountyRunestones: 140,
},
{
id: "crystal_sovereign",
@@ -656,6 +693,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["crystal_sovereign_blade", "diamond_plate"],
prestigeRequirement: 19,
zoneId: "crystalline_spire",
bountyRunestones: 175,
},
// ── Void Sanctum ──────────────────────────────────────────────────────────
{
@@ -674,6 +712,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["void_annihilator"],
prestigeRequirement: 18,
zoneId: "void_sanctum",
bountyRunestones: 90,
},
{
id: "eternal_shade",
@@ -691,6 +730,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["eternal_shroud"],
prestigeRequirement: 19,
zoneId: "void_sanctum",
bountyRunestones: 115,
},
{
id: "the_unmaker",
@@ -708,6 +748,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 20,
zoneId: "void_sanctum",
bountyRunestones: 145,
},
{
id: "void_progenitor",
@@ -725,6 +766,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["void_heart_gem"],
prestigeRequirement: 21,
zoneId: "void_sanctum",
bountyRunestones: 180,
},
{
id: "void_emperor",
@@ -742,6 +784,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["sanctum_breaker", "void_emperor_plate"],
prestigeRequirement: 22,
zoneId: "void_sanctum",
bountyRunestones: 225,
},
// ── Eternal Throne ────────────────────────────────────────────────────────
{
@@ -760,6 +803,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["eternal_armour"],
prestigeRequirement: 21,
zoneId: "eternal_throne",
bountyRunestones: 115,
},
{
id: "eternal_knight",
@@ -777,6 +821,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["throne_blade"],
prestigeRequirement: 22,
zoneId: "eternal_throne",
bountyRunestones: 150,
},
{
id: "the_undying",
@@ -794,6 +839,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 23,
zoneId: "eternal_throne",
bountyRunestones: 190,
},
{
id: "apex_sovereign",
@@ -811,6 +857,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 24,
zoneId: "eternal_throne",
bountyRunestones: 235,
},
{
id: "the_apex",
@@ -828,6 +875,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["apex_sword", "apex_plate", "eternity_stone"],
prestigeRequirement: 25,
zoneId: "eternal_throne",
bountyRunestones: 295,
},
// ── Primordial Chaos ──────────────────────────────────────────────────────
{
@@ -846,6 +894,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 26,
zoneId: "primordial_chaos",
bountyRunestones: 150,
},
{
id: "creation_engine",
@@ -863,6 +912,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 27,
zoneId: "primordial_chaos",
bountyRunestones: 200,
},
{
id: "entropy_avatar",
@@ -880,6 +930,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 29,
zoneId: "primordial_chaos",
bountyRunestones: 265,
},
{
id: "primordial_titan",
@@ -897,6 +948,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["chaos_mantle", "titan_core"],
prestigeRequirement: 31,
zoneId: "primordial_chaos",
bountyRunestones: 350,
},
// ── Infinite Expanse ──────────────────────────────────────────────────────
{
@@ -915,6 +967,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 33,
zoneId: "infinite_expanse",
bountyRunestones: 200,
},
{
id: "horizon_beast",
@@ -932,6 +985,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 35,
zoneId: "infinite_expanse",
bountyRunestones: 265,
},
{
id: "infinity_construct",
@@ -949,6 +1003,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 37,
zoneId: "infinite_expanse",
bountyRunestones: 350,
},
{
id: "expanse_sovereign",
@@ -966,6 +1021,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["expanse_blade", "void_armour_mk2"],
prestigeRequirement: 39,
zoneId: "infinite_expanse",
bountyRunestones: 465,
},
// ── Reality Forge ─────────────────────────────────────────────────────────
{
@@ -984,6 +1040,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 41,
zoneId: "reality_forge",
bountyRunestones: 265,
},
{
id: "reality_shaper",
@@ -1001,6 +1058,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 44,
zoneId: "reality_forge",
bountyRunestones: 350,
},
{
id: "creation_prime",
@@ -1018,6 +1076,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 47,
zoneId: "reality_forge",
bountyRunestones: 465,
},
{
id: "reality_architect",
@@ -1035,6 +1094,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["cosmos_blade", "reality_plate"],
prestigeRequirement: 49,
zoneId: "reality_forge",
bountyRunestones: 615,
},
// ── Cosmic Maelstrom ──────────────────────────────────────────────────────
{
@@ -1053,6 +1113,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 51,
zoneId: "cosmic_maelstrom",
bountyRunestones: 350,
},
{
id: "force_prime",
@@ -1070,6 +1131,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 54,
zoneId: "cosmic_maelstrom",
bountyRunestones: 465,
},
{
id: "maelstrom_god",
@@ -1087,6 +1149,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 57,
zoneId: "cosmic_maelstrom",
bountyRunestones: 615,
},
{
id: "cosmic_annihilator",
@@ -1104,6 +1167,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["maelstrom_edge", "cosmic_plate"],
prestigeRequirement: 59,
zoneId: "cosmic_maelstrom",
bountyRunestones: 815,
},
// ── Primeval Sanctum ──────────────────────────────────────────────────────
{
@@ -1122,6 +1186,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 61,
zoneId: "primeval_sanctum",
bountyRunestones: 465,
},
{
id: "time_elder",
@@ -1139,6 +1204,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 65,
zoneId: "primeval_sanctum",
bountyRunestones: 615,
},
{
id: "origin_beast",
@@ -1156,6 +1222,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 69,
zoneId: "primeval_sanctum",
bountyRunestones: 815,
},
{
id: "primeval_god",
@@ -1173,6 +1240,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["primeval_blade", "ancient_aegis"],
prestigeRequirement: 74,
zoneId: "primeval_sanctum",
bountyRunestones: 1080,
},
// ── The Absolute ──────────────────────────────────────────────────────────
{
@@ -1191,6 +1259,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 76,
zoneId: "the_absolute",
bountyRunestones: 615,
},
{
id: "void_convergence",
@@ -1208,6 +1277,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 79,
zoneId: "the_absolute",
bountyRunestones: 815,
},
{
id: "eternal_end",
@@ -1225,6 +1295,7 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: [],
prestigeRequirement: 83,
zoneId: "the_absolute",
bountyRunestones: 1080,
},
{
id: "the_absolute_one",
@@ -1242,5 +1313,6 @@ export const DEFAULT_BOSSES: Boss[] = [
equipmentRewards: ["absolute_blade", "eternity_plate", "omniversal_core"],
prestigeRequirement: 90,
zoneId: "the_absolute",
bountyRunestones: 1430,
},
];