Format!
This commit is contained in:
		
							parent
							
								
									1113adca98
								
							
						
					
					
						commit
						27d5a4d6c0
					
				
					 8 changed files with 291 additions and 188 deletions
				
			
		| 
						 | 
					@ -3,9 +3,9 @@ use std::fs::File;
 | 
				
			||||||
use std::io::Read;
 | 
					use std::io::Read;
 | 
				
			||||||
use std::path::Path;
 | 
					use std::path::Path;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use enemize::PatchSet;
 | 
					 | 
				
			||||||
use enemize::asar;
 | 
					use enemize::asar;
 | 
				
			||||||
use enemize::rom::RomData;
 | 
					use enemize::rom::RomData;
 | 
				
			||||||
 | 
					use enemize::PatchSet;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn main() -> Result<(), anyhow::Error> {
 | 
					fn main() -> Result<(), anyhow::Error> {
 | 
				
			||||||
    let mut args = env::args();
 | 
					    let mut args = env::args();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
use std::collections::HashMap;
 | 
					use std::collections::HashMap;
 | 
				
			||||||
use std::fs::File;
 | 
					use std::fs::File;
 | 
				
			||||||
use std::io::{BufReader, BufRead};
 | 
					use std::io::{BufRead, BufReader};
 | 
				
			||||||
use std::path::Path;
 | 
					use std::path::Path;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub type Symbols = HashMap<String, usize>;
 | 
					pub type Symbols = HashMap<String, usize>;
 | 
				
			||||||
| 
						 | 
					@ -9,28 +9,35 @@ pub fn load_symbols(filename: &Path) -> anyhow::Result<Symbols> {
 | 
				
			||||||
    let file = File::open(filename)?;
 | 
					    let file = File::open(filename)?;
 | 
				
			||||||
    let reader = BufReader::new(file);
 | 
					    let reader = BufReader::new(file);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let symbols = reader.lines().filter_map(|l| l.ok().and_then(|line| {
 | 
					    let symbols = reader
 | 
				
			||||||
        let mut words = line.split_ascii_whitespace();
 | 
					        .lines()
 | 
				
			||||||
        match (words.next(), words.next(), words.next()) {
 | 
					        .filter_map(|l| {
 | 
				
			||||||
            // Get only two-word lines.
 | 
					            l.ok()
 | 
				
			||||||
            (Some(address), Some(symbol), None) =>
 | 
					                .and_then(|line| {
 | 
				
			||||||
                Some((symbol.to_owned(), address.to_owned())),
 | 
					                    let mut words = line.split_ascii_whitespace();
 | 
				
			||||||
 | 
					                    match (words.next(), words.next(), words.next()) {
 | 
				
			||||||
 | 
					                        // Get only two-word lines.
 | 
				
			||||||
 | 
					                        (Some(address), Some(symbol), None) => {
 | 
				
			||||||
 | 
					                            Some((symbol.to_owned(), address.to_owned()))
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            _ => None
 | 
					                        _ => None,
 | 
				
			||||||
        }
 | 
					                    }
 | 
				
			||||||
    })
 | 
					                })
 | 
				
			||||||
        .and_then(|(symbol, mut address)| {
 | 
					                .and_then(|(symbol, mut address)| {
 | 
				
			||||||
            if let Some(colon_at) = address.find(':') {
 | 
					                    if let Some(colon_at) = address.find(':') {
 | 
				
			||||||
                address.remove(colon_at);
 | 
					                        address.remove(colon_at);
 | 
				
			||||||
            }
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // Filter out the ones that don't have a hexadecimal number as the first word.
 | 
					                    // 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 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))
 | 
					                    Some((symbol, pc_address))
 | 
				
			||||||
        })).collect();
 | 
					                })
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        .collect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Ok(symbols)
 | 
					    Ok(symbols)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -67,8 +67,7 @@ impl TryFrom<u8> for BossType {
 | 
				
			||||||
            11 => Ok(Self::Agahnim2),
 | 
					            11 => Ok(Self::Agahnim2),
 | 
				
			||||||
            12 => Ok(Self::Ganon),
 | 
					            12 => Ok(Self::Ganon),
 | 
				
			||||||
            255 => Ok(Self::NoBoss),
 | 
					            255 => Ok(Self::NoBoss),
 | 
				
			||||||
            _ => Err(InvalidEnumError(PhantomData))
 | 
					            _ => Err(InvalidEnumError(PhantomData)),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,104 +11,104 @@ pub const RANDOM_SPRITE_GRAPHICS: usize = 0x300000;
 | 
				
			||||||
pub const ENEMIZER_FILE_LENGTH: usize = 0x200000;
 | 
					pub const ENEMIZER_FILE_LENGTH: usize = 0x200000;
 | 
				
			||||||
pub const HIDDEN_ENEMY_CHANCE_POOL: usize = 0xD7BBB;
 | 
					pub const HIDDEN_ENEMY_CHANCE_POOL: usize = 0xD7BBB;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub(crate) const ORIGINAL_ROOM_POINTERS: [u8; 640] = [ 0x62, 0xF4, 0x6C, 0xF4, 0x7A, 0xF4, 0xDD, 0xF5, 0x85,
 | 
					pub(crate) const ORIGINAL_ROOM_POINTERS: [u8; 640] = [
 | 
				
			||||||
        0xF4, 0x90, 0xF4, 0x90, 0xF4, 0x97, 0xF4, 0xA2, 0xF4, 0xA9, 0xF4, 0xB5, 0xF4, 0xC0, 0xF4,
 | 
					    0x62, 0xF4, 0x6C, 0xF4, 0x7A, 0xF4, 0xDD, 0xF5, 0x85, 0xF4, 0x90, 0xF4, 0x90, 0xF4, 0x97, 0xF4,
 | 
				
			||||||
        0xCB, 0xF4, 0xD8, 0xF4, 0xDF, 0xF4, 0xEA, 0xF4, 0xEA, 0xF4, 0xF1, 0xF4, 0xFC, 0xF4, 0x03,
 | 
					    0xA2, 0xF4, 0xA9, 0xF4, 0xB5, 0xF4, 0xC0, 0xF4, 0xCB, 0xF4, 0xD8, 0xF4, 0xDF, 0xF4, 0xEA, 0xF4,
 | 
				
			||||||
        0xF5, 0x11, 0xF5, 0x18, 0xF5, 0x23, 0xF5, 0x2E, 0xF5, 0x73, 0xFC, 0x3A, 0xF5, 0x41, 0xF5,
 | 
					    0xEA, 0xF4, 0xF1, 0xF4, 0xFC, 0xF4, 0x03, 0xF5, 0x11, 0xF5, 0x18, 0xF5, 0x23, 0xF5, 0x2E, 0xF5,
 | 
				
			||||||
        0x4D, 0xF5, 0x58, 0xF5, 0x63, 0xF5, 0x6E, 0xF5, 0x79, 0xF5, 0x84, 0xF5, 0x8B, 0xF5, 0x8B,
 | 
					    0x73, 0xFC, 0x3A, 0xF5, 0x41, 0xF5, 0x4D, 0xF5, 0x58, 0xF5, 0x63, 0xF5, 0x6E, 0xF5, 0x79, 0xF5,
 | 
				
			||||||
        0xF5, 0x03, 0xF5, 0x92, 0xF5, 0x99, 0xF5, 0x99, 0xF5, 0xA6, 0xF5, 0xB2, 0xF5, 0xBD, 0xF5,
 | 
					    0x84, 0xF5, 0x8B, 0xF5, 0x8B, 0xF5, 0x03, 0xF5, 0x92, 0xF5, 0x99, 0xF5, 0x99, 0xF5, 0xA6, 0xF5,
 | 
				
			||||||
        0xC4, 0xF5, 0xCB, 0xF5, 0x73, 0xFC, 0xD6, 0xF5, 0xD6, 0xF5, 0xDD, 0xF5, 0xE4, 0xF5, 0xEF,
 | 
					    0xB2, 0xF5, 0xBD, 0xF5, 0xC4, 0xF5, 0xCB, 0xF5, 0x73, 0xFC, 0xD6, 0xF5, 0xD6, 0xF5, 0xDD, 0xF5,
 | 
				
			||||||
        0xF5, 0xFB, 0xF5, 0x06, 0xF6, 0x0D, 0xF6, 0x18, 0xF6, 0x1F, 0xF6, 0x18, 0xF6, 0x26, 0xF6,
 | 
					    0xE4, 0xF5, 0xEF, 0xF5, 0xFB, 0xF5, 0x06, 0xF6, 0x0D, 0xF6, 0x18, 0xF6, 0x1F, 0xF6, 0x18, 0xF6,
 | 
				
			||||||
        0x31, 0xF6, 0x3B, 0xF6, 0x46, 0xF6, 0x51, 0xF6, 0x58, 0xF6, 0x63, 0xF6, 0x6E, 0xF6, 0x7A,
 | 
					    0x26, 0xF6, 0x31, 0xF6, 0x3B, 0xF6, 0x46, 0xF6, 0x51, 0xF6, 0x58, 0xF6, 0x63, 0xF6, 0x6E, 0xF6,
 | 
				
			||||||
        0xF6, 0x86, 0xF6, 0x91, 0xF6, 0x9D, 0xF6, 0xA4, 0xF6, 0xAB, 0xF6, 0xB6, 0xF6, 0xBD, 0xF6,
 | 
					    0x7A, 0xF6, 0x86, 0xF6, 0x91, 0xF6, 0x9D, 0xF6, 0xA4, 0xF6, 0xAB, 0xF6, 0xB6, 0xF6, 0xBD, 0xF6,
 | 
				
			||||||
        0xBD, 0xF6, 0xBD, 0xF6, 0xC4, 0xF6, 0xD0, 0xF6, 0xDA, 0xF6, 0xE5, 0xF6, 0xF0, 0xF6, 0xFB,
 | 
					    0xBD, 0xF6, 0xBD, 0xF6, 0xC4, 0xF6, 0xD0, 0xF6, 0xDA, 0xF6, 0xE5, 0xF6, 0xF0, 0xF6, 0xFB, 0xF6,
 | 
				
			||||||
        0xF6, 0x05, 0xF7, 0x13, 0xF7, 0x1E, 0xF7, 0x2C, 0xF7, 0x37, 0xF7, 0x42, 0xF7, 0x49, 0xF7,
 | 
					    0x05, 0xF7, 0x13, 0xF7, 0x1E, 0xF7, 0x2C, 0xF7, 0x37, 0xF7, 0x42, 0xF7, 0x49, 0xF7, 0x50, 0xF7,
 | 
				
			||||||
        0x50, 0xF7, 0x57, 0xF7, 0x5E, 0xF7, 0x65, 0xF7, 0x6C, 0xF7, 0x73, 0xF7, 0x7E, 0xF7, 0x89,
 | 
					    0x57, 0xF7, 0x5E, 0xF7, 0x65, 0xF7, 0x6C, 0xF7, 0x73, 0xF7, 0x7E, 0xF7, 0x89, 0xF7, 0x94, 0xF7,
 | 
				
			||||||
        0xF7, 0x94, 0xF7, 0xA0, 0xF7, 0xA7, 0xF7, 0xA0, 0xF7, 0xB2, 0xF7, 0xBD, 0xF7, 0xC8, 0xF7,
 | 
					    0xA0, 0xF7, 0xA7, 0xF7, 0xA0, 0xF7, 0xB2, 0xF7, 0xBD, 0xF7, 0xC8, 0xF7, 0xD2, 0xF7, 0xDD, 0xF7,
 | 
				
			||||||
        0xD2, 0xF7, 0xDD, 0xF7, 0xE4, 0xF7, 0xEB, 0xF7, 0xEB, 0xF7, 0xF7, 0xF7, 0x02, 0xF8, 0x0D,
 | 
					    0xE4, 0xF7, 0xEB, 0xF7, 0xEB, 0xF7, 0xF7, 0xF7, 0x02, 0xF8, 0x0D, 0xF8, 0x14, 0xF8, 0x1F, 0xF8,
 | 
				
			||||||
        0xF8, 0x14, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x2B, 0xF8, 0x36, 0xF8, 0x41, 0xF8, 0x48, 0xF8,
 | 
					    0x1F, 0xF8, 0x2B, 0xF8, 0x36, 0xF8, 0x41, 0xF8, 0x48, 0xF8, 0x4F, 0xF8, 0x56, 0xF8, 0x63, 0xF8,
 | 
				
			||||||
        0x4F, 0xF8, 0x56, 0xF8, 0x63, 0xF8, 0x70, 0xF8, 0x70, 0xF8, 0x70, 0xF8, 0x70, 0xF8, 0x7A,
 | 
					    0x70, 0xF8, 0x70, 0xF8, 0x70, 0xF8, 0x70, 0xF8, 0x7A, 0xF8, 0x81, 0xF8, 0x8B, 0xF8, 0x96, 0xF8,
 | 
				
			||||||
        0xF8, 0x81, 0xF8, 0x8B, 0xF8, 0x96, 0xF8, 0xA1, 0xF8, 0xAC, 0xF8, 0xAC, 0xF8, 0xB3, 0xF8,
 | 
					    0xA1, 0xF8, 0xAC, 0xF8, 0xAC, 0xF8, 0xB3, 0xF8, 0xBA, 0xF8, 0xC1, 0xF8, 0xC8, 0xF8, 0xC8, 0xF8,
 | 
				
			||||||
        0xBA, 0xF8, 0xC1, 0xF8, 0xC8, 0xF8, 0xC8, 0xF8, 0xD4, 0xF8, 0xD4, 0xF8, 0xDE, 0xF8, 0xDE,
 | 
					    0xD4, 0xF8, 0xD4, 0xF8, 0xDE, 0xF8, 0xDE, 0xF8, 0xE5, 0xF8, 0xF2, 0xF8, 0xF9, 0xF8, 0x04, 0xF9,
 | 
				
			||||||
        0xF8, 0xE5, 0xF8, 0xF2, 0xF8, 0xF9, 0xF8, 0x04, 0xF9, 0x04, 0xF9, 0x0B, 0xF9, 0x16, 0xF9,
 | 
					    0x04, 0xF9, 0x0B, 0xF9, 0x16, 0xF9, 0x1D, 0xF9, 0x28, 0xF9, 0x28, 0xF9, 0x2F, 0xF9, 0x3A, 0xF9,
 | 
				
			||||||
        0x1D, 0xF9, 0x28, 0xF9, 0x28, 0xF9, 0x2F, 0xF9, 0x3A, 0xF9, 0x45, 0xF9, 0x50, 0xF9, 0x5B,
 | 
					    0x45, 0xF9, 0x50, 0xF9, 0x5B, 0xF9, 0x5B, 0xF9, 0x65, 0xF9, 0x6C, 0xF9, 0x76, 0xF9, 0x81, 0xF9,
 | 
				
			||||||
        0xF9, 0x5B, 0xF9, 0x65, 0xF9, 0x6C, 0xF9, 0x76, 0xF9, 0x81, 0xF9, 0x88, 0xF9, 0x93, 0xF9,
 | 
					    0x88, 0xF9, 0x93, 0xF9, 0x9A, 0xF9, 0x93, 0xF9, 0xA5, 0xF9, 0xAC, 0xF9, 0xB7, 0xF9, 0xC2, 0xF9,
 | 
				
			||||||
        0x9A, 0xF9, 0x93, 0xF9, 0xA5, 0xF9, 0xAC, 0xF9, 0xB7, 0xF9, 0xC2, 0xF9, 0xCC, 0xF9, 0xD3,
 | 
					    0xCC, 0xF9, 0xD3, 0xF9, 0xDD, 0xF9, 0xE4, 0xF9, 0xEF, 0xF9, 0xF6, 0xF9, 0xF6, 0xF9, 0x01, 0xFA,
 | 
				
			||||||
        0xF9, 0xDD, 0xF9, 0xE4, 0xF9, 0xEF, 0xF9, 0xF6, 0xF9, 0xF6, 0xF9, 0x01, 0xFA, 0x08, 0xFA,
 | 
					    0x08, 0xFA, 0x14, 0xFA, 0x1E, 0xFA, 0x25, 0xFA, 0x2C, 0xFA, 0x37, 0xFA, 0x42, 0xFA, 0x0A, 0xF5,
 | 
				
			||||||
        0x14, 0xFA, 0x1E, 0xFA, 0x25, 0xFA, 0x2C, 0xFA, 0x37, 0xFA, 0x42, 0xFA, 0x0A, 0xF5, 0x4D,
 | 
					    0x4D, 0xFA, 0x54, 0xFA, 0x5B, 0xFA, 0x62, 0xFA, 0x69, 0xFA, 0x74, 0xFA, 0x74, 0xFA, 0x7F, 0xFA,
 | 
				
			||||||
        0xFA, 0x54, 0xFA, 0x5B, 0xFA, 0x62, 0xFA, 0x69, 0xFA, 0x74, 0xFA, 0x74, 0xFA, 0x7F, 0xFA,
 | 
					    0x86, 0xFA, 0x92, 0xFA, 0x99, 0xFA, 0xA0, 0xFA, 0xA7, 0xFA, 0xB2, 0xFA, 0x0A, 0xF5, 0xB9, 0xFA,
 | 
				
			||||||
        0x86, 0xFA, 0x92, 0xFA, 0x99, 0xFA, 0xA0, 0xFA, 0xA7, 0xFA, 0xB2, 0xFA, 0x0A, 0xF5, 0xB9,
 | 
					    0xC0, 0xFA, 0xC7, 0xFA, 0xCE, 0xFA, 0xCE, 0xFA, 0xCE, 0xFA, 0xD5, 0xFA, 0xD5, 0xFA, 0xDF, 0xFA,
 | 
				
			||||||
        0xFA, 0xC0, 0xFA, 0xC7, 0xFA, 0xCE, 0xFA, 0xCE, 0xFA, 0xCE, 0xFA, 0xD5, 0xFA, 0xD5, 0xFA,
 | 
					    0xDF, 0xFA, 0xEB, 0xFA, 0xF6, 0xFA, 0x01, 0xFB, 0x01, 0xFB, 0xB2, 0xFA, 0x0A, 0xF5, 0x01, 0xFB,
 | 
				
			||||||
        0xDF, 0xFA, 0xDF, 0xFA, 0xEB, 0xFA, 0xF6, 0xFA, 0x01, 0xFB, 0x01, 0xFB, 0xB2, 0xFA, 0x0A,
 | 
					    0x01, 0xFB, 0x08, 0xFB, 0x0F, 0xFB, 0xCE, 0xFA, 0xCE, 0xFA, 0x1A, 0xFB, 0x1A, 0xFB, 0x21, 0xFB,
 | 
				
			||||||
        0xF5, 0x01, 0xFB, 0x01, 0xFB, 0x08, 0xFB, 0x0F, 0xFB, 0xCE, 0xFA, 0xCE, 0xFA, 0x1A, 0xFB,
 | 
					    0x2C, 0xFB, 0x37, 0xFB, 0x3E, 0xFB, 0x45, 0xFB, 0x4C, 0xFB, 0x4C, 0xFB, 0x53, 0xFB, 0x53, 0xFB,
 | 
				
			||||||
        0x1A, 0xFB, 0x21, 0xFB, 0x2C, 0xFB, 0x37, 0xFB, 0x3E, 0xFB, 0x45, 0xFB, 0x4C, 0xFB, 0x4C,
 | 
					    0x5A, 0xFB, 0x68, 0xFB, 0x68, 0xFB, 0x73, 0xFB, 0x7E, 0xFB, 0x7E, 0xFB, 0x8A, 0xFB, 0x94, 0xFB,
 | 
				
			||||||
        0xFB, 0x53, 0xFB, 0x53, 0xFB, 0x5A, 0xFB, 0x68, 0xFB, 0x68, 0xFB, 0x73, 0xFB, 0x7E, 0xFB,
 | 
					    0x53, 0xFB, 0x53, 0xFB, 0xA0, 0xFB, 0xA0, 0xFB, 0xA5, 0xFB, 0xA5, 0xFB, 0xAC, 0xFB, 0xAC, 0xFB,
 | 
				
			||||||
        0x7E, 0xFB, 0x8A, 0xFB, 0x94, 0xFB, 0x53, 0xFB, 0x53, 0xFB, 0xA0, 0xFB, 0xA0, 0xFB, 0xA5,
 | 
					    0xAC, 0xFB, 0xBA, 0xFB, 0xC1, 0xFB, 0xCC, 0xFB, 0xD7, 0xFB, 0xD7, 0xFB, 0xBA, 0xFB, 0xE3, 0xFB,
 | 
				
			||||||
        0xFB, 0xA5, 0xFB, 0xAC, 0xFB, 0xAC, 0xFB, 0xAC, 0xFB, 0xBA, 0xFB, 0xC1, 0xFB, 0xCC, 0xFB,
 | 
					    0xEE, 0xFB, 0xFC, 0xFB, 0x03, 0xFC, 0x0A, 0xFC, 0x11, 0xFC, 0x18, 0xFC, 0x1F, 0xFC, 0x26, 0xFC,
 | 
				
			||||||
        0xD7, 0xFB, 0xD7, 0xFB, 0xBA, 0xFB, 0xE3, 0xFB, 0xEE, 0xFB, 0xFC, 0xFB, 0x03, 0xFC, 0x0A,
 | 
					    0x2D, 0xFC, 0x34, 0xFC, 0x3B, 0xFC, 0x42, 0xFC, 0x49, 0xFC, 0x50, 0xFC, 0x57, 0xFC, 0xF5, 0xFB,
 | 
				
			||||||
        0xFC, 0x11, 0xFC, 0x18, 0xFC, 0x1F, 0xFC, 0x26, 0xFC, 0x2D, 0xFC, 0x34, 0xFC, 0x3B, 0xFC,
 | 
					    0xF5, 0xFB, 0x5E, 0xFC, 0x65, 0xFC, 0x6C, 0xFC, 0x73, 0xFC, 0x73, 0xFC, 0x7A, 0xFC, 0x81, 0xFC,
 | 
				
			||||||
        0x42, 0xFC, 0x49, 0xFC, 0x50, 0xFC, 0x57, 0xFC, 0xF5, 0xFB, 0xF5, 0xFB, 0x5E, 0xFC, 0x65,
 | 
					    0x0A, 0xFC, 0x88, 0xFC, 0x93, 0xFC, 0x9A, 0xFC, 0xF5, 0xFB, 0xA1, 0xFC, 0xAC, 0xFC, 0xB3, 0xFC,
 | 
				
			||||||
        0xFC, 0x6C, 0xFC, 0x73, 0xFC, 0x73, 0xFC, 0x7A, 0xFC, 0x81, 0xFC, 0x0A, 0xFC, 0x88, 0xFC,
 | 
					    0xBA, 0xFC, 0x5E, 0xFC, 0x5E, 0xFC, 0xC1, 0xFC, 0xC8, 0xFC, 0xC8, 0xFC, 0xC8, 0xFC, 0xAC, 0xFC,
 | 
				
			||||||
        0x93, 0xFC, 0x9A, 0xFC, 0xF5, 0xFB, 0xA1, 0xFC, 0xAC, 0xFC, 0xB3, 0xFC, 0xBA, 0xFC, 0x5E,
 | 
					    0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC,
 | 
				
			||||||
        0xFC, 0x5E, 0xFC, 0xC1, 0xFC, 0xC8, 0xFC, 0xC8, 0xFC, 0xC8, 0xFC, 0xAC, 0xFC, 0xCF, 0xFC,
 | 
					    0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC,
 | 
				
			||||||
        0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF,
 | 
					    0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC,
 | 
				
			||||||
        0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC,
 | 
					];
 | 
				
			||||||
        0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCF,
 | 
					 | 
				
			||||||
        0xFC];
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub(crate) const ORIGINAL_ROOM_BLOCKS: [u8; 576] = [ 0x00, 0x49, 0x00, 0x00, 0x46, 0x49, 0x0C, 0x1D,
 | 
					pub(crate) const ORIGINAL_ROOM_BLOCKS: [u8; 576] = [
 | 
				
			||||||
0x48, 0x49, 0x13, 0x1D, 0x46, 0x49, 0x13, 0x0E, 0x48, 0x49, 0x0C, 0x11, 0x48, 0x49, 0x0C, 0x10,
 | 
					    0x00, 0x49, 0x00, 0x00, 0x46, 0x49, 0x0C, 0x1D, 0x48, 0x49, 0x13, 0x1D, 0x46, 0x49, 0x13, 0x0E,
 | 
				
			||||||
0x4F, 0x49, 0x4A, 0x50, 0x0E, 0x49, 0x4A, 0x11, 0x46, 0x49, 0x12, 0x00, 0x00, 0x49, 0x00, 0x50,
 | 
					    0x48, 0x49, 0x0C, 0x11, 0x48, 0x49, 0x0C, 0x10, 0x4F, 0x49, 0x4A, 0x50, 0x0E, 0x49, 0x4A, 0x11,
 | 
				
			||||||
0x00, 0x49, 0x00, 0x11, 0x48, 0x49, 0x0C, 0x00, 0x00, 0x00, 0x37, 0x36, 0x48, 0x49, 0x4C, 0x11,
 | 
					    0x46, 0x49, 0x12, 0x00, 0x00, 0x49, 0x00, 0x50, 0x00, 0x49, 0x00, 0x11, 0x48, 0x49, 0x0C, 0x00,
 | 
				
			||||||
0x5D, 0x2C, 0x0C, 0x44, 0x00, 0x00, 0x4E, 0x00, 0x0F, 0x00, 0x12, 0x10, 0x00, 0x00, 0x00, 0x4C,
 | 
					    0x00, 0x00, 0x37, 0x36, 0x48, 0x49, 0x4C, 0x11, 0x5D, 0x2C, 0x0C, 0x44, 0x00, 0x00, 0x4E, 0x00,
 | 
				
			||||||
0x00, 0x0D, 0x17, 0x00, 0x16, 0x0D, 0x17, 0x1B, 0x16, 0x0D, 0x17, 0x14, 0x15, 0x0D, 0x17, 0x15,
 | 
					    0x0F, 0x00, 0x12, 0x10, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x0D, 0x17, 0x00, 0x16, 0x0D, 0x17, 0x1B,
 | 
				
			||||||
0x16, 0x0D, 0x18, 0x19, 0x16, 0x0D, 0x17, 0x19, 0x16, 0x0D, 0x00, 0x00, 0x16, 0x0D, 0x18, 0x1B,
 | 
					    0x16, 0x0D, 0x17, 0x14, 0x15, 0x0D, 0x17, 0x15, 0x16, 0x0D, 0x18, 0x19, 0x16, 0x0D, 0x17, 0x19,
 | 
				
			||||||
0x0F, 0x49, 0x4A, 0x11, 0x4B, 0x2A, 0x5C, 0x15, 0x16, 0x49, 0x17, 0x1D, 0x00, 0x00, 0x00, 0x15,
 | 
					    0x16, 0x0D, 0x00, 0x00, 0x16, 0x0D, 0x18, 0x1B, 0x0F, 0x49, 0x4A, 0x11, 0x4B, 0x2A, 0x5C, 0x15,
 | 
				
			||||||
0x16, 0x0D, 0x17, 0x10, 0x16, 0x49, 0x12, 0x00, 0x16, 0x49, 0x0C, 0x11, 0x00, 0x00, 0x12, 0x10,
 | 
					    0x16, 0x49, 0x17, 0x1D, 0x00, 0x00, 0x00, 0x15, 0x16, 0x0D, 0x17, 0x10, 0x16, 0x49, 0x12, 0x00,
 | 
				
			||||||
0x16, 0x0D, 0x00, 0x11, 0x16, 0x49, 0x0C, 0x00, 0x16, 0x0D, 0x4C, 0x11, 0x0E, 0x0D, 0x4A, 0x11,
 | 
					    0x16, 0x49, 0x0C, 0x11, 0x00, 0x00, 0x12, 0x10, 0x16, 0x0D, 0x00, 0x11, 0x16, 0x49, 0x0C, 0x00,
 | 
				
			||||||
0x16, 0x1A, 0x17, 0x1B, 0x4F, 0x34, 0x4A, 0x50, 0x35, 0x4D, 0x65, 0x36, 0x4A, 0x34, 0x4E, 0x00,
 | 
					    0x16, 0x0D, 0x4C, 0x11, 0x0E, 0x0D, 0x4A, 0x11, 0x16, 0x1A, 0x17, 0x1B, 0x4F, 0x34, 0x4A, 0x50,
 | 
				
			||||||
0x0E, 0x34, 0x4A, 0x11, 0x51, 0x34, 0x5D, 0x59, 0x4B, 0x49, 0x4C, 0x11, 0x2D, 0x00, 0x00, 0x00,
 | 
					    0x35, 0x4D, 0x65, 0x36, 0x4A, 0x34, 0x4E, 0x00, 0x0E, 0x34, 0x4A, 0x11, 0x51, 0x34, 0x5D, 0x59,
 | 
				
			||||||
0x5D, 0x00, 0x12, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
					    0x4B, 0x49, 0x4C, 0x11, 0x2D, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x12, 0x59, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
					    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
					    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
					    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x49, 0x2B, 0x2D, 0x46, 0x49, 0x1C, 0x52,
 | 
					    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||||
0x00, 0x49, 0x1C, 0x52, 0x5D, 0x49, 0x00, 0x52, 0x46, 0x49, 0x13, 0x52, 0x4B, 0x4D, 0x4A, 0x5A,
 | 
					    0x47, 0x49, 0x2B, 0x2D, 0x46, 0x49, 0x1C, 0x52, 0x00, 0x49, 0x1C, 0x52, 0x5D, 0x49, 0x00, 0x52,
 | 
				
			||||||
0x47, 0x49, 0x1C, 0x52, 0x4B, 0x4D, 0x39, 0x36, 0x1F, 0x2C, 0x2E, 0x52, 0x1F, 0x2C, 0x2E, 0x1D,
 | 
					    0x46, 0x49, 0x13, 0x52, 0x4B, 0x4D, 0x4A, 0x5A, 0x47, 0x49, 0x1C, 0x52, 0x4B, 0x4D, 0x39, 0x36,
 | 
				
			||||||
0x2F, 0x2C, 0x2E, 0x52, 0x2F, 0x2C, 0x2E, 0x31, 0x1F, 0x1E, 0x30, 0x52, 0x51, 0x49, 0x13, 0x00,
 | 
					    0x1F, 0x2C, 0x2E, 0x52, 0x1F, 0x2C, 0x2E, 0x1D, 0x2F, 0x2C, 0x2E, 0x52, 0x2F, 0x2C, 0x2E, 0x31,
 | 
				
			||||||
0x4F, 0x49, 0x13, 0x50, 0x4F, 0x4D, 0x4A, 0x50, 0x4B, 0x49, 0x4C, 0x2B, 0x1F, 0x20, 0x22, 0x53,
 | 
					    0x1F, 0x1E, 0x30, 0x52, 0x51, 0x49, 0x13, 0x00, 0x4F, 0x49, 0x13, 0x50, 0x4F, 0x4D, 0x4A, 0x50,
 | 
				
			||||||
0x55, 0x3D, 0x42, 0x43, 0x1F, 0x1E, 0x23, 0x52, 0x1F, 0x1E, 0x39, 0x3A, 0x1F, 0x1E, 0x3A, 0x3E,
 | 
					    0x4B, 0x49, 0x4C, 0x2B, 0x1F, 0x20, 0x22, 0x53, 0x55, 0x3D, 0x42, 0x43, 0x1F, 0x1E, 0x23, 0x52,
 | 
				
			||||||
0x1F, 0x1E, 0x3C, 0x3D, 0x40, 0x1E, 0x27, 0x3F, 0x55, 0x1A, 0x42, 0x43, 0x1F, 0x1E, 0x2A, 0x52,
 | 
					    0x1F, 0x1E, 0x39, 0x3A, 0x1F, 0x1E, 0x3A, 0x3E, 0x1F, 0x1E, 0x3C, 0x3D, 0x40, 0x1E, 0x27, 0x3F,
 | 
				
			||||||
0x1F, 0x1E, 0x38, 0x52, 0x1F, 0x20, 0x28, 0x52, 0x1F, 0x20, 0x26, 0x52, 0x1F, 0x2C, 0x25, 0x52,
 | 
					    0x55, 0x1A, 0x42, 0x43, 0x1F, 0x1E, 0x2A, 0x52, 0x1F, 0x1E, 0x38, 0x52, 0x1F, 0x20, 0x28, 0x52,
 | 
				
			||||||
0x1F, 0x20, 0x27, 0x52, 0x1F, 0x1E, 0x29, 0x52, 0x1F, 0x2C, 0x3B, 0x52, 0x46, 0x49, 0x24, 0x52,
 | 
					    0x1F, 0x20, 0x26, 0x52, 0x1F, 0x2C, 0x25, 0x52, 0x1F, 0x20, 0x27, 0x52, 0x1F, 0x1E, 0x29, 0x52,
 | 
				
			||||||
0x21, 0x41, 0x45, 0x33, 0x1F, 0x2C, 0x28, 0x31, 0x1F, 0x0D, 0x29, 0x52, 0x1F, 0x1E, 0x27, 0x52,
 | 
					    0x1F, 0x2C, 0x3B, 0x52, 0x46, 0x49, 0x24, 0x52, 0x21, 0x41, 0x45, 0x33, 0x1F, 0x2C, 0x28, 0x31,
 | 
				
			||||||
0x1F, 0x20, 0x27, 0x53, 0x48, 0x49, 0x13, 0x52, 0x0E, 0x1E, 0x4A, 0x50, 0x1F, 0x20, 0x26, 0x53,
 | 
					    0x1F, 0x0D, 0x29, 0x52, 0x1F, 0x1E, 0x27, 0x52, 0x1F, 0x20, 0x27, 0x53, 0x48, 0x49, 0x13, 0x52,
 | 
				
			||||||
0x15, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x2A, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
					    0x0E, 0x1E, 0x4A, 0x50, 0x1F, 0x20, 0x26, 0x53, 0x15, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x2A, 0x52,
 | 
				
			||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
					    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
					    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
					    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
 | 
					    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
				
			||||||
0x5D, 0x49, 0x00, 0x52, 0x55, 0x49, 0x42, 0x43, 0x61, 0x62, 0x63, 0x50, 0x61, 0x62, 0x63, 0x50,
 | 
					    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x5D, 0x49, 0x00, 0x52, 0x55, 0x49, 0x42, 0x43,
 | 
				
			||||||
0x61, 0x62, 0x63, 0x50, 0x61, 0x62, 0x63, 0x50, 0x61, 0x62, 0x63, 0x50, 0x61, 0x62, 0x63, 0x50,
 | 
					    0x61, 0x62, 0x63, 0x50, 0x61, 0x62, 0x63, 0x50, 0x61, 0x62, 0x63, 0x50, 0x61, 0x62, 0x63, 0x50,
 | 
				
			||||||
0x61, 0x56, 0x57, 0x50, 0x61, 0x62, 0x63, 0x50, 0x61, 0x62, 0x63, 0x50, 0x61, 0x56, 0x57, 0x50,
 | 
					    0x61, 0x62, 0x63, 0x50, 0x61, 0x62, 0x63, 0x50, 0x61, 0x56, 0x57, 0x50, 0x61, 0x62, 0x63, 0x50,
 | 
				
			||||||
0x61, 0x56, 0x63, 0x50, 0x61, 0x56, 0x57, 0x50, 0x61, 0x56, 0x33, 0x50, 0x61, 0x56, 0x57, 0x50,
 | 
					    0x61, 0x62, 0x63, 0x50, 0x61, 0x56, 0x57, 0x50, 0x61, 0x56, 0x63, 0x50, 0x61, 0x56, 0x57, 0x50,
 | 
				
			||||||
0x61, 0x62, 0x63, 0x50, 0x61, 0x62, 0x63, 0x50 ];
 | 
					    0x61, 0x56, 0x33, 0x50, 0x61, 0x56, 0x57, 0x50, 0x61, 0x62, 0x63, 0x50, 0x61, 0x62, 0x63, 0x50,
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub(crate) const ORIGINAL_OVERWORLD_BLOCKS: [u8; 272] = [ 0x07, 0x07, 0x07, 0x10, 0x10, 0x10, 0x10,
 | 
					pub(crate) const ORIGINAL_OVERWORLD_BLOCKS: [u8; 272] = [
 | 
				
			||||||
0x10, 0x07, 0x07, 0x07, 0x10, 0x10, 0x10, 0x10, 0x04, 0x06, 0x06, 0x00, 0x03, 0x03, 0x00, 0x0D,
 | 
					    0x07, 0x07, 0x07, 0x10, 0x10, 0x10, 0x10, 0x10, 0x07, 0x07, 0x07, 0x10, 0x10, 0x10, 0x10, 0x04,
 | 
				
			||||||
0x0A, 0x06, 0x06, 0x01, 0x01, 0x01, 0x04, 0x05, 0x05, 0x06, 0x06, 0x06, 0x01, 0x01, 0x04, 0x05,
 | 
					    0x06, 0x06, 0x00, 0x03, 0x03, 0x00, 0x0D, 0x0A, 0x06, 0x06, 0x01, 0x01, 0x01, 0x04, 0x05, 0x05,
 | 
				
			||||||
0x05, 0x06, 0x09, 0x0F, 0x00, 0x00, 0x0B, 0x0B, 0x05, 0x08, 0x08, 0x0A, 0x04, 0x04, 0x04, 0x04,
 | 
					    0x06, 0x06, 0x06, 0x01, 0x01, 0x04, 0x05, 0x05, 0x06, 0x09, 0x0F, 0x00, 0x00, 0x0B, 0x0B, 0x05,
 | 
				
			||||||
0x04, 0x08, 0x08, 0x0A, 0x04, 0x04, 0x04, 0x04, 0x04, 0x07, 0x07, 0x1A, 0x10, 0x10, 0x10, 0x10,
 | 
					    0x08, 0x08, 0x0A, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x0A, 0x04, 0x04, 0x04, 0x04, 0x04,
 | 
				
			||||||
0x10, 0x07, 0x07, 0x1A, 0x10, 0x10, 0x10, 0x10, 0x04, 0x06, 0x06, 0x00, 0x03, 0x03, 0x00, 0x0D,
 | 
					    0x07, 0x07, 0x1A, 0x10, 0x10, 0x10, 0x10, 0x10, 0x07, 0x07, 0x1A, 0x10, 0x10, 0x10, 0x10, 0x04,
 | 
				
			||||||
0x0A, 0x06, 0x06, 0x1C, 0x1C, 0x1C, 0x02, 0x05, 0x05, 0x06, 0x06, 0x06, 0x1C, 0x1C, 0x00, 0x05,
 | 
					    0x06, 0x06, 0x00, 0x03, 0x03, 0x00, 0x0D, 0x0A, 0x06, 0x06, 0x1C, 0x1C, 0x1C, 0x02, 0x05, 0x05,
 | 
				
			||||||
0x05, 0x06, 0x00, 0x0F, 0x00, 0x00, 0x23, 0x23, 0x05, 0x1F, 0x1F, 0x0A, 0x20, 0x20, 0x20, 0x20,
 | 
					    0x06, 0x06, 0x06, 0x1C, 0x1C, 0x00, 0x05, 0x05, 0x06, 0x00, 0x0F, 0x00, 0x00, 0x23, 0x23, 0x05,
 | 
				
			||||||
0x20, 0x1F, 0x1F, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x13, 0x13, 0x17, 0x14, 0x14, 0x14, 0x14,
 | 
					    0x1F, 0x1F, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x1F, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
 | 
				
			||||||
0x14, 0x13, 0x13, 0x17, 0x14, 0x14, 0x14, 0x14, 0x16, 0x15, 0x15, 0x12, 0x13, 0x13, 0x18, 0x16,
 | 
					    0x13, 0x13, 0x17, 0x14, 0x14, 0x14, 0x14, 0x14, 0x13, 0x13, 0x17, 0x14, 0x14, 0x14, 0x14, 0x16,
 | 
				
			||||||
0x16, 0x15, 0x15, 0x13, 0x26, 0x26, 0x13, 0x17, 0x17, 0x15, 0x15, 0x15, 0x26, 0x26, 0x13, 0x17,
 | 
					    0x15, 0x15, 0x12, 0x13, 0x13, 0x18, 0x16, 0x16, 0x15, 0x15, 0x13, 0x26, 0x26, 0x13, 0x17, 0x17,
 | 
				
			||||||
0x17, 0x1B, 0x1D, 0x11, 0x13, 0x13, 0x18, 0x18, 0x17, 0x16, 0x16, 0x13, 0x13, 0x13, 0x19, 0x19,
 | 
					    0x15, 0x15, 0x15, 0x26, 0x26, 0x13, 0x17, 0x17, 0x1B, 0x1D, 0x11, 0x13, 0x13, 0x18, 0x18, 0x17,
 | 
				
			||||||
0x19, 0x16, 0x16, 0x18, 0x13, 0x18, 0x19, 0x19, 0x19, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
 | 
					    0x16, 0x16, 0x13, 0x13, 0x13, 0x19, 0x19, 0x19, 0x16, 0x16, 0x18, 0x13, 0x18, 0x19, 0x19, 0x19,
 | 
				
			||||||
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
 | 
					    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
 | 
				
			||||||
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
 | 
					    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
 | 
				
			||||||
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
 | 
					    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
 | 
				
			||||||
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x05, 0x05, 0x06, 0x09, 0x09, 0x09, 0x09,
 | 
					    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
 | 
				
			||||||
0x09, 0x05, 0x05, 0x06, 0x09, 0x09, 0x09, 0x09, 0x03 ];
 | 
					    0x05, 0x05, 0x06, 0x09, 0x09, 0x09, 0x09, 0x09, 0x05, 0x05, 0x06, 0x09, 0x09, 0x09, 0x09, 0x03,
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -72,7 +72,10 @@ fn main() -> anyhow::Result<()> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn load_symbols() -> anyhow::Result<asar::Symbols> {
 | 
					fn load_symbols() -> anyhow::Result<asar::Symbols> {
 | 
				
			||||||
    if let Err(_) = std::fs::metadata(ASAR_SYMBOLS) {
 | 
					    if let Err(_) = std::fs::metadata(ASAR_SYMBOLS) {
 | 
				
			||||||
        bail!("Could not find symbols at {}. Did you run prepare.sh?", ASAR_SYMBOLS);
 | 
					        bail!(
 | 
				
			||||||
 | 
					            "Could not find symbols at {}. Did you run prepare.sh?",
 | 
				
			||||||
 | 
					            ASAR_SYMBOLS
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    asar::load_symbols(Path::new(ASAR_SYMBOLS))
 | 
					    asar::load_symbols(Path::new(ASAR_SYMBOLS))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -62,7 +62,7 @@ impl TryFrom<u8> for RandomizeEnemiesType {
 | 
				
			||||||
            2 => Ok(Self::Hard),
 | 
					            2 => Ok(Self::Hard),
 | 
				
			||||||
            3 => Ok(Self::Chaos),
 | 
					            3 => Ok(Self::Chaos),
 | 
				
			||||||
            4 => Ok(Self::Insanity),
 | 
					            4 => Ok(Self::Insanity),
 | 
				
			||||||
            _ => Err(InvalidEnumError(PhantomData))
 | 
					            _ => Err(InvalidEnumError(PhantomData)),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -73,7 +73,7 @@ pub enum RandomizeEnemyHpType {
 | 
				
			||||||
    Easy,
 | 
					    Easy,
 | 
				
			||||||
    Medium,
 | 
					    Medium,
 | 
				
			||||||
    Hard,
 | 
					    Hard,
 | 
				
			||||||
    Patty
 | 
					    Patty,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl From<RandomizeEnemyHpType> for u8 {
 | 
					impl From<RandomizeEnemyHpType> for u8 {
 | 
				
			||||||
| 
						 | 
					@ -98,7 +98,7 @@ impl TryFrom<u8> for RandomizeEnemyHpType {
 | 
				
			||||||
            1 => Ok(Self::Medium),
 | 
					            1 => Ok(Self::Medium),
 | 
				
			||||||
            2 => Ok(Self::Hard),
 | 
					            2 => Ok(Self::Hard),
 | 
				
			||||||
            3 => Ok(Self::Patty),
 | 
					            3 => Ok(Self::Patty),
 | 
				
			||||||
            _ => Err(InvalidEnumError(PhantomData))
 | 
					            _ => Err(InvalidEnumError(PhantomData)),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -108,7 +108,7 @@ impl TryFrom<u8> for RandomizeEnemyHpType {
 | 
				
			||||||
pub enum RandomizeBossesType {
 | 
					pub enum RandomizeBossesType {
 | 
				
			||||||
    Basic,
 | 
					    Basic,
 | 
				
			||||||
    Normal,
 | 
					    Normal,
 | 
				
			||||||
    Chaos
 | 
					    Chaos,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl From<RandomizeBossesType> for u8 {
 | 
					impl From<RandomizeBossesType> for u8 {
 | 
				
			||||||
| 
						 | 
					@ -131,7 +131,7 @@ impl TryFrom<u8> for RandomizeBossesType {
 | 
				
			||||||
            0 => Ok(Self::Basic),
 | 
					            0 => Ok(Self::Basic),
 | 
				
			||||||
            1 => Ok(Self::Normal),
 | 
					            1 => Ok(Self::Normal),
 | 
				
			||||||
            2 => Ok(Self::Chaos),
 | 
					            2 => Ok(Self::Chaos),
 | 
				
			||||||
            _ => Err(InvalidEnumError(PhantomData))
 | 
					            _ => Err(InvalidEnumError(PhantomData)),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -139,7 +139,7 @@ impl TryFrom<u8> for RandomizeBossesType {
 | 
				
			||||||
#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
 | 
					#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
 | 
				
			||||||
#[serde(into = "u8", try_from = "u8")]
 | 
					#[serde(into = "u8", try_from = "u8")]
 | 
				
			||||||
pub enum SwordType {
 | 
					pub enum SwordType {
 | 
				
			||||||
    Normal
 | 
					    Normal,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl From<SwordType> for u8 {
 | 
					impl From<SwordType> for u8 {
 | 
				
			||||||
| 
						 | 
					@ -154,7 +154,7 @@ impl TryFrom<u8> for SwordType {
 | 
				
			||||||
    fn try_from(byte: u8) -> Result<Self, Self::Error> {
 | 
					    fn try_from(byte: u8) -> Result<Self, Self::Error> {
 | 
				
			||||||
        match byte {
 | 
					        match byte {
 | 
				
			||||||
            0 => Ok(Self::Normal),
 | 
					            0 => Ok(Self::Normal),
 | 
				
			||||||
            _ => Err(InvalidEnumError(PhantomData))
 | 
					            _ => Err(InvalidEnumError(PhantomData)),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -162,7 +162,7 @@ impl TryFrom<u8> for SwordType {
 | 
				
			||||||
#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
 | 
					#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
 | 
				
			||||||
#[serde(into = "u8", try_from = "u8")]
 | 
					#[serde(into = "u8", try_from = "u8")]
 | 
				
			||||||
pub enum ShieldType {
 | 
					pub enum ShieldType {
 | 
				
			||||||
    Normal
 | 
					    Normal,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl From<ShieldType> for u8 {
 | 
					impl From<ShieldType> for u8 {
 | 
				
			||||||
| 
						 | 
					@ -177,7 +177,7 @@ impl TryFrom<u8> for ShieldType {
 | 
				
			||||||
    fn try_from(byte: u8) -> Result<Self, Self::Error> {
 | 
					    fn try_from(byte: u8) -> Result<Self, Self::Error> {
 | 
				
			||||||
        match byte {
 | 
					        match byte {
 | 
				
			||||||
            0 => Ok(Self::Normal),
 | 
					            0 => Ok(Self::Normal),
 | 
				
			||||||
            _ => Err(InvalidEnumError(PhantomData))
 | 
					            _ => Err(InvalidEnumError(PhantomData)),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -243,7 +243,7 @@ impl TryFrom<u8> for AbsorbableType {
 | 
				
			||||||
            11 => Ok(Self::Fairy),
 | 
					            11 => Ok(Self::Fairy),
 | 
				
			||||||
            12 => Ok(Self::Key),
 | 
					            12 => Ok(Self::Key),
 | 
				
			||||||
            13 => Ok(Self::BigKey),
 | 
					            13 => Ok(Self::BigKey),
 | 
				
			||||||
            _ => Err(InvalidEnumError(PhantomData))
 | 
					            _ => Err(InvalidEnumError(PhantomData)),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -310,7 +310,7 @@ impl TryFrom<u8> for HeartBeepSpeed {
 | 
				
			||||||
            1 => Ok(Self::Half),
 | 
					            1 => Ok(Self::Half),
 | 
				
			||||||
            2 => Ok(Self::Quarter),
 | 
					            2 => Ok(Self::Quarter),
 | 
				
			||||||
            3 => Ok(Self::Off),
 | 
					            3 => Ok(Self::Off),
 | 
				
			||||||
            _ => Err(InvalidEnumError(PhantomData))
 | 
					            _ => Err(InvalidEnumError(PhantomData)),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -360,7 +360,7 @@ impl TryFrom<u8> for BeeLevel {
 | 
				
			||||||
            1 => Ok(Self::Level2),
 | 
					            1 => Ok(Self::Level2),
 | 
				
			||||||
            2 => Ok(Self::Level3),
 | 
					            2 => Ok(Self::Level3),
 | 
				
			||||||
            3 => Ok(Self::Level4),
 | 
					            3 => Ok(Self::Level4),
 | 
				
			||||||
            _ => Err(InvalidEnumError(PhantomData))
 | 
					            _ => Err(InvalidEnumError(PhantomData)),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -542,20 +542,90 @@ impl OptionFlags {
 | 
				
			||||||
        bytes.push(self.enemies_absorbable as u8);
 | 
					        bytes.push(self.enemies_absorbable as u8);
 | 
				
			||||||
        bytes.push(self.absorbable_spawn_rate);
 | 
					        bytes.push(self.absorbable_spawn_rate);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        bytes.push(self.absorbable_types.get(&AbsorbableType::Heart).copied().unwrap_or(false) as u8);
 | 
					        bytes.push(
 | 
				
			||||||
        bytes.push(self.absorbable_types.get(&AbsorbableType::GreenRupee).copied().unwrap_or(false) as u8);
 | 
					            self.absorbable_types
 | 
				
			||||||
        bytes.push(self.absorbable_types.get(&AbsorbableType::BlueRupee).copied().unwrap_or(false) as u8);
 | 
					                .get(&AbsorbableType::Heart)
 | 
				
			||||||
        bytes.push(self.absorbable_types.get(&AbsorbableType::RedRupee).copied().unwrap_or(false) as u8);
 | 
					                .copied()
 | 
				
			||||||
        bytes.push(self.absorbable_types.get(&AbsorbableType::Bomb1).copied().unwrap_or(false) as u8);
 | 
					                .unwrap_or(false) as u8,
 | 
				
			||||||
        bytes.push(self.absorbable_types.get(&AbsorbableType::Bomb4).copied().unwrap_or(false) as u8);
 | 
					        );
 | 
				
			||||||
        bytes.push(self.absorbable_types.get(&AbsorbableType::Bomb8).copied().unwrap_or(false) as u8);
 | 
					        bytes.push(
 | 
				
			||||||
        bytes.push(self.absorbable_types.get(&AbsorbableType::SmallMagic).copied().unwrap_or(false) as u8);
 | 
					            self.absorbable_types
 | 
				
			||||||
        bytes.push(self.absorbable_types.get(&AbsorbableType::FullMagic).copied().unwrap_or(false) as u8);
 | 
					                .get(&AbsorbableType::GreenRupee)
 | 
				
			||||||
        bytes.push(self.absorbable_types.get(&AbsorbableType::Arrow5).copied().unwrap_or(false) as u8);
 | 
					                .copied()
 | 
				
			||||||
        bytes.push(self.absorbable_types.get(&AbsorbableType::Arrow10).copied().unwrap_or(false) as u8);
 | 
					                .unwrap_or(false) as u8,
 | 
				
			||||||
        bytes.push(self.absorbable_types.get(&AbsorbableType::Fairy).copied().unwrap_or(false) as u8);
 | 
					        );
 | 
				
			||||||
        bytes.push(self.absorbable_types.get(&AbsorbableType::Key).copied().unwrap_or(false) as u8);
 | 
					        bytes.push(
 | 
				
			||||||
        bytes.push(self.absorbable_types.get(&AbsorbableType::BigKey).copied().unwrap_or(false) as u8);
 | 
					            self.absorbable_types
 | 
				
			||||||
 | 
					                .get(&AbsorbableType::BlueRupee)
 | 
				
			||||||
 | 
					                .copied()
 | 
				
			||||||
 | 
					                .unwrap_or(false) as u8,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        bytes.push(
 | 
				
			||||||
 | 
					            self.absorbable_types
 | 
				
			||||||
 | 
					                .get(&AbsorbableType::RedRupee)
 | 
				
			||||||
 | 
					                .copied()
 | 
				
			||||||
 | 
					                .unwrap_or(false) as u8,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        bytes.push(
 | 
				
			||||||
 | 
					            self.absorbable_types
 | 
				
			||||||
 | 
					                .get(&AbsorbableType::Bomb1)
 | 
				
			||||||
 | 
					                .copied()
 | 
				
			||||||
 | 
					                .unwrap_or(false) as u8,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        bytes.push(
 | 
				
			||||||
 | 
					            self.absorbable_types
 | 
				
			||||||
 | 
					                .get(&AbsorbableType::Bomb4)
 | 
				
			||||||
 | 
					                .copied()
 | 
				
			||||||
 | 
					                .unwrap_or(false) as u8,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        bytes.push(
 | 
				
			||||||
 | 
					            self.absorbable_types
 | 
				
			||||||
 | 
					                .get(&AbsorbableType::Bomb8)
 | 
				
			||||||
 | 
					                .copied()
 | 
				
			||||||
 | 
					                .unwrap_or(false) as u8,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        bytes.push(
 | 
				
			||||||
 | 
					            self.absorbable_types
 | 
				
			||||||
 | 
					                .get(&AbsorbableType::SmallMagic)
 | 
				
			||||||
 | 
					                .copied()
 | 
				
			||||||
 | 
					                .unwrap_or(false) as u8,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        bytes.push(
 | 
				
			||||||
 | 
					            self.absorbable_types
 | 
				
			||||||
 | 
					                .get(&AbsorbableType::FullMagic)
 | 
				
			||||||
 | 
					                .copied()
 | 
				
			||||||
 | 
					                .unwrap_or(false) as u8,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        bytes.push(
 | 
				
			||||||
 | 
					            self.absorbable_types
 | 
				
			||||||
 | 
					                .get(&AbsorbableType::Arrow5)
 | 
				
			||||||
 | 
					                .copied()
 | 
				
			||||||
 | 
					                .unwrap_or(false) as u8,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        bytes.push(
 | 
				
			||||||
 | 
					            self.absorbable_types
 | 
				
			||||||
 | 
					                .get(&AbsorbableType::Arrow10)
 | 
				
			||||||
 | 
					                .copied()
 | 
				
			||||||
 | 
					                .unwrap_or(false) as u8,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        bytes.push(
 | 
				
			||||||
 | 
					            self.absorbable_types
 | 
				
			||||||
 | 
					                .get(&AbsorbableType::Fairy)
 | 
				
			||||||
 | 
					                .copied()
 | 
				
			||||||
 | 
					                .unwrap_or(false) as u8,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        bytes.push(
 | 
				
			||||||
 | 
					            self.absorbable_types
 | 
				
			||||||
 | 
					                .get(&AbsorbableType::Key)
 | 
				
			||||||
 | 
					                .copied()
 | 
				
			||||||
 | 
					                .unwrap_or(false) as u8,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        bytes.push(
 | 
				
			||||||
 | 
					            self.absorbable_types
 | 
				
			||||||
 | 
					                .get(&AbsorbableType::BigKey)
 | 
				
			||||||
 | 
					                .copied()
 | 
				
			||||||
 | 
					                .unwrap_or(false) as u8,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        bytes.push(self.boss_madness as u8);
 | 
					        bytes.push(self.boss_madness as u8);
 | 
				
			||||||
        bytes.push(self.randomize_bosses as u8);
 | 
					        bytes.push(self.randomize_bosses as u8);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,13 +2,21 @@ use std::path::Path;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use anyhow::ensure;
 | 
					use anyhow::ensure;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use crate::PatchSet;
 | 
					 | 
				
			||||||
use crate::option_flags::OptionFlags;
 | 
					use crate::option_flags::OptionFlags;
 | 
				
			||||||
use crate::rom::RomData;
 | 
					use crate::rom::RomData;
 | 
				
			||||||
 | 
					use crate::PatchSet;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl RomData {
 | 
					impl RomData {
 | 
				
			||||||
    pub fn randomize(&mut self, base_patch: &Path, option_flags: OptionFlags, seed: i32) -> anyhow::Result<()> {
 | 
					    pub fn randomize(
 | 
				
			||||||
        ensure!(self.is_randomizer(), "Enemizer only supports randomizer ROMs for input.");
 | 
					        &mut self,
 | 
				
			||||||
 | 
					        base_patch: &Path,
 | 
				
			||||||
 | 
					        option_flags: OptionFlags,
 | 
				
			||||||
 | 
					        seed: i32,
 | 
				
			||||||
 | 
					    ) -> anyhow::Result<()> {
 | 
				
			||||||
 | 
					        ensure!(
 | 
				
			||||||
 | 
					            self.is_randomizer(),
 | 
				
			||||||
 | 
					            "Enemizer only supports randomizer ROMs for input."
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
        ensure!(!self.is_race(), "Enemizer does not support race roms.");
 | 
					        ensure!(!self.is_race(), "Enemizer does not support race roms.");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if self.is_enemizer() {
 | 
					        if self.is_enemizer() {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,14 +4,15 @@ use std::ops::Range;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use anyhow::bail;
 | 
					use anyhow::bail;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use crate::asar::{Symbols, snes_to_pc_address, pc_to_snes_address};
 | 
					use crate::asar::{pc_to_snes_address, snes_to_pc_address, Symbols};
 | 
				
			||||||
use crate::constants::*;
 | 
					use crate::constants::*;
 | 
				
			||||||
use crate::option_flags::OptionFlags;
 | 
					use crate::option_flags::OptionFlags;
 | 
				
			||||||
use crate::Patch;
 | 
					use crate::Patch;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub const ENEMIZER_INFO_SEED_OFFSET: usize = 0;
 | 
					pub const ENEMIZER_INFO_SEED_OFFSET: usize = 0;
 | 
				
			||||||
pub const ENEMIZER_INFO_SEED_LENGTH: usize = 12;
 | 
					pub const ENEMIZER_INFO_SEED_LENGTH: usize = 12;
 | 
				
			||||||
pub const ENEMIZER_INFO_VERSION_OFFSET: usize = ENEMIZER_INFO_SEED_OFFSET + ENEMIZER_INFO_SEED_LENGTH;
 | 
					pub const ENEMIZER_INFO_VERSION_OFFSET: usize =
 | 
				
			||||||
 | 
					    ENEMIZER_INFO_SEED_OFFSET + ENEMIZER_INFO_SEED_LENGTH;
 | 
				
			||||||
pub const ENEMIZER_INFO_VERSION_LENGTH: usize = 8;
 | 
					pub const ENEMIZER_INFO_VERSION_LENGTH: usize = 8;
 | 
				
			||||||
pub const ENEMIZER_INFO_FLAGS_OFFSET: usize =
 | 
					pub const ENEMIZER_INFO_FLAGS_OFFSET: usize =
 | 
				
			||||||
    ENEMIZER_INFO_VERSION_OFFSET + ENEMIZER_INFO_VERSION_LENGTH;
 | 
					    ENEMIZER_INFO_VERSION_OFFSET + ENEMIZER_INFO_VERSION_LENGTH;
 | 
				
			||||||
| 
						 | 
					@ -48,7 +49,8 @@ impl RomData {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.rom_data[ROOM_HEADER_BANK_LOCATION] = 0x04;
 | 
					        self.rom_data[ROOM_HEADER_BANK_LOCATION] = 0x04;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let dungeon_header_range = DUNGEON_HEADER_POINTER_TABLE..(DUNGEON_HEADER_POINTER_TABLE + 640);
 | 
					        let dungeon_header_range =
 | 
				
			||||||
 | 
					            DUNGEON_HEADER_POINTER_TABLE..(DUNGEON_HEADER_POINTER_TABLE + 640);
 | 
				
			||||||
        self.rom_data[dungeon_header_range].copy_from_slice(&ORIGINAL_ROOM_POINTERS);
 | 
					        self.rom_data[dungeon_header_range].copy_from_slice(&ORIGINAL_ROOM_POINTERS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let room_range = 0x5B97..(0x5B97 + 576);
 | 
					        let room_range = 0x5B97..(0x5B97 + 576);
 | 
				
			||||||
| 
						 | 
					@ -64,9 +66,15 @@ impl RomData {
 | 
				
			||||||
        let mut patches = vec![];
 | 
					        let mut patches = vec![];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (&addr, &byte) in self.patch_data.iter() {
 | 
					        for (&addr, &byte) in self.patch_data.iter() {
 | 
				
			||||||
            match patches.last_mut().filter(|p: &&mut Patch| p.address + 1 == addr) {
 | 
					            match patches
 | 
				
			||||||
                None => patches.push(Patch { address: addr, patch_data: vec![byte] }),
 | 
					                .last_mut()
 | 
				
			||||||
                Some(patch) => patch.patch_data.push(byte)
 | 
					                .filter(|p: &&mut Patch| p.address + 1 == addr)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                None => patches.push(Patch {
 | 
				
			||||||
 | 
					                    address: addr,
 | 
				
			||||||
 | 
					                    patch_data: vec![byte],
 | 
				
			||||||
 | 
					                }),
 | 
				
			||||||
 | 
					                Some(patch) => patch.patch_data.push(byte),
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -83,46 +91,48 @@ impl RomData {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn set_patch_bytes(&mut self, range: Range<usize>) {
 | 
					    fn set_patch_bytes(&mut self, range: Range<usize>) {
 | 
				
			||||||
        let slice = &self.rom_data[range.clone()];
 | 
					        let slice = &self.rom_data[range.clone()];
 | 
				
			||||||
        self.patch_data.extend(iter::zip(range, slice.into_iter().map(|&b| b)));
 | 
					        self.patch_data
 | 
				
			||||||
 | 
					            .extend(iter::zip(range, slice.into_iter().map(|&b| b)));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn is_enemizer(&self) -> bool {
 | 
					    pub fn is_enemizer(&self) -> bool {
 | 
				
			||||||
        self.rom_data.len() == ENEMIZER_FILE_LENGTH
 | 
					        self.rom_data.len() == ENEMIZER_FILE_LENGTH
 | 
				
			||||||
             && self.rom_data[self.asar_symbols["enemizer_info_table"] + ENEMIZER_INFO_SEED_OFFSET] == b'E'
 | 
					            && self.rom_data[self.asar_symbols["enemizer_info_table"] + ENEMIZER_INFO_SEED_OFFSET]
 | 
				
			||||||
             && self.rom_data[self.asar_symbols["enemizer_info_table"] + ENEMIZER_INFO_SEED_OFFSET + 1] == b'N'
 | 
					                == b'E'
 | 
				
			||||||
 | 
					            && self.rom_data
 | 
				
			||||||
 | 
					                [self.asar_symbols["enemizer_info_table"] + ENEMIZER_INFO_SEED_OFFSET + 1]
 | 
				
			||||||
 | 
					                == b'N'
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn is_randomizer(&self) -> bool {
 | 
					    pub fn is_randomizer(&self) -> bool {
 | 
				
			||||||
        let acceptable = [
 | 
					        let acceptable = [
 | 
				
			||||||
            // item rando
 | 
					            b"VT", // item rando
 | 
				
			||||||
            b"VT",
 | 
					            b"ER", // entrance rando
 | 
				
			||||||
            // entrance rando
 | 
					            b"DR", // door rando
 | 
				
			||||||
            b"ER",
 | 
					            b"BM", // Berserker's multiworld
 | 
				
			||||||
            // door rando
 | 
					            b"BD", // Berserker's multiworld doors
 | 
				
			||||||
            b"DR",
 | 
					            b"AP", // Archipelago
 | 
				
			||||||
            // Berserker's multiworld
 | 
					            b"AD", // Archipelago with door rando
 | 
				
			||||||
            b"BM",
 | 
					 | 
				
			||||||
            // Berserker's multiworld doors
 | 
					 | 
				
			||||||
            b"BD",
 | 
					 | 
				
			||||||
            // Archipelago
 | 
					 | 
				
			||||||
            b"AP",
 | 
					 | 
				
			||||||
            // Archipelago with door rando
 | 
					 | 
				
			||||||
            b"AD",
 | 
					 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        acceptable.iter().any(|abbr| &abbr[..] == &self.rom_data[0x7FC0..0x7Fc1]) ||
 | 
					        acceptable
 | 
				
			||||||
            (self.rom_data.len() >= 0x20_0000 &&
 | 
					            .iter()
 | 
				
			||||||
             &self.rom_data[0x7FC0..0x7FCE] == b"ZELDANODENSETSU")
 | 
					            .any(|abbr| &abbr[..] == &self.rom_data[0x7FC0..0x7Fc1])
 | 
				
			||||||
 | 
					            || (self.rom_data.len() >= 0x20_0000
 | 
				
			||||||
 | 
					                && &self.rom_data[0x7FC0..0x7FCE] == b"ZELDANODENSETSU")
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn is_race(&self) -> bool {
 | 
					    pub fn is_race(&self) -> bool {
 | 
				
			||||||
        self.is_randomizer() &&
 | 
					        self.is_randomizer()
 | 
				
			||||||
            (&self.rom_data[0x180213..0x180214] == &[1, 0] ||
 | 
					            && (&self.rom_data[0x180213..0x180214] == &[1, 0]
 | 
				
			||||||
             &self.rom_data[0x7FC0..0x7FC9] == b"VT TOURNEY")
 | 
					                || &self.rom_data[0x7FC0..0x7FC9] == b"VT TOURNEY")
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn assert_rom_length(&self) {
 | 
					    fn assert_rom_length(&self) {
 | 
				
			||||||
        assert!(self.rom_data.len() >= ENEMIZER_FILE_LENGTH, "You need to expand the rom before you can use Enemizer features.");
 | 
					        assert!(
 | 
				
			||||||
 | 
					            self.rom_data.len() >= ENEMIZER_FILE_LENGTH,
 | 
				
			||||||
 | 
					            "You need to expand the rom before you can use Enemizer features."
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn get_enemizer_seed(&self) -> i32 {
 | 
					    pub fn get_enemizer_seed(&self) -> i32 {
 | 
				
			||||||
| 
						 | 
					@ -167,9 +177,12 @@ impl RomData {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn get_enemizer_version(&self) -> anyhow::Result<&str> {
 | 
					    pub fn get_enemizer_version(&self) -> anyhow::Result<&str> {
 | 
				
			||||||
        if self.is_enemizer() {
 | 
					        if self.is_enemizer() {
 | 
				
			||||||
            let version_start = self.asar_symbols["enemizer_info_table"] + ENEMIZER_INFO_VERSION_OFFSET;
 | 
					            let version_start =
 | 
				
			||||||
 | 
					                self.asar_symbols["enemizer_info_table"] + ENEMIZER_INFO_VERSION_OFFSET;
 | 
				
			||||||
            let version_end = version_start + ENEMIZER_INFO_VERSION_LENGTH;
 | 
					            let version_end = version_start + ENEMIZER_INFO_VERSION_LENGTH;
 | 
				
			||||||
            Ok(std::str::from_utf8(&self.rom_data[version_start..version_end])?)
 | 
					            Ok(std::str::from_utf8(
 | 
				
			||||||
 | 
					                &self.rom_data[version_start..version_end],
 | 
				
			||||||
 | 
					            )?)
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            bail!("Not Enemizer Rom")
 | 
					            bail!("Not Enemizer Rom")
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -187,7 +200,7 @@ impl RomData {
 | 
				
			||||||
        self.set_patch_bytes(version_start..version_end)
 | 
					        self.set_patch_bytes(version_start..version_end)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn set_info_flags(&mut self, flags: OptionFlags) -> anyhow::Result<()>{
 | 
					    pub fn set_info_flags(&mut self, flags: OptionFlags) -> anyhow::Result<()> {
 | 
				
			||||||
        let bytes = flags.into_bytes();
 | 
					        let bytes = flags.into_bytes();
 | 
				
			||||||
        if bytes.len() > 0x100 - ENEMIZER_INFO_FLAGS_OFFSET {
 | 
					        if bytes.len() > 0x100 - ENEMIZER_INFO_FLAGS_OFFSET {
 | 
				
			||||||
            bail!("Option flags is too long to fit in the space allocated. Need to move data/code in asm file.");
 | 
					            bail!("Option flags is too long to fit in the space allocated. Need to move data/code in asm file.");
 | 
				
			||||||
| 
						 | 
					@ -249,7 +262,8 @@ impl RomData {
 | 
				
			||||||
        let header_base = self.asar_symbols["room_header_table"];
 | 
					        let header_base = self.asar_symbols["room_header_table"];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Change room header bank (at 0xB5E7) to 0x04.
 | 
					        // Change room header bank (at 0xB5E7) to 0x04.
 | 
				
			||||||
        let new_room_bank = self.rom_data[self.asar_symbols["moved_room_header_bank_value_address"]];
 | 
					        let new_room_bank =
 | 
				
			||||||
 | 
					            self.rom_data[self.asar_symbols["moved_room_header_bank_value_address"]];
 | 
				
			||||||
        self.rom_data[ROOM_HEADER_BANK_LOCATION] = new_room_bank;
 | 
					        self.rom_data[ROOM_HEADER_BANK_LOCATION] = new_room_bank;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Copy header table.
 | 
					        // Copy header table.
 | 
				
			||||||
| 
						 | 
					@ -260,14 +274,15 @@ impl RomData {
 | 
				
			||||||
                self.rom_data[table_base + (i * 2)],
 | 
					                self.rom_data[table_base + (i * 2)],
 | 
				
			||||||
                self.rom_data[table_base + (i * 2) + 1],
 | 
					                self.rom_data[table_base + (i * 2) + 1],
 | 
				
			||||||
                4,
 | 
					                4,
 | 
				
			||||||
                0
 | 
					                0,
 | 
				
			||||||
            ];
 | 
					            ];
 | 
				
			||||||
            let snes_address = u32::from_le_bytes(room_pointer);
 | 
					            let snes_address = u32::from_le_bytes(room_pointer);
 | 
				
			||||||
            let pc_address = snes_to_pc_address(snes_address);
 | 
					            let pc_address = snes_to_pc_address(snes_address);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // Copy i'th room's headers to new room_header_table.
 | 
					            // Copy i'th room's headers to new room_header_table.
 | 
				
			||||||
            let header_start = header_base + (i * 14);
 | 
					            let header_start = header_base + (i * 14);
 | 
				
			||||||
            self.rom_data.copy_within(pc_address..(pc_address + 14), header_start);
 | 
					            self.rom_data
 | 
				
			||||||
 | 
					                .copy_within(pc_address..(pc_address + 14), header_start);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Repoint the pointer table to the new header table.
 | 
					        // Repoint the pointer table to the new header table.
 | 
				
			||||||
| 
						 | 
					@ -276,7 +291,8 @@ impl RomData {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            assert_eq!(snes[2], new_room_bank, "We changed banks in the middle of moving the room headers! This should have been caught by dev team, unless you were playing with files you shouldn't touch.");
 | 
					            assert_eq!(snes[2], new_room_bank, "We changed banks in the middle of moving the room headers! This should have been caught by dev team, unless you were playing with files you shouldn't touch.");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            self.rom_data[(table_base + (i * 2))..(table_base + (i * 2) + 1)].copy_from_slice(&snes[0..1]);
 | 
					            self.rom_data[(table_base + (i * 2))..(table_base + (i * 2) + 1)]
 | 
				
			||||||
 | 
					                .copy_from_slice(&snes[0..1]);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue