wog/content.py

662 lines
47 KiB
Python
Raw Normal View History

"""Static game content: classes, abilities, mobs, places, quests, items.
Everything here is data. Numbers that scale with a character are coefficients of
their power (P); numbers that scale with a mob are multiples of its level's swing.
"""
from __future__ import annotations
# --- characters ------------------------------------------------------------
UNLOCK = [1, 3, 6, 10] # level each of a spec's four abilities is learned at
MAX_LEVEL = 20
# Half of Classic's curve: an evening and a night idle reaches the Deadmines.
XP_TO_NEXT = [0, 200, 450, 700, 1050, 1400, 1800, 2250, 2700, 3250, 3800, 4400, 5050, 5700,
6450, 7200, 8000, 8850, 9700, 10650, 0]
ARMOUR_TYPES = {"cloth": 1.2, "leather": 2.5, "mail": 5.0} # armour per item level, before the slot's share
SLOTS = ["weapon", "head", "chest", "hands", "legs", "feet", "back"]
SLOT_NAMES = {"weapon": "Weapon", "head": "Head", "chest": "Chest", "hands": "Hands", "legs": "Legs",
"feet": "Feet", "back": "Back"}
SLOT_BUDGET = {"weapon": 1.0, "head": 0.8, "chest": 1.0, "hands": 0.6, "legs": 0.9, "feet": 0.7, "back": 0.5}
SLOT_ARMOUR = {"weapon": 0, "head": 0.8, "chest": 1.0, "hands": 0.6, "legs": 0.9, "feet": 0.7, "back": 0.4}
WEAPON_SPEED = {"sword": 2.5, "mace": 2.7, "axe": 2.7, "dagger": 1.8, "staff": 3.0, "bow": 2.8, "gun": 2.8}
CLASSES = {
"warrior": {"name": "Warrior", "color": "#c69b6d", "icon": "⚔️", "armour": "mail", "res": "rage",
"weapons": ["sword", "axe", "mace", "dagger"], "hp": (60, 20), "shield": True,
"spec": "protection"},
"paladin": {"name": "Paladin", "color": "#f48cba", "icon": "🔨", "armour": "mail", "res": "mana",
"weapons": ["mace", "sword", "axe"], "hp": (55, 19), "shield": True, "spec": "protection_p"},
"shaman": {"name": "Shaman", "color": "#0070dd", "icon": "⚡", "armour": "leather", "res": "mana",
"weapons": ["mace", "axe", "staff", "dagger"], "hp": (55, 18), "shield": True, "spec": "enhancement"},
"druid": {"name": "Druid", "color": "#ff7c0a", "icon": "🌿", "armour": "leather", "res": "mana",
"weapons": ["staff", "mace", "dagger"], "hp": (45, 16), "spec": "restoration"},
"priest": {"name": "Priest", "color": "#f0f0f0", "icon": "✨", "armour": "cloth", "res": "mana",
"weapons": ["staff", "mace", "dagger"], "hp": (40, 15), "spec": "holy"},
"mage": {"name": "Mage", "color": "#3fc7eb", "icon": "❄️", "armour": "cloth", "res": "mana",
"weapons": ["staff", "dagger", "sword"], "hp": (40, 14), "spec": "frost"},
"rogue": {"name": "Rogue", "color": "#fff468", "icon": "🗡️", "armour": "leather", "res": "energy",
"weapons": ["dagger", "sword", "mace"], "hp": (50, 17), "spec": "combat"},
"hunter": {"name": "Hunter", "color": "#aad372", "icon": "🏹", "armour": "leather", "res": "mana",
"weapons": ["bow", "gun"], "hp": (50, 17), "spec": "beast_mastery", "pet": "wolf"},
"warlock": {"name": "Warlock", "color": "#8788ee", "icon": "💀", "armour": "cloth", "res": "mana",
"weapons": ["staff", "dagger", "sword"], "hp": (45, 15), "spec": "affliction", "pet": "demon"},
}
def dmg(c, school="phys"):
return {"t": "dmg", "c": c, "school": school}
def aoe(c, school="phys"):
return {"t": "aoe", "c": c, "school": school}
def dot(c, dur, school="magic", every=3):
return {"t": "dot", "c": c, "dur": dur, "every": every, "school": school}
def heal(c):
return {"t": "heal", "c": c}
def hot(c, dur, every=3):
return {"t": "hot", "c": c, "dur": dur, "every": every}
def aura(kind, dur, **extra):
return {"t": "aura", "kind": kind, "dur": dur, **extra}
# Each ability: who it targets, what it costs, its cooldown when pressed by hand
# (auto runs it AUTO_CD times slower), and the rule auto uses to decide to cast it.
# Costs are a share of max mana, or flat rage / energy.
ABILITIES = {
# Warrior: Protection
"sunder": {"name": "Sunder Armor", "icon": "🪓", "target": "enemy", "cost": 12, "threat": 2.5,
"effects": [dmg(0.35)], "auto": {"r": "always"},
"tip": "A hit that is mostly threat. The tank's filler."},
"taunt": {"name": "Taunt", "icon": "😤", "target": "enemy", "cd": 8, "offgcd": True,
"effects": [{"t": "taunt", "dur": 3}], "auto": {"r": "taunt"},
"tip": "Forces a mob to attack you for 3s and puts you on top of its threat."},
"thunder_clap": {"name": "Thunder Clap", "icon": "⚡", "target": "aoe", "cost": 20, "cd": 6, "threat": 1.75,
"effects": [aoe(0.4)], "auto": {"r": "aoe", "n": 2},
"tip": "Hits every mob. Holds a pack."},
"shield_block": {"name": "Shield Block", "icon": "🛡️", "target": "self", "cost": 10, "cd": 10, "offgcd": True,
"effects": [aura("taken", 5, mult=0.5, school="phys", name="Shield Block", icon="🛡️")],
"auto": {"r": "tanking", "pct": 0.7},
"tip": "Halves physical damage taken for 5s. Time it for the big hit."},
# Paladin: Protection
"judgement": {"name": "Judgement", "icon": "⚖️", "target": "enemy", "cost": 0.05, "cd": 8, "threat": 1.5,
"effects": [dmg(0.8, "holy")], "auto": {"r": "always"},
"tip": "Holy strike. Your seal's power, released."},
"holy_light": {"name": "Holy Light", "icon": "💛", "target": "ally", "cost": 0.14, "cast": 2.5,
"effects": [heal(1.6)], "auto": {"r": "heal", "pct": 0.45},
"tip": "A slow, big heal on anyone."},
"consecration": {"name": "Consecration", "icon": "🔥", "target": "aoe", "cost": 0.12, "cd": 8, "threat": 1.5,
"effects": [{"t": "ground", "c": 0.15, "dur": 8, "every": 1, "school": "holy"}],
"auto": {"r": "aoe", "n": 1}, "tip": "Holy ground burns every mob for 8s."},
"hammer_of_justice": {"name": "Hammer of Justice", "icon": "🔨", "target": "enemy", "cost": 0.05, "cd": 30,
"offgcd": True, "effects": [{"t": "stun", "dur": 4}], "auto": {"r": "interrupt"},
"tip": "Stuns a mob for 4s, stopping its cast. Bosses only lose the cast."},
# Shaman: Enhancement
"stormstrike": {"name": "Stormstrike", "icon": "🌩️", "target": "enemy", "cost": 0.06, "cd": 8,
"effects": [dmg(1.1), aura("vuln", 8, mult=1.2, school="nature", name="Stormstrike", icon="🌩️")],
"auto": {"r": "always"}, "tip": "Two-weapon strike. Nature hits on the target are 20% stronger."},
"flame_shock": {"name": "Flame Shock", "icon": "🔥", "target": "enemy", "cost": 0.08, "cd": 6, "threat": 1.5,
"effects": [dmg(0.3, "fire"), dot(0.18, 12, "fire")], "auto": {"r": "dot"},
"tip": "Fire burst, then burns for 12s."},
"earth_shock": {"name": "Earth Shock", "icon": "🪨", "target": "enemy", "cost": 0.07, "cd": 6, "threat": 2.0,
"offgcd": True, "effects": [dmg(0.6, "nature"), {"t": "interrupt"}], "auto": {"r": "interrupt"},
"tip": "Nature hit that stops a cast. Big threat."},
"lightning_shield": {"name": "Lightning Shield", "icon": "🔵", "target": "self", "cost": 0.05,
"effects": [aura("reflect", 60, charges=3, c=0.3, school="nature", name="Lightning Shield",
icon="🔵")],
"auto": {"r": "buff"}, "tip": "3 charges: each mob that hits you takes nature damage."},
# Druid: Restoration
"wrath": {"name": "Wrath", "icon": "🌞", "target": "enemy", "cost": 0.06, "cast": 1.75,
"effects": [dmg(0.7, "nature")], "auto": {"r": "always", "save": 0.7}, "tip": "Nature bolt."},
"regrowth": {"name": "Regrowth", "icon": "🌱", "target": "ally", "cost": 0.15, "cast": 2,
"effects": [heal(0.9), hot(0.12, 12)], "auto": {"r": "heal", "pct": 0.5},
"tip": "Heals, then keeps healing for 12s."},
"moonfire": {"name": "Moonfire", "icon": "🌙", "target": "enemy", "cost": 0.07,
"effects": [dmg(0.3, "arcane"), dot(0.12, 9, "arcane")], "auto": {"r": "dot", "save": 0.7},
"tip": "Arcane hit, then burns for 9s."},
"rejuvenation": {"name": "Rejuvenation", "icon": "🍃", "target": "ally", "cost": 0.08,
"effects": [hot(0.25, 12)], "auto": {"r": "hot", "pct": 0.85},
"tip": "Heals over 12s. Cheap, instant, stacks with Regrowth."},
# Priest: Holy
"smite": {"name": "Smite", "icon": "☀️", "target": "enemy", "cost": 0.06, "cast": 1.75,
"effects": [dmg(0.7, "holy")], "auto": {"r": "always", "save": 0.7}, "tip": "Holy bolt."},
"heal": {"name": "Heal", "icon": "💖", "target": "ally", "cost": 0.13, "cast": 2.5,
"effects": [heal(1.5)], "auto": {"r": "heal", "pct": 0.5}, "tip": "The big, slow heal."},
"pw_shield": {"name": "Power Word: Shield", "icon": "🔰", "target": "ally", "cost": 0.12, "cd": 4,
"effects": [{"t": "shield", "c": 1.1, "dur": 30}], "auto": {"r": "shield", "pct": 0.7},
"tip": "Absorbs damage. 15s before the same target can be shielded again."},
"renew": {"name": "Renew", "icon": "💫", "target": "ally", "cost": 0.08,
"effects": [hot(0.22, 15)], "auto": {"r": "hot", "pct": 0.85}, "tip": "Heals over 15s."},
# Mage: Frost
"frostbolt": {"name": "Frostbolt", "icon": "❄️", "target": "enemy", "cost": 0.06, "cast": 2,
"effects": [dmg(1.0, "frost")], "auto": {"r": "always"}, "tip": "Frost bolt. Your filler."},
"frost_nova": {"name": "Frost Nova", "icon": "🧊", "target": "aoe", "cost": 0.08, "cd": 20,
"effects": [aoe(0.2, "frost"), {"t": "freeze", "dur": 6}], "auto": {"r": "peel"},
"tip": "Freezes every mob for 6s. Damage breaks it."},
"polymorph": {"name": "Polymorph", "icon": "🐑", "target": "enemy", "cost": 0.1, "cast": 1.5, "cd": 3,
"effects": [{"t": "cc", "dur": 20}], "auto": {"r": "cc"},
"tip": "Turns a mob into a sheep for 20s. Damage breaks it. Not bosses."},
"counterspell": {"name": "Counterspell", "icon": "🚫", "target": "enemy", "cost": 0.07, "cd": 15, "offgcd": True,
"effects": [{"t": "interrupt"}], "auto": {"r": "interrupt"}, "tip": "Stops a cast."},
# Rogue: Combat
"sinister_strike": {"name": "Sinister Strike", "icon": "🗡️", "target": "enemy", "cost": 40,
"effects": [dmg(0.75), {"t": "combo", "n": 1}], "auto": {"r": "always"},
"tip": "Hit, +1 combo point."},
"eviscerate": {"name": "Eviscerate", "icon": "🩸", "target": "enemy", "cost": 35,
"effects": [{"t": "finisher", "c": 0.42}], "auto": {"r": "combo", "n": 4},
"tip": "Spends combo points: more points, more damage."},
"kick": {"name": "Kick", "icon": "🦶", "target": "enemy", "cost": 25, "cd": 10, "offgcd": True,
"effects": [dmg(0.2), {"t": "interrupt"}], "auto": {"r": "interrupt"}, "tip": "Stops a cast."},
"evasion": {"name": "Evasion", "icon": "💨", "target": "self", "cd": 60, "offgcd": True,
"effects": [aura("taken", 10, mult=0.4, school="phys", name="Evasion", icon="💨")],
"auto": {"r": "danger", "pct": 0.4}, "tip": "Dodge most attacks for 10s."},
# Hunter: Beast Mastery
"serpent_sting": {"name": "Serpent Sting", "icon": "🐍", "target": "enemy", "cost": 0.07,
"effects": [dot(0.2, 15, "nature")], "auto": {"r": "dot"}, "tip": "Poison over 15s."},
"arcane_shot": {"name": "Arcane Shot", "icon": "🔮", "target": "enemy", "cost": 0.06, "cd": 6,
"effects": [dmg(0.8, "arcane")], "auto": {"r": "always"}, "tip": "Instant arcane shot."},
"freezing_trap": {"name": "Freezing Trap", "icon": "🪤", "target": "enemy", "cost": 0.1, "cd": 15,
"effects": [{"t": "cc", "dur": 15}], "auto": {"r": "cc"},
"tip": "Freezes a mob solid for 15s. Damage breaks it. Not bosses."},
"bestial_wrath": {"name": "Bestial Wrath", "icon": "🐺", "target": "pet", "cost": 0.08, "cd": 60, "offgcd": True,
"effects": [aura("done", 15, mult=1.6, name="Bestial Wrath", icon="🐺")],
"auto": {"r": "boss"}, "tip": "Your pet hits 60% harder for 15s."},
# Warlock: Affliction
"shadow_bolt": {"name": "Shadow Bolt", "icon": "🌑", "target": "enemy", "cost": 0.07, "cast": 2.5,
"effects": [dmg(1.1, "shadow")], "auto": {"r": "always"}, "tip": "Shadow bolt."},
"corruption": {"name": "Corruption", "icon": "🦠", "target": "enemy", "cost": 0.07,
"effects": [dot(0.28, 18, "shadow")], "auto": {"r": "dot"}, "tip": "Shadow over 18s."},
"fear": {"name": "Fear", "icon": "😱", "target": "enemy", "cost": 0.08, "cast": 1.5, "cd": 3,
"effects": [{"t": "cc", "dur": 10}], "auto": {"r": "cc"},
"tip": "Sends a mob running for 10s. Damage breaks it. Not bosses."},
"drain_life": {"name": "Drain Life", "icon": "🩸", "target": "enemy", "cost": 0.1, "cast": 3, "cd": 8,
"effects": [{"t": "drain", "c": 0.9, "school": "shadow"}], "auto": {"r": "self_below", "pct": 0.6},
"tip": "Steals health over 3s."},
}
# Specs list their abilities in the order they're learned (UNLOCK), and auto works
# through `priority` top-down.
SPECS = {
"protection": {"cls": "warrior", "name": "Protection", "role": "tank",
"abilities": ["sunder", "taunt", "thunder_clap", "shield_block"],
"priority": ["taunt", "shield_block", "thunder_clap", "sunder"]},
"protection_p": {"cls": "paladin", "name": "Protection", "role": "tank",
"abilities": ["judgement", "holy_light", "consecration", "hammer_of_justice"],
"priority": ["hammer_of_justice", "holy_light", "consecration", "judgement"]},
"enhancement": {"cls": "shaman", "name": "Enhancement", "role": "tank",
"abilities": ["stormstrike", "flame_shock", "earth_shock", "lightning_shield"],
"priority": ["earth_shock", "lightning_shield", "stormstrike", "flame_shock"]},
"restoration": {"cls": "druid", "name": "Restoration", "role": "healer",
"abilities": ["wrath", "regrowth", "moonfire", "rejuvenation"],
"priority": ["regrowth", "rejuvenation", "moonfire", "wrath"]},
"holy": {"cls": "priest", "name": "Holy", "role": "healer",
"abilities": ["smite", "heal", "pw_shield", "renew"],
"priority": ["pw_shield", "heal", "renew", "smite"]},
"frost": {"cls": "mage", "name": "Frost", "role": "dps",
"abilities": ["frostbolt", "frost_nova", "polymorph", "counterspell"],
"priority": ["counterspell", "frost_nova", "polymorph", "frostbolt"]},
"combat": {"cls": "rogue", "name": "Combat", "role": "dps",
"abilities": ["sinister_strike", "eviscerate", "kick", "evasion"],
"priority": ["kick", "evasion", "eviscerate", "sinister_strike"]},
"beast_mastery": {"cls": "hunter", "name": "Beast Mastery", "role": "dps",
"abilities": ["serpent_sting", "arcane_shot", "freezing_trap", "bestial_wrath"],
"priority": ["bestial_wrath", "freezing_trap", "serpent_sting", "arcane_shot"]},
"affliction": {"cls": "warlock", "name": "Affliction", "role": "dps",
"abilities": ["shadow_bolt", "corruption", "fear", "drain_life"],
"priority": ["fear", "drain_life", "corruption", "shadow_bolt"]},
}
PETS = {
# dmg: each 2s swing as a share of the owner's power
"wolf": {"name": "Wolf", "icon": "🐺", "hp": 0.65, "dmg": 0.3, "swing": 2.0, "school": "phys"},
"voidwalker": {"name": "Voidwalker", "icon": "👤", "hp": 0.9, "dmg": 0.12, "swing": 2.0, "school": "shadow"},
"imp": {"name": "Imp", "icon": "😈", "hp": 0.35, "dmg": 0.28, "swing": 2.0, "school": "fire"},
}
# --- mobs ------------------------------------------------------------------
# Enemy abilities. `effect` is (kind, amount, school): hit/aoe amounts are swings,
# heal amounts are a share of max health.
ENEMY_ABILITIES = {
"fireball": {"name": "Fireball", "icon": "🔥", "cast": 2.5, "every": 10, "first": 3, "interrupt": True,
"target": "target", "effect": ("hit", 2.2, "fire")},
"frostbolt": {"name": "Frostbolt", "icon": "❄️", "cast": 2.5, "every": 10, "first": 3, "interrupt": True,
"target": "target", "effect": ("hit", 2.0, "frost")},
"healing_wave": {"name": "Healing Wave", "icon": "💧", "cast": 2.5, "every": 9, "first": 5, "interrupt": True,
"target": "hurt_ally", "effect": ("heal", 0.3, "nature")},
"slam": {"name": "Rhahk'Zor Slam", "icon": "💥", "cast": 2.0, "every": 12, "first": 7, "interrupt": False,
"target": "target", "effect": ("hit", 3.2, "phys")},
"bomb": {"name": "Throw Bomb", "icon": "💣", "cast": 2.0, "every": 11, "first": 4, "interrupt": True,
"target": "all", "effect": ("aoe", 0.9, "fire")},
"saw_blades": {"name": "Saw Blades", "icon": "⚙️", "cast": 1.5, "every": 14, "first": 6, "interrupt": False,
"target": "all", "effect": ("aoe", 1.0, "phys")},
"molten_metal": {"name": "Molten Metal", "icon": "🌋", "cast": 3.0, "every": 13, "first": 5, "interrupt": True,
"target": "random_soft", "effect": ("hit", 3.5, "fire")},
"thrash": {"name": "Thrash", "icon": "🌀", "cast": 0, "every": 9, "first": 6, "interrupt": False,
"target": "target", "effect": ("hit", 2.0, "phys")},
"disarm": {"name": "Disarm", "icon": "🫳", "cast": 0, "every": 15, "first": 8, "interrupt": False,
"target": "target", "effect": ("disarm", 6, "phys")},
"hogger_bite": {"name": "Hogger's Bite", "icon": "🦷", "cast": 1.5, "every": 12, "first": 6, "interrupt": False,
"target": "target", "effect": ("hit", 2.5, "phys")},
}
# Mob stats: level range, kind, multipliers on the level's health and swing.
MOBS = {
"young_wolf": {"name": "Young Wolf", "lv": (1, 2), "kind": "beast", "junk": "Ruined Pelt"},
"kobold_vermin": {"name": "Kobold Vermin", "lv": (1, 2), "kind": "humanoid", "junk": "Ragged Kobold Vest"},
"kobold_worker": {"name": "Kobold Worker", "lv": (3, 4), "kind": "humanoid", "junk": "Dull Kobold Pick"},
"defias_thug": {"name": "Defias Thug", "lv": (3, 5), "kind": "humanoid", "junk": "Frayed Burlap"},
"garrick_padfoot": {"name": "Garrick Padfoot", "lv": (5, 5), "kind": "humanoid", "hp": 2.0, "dmg": 1.2,
"rare": True, "junk": "Garrick's Head"},
"kobold_laborer": {"name": "Kobold Laborer", "lv": (4, 5), "kind": "humanoid", "junk": "Cracked Candle"},
"kobold_tunneler": {"name": "Kobold Tunneler", "lv": (6, 7), "kind": "humanoid", "junk": "Kobold Mining Helmet"},
"kobold_miner": {"name": "Kobold Miner", "lv": (7, 8), "kind": "humanoid", "junk": "Worn Mining Shovel"},
"murloc_streamrunner": {"name": "Murloc Streamrunner", "lv": (7, 8), "kind": "humanoid", "junk": "Slimy Scale"},
"murloc_forager": {"name": "Murloc Forager", "lv": (8, 9), "kind": "humanoid", "junk": "Murloc Fin"},
"defias_bandit": {"name": "Defias Bandit", "lv": (8, 9), "kind": "humanoid", "junk": "Bandit Cinch"},
"princess": {"name": "Princess", "lv": (9, 9), "kind": "beast", "hp": 2.5, "dmg": 1.3, "rare": True,
"junk": "Princess's Collar"},
"porcine_entourage": {"name": "Porcine Entourage", "lv": (6, 7), "kind": "beast", "junk": "Chunk of Boar Meat"},
"young_wolf_pack": {"name": "Prowling Wolf", "lv": (9, 10), "kind": "beast", "hp": 0.7, "junk": "Wolf Fang"},
"mother_fang": {"name": "Mother Fang", "lv": (10, 10), "kind": "beast", "hp": 2.5, "dmg": 1.3, "rare": True,
"junk": "Silky Spider Leg"},
"riverpaw_gnoll": {"name": "Riverpaw Gnoll", "lv": (9, 10), "kind": "humanoid", "junk": "Gnoll Tooth"},
"riverpaw_mystic": {"name": "Riverpaw Mystic", "lv": (10, 10), "kind": "humanoid", "hp": 0.8,
"abilities": ["healing_wave"], "junk": "Mystic's Charm"},
"hogger": {"name": "Hogger", "lv": (11, 11), "kind": "humanoid", "hp": 3.0, "dmg": 1.5, "rare": True,
"abilities": ["hogger_bite"], "junk": "Huge Gnoll Claw"},
"harvest_watcher": {"name": "Harvest Watcher", "lv": (10, 12), "kind": "mechanical", "junk": "Scrap Metal"},
"young_fleshripper": {"name": "Young Fleshripper", "lv": (10, 11), "kind": "beast", "junk": "Tattered Feather"},
"goretusk": {"name": "Goretusk", "lv": (12, 13), "kind": "beast", "junk": "Cracked Tusk"},
"defias_trapper": {"name": "Defias Trapper", "lv": (12, 13), "kind": "humanoid", "junk": "Rusty Trap"},
"defias_smuggler": {"name": "Defias Smuggler", "lv": (13, 14), "kind": "humanoid", "junk": "Contraband Crate"},
"riverpaw_brute": {"name": "Riverpaw Brute", "lv": (14, 16), "kind": "humanoid", "dmg": 1.1, "junk": "Gnoll Paw"},
"riverpaw_herbalist": {"name": "Riverpaw Herbalist", "lv": (15, 15), "kind": "humanoid", "hp": 0.8,
"abilities": ["healing_wave"], "junk": "Bundle of Herbs"},
"murloc_coastrunner": {"name": "Murloc Coastrunner", "lv": (15, 16), "kind": "humanoid", "junk": "Shiny Shell"},
"murloc_tidecaller": {"name": "Murloc Tidecaller", "lv": (16, 16), "kind": "humanoid", "hp": 0.8,
"abilities": ["frostbolt"], "junk": "Tidecaller's Pearl"},
"defias_pillager": {"name": "Defias Pillager", "lv": (16, 17), "kind": "humanoid", "hp": 0.8,
"abilities": ["fireball"], "junk": "Scorched Rag"},
"defias_looter": {"name": "Defias Looter", "lv": (16, 18), "kind": "humanoid", "junk": "Stolen Silverware"},
"defias_pathstalker": {"name": "Defias Pathstalker", "lv": (17, 18), "kind": "humanoid", "junk": "Muddy Boots"},
"defias_highwayman": {"name": "Defias Highwayman", "lv": (18, 19), "kind": "humanoid", "dmg": 1.1,
"junk": "Highwayman's Mask"},
# The Deadmines. Everything in here is elite.
"defias_miner": {"name": "Defias Miner", "lv": (17, 18), "kind": "humanoid", "elite": True, "junk": "Miner's Lamp"},
"defias_overseer": {"name": "Defias Overseer", "lv": (18, 18), "kind": "humanoid", "elite": True,
"dmg": 1.15, "junk": "Overseer's Whistle"},
"rhahkzor": {"name": "Rhahk'Zor", "lv": (19, 19), "kind": "giant", "boss": True, "hp": 3.0, "dmg": 1.4,
"abilities": ["slam"], "junk": "Ogre Tooth"},
"goblin_woodcarver": {"name": "Goblin Woodcarver", "lv": (18, 18), "kind": "humanoid", "elite": True,
"junk": "Wood Shavings"},
"goblin_engineer": {"name": "Goblin Engineer", "lv": (18, 18), "kind": "humanoid", "elite": True, "hp": 0.8,
"abilities": ["bomb"], "junk": "Gear Assembly"},
"sneeds_shredder": {"name": "Sneed's Shredder", "lv": (20, 20), "kind": "mechanical", "boss": True, "hp": 2.6,
"dmg": 1.3, "abilities": ["saw_blades"], "on_death": ["sneed"], "junk": "Shredder Saw"},
"sneed": {"name": "Sneed", "lv": (20, 20), "kind": "humanoid", "boss": True, "hp": 1.2, "dmg": 1.2,
"abilities": ["disarm"], "junk": "Sneed's Goggles"},
"defias_evoker": {"name": "Defias Evoker", "lv": (18, 18), "kind": "humanoid", "elite": True, "hp": 0.75,
"abilities": ["fireball"], "junk": "Evoker's Robe Scrap"},
"defias_taskmaster": {"name": "Defias Taskmaster", "lv": (18, 18), "kind": "humanoid", "elite": True,
"junk": "Taskmaster's Whip"},
"defias_strip_miner": {"name": "Defias Strip Miner", "lv": (17, 17), "kind": "humanoid", "elite": True,
"junk": "Ore Sack"},
"gilnid": {"name": "Gilnid", "lv": (20, 20), "kind": "humanoid", "boss": True, "hp": 3.2, "dmg": 1.2,
"abilities": ["molten_metal"], "junk": "Smelting Tongs"},
"defias_pirate": {"name": "Defias Pirate", "lv": (18, 19), "kind": "humanoid", "elite": True, "junk": "Pirate Hat"},
"defias_squallshaper": {"name": "Defias Squallshaper", "lv": (19, 19), "kind": "humanoid", "elite": True,
"hp": 0.75, "abilities": ["healing_wave"], "junk": "Water-logged Rune"},
"mr_smite": {"name": "Mr. Smite", "lv": (20, 20), "kind": "humanoid", "boss": True, "hp": 3.8, "dmg": 1.25,
"phases": [{"at": 0.66, "say": "You landlubbers are tougher than I thought! I'll have to improvise!",
"do": [("stun_all", 2.5), ("enrage", 1.25)]},
{"at": 0.33, "say": "D'ah! Now you're making me angry!",
"do": [("stun_all", 2.5), ("enrage", 1.25)]}],
"junk": "Smite's Anchor Chain"},
"defias_blackguard": {"name": "Defias Blackguard", "lv": (19, 19), "kind": "humanoid", "elite": True,
"hp": 0.7, "junk": "Blackguard Cowl"},
"edwin_vancleef": {"name": "Edwin VanCleef", "lv": (21, 21), "kind": "humanoid", "boss": True, "hp": 4.6,
"dmg": 1.35, "abilities": ["thrash"],
"phases": [{"at": 0.5, "say": "Lapdogs, all of you!",
"do": [("summon", ["defias_blackguard", "defias_blackguard"])]}],
"junk": "VanCleef's Bandana"},
}
ELITE_HP, ELITE_DMG = 3.2, 2.0
BOSS_HP, BOSS_DMG = 5.0, 2.8 # on top of the mob's own multipliers
# --- the world -------------------------------------------------------------
# A zone is one page: every hunt, quest giver and vendor in it is a tap away.
ZONES = {
"elwynn": {"name": "Elwynn Forest", "lv": (1, 10), "hub": "goldshire", "start": "northshire_abbey"},
"westfall": {"name": "Westfall", "lv": (10, 20), "hub": "sentinel_hill"},
}
# Crossing between zones is a journey: a fight at each stop along the road, in
# order (reversed going the other way), each with a chance of the road's rare.
ROADS = {
"westbrook": {
"name": "The Westbrook road", "zones": ("elwynn", "westfall"), "rare": "mother_fang", "rare_odds": 0.1,
"stops": [
{"name": "Westbrook Garrison", "pulls": [["riverpaw_gnoll"], ["young_wolf_pack", "young_wolf_pack"]]},
{"name": "The Westbrook bridge", "pulls": [["murloc_forager", "murloc_streamrunner"],
["riverpaw_gnoll", "riverpaw_mystic"]]},
{"name": "The Jansen Stead", "pulls": [["young_fleshripper"], ["harvest_watcher"]]},
],
},
}
FLIGHT_COST = 50 # copper to fly to a zone you've reached on foot
# Places are a zone's subzones. Hunts are fights you can repeat; `pulls` are the
# packs a hunt draws from.
PLACES = {
"northshire_abbey": {"name": "Northshire Abbey", "zone": "elwynn", "hub": True, "lv": (1, 5)},
"northshire_valley": {"name": "Northshire Valley", "zone": "elwynn", "lv": (1, 3),
"hunts": {"young_wolf": [["young_wolf"]], "kobold_vermin": [["kobold_vermin"]]}},
"northshire_vineyards": {"name": "Northshire Vineyards", "zone": "elwynn", "lv": (3, 5),
"hunts": {"defias_thug": [["defias_thug"]],
"garrick_padfoot": [["garrick_padfoot", "defias_thug"]]}},
"echo_ridge": {"name": "Echo Ridge Mine", "zone": "elwynn", "lv": (3, 5),
"hunts": {"kobold_worker": [["kobold_worker"]], "kobold_laborer": [["kobold_laborer"]]}},
"goldshire": {"name": "Goldshire", "zone": "elwynn", "hub": True, "lv": (5, 10)},
"fargodeep": {"name": "Fargodeep Mine", "zone": "elwynn", "lv": (6, 8),
"hunts": {"kobold_tunneler": [["kobold_tunneler"]],
"kobold_miner": [["kobold_miner"], ["kobold_miner", "kobold_tunneler"]]}},
"crystal_lake": {"name": "Crystal Lake", "zone": "elwynn", "lv": (7, 9),
"hunts": {"murloc_streamrunner": [["murloc_streamrunner"]],
"murloc_forager": [["murloc_forager"], ["murloc_forager", "murloc_streamrunner"]]}},
"brackwell": {"name": "Brackwell Pumpkin Patch", "zone": "elwynn", "lv": (8, 10),
"hunts": {"defias_bandit": [["defias_bandit"]],
"princess": [["princess", "porcine_entourage", "porcine_entourage"]]}},
"forests_edge": {"name": "Forest's Edge", "zone": "elwynn", "lv": (9, 11),
"hunts": {"riverpaw_gnoll": [["riverpaw_gnoll"], ["riverpaw_gnoll", "riverpaw_mystic"]],
"hogger": [["hogger"]]}},
"sentinel_hill": {"name": "Sentinel Hill", "zone": "westfall", "hub": True, "lv": (10, 20)},
"saldeans_farm": {"name": "Saldean's Farm", "zone": "westfall", "lv": (10, 13),
"hunts": {"harvest_watcher": [["harvest_watcher"]],
"young_fleshripper": [["young_fleshripper"]], "goretusk": [["goretusk"]]}},
"molsen_farm": {"name": "The Molsen Farm", "zone": "westfall", "lv": (12, 14),
"hunts": {"defias_trapper": [["defias_trapper"]],
"defias_smuggler": [["defias_smuggler"], ["defias_smuggler", "defias_trapper"]]}},
"dust_plains": {"name": "The Dust Plains", "zone": "westfall", "lv": (14, 16),
"hunts": {"riverpaw_brute": [["riverpaw_brute"], ["riverpaw_brute", "riverpaw_herbalist"]]}},
"gold_coast": {"name": "Gold Coast Quarry", "zone": "westfall", "lv": (15, 16),
"hunts": {"murloc_coastrunner": [["murloc_coastrunner"], ["murloc_coastrunner", "murloc_tidecaller"]]}},
"moonbrook": {"name": "Moonbrook", "zone": "westfall", "lv": (16, 18), "dungeon": "deadmines",
"hunts": {"defias_pillager": [["defias_pillager"], ["defias_looter", "defias_pillager"]],
"defias_looter": [["defias_looter"]]}},
"dagger_hills": {"name": "The Dagger Hills", "zone": "westfall", "lv": (17, 19),
"hunts": {"defias_pathstalker": [["defias_pathstalker"]],
"defias_highwayman": [["defias_highwayman"], ["defias_highwayman", "defias_pathstalker"]]}},
}
DUNGEONS = {
"deadmines": {
"name": "The Deadmines", "entrance": "moonbrook", "lv": (17, 21), "size": 5,
"pulls": [
{"name": "Mine entrance", "mobs": ["defias_miner", "defias_miner", "defias_overseer"]},
{"name": "Rhahk'Zor", "mobs": ["rhahkzor"], "boss": True},
{"name": "Goblin workshop", "mobs": ["goblin_woodcarver", "goblin_engineer", "goblin_woodcarver"]},
{"name": "Sneed's Shredder", "mobs": ["sneeds_shredder"], "boss": True},
{"name": "The foundry", "mobs": ["defias_evoker", "defias_taskmaster", "defias_strip_miner"]},
{"name": "Gilnid", "mobs": ["gilnid", "defias_strip_miner"], "boss": True},
{"name": "The ship's deck", "mobs": ["defias_pirate", "defias_squallshaper", "defias_pirate"]},
{"name": "Mr. Smite", "mobs": ["mr_smite"], "boss": True},
{"name": "Edwin VanCleef", "mobs": ["edwin_vancleef"], "boss": True},
],
},
}
# --- quests ----------------------------------------------------------------
# Objectives: kill a mob, loot an item that only drops while you're on the quest,
# or visit a place. `ender` defaults to the giver's place.
QUESTS = {
"wolves_across_the_border": {
"name": "Wolves Across the Border", "giver": "northshire_abbey", "npc": "Eagan Peltskinner", "lv": 2,
"text": "The wolves are thinning the herds. Bring me their meat.",
"obj": [{"loot": "Tough Wolf Meat", "n": 8, "from": ["young_wolf"], "chance": 0.6}],
"xp": 250, "copper": 40},
"kobold_camp_cleanup": {
"name": "Kobold Camp Cleanup", "giver": "northshire_abbey", "npc": "Marshal McBride", "lv": 2,
"text": "Kobold vermin infest the valley. Thin them out.",
"obj": [{"kill": "kobold_vermin", "n": 10}], "xp": 280, "copper": 50,
"choice": ["w/feet/cloth/4", "w/feet/leather/4", "w/feet/mail/4"]},
"investigate_echo_ridge": {
"name": "Investigate Echo Ridge", "giver": "northshire_abbey", "npc": "Marshal McBride", "lv": 4,
"req": ["kobold_camp_cleanup"], "text": "More kobolds dig at Echo Ridge. Find out why.",
"obj": [{"kill": "kobold_worker", "n": 10}], "xp": 450, "copper": 80,
"choice": ["g/hands/cloth/eagle/6", "g/hands/leather/monkey/6", "g/hands/mail/bear/6"]},
"brotherhood_of_thieves": {
"name": "Brotherhood of Thieves", "giver": "northshire_abbey", "npc": "Deputy Willem", "lv": 4,
"text": "Defias thugs are stealing from the vineyards. Their red bandanas will prove the work.",
"obj": [{"loot": "Red Burlap Bandana", "n": 12, "from": ["defias_thug"], "chance": 0.5}],
"xp": 450, "copper": 90},
"bounty_on_garrick_padfoot": {
"name": "Bounty on Garrick Padfoot", "giver": "northshire_abbey", "npc": "Deputy Willem", "lv": 5,
"req": ["brotherhood_of_thieves"], "text": "Their leader hides in the vineyards. Bring him down.",
"obj": [{"kill": "garrick_padfoot", "n": 1}], "xp": 550, "copper": 150,
"choice": ["g/weapon/sword/tiger/7", "g/weapon/staff/eagle/7", "g/weapon/dagger/monkey/7",
"g/weapon/bow/monkey/7"]},
"report_to_goldshire": {
"name": "Report to Goldshire", "giver": "northshire_abbey", "npc": "Marshal McBride", "lv": 5,
"req": ["investigate_echo_ridge"], "ender": "goldshire", "ender_npc": "Marshal Dughan",
"text": "Take word of the kobolds to Marshal Dughan in Goldshire.",
"obj": [], "xp": 200, "copper": 50},
"gold_dust_exchange": {
"name": "Gold Dust Exchange", "giver": "goldshire", "npc": "Remy \"Two Times\"", "lv": 7,
"text": "The kobolds at Fargodeep pan for gold dust. Bring me some, and no questions.",
"obj": [{"loot": "Gold Dust", "n": 10, "from": ["kobold_tunneler", "kobold_miner"], "chance": 0.4}],
"xp": 700, "copper": 250},
"kobold_candles": {
"name": "Kobold Candles", "giver": "goldshire", "npc": "William Pestle", "lv": 8,
"text": "Kobold candles make fine wax for my potions.",
"obj": [{"loot": "Large Candle", "n": 8, "from": ["kobold_miner"], "chance": 0.5}], "xp": 800, "copper": 220,
"choice": ["g/legs/cloth/eagle/9", "g/legs/leather/monkey/9", "g/legs/mail/bear/9"]},
"bounty_on_murlocs": {
"name": "Bounty on Murlocs", "giver": "crystal_lake", "npc": "Guard Thomas", "lv": 9,
"text": "Murlocs raid the lake shore. Bring me their fins.",
"obj": [{"loot": "Torn Murloc Fin", "n": 8, "from": ["murloc_streamrunner", "murloc_forager"], "chance": 0.5}],
"xp": 900, "copper": 300,
"choice": ["g/head/cloth/eagle/10", "g/head/leather/tiger/10", "g/head/mail/bear/10"]},
"princess_must_die": {
"name": "Princess Must Die!", "giver": "brackwell", "npc": "Ma Stonefield", "lv": 9,
"text": "That prize sow Princess has been eating my pumpkins. End her.",
"obj": [{"kill": "princess", "n": 1}], "xp": 1000, "copper": 350},
"the_defias_bandits": {
"name": "Bandits in the Patch", "giver": "brackwell", "npc": "Ma Stonefield", "lv": 9,
"text": "Defias bandits camp in the pumpkin patch. Run them off.",
"obj": [{"kill": "defias_bandit", "n": 12}], "xp": 950, "copper": 320},
"riverpaw_gnoll_bounty": {
"name": "Riverpaw Gnoll Bounty", "giver": "goldshire", "npc": "Marshal Dughan", "lv": 10,
"text": "Gnolls from Westfall raid the forest's edge. Bring their armbands.",
"obj": [{"loot": "Painted Gnoll Armband", "n": 8, "from": ["riverpaw_gnoll", "riverpaw_mystic"],
"chance": 0.4}], "xp": 1100, "copper": 400},
"wanted_hogger": {
"name": "Wanted: Hogger", "giver": "goldshire", "npc": "Marshal Dughan", "lv": 11,
"req": ["riverpaw_gnoll_bounty"], "text": "A huge gnoll leads them. Hogger. Bring him down.",
"obj": [{"kill": "hogger", "n": 1}], "xp": 1600, "copper": 900,
"choice": ["hoggers_trousers", "hoggers_gauntlets", "hoggers_cleaver"]},
"report_to_gryan": {
"name": "Report to Gryan Stoutmantle", "giver": "goldshire", "npc": "Marshal Dughan", "lv": 10,
"req": ["riverpaw_gnoll_bounty"], "ender": "sentinel_hill", "ender_npc": "Gryan Stoutmantle",
"text": "The People's Militia at Sentinel Hill needs every sword it can get.",
"obj": [{"visit": "westfall"}], "xp": 400, "copper": 100},
"the_killing_fields": {
"name": "The Killing Fields", "giver": "saldeans_farm", "npc": "Farmer Saldean", "lv": 12,
"text": "Harvest Watchers turned on us. Smash them.",
"obj": [{"kill": "harvest_watcher", "n": 12}], "xp": 1300, "copper": 400,
"choice": ["g/feet/cloth/eagle/12", "g/feet/leather/monkey/12", "g/feet/mail/bear/12"]},
"goretusk_liver_pie": {
"name": "Goretusk Liver Pie", "giver": "saldeans_farm", "npc": "Salma Saldean", "lv": 12,
"text": "Bring me goretusk livers and I'll bake you a pie that sticks to the ribs.",
"obj": [{"loot": "Goretusk Liver", "n": 8, "from": ["goretusk"], "chance": 0.5}], "xp": 1250, "copper": 380},
"the_peoples_militia": {
"name": "The People's Militia", "giver": "sentinel_hill", "npc": "Lieutenant Horatio Laine", "lv": 13,
"text": "The Defias hold the Molsen farm. Strike back.",
"obj": [{"kill": "defias_trapper", "n": 10}, {"kill": "defias_smuggler", "n": 10}], "xp": 1700,
"copper": 600, "choice": ["g/chest/cloth/eagle/14", "g/chest/leather/monkey/14", "g/chest/mail/bear/14"]},
"patrolling_westfall": {
"name": "Patrolling Westfall", "giver": "sentinel_hill", "npc": "Captain Danuvin", "lv": 15,
"text": "Riverpaw brutes roam the plains. Bring back their paws.",
"obj": [{"loot": "Gnoll Paw", "n": 8, "from": ["riverpaw_brute", "riverpaw_herbalist"], "chance": 0.5}],
"xp": 1900, "copper": 700},
"the_coast_isnt_clear": {
"name": "The Coast Isn't Clear", "giver": "sentinel_hill", "npc": "Captain Grayson", "lv": 16,
"text": "Murlocs overran the quarry on the Gold Coast.",
"obj": [{"kill": "murloc_coastrunner", "n": 10}, {"kill": "murloc_tidecaller", "n": 5}], "xp": 2100,
"copper": 750, "choice": ["g/back/cloth/tiger/16", "g/back/cloth/bear/16", "g/back/cloth/eagle/16"]},
"red_silk_bandanas": {
"name": "Red Silk Bandanas", "giver": "sentinel_hill", "npc": "Scout Riell", "lv": 17,
"req": ["the_peoples_militia"], "text": "The Defias in Moonbrook wear red silk. Bring me ten.",
"obj": [{"loot": "Red Silk Bandana", "n": 10, "from": ["defias_pillager", "defias_looter"], "chance": 0.5}],
"xp": 2300, "copper": 900},
"the_peoples_militia_2": {
"name": "The People's Militia, Part 2", "giver": "sentinel_hill", "npc": "Lieutenant Horatio Laine", "lv": 18,
"req": ["the_peoples_militia"], "text": "Their scouts watch from the Dagger Hills. Clear them out.",
"obj": [{"kill": "defias_pathstalker", "n": 10}, {"kill": "defias_highwayman", "n": 5}], "xp": 2500,
"copper": 1000, "choice": ["g/weapon/staff/eagle/19", "g/weapon/sword/tiger/19", "g/weapon/mace/bear/19",
"g/weapon/bow/monkey/19", "g/weapon/dagger/monkey/19"]},
"underground_assault": {
"name": "Underground Assault", "giver": "sentinel_hill", "npc": "Shoni the Shilent", "lv": 18,
"text": "Sneed's Shredder runs on a gnome's stolen gear. Bring me Gnoam Sprecklesprocket.",
"obj": [{"loot": "Gnoam Sprecklesprocket", "n": 1, "from": ["sneeds_shredder"], "chance": 1.0}],
"xp": 2400, "copper": 1100},
"collecting_memories": {
"name": "Collecting Memories", "giver": "sentinel_hill", "npc": "Wilder Thistlenettle", "lv": 18,
"text": "My brother's miners' union cards are down in that mine.",
"obj": [{"loot": "Miner's Union Card", "n": 4, "from": ["defias_miner", "defias_strip_miner"],
"chance": 0.5}], "xp": 2400, "copper": 900},
"the_defias_brotherhood": {
"name": "The Defias Brotherhood", "giver": "sentinel_hill", "npc": "Gryan Stoutmantle", "lv": 20,
"req": ["red_silk_bandanas"], "text": "Edwin VanCleef leads them from the Deadmines. End this.",
"obj": [{"kill": "edwin_vancleef", "n": 1}], "xp": 4000, "copper": 2500,
"choice": ["chausses_of_westfall", "tunic_of_westfall", "staff_of_westfall"]},
}
# --- items -----------------------------------------------------------------
QUALITY = {"poor": 0, "common": 0.55, "uncommon": 1.0, "rare": 1.3, "epic": 1.6}
# Suffix: (name, share of the stat budget that goes to stamina; the rest is power)
SUFFIXES = {
"stamina": ("of Stamina", 1.0), "bear": ("of the Bear", 0.6), "eagle": ("of the Eagle", 0.5),
"monkey": ("of the Monkey", 0.4), "tiger": ("of the Tiger", 0.3), "power": ("of Power", 0.0),
}
# Base names for generated gear, by item-level band (1-7, 8-14, 15+).
BASE_NAMES = {
("head", "cloth"): ["Linen Cap", "Woolen Hood", "Silk Turban"],
("chest", "cloth"): ["Linen Robe", "Woolen Robe", "Silk-threaded Robe"],
("hands", "cloth"): ["Linen Gloves", "Woolen Gloves", "Silk Gloves"],
("legs", "cloth"): ["Linen Pants", "Woolen Leggings", "Spellbinder Pants"],
("feet", "cloth"): ["Linen Shoes", "Woolen Boots", "Silk Slippers"],
("back", "cloth"): ["Frayed Cloak", "Woolen Cape", "Silk Cloak"],
("head", "leather"): ["Rough Leather Cap", "Embossed Leather Cap", "Dark Leather Hood"],
("chest", "leather"): ["Rough Leather Vest", "Embossed Leather Vest", "Dark Leather Tunic"],
("hands", "leather"): ["Rough Leather Gloves", "Embossed Leather Gloves", "Dark Leather Gloves"],
("legs", "leather"): ["Rough Leather Pants", "Embossed Leather Pants", "Dark Leather Pants"],
("feet", "leather"): ["Rough Leather Boots", "Embossed Leather Boots", "Dark Leather Boots"],
("head", "mail"): ["Rusted Chain Coif", "Chainmail Coif", "Banded Helm"],
("chest", "mail"): ["Rusted Chain Vest", "Chainmail Armor", "Banded Hauberk"],
("hands", "mail"): ["Rusted Chain Gloves", "Chainmail Gloves", "Banded Gauntlets"],
("legs", "mail"): ["Rusted Chain Leggings", "Chainmail Pants", "Banded Leggings"],
("feet", "mail"): ["Rusted Chain Boots", "Chainmail Boots", "Banded Boots"],
("weapon", "sword"): ["Short Sword", "Broadsword", "Cutlass"],
("weapon", "mace"): ["Club", "Morning Star", "Warhammer"],
("weapon", "axe"): ["Hatchet", "Battle Axe", "Cleaver"],
("weapon", "dagger"): ["Dirk", "Stiletto", "Kris"],
("weapon", "staff"): ["Walking Stick", "Quarter Staff", "Oaken Staff"],
("weapon", "bow"): ["Short Bow", "Hunting Bow", "Recurve Bow"],
("weapon", "gun"): ["Blunderbuss", "Flintlock", "Hunting Rifle"],
}
# Named items. `kind` is the armour type for armour, the weapon type for weapons.
ITEMS = {
"hoggers_trousers": {"name": "Hogger's Trousers", "slot": "legs", "kind": "leather", "ilvl": 14, "q": "rare",
"sta": 0.5},
"hoggers_gauntlets": {"name": "Hogger's Gauntlets", "slot": "hands", "kind": "mail", "ilvl": 14, "q": "rare",
"sta": 0.6},
"hoggers_cleaver": {"name": "Hogger's Cleaver", "slot": "weapon", "kind": "axe", "ilvl": 14, "q": "rare",
"sta": 0.3},
"chausses_of_westfall": {"name": "Chausses of Westfall", "slot": "legs", "kind": "mail", "ilvl": 22, "q": "rare",
"sta": 0.6},
"tunic_of_westfall": {"name": "Tunic of Westfall", "slot": "chest", "kind": "leather", "ilvl": 22, "q": "rare",
"sta": 0.4},
"staff_of_westfall": {"name": "Staff of Westfall", "slot": "weapon", "kind": "staff", "ilvl": 22, "q": "rare",
"sta": 0.3},
# The Deadmines
"rhahkzors_hammer": {"name": "Rhahk'Zor's Hammer", "slot": "weapon", "kind": "mace", "ilvl": 20, "q": "rare",
"sta": 0.4},
"ironjaw_bracers": {"name": "Ironjaw's Bracers", "slot": "hands", "kind": "mail", "ilvl": 20, "q": "rare",
"sta": 0.6},
"buzzer_blade": {"name": "Buzzer Blade", "slot": "weapon", "kind": "dagger", "ilvl": 21, "q": "rare", "sta": 0.2},
"gold_flecked_gloves": {"name": "Gold-flecked Gloves", "slot": "hands", "kind": "cloth", "ilvl": 21, "q": "rare",
"sta": 0.3},
"buzzsaw": {"name": "Buzzsaw", "slot": "weapon", "kind": "sword", "ilvl": 21, "q": "rare", "sta": 0.3},
"smelting_pants": {"name": "Smelting Pants", "slot": "legs", "kind": "leather", "ilvl": 21, "q": "rare",
"sta": 0.4},
"gilnids_robe": {"name": "Gilnid's Smelting Robe", "slot": "chest", "kind": "cloth", "ilvl": 21, "q": "rare",
"sta": 0.3},
"smites_reaver": {"name": "Smite's Reaver", "slot": "weapon", "kind": "axe", "ilvl": 22, "q": "rare", "sta": 0.4},
"thiefs_blade": {"name": "Thief's Blade", "slot": "weapon", "kind": "sword", "ilvl": 22, "q": "rare", "sta": 0.2},
"smites_mighty_hammer": {"name": "Smite's Mighty Hammer", "slot": "weapon", "kind": "mace", "ilvl": 22, "q": "rare",
"sta": 0.3},
"cruel_barb": {"name": "Cruel Barb", "slot": "weapon", "kind": "sword", "ilvl": 24, "q": "rare", "sta": 0.2},
"cape_of_the_brotherhood": {"name": "Cape of the Brotherhood", "slot": "back", "kind": "cloth", "ilvl": 24,
"q": "rare", "sta": 0.4},
"blackened_defias_armor": {"name": "Blackened Defias Armor", "slot": "chest", "kind": "leather", "ilvl": 24,
"q": "rare", "sta": 0.3},
"corsairs_overshirt": {"name": "Corsair's Overshirt", "slot": "chest", "kind": "cloth", "ilvl": 23, "q": "rare",
"sta": 0.3},
"vancleefs_helm": {"name": "VanCleef's Battlehelm", "slot": "head", "kind": "mail", "ilvl": 24, "q": "rare",
"sta": 0.6},
"emberstone_staff": {"name": "Emberstone Staff", "slot": "weapon", "kind": "staff", "ilvl": 23, "q": "rare",
"sta": 0.3},
"defias_hunting_bow": {"name": "Defias Hunting Bow", "slot": "weapon", "kind": "bow", "ilvl": 22, "q": "rare",
"sta": 0.3},
"blackened_defias_gloves": {"name": "Blackened Defias Gloves", "slot": "hands", "kind": "leather", "ilvl": 19,
"q": "uncommon", "sta": 0.4},
"blackened_defias_boots": {"name": "Blackened Defias Boots", "slot": "feet", "kind": "leather", "ilvl": 19,
"q": "uncommon", "sta": 0.4},
"miners_cape": {"name": "Miner's Cape", "slot": "back", "kind": "cloth", "ilvl": 19, "q": "uncommon", "sta": 0.5},
"foremans_boots": {"name": "Foreman's Boots", "slot": "feet", "kind": "mail", "ilvl": 19, "q": "uncommon",
"sta": 0.6},
"silk_mask": {"name": "Squallshaper's Hood", "slot": "head", "kind": "cloth", "ilvl": 20, "q": "uncommon",
"sta": 0.4},
}
# Each boss gives every player one roll at its table, so nobody fights over loot.
BOSS_LOOT = {
"rhahkzor": ["rhahkzors_hammer", "ironjaw_bracers", "foremans_boots"],
"sneed": ["buzzer_blade", "gold_flecked_gloves", "buzzsaw", "blackened_defias_gloves"],
"gilnid": ["smelting_pants", "gilnids_robe", "blackened_defias_boots", "defias_hunting_bow"],
"mr_smite": ["smites_reaver", "thiefs_blade", "smites_mighty_hammer", "silk_mask"],
"edwin_vancleef": ["cruel_barb", "cape_of_the_brotherhood", "blackened_defias_armor", "corsairs_overshirt",
"vancleefs_helm", "emberstone_staff"],
}
BOSS_LOOT_CHANCE = 0.6 # each player's chance at something they can use, per boss
TRASH_LOOT = ["blackened_defias_gloves", "blackened_defias_boots", "miners_cape", "foremans_boots", "silk_mask"]
TRASH_LOOT_CHANCE = 0.08