public static void PatchWeaponNames(Patch in_Patch, ISeed in_Seed, out List <Char> out_NewWeaponLetters) { const Int32 WEAPON_GET_LETTERS_ADDRESS = 0x037E22; const Int32 WEAPON_GET_NAME_ADDRESS = 0x037E2C; const Int32 WEAPON_GET_EXTENDED_NAME_ADDRESS = 0x037F5C; const Int32 WEAPON_GET_EXTENDED_NAME_INDEX = 4; // Quick Boomerang has an extended name const Int32 WEAPON_COUNT = 8; WeaponNameGenerator weaponNameGenerator = new WeaponNameGenerator(in_Seed); List <WeaponName> weaponNames = new List <WeaponName>(); // Write in new weapon names for (Int32 weaponIndex = 0; weaponIndex < WEAPON_COUNT; ++weaponIndex) { // Each weapon get name is 14 bytes long with a 2 Byte header Int32 offsetAddress = WEAPON_GET_NAME_ADDRESS + (weaponIndex * 0x10); if (WEAPON_GET_EXTENDED_NAME_INDEX == weaponIndex) { WeaponName weaponName = weaponNameGenerator.GenerateWeaponName(true); weaponNames.Add(weaponName); Int32 characterIndex = 0; foreach (Char c in weaponName.Name) { in_Patch.Add( offsetAddress + characterIndex, c.AsPrintCharacter(), String.Format("Weapon Name {0} Char #{1}: {2}", ((EDmgVsBoss.Offset)weaponIndex).Name, characterIndex, c.ToString())); characterIndex++; } characterIndex = 0; foreach (Char c in weaponName.ExtendedName) { in_Patch.Add( WEAPON_GET_EXTENDED_NAME_ADDRESS + characterIndex, c.AsPrintCharacter(), String.Format("Extended Weapon Name {0} Char #{1}: {2}", ((EDmgVsBoss.Offset)weaponIndex).Name, characterIndex, c.ToString())); characterIndex++; } } else { WeaponName weaponName = weaponNameGenerator.GenerateWeaponName(false); weaponNames.Add(weaponName); Int32 characterIndex = 0; foreach (Char c in weaponName.Name) { in_Patch.Add( offsetAddress + characterIndex, c.AsPrintCharacter(), String.Format("Weapon Name {0} Char #{1}: {2}", ((EDmgVsBoss.Offset)weaponIndex).Name, characterIndex, c.ToString())); characterIndex++; } } } // Get a list of the weapon letters List <Char> weaponLetters = weaponNames.Select(x => x.Letter).ToList(); // Write in "Weapon Get" letters // // NOTE! There is not a space for buster because // there is never a "Weapon Get" for buster for (Int32 weaponLetterIndex = 0; weaponLetterIndex < weaponLetters.Count; ++weaponLetterIndex) { Char weaponLetter = weaponLetters[weaponLetterIndex]; in_Patch.Add( WEAPON_GET_LETTERS_ADDRESS + weaponLetterIndex, weaponLetter.AsPrintCharacter(), $"Weapon Get {((EDmgVsBoss.Offset)weaponLetterIndex).Name} Letter: {weaponLetter}"); } // Pick a new weapon letter for buster weaponLetters.Insert(0, weaponNameGenerator.GetNextLetter(false)); // Write in weapon pause menu letters for (Int32 weaponLetterIndex = 0; weaponLetterIndex < weaponLetters.Count; ++weaponLetterIndex) { Char weaponLetter = weaponLetters[weaponLetterIndex]; // Write to pause menu in_Patch.Add( PauseScreenWpnAddressByBossIndex[weaponLetterIndex], weaponLetter.AsPauseScreenString(), $"Pause menu weapon letter GFX for \'{weaponLetter}\'"); } out_NewWeaponLetters = weaponLetters; }