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

View File

@@ -1,40 +1,70 @@
from dataclasses import dataclass 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): 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" display_name = "Goal"
option_mechanical_bosses = 0 option_mechanical_bosses = 0
# option_calamitas_clone = 1 option_calamitas_clone = 1
option_plantera = 2 option_plantera = 2
option_golem = 3 option_golem = 3
option_empress_of_light = 4 option_empress_of_light = 4
option_lunatic_cultist = 5 option_lunatic_cultist = 5
# option_astrum_deus = 6 option_astrum_deus = 6
option_moon_lord = 7 option_moon_lord = 7
# option_providence_the_profaned_goddess = 8 option_providence_the_profaned_goddess = 8
# option_devourer_of_gods = 9 option_devourer_of_gods = 9
# option_yharon_dragon_of_rebirth = 10 option_yharon_dragon_of_rebirth = 10
option_zenith = 11 option_zenith = 11
# option_calamity_final_bosses = 12 option_calamity_final_bosses = 12
# option_adult_eidolon_wyrm = 13 option_primordial_wyrm = 13
option_boss_rush = 14
default = 0 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. Adds checks upon collecting achivements not covered by the other options. Achievements for
"Exclude Grindy" also excludes fishing achievements. clearing bosses and events are excluded.
""" """
display_name = "Achievements" display_name = "Normal Achievements"
option_none = 0
option_exclude_grindy = 1
option_exclude_fishing = 2 class GrindyAchievements(Toggle):
option_all = 3 """Adds checks upon collecting grindy achievements"""
default = 1
display_name = "Grindy Achievements"
class FishingAchievements(Toggle):
"""Adds checks upon collecting fishing quest achievements"""
display_name = "Fishing Quest Achievements"
class FillExtraChecksWith(Choice): class FillExtraChecksWith(Choice):
@@ -51,7 +81,12 @@ class FillExtraChecksWith(Choice):
@dataclass @dataclass
class TerrariaOptions(PerGameCommonOptions): class TerrariaOptions(PerGameCommonOptions):
calamity: Calamity
getfixedboi: Getfixedboi
goal: Goal goal: Goal
achievements: Achievements early_achievements: EarlyAchievements
normal_achievements: NormalAchievements
grindy_achievements: GrindyAchievements
fishing_achievements: FishingAchievements
fill_extra_checks_with: FillExtraChecksWith fill_extra_checks_with: FillExtraChecksWith
death_link: DeathLink death_link: DeathLink

View File

