656 lines
48 KiB
Python
656 lines
48 KiB
Python
"""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"},
|
|
"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 -------------------------------------------------------------
|
|
|
|
# Hunts are fights you can repeat. `pulls` are the packs a hunt draws from.
|
|
PLACES = {
|
|
"northshire_abbey": {"name": "Northshire Abbey", "zone": "Elwynn Forest", "hub": True, "lv": (1, 5),
|
|
"links": {"northshire_valley": 1, "northshire_vineyards": 1, "echo_ridge": 1,
|
|
"goldshire": 4}},
|
|
"northshire_valley": {"name": "Northshire Valley", "zone": "Elwynn Forest", "lv": (1, 3),
|
|
"hunts": {"young_wolf": [["young_wolf"]], "kobold_vermin": [["kobold_vermin"]]},
|
|
"links": {"northshire_abbey": 1}},
|
|
"northshire_vineyards": {"name": "Northshire Vineyards", "zone": "Elwynn Forest", "lv": (3, 5),
|
|
"hunts": {"defias_thug": [["defias_thug"]],
|
|
"garrick_padfoot": [["garrick_padfoot", "defias_thug"]]},
|
|
"links": {"northshire_abbey": 1}},
|
|
"echo_ridge": {"name": "Echo Ridge Mine", "zone": "Elwynn Forest", "lv": (3, 5),
|
|
"hunts": {"kobold_worker": [["kobold_worker"]], "kobold_laborer": [["kobold_laborer"]]},
|
|
"links": {"northshire_abbey": 1}},
|
|
"goldshire": {"name": "Goldshire", "zone": "Elwynn Forest", "hub": True, "lv": (5, 10),
|
|
"links": {"northshire_abbey": 4, "fargodeep": 2, "crystal_lake": 2, "brackwell": 3,
|
|
"forests_edge": 3, "sentinel_hill": 7}},
|
|
"fargodeep": {"name": "Fargodeep Mine", "zone": "Elwynn Forest", "lv": (6, 8),
|
|
"hunts": {"kobold_tunneler": [["kobold_tunneler"]],
|
|
"kobold_miner": [["kobold_miner"], ["kobold_miner", "kobold_tunneler"]]},
|
|
"links": {"goldshire": 2}},
|
|
"crystal_lake": {"name": "Crystal Lake", "zone": "Elwynn Forest", "lv": (7, 9),
|
|
"hunts": {"murloc_streamrunner": [["murloc_streamrunner"]],
|
|
"murloc_forager": [["murloc_forager"], ["murloc_forager", "murloc_streamrunner"]]},
|
|
"links": {"goldshire": 2}},
|
|
"brackwell": {"name": "Brackwell Pumpkin Patch", "zone": "Elwynn Forest", "lv": (8, 10),
|
|
"hunts": {"defias_bandit": [["defias_bandit"]],
|
|
"princess": [["princess", "porcine_entourage", "porcine_entourage"]]},
|
|
"links": {"goldshire": 3, "forests_edge": 2}},
|
|
"forests_edge": {"name": "Forest's Edge", "zone": "Elwynn Forest", "lv": (9, 11),
|
|
"hunts": {"riverpaw_gnoll": [["riverpaw_gnoll"], ["riverpaw_gnoll", "riverpaw_mystic"]],
|
|
"hogger": [["hogger"]]},
|
|
"links": {"goldshire": 3, "brackwell": 2, "sentinel_hill": 5}},
|
|
"sentinel_hill": {"name": "Sentinel Hill", "zone": "Westfall", "hub": True, "lv": (10, 20),
|
|
"links": {"goldshire": 7, "forests_edge": 5, "saldeans_farm": 2, "molsen_farm": 2,
|
|
"dust_plains": 3, "gold_coast": 3, "moonbrook": 3}},
|
|
"saldeans_farm": {"name": "Saldean's Farm", "zone": "Westfall", "lv": (10, 13),
|
|
"hunts": {"harvest_watcher": [["harvest_watcher"]],
|
|
"young_fleshripper": [["young_fleshripper"]], "goretusk": [["goretusk"]]},
|
|
"links": {"sentinel_hill": 2}},
|
|
"molsen_farm": {"name": "The Molsen Farm", "zone": "Westfall", "lv": (12, 14),
|
|
"hunts": {"defias_trapper": [["defias_trapper"]],
|
|
"defias_smuggler": [["defias_smuggler"], ["defias_smuggler", "defias_trapper"]]},
|
|
"links": {"sentinel_hill": 2}},
|
|
"dust_plains": {"name": "The Dust Plains", "zone": "Westfall", "lv": (14, 16),
|
|
"hunts": {"riverpaw_brute": [["riverpaw_brute"], ["riverpaw_brute", "riverpaw_herbalist"]]},
|
|
"links": {"sentinel_hill": 3, "dagger_hills": 2}},
|
|
"gold_coast": {"name": "Gold Coast Quarry", "zone": "Westfall", "lv": (15, 16),
|
|
"hunts": {"murloc_coastrunner": [["murloc_coastrunner"], ["murloc_coastrunner", "murloc_tidecaller"]]},
|
|
"links": {"sentinel_hill": 3}},
|
|
"moonbrook": {"name": "Moonbrook", "zone": "Westfall", "lv": (16, 18), "dungeon": "deadmines",
|
|
"hunts": {"defias_pillager": [["defias_pillager"], ["defias_looter", "defias_pillager"]],
|
|
"defias_looter": [["defias_looter"]]},
|
|
"links": {"sentinel_hill": 3, "dagger_hills": 2}},
|
|
"dagger_hills": {"name": "The Dagger Hills", "zone": "Westfall", "lv": (17, 19),
|
|
"hunts": {"defias_pathstalker": [["defias_pathstalker"]],
|
|
"defias_highwayman": [["defias_highwayman"], ["defias_highwayman", "defias_pathstalker"]]},
|
|
"links": {"moonbrook": 2, "dust_plains": 2}},
|
|
}
|
|
|
|
GRAVEYARD = {"Elwynn Forest": "goldshire", "Westfall": "sentinel_hill"}
|
|
|
|
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": [{"visit": "goldshire"}], "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": "sentinel_hill"}], "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
|