public static MessageEntryBuilder.MessageBuilder RuntimePronoun(this MessageEntryBuilder.MessageBuilder @this, Item item, Item location) { return(@this .RuntimePronounStart(location) .Text(MessageUtils.GetPronoun(item)) .RuntimeGenericStop()); }
private void WriteItems() { var freeItems = new List <Item>(); if (_settings.LogicMode == LogicMode.Vanilla) { freeItems.Add(Item.FairyMagic); freeItems.Add(Item.MaskDeku); freeItems.Add(Item.SongHealing); freeItems.Add(Item.StartingSword); freeItems.Add(Item.StartingShield); freeItems.Add(Item.StartingHeartContainer1); freeItems.Add(Item.StartingHeartContainer2); if (_settings.ShortenCutscenes) { //giants cs were removed freeItems.Add(Item.SongOath); } WriteFreeItems(freeItems.ToArray()); return; } //write free item (start item default = Deku Mask) freeItems.Add(_randomized.ItemList.Find(u => u.NewLocation == Item.MaskDeku).Item); freeItems.Add(_randomized.ItemList.Find(u => u.NewLocation == Item.SongHealing).Item); freeItems.Add(_randomized.ItemList.Find(u => u.NewLocation == Item.StartingSword).Item); freeItems.Add(_randomized.ItemList.Find(u => u.NewLocation == Item.StartingShield).Item); freeItems.Add(_randomized.ItemList.Find(u => u.NewLocation == Item.StartingHeartContainer1).Item); freeItems.Add(_randomized.ItemList.Find(u => u.NewLocation == Item.StartingHeartContainer2).Item); WriteFreeItems(freeItems.ToArray()); //write everything else ItemSwapUtils.ReplaceGetItemTable(Values.ModsDirectory); ItemSwapUtils.InitItems(); if (_settings.FixEponaSword) { ResourceUtils.ApplyHack(Values.ModsDirectory + "fix-epona"); } if (_settings.PreventDowngrades) { ResourceUtils.ApplyHack(Values.ModsDirectory + "fix-downgrades"); } if (_settings.AddCowMilk) { ResourceUtils.ApplyHack(Values.ModsDirectory + "fix-cow-bottle-check"); } var newMessages = new List <MessageEntry>(); foreach (var item in _randomized.ItemList) { // Unused item if (item.NewLocation == null) { continue; } if (ItemUtils.IsBottleCatchContent(item.Item)) { ItemSwapUtils.WriteNewBottle(item.NewLocation.Value, item.Item); } else { ChestTypeAttribute.ChestType?overrideChestType = null; if ((item.Item.Name().Contains("Bombchu") || item.Item.Name().Contains("Shield")) && _randomized.Logic.Any(il => il.RequiredItemIds?.Contains(item.ID) == true || il.ConditionalItemIds?.Any(c => c.Contains(item.ID)) == true)) { overrideChestType = ChestTypeAttribute.ChestType.LargeGold; } ItemSwapUtils.WriteNewItem(item.NewLocation.Value, item.Item, newMessages, _settings.UpdateShopAppearance, _settings.PreventDowngrades, _settings.UpdateChests && item.IsRandomized, overrideChestType, _settings.CustomStartingItemList.Contains(item.Item)); } } var copyRupeesRegex = new Regex(": [0-9]+ Rupees"); foreach (var newMessage in newMessages) { var oldMessage = _messageTable.GetMessage(newMessage.Id); if (oldMessage != null) { var cost = copyRupeesRegex.Match(oldMessage.Message).Value; newMessage.Message = copyRupeesRegex.Replace(newMessage.Message, cost); } } if (_settings.UpdateShopAppearance) { // update tingle shops foreach (var messageShopText in Enum.GetValues(typeof(MessageShopText)).Cast <MessageShopText>()) { var messageShop = messageShopText.GetAttribute <MessageShopAttribute>(); var item1 = _randomized.ItemList.First(io => io.NewLocation == messageShop.Items[0]).Item; var item2 = _randomized.ItemList.First(io => io.NewLocation == messageShop.Items[1]).Item; newMessages.Add(new MessageEntry { Id = (ushort)messageShopText, Header = null, Message = string.Format(messageShop.MessageFormat, item1.Name() + " ", messageShop.Prices[0], item2.Name() + " ", messageShop.Prices[1]) }); } // update business scrub var businessScrubItem = _randomized.ItemList.First(io => io.NewLocation == Item.HeartPieceTerminaBusinessScrub).Item; newMessages.Add(new MessageEntry { Id = 0x1631, Header = null, Message = $"\x1E\x3A\xD2Please! I'll sell you {MessageUtils.GetArticle(businessScrubItem)}\u0001{businessScrubItem.Name()}\u0000 if you just keep this place a secret...\x19\xBF".Wrap(35, "\u0011") }); newMessages.Add(new MessageEntry { Id = 0x1632, Header = null, Message = $"\u0006150 Rupees\u0000 for{MessageUtils.GetPronounOrAmount(businessScrubItem).ToLower()}!\u0011 \u0011\u0002\u00C2I'll buy {MessageUtils.GetPronoun(businessScrubItem)}\u0011No thanks\u00BF" }); newMessages.Add(new MessageEntry { Id = 0x1634, Header = null, Message = $"What about{MessageUtils.GetPronounOrAmount(businessScrubItem, "").ToLower()} for \u0006100 Rupees\u0000?\u0011 \u0011\u0002\u00C2I'll buy {MessageUtils.GetPronoun(businessScrubItem)}\u0011No thanks\u00BF" }); // update biggest bomb bag purchase var biggestBombBagItem = _randomized.ItemList.First(io => io.NewLocation == Item.UpgradeBiggestBombBag).Item; newMessages.Add(new MessageEntry { Id = 0x15F5, Header = null, Message = $"I sell {MessageUtils.GetArticle(biggestBombBagItem)}\u0001{MessageUtils.GetAlternateName(biggestBombBagItem)}\u0000, but I'm focusing my marketing efforts on \u0001Gorons\u0000.".Wrap(35, "\u0011").EndTextbox() + "What I'd really like to do is go back home and do business where I'm surrounded by trees and grass.\u0019\u00BF".Wrap(35, "\u0011") }); newMessages.Add(new MessageEntry { Id = 0x15FF, Header = null, Message = $"\x1E\x39\x8CRight now, I've got a \u0001special\u0011\u0000offer just for you.\u0019\u00BF" }); newMessages.Add(new MessageEntry { Id = 0x1600, Header = null, Message = $"\x1E\x38\x81I'll give you {MessageUtils.GetArticle(biggestBombBagItem, "my ")}\u0001{biggestBombBagItem.Name()}\u0000, regularly priced at \u00061000 Rupees\u0000...".Wrap(35, "\u0011").EndTextbox() + "In return, you'll give me just\u0011\u0006200 Rupees\u0000!\u0019\u00BF" }); newMessages.Add(new MessageEntry { Id = 0x1606, Header = null, Message = $"\x1E\x38\x81I'll give you {MessageUtils.GetArticle(biggestBombBagItem, "my ")}\u0001{biggestBombBagItem.Name()}\u0000, regularly priced at \u00061000 Rupees\u0000, for just \u0006200 Rupees\u0000!\u0019\u00BF".Wrap(35, "\u0011") }); // update swamp scrub purchase var magicBeanItem = _randomized.ItemList.First(io => io.NewLocation == Item.ShopItemBusinessScrubMagicBean).Item; newMessages.Add(new MessageEntry { Id = 0x15E1, Header = null, Message = $"\x1E\x39\xA7I'm selling {MessageUtils.GetArticle(magicBeanItem)}\u0001{MessageUtils.GetAlternateName(magicBeanItem)}\u0000 to Deku Scrubs, but I'd really like to leave my hometown.".Wrap(35, "\u0011").EndTextbox() + "I'm hoping to find some success in a livelier place!\u0019\u00BF".Wrap(35, "\u0011") }); newMessages.Add(new MessageEntry { Id = 0x15E9, Header = null, Message = $"\x1E\x3A\u00D2Do you know what {MessageUtils.GetArticle(magicBeanItem)}\u0001{MessageUtils.GetAlternateName(magicBeanItem)}\u0000 {MessageUtils.GetVerb(magicBeanItem)}, sir?".Wrap(35, "\u0011") + $"\u0011I'll sell you{MessageUtils.GetPronounOrAmount(magicBeanItem).ToLower()} for \u000610 Rupees\u0000.\u0019\u00BF" }); // update ocean scrub purchase var greenPotionItem = _randomized.ItemList.First(io => io.NewLocation == Item.ShopItemBusinessScrubGreenPotion).Item; newMessages.Add(new MessageEntry { Id = 0x1608, Header = null, Message = $"\x1E\x39\xA7I'm selling {MessageUtils.GetArticle(greenPotionItem)}\u0001{MessageUtils.GetAlternateName(greenPotionItem)}\u0000, but I'm focusing my marketing efforts on Zoras.".Wrap(35, "\u0011").EndTextbox() + "Actually, I'd like to do business someplace where it's cooler and the air is clean.\u0019\u00BF".Wrap(35, "\u0011") }); newMessages.Add(new MessageEntry { Id = 0x1612, Header = null, Message = $"\x1E\x39\x8CI'll sell you {MessageUtils.GetArticle(greenPotionItem)}\u0001{greenPotionItem.Name()}\u0000 for \u000640 Rupees\u0000!\u00E0\u00BF".Wrap(35, "\u0011") }); // update canyon scrub purchase var bluePotionItem = _randomized.ItemList.First(io => io.NewLocation == Item.ShopItemBusinessScrubBluePotion).Item; newMessages.Add(new MessageEntry { Id = 0x161C, Header = null, Message = $"\x1E\x39\xA7I'm here to sell {MessageUtils.GetArticle(bluePotionItem)}\u0001{MessageUtils.GetAlternateName(bluePotionItem)}\u0000.".Wrap(35, "\u0011").EndTextbox() + "Actually, I want to do business in the sea breeze while listening to the sound of the waves.\u0019\u00BF".Wrap(35, "\u0011") }); newMessages.Add(new MessageEntry { Id = 0x1626, Header = null, Message = $"\x1E\x3A\u00D2Don't you need {MessageUtils.GetArticle(bluePotionItem)}\u0001{MessageUtils.GetAlternateName(bluePotionItem)}\u0000? I'll sell you{MessageUtils.GetPronounOrAmount(bluePotionItem).ToLower()} for \u0006100 Rupees\u0000.\u0019\u00BF".Wrap(35, "\u0011") }); newMessages.Add(new MessageEntry { Id = 0x15EA, Header = null, Message = $"Do we have a deal?\u0011 \u0011\u0002\u00C2Yes\u0011No\u00BF" }); // update gorman bros milk purchase var gormanBrosMilkItem = _randomized.ItemList.First(io => io.NewLocation == Item.ShopItemGormanBrosMilk).Item; newMessages.Add(new MessageEntry { Id = 0x3463, Header = null, Message = $"Won'tcha buy {MessageUtils.GetArticle(gormanBrosMilkItem)}\u0001{MessageUtils.GetAlternateName(gormanBrosMilkItem)}\u0000?\u0019\u00BF".Wrap(35, "\u0011") }); newMessages.Add(new MessageEntry { Id = 0x3466, Header = null, Message = $"\u000650 Rupees\u0000 will do ya for{MessageUtils.GetPronounOrAmount(gormanBrosMilkItem).ToLower()}.\u0011 \u0011\u0002\u00C2I'll buy {MessageUtils.GetPronoun(gormanBrosMilkItem)}\u0011No thanks\u00BF" }); newMessages.Add(new MessageEntry { Id = 0x346B, Header = null, Message = $"Buyin' {MessageUtils.GetArticle(gormanBrosMilkItem)}\u0001{MessageUtils.GetAlternateName(gormanBrosMilkItem)}\u0000?\u0019\u00BF".Wrap(35, "\u0011") }); newMessages.Add(new MessageEntry { Id = 0x348F, Header = null, Message = $"Seems like we're the only ones who have {MessageUtils.GetArticle(gormanBrosMilkItem)}\u0001{MessageUtils.GetAlternateName(gormanBrosMilkItem)}\u0000. Hyuh, hyuh. If you like, I'll sell you{MessageUtils.GetPronounOrAmount(gormanBrosMilkItem).ToLower()}.\u0019\u00BF".Wrap(35, "\u0011") }); newMessages.Add(new MessageEntry { Id = 0x3490, Header = null, Message = $"\u000650 Rupees\u0000 will do you for{MessageUtils.GetPronounOrAmount(gormanBrosMilkItem).ToLower()}!\u0011 \u0011\u0002\u00C2I'll buy {MessageUtils.GetPronoun(gormanBrosMilkItem)}\u0011No thanks\u00BF" }); // update lottery message var lotteryItem = _randomized.ItemList.First(io => io.NewLocation == Item.MundaneItemLotteryPurpleRupee).Item; newMessages.Add(new MessageEntry { Id = 0x2B5C, Header = null, Message = $"Would you like the chance to buy your dreams for \u000610 Rupees\u0000?".Wrap(35, "\u0011").EndTextbox() + $"Pick any three numbers, and if those are picked, you'll win {MessageUtils.GetArticle(lotteryItem)}\u0001{lotteryItem.Name()}\u0000. It's only for the \u0001first\u0000 person!\u0019\u00BF".Wrap(35, "\u0011") }); } // replace "Razor Sword is now blunt" message with get-item message for Kokiri Sword. newMessages.Add(new MessageEntry { Id = 0xF9, Header = new byte[11] { 0x06, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, Message = $"You got the \x01Kokiri Sword\x00!\u0011This is a hidden treasure of\u0011the Kokiri, but you can borrow it\u0011for a while.\u00BF", }); // replace Magic Power message newMessages.Add(new MessageEntry { Id = 0xC8, Header = null, Message = $"\u0017You've been granted \u0002Magic Power\u0000!\u0018\u0011Replenish it with \u0001Magic Jars\u0000\u0011and \u0001Potions\u0000.\u00BF", }); // update Bank Reward messages newMessages.Add(new MessageEntry { Id = 0x45C, Header = null, Message = "\u0017What's this? You've already saved\u0011up \u0001500 Rupees\u0000!?!\u0018\u0011\u0013\u0012Well, little guy, here's your special\u0011gift. Take it!\u00E0\u00BF", }); newMessages.Add(new MessageEntry { Id = 0x45D, Header = null, Message = "\u0017What's this? You've already saved\u0011up \u00011000 Rupees\u0000?!\u0018\u0011\u0013\u0012Well, little guy, I can't take any\u0011more deposits. Sorry, but this is\u0011all I can give you.\u00E0\u00BF", }); if (_settings.AddSkulltulaTokens) { ResourceUtils.ApplyHack(Values.ModsDirectory + "fix-skulltula-tokens"); newMessages.Add(new MessageEntry { Id = 0x51, Header = new byte[11] { 0x02, 0x00, 0x52, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, Message = $"\u0017You got an \u0005Ocean Gold Skulltula\u0011Spirit\0!\u0018\u001F\u0000\u0010 This is your \u0001\u000D\u0000 one!\u00BF", }); newMessages.Add(new MessageEntry { Id = 0x52, Header = new byte[11] { 0x02, 0x00, 0x52, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, Message = $"\u0017You got a \u0006Swamp Gold Skulltula\u0011Spirit\0!\u0018\u001F\u0000\u0010 This is your \u0001\u000D\u0000 one!\u00BF", }); } if (_settings.AddStrayFairies) { ResourceUtils.ApplyHack(Values.ModsDirectory + "fix-fairies"); } var dungeonItemMessageIds = new byte[] { 0x3C, 0x3D, 0x3E, 0x3F, 0x74, 0x40, 0x4D, 0x4E, 0x53, 0x75, 0x54, 0x61, 0x64, 0x6E, 0x76, 0x70, 0x71, 0x72, 0x73, 0x77, }; var dungeonNames = new string[] { "\u0006Woodfall Temple\u0000", "\u0002Snowhead Temple\u0000", "\u0005Great Bay Temple\u0000", "\u0004Stone Tower Temple\u0000" }; var dungeonItemMessages = new string[] { "\u0017You found a \u0001Small Key\u0000 for\u0011{0}!\u0018\u00BF", "\u0017You found the \u0001Boss Key\u0000 for\u0011{0}!\u0018\u00BF", "\u0017You found the \u0001Dungeon Map\u0000 for\u0011{0}!\u0018\u00BF", "\u0017You found the \u0001Compass\u0000 for\u0011{0}!\u0018\u00BF", "\u0017You found a \u0001Stray Fairy\u0000 from\u0011{0}!\u0018\u001F\u0000\u0010\u0011This is your \u0001\u000C\u0000 one!\u00BF", }; var dungeonItemIcons = new byte[] { 0x3C, 0x3D, 0x3E, 0x3F, 0xFE }; for (var i = 0; i < dungeonItemMessageIds.Length; i++) { var messageId = dungeonItemMessageIds[i]; var icon = dungeonItemIcons[i % 5]; var dungeonName = dungeonNames[i / 5]; var message = string.Format(dungeonItemMessages[i % 5], dungeonName); newMessages.Add(new MessageEntry { Id = messageId, Header = new byte[11] { 0x02, 0x00, icon, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, Message = message }); } _messageTable.UpdateMessages(newMessages); if (_settings.AddShopItems) { ResourceUtils.ApplyHack(Values.ModsDirectory + "fix-shop-checks"); } }