@@ -121,10 +121,9 @@ Corrupt Flask; Calamity;
Crimson Flask; Calamity; Crimson Flask; Calamity;
Craw Carapace; Calamity; Craw Carapace; Calamity;
Giant Shell; Calamity; Giant Shell; Calamity;
Fungal Carapace; Calamity;
Life Jelly; Calamity; Life Jelly; Calamity;
Vital Jelly; Calamity; Vital Jelly; Calamity;
Mana Jelly; Calamity; Cleansing Jelly; Calamity;
Giant Tortoise Shell; Calamity; Giant Tortoise Shell; Calamity;
Coin of Deceit; Calamity; Coin of Deceit; Calamity;
Ink Bomb; Calamity; Ink Bomb; Calamity;
@@ -151,4 +150,11 @@ Depths Charm; Calamity;
Anechoic Plating; Calamity; Anechoic Plating; Calamity;
Iron Boots; Calamity; Iron Boots; Calamity;
Sprit Glyph; 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 // Starting gear
Copper Shortsword; Copper Shortsword;
Guide; Npc; Guide; Npc;
// Immediately accessible // Immediately accessible
Timber!!; Achievement; Squire Slime; Npc;
Benched; Achievement; Traveling Merchant; ; @npc(2);
Stop! Hammer Time!; Achievement; Lifeform Analyzer; ; Traveling Merchant;
Matching Attire; Achievement; DPS Meter; ; Traveling Merchant | (@calamity & Wire);
Fashion Statement; Achievement; Stopwatch; ; Traveling Merchant;
Ooo! Shiny!; Achievement; Timber!!; Achievement | Early;
No Hobo; Achievement; 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; Merchant; Npc;
Bug Net; ; @calamity | Merchant; Bug Net; ; @calamity | Merchant;
Heavy Metal; Achievement; Heavy Metal; Achievement | Early;
Nurse; Npc; Merchant;
The Frequent Flyer; Achievement; Nurse;
Demolitionist; Npc; Merchant;
Dye Trader; Npc; @npc(4); Dye Trader; Npc; @npc(4);
Dye Hard; Achievement; Dye Trader; Dye Hard; Achievement; Dye Trader;
Lucky Break; Achievement; Demolitionist; Npc; Merchant;
Star Power; Achievement; Lucky Break; Achievement | Early;
You Can Do It!; Achievement; Star Power; Achievement | Early;
You Can Do It!; Achievement | Early;
Wulfrum Battery; Calamity;
Wulfrum Armor; Calamity | Armor Minions(1);
// Surface exploration // Surface exploration
Cactus;
Unusual Survival Strategies; Achievement | Early;
Aglet; Aglet;
Radar;
Wand of Sparking;
Heliophobia; Achievement; Heliophobia; Achievement;
Blighted Gel; Calamity; Blighted Gel; Calamity;
Evil Powder;
Archaeologist; Achievement | Grindy; Archaeologist; Achievement | Grindy;
Zoologist; Npc; Zoologist; Npc;
Cat; Npc; Zoologist; Cat; Npc; Zoologist;
Feeling Petty; Achievement; Cat | Dog; Feeling Petty; Achievement; Cat | Dog;
Dog; Npc; Zoologist; Dog; Npc; Zoologist;
Painter; Npc; @npc(8);
A Rather Blustery Day; Achievement | Grindy; A Rather Blustery Day; Achievement | Grindy;
Enchanted Sword; Enchanted Sword;
Pretty in Pink; Achievement | Grindy; Pretty in Pink; Achievement | Grindy;
Marathon Medalist; Achievement | Grindy; Marathon Medalist; Achievement | Grindy;
Angler; Npc; 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; Servant-in-Training; Achievement | Fishing; Angler;
\10 Fishing Quests; Achievement | Fishing; Angler; \10 Fishing Quests; Achievement | Fishing; Angler;
Trout Monkey; Achievement | Fishing; Angler; Trout Monkey; Achievement | Fishing; Angler;
@@ -45,52 +59,69 @@ Glorious Golden Pole; Achievement | Fishing;
Fast and Fishious; Achievement | Fishing; Angler; Fast and Fishious; Achievement | Fishing; Angler;
Supreme Helper Minion!; Achievement | Fishing; Angler; Supreme Helper Minion!; Achievement | Fishing; Angler;
Water Walking Boots; Water Walking Boots;
Painter; Npc; @npc(8); Aquatic Heart; Calamity;
// Sky exploration // Sky exploration
Into Orbit; Achievement; Into Orbit; Achievement | Early;
Mysterious Circuitry; Calamity; Mysterious Circuitry; Calamity;
Dubious Plating; Calamity; Dubious Plating; Calamity;
Charging Station; Calamity; Charging Station; Calamity;
Codebreaker Base; Calamity; Codebreaker Base; Calamity;
Starfury; Starfury;
Celestial Magnet;
Clumsy Slime; Npc;
// Underground // Underground
Watch Your Step!; Achievement; Watch Your Step!; Achievement | Early;
Throwing Lines; Achievement; Throwing Lines; Achievement | Early;
Torch God; Location | Item(Reward: Torch God's Favor); Torch God; Location | Item(Reward: Torch God's Favor);
Vehicular Manslaughter; Achievement; Vehicular Manslaughter; Achievement | Early;
Hey! Listen!; Achievement; Ancient Bone Dust; Calamity;
Depth Meter;
Compass;
Hey! Listen!; Achievement | Early;
I Am Loot!; Achievement; I Am Loot!; Achievement;
Magic Mirror;
Heart Breaker; Achievement; 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; Feller of Evergreens; Calamity;
Gold Hammer; Hammer(55); Gold Hammer; Hammer(55);
Gold Pickaxe; Pickaxe(55); Gold Pickaxe; Pickaxe(55);
Gold Watch;
Like a Boss; Achievement; Like a Boss; Achievement;
Hermes Boots; Hermes Boots;
Jeepers Creepers; Achievement; Jeepers Creepers; Achievement;
Stylist; Npc; Stylist; Npc;
Funkytown; Achievement; Funkytown; Achievement;
Deceiver of Fools; Achievement | Grindy; Deceiver of Fools; Achievement | Grindy;
Metal Detector;
Dead Men Tell No Tales; Achievement; Dead Men Tell No Tales; Achievement;
Bulldozer; Achievement | Grindy; Bulldozer; Achievement | Grindy;
// Cavern // Cavern
Obsidian; Obsidian;
Obsidian Skull; ; Obsidian; Obsidian Skull; ; Obsidian;
Raider's Talisman; Calamity; Obsidian;
There are Some Who Call Him...; Achievement | Grindy; There are Some Who Call Him...; Achievement | Grindy;
Lava Charm; Lava Charm;
Demonite Ore; Demonite Ore;
Demonite Bar; ; Demonite Ore | (@calamity & #Calamity Evil Boss); Demonite Bar; ; Demonite Ore;
Evil Sword; ; Demonite Bar; Evil Sword; ; Demonite Bar;
Coin of Deceit; Calamity; Demonite Bar | Ruin Medallion;
// Underground Ice // Underground Ice
Ice Skates; Ice Skates;
Flinx Fur Coat; ArmorMinions(1); Flinx Fur Coat; Armor Minions(1);
// Underground Desert // Underground Desert
Stormlion Mandible; Calamity;
Golfer; Npc; Golfer; Npc;
Party Girl; Npc; @npc(14);
Jolly Jamboree; Achievement | Grindy; Party Girl;
Cool Slime; Npc; Party Girl;
// Sunken Sea // Sunken Sea
Sea Prism; Calamity; Sea Prism; Calamity;
@@ -98,37 +129,50 @@ Navyplate; Calamity;
// Underground Jungle // Underground Jungle
Anklet of the Wind; Anklet of the Wind;
Feral Claws;
Stinger; Stinger;
Jungle Spores; Jungle Spores;
Vine; Vine;
Blade of Grass; ; Stinger & Jungle Spores & Vine; Blade of Grass; ; Stinger & Jungle Spores & Vine;
Nature's Gift;
Bezoar;
Summoning Potion; Minions(1); Summoning Potion; Minions(1);
// The Aether
A Shimmer In The Dark; Achievement;
// Underworld // Underworld
It's Getting Hot in Here; Achievement; It's Getting Hot in Here; Achievement;
Rock Bottom; Achievement; Rock Bottom; Achievement;
Obsidian Rose; Obsidian Rose;
Havocplate; Calamity; Havocplate; Calamity;
Magma Stone;
// Evil // Evil
Smashing, Poppet!; Achievement; Smashing, Poppet!; Achievement;
Arms Dealer; Npc; Arms Dealer; Npc;
Leading Landlord; Achievement; Nurse & Arms Dealer; // The logic is way more complex, but that doesn't affect anything Leading Landlord; Achievement; Nurse & Arms Dealer; // The logic is way more complex, but that doesn't affect anything
Completely Awesome; Achievement; Arms Dealer; Completely Awesome; Achievement; Arms Dealer;
Illegal Gun Parts; ; Arms Dealer | Flamethrower;
// Abyss
Ink Bomb; Calamity;
// King Slime // King Slime
King Slime; Location | Item; King Slime; Location | Item;
Sticky Situation; Achievement | Grindy; Sticky Situation; Not Getfixedboi | Achievement | Grindy;
The Cavalry; Achievement; The Cavalry; Achievement;
Solidifier; ; #King Slime; Solidifier; ; #King Slime;
Nerdy Slime; Npc; #King Slime;
// Desert Scourge // Desert Scourge
Desert Scourge; Calamity | Location | Item; Desert Scourge; Calamity | Location | Item;
Pearl Shard; Calamity; #Desert Scourge; Pearl Shard; Calamity; #Desert Scourge;
Sea Remains; Calamity; Pearl Shard; Sea Remains; Calamity; Pearl Shard;
Reefclaw Hamaxe; Calamity | Hammer(60); Sea Remains; Reefclaw Hamaxe; Calamity | Hammer(60); Sea Remains;
Victide Armor; Calamity | Armor Minions(1); Sea Remains;
Sandstorm; ; ~@calamity | Desert Scourge; 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
Giant Clam; Calamity | Location | Item; Desert Scourge; Giant Clam; Calamity | Location | Item; Desert Scourge;
@@ -136,18 +180,21 @@ Amidias; Calamity;
// Blood Moon // Blood Moon
Bloodbath; Achievement | Grindy; Bloodbath; Achievement | Grindy;
Blood Orb; Calamity;
Shark Tooth Necklace;
Til Death...; Achievement | Grindy; Til Death...; Achievement | Grindy;
Quiet Neighborhood; Achievement; Quiet Neighborhood; Achievement | Early;
Surly Slime; Npc;
// Eye of Cthulhu // Eye of Cthulhu
Eye of Cthulhu; Location | Item; Eye of Cthulhu; Location | Item;
Dryad; Npc; Eye of Cthulhu | Evil Boss | Skeletron; Dryad; Npc; Eye of Cthulhu | Evil Boss | Skeletron;
Pumpkin Seeds; ; Dryad; Pumpkin Seeds; ; Dryad;
Pumpkin; ; Pumpkin Seeds; Pumpkin; ; Pumpkin Seeds | Cactus;
Purification Powder; ; Dryad; // Shimmered from Evil Powder in 1.4.4. Not bought from Dryad in get fixed boi. Purification Powder; ; (~@getfixedboi & Dryad) | Evil Powder;
Party Girl; Npc; @npc(14); Mystic Slime; Npc; Purification Powder;
Jolly Jamboree; Achievement | Grindy; Party Girl; And Good Riddance!; Achievement | Grindy; Dryad;
Acid Rain Tier 1; Calamity | Location | Item; Eye of Cthulhu; Acid Rain Tier 1; Calamity | Location | Item; Eye of Cthulhu | Wall of Flesh | Aquatic Scourge;
// Crabulon // Crabulon
Crabulon; Calamity | Location | Item; Crabulon; Calamity | Location | Item;
@@ -156,112 +203,160 @@ Crabulon; Calamity | Location | Item;
Evil Boss; Location | Item; Evil Boss; Location | Item;
Evil Boss Part; ; #Evil Boss; Evil Boss Part; ; #Evil Boss;
Evil Pickaxe; Pickaxe(65); Evil Boss Part; 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; Tavernkeep; Npc; Evil Boss;
Old One's Army Tier 1; Location | Item; Tavernkeep; Old One's Army Tier 1; Location | Item; Tavernkeep;
Meteorite; ; Evil Boss; Meteorite; ; #Evil Boss | Evil Boss | Meteorite Bar | (@calamity & Astral Infection);
Meteorite Bar; ; Meteorite; Meteorite Bar; ; Meteorite | (@calamity & Astral Infection) | Meteor Staff;
Meteor Hamaxe; Hammer(60); Meteorite Bar; Meteor Hamaxe; Hammer(60); Meteorite Bar;
Hellforge; ; @pickaxe(60); Hellforge; ; @pickaxe(60);
Hellstone; ; @pickaxe(65) | Wall of Flesh; Hellstone; ; @pickaxe(65) | Wall of Flesh | Hellstone Bar;
Hellstone Bar; ; Hellstone; Hellstone Bar; ; Hellstone;
Fiery Greatsword; ; Hellstone Bar; Fiery Greatsword; ; Hellstone Bar;
Molten Hamaxe; Hammer(70); Hellstone Bar; Molten Hamaxe; Hammer(70); Hellstone Bar;
Molten Pickaxe; Pickaxe(100); Hellstone Bar; Molten Pickaxe; Pickaxe(100); Hellstone Bar;
Miner for Fire; Achievement; Molten Pickaxe; 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); Brimstone Slag; Calamity; @pickaxe(100);
// Goblin Army // Goblin Army
Goblin Army; Location | Item; Goblin Army; Location | Item;
Goblin Tinkerer; Npc; Goblin Army; Goblin Tinkerer; Npc; Goblin Army;
Tinkerer's Workshop; ; Goblin Tinkerer; 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; Rocket Boots; ; Goblin Tinkerer;
Spectre Boots; ; Tinkerer's Workshop & Hermes Boots & Rocket Boots; Spectre Boots; ; Tinkerer's Workshop & Hermes Boots & Rocket Boots;
Lightning Boots; ; Tinkerer's Workshop & Spectre Boots & Anklet of the Wind & Aglet; Lightning Boots; ; Tinkerer's Workshop & Spectre Boots & Anklet of the Wind & Aglet;
Frostspark Boots; ; Tinkerer's Workshop & Lightning Boots & Ice Skates; Frostspark Boots; ; Tinkerer's Workshop & Lightning Boots & Ice Skates;
Lava Waders; ; Tinkerer's Workshop & Obsidian Skull & Lava Charm & Obsidian Rose & Water Walking Boots; Lava Waders; ; Tinkerer's Workshop & Obsidian Skull & Lava Charm & Obsidian Rose & Water Walking Boots;
Terraspark Boots; ; Tinkerer's Workshop & Frostspark Boots & Lava Waders; 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; Boots of the Hero; Achievement | Grindy; Terraspark Boots;
Diving Gear; ; Tinkerer's Workshop;
// Queen Bee // Queen Bee
Where's My Honey?; Achievement; Where's My Honey?; Achievement;
Queen Bee; Location | Item; Queen Bee; Location | Item;
Bee Keeper; ; #Queen Bee; Bee Keeper; ; #Queen Bee;
Bee Wax; ; #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; Not the Bees!; Achievement; #Queen Bee & Bee Armor;
Witch Doctor; Npc; Queen Bee; 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 Evil Boss; Calamity | Location | Item; The Hive Mind; Calamity | Location | Item;
Aerialite Ore; Calamity; Calamity Evil Boss & @pickaxe(65); The Perforators; Calamity | Location | Item;
Aerialite Bar; Calamity; Aerialite Ore; 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; Aerial Hamaxe; Calamity | Hammer(70); Aerialite Bar;
Skyfringe Pickaxe; Calamity | Pickaxe(75); 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
Skeletron; Location | Item; Skeletron; Location | Item;
Clothier; Npc; Skeletron; Clothier; Npc; Skeletron;
Dungeon; ; Skeletron; Dungeon; ; Skeletron;
Dungeon Heist; Achievement; Dungeon; Dungeon Heist; Achievement; Dungeon;
Bone; ; Dungeon | (@calamity & #Skeletron); Bone; ; Dungeon | (@calamity & (#Skeletron | (@getfixedboi & #Ravager) | Mirage Mirror));
Bewitching Table; Minions(1); Dungeon | (Witch Doctor & Wizard); 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; Mechanic; ; Dungeon;
Wire; ; Mechanic; Wire; ; Mechanic | (@calamity & Electrician's Glove);
Decryption Computer; Calamity; Mysterious Circuitry & Dubious Plating & Wire; Decryption Computer; Calamity; Mysterious Circuitry & Dubious Plating & Wire;
Actuator; ; Mechanic; Actuator; ; Mechanic;
Muramasa; ; Dungeon; Muramasa; ; Dungeon;
Cobalt Shield; ; Dungeon | (@calamity & Cobalt Bar);
Obsidian Shield; ; Tinkerer's Workshop & Cobalt Shield & Obsidian Skull;
Elder Slime; Npc; Skeletron & Dungeon;
// Deerclops // Deerclops
Deerclops; Location | Item; Deerclops; Location | Item;
// The Slime God // The Slime God
The Slime God; Calamity | Location | Item; Blighted Gel; 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; Static Refiner; Calamity; Purified Gel & Solidifier;
Gelpick; Calamity | Pickaxe(100); Static Refiner & Purified Gel & Blighted Gel; 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); Night's Edge; ; Evil Sword & Muramasa & Blade of Grass & Fiery Greatsword & (~@calamity | Purified Gel);
// Wall of Flesh // Wall of Flesh
Wall of Flesh; Location | Item(Hardmode); Guide; Wall of Flesh; Location | Item(Hardmode); Guide;
Pwnhammer; Hammer(80); #Wall of Flesh; 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; 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 Fangs; ; Wall of Flesh;
Spider Armor; ArmorMinions(3); Spider Fangs; Spider Armor; Armor Minions(3); Spider Fangs;
Cross Necklace; ; Wall of Flesh; Cross Necklace; ; Wall of Flesh;
Altar; ; Wall of Flesh & @hammer(80); Altar; ; Wall of Flesh & @hammer(80);
Begone, Evil!; Achievement; Altar; 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; 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; 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; 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; Unicorn Horn; ; Hallow;
Crystal Shard; ; Hallow; Crystal Shard; ; Hallow;
Axe of Purity; Calamity; Feller of Evergreens & Purification Powder & Pixie Dust & Crystal Shard; 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; Blessed Apple; ; Hallow;
Rod of Discord; ; Hallow; Rod of Discord; ; Hallow;
Gelatin World Tour; Achievement | Grindy; Dungeon & Wall of Flesh & Hallow & #King Slime; Gelatin World Tour; Achievement | Grindy; Dungeon & Wall of Flesh & Hallow & #King Slime;
Soul of Flight; ; Wall of Flesh; 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 Bunny; Npc; Zoologist & Wall of Flesh; // Extremely simplified
Forbidden Fragment; ; Sandstorm & Wall of Flesh; Forbidden Fragment; ; Sandstorm & Wall of Flesh;
Astral Infection; Calamity; Wall of Flesh; Astral Infection; Calamity; Wall of Flesh | Astrum Aureus;
Stardust; Calamity; Astral Infection | #Astrum Aureus | #Astrum Deus; 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; Trapper Bulb; Calamity; Wall of Flesh;
Titan Heart; Calamity; Astral Infection; Titan Heart; Calamity; Astral Infection;
Essence of Sunlight; Calamity; Wall of Flesh | Golem; Essence of Sunlight; Calamity; Wall of Flesh | Golem;
Essence of Eleum; Calamity; Wall of Flesh | Cryogen | #Cryogen; // TODO Check Essence of Eleum; Calamity; Wall of Flesh | Cryogen | #Cryogen | (@getfixedboi & #Duke Fishron);
Essence of Havoc; Calamity; Wall of Flesh | #Calamitas Clone | #Brimstone Elemental; Essence of Havoc; Calamity; Wall of Flesh | #Calamitas Clone | #Brimstone Elemental | Ruin Medallion;
Don't Dread on Me; Achievement; Wall of Flesh; Dreadnautilus; Calamity | Location | Item; Wall of Flesh;
Earth Elemental; Calamity | Location | Item; Wall of Flesh; Don't Dread on Me; Not Calamity | Achievement; Wall of Flesh;
Cloud Elemental; Calamity | Location | Item; Wall of Flesh; Hardmode Giant Clam; Calamity | Location | Item; #Giant Clam & Wall of Flesh;
Truffle; Npc; Wall of Flesh; Truffle; Npc; Wall of Flesh;
It Can Talk?!; Achievement; Truffle; It Can Talk?!; Achievement; Truffle;
The First Shadowflame; Calamity | Minions(1); Goblin Army | Wall of Flesh; The First Shadowflame; Calamity | Minions(1); Goblin Army | Wall of Flesh;
@@ -271,103 +366,125 @@ Pirate Invasion; Location | Item;
Pirate; Npc; Pirate Invasion; Pirate; Npc; Pirate Invasion;
// Queen Slime // 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 // Aquatic Scourge
Mythril Ore; ; (((~@calamity & Altar) | (@calamity & @mech_boss(1))) & @pickaxe(110)) | (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 | @mech_boss(1))); Mythril Bar; ; Mythril Ore | Wall of Flesh | (@calamity & Electrician's Glove);
Hardmode Anvil; ; Mythril Bar; Hardmode Anvil; ; Mythril Bar;
Mythril Pickaxe; Pickaxe(150); 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; 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; 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; 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; Cragmaw Mire; Calamity | Location | Item; #Acid Rain Tier 2;
Nuclear Rod; Calamity | Minions(1); #Cragmaw Mire; 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 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 // The Twins
Soul of Sight; ; #The Twins; Soul of Sight; ; #The Twins | Avenger Emblem | (@calamity & (Mechanical Glove | Celestial Emblem));
Steampunker; Npc; @mech_boss(1); Steampunker; Npc; @mech_boss(1);
Hammush; ; Truffle & @mech_boss(1); Hammush; ; Truffle & @mech_boss(1);
Rainbow Rod; ; Hardmode Anvil & Crystal Shard & Unicorn Horn & Pixie Dust & Soul of Light & Soul of Sight; Rainbow Rod; ; Hardmode Anvil & Crystal Shard & Unicorn Horn & Pixie Dust & Soul of Light & Soul of Sight;
Prismancer; Achievement; Rainbow Rod; Prismancer; Achievement; Rainbow Rod;
Long Ranged Sensor Array; Calamity; Hardmode Anvil & Mysterious Circuitry & Dubious Plating & Mythril Bar & Wire & Decryption Computer & Codebreaker Base; 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; 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; Get a Life; Achievement; Life Fruit;
Topped Off; 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); 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 // Brimstone Elemental
Infernal Suevite; Calamity; @pickaxe(150) | 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 // The Destroyer
Soul of Might; ; #The Destroyer; Soul of Might; ; #The Destroyer | Avenger Emblem | Light Disc | (@calamity & (Mechanical Glove | Celestial Emblem));
// Cryogen // Cryogen
Cryonic Ore; Calamity; Cryogen & (@pickaxe(180) | @mech_boss(2)); Cryonic Ore; Calamity; (Cryogen & (@pickaxe(180) | @mech_boss(2))) | Cryonic Bar;
Cryonic Bar; Calamity; (Hardmode Forge & Cryonic Ore) | Fleshy Geode | Necromantic Geode; 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; Abyssal Warhammer; Calamity | Hammer(88); Hardmode Anvil & Cryonic Bar;
Shardlight Pickaxe; Calamity | Pickaxe(180); 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 // 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; 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; Buckets of Bolts; Achievement; #The Twins & #The Destroyer & #Skeletron Prime;
Mecha Mayhem; Achievement; #The Twins & #The Destroyer & #Skeletron Prime; Mecha Mayhem; Achievement | Not Getfixedboi; #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 Ore; Calamity; (@mech_boss(3) & @pickaxe(180)) | Chlorophyte Ore | Hallowed Bar;
Hallowed Armor; ArmorMinions(3); Hardmode Anvil & 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; Excalibur; ; Hardmode Anvil & Hallowed Bar;
Pickaxe Axe; Pickaxe(200); Hardmode Anvil & Hallowed Bar & Soul of Fright & Soul of Might & Soul of Sight; Pickaxe Axe; Pickaxe(200); Hardmode Anvil & Hallowed Bar & Soul of Fright & Soul of Might & Soul of Sight;
Drax Attax; Achievement; Pickaxe Axe; Drax Attax; Achievement; Pickaxe Axe;
True Night's Edge; ; Hardmode Anvil & Night's Edge & Soul of Fright & Soul of Might & Soul of Sight; 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; 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; True Excalibur; ; Hardmode Anvil & Excalibur & Chlorophyte Bar;
Chlorophyte Pickaxe; Pickaxe(200); Hardmode Anvil & Chlorophyte Bar; Chlorophyte Pickaxe; Pickaxe(200); Hardmode Anvil & Chlorophyte Bar;
Chlorophyte Warhammer; Hammer(90); Hardmode Anvil & Chlorophyte Bar; Chlorophyte Warhammer; Hammer(90); Hardmode Anvil & Chlorophyte Bar;
// Calamitas Clone // Calamitas Clone
Calamitas Clone; Calamity | Location | Item | Goal; Hardmode Anvil & Hellstone Bar & Essence of Havoc; 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 # calamitas_clone
# plantera # 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 // Plantera
The Axe; Hammer(100); #Plantera; The Axe; Hammer(100); #Plantera;
Seedler; ; #Plantera; Seedler; ; #Plantera;
Living Shard; Calamity; #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; Hercules Beetle; ; Witch Doctor & Wall of Flesh & Plantera;
You and What Army?; Achievement; @minions(8); You and What Army?; Achievement; @minions(8);
Cyborg; Npc; Plantera; Cyborg; Npc; Plantera;
To Infinity... and Beyond!; Achievement; Cyborg & Wall of Flesh;
Autohammer; ; Truffle & Plantera; Autohammer; ; Truffle & Plantera;
Shroomite Bar; ; Autohammer & Chlorophyte Bar; Shroomite Bar; ; Autohammer & Chlorophyte Bar;
Shroomite Digging Claw; Pickaxe(200); Hardmode Anvil & Shroomite 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; 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; 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; Paladin's Shield; ; Dungeon & Wall of Flesh & Plantera;
Core of Sunlight; Calamity; (Hardmode Anvil & Essence of Sunlight & Ectoplasm) | Fleshy Geode | 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 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 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; 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 Bar; ; Hardmode Forge & Chlorophyte Bar & Ectoplasm;
Spectre Pickaxe; Pickaxe(200); Hardmode Anvil & Spectre Bar; Spectre Pickaxe; Pickaxe(200); Hardmode Anvil & Spectre Bar;
Spectre Hamaxe; Hammer(90); 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); Evil Key; ; Plantera | (@calamity & #Wall of Flesh);
Frozen Key; ; Plantera | (@calamity & #Cryogen); Frozen Key; ; Plantera | (@calamity & #Cryogen);
Jungle Key; ; Plantera | (@calamity & #Plantera); 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); 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; Rainbow Gun; ; Dungeon & Wall of Flesh & Plantera & Hallowed Key;
Rainbows and Unicorns; Achievement; Blessed Apple & Rainbow Gun; Rainbows and Unicorns; Achievement; Blessed Apple & Rainbow Gun;
Perennial Ore; Calamity; Plantera; Perennial Ore; Calamity; Plantera | Perennial Bar;
Perennial Bar; Calamity; Hardmode Forge & Perennial Ore; Perennial Bar; Calamity; (Hardmode Forge & Perennial Ore) | Plantera | Life Alloy;
Beastial Pickaxe; Calamity | Pickaxe(200); Hardmode Anvil & Perennial Bar; Beastial Pickaxe; Calamity | Pickaxe(200); Hardmode Anvil & Perennial Bar;
Armored Digger; Calamity | Location | Item; Plantera; // TODO Check
// Solar Eclipse // Solar Eclipse
Temple Raider; Achievement; #Plantera; Temple Raider; Achievement; #Plantera;
Lihzahrd Temple; ; #Plantera | (Plantera & Actuator) | @pickaxe(210) | (@calamity & Hardmode Anvil & Soul of Light & Soul of Night); 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; 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); Terra Blade; ; Hardmode Anvil & True Night's Edge & True Excalibur & Broken Hero Sword & (~@calamity | Living Shard);
Sword of the Hero; Achievement; Terra Blade; Sword of the Hero; Achievement; Terra Blade;
Neptune's Shell; ; Solar Eclipse;
Kill the Sun; Achievement; Solar Eclipse; Kill the Sun; Achievement; Solar Eclipse;
// Great Sand Shark // Great Sand Shark
Great Sand Shark; Calamity | Location | Item; Hardmode Anvil & Forbidden Fragment & Core of Sunlight; 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
Leviathan and Anahita; Calamity | Location | Item; 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; Location | Item | Goal; (Wall of Flesh & Plantera & Lihzahrd Temple) | (@calamity & Hardmode Anvil & Lihzahrd Temple & Essence of Sunlight);
# golem # golem
Picksaw; Pickaxe(210); #Golem; Picksaw; Pickaxe(210); #Golem;
Lihzahrd Brick; ; @pickaxe(210); Lihzahrd Brick; ; @pickaxe(210) | (Lihzahrd Furniture & Golem) | (@calamity & Lihzahrd Temple);
Scoria Ore; Calamity; Golem | @pickaxe(210); Scoria Ore; Calamity; Golem | @pickaxe(210) | Astral Ore | Luminite | Scoria Bar;
Scoria Bar; Calamity; Hardmode Forge & Scoria Ore; 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; 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; 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; Old One's Army Tier 3; Location | Item; #Old One's Army Tier 1 & Wall of Flesh & Golem;
// Martian Madness // Martian Madness
Martian Madness; Location | Item; Wall of Flesh & Golem; Martian Madness; Location | Item; Wall of Flesh & Golem;
Laser Drill; Pickaxe(220); #Martian Madness;
Influx Waver; ; #Martian Madness; Influx Waver; ; #Martian Madness;
// The Plaguebringer Goliath // The Plaguebringer Goliath
Plague Cell Canister; Calamity; Golem; Plague Cell Canister; Calamity; Golem | Alchemical Flask | (@getfixedboi & #Queen Bee);
Plaguebringer; Calamity | Location | Item; Golem; Alchemical Flask; Calamity; (Hardmode Anvil & Bee Wax & Plague Cell Canister) | (@getfixedboi & #Queen Bee);
The Plaguebringer Goliath; Calamity | Location | Item; Hardmode Anvil & Plague Cell Canister; 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
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
Pumpkin Moon; ; Hardmode Anvil & Pumpkin & Ectoplasm & (@calamity | Hallowed Bar); 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; Mourning Wood; Location | Item; Pumpkin Moon;
Necromantic Scroll; Minions(1); #Mourning Wood; 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; Pumpking; Location | Item; Pumpkin Moon;
The Horseman's Blade; ; #Pumpking; The Horseman's Blade; ; #Pumpking;
Baleful Harvest; Achievement; Pumpkin Moon; Baleful Harvest; Achievement; Pumpkin Moon;
@@ -451,11 +579,11 @@ Ravager; Calamity | Location | Item;
Fleshy Geode; Calamity; #Ravager; Fleshy Geode; Calamity; #Ravager;
// Empress of Light // 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 # empress_of_light
// Lunatic Cultist // 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; Astrum Deus; Calamity | Location | Item | Goal; Titan Heart;
# lunatic_cultist # lunatic_cultist
# astrum_deus # astrum_deus
@@ -463,111 +591,142 @@ Ancient Manipulator; ;
// Lunar Events // Lunar Events
Lunar Events; Location | Item; #Lunatic Cultist; Lunar Events; Location | Item; #Lunatic Cultist;
Fragment; ; #Lunar Events | #Astrum Deus; Fragment; ; #Lunar Events | #Astrum Deus | (Ancient Manipulator & (Nebula Fragment | Stardust Fragment)) | (@calamity & Galactica Singularity);
Galactica Singularity; Calamity; Ancient Manipulator & Fragment; Nebula Fragment; ; Fragment | (@calamity & Eye of Magnus);
Meld Blob; Calamity; #Lunar Events | #Astrum Deus; Eye of Magnus; Calamity; (Ancient Manipulator & Lunic Eye & Nebula Fragment) | (@getfixedboi & #Wall of Flesh);
Meld Construct; Calamity; Ancient Manipulator & Meld Blob & Stardust; 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 // Astrum Deus
Astral Ore; Calamity; Wall of Flesh & Astrum Deus; 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 Bar; Calamity; (Ancient Manipulator & Stardust & Astral Ore) | (Astral Infection & Astrum Deus);
Astral Hamaxe; Calamity | Hammer(100); Ancient Manipulator & Astral Bar; Astral Hamaxe; Calamity | Hammer(100); Ancient Manipulator & Astral Bar;
Astral Pickaxe; Calamity | Pickaxe(220); 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
Moon Lord; Location | Item | Goal; #Lunar Events; Moon Lord; Location | Item | Goal; #Lunar Events;
# moon_lord # 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; 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; ; #Moon Lord | (@calamity & (Exodium Cluster | Asteroid Staff)) | Luminite Bar;
Luminite Bar; ; Ancient Manipulator & Luminite; 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 Hamaxe; Hammer(100); Ancient Manipulator & Fragment & Luminite Bar;
Luminite Pickaxe; Pickaxe(225); 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; 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; Terrarian; ; #Moon Lord;
Sick Throw; Achievement; Terrarian; Sick Throw; Achievement; Terrarian;
Meowmere; ; #Moon Lord; Meowmere; ; #Moon Lord;
Star Wrath; ; #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; Normality Relocator; Calamity; Ancient Manipulator & Rod of Discord & Exodium Cluster & Fragment;
Unholy Essence; Calamity; Moon Lord | #Providence, the Profaned Goddess; Unholy Essence; Calamity; Moon Lord | #Providence, the Profaned Goddess | (Hallow & Providence, the Profaned Goddess) | (@getfixedboi & Plantera);
Phantoplasm; Calamity; Moon Lord & (Wall of Flesh | Dungeon); // TODO Check Polterplasm; Calamity; (Moon Lord & Wall of Flesh) | (Dungeon & (Polterghast | Moon Lord)) | #Polterghast;
Eldritch Soul Artifact; Calamity; Exodium Cluster & Navyplate & Phantoplasm; Eldritch Soul Artifact; Calamity | Minions(1); Exodium Cluster & Navyplate & Polterplasm;
// Profaned Guardians // Profaned Guardians
Profaned Guardians; Calamity | Location | Item; Ancient Manipulator & Unholy Essence & Luminite Bar; Profaned Guardians; Calamity | Location | Item; Ancient Manipulator & Unholy Essence & Luminite Bar;
// Dragonfolly // Dragonfolly
The Dragonfolly; Calamity | Location | Item; Ancient Manipulator & Unholy Essence & Luminite Bar; The Dragonfolly; Calamity | Location | Item; (Ancient Manipulator & Unholy Essence & Luminite Bar) | (@getfixedboi & #Supreme Alchemist, Cirrus);
Effulgent Feather; Calamity; Moon Lord | #The Dragonfolly; Effulgent Feather; Calamity; Moon Lord | #The Dragonfolly | (@getfixedboi & #Yharon, Dragon of Rebirth);
// Providence, the Profaned Goddess // 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 # 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; Profaned Soul Artifact; Calamity | Minions(1); Exodium Cluster & Havocplate & Divine Geode;
Rune of Kos; Calamity; #Providence, the Profaned Goddess; Rune of Kos; Calamity; #Providence, the Profaned Goddess;
Uelibloom Ore; Calamity; Providence, the Profaned Goddess; Uelibloom Ore; Calamity; Providence, the Profaned Goddess | Auric Ore | Uelibloom Bar;
Uelibloom Bar; Calamity; Hardmode Forge & Uelibloom Ore; Uelibloom Bar; Calamity; (Hardmode Forge & Uelibloom Ore) | Providence, the Profaned Goddess;
Grax; Calamity | Hammer(110); Ancient Manipulator & Inferna Cutter & Luminite Hamaxe & Uelibloom Bar; Grax; Calamity | Hammer(110); Ancient Manipulator & Inferna Cutter & Luminite Hamaxe & Uelibloom Bar;
Blossom Pickaxe; Calamity | Pickaxe(250); Ancient Manipulator & 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; 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; 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 // Sentinels of the Devourer
Storm Weaver; Calamity | Location | Item; Rune of Kos; Storm Weaver; Calamity | Location | Item; Rune of Kos;
Armored Shell; Calamity; #Storm Weaver; 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; Dark Plasma; Calamity; #Ceaseless Void;
Signus, Envoy of the Devourer; Calamity | Location | Item; Rune of Kos; Signus, Envoy of the Devourer; Calamity | Location | Item; Rune of Kos;
Twisting Nether; Calamity; #Signus, Envoy of the Devourer; Twisting Nether; Calamity; #Signus, Envoy of the Devourer;
// Polterghast // Polterghast
Polterghast; Calamity | Location | Item; Dungeon & ((Ancient Manipulator & Phantoplasm) | Moon Lord); Polterghast; Calamity | Location | Item; Dungeon & ((Ancient Manipulator & Polterplasm) | Moon Lord);
Colossal Squid; Calamity | Location | Item; Ruinous Soul; Calamity; #Polterghast;
Reaper Shark; Calamity | Location | Item; Bloodflare Armor; Calamity | Armor Minions(3); Ancient Manipulator & Bloodstone Core & Ruinous Soul;
Eidolon Wyrm; Calamity | Location | Item; Reaper Tooth; Calamity; Polterghast;
Omega Blue Armor; Calamity | Armor Minions(2); Ancient Manipulator & Reaper Tooth & Depth Cells & Ruinous Soul;
// The Old Duke // The Old Duke
Mauler; Calamity | Location | Item; #Acid Rain Tier 3; Mauler; Calamity | Location | Item; Acid Rain Tier 3;
Nuclear Terror; 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 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); 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
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 # the_devourer_of_gods
Cosmilite Bar; Calamity; #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; 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; 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; 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
Yharon, Dragon of Rebirth; Calamity | Location | Item | Goal; Ancient Manipulator & Effulgent Feather & Life Alloy; Yharon, Dragon of Rebirth; Calamity | Location | Item | Goal; Ancient Manipulator & Effulgent Feather & Life Alloy;
# yharon_dragon_of_rebirth # yharon_dragon_of_rebirth
Yharon Soul Fragment; Calamity; #Yharon, Dragon of Rebirth; Yharon Soul Fragment; Calamity; #Yharon, Dragon of Rebirth | The Wand | Auric Bar;
Auric Ore; Calamity; Yharon, Dragon of Rebirth & @pickaxe(250); The Wand; Calamity; (Cosmic Anvil & Wand of Sparking & Yharon Soul Fragment) | (@getfixedboi & #The Devourer of Gods);
Auric Bar; Calamity; Cosmic Anvil & Auric Ore & Yharon Soul Fragment; Auric Ore; Calamity; (Yharon, Dragon of Rebirth & (@pickaxe(250) | Wall of Flesh)) | Auric Bar;
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); 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 # zenith
// Exo Mechs // Exo Mechs
Auric Quantum Cooling Cell; Calamity; Cosmic Anvil & Auric Bar & Mysterious Circuitry & Dubious Plating & Endothermic Energy & Core of Eleum & Voltage Regulation System; 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; 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 # 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; Draedon's Forge; Calamity; Cosmic Anvil & Hardmode Forge & Tinkerer's Workshop & Ancient Manipulator & Auric Bar & Exo Prism & Ascendant Spirit Essence;
// Supreme Witch, Calamitas // 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; 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; 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; 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; // Primordial Wyrm
Adult Eidolon Wyrm; Calamity | Location | Item | Goal; Rod of Discord | Normality Relocator; Primordial Wyrm; Calamity | Location | Item | Goal; Rod of Discord | Normality Relocator;
# adult_eidolon_wyrm # 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 # Look at `Rules.dsv` first to get an idea for how this works
import logging
from typing import Union, Tuple, List, Dict, Set from typing import Union, Tuple, List, Dict, Set
from worlds.AutoWorld import WebWorld, World from worlds.AutoWorld import WebWorld, World
from BaseClasses import Region, ItemClassification, Tutorial, CollectionState from BaseClasses import Region, ItemClassification, Tutorial, CollectionState
from .Checks import ( from .Checks import (
TerrariaItem, TerrariaItem,
TerrariaLocation, TerrariaLocation,
Condition,
goals, goals,
rules, rules,
rule_indices, rule_indices,
@@ -25,7 +27,7 @@ from .Checks import (
armor_minions, armor_minions,
accessory_minions, accessory_minions,
) )
from .Options import TerrariaOptions from .Options import TerrariaOptions, Goal
class TerrariaWeb(WebWorld): class TerrariaWeb(WebWorld):
@@ -55,8 +57,8 @@ class TerrariaWorld(World):
item_name_to_id = item_name_to_id item_name_to_id = item_name_to_id
location_name_to_id = location_name_to_id location_name_to_id = location_name_to_id
# Turn into an option when calamity is supported in the mod
calamity = False calamity = False
getfixedboi = False
ter_items: List[str] ter_items: List[str]
ter_locations: List[str] ter_locations: List[str]
@@ -70,72 +72,100 @@ class TerrariaWorld(World):
ter_goals = {} ter_goals = {}
goal_items = set() goal_items = set()
for location in goal_locations: 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}" item = flags.get("Item") or f"Post-{location}"
ter_goals[item] = location ter_goals[item] = location
goal_items.add(item) goal_items.add(item)
achievements = self.options.achievements.value
location_count = 0 location_count = 0
locations = [] 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 item_count = 0
items = [] items = []
for rule, flags, _, _ in rules[:goal]: for rule in rules[:goal]:
if not self.calamity and "Calamity" in flags: 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 continue
if "Item" in flags:
# Item if "Location" in rule.flags or "Achievement" in rule.flags:
item_count += 1 # Location
if rule not in goal_locations: location_count += 1
items.append(rule) locations.append(rule.name)
elif ( elif (
"Achievement" not in flags "Achievement" not in rule.flags
and "Location" not in flags and "Location" not in rule.flags
and "Item" not in flags and "Item" not in rule.flags
): ):
# Event # 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 = [ ordered_rewards = [
reward reward
for reward in labels["ordered"] 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)) items.append(ordered_rewards.pop(0))
item_count += 1 item_count += 1
random_rewards = [ random_rewards = [
reward reward
for reward in labels["random"] 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) 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)) items.append(random_rewards.pop(0))
item_count += 1 item_count += 1
@@ -173,9 +203,9 @@ class TerrariaWorld(World):
def create_items(self) -> None: def create_items(self) -> None:
for item in self.ter_items: for item in self.ter_items:
if (rule_index := rule_indices.get(item)) is not None: if (rule_index := rule_indices.get(item)) is not None:
_, flags, _, _ = rules[rule_index] rule = rules[rule_index]
if "Item" in flags: if "Item" in rule.flags:
name = flags.get("Item") or f"Post-{item}" name = rule.flags.get("Item") or f"Post-{item}"
else: else:
continue continue
else: else:
@@ -186,8 +216,8 @@ class TerrariaWorld(World):
locked_items = {} locked_items = {}
for location in self.ter_locations: for location in self.ter_locations:
_, flags, _, _ = rules[rule_indices[location]] rule = rules[rule_indices[location]]
if "Location" not in flags and "Achievement" not in flags: if "Location" not in rule.flags and "Achievement" not in rule.flags:
if location in progression: if location in progression:
classification = ItemClassification.progression classification = ItemClassification.progression
else: else:
@@ -202,95 +232,92 @@ class TerrariaWorld(World):
for location, item in locked_items.items(): for location, item in locked_items.items():
self.multiworld.get_location(location, self.player).place_locked_item(item) self.multiworld.get_location(location, self.player).place_locked_item(item)
def check_condition( def check_condition(self, state, condition: Condition) -> bool:
self, if condition.type == COND_ITEM:
state, rule = rules[rule_indices[condition.condition]]
sign: bool, if "Item" in rule.flags:
ty: int, name = rule.flags.get("Item") or f"Post-{condition.condition}"
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}"
else: else:
name = condition name = condition.condition
return sign == state.has(name, self.player) return condition.sign == state.has(name, self.player)
elif ty == COND_LOC: elif condition.type == COND_LOC:
_, _, operator, conditions = rules[rule_indices[condition]] rule = rules[rule_indices[condition.condition]]
return sign == self.check_conditions(state, operator, conditions) return condition.sign == self.check_conditions(
elif ty == COND_FN: state, rule.operator, rule.conditions
if condition == "npc": )
if type(arg) is not int: elif condition.type == COND_FN:
if condition.condition == "npc":
if type(condition.argument) is not int:
raise Exception("@npc requires an integer argument") raise Exception("@npc requires an integer argument")
npc_count = 0 npc_count = 0
for npc in npcs: for npc in npcs:
if state.has(npc, self.player): if state.has(npc, self.player):
npc_count += 1 npc_count += 1
if npc_count >= arg: if npc_count >= condition.argument:
return sign return condition.sign
return not sign return not condition.sign
elif condition == "calamity": elif condition.condition == "calamity":
return sign == self.calamity return condition.sign == self.options.calamity.value
elif condition == "grindy": elif condition.condition == "grindy":
return sign == (self.options.achievements.value >= 2) return condition.sign == self.options.grindy_achievements.value
elif condition == "pickaxe": elif condition.condition == "pickaxe":
if type(arg) is not int: if type(condition.argument) is not int:
raise Exception("@pickaxe requires an integer argument") raise Exception("@pickaxe requires an integer argument")
for pickaxe, power in pickaxes.items(): for pickaxe, power in pickaxes.items():
if power >= arg and state.has(pickaxe, self.player): if power >= condition.argument and state.has(pickaxe, self.player):
return sign return condition.sign
return not sign return not condition.sign
elif condition == "hammer": elif condition.condition == "hammer":
if type(arg) is not int: if type(condition.argument) is not int:
raise Exception("@hammer requires an integer argument") raise Exception("@hammer requires an integer argument")
for hammer, power in hammers.items(): for hammer, power in hammers.items():
if power >= arg and state.has(hammer, self.player): if power >= condition.argument and state.has(hammer, self.player):
return sign return condition.sign
return not sign return not condition.sign
elif condition == "mech_boss": elif condition.condition == "mech_boss":
if type(arg) is not int: if type(condition.argument) is not int:
raise Exception("@mech_boss requires an integer argument") raise Exception("@mech_boss requires an integer argument")
boss_count = 0 boss_count = 0
for boss in mech_bosses: for boss in mech_bosses:
if state.has(boss, self.player): if state.has(boss, self.player):
boss_count += 1 boss_count += 1
if boss_count >= arg: if boss_count >= condition.argument:
return sign return condition.sign
return not sign return not condition.sign
elif condition == "minions": elif condition.condition == "minions":
if type(arg) is not int: if type(condition.argument) is not int:
raise Exception("@minions requires an integer argument") raise Exception("@minions requires an integer argument")
minion_count = 1 minion_count = 1
for armor, minions in armor_minions.items(): for armor, minions in armor_minions.items():
if state.has(armor, self.player) and minions + 1 > minion_count: if state.has(armor, self.player) and minions + 1 > minion_count:
minion_count = minions + 1 minion_count = minions + 1
if minion_count >= arg: if minion_count >= condition.argument:
return sign return condition.sign
for accessory, minions in accessory_minions.items(): for accessory, minions in accessory_minions.items():
if state.has(accessory, self.player): if state.has(accessory, self.player):
minion_count += minions minion_count += minions
if minion_count >= arg: if minion_count >= condition.argument:
return sign return condition.sign
return not sign return not condition.sign
elif condition.condition == "getfixedboi":
return condition.sign == self.options.getfixedboi.value
else: else:
raise Exception(f"Unknown function {condition}") raise Exception(f"Unknown function {condition.condition}")
elif ty == COND_GROUP: elif condition.type == COND_GROUP:
operator, conditions = condition operator, conditions = condition.condition
return sign == self.check_conditions(state, operator, conditions) return condition.sign == self.check_conditions(state, operator, conditions)
def check_conditions( def check_conditions(
self, self,
@@ -310,22 +337,22 @@ class TerrariaWorld(World):
return True return True
if len(conditions) > 1: if len(conditions) > 1:
raise Exception("Found multiple conditions without an operator") raise Exception("Found multiple conditions without an operator")
return self.check_condition(state, *conditions[0]) return self.check_condition(state, conditions[0])
elif operator: elif operator:
return any( return any(
self.check_condition(state, *condition) for condition in conditions self.check_condition(state, condition) for condition in conditions
) )
else: else:
return all( 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: def set_rules(self) -> None:
for location in self.ter_locations: for location in self.ter_locations:
def check(state: CollectionState, location=location): def check(state: CollectionState, location=location):
_, _, operator, conditions = rules[rule_indices[location]] rule = rules[rule_indices[location]]
return self.check_conditions(state, operator, conditions) return self.check_conditions(state, rule.operator, rule.conditions)
self.multiworld.get_location(location, self.player).access_rule = check 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]: def fill_slot_data(self) -> Dict[str, object]:
return { return {
"goal": list(self.goal_locations), "goal": list(self.goal_locations),
"achievements": self.options.achievements.value,
"deathlink": bool(self.options.death_link), "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,
} }