diff --git a/Cargo.lock b/Cargo.lock index e82f6c3..c449041 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -102,7 +102,6 @@ version = "0.1.0" dependencies = [ "anyhow", "clap", - "lazy_static", "rand", "serde", "serde_json", diff --git a/enemize/Cargo.toml b/enemize/Cargo.toml index 6a55151..a763a91 100644 --- a/enemize/Cargo.toml +++ b/enemize/Cargo.toml @@ -8,7 +8,6 @@ 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/asar.rs b/enemize/src/asar.rs index 033f07d..6a34cd0 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/graph/item.rs b/enemize/src/graph/item.rs deleted file mode 100644 index 13f3f16..0000000 --- a/enemize/src/graph/item.rs +++ /dev/null @@ -1,554 +0,0 @@ -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/locations.rs b/enemize/src/graph/locations.rs deleted file mode 100644 index 1192e1a..0000000 --- a/enemize/src/graph/locations.rs +++ /dev/null @@ -1,1146 +0,0 @@ -use std::collections::HashMap; - -use lazy_static::lazy_static; - -use super::item::ItemId; - -#[derive(Debug, thiserror::Error)] -#[error("{0} is not a dungeon super tile")] -pub struct NotADungeonSuperTile(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(NotADungeonSuperTile(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 - }; -} - -#[derive(Clone, Copy, Eq, PartialEq, Hash)] -#[repr(u16)] -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 SuperTile::*; - -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)"), - (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)"), - (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)"), - (TurtleRockUselessTubes, "Turtle Rock (Useless Tubes)"), - (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"), - (CaveDarkHyliaLedgeHint, "Cave (Dark Hylia Ledge Hint)"), - (ShopDarkWorldShops, "Shop (Dark World)"), - (ShopFireShieldShop, "Shop (Fire Shield Shop)"), - (ArcherGame, "Archery Game"), - (CaveShop, "Cave (Shop)"), - (KingsTomb, "King's Tomb"), - (WaterfallCaveMireHint, "Waterfall Cave / Cave (Mire Hint)"), - (BigFairy, "Big Fairy"), - (FatFairy, "Fat Fairy"), - (SpikeCave, "Spike Cave"), - (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"), - (KakarikoShopLumberjackHouse, "Kakariko Shop / Lumberjacks' House"), - (IceRodCave, "Ice Rod Cave"), - (SmithHouse, "Smiths' House"), - (FortuneTellers, "Fortune Tellers"), - (MiniMoldormCave, "Mini-Moldorm Cave"), - (FiftyRupeeCaveBonkCave, "50 Rupee Cave / Bonk Cave"), - (TwentyRupeeCaveDarkHyliaSpikeHintCave, "20 Rupee Cave / Dark Hylia Spike Hint Cave"), - (CheckerBoardCave, "Checker Board Cave"), - (HammerPegCave, "Hammer Peg Cave"), - ]; - - HashMap::from_iter(names.into_iter()) - }; -} - -pub const NEED_KILLABLE_ROOMS: [SuperTile; 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: [SuperTile; 5] = [ - IcePalaceEntranceRoom, - IcePalaceHiddenChestBombableFloorRoom, - IcePalaceBlobsWithTetrisBarrier, - IcePalaceBigChestRoom, - IcePalaceBlockPuzzleRoom, -]; - -/// These rooms need to be locked to GFX ID 17. -pub const WATER_ROOMS: [SuperTile; 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: [SuperTile; 2] = [ - IcePalaceStalfosKnightConveyorHellway, - IcePalaceIceFloorPotsKeyAndSwitch, -]; - -pub const WALL_MASTER_ROOMS: [SuperTile; 5] = [ - SkullWoodsGibdoKeyMothulaHoleRoom, - SkullWoodsGibdoTorchPuzzleRoom, - SkullWoodsKeyPotTrapRoom, - SkullWoodsKeyChestTrapRoom, - GanonsTowerTileTorchPuzzleRoom, -]; - -pub const BUMPER_CRYSTAL_LASER_ROOMS: [SuperTile; 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: [SuperTile; 4] = [ - HyruleCastleSwitchRoom, - SkullWoodsBigChestRoom, - ThievesTownWestAtticRoom, - Dam, -]; - -pub const TONGUE_ROOMS: [SuperTile; 7] = [ - TurtleRockCrystalRollerRoom, - TurtleRockWestExitToBalcony, - SwampPalaceBigKeyBsRoom, - SwampPalaceMapChestWaterFillRoom, - IcePalaceMapChestRoom, - SwampPalaceWaterDrainRoom, - IcePalaceHoleToKholdstareRoom, -]; - -pub const NO_STATUE_ROOMS: [SuperTile; 12] = [ - SwampPalaceSwimmingTreadmill, - SwampPalaceStatueRoom, - SwampPalaceEntranceRoom, - PalaceOfDarknessMapChestFairyRoom, - SwampPalacePushBlockPuzzlePreBigKeyRoom, - SwampPalaceBigChestRoom, - SwampPalaceCompassChestRoom, - SkullWoodsBigKeyRoom, - SwampPalaceWaterDrainRoom, - MiseryMireHourglassRoom, - MiseryMireBigHubRoom, - AgahnimsTowerDarkMaze, -]; - -pub const MOVING_CANNONS_ROOMS: [SuperTile; 2] = [ - GanonsTowerGanonBallZ, - DesertPalaceBigKeyChestRoom, -]; - -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: [SuperTile; 8] = [ - Ganon, - HyruleCastleNorthCorridor, - HoulihanRoom, - GanonsTowerAgahnim2, - TurtleRockBigKeyRoom, - AgahnimsTowerAgahnim, - AgahnimsTowerMaidenSacrificeChamber, - IcePalaceBigSpikeTrapsRoom, // Anything else would be too easy? -]; - -pub const NO_SPECIAL_ENEMIES_IN_STANDARD_MODE_ROOMS: [SuperTile; 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: [SuperTile; 16] = [ - Ganon, - SwampPalaceArrghus, - TowerOfHeraMoldorm, - GanonsTowerAgahnim2, - GanonsTowerIceArmos, - AgahnimsTowerAgahnim, - SkullWoodsMothula, - DesertPalaceLanmolas, - GanonsTowerMoldormRoom, - PalaceOfDarknessHelmasaurKing, - GanonsTowerLanmolasRoom, - MiseryMireVitreous, - TurtleRockTrinexx, - ThievesTownBlindTheThief, - EasternPalaceArmosKnights, - IcePalaceKholdstare, -]; - -pub const DONT_USE_IMMOVABLE_ENEMIES: [SuperTile; 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: [SuperTile; 2] = [ - MiseryMireWizzrobesRoom, - MimicCave, -]; diff --git a/enemize/src/graph/mod.rs b/enemize/src/graph/mod.rs deleted file mode 100644 index eb2d62b..0000000 --- a/enemize/src/graph/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod dungeons; -pub mod item; -pub mod requirement; diff --git a/enemize/src/graph/requirement.rs b/enemize/src/graph/requirement.rs deleted file mode 100644 index 2bbece0..0000000 --- a/enemize/src/graph/requirement.rs +++ /dev/null @@ -1,16 +0,0 @@ -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 d130be2..a499767 100644 --- a/enemize/src/lib.rs +++ b/enemize/src/lib.rs @@ -10,7 +10,6 @@ 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; diff --git a/enemize/src/option_flags.rs b/enemize/src/option_flags.rs index 0f683e3..c3f1f0d 100644 --- a/enemize/src/option_flags.rs +++ b/enemize/src/option_flags.rs @@ -387,11 +387,13 @@ 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, @@ -404,6 +406,7 @@ 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, @@ -763,12 +766,8 @@ 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); } } diff --git a/enemize/src/rom.rs b/enemize/src/rom.rs index b4e8700..fe22d41 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::{Index, IndexMut, Range}; +use std::ops::Range; use anyhow::bail; @@ -245,6 +245,11 @@ 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, @@ -291,17 +296,3 @@ 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] - } -}