/// <summary> /// Generic Subscreen handler. /// </summary> public static void Handler() { if (Subscreens.FirstDraw) { Subscreens.FirstDraw = false; Subscreens.Redraw = true; } if (Subscreens.Redraw) { Subscreens.Redraw = false; NoxicoGame.DrawMessages(); NoxicoGame.DrawStatus(); UIManager.Draw(); } if (NoxicoGame.IsKeyDown(KeyBinding.Back) || NoxicoGame.IsKeyDown(KeyBinding.Accept) || Vista.Triggers == XInputButtons.A || Vista.Triggers == XInputButtons.B) { //If we pressed Back/Esc or [B], pick the out-of-band -1 sentinel option. if (NoxicoGame.IsKeyDown(KeyBinding.Back) || Vista.Triggers == XInputButtons.B) { option = -1; } Enter(null, null); ActionList.Answer = option == -1 ? -1 : options.ElementAt(option).Key; onChoice(); //Let the caller handle things. NoxicoGame.ClearKeys(); } else { UIManager.CheckKeys(); } }
public static void Handler() { var player = NoxicoGame.Me.Player; if (!player.Character.HasToken("items") || player.Character.GetToken("items").Tokens.Count == 0) { MessageBox.Notice(i18n.GetString("inventory_youhavenothing"), true); Subscreens.PreviousScreen.Clear(); Subscreens.FirstDraw = true; return; } if (Subscreens.FirstDraw) { UIManager.Initialize(); Subscreens.FirstDraw = false; NoxicoGame.ClearKeys(); Subscreens.Redraw = true; } if (Subscreens.Redraw) { Subscreens.Redraw = false; inventoryTokens.Clear(); inventoryItems.Clear(); var itemTexts = new List <string>(); Inventory.sigils = new List <string>(); foreach (var carriedItem in player.Character.GetToken("items").Tokens) { var find = NoxicoGame.KnownItems.Find(x => x.ID == carriedItem.Name); if (find == null) { continue; } inventoryTokens.Add(carriedItem); inventoryItems.Add(find); var item = find; var sigils = new List <string>(); var carried = carriedItem; var icon = " "; if (item.HasToken("ascii")) { var color = "Silver"; if (item.Path("ascii/fore") != null) { color = item.Path("ascii/fore").Text; } if (carriedItem.HasToken("color")) { color = carriedItem.GetToken("color").Text; } if (item.ID == "book") { var cga = new[] { "Black", "DarkBlue", "DarkGreen", "DarkCyan", "DarkRed", "Purple", "Brown", "Silver", "Gray", "Blue", "Green", "Cyan", "Red", "Magenta", "Yellow", "White" }; color = cga[carriedItem.GetToken("id").Text.GetHashCode() % cga.Length]; } if (color.Equals("black", StringComparison.OrdinalIgnoreCase)) { color = "Gray"; } icon = "<c" + color + ">" + (char)item.Path("ascii/char").Value; } if (item.HasToken("equipable")) { var eq = item.GetToken("equipable"); //if (item.HasToken("weapon")) // sigils.Add("weapon"); if (eq.HasToken("hat") && eq.HasToken("goggles") && eq.HasToken("mask")) { sigils.Add("fullmask"); } else { foreach (var x in new[] { "hat", "goggles", "mask" }) { if (eq.HasToken(x)) { sigils.Add(x); } } } foreach (var x in new[] { "neck", "ring" }) { if (eq.HasToken(x)) { sigils.Add(x); } } if (eq.HasToken("underpants") || eq.HasToken("undershirt")) { sigils.Add("undies"); } if (eq.HasToken("shirt") && !eq.HasToken("pants")) { sigils.Add("shirt"); } if (eq.HasToken("pants") && !eq.HasToken("shirt")) { sigils.Add("pants"); } if (eq.HasToken("shirt") && eq.HasToken("pants")) { sigils.Add("suit"); } foreach (var x in new[] { "shoes", "jacket", "cloak", "socks" }) { if (eq.HasToken(x)) { sigils.Add(x); } } if (carried.HasToken("equipped")) { sigils.Add("equipped"); } } if (carried.HasToken("unidentified")) { sigils.Add("unidentified"); } /* * if (item.HasToken("statbonus")) * { * foreach (var bonus in item.GetToken("statbonus").Tokens) * { * if (bonus.Name == "health") * sigils.Add("\uE300" + bonus.Value + "HP"); * } * } */ var info = item.GetModifiers(carriedItem); sigils.AddRange(info.Select(x => "\uE300" + x)); /* Removed -- should be replaced with less cursy words. #if DEBUG * if (carried.HasToken("cursed")) * sigils.Add(carried.GetToken("cursed").HasToken("known") ? "cursed" : carried.GetToken("cursed").HasToken("hidden") ? "(cursed)" : "cursed!"); #else * if (carried.HasToken("cursed") && !carried.GetToken("cursed").HasToken("hidden") && carried.GetToken("cursed").HasToken("known")) * sigils.Add("cursed"); #endif */ var itemString = item.ToString(carried, false, false); if (itemString.Length > 33) { itemString = itemString.Disemvowel(); } itemTexts.Add(itemString); var sigilText = new StringBuilder(); var sigilComma = string.Empty; for (var i = 0; i < sigils.Count; i++) { if (sigilText.Length < Program.Cols - 40) { sigilText.Append(sigilComma); sigilText.Append((sigils[i][0] == '\uE300') ? sigils[i].Substring(1) : i18n.GetString("sigil_" + sigils[i])); sigilComma = ", "; } else { if (i < sigils.Count) { sigilText.Append('\u0137'); } break; } } Inventory.sigils.Add(icon + "<cGray> " + sigilText.ToString()); /* Inventory.sigils.Add(icon + "<cGray> " + string.Join(", ", sigils.Select(s => * { * if (s[0] == '\uE300') * return s.Substring(1); * else * return i18n.GetString("sigil_" + s); * }))); */ } var height = inventoryItems.Count; if (height > Program.Rows - 15) { height = Program.Rows - 15; } if (selection >= inventoryItems.Count) { selection = inventoryItems.Count - 1; } if (UIManager.Elements.Count < 2) { yourWindow = new UIWindow(i18n.GetString("inventory_yours")) { Left = 1, Top = 1, Width = Program.Cols - 2, Height = 2 + height }; descriptionWindow = new UIWindow(string.Empty) { Left = 2, Top = Program.Rows - 10, Width = Program.Cols - 4, Height = 8, Title = UIColors.RegularText }; howTo = new UILabel(string.Empty) { Left = 0, Top = 0, Width = Program.Cols - 1, Height = 1, Background = UIColors.StatusBackground, Foreground = UIColors.StatusForeground }; itemDesc = new UILabel(string.Empty) { Width = Program.Cols - 8, Height = 5 }; itemDesc.Move(2, 1, descriptionWindow); itemList = new UIList(string.Empty, null, itemTexts) { Width = Program.Cols - 4, Height = height, Index = selection, Background = UIColors.WindowBackground }; itemList.Move(1, 1, yourWindow); sigilView = new UILabel(string.Empty) { Width = 60, Height = height }; sigilView.Move(33, 0, itemList); itemList.Change = (s, e) => { selection = itemList.Index; var t = inventoryTokens[itemList.Index]; var i = inventoryItems[itemList.Index]; var r = string.Empty; var d = i.GetDescription(t) + "\n\n"; var weaponData = i.GetToken("weapon"); if (weaponData != null) { if (weaponData.HasToken("skill")) { d += i18n.Format("inventory_weaponskill", weaponData.GetToken("skill").Text.Replace('_', ' ') + " "); } if (weaponData.HasToken("attacktype")) { d += i18n.Format("inventory_weapontype", i18n.GetString("attacktype_" + weaponData.GetToken("attacktype").Text)); } d += '\n'; } var mods = i.GetModifiers(t); if (mods.Count > 0) { d += i18n.Format("inventory_modifiers", mods.Join()); } d = Toolkit.Wordwrap(d.SmartQuote(), itemDesc.Width); if (i.ID == "book") { r = i18n.GetString("inventory_pressenter_book"); } else if (i.HasToken("equipable")) { if (t.HasToken("equipped")) { if (t.Path("cursed/known") != null) { r = i18n.GetString("inventory_cannotunequip"); } else { r = i18n.GetString("inventory_pressenter_unequip"); } } else { r = i18n.GetString("inventory_pressenter_equip"); } } else if (i.HasToken("quest")) { r = i18n.GetString("inventory_questitem"); } else { r = i18n.GetString("inventory_pressenter_use"); } howTo.Text = (' ' + r).PadEffective(Program.Cols); itemDesc.Text = d; descriptionWindow.Text = i.ToString(t, false, false); //howTo.Draw(); //itemDesc.Draw(); UpdateColumns(); UIManager.Draw(); }; itemList.Enter = (s, e) => { TryUse(player.Character, inventoryTokens[itemList.Index], inventoryItems[itemList.Index]); }; capacity = new UILabel(string.Format("{0:F2}/{1:F2}", player.Character.Carried, player.Character.Capacity)); capacity.MoveBelow(4, -1, descriptionWindow); UIManager.Elements.Add(new UILabel(new string(' ', Program.Cols)) { Left = 0, Top = Program.Rows - 1, Background = UIColors.StatusBackground }); UIManager.Elements.Add(yourWindow); UIManager.Elements.Add(descriptionWindow); UIManager.Elements.Add(howTo); UIManager.Elements.Add(itemList); UIManager.Elements.Add(sigilView); UIManager.Elements.Add(itemDesc); UIManager.Elements.Add(capacity); UIManager.Elements.Add(new UIButton(' ' + i18n.GetString("inventory_drop") + ' ', (s, e) => { TryDrop(player, inventoryTokens[itemList.Index], inventoryItems[itemList.Index]); }) { Left = Program.Cols - 4 - i18n.GetString("inventory_drop").Length() - 2, Top = 1 }); UIManager.Highlight = itemList; } else { yourWindow.Height = 2 + height; itemList.Items = itemTexts; NoxicoGame.Me.CurrentBoard.Redraw(); NoxicoGame.Me.CurrentBoard.Draw(); } itemList.Index = selection; NoxicoGame.DrawStatus(); UIManager.Draw(); } if (NoxicoGame.IsKeyDown(KeyBinding.Back) || NoxicoGame.IsKeyDown(KeyBinding.Items) || Vista.Triggers == XInputButtons.B) { NoxicoGame.ClearKeys(); NoxicoGame.Immediate = true; NoxicoGame.Me.CurrentBoard.Redraw(); NoxicoGame.Me.CurrentBoard.Draw(true); NoxicoGame.Mode = UserMode.Walkabout; Subscreens.FirstDraw = true; } //else if (NoxicoGame.IsKeyDown(KeyBinding.Drop)) //{ // TryDrop(player, inventoryTokens[itemList.Index], inventoryItems[itemList.Index]); //} else { UIManager.CheckKeys(); sigilView.Draw(); } }
/// <summary> /// Generic Subscreen handler. /// </summary> public static void Handler() { var keys = NoxicoGame.KeyMap; var player = NoxicoGame.Me.Player; var width = (Program.Cols / 2) - 2; if (Subscreens.FirstDraw) { UIManager.Initialize(); UIManager.Elements.Clear(); //Prepare the left item list and its UIElements... var height = 1; containerTokens.Clear(); containerItems.Clear(); containerList = null; var containerTexts = new List <string>(); containerWindow = new UIWindow(title) { Left = 1, Top = 1, Width = width, Height = 2 + height }; containerList = new UIList(string.Empty, null, containerTexts) { Width = width - 2, Height = height, Index = indexLeft, Background = UIColors.WindowBackground }; containerList.Move(1, 1, containerWindow); UIManager.Elements.Add(containerWindow); var emptyMessage = mode == ContainerMode.Vendor ? i18n.Format("inventory_x_hasnothing", vendorChar.Name.ToString()) : mode == ContainerMode.Corpse ? i18n.GetString("inventory_nothingleft") : i18n.GetString("inventory_empty"); var emptyMessageC = new UILabel(emptyMessage) { Width = width - 3, Height = 1 }; emptyMessageC.Move(2, 1, containerWindow); UIManager.Elements.Add(emptyMessageC); UIManager.Elements.Add(containerList); if (other.Tokens.Count == 0) { containerList.Hidden = true; containerWindow.Height = 3; } else { //Populate the left list... foreach (var carriedItem in other.Tokens) { //Only let vendors sell things meant for sale, not their literal shirt off their back if (vendorChar != null && !carriedItem.HasToken("for_sale")) { continue; } var find = NoxicoGame.KnownItems.Find(x => x.ID == carriedItem.Name); if (find == null) { continue; } containerTokens.Add(carriedItem); containerItems.Add(find); var item = find; var itemString = item.ToString(carriedItem, false, false); if (itemString.Length > width - 5) { itemString = itemString.Disemvowel(); } itemString = itemString.PadEffective(width - 5); //Add any extra sigils. if (mode == ContainerMode.Vendor && carriedItem.HasToken("equipped")) { itemString = itemString.Remove(width - 6) + i18n.GetString("sigil_short_worn"); } if (carriedItem.Path("cursed/known") != null) { itemString = itemString.Remove(width - 6) + "C"; //DO NOT TRANSLATE -- Curses will be replaced with better terms and variants such as "Slippery" or "Sticky". } containerTexts.Add(itemString); } height = containerItems.Count; if (height > Program.Rows - 15) { height = Program.Rows - 15; } if (indexLeft >= containerItems.Count) { indexLeft = containerItems.Count - 1; } containerList.Items.Clear(); containerList.Items.AddRange(containerTexts); containerWindow.Height = 2 + height; containerList.Height = height; } //Prepare the right item list and its UIElements... playerTokens.Clear(); playerItems.Clear(); playerList = null; var playerTexts = new List <string>(); playerWindow = new UIWindow(i18n.GetString("inventory_yours")) { Width = width, Height = 3 }; playerWindow.MoveBeside(2, 0, containerWindow); playerList = new UIList(string.Empty, null, playerTexts) { Width = width - 2, Height = 1, Index = indexRight, Background = UIColors.WindowBackground }; playerList.Move(1, 1, playerWindow); UIManager.Elements.Add(playerWindow); var playerNothing = new UILabel(i18n.GetString("inventory_youhavenothing")) { Left = width + 5, Top = 2, Width = width - 3, Height = 1 }; playerNothing.Move(2, 1, playerWindow); UIManager.Elements.Add(playerNothing); UIManager.Elements.Add(playerList); if (player.Character.GetToken("items").Tokens.Count == 0) { playerList.Hidden = true; playerWindow.Height = 3; } else { //Populate the right list... foreach (var carriedItem in player.Character.GetToken("items").Tokens) { var find = NoxicoGame.KnownItems.Find(x => x.ID == carriedItem.Name); if (find == null) { continue; } playerTokens.Add(carriedItem); playerItems.Add(find); var item = find; var itemString = item.ToString(carriedItem, false, false); if (itemString.Length > width - 5) { itemString = itemString.Disemvowel(); } itemString = itemString.PadEffective(width - 5); if (carriedItem.HasToken("equipped")) { itemString = itemString.Remove(width - 6) + i18n.GetString("sigil_short_worn"); } if (carriedItem.Path("cursed/known") != null) { itemString = itemString.Remove(width - 6) + "C"; //DO NOT TRANSLATE -- Curses will be replaced with better terms and variants such as "Slippery" or "Sticky". } playerTexts.Add(itemString); } var height2 = playerItems.Count; if (height2 == 0) { height2 = 1; } if (height2 > Program.Rows - 15) { height2 = Program.Rows - 15; } if (indexRight >= playerItems.Count) { indexRight = playerItems.Count - 1; } if (height2 > height) { height = height2; } playerList.Items.Clear(); playerList.Items.AddRange(playerTexts); playerWindow.Height = 2 + height2; playerList.Height = height2; } //Build the bottom window. UIManager.Elements.Add(new UILabel(new string(' ', Program.Cols)) { Left = 0, Top = 0, Width = Program.Cols - 1, Height = 1, Background = UIColors.StatusBackground, Foreground = UIColors.StatusForeground }); UIManager.Elements.Add(new UILabel(i18n.GetString(mode == ContainerMode.Vendor ? "inventory_pressenter_vendor" : "inventory_pressenter_container")) { Left = 0, Top = 0, Width = Program.Cols - 1, Height = 1, Background = UIColors.StatusBackground, Foreground = UIColors.StatusForeground }); descriptionWindow = new UIWindow(string.Empty) { Left = 2, Top = Program.Rows - 10, Width = Program.Cols - 4, Height = 8, Title = UIColors.RegularText }; description = new UILabel(string.Empty) { Width = Program.Cols - 8, Height = 5 }; description.Move(2, 1, descriptionWindow); capacity = new UILabel(string.Format("{0:F2}/{1:F2}", player.Character.Carried, player.Character.Capacity)); capacity.MoveBelow(4, -1, descriptionWindow); UIManager.Elements.Add(descriptionWindow); UIManager.Elements.Add(description); UIManager.Elements.Add(capacity); //Should we be trading, replace the weight with a money indication. if (mode == ContainerMode.Vendor) { capacity.Text = i18n.Format("inventory_money", vendorChar.Name.ToString(), vendorChar.GetToken("money").Value, player.Character.GetToken("money").Value); } //FIXME: why is this check a thing? if (containerList != null) { containerList.Change = (s, e) => { if (containerList.Items.Count == 0) { return; } indexLeft = containerList.Index; //Build up the content for the description window. var t = containerTokens[containerList.Index]; var i = containerItems[containerList.Index]; descriptionWindow.Text = i.ToString(t, false, false); var desc = i.GetDescription(t); price = 0; //Reset price no matter the mode so we don't accidentally pay for free shit. if (mode == ContainerMode.Vendor && i.HasToken("price")) { price = i.GetToken("price").Value; desc += "\n" + i18n.Format("inventory_itcosts", price); } if (mode == ContainerMode.Vendor && i.HasToken("equipable") && t.HasToken("equipped")) { desc += "\n" + i18n.Format("inventory_vendorusesthis", vendorChar.Name.ToString()); } description.Text = Toolkit.Wordwrap(desc.SmartQuote(), description.Width); descriptionWindow.Draw(); description.Draw(); capacity.Draw(); }; containerList.Enter = (s, e) => { if (containerList.Items.Count == 0) { return; } //onLeft = true; var tryAttempt = TryRetrieve(player, containerTokens[containerList.Index], containerItems[containerList.Index]); if (tryAttempt.IsBlank()) { //No errors were returned by TryRetrieve, so let's do this. playerItems.Add(containerItems[containerList.Index]); playerTokens.Add(containerTokens[containerList.Index]); playerList.Items.Add(containerList.Items[containerList.Index]); containerItems.RemoveAt(containerList.Index); containerTokens.RemoveAt(containerList.Index); containerList.Items.RemoveAt(containerList.Index); //If this was the bottom-most item, adjust our selection. if (containerList.Index >= containerList.Items.Count) { containerList.Index--; } //If this was the last item, hide the list entirely and switch to the player's side. //We know that's possible -- after all, there must be at -least- one item in there now. if (containerList.Items.Count == 0) { containerList.Hidden = true; keys[NoxicoGame.KeyBindings[KeyBinding.Right]] = true; } else { containerList.Height = (containerList.Items.Count < 10) ? containerList.Items.Count : 10; } playerList.Hidden = false; //always the case. playerList.Height = (playerList.Items.Count < 10) ? playerList.Items.Count : 10; containerWindow.Height = containerList.Height + 2; playerWindow.Height = playerList.Height + 2; capacity.Text = player.Character.Carried + "/" + player.Character.Capacity; if (mode == ContainerMode.Vendor) { capacity.Text = i18n.Format("inventory_money", vendorChar.Name.ToString(), vendorChar.GetToken("money").Value, player.Character.GetToken("money").Value); } containerList.Change(s, e); NoxicoGame.DrawStatus(); UIManager.Draw(); } else { //There was some error returned by TryRetrieve, which we'll show now. MessageBox.Notice(tryAttempt); } }; } //FIXME: same with this check. if (playerList != null) { //We do basically the same thing as above in reverse. playerList.Change = (s, e) => { if (playerList.Items.Count == 0) { return; } indexRight = playerList.Index; var t = playerTokens[playerList.Index]; var i = playerItems[playerList.Index]; descriptionWindow.Text = i.ToString(t, false, false); var desc = i.GetDescription(t); price = 0; if (mode == ContainerMode.Vendor && i.HasToken("price")) { price = i.GetToken("price").Value; desc += "\n" + i18n.Format("inventory_itcosts", price); } //This is one of the few differences. if (t.Path("cursed/path") != null) { desc += "\nThis item is cursed and can't be removed."; //DO NOT TRANSLATE -- Curses will be replaced with better terms and variants such as "Slippery" or "Sticky". } else if (i.HasToken("equipable") && t.HasToken("equipped")) { desc += "\n" + i18n.GetString("inventory_youusethis"); } description.Text = Toolkit.Wordwrap(desc.SmartQuote(), description.Width); descriptionWindow.Draw(); description.Draw(); capacity.Draw(); }; playerList.Enter = (s, e) => { if (playerList.Items.Count == 0) { return; } //onLeft = false; var tryAttempt = TryStore(player, playerTokens[playerList.Index], playerItems[playerList.Index]); if (tryAttempt.IsBlank()) { containerItems.Add(playerItems[playerList.Index]); containerTokens.Add(playerTokens[playerList.Index]); containerList.Items.Add(playerList.Items[playerList.Index]); playerItems.RemoveAt(playerList.Index); playerTokens.RemoveAt(playerList.Index); playerList.Items.RemoveAt(playerList.Index); if (playerList.Index >= playerList.Items.Count) { playerList.Index--; } if (playerList.Items.Count == 0) { playerList.Hidden = true; keys[NoxicoGame.KeyBindings[KeyBinding.Left]] = true; } else { playerList.Height = (playerList.Items.Count < 10) ? playerList.Items.Count : 10; } containerList.Hidden = false; //always the case. containerList.Height = (containerList.Items.Count < 10) ? containerList.Items.Count : 10; containerWindow.Height = containerList.Height + 2; playerWindow.Height = playerList.Height + 2; capacity.Text = player.Character.Carried + "/" + player.Character.Capacity; if (mode == ContainerMode.Vendor) { capacity.Text = i18n.Format("inventory_money", vendorChar.Name.ToString(), vendorChar.GetToken("money").Value, player.Character.GetToken("money").Value); } playerList.Change(s, e); NoxicoGame.DrawStatus(); UIManager.Draw(); } else { //This is set by TryStore. if (vendorCaughtYou) { //Immediately break out of ContainerMan and call out. NoxicoGame.ClearKeys(); NoxicoGame.Immediate = true; NoxicoGame.Me.CurrentBoard.Redraw(); NoxicoGame.Me.CurrentBoard.Draw(true); NoxicoGame.Mode = UserMode.Walkabout; Subscreens.FirstDraw = true; SceneSystem.Engage(player.Character, vendorChar, "(criminalscum)"); } else { MessageBox.Notice(tryAttempt); } } }; } UIManager.Highlight = containerList.Items.Count > 0 ? containerList : playerList; UIManager.Draw(); if (UIManager.Highlight.Change != null) { UIManager.Highlight.Change(null, null); } Subscreens.FirstDraw = false; } if (NoxicoGame.IsKeyDown(KeyBinding.Back) || Vista.Triggers == XInputButtons.B) { NoxicoGame.ClearKeys(); NoxicoGame.Immediate = true; NoxicoGame.Me.CurrentBoard.Redraw(); NoxicoGame.Me.CurrentBoard.Draw(true); NoxicoGame.Mode = UserMode.Walkabout; Subscreens.FirstDraw = true; } else if (NoxicoGame.IsKeyDown(KeyBinding.Left)) { NoxicoGame.ClearKeys(); if (containerList.Items.Count == 0) { return; } UIManager.Highlight = containerList ?? playerList; containerList.DrawQuick(); containerList.Change(null, null); playerList.DrawQuick(); } else if (NoxicoGame.IsKeyDown(KeyBinding.Right)) { NoxicoGame.ClearKeys(); if (playerList.Items.Count == 0) { return; } UIManager.Highlight = playerList ?? containerList; playerList.Change(null, null); containerList.DrawQuick(); playerList.DrawQuick(); } else { UIManager.CheckKeys(); } }
public void Use(Character character, Token item, bool noConfirm = false) { var boardchar = NoxicoGame.Me.CurrentBoard.Entities.OfType <BoardChar>().First(x => x.Character == character); var runningDesc = string.Empty; Action <string> showDesc = new Action <string>(d => { NoxicoGame.DrawStatus(); if (d.Contains('\n')) { MessageBox.Notice(runningDesc.Viewpoint(boardchar.Character, null)); } else { NoxicoGame.AddMessage(runningDesc.Viewpoint(boardchar.Character, null)); } }); #region Books if (this.ID == "book") { TextScroller.ReadBook(item.GetToken("id").Text); return; } #endregion #region Equipment if (this.HasToken("equipable")) { if (item == null) { var items = character.GetToken("items"); item = items.Tokens.Find(x => x.Name == this.ID); } if (!item.HasToken("equipped")) { //TODO: only ask if it's the player? //Not wearing it MessageBox.Ask(runningDesc + i18n.Format("inventory_equip_x", this.ToString(item, true)), () => { try { if (this.Equip(character, item)) { runningDesc += i18n.Format("x_equiped_y", this.ToString(item, true)); } } catch (ItemException c) { runningDesc += c.Message; } if (!runningDesc.IsBlank()) { showDesc(runningDesc.Viewpoint(boardchar.Character)); } return; }, null); } else { //Wearing/wielding it if (item.HasToken("cursed") && item.GetToken("cursed").HasToken("known")) { runningDesc += item.GetToken("cursed").Text.IsBlank(i18n.Format("inventory_cursed_" + (this.HasToken("plural") ? "plural" : "singular"), this.ToString(item, true)), item.GetToken("cursed").Text); showDesc(runningDesc.Viewpoint(boardchar.Character)); return; } MessageBox.Ask(i18n.Format("inventory_unequip_x", this.ToString(item, true)), () => { try { if (this.Unequip(character)) { runningDesc += i18n.Format("x_unequiped_y", this.ToString(item, true)); } } catch (ItemException x) { runningDesc += x.Message; } if (!runningDesc.IsBlank()) { showDesc(runningDesc.Viewpoint(boardchar.Character)); } return; }, null); } return; } #endregion if (this.HasToken("ammo")) { MessageBox.Notice(i18n.GetString("thisisammo")); return; } if (this.HasToken("quest") || this.HasToken("nouse")) { if (this.HasToken("description")) { runningDesc = this.GetToken("description").Text + "\n\n"; } showDesc(runningDesc + i18n.GetString("noeffect")); return; } //Confirm use of potentially hazardous items if (!noConfirm) { var name = new StringBuilder(); if (this.IsProperNamed) { name.Append(this.Definite.IsBlank(string.Empty, this.Definite + ' ')); } else { name.Append(this.Indefinite.IsBlank(string.Empty, this.Indefinite + ' ')); } name.Append(this.Name); if (item.HasToken("unidentified") && !this.UnknownName.IsBlank()) { runningDesc = i18n.GetString("unidentified_warning"); } else { if (this.HasToken("description")) { //No need to check for "worn" or "examined" here... runningDesc = this.GetDescription(item) + "\n\n"; //this.GetToken("description").Text + "\n\n"; } runningDesc += i18n.Format("use_x_confirm", this.ToString(item, true)); } MessageBox.Ask(runningDesc, () => { this.Use(character, item, true); }, null); return; } var statBonus = this.GetToken("statbonus"); if (statBonus != null) { foreach (var bonus in statBonus.Tokens) { if (bonus.Name == "health") { character.Health += bonus.Value; if (character.Health > character.MaximumHealth) { character.Health = character.MaximumHealth; } } } } var food = this.GetToken("food"); if (food != null) { Eat(character, food); } if (!this.OnUse.IsBlank()) { RunScript(item, this.OnUse, character, boardchar, (x => runningDesc += x)); } else { this.Consume(character, item); } if (!runningDesc.IsBlank()) { showDesc(runningDesc.Viewpoint(boardchar.Character)); } }