Terraria: 1.4.4 and Calamity support (#3847)

* Terraria integration

* Precollected items for debugging

* Fix item classification

* Golem requires Plantera's Bulb

* Pumpkin Moon requires Dungeon

* Progressive Dungeon

* Reorg, Options.py work

* Items are boss flags

* Removed unused option

* Removed nothing

* Wall, Plantera, and Zenith goals

* Achievements and items

* Fixed The Cavalry and Completely Awesome achievements

* Made "Dead Men Tell No Tales" a grindy achievement

* Some docs, Python 3.8 compat

* docs

* Fix extra item and "Head in the Clouds" being included when achievements are disabled

* Requested changes

* Fix potential thread unsafety, replace Nothing with 50 Silver

* Remove a log

* Corrected heading

* Added incompatible mods list

* In-progress calamity integration

* Terraria events progress

* Rules use events

* Removed an intentional crash I accidentally left in

* Fixed infinite loop

* Moved rules to data file

* Moved item rewards to data file

* Generating from data file

* Fixed broken Mech Boss goal

* Changes Calamity makes to vanilla rules, Calamity final bosses goal

* Added Deerclops, fixed Zenith goal

* Final detailed vanilla pass

* Disable calamity goals

* Typo

* Fixed some reward items not adding to item pool

* In-progress unit test fixes

* Unit test fixes

* `.apworld` compat

* Organized rewards file, made Frog Leg and Fllpper available in vanilla

* Water Walking Boots and Titan Glove rewards

* Add goals to slot data

* Fixed Hammush logic in Post-Mech goal

* Fixed coin rewards

* Updated Terraria docs

* Formatted

* Deathlink in-progress

* Boots of the Hero is grindy

* Fixed zenith goal not placing an item

* Address review

* Gelatin World Tour is grindy

* Difficulty notice

* Switched some achievements' grindiness

* Added "Hey! Listen!" achievement

* Terarria Python 3.8 compat

* Fixed Terraria You and What Army logic

* Calamity minion accessories

* Typo

* Calamity integration

* `deathlink` -> `death_link`

Co-authored-by: Zach Parks <zach@alliware.com>

* Missing `.`

Co-authored-by: Zach Parks <zach@alliware.com>

* Incorrect type annotation

Co-authored-by: Zach Parks <zach@alliware.com>

* `deathlink` -> `death_link` 2

Co-authored-by: Zach Parks <zach@alliware.com>

* Style

Co-authored-by: Zach Parks <zach@alliware.com>

* Markdown style

Co-authored-by: Zach Parks <zach@alliware.com>

* Markdown style 2

Co-authored-by: Zach Parks <zach@alliware.com>

* Address review

* Fix bad merge

* Terraria utility mod recommendations

* Calamity minion armor logic

* ArmorMinions -> Armor Minions, boss rush goal, fixed unplaced item

* Fixed unplaced item

* Started on Terraria 1.4.4

* Crate logic

* getfixedboi, 1.4.4 achievements, shimmer, town slimes, `Rule`, `Condition`, etc

* More clam getfixedboi logic, bar decraft logic, `NotGetfixedboi` -> `Not Getfixedboi`

* Calamity fixes

* Calamity crate ore logic

* Fixed item accessibility not generating in getfixedboi, fixed not generating with incompatible options, fixed grindy function

* Early achievements, separate achievement category options

* Infinity +1 Sword achievement can be location in later goals

* The Frequent Flyer is impossible in Calamity getfixedboi

* Add Enchanted Sword and Starfury for starting inventories

* Don't Dread on Me is redundant in Calamity

* In Calamity getfixedboi, Queen Bee summons enemies who drop Plague Cell Canisters

* Can't use Gelatin Crystal outside Hallow

* You can't get the Terminus without flags

* Typo

* Options difficult warnings

* Robbing the Grave is Hardmode

* Don't reserve an ID for unused Victory item

* Plantera is accessible early in Calamity via Giant Plantera's Bulbs

* Unshuffled Life Crystal and Defender Medal items

* Comment about Midas' Blessing

* Update worlds/terraria/Options.py

Co-authored-by: Scipio Wright <scipiowright@gmail.com>

* Remove stray expression

Co-authored-by: Scipio Wright <scipiowright@gmail.com>

* Review suggestions

* Option naming caps consistency, add Laser Drill, Lunatic Cultist alt reqs, fix Eldritch Soul Artifact, Ceaseless Void reqs Dungeon

* Cal Clone doesn't drop Broken Hero Sword anymore, Laser Drill is weaker in Calamity

Co-authored-by: Seatori <92278897+Seatori@users.noreply.github.com>

* Fix Acid Rain logic

* Fix XB-∞ Hekate failing accessibility checks (by commenting it out bc it doesn't affect logic)

* Hardmode ores being fishable early in Calamity is not a bug anymore

* Mecha Mayhem is inaccessible in getfixedboi

* Update worlds/terraria/Rules.dsv

Co-authored-by: Seafo <92278897+Seatori@users.noreply.github.com>

---------

Co-authored-by: Fabian Dill <Berserker66@users.noreply.github.com>
Co-authored-by: Zach Parks <zach@alliware.com>
Co-authored-by: Scipio Wright <scipiowright@gmail.com>
Co-authored-by: Seatori <92278897+Seatori@users.noreply.github.com>
This commit is contained in:
Seldom
2025-04-15 06:51:05 -07:00
committed by GitHub
parent ec1e113b4c
commit 1873c52aa6
5 changed files with 661 additions and 381 deletions

View File

@@ -157,24 +157,57 @@ COND_FN = 2
COND_GROUP = 3
class Condition:
def __init__(
self,
# True = positive, False = negative
sign: bool,
# See the `COND_*` constants
type: int,
# Condition name or list
condition: Union[str, Tuple[Union[bool, None], List["Condition"]]],
argument: Union[str, int, None],
):
self.sign = sign
self.type = type
self.condition = condition
self.argument = argument
class Rule:
def __init__(
self,
name: str,
# Name to arg
flags: Dict[str, Union[str, int, None]],
# True = or, False = and, None = N/A
operator: Union[bool, None],
conditions: List[Condition],
):
self.name = name
self.flags = flags
self.operator = operator
self.conditions = conditions
def validate_conditions(
rule: str,
rule_indices: dict,
conditions: List[
Tuple[
bool, int, Union[str, Tuple[Union[bool, None], list]], Union[str, int, None]
]
],
conditions: List[Condition],
):
for _, type, condition, _ in conditions:
if type == COND_ITEM:
if condition not in rule_indices:
raise Exception(f"item `{condition}` in `{rule}` is not defined")
elif type == COND_LOC:
if condition not in rule_indices:
raise Exception(f"location `{condition}` in `{rule}` is not defined")
elif type == COND_FN:
if condition not in {
for condition in conditions:
if condition.type == COND_ITEM:
if condition.condition not in rule_indices:
raise Exception(
f"item `{condition.condition}` in `{rule}` is not defined"
)
elif condition.type == COND_LOC:
if condition.condition not in rule_indices:
raise Exception(
f"location `{condition.condition}` in `{rule}` is not defined"
)
elif condition.type == COND_FN:
if condition.condition not in {
"npc",
"calamity",
"grindy",
@@ -182,43 +215,48 @@ def validate_conditions(
"hammer",
"mech_boss",
"minions",
"getfixedboi",
}:
raise Exception(f"function `{condition}` in `{rule}` is not defined")
elif type == COND_GROUP:
_, conditions = condition
raise Exception(
f"function `{condition.condition}` in `{rule}` is not defined"
)
elif condition.type == COND_GROUP:
_, conditions = condition.condition
validate_conditions(rule, rule_indices, conditions)
def mark_progression(
conditions: List[
Tuple[
bool, int, Union[str, Tuple[Union[bool, None], list]], Union[str, int, None]
]
],
conditions: List[Condition],
progression: Set[str],
rules: list,
rule_indices: dict,
loc_to_item: dict,
):
for _, type, condition, _ in conditions:
if type == COND_ITEM:
prog = condition in progression
progression.add(loc_to_item[condition])
_, flags, _, conditions = rules[rule_indices[condition]]
for condition in conditions:
if condition.type == COND_ITEM:
prog = condition.condition in progression
progression.add(loc_to_item[condition.condition])
rule = rules[rule_indices[condition.condition]]
if (
not prog
and "Achievement" not in flags
and "Location" not in flags
and "Item" not in flags
and "Achievement" not in rule.flags
and "Location" not in rule.flags
and "Item" not in rule.flags
):
mark_progression(
conditions, progression, rules, rule_indices, loc_to_item
rule.conditions, progression, rules, rule_indices, loc_to_item
)
elif type == COND_LOC:
_, _, _, conditions = rules[rule_indices[condition]]
mark_progression(conditions, progression, rules, rule_indices, loc_to_item)
elif type == COND_GROUP:
_, conditions = condition
elif condition.type == COND_LOC:
mark_progression(
rules[rule_indices[condition.condition]].conditions,
progression,
rules,
rule_indices,
loc_to_item,
)
elif condition.type == COND_GROUP:
_, conditions = condition.condition
mark_progression(conditions, progression, rules, rule_indices, loc_to_item)
@@ -226,29 +264,7 @@ def read_data() -> Tuple[
# Goal to rule index that ends that goal's range and the locations required
List[Tuple[int, Set[str]]],
# Rules
List[
Tuple[
# Rule
str,
# Flag to flag arg
Dict[str, Union[str, int, None]],
# True = or, False = and, None = N/A
Union[bool, None],
# Conditions
List[
Tuple[
# True = positive, False = negative
bool,
# Condition type
int,
# Condition name or list (True = or, False = and, None = N/A) (list shares type with outer)
Union[str, Tuple[Union[bool, None], List]],
# Condition arg
Union[str, int, None],
]
],
]
],
List[Rule],
# Rule to rule index
Dict[str, int],
# Label to rewards
@@ -379,7 +395,7 @@ def read_data() -> Tuple[
unexpected(line, char, id, token, pos, POS_FMT, "Rules.dsv")
elif pos == COND_OR_SEMI:
if id == IDENT:
conditions.append((sign, COND_ITEM, token, None))
conditions.append(Condition(sign, COND_ITEM, token, None))
sign = True
pos = POST_COND
elif id == HASH:
@@ -424,14 +440,14 @@ def read_data() -> Tuple[
)
condition = operator, conditions
sign, operator, conditions = outer.pop()
conditions.append((sign, COND_GROUP, condition, None))
conditions.append(Condition(sign, COND_GROUP, condition, None))
sign = True
pos = POST_COND
else:
unexpected(line, char, id, token, pos, POS_FMT, "Rules.dsv")
elif pos == COND:
if id == IDENT:
conditions.append((sign, COND_ITEM, token, None))
conditions.append(Condition(sign, COND_ITEM, token, None))
sign = True
pos = POST_COND
elif id == HASH:
@@ -449,7 +465,7 @@ def read_data() -> Tuple[
unexpected(line, char, id, token, pos, POS_FMT, "Rules.dsv")
elif pos == LOC:
if id == IDENT:
conditions.append((sign, COND_LOC, token, None))
conditions.append(Condition(sign, COND_LOC, token, None))
sign = True
pos = POST_COND
else:
@@ -464,10 +480,10 @@ def read_data() -> Tuple[
if id == LPAREN:
pos = FN_ARG
elif id == SEMI:
conditions.append((sign, COND_FN, function, None))
conditions.append(Condition(sign, COND_FN, function, None))
pos = END
elif id == AND:
conditions.append((sign, COND_FN, function, None))
conditions.append(Condition(sign, COND_FN, function, None))
sign = True
if operator is True:
raise Exception(
@@ -476,7 +492,7 @@ def read_data() -> Tuple[
operator = False
pos = COND
elif id == OR:
conditions.append((sign, COND_FN, function, None))
conditions.append(Condition(sign, COND_FN, function, None))
sign = True
if operator is False:
raise Exception(
@@ -485,21 +501,21 @@ def read_data() -> Tuple[
operator = True
pos = COND
elif id == RPAREN:
conditions.append((sign, COND_FN, function, None))
conditions.append(Condition(sign, COND_FN, function, None))
if not outer:
raise Exception(
f"found `)` at {line + 1}:{char + 1} without matching `(`"
)
condition = operator, conditions
sign, operator, conditions = outer.pop()
conditions.append((sign, COND_GROUP, condition, None))
conditions.append(Condition(sign, COND_GROUP, condition, None))
sign = True
pos = POST_COND
else:
unexpected(line, char, id, token, pos, POS_FMT, "Rules.dsv")
elif pos == FN_ARG:
if id == IDENT or id == NUM:
conditions.append((sign, COND_FN, function, token))
conditions.append(Condition(sign, COND_FN, function, token))
sign = True
pos = FN_ARG_END
else:
@@ -527,7 +543,33 @@ def read_data() -> Tuple[
f"rule `{name}` on line `{line + 1}` shadows a previous rule"
)
rule_indices[name] = len(rules)
rules.append((name, flags, operator, conditions))
rules.append(Rule(name, flags, operator, conditions))
for flag in flags:
if flag not in {
"Location",
"Item",
"Goal",
"Early",
"Achievement",
"Grindy",
"Fishing",
"Npc",
"Pickaxe",
"Hammer",
"Minions",
"Armor Minions",
"Mech Boss",
"Final Boss",
"Getfixedboi",
"Not Getfixedboi",
"Calamity",
"Not Calamity",
"Not Calamity Getfixedboi",
}:
raise Exception(
f"rule `{name}` on line `{line + 1}` has unrecognized flag `{flag}`"
)
if "Item" in flags:
item_name = flags["Item"] or f"Post-{name}"
@@ -558,7 +600,7 @@ def read_data() -> Tuple[
final_bosses.append(flags["Item"] or f"Post-{name}")
final_boss_loc.append(name)
if (minions := flags.get("ArmorMinions")) is not None:
if (minions := flags.get("Armor Minions")) is not None:
armor_minions[name] = minions
if (minions := flags.get("Minions")) is not None:
@@ -572,16 +614,19 @@ def read_data() -> Tuple[
goal_indices[goal] = len(goals)
goals.append((len(rules), set()))
for name, flags, _, _ in rules:
if "Goal" in flags:
_, items = goals[
goal_indices[
name.translate(str.maketrans("", "", string.punctuation))
for rule in rules:
if "Goal" in rule.flags:
if (name := rule.flags.get("Goal")) is not None:
goal_name = name
else:
goal_name = (
rule.name.translate(str.maketrans("", "", string.punctuation))
.replace(" ", "_")
.lower()
]
]
items.add(name)
)
_, items = goals[goal_indices[goal_name]]
items.add(rule.name)
_, mech_boss_items = goals[goal_indices["mechanical_bosses"]]
mech_boss_items.update(mech_boss_loc)
@@ -589,24 +634,27 @@ def read_data() -> Tuple[
_, final_boss_items = goals[goal_indices["calamity_final_bosses"]]
final_boss_items.update(final_boss_loc)
for name, _, _, conditions in rules:
validate_conditions(name, rule_indices, conditions)
for rule in rules:
validate_conditions(rule.name, rule_indices, rule.conditions)
for name, flags, _, conditions in rules:
for rule in rules:
prog = False
if (
"Npc" in flags
or "Goal" in flags
or "Pickaxe" in flags
or "Hammer" in flags
or "Mech Boss" in flags
or "Minions" in flags
or "ArmorMinions" in flags
"Npc" in rule.flags
or "Goal" in rule.flags
or "Pickaxe" in rule.flags
or "Hammer" in rule.flags
or "Mech Boss" in rule.flags
or "Final Boss" in rule.flags
or "Minions" in rule.flags
or "Armor Minions" in rule.flags
):
progression.add(loc_to_item[name])
progression.add(loc_to_item[rule.name])
prog = True
if prog or "Location" in flags or "Achievement" in flags:
mark_progression(conditions, progression, rules, rule_indices, loc_to_item)
if prog or "Location" in rule.flags or "Achievement" in rule.flags:
mark_progression(
rule.conditions, progression, rules, rule_indices, loc_to_item
)
# Will be randomized via `slot_randoms` / `self.multiworld.random`
label = None
@@ -685,16 +733,15 @@ def read_data() -> Tuple[
next_id += 1
item_name_to_id["Reward: Coins"] = next_id
item_name_to_id["Victory"] = next_id + 1
next_id += 2
next_id += 1
location_name_to_id = {}
for name, flags, _, _ in rules:
if "Location" in flags or "Achievement" in flags:
if name in location_name_to_id:
raise Exception(f"location `{name}` shadows a previous location")
location_name_to_id[name] = next_id
for rule in rules:
if "Location" in rule.flags or "Achievement" in rule.flags:
if rule.name in location_name_to_id:
raise Exception(f"location `{rule.name}` shadows a previous location")
location_name_to_id[rule.name] = next_id
next_id += 1
return (

View File

@@ -1,40 +1,70 @@
from dataclasses import dataclass
from Options import Choice, DeathLink, PerGameCommonOptions
from Options import Choice, DeathLink, PerGameCommonOptions, Toggle, DefaultOnToggle
class Calamity(Toggle):
"""Calamity mod bosses and events are shuffled"""
display_name = "Calamity Mod Integration"
class Getfixedboi(Toggle):
"""Generation accomodates the secret, very difficult "getfixedboi" seed"""
display_name = """"getfixedboi" Seed"""
class Goal(Choice):
"""The victory condition for your run. Stuff after the goal will not be shuffled."""
"""
The victory condition for your run. Stuff after the goal will not be shuffled.
Primordial Wyrm and Boss Rush are accessible relatively early, so consider "Items" or
"Locations" accessibility to avoid getting stuck on the goal.
"""
display_name = "Goal"
option_mechanical_bosses = 0
# option_calamitas_clone = 1
option_calamitas_clone = 1
option_plantera = 2
option_golem = 3
option_empress_of_light = 4
option_lunatic_cultist = 5
# option_astrum_deus = 6
option_astrum_deus = 6
option_moon_lord = 7
# option_providence_the_profaned_goddess = 8
# option_devourer_of_gods = 9
# option_yharon_dragon_of_rebirth = 10
option_providence_the_profaned_goddess = 8
option_devourer_of_gods = 9
option_yharon_dragon_of_rebirth = 10
option_zenith = 11
# option_calamity_final_bosses = 12
# option_adult_eidolon_wyrm = 13
option_calamity_final_bosses = 12
option_primordial_wyrm = 13
option_boss_rush = 14
default = 0
class Achievements(Choice):
class EarlyAchievements(DefaultOnToggle):
"""Adds checks upon collecting early Pre-Hardmode achievements. Adds many sphere 1 checks."""
display_name = "Early Pre-Hardmode Achievements"
class NormalAchievements(DefaultOnToggle):
"""
Adds checks upon collecting achievements. Achievements for clearing bosses and events are excluded.
"Exclude Grindy" also excludes fishing achievements.
Adds checks upon collecting achivements not covered by the other options. Achievements for
clearing bosses and events are excluded.
"""
display_name = "Achievements"
option_none = 0
option_exclude_grindy = 1
option_exclude_fishing = 2
option_all = 3
default = 1
display_name = "Normal Achievements"
class GrindyAchievements(Toggle):
"""Adds checks upon collecting grindy achievements"""
display_name = "Grindy Achievements"
class FishingAchievements(Toggle):
"""Adds checks upon collecting fishing quest achievements"""
display_name = "Fishing Quest Achievements"
class FillExtraChecksWith(Choice):
@@ -51,7 +81,12 @@ class FillExtraChecksWith(Choice):
@dataclass
class TerrariaOptions(PerGameCommonOptions):
calamity: Calamity
getfixedboi: Getfixedboi
goal: Goal
achievements: Achievements
early_achievements: EarlyAchievements
normal_achievements: NormalAchievements
grindy_achievements: GrindyAchievements
fishing_achievements: FishingAchievements
fill_extra_checks_with: FillExtraChecksWith
death_link: DeathLink

View File

@@ -121,10 +121,9 @@ Corrupt Flask; Calamity;
Crimson Flask; Calamity;
Craw Carapace; Calamity;
Giant Shell; Calamity;
Fungal Carapace; Calamity;
Life Jelly; Calamity;
Vital Jelly; Calamity;
Mana Jelly; Calamity;
Cleansing Jelly; Calamity;
Giant Tortoise Shell; Calamity;
Coin of Deceit; Calamity;
Ink Bomb; Calamity;
@@ -151,4 +150,11 @@ Depths Charm; Calamity;
Anechoic Plating; Calamity;
Iron Boots; Calamity;
Sprit Glyph; Calamity;
Abyssal Amulet; Calamity;
Abyssal Amulet; Calamity;
# unshuffled
Life Crystal;
Enchanted Sword;
Starfury;
Defender Medal;

View File

@@ -1,43 +1,57 @@
// TODO Calamity minion armor
// For the logic to account for all skips, these rules would need to be made much more comprehensive
// Starting gear
Copper Shortsword;
Guide; Npc;
// Immediately accessible
Timber!!; Achievement;
Benched; Achievement;
Stop! Hammer Time!; Achievement;
Matching Attire; Achievement;
Fashion Statement; Achievement;
Ooo! Shiny!; Achievement;
No Hobo; Achievement;
Squire Slime; Npc;
Traveling Merchant; ; @npc(2);
Lifeform Analyzer; ; Traveling Merchant;
DPS Meter; ; Traveling Merchant | (@calamity & Wire);
Stopwatch; ; Traveling Merchant;
Timber!!; Achievement | Early;
Benched; Achievement | Early;
Stop! Hammer Time!; Achievement | Early;
Matching Attire; Achievement | Early;
Fashion Statement; Achievement | Early;
Ooo! Shiny!; Achievement | Early;
No Hobo; Achievement | Early; // When NPC shuffling is added, this shouldn't be considered early
Merchant; Npc;
Bug Net; ; @calamity | Merchant;
Heavy Metal; Achievement;
Nurse; Npc; Merchant;
The Frequent Flyer; Achievement; Nurse;
Demolitionist; Npc; Merchant;
Heavy Metal; Achievement | Early;
Dye Trader; Npc; @npc(4);
Dye Hard; Achievement; Dye Trader;
Lucky Break; Achievement;
Star Power; Achievement;
You Can Do It!; Achievement;
Demolitionist; Npc; Merchant;
Lucky Break; Achievement | Early;
Star Power; Achievement | Early;
You Can Do It!; Achievement | Early;
Wulfrum Battery; Calamity;
Wulfrum Armor; Calamity | Armor Minions(1);
// Surface exploration
Cactus;
Unusual Survival Strategies; Achievement | Early;
Aglet;
Radar;
Wand of Sparking;
Heliophobia; Achievement;
Blighted Gel; Calamity;
Evil Powder;
Archaeologist; Achievement | Grindy;
Zoologist; Npc;
Cat; Npc; Zoologist;
Feeling Petty; Achievement; Cat | Dog;
Dog; Npc; Zoologist;
Painter; Npc; @npc(8);
A Rather Blustery Day; Achievement | Grindy;
Enchanted Sword;
Pretty in Pink; Achievement | Grindy;
Marathon Medalist; Achievement | Grindy;
Angler; Npc;
Fisherman's Pocket Guide; ; Angler | Weather Radio;
Weather Radio; ; Angler | Sextant;
Sextant; ; Angler | Fisherman's Pocket Guide;
Servant-in-Training; Achievement | Fishing; Angler;
\10 Fishing Quests; Achievement | Fishing; Angler;
Trout Monkey; Achievement | Fishing; Angler;
@@ -45,52 +59,69 @@ Glorious Golden Pole; Achievement | Fishing;
Fast and Fishious; Achievement | Fishing; Angler;
Supreme Helper Minion!; Achievement | Fishing; Angler;
Water Walking Boots;
Painter; Npc; @npc(8);
Aquatic Heart; Calamity;
// Sky exploration
Into Orbit; Achievement;
Into Orbit; Achievement | Early;
Mysterious Circuitry; Calamity;
Dubious Plating; Calamity;
Charging Station; Calamity;
Codebreaker Base; Calamity;
Starfury;
Celestial Magnet;
Clumsy Slime; Npc;
// Underground
Watch Your Step!; Achievement;
Throwing Lines; Achievement;
Watch Your Step!; Achievement | Early;
Throwing Lines; Achievement | Early;
Torch God; Location | Item(Reward: Torch God's Favor);
Vehicular Manslaughter; Achievement;
Hey! Listen!; Achievement;
Vehicular Manslaughter; Achievement | Early;
Ancient Bone Dust; Calamity;
Depth Meter;
Compass;
Hey! Listen!; Achievement | Early;
I Am Loot!; Achievement;
Magic Mirror;
Heart Breaker; Achievement;
Hold on Tight!; Achievement;
Nurse; Npc; Merchant;
The Frequent Flyer; Not Calamity Getfixedboi | Achievement; Nurse;
Feast of Midas; Achievement; Bug Net;
Hold on Tight!; Achievement | Early;
Feller of Evergreens; Calamity;
Gold Hammer; Hammer(55);
Gold Pickaxe; Pickaxe(55);
Gold Watch;
Like a Boss; Achievement;
Hermes Boots;
Jeepers Creepers; Achievement;
Stylist; Npc;
Funkytown; Achievement;
Deceiver of Fools; Achievement | Grindy;
Metal Detector;
Dead Men Tell No Tales; Achievement;
Bulldozer; Achievement | Grindy;
// Cavern
Obsidian;
Obsidian Skull; ; Obsidian;
Raider's Talisman; Calamity; Obsidian;
There are Some Who Call Him...; Achievement | Grindy;
Lava Charm;
Demonite Ore;
Demonite Bar; ; Demonite Ore | (@calamity & #Calamity Evil Boss);
Demonite Bar; ; Demonite Ore;
Evil Sword; ; Demonite Bar;
Coin of Deceit; Calamity; Demonite Bar | Ruin Medallion;
// Underground Ice
Ice Skates;
Flinx Fur Coat; ArmorMinions(1);
Flinx Fur Coat; Armor Minions(1);
// Underground Desert
Stormlion Mandible; Calamity;
Golfer; Npc;
Party Girl; Npc; @npc(14);
Jolly Jamboree; Achievement | Grindy; Party Girl;
Cool Slime; Npc; Party Girl;
// Sunken Sea
Sea Prism; Calamity;
@@ -98,37 +129,50 @@ Navyplate; Calamity;
// Underground Jungle
Anklet of the Wind;
Feral Claws;
Stinger;
Jungle Spores;
Vine;
Blade of Grass; ; Stinger & Jungle Spores & Vine;
Nature's Gift;
Bezoar;
Summoning Potion; Minions(1);
// The Aether
A Shimmer In The Dark; Achievement;
// Underworld
It's Getting Hot in Here; Achievement;
Rock Bottom; Achievement;
Obsidian Rose;
Havocplate; Calamity;
Magma Stone;
// Evil
Smashing, Poppet!; Achievement;
Arms Dealer; Npc;
Leading Landlord; Achievement; Nurse & Arms Dealer; // The logic is way more complex, but that doesn't affect anything
Completely Awesome; Achievement; Arms Dealer;
Illegal Gun Parts; ; Arms Dealer | Flamethrower;
// Abyss
Ink Bomb; Calamity;
// King Slime
King Slime; Location | Item;
Sticky Situation; Achievement | Grindy;
Sticky Situation; Not Getfixedboi | Achievement | Grindy;
The Cavalry; Achievement;
Solidifier; ; #King Slime;
Nerdy Slime; Npc; #King Slime;
// Desert Scourge
Desert Scourge; Calamity | Location | Item;
Pearl Shard; Calamity; #Desert Scourge;
Sea Remains; Calamity; Pearl Shard;
Reefclaw Hamaxe; Calamity | Hammer(60); Sea Remains;
Victide Armor; Calamity | Armor Minions(1); Sea Remains;
Sandstorm; ; ~@calamity | Desert Scourge;
Voltaic Jelly; Calamity | Minions(1); Desert Scourge; // Jelly-Charged Battery doesn't stack. This is the case for all Calamity minion accessory upgrades.
Voltaic Jelly; Calamity | Minions(1); Desert Scourge | Jelly-Charged Battery; // Jelly-Charged Battery doesn't stack. This is the case for all Calamity minion accessory upgrades.
// Giant Clam
Giant Clam; Calamity | Location | Item; Desert Scourge;
@@ -136,18 +180,21 @@ Amidias; Calamity;
// Blood Moon
Bloodbath; Achievement | Grindy;
Blood Orb; Calamity;
Shark Tooth Necklace;
Til Death...; Achievement | Grindy;
Quiet Neighborhood; Achievement;
Quiet Neighborhood; Achievement | Early;
Surly Slime; Npc;
// Eye of Cthulhu
Eye of Cthulhu; Location | Item;
Dryad; Npc; Eye of Cthulhu | Evil Boss | Skeletron;
Pumpkin Seeds; ; Dryad;
Pumpkin; ; Pumpkin Seeds;
Purification Powder; ; Dryad; // Shimmered from Evil Powder in 1.4.4. Not bought from Dryad in get fixed boi.
Party Girl; Npc; @npc(14);
Jolly Jamboree; Achievement | Grindy; Party Girl;
Acid Rain Tier 1; Calamity | Location | Item; Eye of Cthulhu;
Pumpkin; ; Pumpkin Seeds | Cactus;
Purification Powder; ; (~@getfixedboi & Dryad) | Evil Powder;
Mystic Slime; Npc; Purification Powder;
And Good Riddance!; Achievement | Grindy; Dryad;
Acid Rain Tier 1; Calamity | Location | Item; Eye of Cthulhu | Wall of Flesh | Aquatic Scourge;
// Crabulon
Crabulon; Calamity | Location | Item;
@@ -156,112 +203,160 @@ Crabulon; Calamity | Location | Item;
Evil Boss; Location | Item;
Evil Boss Part; ; #Evil Boss;
Evil Pickaxe; Pickaxe(65); Evil Boss Part;
Obsidian Armor; ArmorMinions(1); Obsidian & Evil Boss Part;
Obsidian Armor; Armor Minions(1); Obsidian & Evil Boss Part;
Tavernkeep; Npc; Evil Boss;
Old One's Army Tier 1; Location | Item; Tavernkeep;
Meteorite; ; Evil Boss;
Meteorite Bar; ; Meteorite;
Meteorite; ; #Evil Boss | Evil Boss | Meteorite Bar | (@calamity & Astral Infection);
Meteorite Bar; ; Meteorite | (@calamity & Astral Infection) | Meteor Staff;
Meteor Hamaxe; Hammer(60); Meteorite Bar;
Hellforge; ; @pickaxe(60);
Hellstone; ; @pickaxe(65) | Wall of Flesh;
Hellstone; ; @pickaxe(65) | Wall of Flesh | Hellstone Bar;
Hellstone Bar; ; Hellstone;
Fiery Greatsword; ; Hellstone Bar;
Molten Hamaxe; Hammer(70); Hellstone Bar;
Molten Pickaxe; Pickaxe(100); Hellstone Bar;
Miner for Fire; Achievement; Molten Pickaxe;
Hot Reels!; Achievement; Hellstone Bar & Bug Net; // TODO Calamity
Hot Reels!; Achievement; Hellstone Bar & (@calamity | Bug Net);
Brimstone Slag; Calamity; @pickaxe(100);
// Goblin Army
Goblin Army; Location | Item;
Goblin Tinkerer; Npc; Goblin Army;
Tinkerer's Workshop; ; Goblin Tinkerer;
Mana Flower; ; (Tinkerer's Workshop & Nature's Gift) | (@calamity & Ethereal Talisman);
Silencing Sheath; Calamity; (Tinkerer's Workshop & Demonite Bar & Evil Boss Part) | Dark Matter Sheath;
Rocket Boots; ; Goblin Tinkerer;
Spectre Boots; ; Tinkerer's Workshop & Hermes Boots & Rocket Boots;
Lightning Boots; ; Tinkerer's Workshop & Spectre Boots & Anklet of the Wind & Aglet;
Frostspark Boots; ; Tinkerer's Workshop & Lightning Boots & Ice Skates;
Lava Waders; ; Tinkerer's Workshop & Obsidian Skull & Lava Charm & Obsidian Rose & Water Walking Boots;
Terraspark Boots; ; Tinkerer's Workshop & Frostspark Boots & Lava Waders;
GPS; ; Tinkerer's Workshop & Depth Meter & Gold Watch & Compass;
Goblin Tech; ; Tinkerer's Workshop & DPS Meter & Stopwatch & Metal Detector;
Fish Finder; ; Tinkerer's Workshop & Fisherman's Pocket Guide & Weather Radio & Sextant;
Boots of the Hero; Achievement | Grindy; Terraspark Boots;
Diving Gear; ; Tinkerer's Workshop;
// Queen Bee
Where's My Honey?; Achievement;
Queen Bee; Location | Item;
Bee Keeper; ; #Queen Bee;
Bee Wax; ; #Queen Bee;
Bee Armor; ArmorMinions(2); Bee Wax;
Bee Armor; Armor Minions(2); Bee Wax;
Not the Bees!; Achievement; #Queen Bee & Bee Armor;
Witch Doctor; Npc; Queen Bee;
Pygmy Necklace; Minions(1); Witch Doctor;
Pygmy Necklace; Minions(1); Witch Doctor | (@calamity & Statis' Blessing);
// Calamity Evil Boss
Calamity Evil Boss; Calamity | Location | Item;
Aerialite Ore; Calamity; Calamity Evil Boss & @pickaxe(65);
Aerialite Bar; Calamity; Aerialite Ore;
The Hive Mind; Calamity | Location | Item;
The Perforators; Calamity | Location | Item;
Blood Sample; Calamity; #The Perforators;
Aerialite Ore; Calamity; The Hive Mind | The Perforators | Cobalt Ore | Aerialite Bar; // No pick needed; can be fished
Aerialite Bar; Calamity; Aerialite Ore | Feather Crown;
Aerial Hamaxe; Calamity | Hammer(70); Aerialite Bar;
Skyfringe Pickaxe; Calamity | Pickaxe(75); Aerialite Bar;
Aerospec Armor; Calamity | Armor Minions(1); Aerialite Bar;
Feather Crown; Calamity; Aerialite Bar | Moonstone Crown;
// Skeletron
Skeletron; Location | Item;
Clothier; Npc; Skeletron;
Dungeon; ; Skeletron;
Dungeon Heist; Achievement; Dungeon;
Bone; ; Dungeon | (@calamity & #Skeletron);
Bewitching Table; Minions(1); Dungeon | (Witch Doctor & Wizard);
Bone; ; Dungeon | (@calamity & (#Skeletron | (@getfixedboi & #Ravager) | Mirage Mirror));
Mirage Mirror; Calamity; (Tinkerer's Workshop & Bone) | Abyssal Mirror;
Tally Counter; ; Dungeon;
R.E.K. 3000; ; Tinkerer's Workshop & Radar & Tally Counter & Lifeform Analyzer;
PDA; ; Tinkerer's Workshop & GPS & R.E.K. 3000 & Goblin Tech & Fish Finder;
Cell Phone; ; (Tinkerer's Workshop & Magic Mirror & PDA) | (@getfixedboi & @calamity & #Polterghast);
Black Mirror; Achievement | Grindy; Cell Phone;
Bewitching Table; Minions(1); Dungeon | (Witch Doctor & Wizard) | Alchemy Table;
Alchemy Table; ; Dungeon | Bewitching Table;
Mechanic; ; Dungeon;
Wire; ; Mechanic;
Wire; ; Mechanic | (@calamity & Electrician's Glove);
Decryption Computer; Calamity; Mysterious Circuitry & Dubious Plating & Wire;
Actuator; ; Mechanic;
Muramasa; ; Dungeon;
Cobalt Shield; ; Dungeon | (@calamity & Cobalt Bar);
Obsidian Shield; ; Tinkerer's Workshop & Cobalt Shield & Obsidian Skull;
Elder Slime; Npc; Skeletron & Dungeon;
// Deerclops
Deerclops; Location | Item;
// The Slime God
The Slime God; Calamity | Location | Item; Blighted Gel;
Purified Gel; Calamity; #The Slime God;
Purified Gel; Calamity; #The Slime God | Jelly-Charged Battery;
Jelly-Charged Battery; Calamity; (Wulfrum Battery & Voltaic Jelly & Purified Gel & Stormlion Mandible) | Star-Tainted Generator;
Static Refiner; Calamity; Purified Gel & Solidifier;
Gelpick; Calamity | Pickaxe(100); Static Refiner & Purified Gel & Blighted Gel;
Statigel Armor; Calamity | Armor Minions(1); Static Refiner & Purified Gel & Blighted Gel;
Night's Edge; ; Evil Sword & Muramasa & Blade of Grass & Fiery Greatsword & (~@calamity | Purified Gel);
// Wall of Flesh
Wall of Flesh; Location | Item(Hardmode); Guide;
Pwnhammer; Hammer(80); #Wall of Flesh;
Emblem; ; #Wall of Flesh | Avenger Emblem | (@calamity & (Mechanical Glove | Celestial Emblem | Statis' Blessing));
Fast Clock; ; Wall of Flesh | Trifold Map | (@calamity & Wire & Pixie Dust & Soul of Light);
Wizard; Npc; Wall of Flesh;
Tax Collector; Npc; Purification Powder & Wall of Flesh;
Titan Glove; ; Wall of Flesh | Power Glove;
Power Glove; ; Tinkerer's Workshop & Titan Glove & Feral Claws;
Magic Quiver; ; Wall of Flesh | (@calamity & Elemental Quiver);
Hallowed Seeds; ; (Wall of Flesh & Dryad) | Holy Water;
Armor Polish; ; Wall of Flesh | Vitamins | (@calamity & Bone & Ancient Bone Dust);
Adhesive Bandage; ; @calamity | Wall of Flesh;
Medicated Bandage; ; Tinkerer's Workshop & Bezoar & Adhesive Bandage;
Megaphone; ; Wall of Flesh | Nazar | (@calamity & Wire & Cobalt Bar);
Pocket Mirror; ; Wall of Flesh | Blindfold | (@calamity & Crystal Shard & Soul of Night);
Trifold Map; ; Wall of Flesh | Fast Clock | (@calamity & Soul of Light & Soul of Night);
The Plan; ; Tinkerer's Workshop & Trifold Map & Fast Clock;
Tax Collector; Npc; (Purification Powder & Wall of Flesh) | @getfixedboi;
Spider Fangs; ; Wall of Flesh;
Spider Armor; ArmorMinions(3); Spider Fangs;
Spider Armor; Armor Minions(3); Spider Fangs;
Cross Necklace; ; Wall of Flesh;
Altar; ; Wall of Flesh & @hammer(80);
Begone, Evil!; Achievement; Altar;
Cobalt Ore; ; (((~@calamity & Altar) | (@calamity & Wall of Flesh)) & @pickaxe(100)) | Wall of Flesh;
Cobalt Ore; ; (((~@calamity & Altar) | (@calamity & Wall of Flesh)) & @pickaxe(100)) | Wall of Flesh | Mythril Ore | Cobalt Bar;
Extra Shiny!; Achievement; Cobalt Ore | Mythril Ore | Adamantite Ore | Chlorophyte Ore;
Cobalt Bar; ; Cobalt Ore | Wall of Flesh;
Cobalt Bar; ; Cobalt Ore | (@calamity & Lunic Eye) | Wall of Flesh;
Cobalt Pickaxe; Pickaxe(110); Cobalt Bar;
Soul of Night; ; Wall of Flesh | (@calamity & Altar);
Blindfold; ; @calamity | Wall of Flesh | Pocket Mirror;
Reflective Shades; ; Tinkerer's Workshop & Blindfold & Pocket Mirror;
Vitamins; ; Wall of Flesh | Armor Polish | (@calamity & Alchemy Table & Blood Orb);
Armor Bracing; ; Tinkerer's Workshop & Vitamins & Armor Polish;
Nazar; ; Wall of Flesh | Megaphone | (@calamity & Soul of Night);
Countercurse Mantra; ; Tinkerer's Workshop & Nazar & Megaphone;
Ankh Charm; ; Tinkerer's Workshop & Reflective Shades & Armor Bracing & Medicated Bandage & Countercurse Mantra & The Plan;
Ankh Shield; ; Tinkerer's Workshop & Obsidian Shield & Ankh Charm;
Ankhumulation Complete; Achievement | Grindy; Ankh Shield;
Soul of Night; ; Wall of Flesh | (@calamity & (Altar | (@getfixedboi & #Duke Fishron)));
Hallow; ; Wall of Flesh;
Pixie Dust; ; Hallow;
Pixie Dust; ; Hallow | Meteor Staff | Holy Water;
Holy Water; ; (Pixie Dust & Hallowed Seeds) | (@calamity & Statis' Blessing);
Unicorn Horn; ; Hallow;
Crystal Shard; ; Hallow;
Axe of Purity; Calamity; Feller of Evergreens & Purification Powder & Pixie Dust & Crystal Shard;
Soul of Light; ; Hallow | (@calamity & #Queen Slime);
Fabsol's Vodka; Calamity; (Pixie Dust & Crystal Shard & Unicorn Horn) | (@getfixedboi & #Empress of Light);
Soul of Light; ; Hallow | (@calamity & (#Queen Slime | (@getfixedboi & #Duke Fishron))) | Light Disc | Meteor Staff;
Meteor Staff; ; (Hardmode Anvil & Meteorite Bar & Pixie Dust & Soul of Light) | Asteroid Staff;
Blessed Apple; ; Hallow;
Rod of Discord; ; Hallow;
Gelatin World Tour; Achievement | Grindy; Dungeon & Wall of Flesh & Hallow & #King Slime;
Soul of Flight; ; Wall of Flesh;
Head in the Clouds; Achievement; @grindy | (Soul of Flight & ((Hardmode Anvil & (Soul of Light | Soul of Night | Pixie Dust | Wall of Flesh | Solar Eclipse | @mech_boss(1) | Plantera | Spectre Bar | #Golem)) | (Shroomite Bar & Autohammer) | #Mourning Wood | #Pumpking)) | Steampunker | (Wall of Flesh & Witch Doctor) | (Solar Eclipse & Plantera) | #Everscream | #Old One's Army Tier 3 | #Empress of Light | #Duke Fishron | (Fragment & Luminite Bar & Ancient Manipulator); // Leaf Wings are Post-Plantera in 1.4.4
Head in the Clouds; Achievement; @grindy | (Soul of Flight & ((Hardmode Anvil & (Soul of Light | Soul of Night | Pixie Dust | Wall of Flesh | Solar Eclipse | @mech_boss(1) | Plantera | Spectre Bar | #Golem)) | (Shroomite Bar & Autohammer) | #Mourning Wood | #Pumpking)) | Steampunker | (Wall of Flesh & Plantera & Witch Doctor) | (Solar Eclipse & Plantera) | #Everscream | #Old One's Army Tier 3 | #Empress of Light | #Duke Fishron | (Fragment & Luminite Bar & Ancient Manipulator);
Bunny; Npc; Zoologist & Wall of Flesh; // Extremely simplified
Forbidden Fragment; ; Sandstorm & Wall of Flesh;
Astral Infection; Calamity; Wall of Flesh;
Stardust; Calamity; Astral Infection | #Astrum Aureus | #Astrum Deus;
Astral Infection; Calamity; Wall of Flesh | Astrum Aureus;
Stardust; Calamity; Astral Infection | #Astrum Aureus | #Astrum Deus | Eye of Magnus | Meld Construct;
Lunic Eye; Calamity; (Cobalt Bar & Stardust) | Eye of Magnus;
Trapper Bulb; Calamity; Wall of Flesh;
Titan Heart; Calamity; Astral Infection;
Essence of Sunlight; Calamity; Wall of Flesh | Golem;
Essence of Eleum; Calamity; Wall of Flesh | Cryogen | #Cryogen; // TODO Check
Essence of Havoc; Calamity; Wall of Flesh | #Calamitas Clone | #Brimstone Elemental;
Don't Dread on Me; Achievement; Wall of Flesh;
Earth Elemental; Calamity | Location | Item; Wall of Flesh;
Cloud Elemental; Calamity | Location | Item; Wall of Flesh;
Essence of Eleum; Calamity; Wall of Flesh | Cryogen | #Cryogen | (@getfixedboi & #Duke Fishron);
Essence of Havoc; Calamity; Wall of Flesh | #Calamitas Clone | #Brimstone Elemental | Ruin Medallion;
Dreadnautilus; Calamity | Location | Item; Wall of Flesh;
Don't Dread on Me; Not Calamity | Achievement; Wall of Flesh;
Hardmode Giant Clam; Calamity | Location | Item; #Giant Clam & Wall of Flesh;
Truffle; Npc; Wall of Flesh;
It Can Talk?!; Achievement; Truffle;
The First Shadowflame; Calamity | Minions(1); Goblin Army | Wall of Flesh;
@@ -271,103 +366,125 @@ Pirate Invasion; Location | Item;
Pirate; Npc; Pirate Invasion;
// Queen Slime
Queen Slime; Location | Item; Hallow;
Queen Slime; Location | Item; Hallow | (@getfixedboi & @calamity & #Supreme Alchemist, Cirrus);
Sparkle Slime Balloon; ; #Queen Slime;
Diva Slime; Npc; Sparkle Slime Balloon;
The Great Slime Mitosis; Achievement; Nerdy Slime & Cool Slime & Elder Slime & Clumsy Slime & Diva Slime & Surly Slime & Mystic Slime & Squire Slime;
// Aquatic Scourge
Mythril Ore; ; (((~@calamity & Altar) | (@calamity & @mech_boss(1))) & @pickaxe(110)) | (Wall of Flesh & (~@calamity | @mech_boss(1)));
Mythril Bar; ; Mythril Ore | (Wall of Flesh & (~@calamity | @mech_boss(1)));
Mythril Ore; ; (((~@calamity & Altar) | (@calamity & @mech_boss(1))) & @pickaxe(110)) | Wall of Flesh | Adamantite Ore | Mythril Bar;
Mythril Bar; ; Mythril Ore | Wall of Flesh | (@calamity & Electrician's Glove);
Hardmode Anvil; ; Mythril Bar;
Mythril Pickaxe; Pickaxe(150); Hardmode Anvil & Mythril Bar;
Adamantite Ore; ; (((~@calamity & Altar) | (@calamity & @mech_boss(2))) & @pickaxe(150)) | (Wall of Flesh & (~@calamity | @mech_boss(2)));
Electrician's Glove; Calamity; (Hardmode Anvil & Wire & Mythril Bar) | Nanotech;
Adamantite Ore; ; (((~@calamity & Altar) | (@calamity & @mech_boss(2))) & @pickaxe(150)) | Wall of Flesh | (~@calamity & Chlorophyte Ore) | Adamantite Bar | (@calamity & Hallowed Ore);
Hardmode Forge; ; Hardmode Anvil & Adamantite Ore & Hellforge;
Adamantite Bar; ; (Hardmode Forge & Adamantite Ore) | (Wall of Flesh & (~@calamity | @mech_boss(2)));
Adamantite Bar; ; (Hardmode Forge & Adamantite Ore) | Wall of Flesh;
Adamantite Pickaxe; Pickaxe(180); Hardmode Anvil & Adamantite Bar;
Forbidden Armor; ArmorMinions(2); Hardmode Anvil & Adamantite Bar & Forbidden Fragment;
Forbidden Armor; Armor Minions(2); Hardmode Anvil & Adamantite Bar & Forbidden Fragment;
Aquatic Scourge; Calamity | Location | Item;
The Twins; Location | Item | Mech Boss; (@calamity | Hardmode Anvil) & Soul of Light;
Brimstone Elemental; Calamity | Location | Item; Soul of Night & Essence of Havoc & Unholy Core;
The Destroyer; Location | Item | Mech Boss; (@calamity | Hardmode Anvil) & Soul of Night;
Cryogen; Calamity | Location | Item; Soul of Night & Soul of Light & Essence of Eleum;
Skeletron Prime; Location | Item | Mech Boss; (@calamity | Hardmode Anvil) & Soul of Night & Soul of Light & Bone;
# mechanical_bosses
Cragmaw Mire; Calamity | Location | Item; #Acid Rain Tier 2;
Nuclear Rod; Calamity | Minions(1); #Cragmaw Mire;
Acid Rain Tier 2; Calamity | Location | Item; #Acid Rain Tier 1 & Aquatic Scourge;
Nuclear Fuel Rod; Calamity | Minions(1); #Cragmaw Mire | Star-Tainted Generator;
Acid Rain Tier 2; Calamity | Location | Item; #Acid Rain Tier 1 & (Aquatic Scourge | Acid Rain Tier 3);
Mechanical Eye; ; (@calamity | Hardmode Anvil) & Soul of Light;
Mechanical Worm; ; (@calamity | Hardmode Anvil) & Soul of Night;
Mechanical Skull; ; (@calamity | Hardmode Anvil) & Soul of Night & Soul of Light & Bone;
Ocram's Razor; Getfixedboi; (@calamity | Hardmode Anvil) & Mechanical Eye & Mechanical Worm & Mechanical Skull;
The Twins; Location | Item | Mech Boss; (~@getfixedboi & Mechanical Eye) | (@getfixedboi & Ocram's Razor);
Brimstone Elemental; Calamity | Location | Item; Soul of Night & Essence of Havoc & Unholy Core;
The Destroyer; Location | Item | Mech Boss; (~@getfixedboi & Mechanical Worm) | (@getfixedboi & Ocram's Razor);
Cryogen; Calamity | Location | Item; Soul of Night & Soul of Light & Essence of Eleum;
Skeletron Prime; Location | Item | Mech Boss; (~@getfixedboi & Mechanical Skull) | (@getfixedboi & Ocram's Razor);
# mechanical_bosses
// The Twins
Soul of Sight; ; #The Twins;
Soul of Sight; ; #The Twins | Avenger Emblem | (@calamity & (Mechanical Glove | Celestial Emblem));
Steampunker; Npc; @mech_boss(1);
Hammush; ; Truffle & @mech_boss(1);
Rainbow Rod; ; Hardmode Anvil & Crystal Shard & Unicorn Horn & Pixie Dust & Soul of Light & Soul of Sight;
Prismancer; Achievement; Rainbow Rod;
Long Ranged Sensor Array; Calamity; Hardmode Anvil & Mysterious Circuitry & Dubious Plating & Mythril Bar & Wire & Decryption Computer & Codebreaker Base;
Hydraulic Volt Crusher; Calamity; Hardmode Anvil & Mysterious Circuitry & Dubious Plating & Mythril Bar & Soul of Sight;
Life Fruit; ; (@mech_boss(1) & Wall of Flesh) | (@calamity & (Living Shard | Wall of Flesh));
Life Fruit; ; (@mech_boss(1) & Wall of Flesh) | (@calamity & (Living Shard | Wall of Flesh | (@getfixedboi & #Plantera)));
Get a Life; Achievement; Life Fruit;
Topped Off; Achievement; Life Fruit;
Old One's Army Tier 2; Location | Item; #Old One's Army Tier 1 & ((Wall of Flesh & @mech_boss(1)) | #Old One's Army Tier 3);
// Brimstone Elemental
Infernal Suevite; Calamity; @pickaxe(150) | Brimstone Elemental;
Unholy Core; Calamity; Infernal Suevite & Hellstone;
Unholy Core; Calamity; (Infernal Suevite & Hellstone) | Brimstone Elemental;
Ruin Medallion; Calamity; (Hardmode Anvil & Coin of Deceit & Unholy Core & Essence of Havoc) | Dark Matter Sheath;
// The Destroyer
Soul of Might; ; #The Destroyer;
Soul of Might; ; #The Destroyer | Avenger Emblem | Light Disc | (@calamity & (Mechanical Glove | Celestial Emblem));
// Cryogen
Cryonic Ore; Calamity; Cryogen & (@pickaxe(180) | @mech_boss(2));
Cryonic Bar; Calamity; (Hardmode Forge & Cryonic Ore) | Fleshy Geode | Necromantic Geode;
Cryonic Ore; Calamity; (Cryogen & (@pickaxe(180) | @mech_boss(2))) | Cryonic Bar;
Cryonic Bar; Calamity; (Hardmode Forge & Cryonic Ore) | Fleshy Geode | Necromantic Geode | (Cryogen & @mech_boss(2)) | Life Alloy;
Abyssal Warhammer; Calamity | Hammer(88); Hardmode Anvil & Cryonic Bar;
Shardlight Pickaxe; Calamity | Pickaxe(180); Hardmode Anvil & Cryonic Bar;
Daedalus Armor; Calamity | Armor Minions(2); Hardmode Anvil & Cryonic Bar & Essence of Eleum;
// Skeletron Prime
Soul of Fright; ; #Skeletron Prime;
Soul of Fright; ; #Skeletron Prime | Avenger Emblem | Flamethrower | (@calamity & (Mechanical Glove | Celestial Emblem));
Inferna Cutter; Calamity; Hardmode Anvil & Axe of Purity & Soul of Fright & Essence of Havoc;
Flamethrower; ; (Hardmode Anvil & Illegal Gun Parts & Soul of Fright) | (@getfixedboi & @calamity & #Skeletron);
Buckets of Bolts; Achievement; #The Twins & #The Destroyer & #Skeletron Prime;
Mecha Mayhem; Achievement; #The Twins & #The Destroyer & #Skeletron Prime;
Hallowed Bar; ; (#The Twins | #The Destroyer | #Skeletron Prime) & (~@calamity | @mech_boss(3)); // Can't count on Hallowed Ore, since the player may be in prehardmode (TODO Check this)
Hallowed Armor; ArmorMinions(3); Hardmode Anvil & Hallowed Bar;
Mecha Mayhem; Achievement | Not Getfixedboi; #The Twins & #The Destroyer & #Skeletron Prime;
Hallowed Ore; Calamity; (@mech_boss(3) & @pickaxe(180)) | Chlorophyte Ore | Hallowed Bar;
Hallowed Bar; ; ((#The Twins | #The Destroyer | #Skeletron Prime) & (~@calamity | @mech_boss(3))) | (@calamity & Hardmode Forge & Hallowed Ore) | Light Disc;
Hallowed Armor; Armor Minions(3); Hardmode Anvil & Hallowed Bar;
Excalibur; ; Hardmode Anvil & Hallowed Bar;
Pickaxe Axe; Pickaxe(200); Hardmode Anvil & Hallowed Bar & Soul of Fright & Soul of Might & Soul of Sight;
Drax Attax; Achievement; Pickaxe Axe;
True Night's Edge; ; Hardmode Anvil & Night's Edge & Soul of Fright & Soul of Might & Soul of Sight;
Chlorophyte Ore; ; Wall of Flesh & @pickaxe(200);
Avenger Emblem; ; (Tinkerer's Workshop & Emblem & Soul of Might & Soul of Sight & Soul of Fright) | (@calamity & (Sand Shark Tooth Necklace | Sigil of Calamitas)) | (~@calamity & (Mechanical Glove | Celestial Emblem));
Mechanical Glove; ; (Power Glove & ((~@calamity & Tinkerer's Workshop & Avenger Emblem) | (@calamity & Emblem & Soul of Fright & Soul of Might & Soul of Sight))) | Fire Gauntlet;
Celestial Emblem; ; (Celestial Magnet & ((~@calamity & Tinkerer's Workshop & Avenger Emblem) | (@calamity & Emblem & Soul of Fright & Soul of Might & Soul of Sight))) | Sigil of Calamitas;
Light Disc; ; (Hallowed Bar & Soul of Light & Soul of Might) | (@getfixedboi & @calamity & #Evil Boss);
Chlorophyte Ore; ; (Wall of Flesh & @pickaxe(200)) | (~@calamity & Luminite) | Chlorophyte Bar | (@calamity & Perennial Ore);
Photosynthesis; Achievement; Chlorophyte Ore;
Chlorophyte Bar; ; Hardmode Forge & Chlorophyte Ore;
Chlorophyte Bar; ; (Hardmode Forge & Chlorophyte Ore) | Spectre Bar | Shroomite Bar;
True Excalibur; ; Hardmode Anvil & Excalibur & Chlorophyte Bar;
Chlorophyte Pickaxe; Pickaxe(200); Hardmode Anvil & Chlorophyte Bar;
Chlorophyte Warhammer; Hammer(90); Hardmode Anvil & Chlorophyte Bar;
// Calamitas Clone
Calamitas Clone; Calamity | Location | Item | Goal; Hardmode Anvil & Hellstone Bar & Essence of Havoc;
Plantera; Location | Item | Goal; Wall of Flesh & (@mech_boss(3) | (@calamity & Hardmode Anvil & Trapper Bulb));
Plantera; Location | Item | Goal; Wall of Flesh & (@mech_boss(3) | @calamity);
# calamitas_clone
# plantera
Ashes of Calamity; Calamity; #Calamitas Clone;
Ashes of Calamity; Calamity; #Calamitas Clone | Sigil of Calamitas;
Depth Cells; Calamity; Calamitas Clone | Abyssal Mirror;
Lumenyl; Calamity; Calamitas Clone | Abyssal Mirror;
Abyssal Mirror; Calamity; (Hardmode Anvil & Mirage Mirror & Ink Bomb & Depth Cells & Lumenyl) | Eclipse Mirror;
Fathom Swarmer Armor; Calamity | Armor Minions(2); Hardmode Anvil & Sea Remains & Depth Cells;
// Plantera
The Axe; Hammer(100); #Plantera;
Seedler; ; #Plantera;
Living Shard; Calamity; #Plantera;
Tiki Armor; ArmorMinions(4); Witch Doctor & Wall of Flesh & Plantera;
Tiki Armor; Armor Minions(4); Witch Doctor & Wall of Flesh & Plantera;
Hercules Beetle; ; Witch Doctor & Wall of Flesh & Plantera;
You and What Army?; Achievement; @minions(8);
Cyborg; Npc; Plantera;
To Infinity... and Beyond!; Achievement; Cyborg & Wall of Flesh;
Autohammer; ; Truffle & Plantera;
Shroomite Bar; ; Autohammer & Chlorophyte Bar;
Shroomite Digging Claw; Pickaxe(200); Hardmode Anvil & Shroomite Bar;
Princess; Npc; Guide & Merchant & Nurse & Demolitionist & Dye Trader & Zoologist & Angler & Painter & Stylist & Golfer & Arms Dealer & Dryad & Party Girl & Tavernkeep & Goblin Tinkerer & Witch Doctor & Clothier & Wizard & Truffle & Tax Collector & Pirate & Steampunker & Cyborg;
Real Estate Agent; Achievement; Princess;
Ectoplasm; ; ((Dungeon & Wall of Flesh) | @calamity) & Plantera;
Ectoplasm; ; (((Dungeon & Wall of Flesh) | @calamity) & Plantera) | Spectre Bar;
Paladin's Shield; ; Dungeon & Wall of Flesh & Plantera;
Core of Sunlight; Calamity; (Hardmode Anvil & Essence of Sunlight & Ectoplasm) | Fleshy Geode | Necromantic Geode;
Core of Eleum; Calamity; (Hardmode Anvil & Essence of Eleum & Ectoplasm) | Fleshy Geode | Necromantic Geode;
Core of Havoc; Calamity; (Hardmode Anvil & Essence of Havoc & Ectoplasm) | Fleshy Geode | Necromantic Geode;
Core of Calamity; Calamity; (Hardmode Anvil & Core of Sunlight & Core of Eleum & Core of Havoc & Ashes of Calamity) | Necromantic Geode;
Core of Sunlight; Calamity; (Hardmode Anvil & Essence of Sunlight & Ectoplasm) | Fleshy Geode | Necromantic Geode | Core of Calamity | Statis' Blessing;
Core of Eleum; Calamity; (Hardmode Anvil & Essence of Eleum & Ectoplasm) | Fleshy Geode | Necromantic Geode | Core of Calamity;
Core of Havoc; Calamity; (Hardmode Anvil & Essence of Havoc & Ectoplasm) | Fleshy Geode | Necromantic Geode | Core of Calamity;
Core of Calamity; Calamity; (Hardmode Anvil & Core of Sunlight & Core of Eleum & Core of Havoc & Ashes of Calamity) | Necromantic Geode | Deadshot Brooch;
Deadshot Brooch; Calamity; (Hardmode Anvil & Emblem & Core of Calamity) | Elemental Quiver;
Spectre Bar; ; Hardmode Forge & Chlorophyte Bar & Ectoplasm;
Spectre Pickaxe; Pickaxe(200); Hardmode Anvil & Spectre Bar;
Spectre Hamaxe; Hammer(90); Hardmode Anvil & Spectre Bar;
Robbing the Grave; Achievement; Dungeon & Plantera;
Robbing the Grave; Achievement; Dungeon & Wall of Flesh & Plantera;
Evil Key; ; Plantera | (@calamity & #Wall of Flesh);
Frozen Key; ; Plantera | (@calamity & #Cryogen);
Jungle Key; ; Plantera | (@calamity & #Plantera);
@@ -376,22 +493,25 @@ Desert Key; ;
Big Booty; Achievement; Dungeon & Wall of Flesh & Plantera & (Evil Key | Frozen Key | Jungle Key | Hallowed Key | Desert Key);
Rainbow Gun; ; Dungeon & Wall of Flesh & Plantera & Hallowed Key;
Rainbows and Unicorns; Achievement; Blessed Apple & Rainbow Gun;
Perennial Ore; Calamity; Plantera;
Perennial Bar; Calamity; Hardmode Forge & Perennial Ore;
Perennial Ore; Calamity; Plantera | Perennial Bar;
Perennial Bar; Calamity; (Hardmode Forge & Perennial Ore) | Plantera | Life Alloy;
Beastial Pickaxe; Calamity | Pickaxe(200); Hardmode Anvil & Perennial Bar;
Armored Digger; Calamity | Location | Item; Plantera; // TODO Check
// Solar Eclipse
Temple Raider; Achievement; #Plantera;
Lihzahrd Temple; ; #Plantera | (Plantera & Actuator) | @pickaxe(210) | (@calamity & Hardmode Anvil & Soul of Light & Soul of Night);
Lihzahrd Furniture; ; Lihzahrd Temple;
Solar Eclipse; ; Lihzahrd Temple & Wall of Flesh;
Broken Hero Sword; ; (Solar Eclipse & Plantera & @mech_boss(3)) | (@calamity & #Calamitas Clone);
Broken Hero Sword; ; Solar Eclipse & Plantera & @mech_boss(3);
Terra Blade; ; Hardmode Anvil & True Night's Edge & True Excalibur & Broken Hero Sword & (~@calamity | Living Shard);
Sword of the Hero; Achievement; Terra Blade;
Neptune's Shell; ; Solar Eclipse;
Kill the Sun; Achievement; Solar Eclipse;
// Great Sand Shark
Great Sand Shark; Calamity | Location | Item; Hardmode Anvil & Forbidden Fragment & Core of Sunlight;
Grand Scale; Calamity; #Great Sand Shark | Sand Shark Tooth Necklace;
Sand Shark Tooth Necklace; Calamity; (Tinkerer's Workshop & Shark Tooth Necklace & Avenger Emblem & Grand Scale) | (@getfixedboi & #Desert Scourge);
// Leviathan and Anahita
Leviathan and Anahita; Calamity | Location | Item;
@@ -404,32 +524,40 @@ Starbuster Core; Calamity | Minions(1);
Golem; Location | Item | Goal; (Wall of Flesh & Plantera & Lihzahrd Temple) | (@calamity & Hardmode Anvil & Lihzahrd Temple & Essence of Sunlight);
# golem
Picksaw; Pickaxe(210); #Golem;
Lihzahrd Brick; ; @pickaxe(210);
Scoria Ore; Calamity; Golem | @pickaxe(210);
Scoria Bar; Calamity; Hardmode Forge & Scoria Ore;
Lihzahrd Brick; ; @pickaxe(210) | (Lihzahrd Furniture & Golem) | (@calamity & Lihzahrd Temple);
Scoria Ore; Calamity; Golem | @pickaxe(210) | Astral Ore | Luminite | Scoria Bar;
Scoria Bar; Calamity; (Hardmode Forge & Scoria Ore) | Golem | Life Alloy | Sigil of Calamitas | Fire Gauntlet;
Seismic Hampick; Calamity | Pickaxe(210) | Hammer(95); Hardmode Anvil & Scoria Bar;
Life Alloy; Calamity; (Hardmode Anvil & Cryonic Bar & Perennial Bar & Scoria Bar) | Necromantic Geode;
Hydrothermic Armor; Calamity | Armor Minions(2); Hardmode Anvil & Scoria Bar & Core of Havoc;
Fire Gauntlet; ; (Tinkerer's Workshop & Magma Stone & Mechanical Glove & (~@calamity | Scoria Bar)) | (@calamity & Elemental Gauntlet);
Sigil of Calamitas; Calamity; (Hardmode Anvil & Celestial Emblem & Scoria Bar & Ashes of Calamity) | Ethereal Talisman;
Life Alloy; Calamity; (Hardmode Anvil & Cryonic Bar & Perennial Bar & Scoria Bar) | Necromantic Geode | Star-Tainted Generator | (@getfixedboi & #Yharon, Dragon of Rebirth);
Advanced Display; Calamity; Hardmode Anvil & Mysterious Circuitry & Dubious Plating & Life Alloy & Long Ranged Sensor Array;
Star-Tainted Generator; Calamity; (Hardmode Anvil & Jelly-Charged Battery & Nuclear Fuel Rod & Starbuster Core & Life Alloy) | Nucleogenesis;
Old One's Army Tier 3; Location | Item; #Old One's Army Tier 1 & Wall of Flesh & Golem;
// Martian Madness
Martian Madness; Location | Item; Wall of Flesh & Golem;
Laser Drill; Pickaxe(220); #Martian Madness;
Influx Waver; ; #Martian Madness;
// The Plaguebringer Goliath
Plague Cell Canister; Calamity; Golem;
Plaguebringer; Calamity | Location | Item; Golem;
Plague Cell Canister; Calamity; Golem | Alchemical Flask | (@getfixedboi & #Queen Bee);
Alchemical Flask; Calamity; (Hardmode Anvil & Bee Wax & Plague Cell Canister) | (@getfixedboi & #Queen Bee);
The Plaguebringer Goliath; Calamity | Location | Item; Hardmode Anvil & Plague Cell Canister;
Infected Armor Plating; Calamity; #The Plaguebringer Goliath;
Plaguebringer Armor; Calamity | Armor Minions(3); Hardmode Anvil & Bee Armor & Alchemical Flask & Plague Cell Canister & Infected Armor Plating;
// Duke Fishron
Duke Fishron; Location | Item; Bug Net & Wall of Flesh;
Duke Fishron; Location | Item; (Bug Net & Wall of Flesh) | (@getfixedboi & @calamity & #Astrum Deus);
// Pumpkin Moon
Pumpkin Moon; ; Hardmode Anvil & Pumpkin & Ectoplasm & (@calamity | Hallowed Bar);
Spooky Armor; ArmorMinions(4); Pumpkin Moon;
Spooky Armor; Armor Minions(4); Pumpkin Moon;
Mourning Wood; Location | Item; Pumpkin Moon;
Necromantic Scroll; Minions(1); #Mourning Wood;
Papyrus Scarab; Minions(1); Tinkerer's Workshop & Hercules Beetle & Necromantic Scroll;
Papyrus Scarab; Minions(1); (Tinkerer's Workshop & Hercules Beetle & Necromantic Scroll) | (@calamity & Statis' Blessing);
Statis' Blessing; Calamity; (Hardmode Anvil & Papyrus Scarab & Pygmy Necklace & Emblem & Holy Water & Core of Sunlight) | Statis' Curse;
Pumpking; Location | Item; Pumpkin Moon;
The Horseman's Blade; ; #Pumpking;
Baleful Harvest; Achievement; Pumpkin Moon;
@@ -451,11 +579,11 @@ Ravager; Calamity | Location | Item;
Fleshy Geode; Calamity; #Ravager;
// Empress of Light
Empress of Light; Location | Item | Goal; Wall of Flesh & Hallow & (@calamity | Plantera);
Empress of Light; Location | Item | Goal; (Wall of Flesh & Hallow & (@calamity | Plantera)) | (@getfixedboi & @calamity & #Supreme Alchemist, Cirrus);
# empress_of_light
// Lunatic Cultist
Lunatic Cultist; Location | Item | Goal; (@calamity | (Dungeon & Golem)) & Wall of Flesh;
Lunatic Cultist; Location | Item | Goal; ((@calamity | (Dungeon & Golem)) & Wall of Flesh) | (@calamity & Calamitas Clone);
Astrum Deus; Calamity | Location | Item | Goal; Titan Heart;
# lunatic_cultist
# astrum_deus
@@ -463,111 +591,142 @@ Ancient Manipulator; ;
// Lunar Events
Lunar Events; Location | Item; #Lunatic Cultist;
Fragment; ; #Lunar Events | #Astrum Deus;
Galactica Singularity; Calamity; Ancient Manipulator & Fragment;
Meld Blob; Calamity; #Lunar Events | #Astrum Deus;
Meld Construct; Calamity; Ancient Manipulator & Meld Blob & Stardust;
Fragment; ; #Lunar Events | #Astrum Deus | (Ancient Manipulator & (Nebula Fragment | Stardust Fragment)) | (@calamity & Galactica Singularity);
Nebula Fragment; ; Fragment | (@calamity & Eye of Magnus);
Eye of Magnus; Calamity; (Ancient Manipulator & Lunic Eye & Nebula Fragment) | (@getfixedboi & #Wall of Flesh);
Stardust Fragment; ; Fragment | (@calamity & Statis' Curse);
Statis' Curse; Calamity; (Ancient Manipulator & Statis' Blessing & The First Shadowflame & Stardust Fragment) | Nucleogenesis;
Galactica Singularity; Calamity; (Ancient Manipulator & Fragment) | Elemental Gauntlet | Elemental Quiver | Nucleogenesis | Moonstone Crown | Ethereal Talisman;
Meld Blob; Calamity; #Lunar Events | #Astrum Deus | (Astral Infection & Astrum Deus) | Meld Construct;
Meld Construct; Calamity; (Ancient Manipulator & Meld Blob & Stardust) | Dark Matter Sheath;
Dark Matter Sheath; Calamity; (Ancient Manipulator & Silencing Sheath & Ruin Medallion & Meld Construct) | Eclipse Mirror;
// Astrum Deus
Astral Ore; Calamity; Wall of Flesh & Astrum Deus;
Astral Bar; Calamity; Ancient Manipulator & Stardust & Astral Ore;
Astral Ore; Calamity; (Astral Infection & Astrum Deus) | Astral Bar; // No pick needed; you can fish it
Astral Bar; Calamity; (Ancient Manipulator & Stardust & Astral Ore) | (Astral Infection & Astrum Deus);
Astral Hamaxe; Calamity | Hammer(100); Ancient Manipulator & Astral Bar;
Astral Pickaxe; Calamity | Pickaxe(220); Ancient Manipulator & Astral Bar;
Astral Armor; Calamity | Armor Minions(3); Ancient Manipulator & Astral Bar & Meteorite Bar;
// Moon Lord
Moon Lord; Location | Item | Goal; #Lunar Events;
# moon_lord
Slayer of Worlds; Achievement; #Evil Boss & #The Destroyer & #Duke Fishron & #Eye of Cthulhu & #Golem & #King Slime & #Lunatic Cultist & #Moon Lord & #Plantera & #Queen Bee & #Skeletron & #Skeletron Prime & #The Twins & #Wall of Flesh;
Luminite; ; #Moon Lord;
Luminite Bar; ; Ancient Manipulator & Luminite;
Luminite; ; #Moon Lord | (@calamity & (Exodium Cluster | Asteroid Staff)) | Luminite Bar;
Luminite Bar; ; (Ancient Manipulator & Luminite) | (@calamity & (Elemental Gauntlet | Elemental Quiver | Nucleogenesis | Moonstone Crown | Ethereal Talisman));
Luminite Hamaxe; Hammer(100); Ancient Manipulator & Fragment & Luminite Bar;
Luminite Pickaxe; Pickaxe(225); Ancient Manipulator & Fragment & Luminite Bar;
Genesis Pickaxe; Calamity | Pickaxe(225); Ancient Manipulator & Meld Construct & Luminite Bar;
Stardust Armor; ArmorMinions(5); Ancient Manipulator & Fragment & Luminite Bar;
Stardust Armor; Armor Minions(5); Ancient Manipulator & Fragment & Luminite Bar;
Asteroid Staff; Calamity; (Ancient Manipulator & Meteor Staff & Luminite Bar) | (@getfixedboi & #Astrum Aureus);
Moonstone Crown; Calamity; (Ancient Manipulator & Feather Crown & Luminite Bar & Galactica Singularity) | Nanotech;
Terrarian; ; #Moon Lord;
Sick Throw; Achievement; Terrarian;
Meowmere; ; #Moon Lord;
Star Wrath; ; #Moon Lord;
Exodium Cluster; Calamity; Moon Lord & @pickaxe(225);
Exodium Cluster; Calamity; Moon Lord | Uelibloom Ore; // No pick needed; can be fished
Normality Relocator; Calamity; Ancient Manipulator & Rod of Discord & Exodium Cluster & Fragment;
Unholy Essence; Calamity; Moon Lord | #Providence, the Profaned Goddess;
Phantoplasm; Calamity; Moon Lord & (Wall of Flesh | Dungeon); // TODO Check
Eldritch Soul Artifact; Calamity; Exodium Cluster & Navyplate & Phantoplasm;
Unholy Essence; Calamity; Moon Lord | #Providence, the Profaned Goddess | (Hallow & Providence, the Profaned Goddess) | (@getfixedboi & Plantera);
Polterplasm; Calamity; (Moon Lord & Wall of Flesh) | (Dungeon & (Polterghast | Moon Lord)) | #Polterghast;
Eldritch Soul Artifact; Calamity | Minions(1); Exodium Cluster & Navyplate & Polterplasm;
// Profaned Guardians
Profaned Guardians; Calamity | Location | Item; Ancient Manipulator & Unholy Essence & Luminite Bar;
// Dragonfolly
The Dragonfolly; Calamity | Location | Item; Ancient Manipulator & Unholy Essence & Luminite Bar;
Effulgent Feather; Calamity; Moon Lord | #The Dragonfolly;
The Dragonfolly; Calamity | Location | Item; (Ancient Manipulator & Unholy Essence & Luminite Bar) | (@getfixedboi & #Supreme Alchemist, Cirrus);
Effulgent Feather; Calamity; Moon Lord | #The Dragonfolly | (@getfixedboi & #Yharon, Dragon of Rebirth);
// Providence, the Profaned Goddess
Providence, the Profaned Goddess; Calamity | Location | Item | Goal; #Profaned Guardians;
Providence, the Profaned Goddess; Calamity | Location | Item | Goal; #Profaned Guardians | (@getfixedboi & #Supreme Alchemist, Cirrus);
# providence_the_profaned_goddess
Divine Geode; Calamity; #Providence, the Profaned Goddess;
Divine Geode; Calamity; #Providence, the Profaned Goddess | (@getfixedboi & #Profaned Guardians);
Profaned Soul Artifact; Calamity | Minions(1); Exodium Cluster & Havocplate & Divine Geode;
Rune of Kos; Calamity; #Providence, the Profaned Goddess;
Uelibloom Ore; Calamity; Providence, the Profaned Goddess;
Uelibloom Bar; Calamity; Hardmode Forge & Uelibloom Ore;
Uelibloom Ore; Calamity; Providence, the Profaned Goddess | Auric Ore | Uelibloom Bar;
Uelibloom Bar; Calamity; (Hardmode Forge & Uelibloom Ore) | Providence, the Profaned Goddess;
Grax; Calamity | Hammer(110); Ancient Manipulator & Inferna Cutter & Luminite Hamaxe & Uelibloom Bar;
Blossom Pickaxe; Calamity | Pickaxe(250); Ancient Manipulator & Uelibloom Bar;
Voltage Regulation System; Calamity; Ancient Manipulator & Mysterious Circuitry & Dubious Plating & Uelibloom Bar & Luminite Bar & Advanced Display;
Tarragon Armor; Calamity | Armor Minions(3); Ancient Manipulator & Uelibloom Bar & Divine Geode;
Necromantic Geode; Calamity; #Ravager & Providence, the Profaned Goddess;
Bloodstone; Calamity; Providence, the Profaned Goddess;
Bloodstone Core; Calamity; Hardmode Forge & Bloodstone & Polterplasm;
// Sentinels of the Devourer
Storm Weaver; Calamity | Location | Item; Rune of Kos;
Armored Shell; Calamity; #Storm Weaver;
Ceaseless Void; Calamity | Location | Item; Rune of Kos;
Ceaseless Void; Calamity | Location | Item; Dungeon & Rune of Kos;
Dark Plasma; Calamity; #Ceaseless Void;
Signus, Envoy of the Devourer; Calamity | Location | Item; Rune of Kos;
Twisting Nether; Calamity; #Signus, Envoy of the Devourer;
// Polterghast
Polterghast; Calamity | Location | Item; Dungeon & ((Ancient Manipulator & Phantoplasm) | Moon Lord);
Colossal Squid; Calamity | Location | Item;
Reaper Shark; Calamity | Location | Item;
Eidolon Wyrm; Calamity | Location | Item;
Polterghast; Calamity | Location | Item; Dungeon & ((Ancient Manipulator & Polterplasm) | Moon Lord);
Ruinous Soul; Calamity; #Polterghast;
Bloodflare Armor; Calamity | Armor Minions(3); Ancient Manipulator & Bloodstone Core & Ruinous Soul;
Reaper Tooth; Calamity; Polterghast;
Omega Blue Armor; Calamity | Armor Minions(2); Ancient Manipulator & Reaper Tooth & Depth Cells & Ruinous Soul;
// The Old Duke
Mauler; Calamity | Location | Item; #Acid Rain Tier 3;
Nuclear Terror; Calamity | Location | Item; #Acid Rain Tier 3;
Acid Rain Tier 3; Calamity | Location | Item; #Acid Rain Tier 1 & Polterghast; // TODO Check
The Old Duke; Calamity | Location | Item; #Acid Rain Tier 3 | (Bug Net & Moon Lord) | (Amidias & The Old Duke);
Mauler; Calamity | Location | Item; Acid Rain Tier 3;
Nuclear Terror; Calamity | Location | Item; Acid Rain Tier 3;
Acid Rain Tier 3; Calamity; #Acid Rain Tier 1 & Polterghast;
The Old Duke; Calamity | Location | Item; Acid Rain Tier 3 | (Bug Net & Moon Lord) | (Amidias & The Old Duke) | (@getfixedboi & #The Destroyer);
// The Devourer of Gods
The Devourer of Gods; Calamity | Location | Item | Goal; Ancient Manipulator & ((Armored Shell & Twisting Nether & Dark Plasma) | (Luminite Bar & Galactica Singularity & Phantoplasm));
The Devourer of Gods; Calamity | Location | Item | Goal; (Ancient Manipulator & ((Armored Shell & Twisting Nether & Dark Plasma) | (Luminite Bar & Galactica Singularity & Polterplasm))) | (@getfixedboi & #Supreme Alchemist, Cirrus);
# the_devourer_of_gods
Cosmilite Bar; Calamity; #The Devourer of Gods;
Cosmic Anvil; Calamity; Ancient Manipulator & Hardmode Anvil & Cosmilite Bar & Luminite Bar & Galactica Singularity & Exodium Cluster;
Nightmare Fuel; Calamity; Pumpkin Moon & The Devourer of Gods;
Nightmare Fuel; Calamity; (Pumpkin Moon & The Devourer of Gods) | Occult Skull Crown;
Occult Skull Crown; Calamity | Getfixedboi; @getfixedboi & #Evil Boss; // Revengeance or getfixedboi
Endothermic Energy; Calamity; Frost Moon & The Devourer of Gods;
Darksun Fragment; Calamity; Solar Eclipse & The Devourer of Gods;
Darksun Fragment; Calamity; (Solar Eclipse & The Devourer of Gods) | Eclipse Mirror;
Dark Sun Ring; Calamity; Cosmic Anvil & Uelibloom Bar & Darksun Fragment;
Ascendant Spirit Essence; Calamity; Ancient Manipulator & Phantoplasm & Nightmare Fuel & Endothermic Energy & Darksun Fragment;
Eclipse Mirror; Calamity; (Cosmic Anvil & Abyssal Mirror & Dark Matter Sheath & Darksun Fragment) | (@getfixedboi & #Ceaseless Void);
Ascendant Spirit Essence; Calamity; (Ancient Manipulator & Polterplasm & Nightmare Fuel & Endothermic Energy & Darksun Fragment) | (@getfixedboi & #Providence, the Profaned Goddess) | Elemental Gauntlet | Elemental Quiver | Nucleogenesis | Nanotech | Ethereal Talisman;
Fearmonger Armor; Calamity | Armor Minions(2); Cosmic Anvil & Spooky Armor & Cosmilite Bar & Soul of Fright & Ascendant Spirit Essence;
Silva Armor; Calamity | Armor Minions(5); Cosmic Anvil & Effulgent Feather & Ascendant Spirit Essence;
Elemental Gauntlet; Calamity; (Cosmic Anvil & Fire Gauntlet & Luminite Bar & Galactica Singularity & Ascendant Spirit Essence) | (@getfixedboi & #Storm Weaver);
Elemental Quiver; Calamity; (Cosmic Anvil & Magic Quiver & Deadshot Brooch & Luminite Bar & Galactica Singularity & Ascendant Spirit Essence) | (@getfixedboi & #Storm Weaver);
Nucleogenesis; Calamity; (Cosmic Anvil & Star-Tainted Generator & Statis' Curse & Luminite Bar & Galactica Singularity & Ascendant Spirit Essence) | (@getfixedboi & #Ceaseless Void);
Nanotech; Calamity; (Emblem & Raider's Talisman & Moonstone Crown & Electrician's Glove & Luminite Bar & Galactica Singularity & Ascendant Spirit Essence) | (@getfixedboi & #Signus, Envoy of the Devourer);
Ethereal Talisman; Calamity; (Cosmic Anvil & Sigil of Calamitas & Mana Flower & Luminite Bar & Galactica Singularity & Ascendant Spirit Essence) | (@getfixedboi & #Signus, Envoy of the Devourer);
// Yharon, Dragon of Rebirth
Yharon, Dragon of Rebirth; Calamity | Location | Item | Goal; Ancient Manipulator & Effulgent Feather & Life Alloy;
# yharon_dragon_of_rebirth
Yharon Soul Fragment; Calamity; #Yharon, Dragon of Rebirth;
Auric Ore; Calamity; Yharon, Dragon of Rebirth & @pickaxe(250);
Auric Bar; Calamity; Cosmic Anvil & Auric Ore & Yharon Soul Fragment;
Zenith; Location | Item(Has Zenith) | Goal; Hardmode Anvil & Terra Blade & Meowmere & Star Wrath & Influx Waver & The Horseman's Blade & Seedler & Starfury & Bee Keeper & Enchanted Sword & Copper Shortsword & (~@calamity | Auric Bar);
Yharon Soul Fragment; Calamity; #Yharon, Dragon of Rebirth | The Wand | Auric Bar;
The Wand; Calamity; (Cosmic Anvil & Wand of Sparking & Yharon Soul Fragment) | (@getfixedboi & #The Devourer of Gods);
Auric Ore; Calamity; (Yharon, Dragon of Rebirth & (@pickaxe(250) | Wall of Flesh)) | Auric Bar;
Auric Bar; Calamity; (Cosmic Anvil & Auric Ore & Yharon Soul Fragment) | Shadowspec Bar;
Auric Tesla Armor; Calamity | Armor Minions(6); Cosmic Anvil & Silva Armor & Bloodflare Armor & Tarragon Armor & Auric Bar;
Infinity +1 Sword; Achievement | Grindy | Item(Has Zenith) | Goal(zenith); Hardmode Anvil & Terra Blade & Meowmere & Star Wrath & Influx Waver & The Horseman's Blade & Seedler & Starfury & Bee Keeper & Enchanted Sword & Copper Shortsword & (~@calamity | Auric Bar);
# zenith
// Exo Mechs
Auric Quantum Cooling Cell; Calamity; Cosmic Anvil & Auric Bar & Mysterious Circuitry & Dubious Plating & Endothermic Energy & Core of Eleum & Voltage Regulation System;
Exo Mechs; Calamity | Location | Item | Final Boss; Codebreaker Base & Decryption Computer & Auric Quantum Cooling Cell;
Supreme Witch, Calamitas; Calamity | Location | Item | Final Boss; Cosmic Anvil & Brimstone Slag & Auric Bar & Core of Calamity & Ashes of Calamity;
// XB-Infinity Hekate; Getfixedboi | Calamity; Codebreaker Base & Decryption Computer & Auric Quantum Cooling Cell & Blood Sample; // Currently, this boss doesn't affect logic at all
Supreme Witch, Calamitas; Calamity | Location | Item | Final Boss; (Cosmic Anvil & Brimstone Slag & Auric Bar & Core of Calamity & Ashes of Calamity) | (@getfixedboi & #Supreme Alchemist, Cirrus);
Supreme Alchemist, Cirrus; Getfixedboi | Calamity; Cosmic Anvil & Brimstone Slag & Auric Bar & Core of Calamity & Fabsol's Vodka;
THE LORDE; Getfixedboi | Calamity; Lihzahrd Temple;
# calamity_final_bosses
Exo Prism; Calamity; #Exo Mechs;
Exo Prism; Calamity; #Exo Mechs | Shadowspec Bar;
Draedon's Forge; Calamity; Cosmic Anvil & Hardmode Forge & Tinkerer's Workshop & Ancient Manipulator & Auric Bar & Exo Prism & Ascendant Spirit Essence;
// Supreme Witch, Calamitas
Ashes of Annihilation; Calamity; #Supreme Witch, Calamitas;
Ashes of Annihilation; Calamity; #Supreme Witch, Calamitas | (@getfixedboi & #Calamitas Clone) | Shadowspec Bar;
Shadowspec Bar; Calamity; Draedon's Forge & Auric Bar & Exo Prism & Ashes of Annihilation;
Crystyl Crusher; Calamity | Pickaxe(1000); Draedon's Forge & Luminite Pickaxe & Blossom Pickaxe & Shadowspec Bar;
Angelic Alliance; Calamity | Minions(2); Draedon's Forge & Hallowed Armor & Paladin's Shield & True Excalibur & Cross Necklace & Shadowspec Bar;
Demonshade Armor; Calamity | Armor Minions(10); Draedon's Forge & Shadowspec Bar;
// Adult Eidolon Wyrm;
Adult Eidolon Wyrm; Calamity | Location | Item | Goal; Rod of Discord | Normality Relocator;
# adult_eidolon_wyrm
// Primordial Wyrm
Primordial Wyrm; Calamity | Location | Item | Goal; Rod of Discord | Normality Relocator;
# primordial_wyrm
// Boss Rush
Boss Rush; Calamity | Location | Item | Goal; Diving Gear | Neptune's Shell | (Aquatic Heart & Skeletron); // Might be obtainable earlier with Midas' Blessing
# boss_rush

View File

@@ -1,11 +1,13 @@
# Look at `Rules.dsv` first to get an idea for how this works
import logging
from typing import Union, Tuple, List, Dict, Set
from worlds.AutoWorld import WebWorld, World
from BaseClasses import Region, ItemClassification, Tutorial, CollectionState
from .Checks import (
TerrariaItem,
TerrariaLocation,
Condition,
goals,
rules,
rule_indices,
@@ -25,7 +27,7 @@ from .Checks import (
armor_minions,
accessory_minions,
)
from .Options import TerrariaOptions
from .Options import TerrariaOptions, Goal
class TerrariaWeb(WebWorld):
@@ -55,8 +57,8 @@ class TerrariaWorld(World):
item_name_to_id = item_name_to_id
location_name_to_id = location_name_to_id
# Turn into an option when calamity is supported in the mod
calamity = False
getfixedboi = False
ter_items: List[str]
ter_locations: List[str]
@@ -70,72 +72,100 @@ class TerrariaWorld(World):
ter_goals = {}
goal_items = set()
for location in goal_locations:
_, flags, _, _ = rules[rule_indices[location]]
flags = rules[rule_indices[location]].flags
if not self.options.calamity.value and "Calamity" in flags:
logging.warning(
f"Terraria goal `{Goal.name_lookup[self.options.goal.value]}`, which requires Calamity, was selected with Calamity disabled; enabling Calamity"
)
self.options.calamity.value = True
item = flags.get("Item") or f"Post-{location}"
ter_goals[item] = location
goal_items.add(item)
achievements = self.options.achievements.value
location_count = 0
locations = []
for rule, flags, _, _ in rules[:goal]:
if (
(not self.calamity and "Calamity" in flags)
or (achievements < 1 and "Achievement" in flags)
or (achievements < 2 and "Grindy" in flags)
or (achievements < 3 and "Fishing" in flags)
or (
rule == "Zenith" and self.options.goal.value != 11
) # Bad hardcoding
):
continue
if "Location" in flags or ("Achievement" in flags and achievements >= 1):
# Location
location_count += 1
locations.append(rule)
elif (
"Achievement" not in flags
and "Location" not in flags
and "Item" not in flags
):
# Event
locations.append(rule)
item_count = 0
items = []
for rule, flags, _, _ in rules[:goal]:
if not self.calamity and "Calamity" in flags:
for rule in rules[:goal]:
early = "Early" in rule.flags
grindy = "Grindy" in rule.flags
fishing = "Fishing" in rule.flags
if (
(not self.options.getfixedboi.value and "Getfixedboi" in rule.flags)
or (self.options.getfixedboi.value and "Not Getfixedboi" in rule.flags)
or (not self.options.calamity.value and "Calamity" in rule.flags)
or (self.options.calamity.value and "Not Calamity" in rule.flags)
or (
self.options.getfixedboi.value
and self.options.calamity.value
and "Not Calamity Getfixedboi" in rule.flags
)
or (not self.options.early_achievements.value and early)
or (
not self.options.normal_achievements.value
and "Achievement" in rule.flags
and not early
and not grindy
and not fishing
)
or (not self.options.grindy_achievements.value and grindy)
or (not self.options.fishing_achievements.value and fishing)
) and rule.name not in goal_locations:
continue
if "Item" in flags:
# Item
item_count += 1
if rule not in goal_locations:
items.append(rule)
if "Location" in rule.flags or "Achievement" in rule.flags:
# Location
location_count += 1
locations.append(rule.name)
elif (
"Achievement" not in flags
and "Location" not in flags
and "Item" not in flags
"Achievement" not in rule.flags
and "Location" not in rule.flags
and "Item" not in rule.flags
):
# Event
items.append(rule)
locations.append(rule.name)
if "Item" in rule.flags and not (
"Achievement" in rule.flags and rule.name not in goal_locations
):
# Item
item_count += 1
if rule.name not in goal_locations:
items.append(rule.name)
elif (
"Achievement" not in rule.flags
and "Location" not in rule.flags
and "Item" not in rule.flags
):
# Event
items.append(rule.name)
extra_checks = self.options.fill_extra_checks_with.value
ordered_rewards = [
reward
for reward in labels["ordered"]
if self.calamity or "Calamity" not in rewards[reward]
if self.options.calamity.value or "Calamity" not in rewards[reward]
]
while extra_checks == 1 and item_count < location_count and ordered_rewards:
while (
self.options.fill_extra_checks_with.value == 1
and item_count < location_count
and ordered_rewards
):
items.append(ordered_rewards.pop(0))
item_count += 1
random_rewards = [
reward
for reward in labels["random"]
if self.calamity or "Calamity" not in rewards[reward]
if self.options.calamity.value or "Calamity" not in rewards[reward]
]
self.multiworld.random.shuffle(random_rewards)
while extra_checks == 1 and item_count < location_count and random_rewards:
while (
self.options.fill_extra_checks_with.value == 1
and item_count < location_count
and random_rewards
):
items.append(random_rewards.pop(0))
item_count += 1
@@ -173,9 +203,9 @@ class TerrariaWorld(World):
def create_items(self) -> None:
for item in self.ter_items:
if (rule_index := rule_indices.get(item)) is not None:
_, flags, _, _ = rules[rule_index]
if "Item" in flags:
name = flags.get("Item") or f"Post-{item}"
rule = rules[rule_index]
if "Item" in rule.flags:
name = rule.flags.get("Item") or f"Post-{item}"
else:
continue
else:
@@ -186,8 +216,8 @@ class TerrariaWorld(World):
locked_items = {}
for location in self.ter_locations:
_, flags, _, _ = rules[rule_indices[location]]
if "Location" not in flags and "Achievement" not in flags:
rule = rules[rule_indices[location]]
if "Location" not in rule.flags and "Achievement" not in rule.flags:
if location in progression:
classification = ItemClassification.progression
else:
@@ -202,95 +232,92 @@ class TerrariaWorld(World):
for location, item in locked_items.items():
self.multiworld.get_location(location, self.player).place_locked_item(item)
def check_condition(
self,
state,
sign: bool,
ty: int,
condition: Union[str, Tuple[Union[bool, None], list]],
arg: Union[str, int, None],
) -> bool:
if ty == COND_ITEM:
_, flags, _, _ = rules[rule_indices[condition]]
if "Item" in flags:
name = flags.get("Item") or f"Post-{condition}"
def check_condition(self, state, condition: Condition) -> bool:
if condition.type == COND_ITEM:
rule = rules[rule_indices[condition.condition]]
if "Item" in rule.flags:
name = rule.flags.get("Item") or f"Post-{condition.condition}"
else:
name = condition
name = condition.condition
return sign == state.has(name, self.player)
elif ty == COND_LOC:
_, _, operator, conditions = rules[rule_indices[condition]]
return sign == self.check_conditions(state, operator, conditions)
elif ty == COND_FN:
if condition == "npc":
if type(arg) is not int:
return condition.sign == state.has(name, self.player)
elif condition.type == COND_LOC:
rule = rules[rule_indices[condition.condition]]
return condition.sign == self.check_conditions(
state, rule.operator, rule.conditions
)
elif condition.type == COND_FN:
if condition.condition == "npc":
if type(condition.argument) is not int:
raise Exception("@npc requires an integer argument")
npc_count = 0
for npc in npcs:
if state.has(npc, self.player):
npc_count += 1
if npc_count >= arg:
return sign
if npc_count >= condition.argument:
return condition.sign
return not sign
elif condition == "calamity":
return sign == self.calamity
elif condition == "grindy":
return sign == (self.options.achievements.value >= 2)
elif condition == "pickaxe":
if type(arg) is not int:
return not condition.sign
elif condition.condition == "calamity":
return condition.sign == self.options.calamity.value
elif condition.condition == "grindy":
return condition.sign == self.options.grindy_achievements.value
elif condition.condition == "pickaxe":
if type(condition.argument) is not int:
raise Exception("@pickaxe requires an integer argument")
for pickaxe, power in pickaxes.items():
if power >= arg and state.has(pickaxe, self.player):
return sign
if power >= condition.argument and state.has(pickaxe, self.player):
return condition.sign
return not sign
elif condition == "hammer":
if type(arg) is not int:
return not condition.sign
elif condition.condition == "hammer":
if type(condition.argument) is not int:
raise Exception("@hammer requires an integer argument")
for hammer, power in hammers.items():
if power >= arg and state.has(hammer, self.player):
return sign
if power >= condition.argument and state.has(hammer, self.player):
return condition.sign
return not sign
elif condition == "mech_boss":
if type(arg) is not int:
return not condition.sign
elif condition.condition == "mech_boss":
if type(condition.argument) is not int:
raise Exception("@mech_boss requires an integer argument")
boss_count = 0
for boss in mech_bosses:
if state.has(boss, self.player):
boss_count += 1
if boss_count >= arg:
return sign
if boss_count >= condition.argument:
return condition.sign
return not sign
elif condition == "minions":
if type(arg) is not int:
return not condition.sign
elif condition.condition == "minions":
if type(condition.argument) is not int:
raise Exception("@minions requires an integer argument")
minion_count = 1
for armor, minions in armor_minions.items():
if state.has(armor, self.player) and minions + 1 > minion_count:
minion_count = minions + 1
if minion_count >= arg:
return sign
if minion_count >= condition.argument:
return condition.sign
for accessory, minions in accessory_minions.items():
if state.has(accessory, self.player):
minion_count += minions
if minion_count >= arg:
return sign
if minion_count >= condition.argument:
return condition.sign
return not sign
return not condition.sign
elif condition.condition == "getfixedboi":
return condition.sign == self.options.getfixedboi.value
else:
raise Exception(f"Unknown function {condition}")
elif ty == COND_GROUP:
operator, conditions = condition
return sign == self.check_conditions(state, operator, conditions)
raise Exception(f"Unknown function {condition.condition}")
elif condition.type == COND_GROUP:
operator, conditions = condition.condition
return condition.sign == self.check_conditions(state, operator, conditions)
def check_conditions(
self,
@@ -310,22 +337,22 @@ class TerrariaWorld(World):
return True
if len(conditions) > 1:
raise Exception("Found multiple conditions without an operator")
return self.check_condition(state, *conditions[0])
return self.check_condition(state, conditions[0])
elif operator:
return any(
self.check_condition(state, *condition) for condition in conditions
self.check_condition(state, condition) for condition in conditions
)
else:
return all(
self.check_condition(state, *condition) for condition in conditions
self.check_condition(state, condition) for condition in conditions
)
def set_rules(self) -> None:
for location in self.ter_locations:
def check(state: CollectionState, location=location):
_, _, operator, conditions = rules[rule_indices[location]]
return self.check_conditions(state, operator, conditions)
rule = rules[rule_indices[location]]
return self.check_conditions(state, rule.operator, rule.conditions)
self.multiworld.get_location(location, self.player).access_rule = check
@@ -336,6 +363,12 @@ class TerrariaWorld(World):
def fill_slot_data(self) -> Dict[str, object]:
return {
"goal": list(self.goal_locations),
"achievements": self.options.achievements.value,
"deathlink": bool(self.options.death_link),
# The rest of these are included for trackers
"calamity": self.options.calamity.value,
"getfixedboi": self.options.getfixedboi.value,
"early_achievements": self.options.early_achievements.value,
"normal_achievements": self.options.normal_achievements.value,
"grindy_achievements": self.options.grindy_achievements.value,
"fishing_achievements": self.options.fishing_achievements.value,
}