public static void ReadInstrumentSetList() { // traverse the whole audiobank index and grab details about every bank // use those details to generate a list from the vanilla game that we can modify as needed List <InstrumentSetInfo> InstrumentSets = new List <InstrumentSetInfo>(); for (int inst_set_num = 0; inst_set_num <= 0x28; ++inst_set_num) { // each bank has one 16 byte sentence of data, first word is address, second length, last 8 bytes metadata int table_pointer_addr = Addresses.AudiobankTable + (16 * inst_set_num); int bank_location = (ReadWriteUtils.ReadU16(table_pointer_addr) << 16) + ReadWriteUtils.ReadU16(table_pointer_addr + 2); int bank_length = (ReadWriteUtils.ReadU16(table_pointer_addr + 4) << 16) + ReadWriteUtils.ReadU16(table_pointer_addr + 6); byte[] metadata = new byte[8]; for (int b = 0; b < 8; ++b) { metadata[b] = ReadWriteUtils.Read(table_pointer_addr + 8 + b); } byte[] bank_data = new byte[bank_length]; for (int b = 0; b < bank_length; ++b) { bank_data[b] = ReadWriteUtils.Read(Addresses.Audiobank + bank_location + b); } InstrumentSetInfo new_bank = new InstrumentSetInfo { BankSlot = inst_set_num, BankMetaData = metadata, BankBinary = bank_data }; InstrumentSets.Add(new_bank); } RomData.InstrumentSetList = InstrumentSets; }
public static void ReadInstrumentSetList() { /// traverse the whole audiobank index and grab details about every bank /// use those details to generate a list from the vanilla game that we can modify as needed RomData.InstrumentSetList = new List <InstrumentSetInfo>(); for (int audiobankIndex = 0; audiobankIndex <= 0x28; ++audiobankIndex) { // each bank has one 16 byte sentence of data, first word is address, second is length, last 2 words metadata int audiobankIndexAddr = Addresses.AudiobankTable + (audiobankIndex * 0x10); int audiobankBankOffset = (ReadWriteUtils.ReadU16(audiobankIndexAddr) << 16) + ReadWriteUtils.ReadU16(audiobankIndexAddr + 2); int bankLength = (ReadWriteUtils.ReadU16(audiobankIndexAddr + 4) << 16) + ReadWriteUtils.ReadU16(audiobankIndexAddr + 6); byte[] bankMetadata = new byte[8]; for (int b = 0; b < 8; ++b) { bankMetadata[b] = ReadWriteUtils.Read(audiobankIndexAddr + 8 + b); } byte[] bankData = new byte[bankLength]; for (int b = 0; b < bankLength; ++b) { bankData[b] = ReadWriteUtils.Read(Addresses.Audiobank + audiobankBankOffset + b); } var newInstrumentSet = new InstrumentSetInfo { BankSlot = audiobankIndex, BankMetaData = bankMetadata, BankBinary = bankData }; RomData.InstrumentSetList.Add(newInstrumentSet); } }
private static void UpdateShop(ItemObject itemObject, List <MessageEntry> newMessages, MessageTable messageTable) { var location = itemObject.NewLocation.Value; var shopInventories = location.GetAttributes <ShopInventoryAttribute>(); foreach (var shopInventory in shopInventories) { var messageId = ReadWriteUtils.ReadU16(shopInventory.ShopItemAddress + 0x0A); var oldMessage = messageTable.GetMessage((ushort)(messageId + 1)); var cost = ReadWriteUtils.Arr_ReadU16(oldMessage.Header, 5); newMessages.Add(new MessageEntryBuilder() .Id(messageId) .Message(it => { it.Red(() => { it.RuntimeItemName(itemObject.DisplayName(), location).Text(": ").Text(cost.ToString()).Text(" Rupees").NewLine(); }) .RuntimeWrap(() => { it.RuntimeItemDescription(itemObject.DisplayItem, shopInventory.Keeper, location); }) .DisableTextBoxClose() .EndFinalTextBox(); }) .Build() ); newMessages.Add(new MessageEntryBuilder() .Id((ushort)(messageId + 1)) .Message(it => { it.RuntimeItemName(itemObject.DisplayName(), location).Text(": ").Text(cost.ToString()).Text(" Rupees").NewLine() .Text(" ").NewLine() .StartGreenText() .TwoChoices() .Text("I'll buy ").RuntimePronoun(itemObject.DisplayItem, location).NewLine() .Text("No thanks") .EndFinalTextBox(); }) .Build() ); } }
public static int ByteswapROM(string filename) { using (BinaryReader ROM = new BinaryReader(File.OpenRead(filename))) { if (ROM.BaseStream.Length % 4 != 0) { return(-1); } byte[] buffer = new byte[4]; ROM.Read(buffer, 0, 4); // very hacky ROM.BaseStream.Seek(0, 0); if (buffer[0] == 0x80) { return(1); } else if (buffer[1] == 0x80) { using (BinaryWriter newROM = new BinaryWriter(File.Open(filename + ".z64", FileMode.Create))) { while (ROM.BaseStream.Position < ROM.BaseStream.Length) { newROM.Write(ReadWriteUtils.Byteswap16(ReadWriteUtils.ReadU16(ROM))); } } return(0); } else if (buffer[3] == 0x80) { using (BinaryWriter newROM = new BinaryWriter(File.Open(filename + ".z64", FileMode.Create))) { while (ROM.BaseStream.Position < ROM.BaseStream.Length) { newROM.Write(ReadWriteUtils.Byteswap32(ReadWriteUtils.ReadU32(ROM))); } } return(0); } } return(-1); }
private static void UpdateShop(Item location, Item item, List <MessageEntry> newMessages) { var newItem = RomData.GetItemList[item.GetItemIndex().Value]; var shopRooms = location.GetAttributes <ShopRoomAttribute>(); foreach (var shopRoom in shopRooms) { ReadWriteUtils.WriteToROM(shopRoom.RoomObjectAddress, (ushort)newItem.Object); } var shopInventories = location.GetAttributes <ShopInventoryAttribute>(); foreach (var shopInventory in shopInventories) { ReadWriteUtils.WriteToROM(shopInventory.ShopItemAddress, (ushort)newItem.Object); var index = newItem.Index > 0x7F ? (byte)(0xFF - newItem.Index) : (byte)(newItem.Index - 1); ReadWriteUtils.WriteToROM(shopInventory.ShopItemAddress + 0x03, index); var shopTexts = item.ShopTexts(); string description; switch (shopInventory.Keeper) { case ShopInventoryAttribute.ShopKeeper.WitchShop: description = shopTexts.WitchShop; break; case ShopInventoryAttribute.ShopKeeper.TradingPostMain: description = shopTexts.TradingPostMain; break; case ShopInventoryAttribute.ShopKeeper.TradingPostPartTimer: description = shopTexts.TradingPostPartTimer; break; case ShopInventoryAttribute.ShopKeeper.CuriosityShop: description = shopTexts.CuriosityShop; break; case ShopInventoryAttribute.ShopKeeper.BombShop: description = shopTexts.BombShop; break; case ShopInventoryAttribute.ShopKeeper.ZoraShop: description = shopTexts.ZoraShop; break; case ShopInventoryAttribute.ShopKeeper.GoronShop: description = shopTexts.GoronShop; break; case ShopInventoryAttribute.ShopKeeper.GoronShopSpring: description = shopTexts.GoronShopSpring; break; default: description = null; break; } if (description == null) { description = shopTexts.Default; } var messageId = ReadWriteUtils.ReadU16(shopInventory.ShopItemAddress + 0x0A); newMessages.Add(new MessageEntry { Id = messageId, Header = null, Message = MessageUtils.BuildShopDescriptionMessage(item.Name(), 20, description) }); newMessages.Add(new MessageEntry { Id = (ushort)(messageId + 1), Header = null, Message = MessageUtils.BuildShopPurchaseMessage(item.Name(), 20, item) }); } }
private static void UpdateShop(ItemObject itemObject, List <MessageEntry> newMessages) { var location = itemObject.NewLocation.Value; GetItemEntry newItem; if (itemObject.Mimic != null) { newItem = RomData.GetItemList[itemObject.Mimic.Item.GetItemIndex().Value]; } else if (itemObject.Item.IsExclusiveItem()) { newItem = itemObject.Item.ExclusiveItemEntry(); } else { newItem = RomData.GetItemList[itemObject.Item.GetItemIndex().Value]; } var shopRooms = location.GetAttributes <ShopRoomAttribute>(); foreach (var shopRoom in shopRooms) { ReadWriteUtils.WriteToROM(shopRoom.RoomObjectAddress, (ushort)newItem.Object); } var shopInventories = location.GetAttributes <ShopInventoryAttribute>(); foreach (var shopInventory in shopInventories) { ReadWriteUtils.WriteToROM(shopInventory.ShopItemAddress, (ushort)newItem.Object); var index = newItem.Index > 0x7F ? (byte)(0xFF - newItem.Index) : (byte)(newItem.Index - 1); ReadWriteUtils.WriteToROM(shopInventory.ShopItemAddress + 0x03, index); var messageId = ReadWriteUtils.ReadU16(shopInventory.ShopItemAddress + 0x0A); newMessages.Add(new MessageEntryBuilder() .Id(messageId) .Message(it => { it.Red(() => { it.RuntimeItemName(itemObject.DisplayName(), location).Text(": ").Text("20 Rupees").NewLine(); }) .RuntimeWrap(() => { it.RuntimeItemDescription(itemObject.DisplayItem, shopInventory.Keeper, location); }) .DisableTextBoxClose() .EndFinalTextBox(); }) .Build() ); newMessages.Add(new MessageEntryBuilder() .Id((ushort)(messageId + 1)) .Message(it => { it.RuntimeItemName(itemObject.DisplayName(), location).Text(": ").Text("20 Rupees").NewLine() .Text(" ").NewLine() .StartGreenText() .TwoChoices() .Text("I'll buy ").RuntimePronoun(itemObject.DisplayItem, location).NewLine() .Text("No thanks") .EndFinalTextBox(); }) .Build() ); } }