From d1d4e3173887e7ecc97aeafc0d2127e3d9bbf7ae Mon Sep 17 00:00:00 2001 From: Lyle Mantooth Date: Sun, 5 Jun 2022 15:56:36 -0400 Subject: [PATCH 1/6] Format! --- enemize/src/asar.rs | 20 ++++++++++---------- enemize/src/option_flags.rs | 11 ++++++----- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/enemize/src/asar.rs b/enemize/src/asar.rs index 6a34cd0..033f07d 100644 --- a/enemize/src/asar.rs +++ b/enemize/src/asar.rs @@ -16,19 +16,19 @@ pub fn load_symbols(contents: &str) -> anyhow::Result { _ => None, } }) - .filter_map(|(symbol, mut address)| { - if let Some(colon_at) = address.find(':') { - address.remove(colon_at); - } + .filter_map(|(symbol, mut address)| { + if let Some(colon_at) = address.find(':') { + address.remove(colon_at); + } - // Filter out the ones that don't have a hexadecimal number as the first word. - let snes_address = u32::from_str_radix(&address, 16).ok()?; + // Filter out the ones that don't have a hexadecimal number as the first word. + let snes_address = u32::from_str_radix(&address, 16).ok()?; - let pc_address = snes_to_pc_address(snes_address); + let pc_address = snes_to_pc_address(snes_address); - Some((symbol, pc_address)) - }) - .collect(); + Some((symbol, pc_address)) + }) + .collect(); Ok(symbols) } diff --git a/enemize/src/option_flags.rs b/enemize/src/option_flags.rs index c3f1f0d..0f683e3 100644 --- a/enemize/src/option_flags.rs +++ b/enemize/src/option_flags.rs @@ -387,13 +387,11 @@ pub struct OptionFlags { pub enemy_damage_chaos_mode: bool, //pub easy_mode_escape: bool, - pub enemies_absorbable: bool, pub absorbable_spawn_rate: u8, pub absorbable_types: HashMap, //pub boss_madness: bool, - pub randomize_bosses: bool, pub randomize_bosses_type: RandomizeBossesType, @@ -406,7 +404,6 @@ pub struct OptionFlags { //pub randomize_boss_damage_max_amount: u8, //pub randomize_boss_behavior: bool, - pub randomize_dungeon_palettes: bool, pub set_blackout_mode: bool, @@ -766,8 +763,12 @@ mod test { fn test_option_flags_serde() { let empty = "{}"; let actual: OptionFlags = serde_json::from_str(empty).expect("Can't deserialize empty"); - let expected = serde_json::to_string(&OptionFlags::default()).expect("Can't serialize default"); + let expected = + serde_json::to_string(&OptionFlags::default()).expect("Can't serialize default"); - assert_eq!(serde_json::to_string(&actual).expect("Can't roundtrip"), expected); + assert_eq!( + serde_json::to_string(&actual).expect("Can't roundtrip"), + expected + ); } } From 1c752e5bbde7a6454ebc5aa46d250cd9a1d96cd2 Mon Sep 17 00:00:00 2001 From: Lyle Mantooth Date: Sun, 5 Jun 2022 15:57:02 -0400 Subject: [PATCH 2/6] Make RomData indexable. --- enemize/src/rom.rs | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/enemize/src/rom.rs b/enemize/src/rom.rs index fe22d41..b4e8700 100644 --- a/enemize/src/rom.rs +++ b/enemize/src/rom.rs @@ -1,6 +1,6 @@ use std::collections::BTreeMap; use std::iter; -use std::ops::Range; +use std::ops::{Index, IndexMut, Range}; use anyhow::bail; @@ -245,11 +245,6 @@ impl RomData { self.set_patch_bytes(flag_idx..(flag_idx + 1)); } - pub fn patch_bytes(&mut self, address: usize, patch_data: Vec) { - self.rom_data - .splice(address..(address + patch_data.len()), patch_data); - } - pub fn patch_data(&mut self, patch: &Patch) { self.set_rom_bytes( &patch.patch_data, @@ -296,3 +291,17 @@ impl RomData { } } } + +impl Index for RomData { + type Output = u8; + + fn index(&self, index: usize) -> &u8 { + &self.rom_data[index] + } +} + +impl IndexMut for RomData { + fn index_mut(&mut self, index: usize) -> &mut u8 { + &mut self.rom_data[index] + } +} From 13e910091b2d9d4332308e10a8c4f4453b31f729 Mon Sep 17 00:00:00 2001 From: Lyle Mantooth Date: Fri, 10 Jun 2022 11:49:07 -0400 Subject: [PATCH 3/6] Add graph data. Items and dungeons so far. Will be used to make sure the resulting ROM is beatable. --- Cargo.lock | 1 + enemize/Cargo.toml | 1 + enemize/src/graph/dungeons.rs | 144 ++++++++ enemize/src/graph/item.rs | 554 +++++++++++++++++++++++++++++++ enemize/src/graph/mod.rs | 3 + enemize/src/graph/requirement.rs | 16 + enemize/src/lib.rs | 1 + 7 files changed, 720 insertions(+) create mode 100644 enemize/src/graph/dungeons.rs create mode 100644 enemize/src/graph/item.rs create mode 100644 enemize/src/graph/mod.rs create mode 100644 enemize/src/graph/requirement.rs diff --git a/Cargo.lock b/Cargo.lock index c449041..e82f6c3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -102,6 +102,7 @@ version = "0.1.0" dependencies = [ "anyhow", "clap", + "lazy_static", "rand", "serde", "serde_json", diff --git a/enemize/Cargo.toml b/enemize/Cargo.toml index a763a91..6a55151 100644 --- a/enemize/Cargo.toml +++ b/enemize/Cargo.toml @@ -8,6 +8,7 @@ edition = "2021" [dependencies] anyhow = "1" clap = { version = "3.1.18", features = ["derive"] } +lazy_static = "1.4" rand = "0.8" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" diff --git a/enemize/src/graph/dungeons.rs b/enemize/src/graph/dungeons.rs new file mode 100644 index 0000000..5d5bfbc --- /dev/null +++ b/enemize/src/graph/dungeons.rs @@ -0,0 +1,144 @@ +use std::collections::HashMap; + +use lazy_static::lazy_static; + +use super::item::ItemId; + +#[derive(Debug, thiserror::Error)] +#[error("{0} is not a dungeon room")] +pub struct NotADungeonRoom(u8); + +#[derive(Clone, Copy, Eq, Hash, PartialEq)] +pub enum Dungeon { + HyruleCastle, + EasternPalace, + DesertPalace, + TowerOfHera, + AgahnimsTower, + PalaceOfDarkness, + SwampPalace, + SkullWoods, + ThievesTown, + IcePalace, + MiseryMire, + TurtleRock, + GanonsTower, +} + +pub fn get_dungeon_from_room(room_id: u8) -> Result { + for (dungeon, rooms) in DUNGEON_ROOMS.iter() { + if let Ok(_) = rooms.binary_search(&room_id) { + return Ok(*dungeon); + } + } + + Err(NotADungeonRoom(room_id)) +} + +const HYRULE_CASTLE_ROOMS: [u8; 21] = [ + 1, 2, 17, 18, 33, 34, 50, 65, 66, 80, 81, 82, 96, 97, 98, 112, 113, 114, 128, 129, 130, +]; + +const EASTERN_PALACE_ROOMS: [u8; 13] = [ + 137, 153, 168, 169, 170, 184, 185, 186, 200, 201, 216, 217, 218, +]; + +const DESERT_PALACE_ROOMS: [u8; 10] = [51, 67, 83, 99, 115, 116, 117, 131, 132, 133]; + +const TOWER_OF_HERA_ROOMS: [u8; 7] = [7, 23, 39, 49, 119, 135, 167]; + +const AGAHNIMS_TOWER_ROOMS: [u8; 7] = [32, 48, 64, 176, 192, 208, 224]; + +const PALACE_OF_DARKNESS_ROOMS: [u8; 14] = [9, 10, 11, 25, 26, 27, 42, 43, 58, 59, 74, 75, 90, 106]; + +const SWAMP_PALACE_ROOMS: [u8; 13] = [6, 22, 38, 40, 52, 53, 54, 55, 56, 70, 84, 102, 118]; + +const SKULL_WOODS_ROOMS: [u8; 9] = [41, 57, 73, 86, 87, 88, 89, 103, 104]; + +const THIEVES_TOWN_ROOMS: [u8; 12] = [68, 69, 100, 101, 171, 172, 187, 188, 203, 204, 219, 220]; + +const ICE_PALACE_ROOMS: [u8; 22] = [ + 14, 30, 31, 46, 62, 63, 78, 79, 94, 95, 110, 126, 127, 142, 158, 159, 174, 175, 190, 191, 206, + 222, +]; + +const MISERY_MIRE_ROOMS: [u8; 18] = [ + 144, 145, 146, 147, 151, 152, 160, 161, 162, 163, 177, 178, 179, 193, 194, 195, 209, 210, +]; + +const TURTLE_ROCK_ROOMS: [u8; 17] = [ + 4, 19, 20, 21, 35, 36, 164, 180, 181, 182, 183, 196, 197, 198, 199, 213, 214, +]; + +const GANONS_TOWER_ROOMS: [u8; 26] = [ + 12, 13, 28, 29, 61, 76, 77, 91, 92, 93, 107, 108, 109, 123, 124, 125, 139, 140, 141, 149, 150, + 155, 156, 157, 165, 166, +]; + +lazy_static! { + static ref DUNGEON_ROOMS: HashMap = { + use Dungeon::*; + + let mut rooms = HashMap::new(); + + rooms.insert(HyruleCastle, &HYRULE_CASTLE_ROOMS[..]); + rooms.insert(EasternPalace, &EASTERN_PALACE_ROOMS[..]); + rooms.insert(DesertPalace, &DESERT_PALACE_ROOMS[..]); + rooms.insert(TowerOfHera, &TOWER_OF_HERA_ROOMS[..]); + rooms.insert(AgahnimsTower, &AGAHNIMS_TOWER_ROOMS[..]); + rooms.insert(PalaceOfDarkness, &PALACE_OF_DARKNESS_ROOMS[..]); + rooms.insert(SwampPalace, &SWAMP_PALACE_ROOMS[..]); + rooms.insert(SkullWoods, &SKULL_WOODS_ROOMS[..]); + rooms.insert(ThievesTown, &THIEVES_TOWN_ROOMS[..]); + rooms.insert(IcePalace, &ICE_PALACE_ROOMS[..]); + rooms.insert(MiseryMire, &MISERY_MIRE_ROOMS[..]); + rooms.insert(TurtleRock, &TURTLE_ROCK_ROOMS[..]); + rooms.insert(GanonsTower, &GANONS_TOWER_ROOMS[..]); + + rooms + }; + pub static ref DUNGEON_KEYS: HashMap = { + use Dungeon::*; + use ItemId::*; + + let mut keys = HashMap::new(); + + keys.insert(HyruleCastle, HyruleKey); + keys.insert(EasternPalace, EasternKey); + keys.insert(DesertPalace, DesertKey); + keys.insert(TowerOfHera, HeraKey); + keys.insert(AgahnimsTower, AgaKey); + keys.insert(PalaceOfDarkness, PodKey); + keys.insert(SwampPalace, SwampKey); + keys.insert(SkullWoods, SkullKey); + keys.insert(ThievesTown, ThievesKey); + keys.insert(IcePalace, IceKey); + keys.insert(MiseryMire, MireKey); + keys.insert(TurtleRock, TurtleKey); + keys.insert(GanonsTower, GTKey); + + keys + }; + pub static ref DUNGEON_BIG_KEYS: HashMap = { + use Dungeon::*; + use ItemId::*; + + let mut keys = HashMap::new(); + + keys.insert(HyruleCastle, HyruleBigKey); + keys.insert(EasternPalace, EasternBigKey); + keys.insert(DesertPalace, DesertBigKey); + keys.insert(TowerOfHera, HeraBigKey); + keys.insert(AgahnimsTower, AgaBigKey); + keys.insert(PalaceOfDarkness, PodBigKey); + keys.insert(SwampPalace, SwampBigKey); + keys.insert(SkullWoods, SkullBigKey); + keys.insert(ThievesTown, ThievesBigKey); + keys.insert(IcePalace, IceBigKey); + keys.insert(MiseryMire, MireBigKey); + keys.insert(TurtleRock, TurtleBigKey); + keys.insert(GanonsTower, GTBigKey); + + keys + }; +} diff --git a/enemize/src/graph/item.rs b/enemize/src/graph/item.rs new file mode 100644 index 0000000..13f3f16 --- /dev/null +++ b/enemize/src/graph/item.rs @@ -0,0 +1,554 @@ +use std::collections::HashMap; +use std::hash::{Hash, Hasher}; + +use lazy_static::lazy_static; + +#[derive(Clone, Copy)] +pub enum ItemType { + Normal, + Bottle, + Special, + Progressive { level: u8 }, + Consumable { found: u8, used: u8 }, +} + +impl ItemType { + pub fn level(&self) -> u8 { + match self { + Self::Progressive { level } => *level, + _ => 0, + } + } + + pub fn increase_level(&mut self) { + match self { + Self::Progressive { ref mut level } => *level += 1, + _ => (), + } + } + + pub fn found(&self) -> u8 { + match self { + Self::Consumable { found, .. } => *found, + _ => 0, + } + } + + pub fn increase_count(&mut self) { + match self { + Self::Consumable { ref mut found, .. } => *found += 1, + _ => (), + } + } + + pub fn used(&self) -> u8 { + match self { + Self::Consumable { used, .. } => *used, + _ => 0, + } + } + + pub fn consume(&mut self) { + match self { + Self::Consumable { ref mut used, .. } => *used += 1, + _ => (), + } + } + + pub fn usable(&self) -> bool { + match self { + Self::Consumable { found, used } => found > used, + _ => false, + } + } +} + +#[derive(Clone, Copy)] +pub struct Item { + pub id: ItemId, + pub name: &'static str, + pub item_type: ItemType, +} + +impl Item { + pub fn normal(id: ItemId, name: &'static str) -> Self { + Self { + id, + name, + item_type: ItemType::Normal, + } + } + + pub fn bottle(id: ItemId, name: &'static str) -> Self { + Self { + id, + name, + item_type: ItemType::Bottle, + } + } + + pub fn special(id: ItemId, name: &'static str) -> Self { + Self { + id, + name, + item_type: ItemType::Special, + } + } + + pub fn progressive(id: ItemId, name: &'static str) -> Self { + Self { + id, + name, + item_type: ItemType::Progressive { level: 0 }, + } + } + + pub fn consumable(id: ItemId, name: &'static str) -> Self { + Self { + id, + name, + item_type: ItemType::Consumable { found: 0, used: 0 }, + } + } +} + +impl PartialEq for Item { + fn eq(&self, other: &Self) -> bool { + self.id == other.id + } +} + +impl Eq for Item {} + +impl Hash for Item { + fn hash(&self, state: &mut H) { + self.id.hash(state); + } +} + +#[derive(Clone, Copy, Eq, Hash, PartialEq)] +#[repr(u32)] +pub enum ItemId { + FightersSwordAndShield = 0x00, + MasterSword1 = 0x01, + TemperedSword = 0x02, + GoldenSword = 0x03, + FightersShield = 0x04, + FireShield = 0x05, + MirrorShield = 0x06, + FireRod = 0x07, + IceRod = 0x08, + Hammer = 0x09, + Hookshot = 0x0a, + Bow = 0x0b, + Boomerang = 0x0c, + Powder = 0x0d, + Bee = 0x0e, + Bombos = 0x0f, + Ether = 0x10, + Quake = 0x11, + Lamp = 0x12, + Shovel = 0x13, + Flute = 0x14, + Somaria = 0x15, + Bottle = 0x16, + PieceOfHeart = 0x17, + Byrna = 0x18, + Cape = 0x19, + Mirror = 0x1a, + L1Gloves = 0x1b, + L2Gloves = 0x1c, + Book = 0x1d, + Flippers = 0x1e, + MoonPearl = 0x1f, + Crystal = 0x20, + BugCatchingNet = 0x21, + BlueMail = 0x22, + RedMail = 0x23, + Key = 0x24, + Compass = 0x25, + HeartContainerNoAnimation = 0x26, + Bomb = 0x27, + ThreeBombs = 0x28, + Mushroom = 0x29, + MagicalBoomerang = 0x2a, + BottleRedPotion = 0x2b, + BottleGreenPotion = 0x2c, + BottleBluePotion = 0x2d, + RedPotion = 0x2e, + GreenPotion = 0x2f, + BluePotion = 0x30, + TenBombs = 0x31, + BigKey = 0x32, + DungeonMap = 0x33, + GreenRupee = 0x34, + BlueRupee = 0x35, + RedRupee = 0x36, + PendantGreen = 0x37, + PendantRed = 0x38, + PendantBlue = 0x39, + BowAndArrows = 0x3a, + BowAndSilverArrows = 0x3b, + BottleBee = 0x3c, + BottleFairy = 0x3d, + HeartContainer = 0x3e, + HeartContainerRefill = 0x3f, + OneHundredRupees = 0x40, + FiftyRupees = 0x41, + Heart = 0x42, + SingleArrow = 0x43, + TenArrows = 0x44, + SmallMagic = 0x45, + ThreeHundredRupees = 0x46, + RedRupee2 = 0x47, + BottleGoldenBee = 0x48, + FightersSword = 0x49, + FluteActive = 0x4a, + Boots = 0x4b, + MaxBombs = 0x4c, + MaxArrows = 0x4d, + HalfMagic = 0x4e, + QuarterMagic = 0x4f, + MasterSword2 = 0x50, + BombUpgrade5 = 0x51, + BombUpgrade10 = 0x52, + ArrowUpgrade5 = 0x53, + ArrowUpgrade10 = 0x54, + Programmable1 = 0x55, + Programmable2 = 0x56, + Programmable3 = 0x57, + SilverArrows = 0x58, + Rupoor = 0x59, + Nothing = 0x5a, + RedClock = 0x5b, + BlueClock = 0x5c, + GreenClock = 0x5d, + ProgressiveSword = 0x5e, + ProgressiveShield = 0x5f, + ProgressiveArmor = 0x60, + ProgressiveGloves = 0x61, + UniqueRngItem = 0x62, + NonUniqueRngItem = 0x63, + ProgressiveBow = 0x64, + ProgressiveBow2 = 0x65, + Triforce = 0x6a, + PowerStar = 0x6b, + TriforcePiece = 0x6c, + LightWorldMap = 0x70, + DarkWorldMap = 0x71, + GTMap = 0x72, + TurtleMap = 0x73, + ThievesMap = 0x74, + HeraMap = 0x75, + IceMap = 0x76, + SkullMap = 0x77, + MireMap = 0x78, + PodMap = 0x79, + SwampMap = 0x7a, + AgaMap = 0x7b, + DesertMap = 0x7c, + EasternMap = 0x7d, + HyruleMap = 0x7e, + SewersMap = 0x7f, + GTCompass = 0x82, + TurtleCompass = 0x83, + ThievesCompass = 0x84, + HeraCompass = 0x85, + IceCompass = 0x86, + SkullCompass = 0x87, + MireCompass = 0x88, + PodCompass = 0x89, + SwampCompass = 0x8a, + AgaCompass = 0x8b, + DesertCompass = 0x8c, + EasternCompass = 0x8d, + HyruleCompass = 0x8e, + SewersCompass = 0x8f, + SkeletonKey = 0x90, + Reserved0x91 = 0x91, + GTBigKey = 0x92, + TurtleBigKey = 0x93, + ThievesBigKey = 0x94, + HeraBigKey = 0x95, + IceBigKey = 0x96, + SkullBigKey = 0x97, + MireBigKey = 0x98, + PodBigKey = 0x99, + SwampBigKey = 0x9a, + AgaBigKey = 0x9b, + DesertBigKey = 0x9c, + EasternBigKey = 0x9d, + HyruleBigKey = 0x9e, + SewersBigKey = 0x9f, + SewersKey = 0xa0, + HyruleKey = 0xa1, + EasternKey = 0xa2, + DesertKey = 0xa3, + AgaKey = 0xa4, + SwampKey = 0xa5, + PodKey = 0xa6, + MireKey = 0xa7, + SkullKey = 0xa8, + IceKey = 0xa9, + HeraKey = 0xaa, + ThievesKey = 0xab, + TurtleKey = 0xac, + GTKey = 0xad, + Reserved0xAE = 0xae, + Reserved0xAF = 0xaf, + Agahnim1 = 0x01ff, + Agahnim1Boss = 0x02ff, + Agahnim2 = 0x03ff, + Agahnim2Boss = 0x04ff, + BigBomb = 0x05ff, + Crystal1 = 0x06ff, + Crystal2 = 0x07ff, + Crystal3 = 0x08ff, + Crystal4 = 0x09ff, + Crystal5 = 0x0aff, + Crystal6 = 0x0bff, + Crystal7 = 0x0cff, + DesertBoss = 0x0dff, + EasternBoss = 0x0eff, + Smith = 0x0fff, + Ganon = 0x10ff, + GTArmosBoss = 0x11ff, + GTLanmolasBoss = 0x12ff, + GTMoldormBoss = 0x13ff, + HeraBoss = 0x14ff, + IceBoss = 0x15ff, + IceBlock = 0x16ff, + L1Shield = 0x17ff, + L1Sword = 0x18ff, + L2Shield = 0x19ff, + L2Sword = 0x1aff, + L3Shield = 0x1bff, + L3Sword = 0x1cff, + L4Sword = 0x1dff, + MireBoss = 0x1eff, + MiseryMireToken = 0x1fff, + MireSwitch = 0x20ff, + PodBoss = 0x21ff, + PurpleChest = 0x22ff, + SkullBoss = 0x23ff, + SwampBoss = 0x24ff, + ThievesBoss = 0x25ff, + TurtleBoss = 0x26ff, + TurtleRockToken = 0x27ff, + ProgressiveMagic = 0x28ff, +} + +lazy_static! { + pub static ref ITEMS: HashMap = { + use ItemId::*; + + let mut items: HashMap = HashMap::new(); + + items.insert(FightersSwordAndShield, Item::normal(FightersSwordAndShield, "Fighters Sword and Shield")); + items.insert(MasterSword1, Item::normal(MasterSword1, "Master Sword")); + items.insert(TemperedSword, Item::normal(TemperedSword, "Tempered Sword")); + items.insert(GoldenSword, Item::normal(GoldenSword, "Golden Sword")); + items.insert(FightersShield, Item::normal(FightersShield, "Fighters Shield")); + items.insert(FireShield, Item::normal(FireShield, "Fire Shield")); + items.insert(FireRod, Item::normal(FireRod, "Fire Rod")); + items.insert(IceRod, Item::normal(IceRod, "Ice Rod")); + items.insert(Hammer, Item::normal(Hammer, "Hammer")); + items.insert(Hookshot, Item::normal(Hookshot, "Hookshot")); + items.insert(Bow, Item::normal(Bow, "Bow")); + items.insert(Boomerang, Item::normal(Boomerang, "Boomerang")); + items.insert(Powder, Item::normal(Powder, "Magic Powder")); + items.insert(Bee, Item::normal(Bee, "Bee")); + items.insert(Bombos, Item::normal(Bombos, "Bombos")); + items.insert(Ether, Item::normal(Ether, "Ether")); + items.insert(Quake, Item::normal(Quake, "Quake")); + items.insert(Lamp, Item::normal(Lamp, "Lamp")); + items.insert(Shovel, Item::normal(Shovel, "Shovel")); + items.insert(Flute, Item::normal(Flute, "Flute")); + items.insert(Somaria, Item::normal(Somaria, "Cane of Somaria")); + items.insert(Bottle, Item::bottle(Bottle, "Bottle")); + items.insert(PieceOfHeart, Item::normal(PieceOfHeart, "Piece of Heart")); + items.insert(Byrna, Item::normal(Byrna, "Cane of Byrna")); + items.insert(Cape, Item::normal(Cape, "Magic Cape")); + items.insert(Mirror, Item::normal(Mirror, "Magic Mirror")); + items.insert(L1Gloves, Item::progressive(L1Gloves, "Power Gloves")); + items.insert(L2Gloves, Item::progressive(L2Gloves, "Titan Mitts")); + items.insert(Book, Item::normal(Book, "Book of Mudora")); + items.insert(Flippers, Item::normal(Flippers, "Zora's Flippers")); + items.insert(MoonPearl, Item::normal(MoonPearl, "Moon Pearl")); + items.insert(Crystal, Item::special(Crystal, "Crystal")); + items.insert(BugCatchingNet, Item::normal(BugCatchingNet, "Bug Catching Net")); + items.insert(BlueMail, Item::normal(BlueMail, "Blue Mail")); + items.insert(RedMail, Item::normal(RedMail, "Red Mail")); + items.insert(Key, Item::consumable(Key, "Key")); + items.insert(Compass, Item::special(Compass, "Compass")); + items.insert(HeartContainerNoAnimation, Item::normal(HeartContainerNoAnimation, "Heart Container (no animation)")); + items.insert(Bomb, Item::normal(Bomb, "Bomb")); + items.insert(ThreeBombs, Item::normal(ThreeBombs, "3 Bombs")); + items.insert(Mushroom, Item::consumable(Mushroom, "Mushroom")); + items.insert(MagicalBoomerang, Item::normal(MagicalBoomerang, "Magical Boomerang")); + items.insert(BottleRedPotion, Item::bottle(BottleRedPotion, "Bottle (Red Potion)")); + items.insert(BottleGreenPotion, Item::bottle(BottleGreenPotion, "Bottle (Green Potion)")); + items.insert(BottleBluePotion, Item::bottle(BottleBluePotion, "Bottle (Blue Potion)")); + items.insert(RedPotion, Item::special(RedPotion, "Red Potion")); + items.insert(GreenPotion, Item::special(GreenPotion, "Green Potion")); + items.insert(BluePotion, Item::special(BluePotion, "Blue Potion")); + items.insert(TenBombs, Item::normal(TenBombs, "10 Bombs")); + items.insert(BigKey, Item::special(BigKey, "Big Key")); + items.insert(DungeonMap, Item::special(DungeonMap, "Dungeon Map")); + items.insert(GreenRupee, Item::normal(GreenRupee, "Green Rupee")); + items.insert(BlueRupee, Item::normal(BlueRupee, "Blue Rupee")); + items.insert(RedRupee, Item::normal(RedRupee, "Red Rupee")); + items.insert(PendantGreen, Item::special(PendantGreen, "Pendant of Courage")); + items.insert(PendantRed, Item::special(PendantRed, "Pendant of Wisdom")); + items.insert(PendantBlue, Item::special(PendantBlue, "Pendant of Power")); + items.insert(BowAndArrows, Item::special(BowAndArrows, "Bow and Arrows")); + items.insert(BowAndSilverArrows, Item::special(BowAndSilverArrows, "Bow and Silver Arrows")); + items.insert(BottleBee, Item::bottle(BottleBee, "Bottle (Bee)")); + items.insert(BottleFairy, Item::bottle(BottleFairy, "Bottle, (Fairy)")); + items.insert(HeartContainer, Item::normal(HeartContainer, "Heart Container")); + items.insert(HeartContainerRefill, Item::normal(HeartContainerRefill, "Heart Container (refill)")); + items.insert(OneHundredRupees, Item::normal(OneHundredRupees, "100 Rupees")); + items.insert(FiftyRupees, Item::normal(FiftyRupees, "50 Rupees")); + items.insert(Heart, Item::normal(Heart, "Heart")); + items.insert(SingleArrow, Item::normal(SingleArrow, "Single Arrow")); + items.insert(TenArrows, Item::normal(TenArrows, "10 Arrows")); + items.insert(SmallMagic, Item::normal(SmallMagic, "Small Magic Refill")); + items.insert(ThreeHundredRupees, Item::normal(ThreeHundredRupees, "300 Rupees")); + items.insert(RedRupee2, Item::normal(RedRupee2, "Red Rupee")); + items.insert(BottleGoldenBee, Item::bottle(BottleGoldenBee, "Bottle (Golden Bee)")); + items.insert(FightersSword, Item::normal(FightersSword, "Fighter's Sword")); + items.insert(FluteActive, Item::normal(FluteActive, "Flute (activated)")); + items.insert(Boots, Item::normal(Boots, "Pegasus Boots")); + items.insert(MaxBombs, Item::normal(MaxBombs, "Max Bomb Upgrade (50)")); + items.insert(MaxArrows, Item::normal(MaxArrows, "Max Arrow Upgrade (70)")); + items.insert(HalfMagic, Item::normal(HalfMagic, "Half Magic")); + items.insert(QuarterMagic, Item::normal(QuarterMagic, "Quarter Magic")); + items.insert(MasterSword2, Item::normal(MasterSword2, "Master Sword")); + items.insert(BombUpgrade5, Item::normal(BombUpgrade5, "Bomb Upgrade (5)")); + items.insert(BombUpgrade10, Item::normal(BombUpgrade10, "Bomb Upgrade (10)")); + items.insert(ArrowUpgrade5, Item::normal(ArrowUpgrade5, "Arrow Upgrade (5)")); + items.insert(ArrowUpgrade10, Item::normal(ArrowUpgrade10, "Arrow Upgrade (10)")); + items.insert(Programmable1, Item::normal(Programmable1, "Programmable 1")); + items.insert(Programmable2, Item::normal(Programmable2, "Programmable 2")); + items.insert(Programmable3, Item::normal(Programmable3, "Programmable 3")); + items.insert(SilverArrows, Item::normal(SilverArrows, "Silver Arrows")); + items.insert(Rupoor, Item::normal(Rupoor, "Rupoor")); + items.insert(Nothing, Item::normal(Nothing, "Nothing (Null Item)")); + items.insert(RedClock, Item::consumable(RedClock, "Red Clock")); + items.insert(BlueClock, Item::consumable(BlueClock, "Blue Clock")); + items.insert(GreenClock, Item::consumable(GreenClock, "Green Clock")); + items.insert(ProgressiveSword, Item::progressive(ProgressiveSword, "Progressive Sword")); + items.insert(ProgressiveShield, Item::progressive(ProgressiveShield, "Progressive Shield")); + items.insert(ProgressiveArmor, Item::progressive(ProgressiveArmor, "Progressive Armor")); + items.insert(ProgressiveGloves, Item::progressive(ProgressiveGloves, "Progressive Gloves")); + items.insert(UniqueRngItem, Item::special(UniqueRngItem, "Unique RNG Item (RNG Pool Single)")); + items.insert(NonUniqueRngItem, Item::special(NonUniqueRngItem, "Non-unique RNG Item (RNG Pool Multi)")); + items.insert(ProgressiveBow, Item::normal(ProgressiveBow, "Progressive Bow")); // *NOT* ProgressiveItem??? + items.insert(ProgressiveBow2, Item::normal(ProgressiveBow2, "Progressive Bow 2")); + items.insert(Triforce, Item::special(Triforce, "Triforce (Single Goal Item)")); + items.insert(PowerStar, Item::special(PowerStar, "Power Star (Multi Goal Item)")); + items.insert(TriforcePiece, Item::special(TriforcePiece, "Triforce Piece")); + items.insert(LightWorldMap, Item::special(LightWorldMap, "Light World Map")); + items.insert(DarkWorldMap, Item::special(DarkWorldMap, "Dark World Map")); + items.insert(GTMap, Item::special(GTMap, "Ganon's Tower Map")); + items.insert(TurtleMap, Item::special(TurtleMap, "Turtle Rock Map")); + items.insert(ThievesMap, Item::special(ThievesMap, "Thieves' Town Map")); + items.insert(HeraMap, Item::special(HeraMap, "Tower of Hera Map")); + items.insert(IceMap, Item::special(IceMap, "Ice Palace Map")); + items.insert(SkullMap, Item::special(SkullMap, "Skull Woods Map")); + items.insert(MireMap, Item::special(MireMap, "Misery Mire Map")); + items.insert(PodMap, Item::special(PodMap, "Palace of Darkness Map")); + items.insert(SwampMap, Item::special(SwampMap, "Swamp Palace Map")); + items.insert(AgaMap, Item::special(AgaMap, "Agahnim's Tower Map")); + items.insert(DesertMap, Item::special(DesertMap, "Desert Palace Map")); + items.insert(EasternMap, Item::special(EasternMap, "Eastern Palace Map")); + items.insert(HyruleMap, Item::special(HyruleMap, "Hyrule Castle Map")); + items.insert(SewersMap, Item::special(SewersMap, "Sewers Map")); // not the same as HyruleMap? + items.insert(GTCompass, Item::special(GTCompass, "Ganon's Tower Compass")); + items.insert(TurtleCompass, Item::special(TurtleCompass, "Turtle Rock Compass")); + items.insert(ThievesCompass, Item::special(ThievesCompass, "Thieves' Town Compass")); + items.insert(HeraCompass, Item::special(HeraCompass, "Tower of Hera Compass")); + items.insert(IceCompass, Item::special(IceCompass, "Ice Palace Compass")); + items.insert(SkullCompass, Item::special(SkullCompass, "Skull Woods Compass")); + items.insert(MireCompass, Item::special(MireCompass, "Misery Mire Compass")); + items.insert(PodCompass, Item::special(PodCompass, "Palace of Darkness Compass")); + items.insert(SwampCompass, Item::special(SwampCompass, "Swamp Palace Compass")); + items.insert(AgaCompass, Item::special(AgaCompass, "Agahnim's Tower Compass")); + items.insert(DesertCompass, Item::special(DesertCompass, "Desert Palace Compass")); + items.insert(EasternCompass, Item::special(EasternCompass, "Eastern Palace Compass")); + items.insert(HyruleCompass, Item::special(HyruleCompass, "Hyrule Castle Compass")); + items.insert(SewersCompass, Item::special(SewersCompass, "Sewers Compass")); // not the same as HyruleCompass? + items.insert(SkeletonKey, Item::special(SkeletonKey, "Skeleton Key")); + items.insert(Reserved0x91, Item::special(Reserved0x91, "")); + items.insert(GTBigKey, Item::special(GTBigKey, "Ganon's Tower Big Key")); + items.insert(TurtleBigKey, Item::special(TurtleBigKey, "Turtle Rock Big Key")); + items.insert(ThievesBigKey, Item::special(ThievesBigKey, "Thieves' Town Big Key")); + items.insert(HeraBigKey, Item::special(HeraBigKey, "Tower of Hera Big Key")); + items.insert(IceBigKey, Item::special(IceBigKey, "Ice Palace Big Key")); + items.insert(SkullBigKey, Item::special(SkullBigKey, "Skull Woods Big Key")); + items.insert(MireBigKey, Item::special(MireBigKey, "Misery Mire Big Key")); + items.insert(PodBigKey, Item::special(PodBigKey, "Palace of Darkness Big Key")); + items.insert(SwampBigKey, Item::special(SwampBigKey, "Swamp Palace Big Key")); + items.insert(AgaBigKey, Item::special(AgaBigKey, "Agahnim's Tower Big Key")); + items.insert(DesertBigKey, Item::special(DesertBigKey, "Desert Palace Big Key")); + items.insert(EasternBigKey, Item::special(EasternBigKey, "Eastern Palace Big Key")); + items.insert(HyruleBigKey, Item::special(HyruleBigKey, "Hyrule Castle Big Key")); + items.insert(SewersBigKey, Item::special(SewersBigKey, "Sewers Big Key")); // not the same as HyruleBigKey? + items.insert(SewersKey, Item::consumable(SewersKey, "Sewers Key")); + items.insert(HyruleKey, Item::consumable(HyruleKey, "Hyrule Castle Key")); // not the same as SewersKey? + items.insert(EasternKey, Item::consumable(EasternKey, "Eastern Palace Key")); + items.insert(DesertKey, Item::consumable(DesertKey, "Desert Palace Key")); + items.insert(AgaKey, Item::consumable(AgaKey, "Agahnim's Tower Key")); + items.insert(SwampKey, Item::consumable(SwampKey, "Swamp Palace Key")); + items.insert(PodKey, Item::consumable(PodKey, "Palace of Darkness Key")); + items.insert(MireKey, Item::consumable(MireKey, "Misery Mire Key")); + items.insert(SkullKey, Item::consumable(SkullKey, "Skull Woods Key")); + items.insert(IceKey, Item::consumable(IceKey, "Ice Palace Key")); + items.insert(HeraKey, Item::consumable(HeraKey, "Tower of Hera Key")); + items.insert(ThievesKey, Item::consumable(ThievesKey, "Thieves' Town Key")); + items.insert(TurtleKey, Item::consumable(TurtleKey, "Turtle Rock Key")); + items.insert(GTKey, Item::consumable(GTKey, "Ganon's Tower Key")); + items.insert(Reserved0xAE, Item::special(Reserved0xAE, "")); + items.insert(Reserved0xAF, Item::special(Reserved0xAF, "")); + items.insert(Agahnim1, Item::special(Agahnim1, "Agahnim 1 Defeated")); + items.insert(Agahnim1Boss, Item::special(Agahnim1Boss, "Agahnim Boss")); + items.insert(Agahnim2, Item::special(Agahnim2, "Agahnim 2 Defeated")); + items.insert(Agahnim2Boss, Item::special(Agahnim2Boss, "Agahnim 2 Boss")); + items.insert(BigBomb, Item::special(BigBomb, "Big Bomb")); + items.insert(Crystal1, Item::special(Crystal1, "Crystal 1")); + items.insert(Crystal2, Item::special(Crystal2, "Crystal 2")); + items.insert(Crystal3, Item::special(Crystal3, "Crystal 3")); + items.insert(Crystal4, Item::special(Crystal4, "Crystal 4")); + items.insert(Crystal5, Item::special(Crystal5, "Crystal 5")); + items.insert(Crystal6, Item::special(Crystal6, "Crystal 6")); + items.insert(Crystal7, Item::special(Crystal7, "Crystal 7")); + items.insert(DesertBoss, Item::special(DesertBoss, "Desert Boss")); + items.insert(EasternBoss, Item::special(EasternBoss, "Eastern Boss")); + items.insert(Smith, Item::special(Smith, "Frog Smith")); + items.insert(Ganon, Item::special(Ganon, "Ganon")); + items.insert(GTArmosBoss, Item::special(GTArmosBoss, "GT Armos Boss")); + items.insert(GTLanmolasBoss, Item::special(GTLanmolasBoss, "GT Lanmolas Boss")); + items.insert(GTMoldormBoss, Item::special(GTMoldormBoss, "GT Moldorm Boss")); + items.insert(HeraBoss, Item::special(HeraBoss, "Hera Boss")); + items.insert(IceBoss, Item::special(IceBoss, "Ice Boss")); + items.insert(IceBlock, Item::special(IceBlock, "Ice Palace Block")); + items.insert(L1Shield, Item::progressive(L1Shield, "L1 Shield")); + items.insert(L1Sword, Item::progressive(L1Sword, "L1 Sword")); + items.insert(L2Shield, Item::progressive(L2Shield, "L2 Shield")); + items.insert(L2Sword, Item::progressive(L2Sword, "L2 Sword")); + items.insert(L3Shield, Item::progressive(L3Shield, "L3 Shield")); + items.insert(L3Sword, Item::progressive(L3Sword, "L3 Sword")); + items.insert(L4Sword, Item::progressive(L4Sword, "L4 Sword")); + items.insert(MireBoss, Item::special(MireBoss, "Mire Boss")); + items.insert(MiseryMireToken, Item::special(MiseryMireToken, "Misery Mire Entrance Token")); + items.insert(MireSwitch, Item::special(MireSwitch, "Misery Mire Switch")); + items.insert(PodBoss, Item::special(PodBoss, "PoD Boss")); + items.insert(PurpleChest, Item::special(PurpleChest, "Purple Chest")); + items.insert(SkullBoss, Item::special(SkullBoss, "Skull Boss")); + items.insert(ThievesBoss, Item::special(ThievesBoss, "Thieves Boss")); + items.insert(TurtleBoss, Item::special(TurtleBoss, "Turtle Boss")); + items.insert(ProgressiveMagic, Item::special(ProgressiveMagic, "Progressive Magic")); + + items + }; +} diff --git a/enemize/src/graph/mod.rs b/enemize/src/graph/mod.rs new file mode 100644 index 0000000..eb2d62b --- /dev/null +++ b/enemize/src/graph/mod.rs @@ -0,0 +1,3 @@ +pub mod dungeons; +pub mod item; +pub mod requirement; diff --git a/enemize/src/graph/requirement.rs b/enemize/src/graph/requirement.rs new file mode 100644 index 0000000..2bbece0 --- /dev/null +++ b/enemize/src/graph/requirement.rs @@ -0,0 +1,16 @@ +use std::collections::HashSet; + +use super::item::Item; + +pub struct Requirement(HashSet); + +impl Requirement { + pub fn new(items: &[Item]) -> Requirement { + Requirement(HashSet::from_iter(items.into_iter().map(|i| *i))) + } + + pub fn is_met(&self, items: &[Item]) -> bool { + let items = HashSet::from_iter(items.into_iter().map(|i| *i)); + self.0.is_subset(&items) + } +} diff --git a/enemize/src/lib.rs b/enemize/src/lib.rs index a499767..d130be2 100644 --- a/enemize/src/lib.rs +++ b/enemize/src/lib.rs @@ -10,6 +10,7 @@ use crate::rom::RomData; pub mod asar; pub mod bosses; pub mod constants; +pub mod graph; pub mod option_flags; pub mod randomize; pub mod rom; From 6a56e52e58c725e6ea4652ae39125f282284677a Mon Sep 17 00:00:00 2001 From: Lyle Mantooth Date: Sun, 12 Jun 2022 11:21:24 -0400 Subject: [PATCH 4/6] Add room data. --- enemize/src/graph/dungeons.rs | 920 ++++++++++++++++++++++++++++++++++ 1 file changed, 920 insertions(+) diff --git a/enemize/src/graph/dungeons.rs b/enemize/src/graph/dungeons.rs index 5d5bfbc..4d25b9a 100644 --- a/enemize/src/graph/dungeons.rs +++ b/enemize/src/graph/dungeons.rs @@ -142,3 +142,923 @@ lazy_static! { keys }; } + +#[derive(Clone, Copy, Eq, PartialEq, Hash)] +#[repr(u16)] +pub enum Room { + Ganon = 0, + HyruleCastleNorthCorridor, + HyruleCastleSwitchRoom, + HoulihanRoom, + TurtleRockCrystalRollerRoom, + EmptyCloneRoom0x05, + SwampPalaceArrghus, + TowerOfHeraMoldorm, + CaveHealingFairy, + PalaceOfDarkness0x09, + PalaceOfDarknessStalfossTrapRoom, + PalaceOfDarknessTurtleRoom, + GanonsTowerEntranceRoom, + GanonsTowerAgahnim2, + IcePalaceEntranceRoom, + EmptyCloneRoom0x0F, + GanonEvacuationRoute, + HyruleCastleBombableStockRoom, + Sanctuary, + TurtleRockHokkuBokkuKeyRoom2, + TurtleRockBigKeyRoom, + TurtleRock0x15, + SwampPalaceSwimmingTreadmill, + TowerOfHeraMoldormFallRoom, + Cave0x18BigFairyDropEntrance, + PalaceOfDarknessDarkMaze, + PalaceOfDarknessBigChestRoom, + PalaceOfDarknessMimicsMovingWallRoom, + GanonsTowerIceArmos, + GanonsTowerFinalHallway, + IcePalaceBombFloorBariRoom, + IcePalacePengatorBigKeyRoom, + AgahnimsTowerAgahnim, + HyruleCastleKeyRatRoom, + HyruleCastleSewerTextTriggerRoom, + TurtleRockWestExitToBalcony, + TurtleRockDoubleHokkuBokkuBigChestRoom, + EmptyCloneRoom0x25, + SwampPalaceStatueRoom, + TowerOfHeraBigChest, + SwampPalaceEntranceRoom, + SkullWoodsMothula, + PalaceOfDarknessBigHubRoom, + PalaceOfDarknessMapChestFairyRoom, + CaveHookshotCaveBackdoor, + EmptyCloneRoom0x2D, + IcePalaceCompassRoom, + CaveKakarikoWellHP, + AgahnimsTowerMaidenSacrificeChamber, + TowerOfHeraHardhatBeetleRoom, + HyruleCastleSewerKeyChestRoom, + DesertPalaceLanmolas, + SwampPalacePushBlockPuzzlePreBigKeyRoom, + SwampPalaceBigKeyBsRoom, + SwampPalaceBigChestRoom, + SwampPalaceMapChestWaterFillRoom, + SwampPalaceKeyPotRoom, + SkullWoodsGibdoKeyMothulaHoleRoom, + PalaceOfDarknessBombableFloorRoom, + PalaceOfDarknessSpikeBlockConveyorRoom, + CaveHookshotCave, + GanonsTowerTorchRoom2, + IcePalaceStalfosKnightConveyorHellway, + IcePalaceMapChestRoom, + AgahnimsTowerFinalBridgeRoom, + HyruleCastleFirstDarkRoom, + HyruleCastle6RopesRoom, + DesertPalaceTorchPuzzleMovingWallRoom, + ThievesTownBigChestRoom, + ThievesTownJailCellsRoom, + SwampPalaceCompassChestRoom, + EmptyCloneRoom0x47, + EmptyCloneRoom0x48, + SkullWoodsGibdoTorchPuzzleRoom, + PalaceOfDarknessEntranceRoom, + PalaceOfDarknessWarpsSouthMimicRoom, + GanonsTowerMiniHelmasaurConveyorRoom, + GanonsTowerMoldormRoom, + IcePalaceBombJumpRoom, + IcePalaceCloneRoomFairyRoom, + HyruleCastleWestCorridor, + HyruleCastleThroneRoom, + HyruleCastleEastCorridor, + DesertPalacePopos2BeamosHellwayRoom, + SwampPalaceUpstairsPitsRoom, + CastleSecretEntranceUncleRoom, + SkullWoodsKeyPotTrapRoom, + SkullWoodsBigKeyRoom, + SkullWoodsBigChestRoom, + SkullWoodsFinalSectionEntranceRoom, + PalaceOfDarknessHelmasaurKing, + GanonsTowerSpikePitRoom, + GanonsTowerGanonBallZ, + GanonsTowerGauntlet123, + IcePalaceLonelyFirebar, + IcePalaceHiddenChestSpikeFloorRoom, + HyruleCastleWestEntranceRoom, + HyruleCastleMainEntranceRoom, + HyruleCastleEastEntranceRoom, + DesertPalaceFinalSectionEntranceRoom, + ThievesTownWestAtticRoom, + ThievesTownEastAtticRoom, + SwampPalaceHiddenChestHiddenDoorRoom, + SkullWoodsCompassChestRoom, + SkullWoodsKeyChestTrapRoom, + EmptyCloneRoom0x69, + PalaceOfDarknessRupeeRoom, + GanonsTowerMimicsRoom, + GanonsTowerLanmolasRoom, + GanonsTowerGauntlet45, + IcePalacePengatorsRoom, + EmptyCloneRoom0x6F, + HyruleCastleSmallCorridorToJailCells, + HyruleCastleBoomerangChestRoom, + HyruleCastleMapChestRoom, + DesertPalaceBigChestRoom, + DesertPalaceMapChestRoom, + DesertPalaceBigKeyChestRoom, + SwampPalaceWaterDrainRoom, + TowerOfHeraEntranceRoom, + EmptyCloneRoom0x78, + EmptyCloneRoom0x79, + EmptyCloneRoom0x7A, + GanonsTowerMisc, + GanonsTowerEastSideCollapsingBridgeExplodingWallRoom, + GanonsTowerWinderWarpMazeRoom, + IcePalaceHiddenChestBombableFloorRoom, + IcePalaceBigSpikeTrapsRoom, + HyruleCastleJailCellRoom, + HyruleCastleNextToChasmRoom, + HyruleCastleBasementChasmRoom, + DesertPalaceWestEntranceRoom, + DesertPalaceMainEntranceRoom, + DesertPalaceEastEntranceRoom, + EmptyCloneRoom0x86, + TowerOfHeraTileRoom, + EmptyCloneRoom0x88, + EasternPalaceFairyRoom, + EmptyCloneRoom0x8A, + GanonsTowerBlockPuzzleSpikeSkipMapChestRoom, + GanonsTowerEastAndWestDownstairsBigChestRoom, + GanonsTowerTileTorchPuzzleRoom, + IcePalaceBlobsWithTetrisBarrier, + EmptyCloneRoom0x8F, + MiseryMireVitreous, + MiseryMireFinalSwitchRoom, + MiseryMireDarkBombWallSwitchesRoom, + MiseryMireDarkCaneFLoorSwitchPuzzleRoom, + EmptyCloneRoom0x94, + GanonsTowerFinalCollapsingBridgeRoom, + GanonsTowerTorches1Room, + MiseryMireTorchPuzzleMovingWallRoom, + MiseryMireEntranceRoom, + EasternPalaceEyegoreKeyRoom, + EmptyCloneRoom0x9A, + GanonsTowerManySpikesWarpMazeRoom, + GanonsTowerInvisibleFloorMazeRoom, + GanonsTowerCompassChestInvisibleFloorRoom, + IcePalaceBigChestRoom, + IcePalaceIceFloorPotsKeyAndSwitch, + MiseryMirePreVitreousRoom, + MiseryMireFishRoom, + MiseryMireBridgeKeyChestRoom, + MiseryMireEmptyLConnectingRoom, + TurtleRockTrinexx, + GanonsTowerWizzrobesRooms, + GanonsTowerMoldormFallRoom, + TowerOfHeraFairyRoom, + EasternPalaceStalfosSpawnRoom, + EasternPalaceBigChestRoom, + EasternPalaceMapChestRoom, + ThievesTownMovingSpikesKeyPotRoom, + ThievesTownBlindTheThief, + EmptyCloneRoom0xAD, + IcePalaceIceTRoom, + IcePalaceIceBridgeRoom, + AgahnimsTowerCircleOfPots, + MiseryMireHourglassRoom, + MiseryMireSlugRoom, + MiseryMireSpikeKeyChestRoom, + TurtleRockPreTrinexxRoom, + TurtleRockDarkMaze, + TurtleRockChainChompsRoom, + TurtleRockMapChestKeyChestRollerRoom, + EasternPalaceBigKeyRoom, + EasternPalaceLobbyCannonballsRoom, + EasternPalaceDarkAntifairyKeyPotRoom, + ThievesTownHellway, + ThievesTownConveyorToilet, + EmptyCloneRoom0xBD, + IcePalaceBlockPuzzleRoom, + IcePalaceCloneRoomSwitchRoom, + AgahnimsTowerDarkBridgeRoom, + MiseryMireCompassChestTileRoom, + MiseryMireBigHubRoom, + MiseryMireBigChestRoom, + TurtleRockFinalCrystalSwitchPuzzleRoom, + TurtleRockLaserBridge, + TurtleRockSomariaHub, + TurtleRockTorchPuzzle, + EasternPalaceArmosKnights, + EasternPalaceEntranceRoom, + UnknownRoom, + ThievesTownNorthWestEntranceRoom, + ThievesTownNorthEastEntranceRoom, + EmptyCloneRoom0xCD, + IcePalaceHoleToKholdstareRoom, + EmptyCloneRoom0xCF, + AgahnimsTowerDarkMaze, + MiseryMireConveyorSlugBigKeyRoom, + MiseryMireWizzrobesRoom, + EmptyCloneRoom0xD3, + EmptyCloneRoom0xD4, + TurtleRockLaserKeyRoom, + TurtleRockEntranceRoom, + EmptyCloneRoom0xD7, + EasternPalacePreArmosKnightsRoom, + EasternPalaceCannonballRoom, + EasternPalacePotSwitchRoom, + ThievesTownSouthWestEntranceRoom, + ThievesTownSouthEastEntranceRoom, + EmptyCloneRoom0xDD, + IcePalaceKholdstare, + CaveBackwardsDeathMountainTopFloor, + AgahnimsTowerEntranceRoom, + CaveLostWoodsHP, + CaveLumberjacksTreeHP, + CaveMagicBat, + CaveLostOldManHouse, + CaveLostOldManHouseBack, + Cave0xE6, + Cave0xE7, + CaveSuperBunnyTop, + EmptyCloneRoom0xE9, + CaveSpectacleRockHP, + CaveBumperCaveTop, + EmptyCloneRoom0xEC, + Cave0xED, + CaveSpiralCave, + CaveCrystalSwitch5ChestsRoom, + CaveLostOldManStartingCaveBottom, + CaveLostOldManStartingCaveTop, + HouseOldWomanNextDoor, + HouseOldWomanSahasrahlasWifeMaybe, + HouseAngryBrothersWest, + HouseAngryBrothersEast, + EmptyCloneRoom0xF6, + EmptyCloneRoom0xF7, + CaveSuperBunnyBottom, + CaveSpectacleRockExit, + CaveSpectacleRockPrizeEntrance, + CaveBumperCaveBottom, + EmptyCloneRoom0xFC, + Cave0xFD, + CaveSpiralCaveExit, + CaveParadoxCaveMiddleEntrance, + ShopInLostWoods0x100, + ScaredLadyHouses, + SickKid, + InnBushHouse, + LinksHouse, + ShabadooHouse, + ChestGameBombHouse, + LibraryBombFarmRoom, + ChickenHouse, + WitchHut, + Aginah, + Dam, + MimicCave, + CaveOutsideMiseryMire, + Cave0x10E, + Shop0x10F, + Shop0x110, + ArcherGame, + CaveShop0x112, + KingsTomb, + WishingWellCave0x114, + WishingWellBigFairy, + FatFairy, + SpikeCave, + Shop0x118, + BlindsHouse, + Mutant, + MirrorCaveGroveAndTomb, + BombShop, + BlindsBasement, + HypeCave, + Shop0x11F, + IceRodCave, + SmithHouse, + FortuneTellers, + MiniMoldormCave, + UnknownCaveBonkCave, + Cave0x125, + CheckerBoardCave, + HammerPegCave, +} + +use Room::*; + +lazy_static! { + pub static ref ROOM_NAMES: HashMap = { + + let names = [ + (Ganon, "Ganon"), + (HyruleCastleNorthCorridor, "Hyrule Castle (North Corridor)"), + (HyruleCastleSwitchRoom, "Hyrule Castle (Switch Room)"), + (HoulihanRoom, "Houlihan Room"), + (TurtleRockCrystalRollerRoom, "Turtle Rock (Crystal Roller Room)"), + (EmptyCloneRoom0x05, "Empty Clone Room"), + (SwampPalaceArrghus, "Swamp Palace (Arrghus[Boss])"), + (TowerOfHeraMoldorm, "Tower of Hera (Moldorm[Boss])"), + (CaveHealingFairy, "Cave (Healing Fairy)"), + (PalaceOfDarkness0x09, "Palace of Darkness"), + (PalaceOfDarknessStalfossTrapRoom, "Palace of Darkness (Stalfoss Trap Room)"), + (PalaceOfDarknessTurtleRoom, "Palace of Darkness (Turtle Room)"), + (GanonsTowerEntranceRoom, "Ganon's Tower (Entrance Room)"), + (GanonsTowerAgahnim2, "Ganaon's Tower (Agahnim2[Boss])"), + (IcePalaceEntranceRoom, "Ice Palace (Entrance Room)"), + (EmptyCloneRoom0x0F, "Empty Clone Room"), + (GanonEvacuationRoute, "Ganon Evacuation Route"), + (HyruleCastleBombableStockRoom, "Hyrule Castle (Bombable Stock Room)"), + (Sanctuary, "Sanctuary"), + (TurtleRockHokkuBokkuKeyRoom2, "Turtle Rock (Hokku-Bokku Key Room 2)"), + (TurtleRockBigKeyRoom, "Turtle Rock (Big Key Room)"), + (TurtleRock0x15, "Turtle Rock"), + (SwampPalaceSwimmingTreadmill, "Swamp Palace (Swimming Treadmill)"), + (TowerOfHeraMoldormFallRoom, "Tower of Hera (Moldorm Fall Room)"), + (Cave0x18BigFairyDropEntrance, "Big Fairy Drop Entrance Cave"), + (PalaceOfDarknessDarkMaze, "Palace of Darkness (Dark Maze)"), + (PalaceOfDarknessBigChestRoom, "Palace of Darkness (Big Chest Room)"), + (PalaceOfDarknessMimicsMovingWallRoom, "Palace of Darkness (Mimics / Moving Wall Room"), + (GanonsTowerIceArmos, "Ganon's Tower (Ice Armos)"), + (GanonsTowerFinalHallway, "Ganon's Tower (Final Hallway)"), + (IcePalaceBombFloorBariRoom, "Ice Palace (Bomb Floor / Bari Room)"), + (IcePalacePengatorBigKeyRoom, "Ice Palace (Pengator / Big Key Room)"), + (AgahnimsTowerAgahnim, "Agahnim's Tower (Agahnim[Boss])"), + (HyruleCastleKeyRatRoom, "Hyrule Castle (Key Rat Room)"), + (HyruleCastleSewerTextTriggerRoom, "Hyrule Castle (Sewer Text Trigger Room)"), + (TurtleRockWestExitToBalcony, "Turtle Rock (West Exit to Balcony)"), + (TurtleRockDoubleHokkuBokkuBigChestRoom, "Turtle Rock (Double Hokku-Bokku / Big Chest Room)"), + (EmptyCloneRoom0x25, "Empty Clone Room"), + (SwampPalaceStatueRoom, "Swamp Palace (Statue Room)"), + (TowerOfHeraBigChest, "Tower of Hera (Big Chest)"), + (SwampPalaceEntranceRoom, "Swamp Palace (Entrance Room)"), + (SkullWoodsMothula, "Skull Woods (Mothula[Boss])"), + (PalaceOfDarknessBigHubRoom, "Palace of Darkness (Big Hub Room)"), + (PalaceOfDarknessMapChestFairyRoom, "Palace of Darkness (Map Chest / Fairy Room)"), + (CaveHookshotCaveBackdoor, "Hookshot Cave Backdoor (Big Fairy)"), + (EmptyCloneRoom0x2D, "Empty Clone Room"), + (IcePalaceCompassRoom, "Ice Palace (Compass Room)"), + (CaveKakarikoWellHP, "Kakariko Well HP"), + (AgahnimsTowerMaidenSacrificeChamber, "Agahnim's Tower (Maiden Sacrifice Chamber)"), + (TowerOfHeraHardhatBeetleRoom, "Tower of Hera (Hardhat Beetles Room)"), + (HyruleCastleSewerKeyChestRoom, "Hyrule Castle (Sewer Key Chest Room)"), + (DesertPalaceLanmolas, "Desert Palace (Lanmolas[Boss])"), + (SwampPalacePushBlockPuzzlePreBigKeyRoom, "Swamp Palace (Push Block Puzzle / Pre-Big-Key Room"), + (SwampPalaceBigKeyBsRoom, "Swamp Palace (Big Key / BS Room)"), + (SwampPalaceBigChestRoom, "Swamp Palace (Big Chest Room)"), + (SwampPalaceMapChestWaterFillRoom, "Swamp Palace (Map Chest / Water Fill Room)"), + (SwampPalaceKeyPotRoom, "Swamp Palace (Key Pot Room)"), + (SkullWoodsGibdoKeyMothulaHoleRoom, "Skull Woods (Gibdo Key / Mothula Hole Room)"), + (PalaceOfDarknessBombableFloorRoom, "Palace of Darkness (Bombable Floor Room)"), + (PalaceOfDarknessSpikeBlockConveyorRoom, "Palace of Darkness (Spike Block / Conveyor Room)"), + (CaveHookshotCave, "Hookshot Cave"), + (GanonsTowerTorchRoom2, "Ganon's Tower (Torch Room 2)"), + (IcePalaceStalfosKnightConveyorHellway, "Ice Palace (Stalfos Knight / Conveyor Hellway)"), + (IcePalaceMapChestRoom, "Ice Palace (Map Chest Room)"), + (AgahnimsTowerFinalBridgeRoom, "Agahnim's Tower (Final Bridge Room)"), + (HyruleCastleFirstDarkRoom, "Hyrule Castle (First Dark Room)"), + (HyruleCastle6RopesRoom, "Hyrule Castle (6 Ropes Room)"), + (DesertPalaceTorchPuzzleMovingWallRoom, "Desert Palace (Torch Puzzle / Moving Wall Room)"), + (ThievesTownBigChestRoom, "Thieves' Town (Big Chest Room)"), + (ThievesTownJailCellsRoom, "Thieves' Town (Jail Cells Room)"), + (SwampPalaceCompassChestRoom, "Swamp Palace (Compass Chest Room)"), + (EmptyCloneRoom0x47, "Empty Clone Room"), + (EmptyCloneRoom0x48, "Empty Clone Room"), + (SkullWoodsGibdoTorchPuzzleRoom, "Skull Woods (Gibdo Torch Puzzle Room)"), + (PalaceOfDarknessEntranceRoom, "Palace of Darkness (Entrance Room)"), + (PalaceOfDarknessWarpsSouthMimicRoom, "Palace of Darkness (Warps / South Mimic Room)"), + (GanonsTowerMiniHelmasaurConveyorRoom, "Ganon's Tower (Mini-Helmasaur Conveyor Room)"), + (GanonsTowerMoldormRoom, "Ganon's Tower (Moldorm Room)"), + (IcePalaceBombJumpRoom, "Ice Palace (Bomb Jump Room)"), + (IcePalaceCloneRoomFairyRoom, "Ice Palace Clone Room (Fairy Room)"), + (HyruleCastleWestCorridor, "Hyrule Castle (West Corridor)"), + (HyruleCastleThroneRoom, "Hyrule Castle (Throne Room)"), + (HyruleCastleEastCorridor, "Hyrule Castle (East Corridor)"), + (DesertPalacePopos2BeamosHellwayRoom, "Desert Palace (Popos 2 / Beamos Hellway Room)"), + (SwampPalaceUpstairsPitsRoom, "Swamp Palace (Upstairs Pits Room)"), + (CastleSecretEntranceUncleRoom, "Castle Secret Entrance / Uncle Room"), + (SkullWoodsKeyPotTrapRoom, "Skull Woods (Key Pot / Trap Room)"), + (SkullWoodsBigKeyRoom, "Skull Woods (Big Key Room)"), + (SkullWoodsBigChestRoom, "Skull Woods (Big Chest Room)"), + (SkullWoodsFinalSectionEntranceRoom, "Skull Woods (Final Section Entrance Room)"), + (PalaceOfDarknessHelmasaurKing, "Palace of Darkness (Helmasaur King[Boss])"), + (GanonsTowerSpikePitRoom, "Ganon's Tower (Spike Pit Room)"), + (GanonsTowerGanonBallZ, "Ganon's Tower (Ganon-Ball Z)"), + (GanonsTowerGauntlet123, "Ganon's Tower (Gauntlet 1/2/3)"), + (IcePalaceLonelyFirebar, "Ice Palace (Lonely Firebar)"), + (IcePalaceHiddenChestSpikeFloorRoom, "Ice Palace (Hidden Chest / Spike Floor Room)"), + (HyruleCastleWestEntranceRoom, "Hyrule Castle (West Entrance Room)"), + (HyruleCastleMainEntranceRoom, "Hyrule Castle (Main Entrance Room)"), + (HyruleCastleEastEntranceRoom, "Hyrule Castle (East Entrance Room)"), + (DesertPalaceFinalSectionEntranceRoom, "Desert Palace (Final Section Entrance Room)"), + (ThievesTownWestAtticRoom, "Thieves' Town (West Attic Room)"), + (ThievesTownEastAtticRoom, "Thieves' Town (East Attic Room)"), + (SwampPalaceHiddenChestHiddenDoorRoom, "Swamp Palace (Hidden Chest / Hidden Door Room)"), + (SkullWoodsCompassChestRoom, "Skull Woods (Compass Chest Room)"), + (SkullWoodsKeyChestTrapRoom, "Skull Woods (Key Chest / Trap Room)"), + (EmptyCloneRoom0x69, "Empty Clone Room"), + (PalaceOfDarknessRupeeRoom, "Palace of Darkness (Rupee Room)"), + (GanonsTowerMimicsRoom, "Ganon's Tower (Mimics Room)"), + (GanonsTowerLanmolasRoom, "Ganon's Tower (Lanmolas Room"), + (GanonsTowerGauntlet45, "Ganon's Tower (Gauntlet 4/5)"), + (IcePalacePengatorsRoom, "Ice Palace (Pengators Room)"), + (EmptyCloneRoom0x6F, "Empty Clone Room"), + (HyruleCastleSmallCorridorToJailCells, "Hyrule Castle (Small Corridor to Jail Cells"), + (HyruleCastleBoomerangChestRoom, "Hyrule Castle (Boomerang Chest Room)"), + (HyruleCastleMapChestRoom, "Hyrule Castle (Map Chest Room)"), + (DesertPalaceBigChestRoom, "Desert Palace (Big Chest Room)"), + (DesertPalaceMapChestRoom, "Desert Palace (Map Chest Room)"), + (DesertPalaceBigKeyChestRoom, "Desert Palace (Big Key Chest Room)"), + (SwampPalaceWaterDrainRoom, "Swamp Palace (Water Drain Room)"), + (TowerOfHeraEntranceRoom, "Tower of Hera (Entrance Room)"), + (EmptyCloneRoom0x78, "Empty Clone Room"), + (EmptyCloneRoom0x79, "Empty Clone Room"), + (EmptyCloneRoom0x7A, "Empty Clone Room"), + (GanonsTowerMisc, "Ganon's Tower (Sideways Conveyors / 4 Chest 4 Shooter / Square Pit"), + (GanonsTowerEastSideCollapsingBridgeExplodingWallRoom, "Ganon's Tower (East Side Collapsing Bridge / Exploding Wall Room)"), + (GanonsTowerWinderWarpMazeRoom, "Ganon's Tower (Winder / Warp Maze Room)"), + (IcePalaceHiddenChestBombableFloorRoom, "Ice Palace (Hidden Chest / Bombable Floor Room)"), + (IcePalaceBigSpikeTrapsRoom, "Ice Palace (Big Spike Traps Room)"), + (HyruleCastleJailCellRoom, "Hyrule Castle (Jail Cell Room)"), + (HyruleCastleNextToChasmRoom, "Hyrule Castle (Next to Chasm Room)"), + (HyruleCastleBasementChasmRoom, "Hyrule Castle (Basement Chasm Room)"), + (DesertPalaceWestEntranceRoom, "Desert Palace (West Entrance Room)"), + (DesertPalaceMainEntranceRoom, "Desert Palace (Main Entrance Room)"), + (DesertPalaceEastEntranceRoom, "Desert Palace (East Entrance Room)"), + (EmptyCloneRoom0x86, "Empty Clone Room"), + (TowerOfHeraTileRoom, "Tower of Hera (Tile Room)"), + (EmptyCloneRoom0x88, "Empty Clone Room"), + (EasternPalaceFairyRoom, "Eastern Palace (Fairy Room)"), + (EmptyCloneRoom0x8A, "Empty Clone Room"), + (GanonsTowerBlockPuzzleSpikeSkipMapChestRoom, "Ganon's Tower (Block Puzzle / Spike Skip / Map Chest Room)"), + (GanonsTowerEastAndWestDownstairsBigChestRoom, "Ganon's Tower (East and West Downstairs / Big Chest Room)"), + (GanonsTowerTileTorchPuzzleRoom, "Ganon's Tower (Tile / Torch Puzzle Room)"), + (IcePalaceBlobsWithTetrisBarrier, "Ice Palace (Blobs with Tetris Barrier)"), + (EmptyCloneRoom0x8F, "Empty Clone Room"), + (MiseryMireVitreous, "Misery Mire (Vitreous[Boss])"), + (MiseryMireFinalSwitchRoom, "Misery Mire (Final Switch Room)"), + (MiseryMireDarkBombWallSwitchesRoom, "Misery Mire (Dark Bomb Wall / Switches Room)"), + (MiseryMireDarkCaneFLoorSwitchPuzzleRoom, "Misery Mire (Dark Cane FLoor Switch Puzzle Room)"), + (EmptyCloneRoom0x94, "Empty Clone Room"), + (GanonsTowerFinalCollapsingBridgeRoom, "Ganon's Tower (Final Collapsing Bridge Room)"), + (GanonsTowerTorches1Room, "Ganon's Tower (Torches 1 Room)"), + (MiseryMireTorchPuzzleMovingWallRoom, "Misery Mire (Torch Puzzle / Moving Wall Room)"), + (MiseryMireEntranceRoom, "Misery Mire (Entrance Room)"), + (EasternPalaceEyegoreKeyRoom, "Eastern Palace (Eyegore Key Room)"), + (EmptyCloneRoom0x9A, "Empty Clone Room"), + (GanonsTowerManySpikesWarpMazeRoom, "Ganon's Tower (Many Spikes / Warp Maze Room)"), + (GanonsTowerInvisibleFloorMazeRoom, "Ganon's Tower (Invisible Floor Maze Room)"), + (GanonsTowerCompassChestInvisibleFloorRoom, "Ganon's Tower (Compass Chest / Invisible Floor Room)"), + (IcePalaceBigChestRoom, "Ice Palace (Big Chest Room)"), + (IcePalaceIceFloorPotsKeyAndSwitch, "Ice Palace (Room with ice floor, key, and 4 wall rats)"), + (MiseryMirePreVitreousRoom, "Misery Mire (Pre-Vitreous Room)"), + (MiseryMireFishRoom, "Misery Mire (Fish Room)"), + (MiseryMireBridgeKeyChestRoom, "Misery Mire (Bridge Key Chest Room)"), + (MiseryMireEmptyLConnectingRoom, "Misery Mire (Empty 'L' Connecting Room)"), + (TurtleRockTrinexx, "Turtle Rock (Trinexx[Boss])"), + (GanonsTowerWizzrobesRooms, "Ganon's Tower (Wizzrobes Rooms)"), + (GanonsTowerMoldormFallRoom, "Ganon's Tower (Moldorm Fall Room)"), + (TowerOfHeraFairyRoom, "Tower of Hera (Fairy Room)"), + (EasternPalaceStalfosSpawnRoom, "Eastern Palace (Staflos Spawn Room)"), + (EasternPalaceBigChestRoom, "Eastern Palace (Big Chest Room)"), + (EasternPalaceMapChestRoom, "Eastern Palace (Map Chest Room)"), + (ThievesTownMovingSpikesKeyPotRoom, "Thieves' Town (Moving Spikes / Key Pot Room)"), + (ThievesTownBlindTheThief, "Thieves' Town (Blind the Thief[Boss])"), + (EmptyCloneRoom0xAD, "Empty Clone Room"), + (IcePalaceIceTRoom, "Ice Palace (Ice T Room)"), + (IcePalaceIceBridgeRoom, "Ice Palace (Ice Bridge Room)"), + (AgahnimsTowerCircleOfPots, "Agahnim's Tower (Circle of Pots)"), + (MiseryMireHourglassRoom, "Misery Mire (Hourglass Room)"), + (MiseryMireSlugRoom, "Misery Mire (Slug Room)"), + (MiseryMireSpikeKeyChestRoom, "Misery Mire (Spike Key Chest Room)"), + (TurtleRockPreTrinexxRoom, "Turtle Rock (Pre-Trinexx Room)"), + (TurtleRockDarkMaze, "Turtle Rock (Dark Maze)"), + (TurtleRockChainChompsRoom, "Turtle Rock (Chain Chomps Room)"), + (TurtleRockMapChestKeyChestRollerRoom, "Turtle Rock (Map Chest / Key Chest / Roller Room)"), + (EasternPalaceBigKeyRoom, "Eastern Palace (Big Key Room)"), + (EasternPalaceLobbyCannonballsRoom, "Eastern Palace (Lobby Cannonballs Room)"), + (EasternPalaceDarkAntifairyKeyPotRoom, "Eastern Palace (Dark Antifairy / Key Pot Room)"), + (ThievesTownHellway, "Thieves' Town (Hellway)"), + (ThievesTownConveyorToilet, "Thieves' Town (Conveyor Toilet)"), + (EmptyCloneRoom0xBD, "Empty Clone Room"), + (IcePalaceBlockPuzzleRoom, "Ice Palace (Block Puzzle Room)"), + (IcePalaceCloneRoomSwitchRoom, "Ice Palace Clone Room (Switch Room)"), + (AgahnimsTowerDarkBridgeRoom, "Agahnim's Tower (Dark Bridge Room)"), + (MiseryMireCompassChestTileRoom, "Misery Mire (Compass Chest / Tile Room)"), + (MiseryMireBigHubRoom, "Misery Mire (Big Hub Room)"), + (MiseryMireBigChestRoom, "Misery Mire (Big Chest Room)"), + (TurtleRockFinalCrystalSwitchPuzzleRoom, "Turtle Rock (Final Crystal Switch Puzzle Room)"), + (TurtleRockLaserBridge, "Turtle Rock (Laser Bridge)"), + (TurtleRockSomariaHub, "Turtle Rock (Somaria Hub Room)"), + (TurtleRockTorchPuzzle, "Turtle Rock (Torch Puzzle)"), + (EasternPalaceArmosKnights, "Eastern Palace (Armos Knights[Boss])"), + (EasternPalaceEntranceRoom, "Eastern Palace (Entrance Room)"), + (UnknownRoom, "Unused Room??"), + (ThievesTownNorthWestEntranceRoom, "Thieves' Town (North West Entrance Room)"), + (ThievesTownNorthEastEntranceRoom, "Thieves' Town (North East Entrance Room)"), + (EmptyCloneRoom0xCD, "Empty Clone Room"), + (IcePalaceHoleToKholdstareRoom, "Ice Palace (Hole to Kholdstare Room)"), + (EmptyCloneRoom0xCF, "Empty Clone Room"), + (AgahnimsTowerDarkMaze, "Agahnim's Tower (Dark Maze)"), + (MiseryMireConveyorSlugBigKeyRoom, "Misery Mire (Conveyor Slug / Big Key Room)"), + (MiseryMireWizzrobesRoom, "Misery Mire (Wizzrobes Room)"), + (EmptyCloneRoom0xD3, "Empty Clone Room"), + (EmptyCloneRoom0xD4, "Empty Clone Room"), + (TurtleRockLaserKeyRoom, "Turtle Rock (Laser Key Room)"), + (TurtleRockEntranceRoom, "Turtle Rock (Entrance Room)"), + (EmptyCloneRoom0xD7, "Empty Clone Room"), + (EasternPalacePreArmosKnightsRoom, "Eastern Palace (Pre-Armos-Knights Room)"), + (EasternPalaceCannonballRoom, "Eastern Palace (Cannonball Room)"), + (EasternPalacePotSwitchRoom, "Eastern Palace (Pot Switch Room)"), + (ThievesTownSouthWestEntranceRoom, "Thieves' Town (South West Entrance Room)"), + (ThievesTownSouthEastEntranceRoom, "Thieves Town (South East Entrance Room)"), + (EmptyCloneRoom0xDD, "Empty Clone Room"), + (IcePalaceKholdstare, "Ice Palace (Kholdstare[Boss])"), + (CaveBackwardsDeathMountainTopFloor, "Death Mountain Exit (Top)"), + (AgahnimsTowerEntranceRoom, "Agahnim's Tower (Entrance Room)"), + (CaveLostWoodsHP, "Cave (Lost Woods HP)"), + (CaveLumberjacksTreeHP, "Cave (Lumberjacks' Tree HP)"), + (CaveMagicBat, "Cave (Magic Bat)"), + (CaveLostOldManHouse, "Cave (Lost Old Man's House)"), + (CaveLostOldManHouseBack, "Cave (Lost Old Man's House Back)"), + (Cave0xE6, "Cave (Bunch of Keese)"), + (Cave0xE7, "Cave (Bunch of Keese 2)"), + (CaveSuperBunnyTop, "Cave (Super Bunny Top)"), + (EmptyCloneRoom0xE9, "Empty Clone Room"), + (CaveSpectacleRockHP, "Cave (Inside Spectacle Rock HP)"), + (CaveBumperCaveTop, "Cave (Bumper Cave Top)"), + (EmptyCloneRoom0xEC, "Empty Clone Room"), + (Cave0xED, "Cave (??)"), + (CaveSpiralCave, "Cave (Spiral Cave)"), + (CaveCrystalSwitch5ChestsRoom, "Cave (Crystal Switch / 5 Chests Room)"), + (CaveLostOldManStartingCaveBottom, "Cave (Lost Old Man Starting Cave Bottom)"), + (CaveLostOldManStartingCaveTop, "Cave (Lost Old Man Starting Cave Top)"), + (HouseOldWomanNextDoor, "House (Old Woman Next Door)"), + (HouseOldWomanSahasrahlasWifeMaybe, "House (Old Woman / Sahasrahla's Wife?)"), + (HouseAngryBrothersWest, "House (Angry Brothers West)"), + (HouseAngryBrothersEast, "House (Angry Brothers East)"), + (EmptyCloneRoom0xF6, "Empty Clone Room"), + (EmptyCloneRoom0xF7, "Empty Clone Room"), + (CaveSuperBunnyBottom, "Cave (Super Bunny Bottom)"), + (CaveSpectacleRockExit, "Cave (Spectacle Rock Exit)"), + (CaveSpectacleRockPrizeEntrance, "Cave (Spectacle Rock Prize Entrance)"), + (CaveBumperCaveBottom, "Cave (Bumper Cave Bottom)"), + (EmptyCloneRoom0xFC, "Empty Clone Room"), + (Cave0xFD, "Cave (Death Mountain)"), + (CaveSpiralCaveExit, "Cave (Spiral Cave Exit)"), + (CaveParadoxCaveMiddleEntrance, "Cave (Paradox Cave 'Middle' Entrance)"), + (ShopInLostWoods0x100, "Shop in Lost Woods"), + (ScaredLadyHouses, "Scared Ladies' Houses"), + (SickKid, "Sick Kid"), + (InnBushHouse, "Inn / BushHouse"), + (LinksHouse, "Link's House"), + (ShabadooHouse, "Sahasrahla's House"), + (ChestGameBombHouse, "Chest Game / Outcast Village Bomb House"), + (LibraryBombFarmRoom, "Library / Bomb Farm Room"), + (ChickenHouse, "Chicken House"), + (WitchHut, "Witch Hut"), + (Aginah, "Aginah's Cave"), + (Dam, "Dam"), + (MimicCave, "Mimic Cave"), + (CaveOutsideMiseryMire, "Cave Outside Misery Mire"), + (Cave0x10E, "Cave0x10E"), + (Shop0x10F, "Shop0x10F"), + (Shop0x110, "Shop0x110"), + (ArcherGame, "Archery Game"), + (CaveShop0x112, "CaveShop0x112"), + (KingsTomb, "King's Tomb"), + (WishingWellCave0x114, "Wishing Well / Cave 0x114"), + (WishingWellBigFairy, "Wishing Well / BigFairy"), + (FatFairy, "Fat Fairy"), + (SpikeCave, "Spike Cave"), + (Shop0x118, "Shop0x118"), + (BlindsHouse, "Blind's House"), + (Mutant, "Mutant Hut"), + (MirrorCaveGroveAndTomb, "Mirror Caves (South of Grove / Graveyard Ledge)"), + (BombShop, "Bomb Shop"), + (BlindsBasement, "Blind's Basement"), + (HypeCave, "Hype Cave"), + (Shop0x11F, "Shop0x11F"), + (IceRodCave, "Ice Rod Cave"), + (SmithHouse, "Smiths' House"), + (FortuneTellers, "Fortune Tellers"), + (MiniMoldormCave, "Mini-Moldorm Cave"), + (UnknownCaveBonkCave, "Unknown Cave / BonkCave"), + (Cave0x125, "Cave0x125"), + (CheckerBoardCave, "Checker Board Cave"), + (HammerPegCave, "Hammer Peg Cave"), + ]; + + HashMap::from_iter(names.into_iter()) + }; +} + +pub const NEED_KILLABLE_ROOMS: [Room; 39] = [ + EasternPalaceBigKeyRoom, // For anti-fairy circle around pot switch + PalaceOfDarknessTurtleRoom, + PalaceOfDarknessMimicsMovingWallRoom, + PalaceOfDarknessWarpsSouthMimicRoom, + TurtleRockCrystalRollerRoom, // Greed room has a kill-all section + TurtleRockDoubleHokkuBokkuBigChestRoom, + TurtleRockChainChompsRoom, + SwampPalaceEntranceRoom, + IcePalaceEntranceRoom, // Not normally required to backtrack, except in doors intensity 3 + IcePalaceCompassRoom, + IcePalaceStalfosKnightConveyorHellway, + IcePalacePengatorsRoom, + TowerOfHeraHardhatBeetleRoom, + TowerOfHeraTileRoom, + ThievesTownBigChestRoom, // For trap room north of big chest + ThievesTownJailCellsRoom, // For room with stairs and big lift block + DesertPalacePopos2BeamosHellwayRoom, + DesertPalaceBigKeyChestRoom, + DesertPalaceEastEntranceRoom, + GanonsTowerTorchRoom2, + GanonsTowerGauntlet123, + GanonsTowerMimicsRoom, + GanonsTowerGauntlet45, + GanonsTowerMisc, + GanonsTowerWinderWarpMazeRoom, + GanonsTowerTileTorchPuzzleRoom, + GanonsTowerTorches1Room, + GanonsTowerWizzrobesRooms, + HyruleCastleBoomerangChestRoom, + EasternPalaceStalfosSpawnRoom, + EasternPalacePreArmosKnightsRoom, + AgahnimsTowerCircleOfPots, + AgahnimsTowerDarkBridgeRoom, // Not normally required to go backwards, except in basic/crossed doors, or doing glitch shenanigans. + AgahnimsTowerEntranceRoom, + MiseryMireSlugRoom, + MiseryMireWizzrobesRoom, + CaveCrystalSwitch5ChestsRoom, + MimicCave, + MiniMoldormCave, +]; + +// All the rooms that require special handling. + +/// These rooms need to be locked to GFX ID 28. +pub const FREEZOR_ROOMS: [Room; 5] = [ + IcePalaceEntranceRoom, + IcePalaceHiddenChestBombableFloorRoom, + IcePalaceBlobsWithTetrisBarrier, + IcePalaceBigChestRoom, + IcePalaceBlockPuzzleRoom, +]; + +/// These rooms need to be locked to GFX ID 17. +pub const WATER_ROOMS: [Room; 33] = [ + GanonsTowerEntranceRoom, + GanonsTowerAgahnim2, + SwampPalaceSwimmingTreadmill, + GanonsTowerIceArmos, + GanonsTowerFinalHallway, + SwampPalaceEntranceRoom, + SwampPalacePushBlockPuzzlePreBigKeyRoom, + SwampPalaceBigChestRoom, + SwampPalaceKeyPotRoom, + GanonsTowerTorchRoom2, + SwampPalaceCompassChestRoom, + GanonsTowerMiniHelmasaurConveyorRoom, + GanonsTowerMoldormRoom, + GanonsTowerSpikePitRoom, + GanonsTowerGanonBallZ, + GanonsTowerGauntlet123, + SwampPalaceHiddenChestHiddenDoorRoom, + GanonsTowerMimicsRoom, + GanonsTowerLanmolasRoom, + GanonsTowerGauntlet45, + GanonsTowerMisc, + GanonsTowerEastSideCollapsingBridgeExplodingWallRoom, + GanonsTowerWinderWarpMazeRoom, + GanonsTowerBlockPuzzleSpikeSkipMapChestRoom, + GanonsTowerEastAndWestDownstairsBigChestRoom, + GanonsTowerTileTorchPuzzleRoom, + GanonsTowerFinalCollapsingBridgeRoom, + GanonsTowerTorches1Room, + GanonsTowerManySpikesWarpMazeRoom, + GanonsTowerInvisibleFloorMazeRoom, + GanonsTowerCompassChestInvisibleFloorRoom, + GanonsTowerWizzrobesRooms, + GanonsTowerMoldormFallRoom, +]; + +pub const SHADOW_ROOMS: [Room; 2] = [ + IcePalaceStalfosKnightConveyorHellway, + IcePalaceIceFloorPotsKeyAndSwitch, +]; + +pub const WALL_MASTER_ROOMS: [Room; 5] = [ + SkullWoodsGibdoKeyMothulaHoleRoom, + SkullWoodsGibdoTorchPuzzleRoom, + SkullWoodsKeyPotTrapRoom, + SkullWoodsKeyChestTrapRoom, + GanonsTowerTileTorchPuzzleRoom, +]; + +pub const BUMPER_CRYSTAL_LASER_ROOMS: [Room; 42] = [ + TurtleRockCrystalRollerRoom, + PalaceOfDarknessTurtleRoom, + TurtleRockHokkuBokkuKeyRoom2, + TowerOfHeraMoldormFallRoom, + PalaceOfDarknessMimicsMovingWallRoom, + IcePalaceBombFloorBariRoom, + PalaceOfDarknessBigHubRoom, + PalaceOfDarknessMapChestFairyRoom, + TowerOfHeraHardhatBeetleRoom, + GanonsTowerTorchRoom2, + AgahnimsTowerFinalBridgeRoom, + ThievesTownBigChestRoom, + PalaceOfDarknessEntranceRoom, + GanonsTowerMiniHelmasaurConveyorRoom, + SkullWoodsBigChestRoom, + SkullWoodsFinalSectionEntranceRoom, + GanonsTowerSpikePitRoom, + SkullWoodsCompassChestRoom, + SkullWoodsKeyChestTrapRoom, + GanonsTowerMimicsRoom, + TowerOfHeraEntranceRoom, + IcePalaceHiddenChestBombableFloorRoom, + TowerOfHeraTileRoom, + GanonsTowerBlockPuzzleSpikeSkipMapChestRoom, + MiseryMireFinalSwitchRoom, + MiseryMireDarkBombWallSwitchesRoom, + GanonsTowerTorches1Room, + GanonsTowerManySpikesWarpMazeRoom, + GanonsTowerCompassChestInvisibleFloorRoom, + MiseryMireFishRoom, + GanonsTowerWizzrobesRooms, + ThievesTownMovingSpikesKeyPotRoom, + TurtleRockChainChompsRoom, + IcePalaceCloneRoomSwitchRoom, + MiseryMireCompassChestTileRoom, + MiseryMireBigChestRoom, + TurtleRockFinalCrystalSwitchPuzzleRoom, + TurtleRockLaserBridge, + TurtleRockLaserKeyRoom, + TurtleRockEntranceRoom, + CaveBumperCaveTop, + CaveCrystalSwitch5ChestsRoom, +]; + +pub const PULL_SWITCH_ROOMS: [Room; 4] = [ + HyruleCastleSwitchRoom, + SkullWoodsBigChestRoom, + ThievesTownWestAtticRoom, + Dam, +]; + +pub const TONGUE_ROOMS: [Room; 7] = [ + TurtleRockCrystalRollerRoom, + TurtleRockWestExitToBalcony, + SwampPalaceBigKeyBsRoom, + SwampPalaceMapChestWaterFillRoom, + IcePalaceMapChestRoom, + SwampPalaceWaterDrainRoom, + IcePalaceHoleToKholdstareRoom, +]; + +pub const NO_STATUE_ROOMS: [Room; 12] = [ + SwampPalaceSwimmingTreadmill, + SwampPalaceStatueRoom, + SwampPalaceEntranceRoom, + PalaceOfDarknessMapChestFairyRoom, + SwampPalacePushBlockPuzzlePreBigKeyRoom, + SwampPalaceBigChestRoom, + SwampPalaceCompassChestRoom, + SkullWoodsBigKeyRoom, + SwampPalaceWaterDrainRoom, + MiseryMireHourglassRoom, + MiseryMireBigHubRoom, + AgahnimsTowerDarkMaze, +]; + +pub const MOVING_CANNONS_ROOMS: [Room; 2] = [ + GanonsTowerGanonBallZ, + DesertPalaceBigKeyChestRoom, +]; + +pub const CANNON_ROOMS: [Room; 3] = [ + EasternPalaceLobbyCannonballsRoom, + EasternPalaceCannonballRoom, + MimicCave, // ??? +]; + +/// These rooms have no enemies to randomize, or are special bosses that can't be switched out. +pub const DONT_RANDOMIZE_ROOMS: [Room; 8] = [ + Ganon, + HyruleCastleNorthCorridor, + HoulihanRoom, + GanonsTowerAgahnim2, + TurtleRockBigKeyRoom, + AgahnimsTowerAgahnim, + AgahnimsTowerMaidenSacrificeChamber, + IcePalaceBigSpikeTrapsRoom, // Anything else would be too easy? +]; + +pub const NO_SPECIAL_ENEMIES_IN_STANDARD_MODE_ROOMS: [Room; 21] = [ + HyruleCastleNorthCorridor, + HyruleCastleSwitchRoom, + HyruleCastleBombableStockRoom, + HyruleCastleKeyRatRoom, + HyruleCastleSewerTextTriggerRoom, + HyruleCastleSewerKeyChestRoom, + HyruleCastleFirstDarkRoom, + HyruleCastle6RopesRoom, + HyruleCastleWestCorridor, + HyruleCastleThroneRoom, + HyruleCastleEastCorridor, + CastleSecretEntranceUncleRoom, + HyruleCastleWestEntranceRoom, + HyruleCastleMainEntranceRoom, + HyruleCastleEastEntranceRoom, + HyruleCastleSmallCorridorToJailCells, + HyruleCastleBoomerangChestRoom, + HyruleCastleMapChestRoom, + HyruleCastleJailCellRoom, + HyruleCastleNextToChasmRoom, + HyruleCastleBasementChasmRoom, +]; + +pub const BOSS_ROOMS: [Room; 16] = [ + Ganon, + SwampPalaceArrghus, + TowerOfHeraMoldorm, + GanonsTowerAgahnim2, + GanonsTowerIceArmos, + AgahnimsTowerAgahnim, + SkullWoodsMothula, + DesertPalaceLanmolas, + GanonsTowerMoldormRoom, + PalaceOfDarknessHelmasaurKing, + GanonsTowerLanmolasRoom, + MiseryMireVitreous, + TurtleRockTrinexx, + ThievesTownBlindTheThief, + EasternPalaceArmosKnights, + IcePalaceKholdstare, +]; + +pub const DONT_USE_IMMOVABLE_ENEMIES: [Room; 57] = [ + PalaceOfDarknessTurtleRoom, // for single terrorpin in L shaped section + SwampPalaceSwimmingTreadmill, + PalaceOfDarknessDarkMaze, // top placement will probably block maze + IcePalaceBombFloorBariRoom, // TODO: test + SwampPalaceStatueRoom, + TowerOfHeraBigChest, // TODO: test, top left placement before stairs up + SwampPalaceBigChestRoom, // bottom left waterbug + IcePalaceMapChestRoom, // spikes block stuff + HyruleCastle6RopesRoom, // only if two of them stack, but why chance it? + AgahnimsTowerFinalBridgeRoom, // spikes are bad here + SwampPalaceCompassChestRoom, + SkullWoodsGibdoTorchPuzzleRoom, + PalaceOfDarknessWarpsSouthMimicRoom, + IcePalaceBombJumpRoom, // for the zols in the small next room + CastleSecretEntranceUncleRoom, // TODO: test + SkullWoodsBigKeyRoom, + IcePalaceHiddenChestSpikeFloorRoom, // TODO: would this cause problems in OHKO since you can't hookshot across if middle mob is beamos, etc? + ThievesTownEastAtticRoom, // only if both bottom rats + PalaceOfDarknessRupeeRoom, // only if two terrorpins next to each other (but can happen twice) + DesertPalaceMapChestRoom, // only if both antlions in hallway to the south of chest + SwampPalaceWaterDrainRoom, // would need 3 mobs to be impassible to possibly softlock... + GanonsTowerWinderWarpMazeRoom, // very low chance + IcePalaceBigSpikeTrapsRoom, // TODO: what happens to beamos over a pit? + DesertPalaceWestEntranceRoom, // TODO: test + DesertPalaceMainEntranceRoom, // TODO: test + DesertPalaceEastEntranceRoom, // TODO: test + GanonsTowerEastAndWestDownstairsBigChestRoom, // TODO: test, probably safe? + GanonsTowerTileTorchPuzzleRoom, // TODO: test + MiseryMireDarkBombWallSwitchesRoom, // TODO: test + GanonsTowerFinalCollapsingBridgeRoom, // TODO: test, probably safe because of conveyor belts + MiseryMireEntranceRoom, + GanonsTowerManySpikesWarpMazeRoom, // TODO: test, middle spike covers warp, are we randomizing those? + GanonsTowerInvisibleFloorMazeRoom, // TODO: test + GanonsTowerCompassChestInvisibleFloorRoom, // TODO: test + IcePalaceBigChestRoom, // Big spikes will block + MiseryMirePreVitreousRoom, // TODO: test + EasternPalaceMapChestRoom, // TODO: test + IcePalaceIceBridgeRoom, + MiseryMireSpikeKeyChestRoom, // TODO: test lower stalfos blocking door + EasternPalaceDarkAntifairyKeyPotRoom, // TODO: test lower stalfos blocking door + ThievesTownHellway, // TODO: test, but should be ok + ThievesTownConveyorToilet, // TODO: test + TurtleRockSomariaHub, // technically a door is blocked off, but who would ever go there? (Door rando would) + ThievesTownNorthWestEntranceRoom, + IcePalaceHoleToKholdstareRoom, // spikes block stuff + AgahnimsTowerDarkMaze, // TODO: test + MiseryMireWizzrobesRoom, + TurtleRockLaserKeyRoom, + EasternPalacePreArmosKnightsRoom, + ThievesTownSouthEastEntranceRoom, // TODO: test + CaveBackwardsDeathMountainTopFloor, + CaveLostOldManHouse, + Cave0xE7, + CaveSpiralCave, + CaveSpectacleRockExit, // TODO: test, probably can get past + Cave0xFD, + MimicCave, +]; + +pub const DONT_USE_FLYING_ENEMIES: [Room; 2] = [ + MiseryMireWizzrobesRoom, + MimicCave, +]; From 5500d628f1a166022357ba29df207bff8dd5d3c9 Mon Sep 17 00:00:00 2001 From: Lyle Mantooth Date: Sun, 12 Jun 2022 12:12:32 -0400 Subject: [PATCH 5/6] Fill in the last names of rooms. --- enemize/src/graph/dungeons.rs | 48 +++++++++++++++++------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/enemize/src/graph/dungeons.rs b/enemize/src/graph/dungeons.rs index 4d25b9a..e1d1fe4 100644 --- a/enemize/src/graph/dungeons.rs +++ b/enemize/src/graph/dungeons.rs @@ -155,7 +155,7 @@ pub enum Room { SwampPalaceArrghus, TowerOfHeraMoldorm, CaveHealingFairy, - PalaceOfDarkness0x09, + PalaceOfDarknessMedusaChestRoom, PalaceOfDarknessStalfossTrapRoom, PalaceOfDarknessTurtleRoom, GanonsTowerEntranceRoom, @@ -167,7 +167,7 @@ pub enum Room { Sanctuary, TurtleRockHokkuBokkuKeyRoom2, TurtleRockBigKeyRoom, - TurtleRock0x15, + TurtleRockUselessTubes, SwampPalaceSwimmingTreadmill, TowerOfHeraMoldormFallRoom, Cave0x18BigFairyDropEntrance, @@ -416,30 +416,30 @@ pub enum Room { Dam, MimicCave, CaveOutsideMiseryMire, - Cave0x10E, - Shop0x10F, - Shop0x110, + CaveDarkHyliaLedgeHint, + ShopDarkWorldShops, + ShopFireShieldShop, ArcherGame, - CaveShop0x112, + CaveShop, KingsTomb, - WishingWellCave0x114, - WishingWellBigFairy, + WaterfallCaveMireHint, + BigFairy, FatFairy, SpikeCave, - Shop0x118, + ChestGamblingGame, BlindsHouse, Mutant, MirrorCaveGroveAndTomb, BombShop, BlindsBasement, HypeCave, - Shop0x11F, + KakarikoShopLumberjackHouse, IceRodCave, SmithHouse, FortuneTellers, MiniMoldormCave, - UnknownCaveBonkCave, - Cave0x125, + FiftyRupeeCaveBonkCave, + TwentyRupeeCaveDarkHyliaSpikeHintCave, CheckerBoardCave, HammerPegCave, } @@ -459,7 +459,7 @@ lazy_static! { (SwampPalaceArrghus, "Swamp Palace (Arrghus[Boss])"), (TowerOfHeraMoldorm, "Tower of Hera (Moldorm[Boss])"), (CaveHealingFairy, "Cave (Healing Fairy)"), - (PalaceOfDarkness0x09, "Palace of Darkness"), + (PalaceOfDarknessMedusaChestRoom, "Palace of Darkness (Medusa Chest Room)"), (PalaceOfDarknessStalfossTrapRoom, "Palace of Darkness (Stalfoss Trap Room)"), (PalaceOfDarknessTurtleRoom, "Palace of Darkness (Turtle Room)"), (GanonsTowerEntranceRoom, "Ganon's Tower (Entrance Room)"), @@ -471,7 +471,7 @@ lazy_static! { (Sanctuary, "Sanctuary"), (TurtleRockHokkuBokkuKeyRoom2, "Turtle Rock (Hokku-Bokku Key Room 2)"), (TurtleRockBigKeyRoom, "Turtle Rock (Big Key Room)"), - (TurtleRock0x15, "Turtle Rock"), + (TurtleRockUselessTubes, "Turtle Rock (Useless Tubes)"), (SwampPalaceSwimmingTreadmill, "Swamp Palace (Swimming Treadmill)"), (TowerOfHeraMoldormFallRoom, "Tower of Hera (Moldorm Fall Room)"), (Cave0x18BigFairyDropEntrance, "Big Fairy Drop Entrance Cave"), @@ -720,30 +720,30 @@ lazy_static! { (Dam, "Dam"), (MimicCave, "Mimic Cave"), (CaveOutsideMiseryMire, "Cave Outside Misery Mire"), - (Cave0x10E, "Cave0x10E"), - (Shop0x10F, "Shop0x10F"), - (Shop0x110, "Shop0x110"), + (CaveDarkHyliaLedgeHint, "Cave (Dark Hylia Ledge Hint)"), + (ShopDarkWorldShops, "Shop (Dark World)"), + (ShopFireShieldShop, "Shop (Fire Shield Shop)"), (ArcherGame, "Archery Game"), - (CaveShop0x112, "CaveShop0x112"), + (CaveShop, "Cave (Shop)"), (KingsTomb, "King's Tomb"), - (WishingWellCave0x114, "Wishing Well / Cave 0x114"), - (WishingWellBigFairy, "Wishing Well / BigFairy"), + (WaterfallCaveMireHint, "Waterfall Cave / Cave (Mire Hint)"), + (BigFairy, "Big Fairy"), (FatFairy, "Fat Fairy"), (SpikeCave, "Spike Cave"), - (Shop0x118, "Shop0x118"), + (ChestGamblingGame, "Chest Gambling Game"), (BlindsHouse, "Blind's House"), (Mutant, "Mutant Hut"), (MirrorCaveGroveAndTomb, "Mirror Caves (South of Grove / Graveyard Ledge)"), (BombShop, "Bomb Shop"), (BlindsBasement, "Blind's Basement"), (HypeCave, "Hype Cave"), - (Shop0x11F, "Shop0x11F"), + (KakarikoShopLumberjackHouse, "Kakariko Shop / Lumberjacks' House"), (IceRodCave, "Ice Rod Cave"), (SmithHouse, "Smiths' House"), (FortuneTellers, "Fortune Tellers"), (MiniMoldormCave, "Mini-Moldorm Cave"), - (UnknownCaveBonkCave, "Unknown Cave / BonkCave"), - (Cave0x125, "Cave0x125"), + (FiftyRupeeCaveBonkCave, "50 Rupee Cave / Bonk Cave"), + (TwentyRupeeCaveDarkHyliaSpikeHintCave, "20 Rupee Cave / Dark Hylia Spike Hint Cave"), (CheckerBoardCave, "Checker Board Cave"), (HammerPegCave, "Hammer Peg Cave"), ]; From b343a0cb80dc16dd7c3f7427d19af78cf1da77b7 Mon Sep 17 00:00:00 2001 From: Lyle Mantooth Date: Sun, 12 Jun 2022 15:17:54 -0400 Subject: [PATCH 6/6] Add Overworld locations. Refactor dungeon module to locations to reflect what it contains. --- .../src/graph/{dungeons.rs => locations.rs} | 720 ++++++++++-------- 1 file changed, 401 insertions(+), 319 deletions(-) rename enemize/src/graph/{dungeons.rs => locations.rs} (71%) diff --git a/enemize/src/graph/dungeons.rs b/enemize/src/graph/locations.rs similarity index 71% rename from enemize/src/graph/dungeons.rs rename to enemize/src/graph/locations.rs index e1d1fe4..1192e1a 100644 --- a/enemize/src/graph/dungeons.rs +++ b/enemize/src/graph/locations.rs @@ -5,8 +5,8 @@ use lazy_static::lazy_static; use super::item::ItemId; #[derive(Debug, thiserror::Error)] -#[error("{0} is not a dungeon room")] -pub struct NotADungeonRoom(u8); +#[error("{0} is not a dungeon super tile")] +pub struct NotADungeonSuperTile(u8); #[derive(Clone, Copy, Eq, Hash, PartialEq)] pub enum Dungeon { @@ -25,14 +25,14 @@ pub enum Dungeon { GanonsTower, } -pub fn get_dungeon_from_room(room_id: u8) -> Result { +pub fn get_dungeon_from_room(room_id: u8) -> Result { for (dungeon, rooms) in DUNGEON_ROOMS.iter() { if let Ok(_) = rooms.binary_search(&room_id) { return Ok(*dungeon); } } - Err(NotADungeonRoom(room_id)) + Err(NotADungeonSuperTile(room_id)) } const HYRULE_CASTLE_ROOMS: [u8; 21] = [ @@ -145,309 +145,391 @@ lazy_static! { #[derive(Clone, Copy, Eq, PartialEq, Hash)] #[repr(u16)] -pub enum Room { - Ganon = 0, - HyruleCastleNorthCorridor, - HyruleCastleSwitchRoom, - HoulihanRoom, - TurtleRockCrystalRollerRoom, - EmptyCloneRoom0x05, - SwampPalaceArrghus, - TowerOfHeraMoldorm, - CaveHealingFairy, - PalaceOfDarknessMedusaChestRoom, - PalaceOfDarknessStalfossTrapRoom, - PalaceOfDarknessTurtleRoom, - GanonsTowerEntranceRoom, - GanonsTowerAgahnim2, - IcePalaceEntranceRoom, - EmptyCloneRoom0x0F, - GanonEvacuationRoute, - HyruleCastleBombableStockRoom, - Sanctuary, - TurtleRockHokkuBokkuKeyRoom2, - TurtleRockBigKeyRoom, - TurtleRockUselessTubes, - SwampPalaceSwimmingTreadmill, - TowerOfHeraMoldormFallRoom, - Cave0x18BigFairyDropEntrance, - PalaceOfDarknessDarkMaze, - PalaceOfDarknessBigChestRoom, - PalaceOfDarknessMimicsMovingWallRoom, - GanonsTowerIceArmos, - GanonsTowerFinalHallway, - IcePalaceBombFloorBariRoom, - IcePalacePengatorBigKeyRoom, - AgahnimsTowerAgahnim, - HyruleCastleKeyRatRoom, - HyruleCastleSewerTextTriggerRoom, - TurtleRockWestExitToBalcony, - TurtleRockDoubleHokkuBokkuBigChestRoom, - EmptyCloneRoom0x25, - SwampPalaceStatueRoom, - TowerOfHeraBigChest, - SwampPalaceEntranceRoom, - SkullWoodsMothula, - PalaceOfDarknessBigHubRoom, - PalaceOfDarknessMapChestFairyRoom, - CaveHookshotCaveBackdoor, - EmptyCloneRoom0x2D, - IcePalaceCompassRoom, - CaveKakarikoWellHP, - AgahnimsTowerMaidenSacrificeChamber, - TowerOfHeraHardhatBeetleRoom, - HyruleCastleSewerKeyChestRoom, - DesertPalaceLanmolas, - SwampPalacePushBlockPuzzlePreBigKeyRoom, - SwampPalaceBigKeyBsRoom, - SwampPalaceBigChestRoom, - SwampPalaceMapChestWaterFillRoom, - SwampPalaceKeyPotRoom, - SkullWoodsGibdoKeyMothulaHoleRoom, - PalaceOfDarknessBombableFloorRoom, - PalaceOfDarknessSpikeBlockConveyorRoom, - CaveHookshotCave, - GanonsTowerTorchRoom2, - IcePalaceStalfosKnightConveyorHellway, - IcePalaceMapChestRoom, - AgahnimsTowerFinalBridgeRoom, - HyruleCastleFirstDarkRoom, - HyruleCastle6RopesRoom, - DesertPalaceTorchPuzzleMovingWallRoom, - ThievesTownBigChestRoom, - ThievesTownJailCellsRoom, - SwampPalaceCompassChestRoom, - EmptyCloneRoom0x47, - EmptyCloneRoom0x48, - SkullWoodsGibdoTorchPuzzleRoom, - PalaceOfDarknessEntranceRoom, - PalaceOfDarknessWarpsSouthMimicRoom, - GanonsTowerMiniHelmasaurConveyorRoom, - GanonsTowerMoldormRoom, - IcePalaceBombJumpRoom, - IcePalaceCloneRoomFairyRoom, - HyruleCastleWestCorridor, - HyruleCastleThroneRoom, - HyruleCastleEastCorridor, - DesertPalacePopos2BeamosHellwayRoom, - SwampPalaceUpstairsPitsRoom, - CastleSecretEntranceUncleRoom, - SkullWoodsKeyPotTrapRoom, - SkullWoodsBigKeyRoom, - SkullWoodsBigChestRoom, - SkullWoodsFinalSectionEntranceRoom, - PalaceOfDarknessHelmasaurKing, - GanonsTowerSpikePitRoom, - GanonsTowerGanonBallZ, - GanonsTowerGauntlet123, - IcePalaceLonelyFirebar, - IcePalaceHiddenChestSpikeFloorRoom, - HyruleCastleWestEntranceRoom, - HyruleCastleMainEntranceRoom, - HyruleCastleEastEntranceRoom, - DesertPalaceFinalSectionEntranceRoom, - ThievesTownWestAtticRoom, - ThievesTownEastAtticRoom, - SwampPalaceHiddenChestHiddenDoorRoom, - SkullWoodsCompassChestRoom, - SkullWoodsKeyChestTrapRoom, - EmptyCloneRoom0x69, - PalaceOfDarknessRupeeRoom, - GanonsTowerMimicsRoom, - GanonsTowerLanmolasRoom, - GanonsTowerGauntlet45, - IcePalacePengatorsRoom, - EmptyCloneRoom0x6F, - HyruleCastleSmallCorridorToJailCells, - HyruleCastleBoomerangChestRoom, - HyruleCastleMapChestRoom, - DesertPalaceBigChestRoom, - DesertPalaceMapChestRoom, - DesertPalaceBigKeyChestRoom, - SwampPalaceWaterDrainRoom, - TowerOfHeraEntranceRoom, - EmptyCloneRoom0x78, - EmptyCloneRoom0x79, - EmptyCloneRoom0x7A, - GanonsTowerMisc, - GanonsTowerEastSideCollapsingBridgeExplodingWallRoom, - GanonsTowerWinderWarpMazeRoom, - IcePalaceHiddenChestBombableFloorRoom, - IcePalaceBigSpikeTrapsRoom, - HyruleCastleJailCellRoom, - HyruleCastleNextToChasmRoom, - HyruleCastleBasementChasmRoom, - DesertPalaceWestEntranceRoom, - DesertPalaceMainEntranceRoom, - DesertPalaceEastEntranceRoom, - EmptyCloneRoom0x86, - TowerOfHeraTileRoom, - EmptyCloneRoom0x88, - EasternPalaceFairyRoom, - EmptyCloneRoom0x8A, - GanonsTowerBlockPuzzleSpikeSkipMapChestRoom, - GanonsTowerEastAndWestDownstairsBigChestRoom, - GanonsTowerTileTorchPuzzleRoom, - IcePalaceBlobsWithTetrisBarrier, - EmptyCloneRoom0x8F, - MiseryMireVitreous, - MiseryMireFinalSwitchRoom, - MiseryMireDarkBombWallSwitchesRoom, - MiseryMireDarkCaneFLoorSwitchPuzzleRoom, - EmptyCloneRoom0x94, - GanonsTowerFinalCollapsingBridgeRoom, - GanonsTowerTorches1Room, - MiseryMireTorchPuzzleMovingWallRoom, - MiseryMireEntranceRoom, - EasternPalaceEyegoreKeyRoom, - EmptyCloneRoom0x9A, - GanonsTowerManySpikesWarpMazeRoom, - GanonsTowerInvisibleFloorMazeRoom, - GanonsTowerCompassChestInvisibleFloorRoom, - IcePalaceBigChestRoom, - IcePalaceIceFloorPotsKeyAndSwitch, - MiseryMirePreVitreousRoom, - MiseryMireFishRoom, - MiseryMireBridgeKeyChestRoom, - MiseryMireEmptyLConnectingRoom, - TurtleRockTrinexx, - GanonsTowerWizzrobesRooms, - GanonsTowerMoldormFallRoom, - TowerOfHeraFairyRoom, - EasternPalaceStalfosSpawnRoom, - EasternPalaceBigChestRoom, - EasternPalaceMapChestRoom, - ThievesTownMovingSpikesKeyPotRoom, - ThievesTownBlindTheThief, - EmptyCloneRoom0xAD, - IcePalaceIceTRoom, - IcePalaceIceBridgeRoom, - AgahnimsTowerCircleOfPots, - MiseryMireHourglassRoom, - MiseryMireSlugRoom, - MiseryMireSpikeKeyChestRoom, - TurtleRockPreTrinexxRoom, - TurtleRockDarkMaze, - TurtleRockChainChompsRoom, - TurtleRockMapChestKeyChestRollerRoom, - EasternPalaceBigKeyRoom, - EasternPalaceLobbyCannonballsRoom, - EasternPalaceDarkAntifairyKeyPotRoom, - ThievesTownHellway, - ThievesTownConveyorToilet, - EmptyCloneRoom0xBD, - IcePalaceBlockPuzzleRoom, - IcePalaceCloneRoomSwitchRoom, - AgahnimsTowerDarkBridgeRoom, - MiseryMireCompassChestTileRoom, - MiseryMireBigHubRoom, - MiseryMireBigChestRoom, - TurtleRockFinalCrystalSwitchPuzzleRoom, - TurtleRockLaserBridge, - TurtleRockSomariaHub, - TurtleRockTorchPuzzle, - EasternPalaceArmosKnights, - EasternPalaceEntranceRoom, - UnknownRoom, - ThievesTownNorthWestEntranceRoom, - ThievesTownNorthEastEntranceRoom, - EmptyCloneRoom0xCD, - IcePalaceHoleToKholdstareRoom, - EmptyCloneRoom0xCF, - AgahnimsTowerDarkMaze, - MiseryMireConveyorSlugBigKeyRoom, - MiseryMireWizzrobesRoom, - EmptyCloneRoom0xD3, - EmptyCloneRoom0xD4, - TurtleRockLaserKeyRoom, - TurtleRockEntranceRoom, - EmptyCloneRoom0xD7, - EasternPalacePreArmosKnightsRoom, - EasternPalaceCannonballRoom, - EasternPalacePotSwitchRoom, - ThievesTownSouthWestEntranceRoom, - ThievesTownSouthEastEntranceRoom, - EmptyCloneRoom0xDD, - IcePalaceKholdstare, - CaveBackwardsDeathMountainTopFloor, - AgahnimsTowerEntranceRoom, - CaveLostWoodsHP, - CaveLumberjacksTreeHP, - CaveMagicBat, - CaveLostOldManHouse, - CaveLostOldManHouseBack, - Cave0xE6, - Cave0xE7, - CaveSuperBunnyTop, - EmptyCloneRoom0xE9, - CaveSpectacleRockHP, - CaveBumperCaveTop, - EmptyCloneRoom0xEC, - Cave0xED, - CaveSpiralCave, - CaveCrystalSwitch5ChestsRoom, - CaveLostOldManStartingCaveBottom, - CaveLostOldManStartingCaveTop, - HouseOldWomanNextDoor, - HouseOldWomanSahasrahlasWifeMaybe, - HouseAngryBrothersWest, - HouseAngryBrothersEast, - EmptyCloneRoom0xF6, - EmptyCloneRoom0xF7, - CaveSuperBunnyBottom, - CaveSpectacleRockExit, - CaveSpectacleRockPrizeEntrance, - CaveBumperCaveBottom, - EmptyCloneRoom0xFC, - Cave0xFD, - CaveSpiralCaveExit, - CaveParadoxCaveMiddleEntrance, - ShopInLostWoods0x100, - ScaredLadyHouses, - SickKid, - InnBushHouse, - LinksHouse, - ShabadooHouse, - ChestGameBombHouse, - LibraryBombFarmRoom, - ChickenHouse, - WitchHut, - Aginah, - Dam, - MimicCave, - CaveOutsideMiseryMire, - CaveDarkHyliaLedgeHint, - ShopDarkWorldShops, - ShopFireShieldShop, - ArcherGame, - CaveShop, - KingsTomb, - WaterfallCaveMireHint, - BigFairy, - FatFairy, - SpikeCave, - ChestGamblingGame, - BlindsHouse, - Mutant, - MirrorCaveGroveAndTomb, - BombShop, - BlindsBasement, - HypeCave, - KakarikoShopLumberjackHouse, - IceRodCave, - SmithHouse, - FortuneTellers, - MiniMoldormCave, - FiftyRupeeCaveBonkCave, - TwentyRupeeCaveDarkHyliaSpikeHintCave, - CheckerBoardCave, - HammerPegCave, +pub enum SuperTile { + Ganon = 0x0, + HyruleCastleNorthCorridor = 0x1, + HyruleCastleSwitchRoom = 0x2, + HoulihanRoom = 0x3, + TurtleRockCrystalRollerRoom = 0x4, + EmptyCloneRoom0x05 = 0x5, + SwampPalaceArrghus = 0x6, + TowerOfHeraMoldorm = 0x7, + CaveHealingFairy = 0x8, + PalaceOfDarknessMedusaChestRoom = 0x9, + PalaceOfDarknessStalfossTrapRoom = 0xa, + PalaceOfDarknessTurtleRoom = 0xb, + GanonsTowerEntranceRoom = 0xc, + GanonsTowerAgahnim2 = 0xd, + IcePalaceEntranceRoom = 0xe, + EmptyCloneRoom0x0F = 0xf, + GanonEvacuationRoute = 0x10, + HyruleCastleBombableStockRoom = 0x11, + InsideSanctuary = 0x12, + TurtleRockHokkuBokkuKeyRoom2 = 0x13, + TurtleRockBigKeyRoom = 0x14, + TurtleRockUselessTubes = 0x15, + SwampPalaceSwimmingTreadmill = 0x16, + TowerOfHeraMoldormFallRoom = 0x17, + Cave0x18BigFairyDropEntrance = 0x18, + PalaceOfDarknessDarkMaze = 0x19, + PalaceOfDarknessBigChestRoom = 0x1a, + PalaceOfDarknessMimicsMovingWallRoom = 0x1b, + GanonsTowerIceArmos = 0x1c, + GanonsTowerFinalHallway = 0x1d, + IcePalaceBombFloorBariRoom = 0x1e, + IcePalacePengatorBigKeyRoom = 0x1f, + AgahnimsTowerAgahnim = 0x20, + HyruleCastleKeyRatRoom = 0x21, + HyruleCastleSewerTextTriggerRoom = 0x22, + TurtleRockWestExitToBalcony = 0x23, + TurtleRockDoubleHokkuBokkuBigChestRoom = 0x24, + EmptyCloneRoom0x25 = 0x25, + SwampPalaceStatueRoom = 0x26, + TowerOfHeraBigChest = 0x27, + SwampPalaceEntranceRoom = 0x28, + SkullWoodsMothula = 0x29, + PalaceOfDarknessBigHubRoom = 0x2a, + PalaceOfDarknessMapChestFairyRoom = 0x2b, + CaveHookshotCaveBackdoor = 0x2c, + EmptyCloneRoom0x2D = 0x2d, + IcePalaceCompassRoom = 0x2e, + CaveKakarikoWellHP = 0x2f, + AgahnimsTowerMaidenSacrificeChamber = 0x30, + TowerOfHeraHardhatBeetleRoom = 0x31, + HyruleCastleSewerKeyChestRoom = 0x32, + DesertPalaceLanmolas = 0x33, + SwampPalacePushBlockPuzzlePreBigKeyRoom = 0x34, + SwampPalaceBigKeyBsRoom = 0x35, + SwampPalaceBigChestRoom = 0x36, + SwampPalaceMapChestWaterFillRoom = 0x37, + SwampPalaceKeyPotRoom = 0x38, + SkullWoodsGibdoKeyMothulaHoleRoom = 0x39, + PalaceOfDarknessBombableFloorRoom = 0x3a, + PalaceOfDarknessSpikeBlockConveyorRoom = 0x3b, + CaveHookshotCave = 0x3c, + GanonsTowerTorchRoom2 = 0x3d, + IcePalaceStalfosKnightConveyorHellway = 0x3e, + IcePalaceMapChestRoom = 0x3f, + AgahnimsTowerFinalBridgeRoom = 0x40, + HyruleCastleFirstDarkRoom = 0x41, + HyruleCastle6RopesRoom = 0x42, + DesertPalaceTorchPuzzleMovingWallRoom = 0x43, + ThievesTownBigChestRoom = 0x44, + ThievesTownJailCellsRoom = 0x45, + SwampPalaceCompassChestRoom = 0x46, + EmptyCloneRoom0x47 = 0x47, + EmptyCloneRoom0x48 = 0x48, + SkullWoodsGibdoTorchPuzzleRoom = 0x49, + PalaceOfDarknessEntranceRoom = 0x4a, + PalaceOfDarknessWarpsSouthMimicRoom = 0x4b, + GanonsTowerMiniHelmasaurConveyorRoom = 0x4c, + GanonsTowerMoldormRoom = 0x4d, + IcePalaceBombJumpRoom = 0x4e, + IcePalaceCloneRoomFairyRoom = 0x4f, + HyruleCastleWestCorridor = 0x50, + HyruleCastleThroneRoom = 0x51, + HyruleCastleEastCorridor = 0x52, + DesertPalacePopos2BeamosHellwayRoom = 0x53, + SwampPalaceUpstairsPitsRoom = 0x54, + CastleSecretEntranceUncleRoom = 0x55, + SkullWoodsKeyPotTrapRoom = 0x56, + SkullWoodsBigKeyRoom = 0x57, + SkullWoodsBigChestRoom = 0x58, + SkullWoodsFinalSectionEntranceRoom = 0x59, + PalaceOfDarknessHelmasaurKing = 0x5a, + GanonsTowerSpikePitRoom = 0x5b, + GanonsTowerGanonBallZ = 0x5c, + GanonsTowerGauntlet123 = 0x5d, + IcePalaceLonelyFirebar = 0x5e, + IcePalaceHiddenChestSpikeFloorRoom = 0x5f, + HyruleCastleWestEntranceRoom = 0x60, + HyruleCastleMainEntranceRoom = 0x61, + HyruleCastleEastEntranceRoom = 0x62, + DesertPalaceFinalSectionEntranceRoom = 0x63, + ThievesTownWestAtticRoom = 0x64, + ThievesTownEastAtticRoom = 0x65, + SwampPalaceHiddenChestHiddenDoorRoom = 0x66, + SkullWoodsCompassChestRoom = 0x67, + SkullWoodsKeyChestTrapRoom = 0x68, + EmptyCloneRoom0x69 = 0x69, + PalaceOfDarknessRupeeRoom = 0x6a, + GanonsTowerMimicsRoom = 0x6b, + GanonsTowerLanmolasRoom = 0x6c, + GanonsTowerGauntlet45 = 0x6d, + IcePalacePengatorsRoom = 0x6e, + EmptyCloneRoom0x6F = 0x6f, + HyruleCastleSmallCorridorToJailCells = 0x70, + HyruleCastleBoomerangChestRoom = 0x71, + HyruleCastleMapChestRoom = 0x72, + DesertPalaceBigChestRoom = 0x73, + DesertPalaceMapChestRoom = 0x74, + DesertPalaceBigKeyChestRoom = 0x75, + SwampPalaceWaterDrainRoom = 0x76, + TowerOfHeraEntranceRoom = 0x77, + EmptyCloneRoom0x78 = 0x78, + EmptyCloneRoom0x79 = 0x79, + EmptyCloneRoom0x7A = 0x7a, + GanonsTowerMisc = 0x7b, + GanonsTowerEastSideCollapsingBridgeExplodingWallRoom = 0x7c, + GanonsTowerWinderWarpMazeRoom = 0x7d, + IcePalaceHiddenChestBombableFloorRoom = 0x7e, + IcePalaceBigSpikeTrapsRoom = 0x7f, + HyruleCastleJailCellRoom = 0x80, + HyruleCastleNextToChasmRoom = 0x81, + HyruleCastleBasementChasmRoom = 0x82, + DesertPalaceWestEntranceRoom = 0x83, + DesertPalaceMainEntranceRoom = 0x84, + DesertPalaceEastEntranceRoom = 0x85, + EmptyCloneRoom0x86 = 0x86, + TowerOfHeraTileRoom = 0x87, + EmptyCloneRoom0x88 = 0x88, + EasternPalaceFairyRoom = 0x89, + EmptyCloneRoom0x8A = 0x8a, + GanonsTowerBlockPuzzleSpikeSkipMapChestRoom = 0x8b, + GanonsTowerEastAndWestDownstairsBigChestRoom = 0x8c, + GanonsTowerTileTorchPuzzleRoom = 0x8d, + IcePalaceBlobsWithTetrisBarrier = 0x8e, + EmptyCloneRoom0x8F = 0x8f, + MiseryMireVitreous = 0x90, + MiseryMireFinalSwitchRoom = 0x91, + MiseryMireDarkBombWallSwitchesRoom = 0x92, + MiseryMireDarkCaneFLoorSwitchPuzzleRoom = 0x93, + EmptyCloneRoom0x94 = 0x94, + GanonsTowerFinalCollapsingBridgeRoom = 0x95, + GanonsTowerTorches1Room = 0x96, + MiseryMireTorchPuzzleMovingWallRoom = 0x97, + MiseryMireEntranceRoom = 0x98, + EasternPalaceEyegoreKeyRoom = 0x99, + EmptyCloneRoom0x9A = 0x9a, + GanonsTowerManySpikesWarpMazeRoom = 0x9b, + GanonsTowerInvisibleFloorMazeRoom = 0x9c, + GanonsTowerCompassChestInvisibleFloorRoom = 0x9d, + IcePalaceBigChestRoom = 0x9e, + IcePalaceIceFloorPotsKeyAndSwitch = 0x9f, + MiseryMirePreVitreousRoom = 0xa0, + MiseryMireFishRoom = 0xa1, + MiseryMireBridgeKeyChestRoom = 0xa2, + MiseryMireEmptyLConnectingRoom = 0xa3, + TurtleRockTrinexx = 0xa4, + GanonsTowerWizzrobesRooms = 0xa5, + GanonsTowerMoldormFallRoom = 0xa6, + TowerOfHeraFairyRoom = 0xa7, + EasternPalaceStalfosSpawnRoom = 0xa8, + EasternPalaceBigChestRoom = 0xa9, + EasternPalaceMapChestRoom = 0xaa, + ThievesTownMovingSpikesKeyPotRoom = 0xab, + ThievesTownBlindTheThief = 0xac, + EmptyCloneRoom0xAD = 0xad, + IcePalaceIceTRoom = 0xae, + IcePalaceIceBridgeRoom = 0xaf, + AgahnimsTowerCircleOfPots = 0xb0, + MiseryMireHourglassRoom = 0xb1, + MiseryMireSlugRoom = 0xb2, + MiseryMireSpikeKeyChestRoom = 0xb3, + TurtleRockPreTrinexxRoom = 0xb4, + TurtleRockDarkMaze = 0xb5, + TurtleRockChainChompsRoom = 0xb6, + TurtleRockMapChestKeyChestRollerRoom = 0xb7, + EasternPalaceBigKeyRoom = 0xb8, + EasternPalaceLobbyCannonballsRoom = 0xb9, + EasternPalaceDarkAntifairyKeyPotRoom = 0xba, + ThievesTownHellway = 0xbb, + ThievesTownConveyorToilet = 0xbc, + EmptyCloneRoom0xBD = 0xbd, + IcePalaceBlockPuzzleRoom = 0xbe, + IcePalaceCloneRoomSwitchRoom = 0xbf, + AgahnimsTowerDarkBridgeRoom = 0xc0, + MiseryMireCompassChestTileRoom = 0xc1, + MiseryMireBigHubRoom = 0xc2, + MiseryMireBigChestRoom = 0xc3, + TurtleRockFinalCrystalSwitchPuzzleRoom = 0xc4, + TurtleRockLaserBridge = 0xc5, + TurtleRockSomariaHub = 0xc6, + TurtleRockTorchPuzzle = 0xc7, + EasternPalaceArmosKnights = 0xc8, + EasternPalaceEntranceRoom = 0xc9, + UnknownRoom = 0xca, + ThievesTownNorthWestEntranceRoom = 0xcb, + ThievesTownNorthEastEntranceRoom = 0xcc, + EmptyCloneRoom0xCD = 0xcd, + IcePalaceHoleToKholdstareRoom = 0xce, + EmptyCloneRoom0xCF = 0xcf, + AgahnimsTowerDarkMaze = 0xd0, + MiseryMireConveyorSlugBigKeyRoom = 0xd1, + MiseryMireWizzrobesRoom = 0xd2, + EmptyCloneRoom0xD3 = 0xd3, + EmptyCloneRoom0xD4 = 0xd4, + TurtleRockLaserKeyRoom = 0xd5, + TurtleRockEntranceRoom = 0xd6, + EmptyCloneRoom0xD7 = 0xd7, + EasternPalacePreArmosKnightsRoom = 0xd8, + EasternPalaceCannonballRoom = 0xd9, + EasternPalacePotSwitchRoom = 0xda, + ThievesTownSouthWestEntranceRoom = 0xdb, + ThievesTownSouthEastEntranceRoom = 0xdc, + EmptyCloneRoom0xDD = 0xdd, + IcePalaceKholdstare = 0xde, + CaveBackwardsDeathMountainTopFloor = 0xdf, + AgahnimsTowerEntranceRoom = 0xe0, + CaveLostWoodsHP = 0xe1, + CaveLumberjacksTreeHP = 0xe2, + CaveMagicBat = 0xe3, + CaveLostOldManHouse = 0xe4, + CaveLostOldManHouseBack = 0xe5, + Cave0xE6 = 0xe6, + Cave0xE7 = 0xe7, + CaveSuperBunnyTop = 0xe8, + EmptyCloneRoom0xE9 = 0xe9, + CaveSpectacleRockHP = 0xea, + CaveBumperCaveTop = 0xeb, + EmptyCloneRoom0xEC = 0xec, + Cave0xED = 0xed, + CaveSpiralCave = 0xee, + CaveCrystalSwitch5ChestsRoom = 0xef, + CaveLostOldManStartingCaveBottom = 0xf0, + CaveLostOldManStartingCaveTop = 0xf1, + HouseOldWomanNextDoor = 0xf2, + HouseOldWomanSahasrahlasWifeMaybe = 0xf3, + HouseAngryBrothersWest = 0xf4, + HouseAngryBrothersEast = 0xf5, + EmptyCloneRoom0xF6 = 0xf6, + EmptyCloneRoom0xF7 = 0xf7, + CaveSuperBunnyBottom = 0xf8, + CaveSpectacleRockExit = 0xf9, + CaveSpectacleRockPrizeEntrance = 0xfa, + CaveBumperCaveBottom = 0xfb, + EmptyCloneRoom0xFC = 0xfc, + Cave0xFD = 0xfd, + CaveSpiralCaveExit = 0xfe, + CaveParadoxCaveMiddleEntrance = 0xff, + ShopInLostWoods0x100 = 0x100, + ScaredLadyHouses = 0x101, + SickKid = 0x102, + InnBushHouse = 0x103, + InsideLinksHouse = 0x104, + ShabadooHouse = 0x105, + ChestGameBombHouse = 0x106, + LibraryBombFarmRoom = 0x107, + ChickenHouse = 0x108, + InsideWitchHut = 0x109, + Aginah = 0x10a, + Dam = 0x10b, + MimicCave = 0x10c, + CaveOutsideMiseryMire = 0x10d, + CaveDarkHyliaLedgeHint = 0x10e, + ShopDarkWorldShops = 0x10f, + ShopFireShieldShop = 0x110, + ArcherGame = 0x111, + CaveShop = 0x112, + KingsTomb = 0x113, + WaterfallCaveMireHint = 0x114, + BigFairy = 0x115, + FatFairy = 0x116, + SpikeCave = 0x117, + ChestGamblingGame = 0x118, + BlindsHouse = 0x119, + Mutant = 0x11a, + MirrorCaveGroveAndTomb = 0x11b, + InsideBombShop = 0x11c, + BlindsBasement = 0x11d, + HypeCave = 0x11e, + KakarikoShopLumberjackHouse = 0x11f, + IceRodCave = 0x120, + SmithHouse = 0x121, + FortuneTellers = 0x122, + MiniMoldormCave = 0x123, + FiftyRupeeCaveBonkCave = 0x124, + TwentyRupeeCaveDarkHyliaSpikeHintCave = 0x125, + CheckerBoardCave = 0x126, + HammerPegCave = 0x127, + LostWoods = 0x8000, + LumberjackHouse = 0x8002, + DeathMountainWest = 0x8003, + DeathMountainEast = 0x8005, + DeathMountainTurtleWarp = 0x8007, + EntranceDeathMountain = 0x800a, + EntranceZorasDomain = 0x800f, + PathFromLostWoodsToKakariko = 0x8010, + KakarikoFortuneTeller = 0x8011, + NorthWestWhirlpoolWarp = 0x8012, + Sanctuary = 0x8013, + Graveyard = 0x8014, + River = 0x8015, + WitchHut = 0x8016, + EastOfWitchHut = 0x8017, + Kakariko = 0x8018, + CastleWoods = 0x801a, + HyruleCastle = 0x801b, + WitchGraveyardBridge = 0x801d, + EasternPalace = 0x801e, + Smithy = 0x8022, + StonyFieldNorth = 0x8025, + KakarikoMazeRace = 0x8028, + KakarikoLibrary = 0x8029, + HauntedGrove = 0x802a, + BetweenGroveAndLinksHouse = 0x802b, + LinksHouse = 0x802c, + StonyFieldSouth = 0x802d, + BetweenLakeHyliaAndEasternPalace = 0x802e, + FluteSpot5 = 0x802f, + Desert = 0x8030, + SouthOfHauntedGrove = 0x8032, + NorthwestSwamp = 0x8033, + NortheastSwamp = 0x8034, + LakeHylia = 0x8035, + IceCave = 0x8037, + DesertPass = 0x803a, + SouthwestSwamp = 0x803b, + SoutheastSwamp = 0x803c, + SouthShore = 0x803f, + ShullWoods = 0x8040, + DarkLumberjackShop = 0x8042, + DarkDeathMountainWest = 0x8043, + DarkDeathMountainEast = 0x8045, + TurtleRock = 0x8047, + BumperCave = 0x804a, + Catfish = 0x804f, + PathFromSkullWoodsToVillage = 0x8050, + OutcastFortuneTeller = 0x8051, + NorthWestPond = 0x8052, + DarkChapel = 0x8053, + DarkGraveyard = 0x8054, + DarkRiver = 0x8055, + DarkWitchHut = 0x8056, + EastOfDarkWitchHut = 0x8057, + VillageOfOutcasts = 0x8058, + FireShieldShopForest = 0x805a, + Pyramid = 0x805b, + BrokenBridge = 0x805d, + PalaceOfDarkness = 0x805e, + PurpleChestHouse = 0x8062, + DarkStonyFieldNorth = 0x8065, + DiggingGame = 0x8068, + TrappedFrog = 0x8069, + StumpysGrove = 0x806a, + BetweenGroveAndBombShop = 0x806b, + BombShop = 0x806c, + HammerPegBridge = 0x806d, + BetweenPODAndIceLake = 0x806e, + DarkFluteSpot5 = 0x806f, + MiseryMire = 0x8070, + SouthOfStumpysGrove = 0x8072, + DarkNorthwestSwamp = 0x8073, + DarkNortheastSwamp = 0x8074, + IceLake = 0x8075, + DarkIceCave = 0x8077, + BoxCanyonBetweenMireAndSwamp = 0x807a, + DarkSouthwestSwamp = 0x807b, + DarkSoutheastSwamp = 0x807c, + DarkSouthShore = 0x807f, + MasterSwordGladeAndUnderBridge = 0x8080, + ZorasDomain = 0x8081, } -use Room::*; +use SuperTile::*; lazy_static! { - pub static ref ROOM_NAMES: HashMap = { + pub static ref ROOM_NAMES: HashMap = { let names = [ (Ganon, "Ganon"), @@ -752,7 +834,7 @@ lazy_static! { }; } -pub const NEED_KILLABLE_ROOMS: [Room; 39] = [ +pub const NEED_KILLABLE_ROOMS: [SuperTile; 39] = [ EasternPalaceBigKeyRoom, // For anti-fairy circle around pot switch PalaceOfDarknessTurtleRoom, PalaceOfDarknessMimicsMovingWallRoom, @@ -797,7 +879,7 @@ pub const NEED_KILLABLE_ROOMS: [Room; 39] = [ // All the rooms that require special handling. /// These rooms need to be locked to GFX ID 28. -pub const FREEZOR_ROOMS: [Room; 5] = [ +pub const FREEZOR_ROOMS: [SuperTile; 5] = [ IcePalaceEntranceRoom, IcePalaceHiddenChestBombableFloorRoom, IcePalaceBlobsWithTetrisBarrier, @@ -806,7 +888,7 @@ pub const FREEZOR_ROOMS: [Room; 5] = [ ]; /// These rooms need to be locked to GFX ID 17. -pub const WATER_ROOMS: [Room; 33] = [ +pub const WATER_ROOMS: [SuperTile; 33] = [ GanonsTowerEntranceRoom, GanonsTowerAgahnim2, SwampPalaceSwimmingTreadmill, @@ -842,12 +924,12 @@ pub const WATER_ROOMS: [Room; 33] = [ GanonsTowerMoldormFallRoom, ]; -pub const SHADOW_ROOMS: [Room; 2] = [ +pub const SHADOW_ROOMS: [SuperTile; 2] = [ IcePalaceStalfosKnightConveyorHellway, IcePalaceIceFloorPotsKeyAndSwitch, ]; -pub const WALL_MASTER_ROOMS: [Room; 5] = [ +pub const WALL_MASTER_ROOMS: [SuperTile; 5] = [ SkullWoodsGibdoKeyMothulaHoleRoom, SkullWoodsGibdoTorchPuzzleRoom, SkullWoodsKeyPotTrapRoom, @@ -855,7 +937,7 @@ pub const WALL_MASTER_ROOMS: [Room; 5] = [ GanonsTowerTileTorchPuzzleRoom, ]; -pub const BUMPER_CRYSTAL_LASER_ROOMS: [Room; 42] = [ +pub const BUMPER_CRYSTAL_LASER_ROOMS: [SuperTile; 42] = [ TurtleRockCrystalRollerRoom, PalaceOfDarknessTurtleRoom, TurtleRockHokkuBokkuKeyRoom2, @@ -900,14 +982,14 @@ pub const BUMPER_CRYSTAL_LASER_ROOMS: [Room; 42] = [ CaveCrystalSwitch5ChestsRoom, ]; -pub const PULL_SWITCH_ROOMS: [Room; 4] = [ +pub const PULL_SWITCH_ROOMS: [SuperTile; 4] = [ HyruleCastleSwitchRoom, SkullWoodsBigChestRoom, ThievesTownWestAtticRoom, Dam, ]; -pub const TONGUE_ROOMS: [Room; 7] = [ +pub const TONGUE_ROOMS: [SuperTile; 7] = [ TurtleRockCrystalRollerRoom, TurtleRockWestExitToBalcony, SwampPalaceBigKeyBsRoom, @@ -917,7 +999,7 @@ pub const TONGUE_ROOMS: [Room; 7] = [ IcePalaceHoleToKholdstareRoom, ]; -pub const NO_STATUE_ROOMS: [Room; 12] = [ +pub const NO_STATUE_ROOMS: [SuperTile; 12] = [ SwampPalaceSwimmingTreadmill, SwampPalaceStatueRoom, SwampPalaceEntranceRoom, @@ -932,19 +1014,19 @@ pub const NO_STATUE_ROOMS: [Room; 12] = [ AgahnimsTowerDarkMaze, ]; -pub const MOVING_CANNONS_ROOMS: [Room; 2] = [ +pub const MOVING_CANNONS_ROOMS: [SuperTile; 2] = [ GanonsTowerGanonBallZ, DesertPalaceBigKeyChestRoom, ]; -pub const CANNON_ROOMS: [Room; 3] = [ +pub const CANNON_ROOMS: [SuperTile; 3] = [ EasternPalaceLobbyCannonballsRoom, EasternPalaceCannonballRoom, MimicCave, // ??? ]; /// These rooms have no enemies to randomize, or are special bosses that can't be switched out. -pub const DONT_RANDOMIZE_ROOMS: [Room; 8] = [ +pub const DONT_RANDOMIZE_ROOMS: [SuperTile; 8] = [ Ganon, HyruleCastleNorthCorridor, HoulihanRoom, @@ -955,7 +1037,7 @@ pub const DONT_RANDOMIZE_ROOMS: [Room; 8] = [ IcePalaceBigSpikeTrapsRoom, // Anything else would be too easy? ]; -pub const NO_SPECIAL_ENEMIES_IN_STANDARD_MODE_ROOMS: [Room; 21] = [ +pub const NO_SPECIAL_ENEMIES_IN_STANDARD_MODE_ROOMS: [SuperTile; 21] = [ HyruleCastleNorthCorridor, HyruleCastleSwitchRoom, HyruleCastleBombableStockRoom, @@ -979,7 +1061,7 @@ pub const NO_SPECIAL_ENEMIES_IN_STANDARD_MODE_ROOMS: [Room; 21] = [ HyruleCastleBasementChasmRoom, ]; -pub const BOSS_ROOMS: [Room; 16] = [ +pub const BOSS_ROOMS: [SuperTile; 16] = [ Ganon, SwampPalaceArrghus, TowerOfHeraMoldorm, @@ -998,7 +1080,7 @@ pub const BOSS_ROOMS: [Room; 16] = [ IcePalaceKholdstare, ]; -pub const DONT_USE_IMMOVABLE_ENEMIES: [Room; 57] = [ +pub const DONT_USE_IMMOVABLE_ENEMIES: [SuperTile; 57] = [ PalaceOfDarknessTurtleRoom, // for single terrorpin in L shaped section SwampPalaceSwimmingTreadmill, PalaceOfDarknessDarkMaze, // top placement will probably block maze @@ -1058,7 +1140,7 @@ pub const DONT_USE_IMMOVABLE_ENEMIES: [Room; 57] = [ MimicCave, ]; -pub const DONT_USE_FLYING_ENEMIES: [Room; 2] = [ +pub const DONT_USE_FLYING_ENEMIES: [SuperTile; 2] = [ MiseryMireWizzrobesRoom, MimicCave, ];