/// <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(); } }
/// <summary> /// Sets up a Crafting subscreen for the given Character, usually the Player. /// </summary> /// <param name="carrier"></param> public static void Open(Character carrier) { Carrier = carrier; NoxicoGame.Subscreen = Handler; NoxicoGame.Mode = UserMode.Subscreen; Subscreens.FirstDraw = true; NoxicoGame.ClearKeys(); }
/// <summary> /// Generic Subscreen handler. /// </summary> public static void TitleHandler() { var host = NoxicoGame.HostForm; if (Subscreens.FirstDraw) { Subscreens.FirstDraw = false; host.Clear(); var xScale = Program.Cols / 80f; var yScale = Program.Rows / 25f; var background = new Bitmap(Program.Cols, Program.Rows * 2, System.Drawing.Imaging.PixelFormat.Format24bppRgb); var logo = Mix.GetBitmap("logo.png"); var titleOptions = Mix.GetFilesWithPattern("titles\\*.png"); var chosen = Mix.GetBitmap(titleOptions.PickOne()); //Given our random backdrop and fixed logo, draw them both onto background //because we can't -just- display alpha-blended PNGs. using (var gfx = Graphics.FromImage(background)) { gfx.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; gfx.Clear(Color.Black); gfx.DrawImage(chosen, 0, 0, Program.Cols, Program.Rows * 2); gfx.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; gfx.DrawImage(logo, 0, 0, logo.Width * xScale, logo.Height * yScale); } UIManager.Initialize(); titleBack = new UIPNGBackground(background); var subtitleLeft = (int)(10 * xScale); var subtitleTop = (int)((logo.Height * yScale) / 2) + 1; var subtitle = i18n.GetString("ts_subtitle"); var pressEnter = "\xC4\xC4\xC4\xC4\xB4 " + i18n.GetString("ts_pressentertobegin") + " <cGray>\xC3\xC4\xC4\xC4\xC4"; titleCaption = new UILabel(subtitle) { Top = subtitleTop, Left = subtitleLeft + 2, Foreground = Color.Teal, Darken = true }; titlePressEnter = new UILabel(pressEnter) { Top = subtitleTop + 2, Left = subtitleLeft, Foreground = Color.Gray, Darken = true }; UIManager.Elements.Add(titleBack); UIManager.Elements.Add(titleCaption); UIManager.Elements.Add(titlePressEnter); //UIManager.Elements.Add(new UILabel("\u015c") { Top = 6, Left = 50, Foreground = Color.Gray }); UIManager.Draw(); Options.FromTitle = true; } if (NoxicoGame.IsKeyDown(KeyBinding.Accept) || Subscreens.Mouse || Vista.Triggers != 0) { if (Subscreens.Mouse) { Subscreens.UsingMouse = true; } Subscreens.Mouse = false; Subscreens.FirstDraw = true; var rawSaves = Directory.GetDirectories(NoxicoGame.SavePath); var saves = new List <string>(); //Check each possible save's version. foreach (var s in rawSaves) { var verCheck = Path.Combine(s, "version"); if (!File.Exists(verCheck)) { continue; } var version = int.Parse(File.ReadAllText(verCheck)); if (version < 20) { continue; } if (File.Exists(Path.Combine(s, "global.bin"))) { saves.Add(s); } } NoxicoGame.ClearKeys(); Subscreens.Mouse = false; //Linq up a set of options for each save game. This returns the game's names as the keys. var options = saves.ToDictionary(new Func <string, object>(s => Path.GetFileName(s)), new Func <string, string>(s => { string p; var playerFile = Path.Combine(s, "player.bin"); if (File.Exists(playerFile)) { using (var f = new BinaryReader(File.OpenRead(playerFile))) { p = Player.LoadFromFile(f).Character.Name.ToString(true); } return(i18n.Format("ts_loadgame", p, Path.GetFileName(s))); } return(i18n.Format("ts_startoverinx", Path.GetFileName(s))); })); options.Add("~", i18n.GetString("ts_startnewgame")); options.Add("~~", i18n.GetString("ts_testingarena")); options.Add("~~~", i18n.GetString("ts_options")); //Display our list of saves. MessageBox.List(saves.Count == 0 ? i18n.GetString("ts_welcometonoxico") : i18n.GetString(saves.Count == 1 ? "ts_thereisasave" : "ts_therearesaves"), options, () => { if ((string)MessageBox.Answer == "~") { //Restore our title screen backdrop, since the MessageBox subscreen purged it. UIManager.Elements.Add(titleBack); UIManager.Elements.Add(titleCaption); UIManager.Elements.Add(titlePressEnter); UIManager.Draw(); MessageBox.Input("What name would you like for your new world?", NoxicoGame.RollWorldName(), () => { NoxicoGame.WorldName = (string)MessageBox.Answer; NoxicoGame.Mode = UserMode.Subscreen; NoxicoGame.Subscreen = Introduction.CharacterCreator; NoxicoGame.Immediate = true; } ); } else if ((string)MessageBox.Answer == "~~") { NoxicoGame.WorldName = "<Testing Arena>"; var env = Lua.Environment; Lua.RunFile("testarena.lua"); var testBoard = new Board(env.TestArena.ArenaWidth, env.TestArena.ArenaHeight); var me = NoxicoGame.Me; me.Boards.Add(testBoard); me.CurrentBoard = testBoard; me.CreatePlayerCharacter(env.TestArena.Name, env.TestArena.BioGender, env.TestArena.IdentifyAs, env.TestArena.Preference, env.TestArena.Bodyplan, new Dictionary <string, string>(), env.TestArena.BonusTrait); env.BuildTestArena(testBoard); me.Player.ParentBoard = testBoard; testBoard.EntitiesToAdd.Add(me.Player); NoxicoGame.InGameTime = new DateTime(740 + Random.Next(0, 20), 6, 26, 12, 0, 0); testBoard.UpdateLightmap(null, true); testBoard.AimCamera(); testBoard.Redraw(); testBoard.Draw(); Options.FromTitle = false; Subscreens.FirstDraw = true; NoxicoGame.Immediate = true; NoxicoGame.AddMessage(i18n.GetString("welcometest"), Color.Yellow); NoxicoGame.AddMessage(i18n.GetString("rememberhelp")); NoxicoGame.Mode = UserMode.Walkabout; } else if ((string)MessageBox.Answer == "~~~") { Options.FromTitle = true; //Restore our title screen backdrop, since the MessageBox subscreen purged it. UIManager.Initialize(); UIManager.Elements.Add(titleBack); UIManager.Elements.Add(titleCaption); UIManager.Elements.Add(titlePressEnter); Options.Open(); } else { Options.FromTitle = false; NoxicoGame.WorldName = (string)MessageBox.Answer; host.Noxico.LoadGame(); NoxicoGame.Me.CurrentBoard.Draw(); Subscreens.FirstDraw = true; NoxicoGame.Immediate = true; NoxicoGame.AddMessage(i18n.GetString("welcomeback"), Color.Yellow); NoxicoGame.AddMessage(i18n.GetString("rememberhelp")); //TextScroller.LookAt(NoxicoGame.Me.Player); NoxicoGame.Mode = UserMode.Walkabout; } } ); } }
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(); } }
public override void Update() { base.Update(); NoxicoGame.ContextMessage = i18n.GetString("context_interactmode"); if (this.ParentBoard == null) { NoxicoGame.Mode = UserMode.Walkabout; return; } //this.ParentBoard.Draw(true); if (NoxicoGame.IsKeyDown(KeyBinding.Interact) || NoxicoGame.IsKeyDown(KeyBinding.Back) || Vista.Triggers == XInputButtons.B) { NoxicoGame.Mode = UserMode.Walkabout; NoxicoGame.ClearKeys(); NoxicoGame.ContextMessage = string.Empty; Hide(); return; } if (NoxicoGame.IsKeyDown(KeyBinding.TabFocus) || Vista.Triggers == XInputButtons.RightShoulder) { NoxicoGame.ClearKeys(); Tabstop++; if (Tabstop >= Tabstops.Count) { Tabstop = 0; } XPosition = Tabstops[Tabstop].X; YPosition = Tabstops[Tabstop].Y; Point(); } if (NoxicoGame.IsKeyDown(KeyBinding.Accept) || Vista.Triggers == XInputButtons.A) { Subscreens.PreviousScreen.Clear(); NoxicoGame.ClearKeys(); var player = NoxicoGame.Me.Player; #if DEBUG if (PointingAt == null) { ActionList.Show("Debug?", this.XPosition - NoxicoGame.CameraX, this.YPosition - NoxicoGame.CameraY, new Dictionary <object, string>() { { "teleport", "Teleport" }, { "spawn", "Spawn character" }, }, () => { Hide(); if (ActionList.Answer is int && (int)ActionList.Answer == -1) { NoxicoGame.Mode = UserMode.Walkabout; Hide(); return; } switch (ActionList.Answer as string) { case "teleport": player.XPosition = this.XPosition; player.YPosition = this.YPosition; ParentBoard.AimCamera(); ParentBoard.Redraw(); NoxicoGame.Mode = UserMode.Aiming; Point(); return; case "spawn": var spawnOptions = new Dictionary <object, string>(); foreach (var bp in Character.Bodyplans) { spawnOptions[bp.Text] = bp.Text; } var uniques = Mix.GetTokenTree("uniques.tml", true); foreach (var bp in uniques) { spawnOptions['!' + bp.Text] = bp.Text; } ActionList.Show("Debug?", this.XPosition - NoxicoGame.CameraX, this.YPosition - NoxicoGame.CameraY, spawnOptions, () => { if (ActionList.Answer is int && (int)ActionList.Answer == -1) { NoxicoGame.Mode = UserMode.Aiming; Point(); return; } Character newChar = null; if (ActionList.Answer is string && ((string)ActionList.Answer).StartsWith('!')) { newChar = Character.GetUnique(((string)ActionList.Answer).Substring(1)); } else { newChar = Character.Generate((string)ActionList.Answer, Gender.RollDice); } var newBoardChar = new BoardChar(newChar) { XPosition = this.XPosition, YPosition = this.YPosition, ParentBoard = this.ParentBoard }; newBoardChar.AdjustView(); ParentBoard.EntitiesToAdd.Add(newBoardChar); ParentBoard.Redraw(); NoxicoGame.Mode = UserMode.Walkabout; Hide(); return; } ); break; } } ); } #endif if (PointingAt != null) { LastTarget = PointingAt; var distance = player.DistanceFrom(PointingAt); var canSee = player.CanSee(PointingAt); var options = new Dictionary <object, string>(); var description = "something"; options["look"] = i18n.GetString("action_lookatit"); if (PointingAt is Player) { description = i18n.Format("action_descyou", player.Character.Name); options["look"] = i18n.GetString("action_lookatyou"); if (player.Character.GetStat("excitement") >= 30) { options["f**k"] = i18n.GetString("action_masturbate"); } if (player.Character.HasToken("copier") && player.Character.GetToken("copier").Value == 1) { if (player.Character.Path("copier/backup") != null || player.Character.Path("copier/full") == null) { options["revert"] = i18n.GetString("action_revert"); } } } else if (PointingAt is DroppedItem) { var drop = PointingAt as DroppedItem; var item = drop.Item; var token = drop.Token; description = item.ToString(token); if (distance <= 1) { options["take"] = i18n.GetString("action_pickup"); } } else if (PointingAt is Container) { var container = PointingAt as Container; description = container.Name ?? "container"; } else if (PointingAt is Clutter) { var clutter = PointingAt as Clutter; description = clutter.Name ?? "something"; if (clutter.ID == "craftstation") { options["craft"] = i18n.GetString("action_craft"); } } else if (PointingAt is BoardChar) { var boardChar = PointingAt as BoardChar; description = boardChar.Character.GetKnownName(true); options["look"] = i18n.Format("action_lookathim", boardChar.Character.HimHerIt(true)); if (canSee && distance <= 2 && !boardChar.Character.HasToken("beast") && !boardChar.Character.HasToken("sleeping")) { options["talk"] = i18n.Format("action_talktohim", boardChar.Character.HimHerIt(true)); if (boardChar.Character.Path("role/vendor") != null && boardChar.Character.Path("role/vendor/class").Text != "carpenter") { options["trade"] = i18n.Format("action_trade", boardChar.Character.HimHerIt(true)); } } if (canSee && player.Character.GetStat("excitement") >= 30 && distance <= 1) { var mayFuck = boardChar.Character.HasToken("willing"); var willRape = boardChar.Character.HasToken("helpless"); if (!IniFile.GetValue("misc", "allowrape", false) && willRape) { mayFuck = false; } //but DO allow it if they're helpless but willing if (boardChar.Character.HasToken("willing") && willRape) { mayFuck = true; willRape = false; } if (boardChar.Character.HasToken("beast")) { mayFuck = false; } if (mayFuck) { options["f**k"] = i18n.Format(willRape ? "action_rapehim" : "action_fuckhim", boardChar.Character.HimHerIt(true)); } } if (canSee && !boardChar.Character.HasToken("beast") && player.Character.HasToken("copier") && player.Character.Path("copier/timeout") == null) { //if (player.Character.UpdateCopier()) if (player.Character.HasToken("fullCopy") || player.Character.HasToken("sexCopy")) { options["copy"] = i18n.Format("action_copyhim", boardChar.Character.HimHerIt(true)); } } if (canSee && player.Character.CanShoot() != null && player.ParentBoard.HasToken("combat")) { options["shoot"] = i18n.Format("action_shoothim", boardChar.Character.HimHerIt(true)); } } #if DEBUG if (PointingAt is BoardChar) { options["mutate"] = "(debug) Random mutate"; } if (PointingAt is BoardChar) { options["turbomutate"] = "(debug) Apply LOTS of mutations!"; } #endif ActionList.Show(description, PointingAt.XPosition - NoxicoGame.CameraX, PointingAt.YPosition - NoxicoGame.CameraY, options, () => { Hide(); if (ActionList.Answer is int && (int)ActionList.Answer == -1) { //NoxicoGame.Messages.Add("[Aim message]"); NoxicoGame.Mode = UserMode.Aiming; Point(); return; } switch (ActionList.Answer as string) { case "look": if (PointingAt is DroppedItem) { var drop = PointingAt as DroppedItem; var item = drop.Item; var token = drop.Token; var text = (item.HasToken("description") && !token.HasToken("unidentified") ? item.GetToken("description").Text : i18n.Format("thisis_x", item.ToString(token))).Trim(); MessageBox.Notice(text, true); } else if (PointingAt is Clutter && !((Clutter)PointingAt).Description.IsBlank()) { MessageBox.Notice(((Clutter)PointingAt).Description.Trim(), true, ((Clutter)PointingAt).Name ?? "something"); } else if (PointingAt is Container) { MessageBox.Notice(((Container)PointingAt).Description.Trim(), true, ((Container)PointingAt).Name ?? "container"); } else if (PointingAt is BoardChar) { if (((BoardChar)PointingAt).Character.HasToken("beast")) { MessageBox.Notice(((BoardChar)PointingAt).Character.LookAt(PointingAt), true, ((BoardChar)PointingAt).Character.GetKnownName(true)); } else { TextScroller.LookAt((BoardChar)PointingAt); } } break; case "talk": if (PointingAt is Player) { //if (Culture.CheckSummoningDay()) return; if (player.Character.Path("mind").Value >= 10) { MessageBox.Notice(i18n.GetString("talkingotyourself"), true); } else { MessageBox.Notice(i18n.GetString("talkingtoyourself_nutso"), true); } } else if (PointingAt is BoardChar) { var boardChar = PointingAt as BoardChar; if (boardChar.Character.HasToken("hostile") && !boardChar.Character.HasToken("helpless")) { MessageBox.Notice(i18n.Format("nothingtosay", boardChar.Character.GetKnownName(false, false, true, true)), true); } else { SceneSystem.Engage(player.Character, boardChar.Character); } } break; case "trade": ContainerMan.Setup(((BoardChar)PointingAt).Character); break; case "f**k": if (PointingAt is BoardChar) { SexManager.Engage(player.Character, ((BoardChar)PointingAt).Character); } break; case "shoot": player.AimShot(PointingAt); break; case "copy": player.Character.Copy(((BoardChar)PointingAt).Character); player.AdjustView(); //NoxicoGame.AddMessage(i18n.Format((player.Character.Path("copier/full") == null) ? "youimitate_x" : "become_x", ((BoardChar)PointingAt).Character.GetKnownName(false, false, true))); NoxicoGame.AddMessage(i18n.Format(player.Character.HasToken("fullCopy") ? "x_becomes_y" : "x_imitates_y").Viewpoint(player.Character, ((BoardChar)PointingAt).Character)); player.Energy -= 2000; break; case "revert": player.Character.Copy(null); player.AdjustView(); NoxicoGame.AddMessage(i18n.GetString((player.Character.HasToken("fullCopy")) ? "youmelt" : "yourevert")); player.Energy -= 1000; break; case "take": if (PointingAt is DroppedItem) { var drop = PointingAt as DroppedItem; var item = drop.Item; var token = drop.Token; drop.Take(player.Character, ParentBoard); player.Energy -= 1000; NoxicoGame.AddMessage(i18n.Format("youpickup_x", item.ToString(token, true)), drop.ForegroundColor); NoxicoGame.Sound.PlaySound("set://GetItem"); ParentBoard.Redraw(); } break; case "craft": Crafting.Open(player.Character); break; #if DEBUG case "edit": TokenCarrier tc = null; if (PointingAt is DroppedItem) { tc = ((DroppedItem)PointingAt).Token; } else if (PointingAt is BoardChar) { tc = ((BoardChar)PointingAt).Character; } NoxicoGame.HostForm.Write("TOKEN EDIT ENGAGED. Waiting for editor process to exit.", Color.Black, Color.White, 0, 0); NoxicoGame.HostForm.Draw(); ((MainForm)NoxicoGame.HostForm).timer.Enabled = false; var dump = "-- WARNING! Many things may cause strange behavior or crashes. WATCH YOUR F*****G STEP.\r\n" + tc.DumpTokens(tc.Tokens, 0); var temp = Path.Combine(Path.GetTempPath(), DateTime.Now.Ticks.ToString() + ".txt"); File.WriteAllText(temp, dump); var process = System.Diagnostics.Process.Start(temp); process.WaitForExit(); var newDump = File.ReadAllText(temp); File.Delete(temp); ((MainForm)NoxicoGame.HostForm).timer.Enabled = true; ParentBoard.Redraw(); if (newDump == dump) { break; } tc.Tokenize(newDump); ((BoardChar)PointingAt).AdjustView(); ((BoardChar)PointingAt).Character.RecalculateStatBonuses(); ((BoardChar)PointingAt).Character.CheckHasteSlow(); break; case "mutate": var result = ((BoardChar)PointingAt).Character.Mutate(1, 30); NoxicoGame.AddMessage(result); break; case "turbomutate": result = ((BoardChar)PointingAt).Character.Mutate(2500, 30); NoxicoGame.AddMessage(result); break; #endif default: MessageBox.Notice("Unknown action handler \"" + ActionList.Answer.ToString() + "\".", true); break; } } ); // true, true); return; } else { /* * var tSD = this.ParentBoard.GetDescription(YPosition, XPosition); * if (!string.IsNullOrWhiteSpace(tSD)) * { * PointingAt = null; * MessageBox.ScriptPauseHandler = () => * { * NoxicoGame.Mode = UserMode.Aiming; * Point(); * }; * MessageBox.Notice(tSD, true); * return; * } */ } } #if DEBUG if (NoxicoGame.KeyMap[Keys.D]) { NoxicoGame.ClearKeys(); if (PointingAt != null && PointingAt is BoardChar) { ((BoardChar)PointingAt).Character.CreateInfoDump(); NoxicoGame.AddMessage("Info for " + ((BoardChar)PointingAt).Character.GetKnownName(true, true, true) + " dumped.", Color.Red); } } #endif if (NoxicoGame.IsKeyDown(KeyBinding.Left) || Vista.DPad == XInputButtons.Left) { this.Move(Direction.West); } else if (NoxicoGame.IsKeyDown(KeyBinding.Right) || Vista.DPad == XInputButtons.Right) { this.Move(Direction.East); } else if (NoxicoGame.IsKeyDown(KeyBinding.Up) || Vista.DPad == XInputButtons.Up) { this.Move(Direction.North); } else if (NoxicoGame.IsKeyDown(KeyBinding.Down) || Vista.DPad == XInputButtons.Down) { this.Move(Direction.South); } }
public static void Handler() { if (Subscreens.FirstDraw) { Subscreens.FirstDraw = false; if (!FromTitle) { UIManager.Initialize(); UIManager.Elements.Clear(); } else { //Leave the title screen background UIManager.Highlight = UIManager.Elements[0]; UIManager.Elements.RemoveRange(3, UIManager.Elements.Count - 3); } window = new UIWindow(i18n.GetString("opt_title")) { Left = 0, Top = 0, Width = 80, Height = 25, }; window.Center(); var speedLabel = new UILabel(i18n.GetString("opt_speed")); speedLabel.Move(3, 2, window); speed = new UITextBox(IniFile.GetValue("misc", "speed", "15")) { Width = 4, Numeric = true }; speed.Move(1, 1, speedLabel); var fonts = Mix.GetFilesWithPattern("fonts\\*.png").Select(x => System.IO.Path.GetFileNameWithoutExtension(x)).ToArray(); var currentFont = IniFile.GetValue("misc", "font", "8x8-thin"); var currentFontIndex = 0; if (fonts.Contains(currentFont)) { for (currentFontIndex = 0; currentFontIndex < fonts.Length; currentFontIndex++) { if (fonts[currentFontIndex] == currentFont) { break; } } } var fontLabel = new UILabel(i18n.GetString("opt_font")); fontLabel.Move(0, 3, speedLabel); font = new UIList(string.Empty, null, fonts, currentFontIndex) { Width = 20, Height = 8, }; font.Move(1, 1, fontLabel); font.Enter = (s, e) => { var previousFont = font.Text; IniFile.SetValue("misc", "font", font.Text); NoxicoGame.HostForm.RestartGraphics(false); IniFile.SetValue("misc", "font", previousFont); }; font.EnsureVisible(); var screenColsLabel = new UILabel(i18n.GetString("opt_screencols")); screenColsLabel.MoveBelow(-1, 1, font); screenCols = new UITextBox(IniFile.GetValue("misc", "screencols", "80")) { Width = 4, Numeric = true }; screenCols.Move(1, 1, screenColsLabel); var screenRowsLabel = new UILabel(i18n.GetString("opt_screenrows")); screenRowsLabel.Move(-1, 1, screenCols); screenRows = new UITextBox(IniFile.GetValue("misc", "screenrows", "25")) { Width = 4, Numeric = true }; screenRows.Move(1, 1, screenRowsLabel); screenCols.Enter = screenRows.Enter = (s, e) => { var resetGraphics = false; var i = int.Parse(screenCols.Text); if (i < 80) { i = 80; } if (i > 300) { i = 300; } if (i != Program.Cols) { resetGraphics = true; } Program.Cols = i; IniFile.SetValue("misc", "screencols", i); i = int.Parse(screenRows.Text); if (i < 25) { i = 25; } if (i > 100) { i = 100; } if (i != Program.Rows) { resetGraphics = true; } Program.Rows = i; IniFile.SetValue("misc", "screenrows", i); if (resetGraphics) { NoxicoGame.HostForm.RestartGraphics(true); window.Center(); UIManager.ReMove(); } Subscreens.Redraw = true; NoxicoGame.Me.CurrentBoard.AimCamera(); NoxicoGame.Me.CurrentBoard.Redraw(); NoxicoGame.Me.CurrentBoard.Draw(); }; var miscWindow = new UIWindow(i18n.GetString("opt_misc")) { Width = 50, Height = 11, }; miscWindow.MoveBeside(2, 0, speedLabel); rememberPause = new UIToggle(i18n.GetString("opt_rememberpause")) { Checked = IniFile.GetValue("misc", "rememberpause", true), Background = Color.Transparent, }; rememberPause.Move(2, 1, miscWindow); vistaSaves = new UIToggle(i18n.GetString("opt_vistasaves")) { Checked = IniFile.GetValue("misc", "vistasaves", true), Enabled = Vista.IsVista, Background = Color.Transparent, }; vistaSaves.MoveBelow(0, 1, rememberPause); xInput = new UIToggle(i18n.GetString("opt_xinput")) { Checked = IniFile.GetValue("misc", "xinput", true), Enabled = Vista.IsVista, Background = Color.Transparent, }; xInput.MoveBelow(0, 1, vistaSaves); imperial = new UIToggle(i18n.GetString("opt_imperial")) { Checked = IniFile.GetValue("misc", "imperial", false), Background = Color.Transparent, }; imperial.MoveBelow(0, 1, xInput); fourThirtySeven = new UIToggle(i18n.GetString("opt_437")) { Checked = IniFile.GetValue("misc", "437", false), Background = Color.Transparent, }; fourThirtySeven.MoveBelow(0, 1, imperial); var audioWindow = new UIWindow(i18n.GetString("opt_audio")) { Width = 30, Height = 8, }; audioWindow.MoveBelow(0, 1, miscWindow); enableAudio = new UIToggle(i18n.GetString("opt_enableaudio")) { Checked = IniFile.GetValue("audio", "enabled", true), Background = Color.Transparent, }; enableAudio.Move(2, 1, audioWindow); var musicVolumeLabel = new UILabel(i18n.GetString("opt_musicvolume")); musicVolumeLabel.MoveBelow(0, 1, enableAudio); musicVolume = new UITextBox(IniFile.GetValue("audio", "musicvolume", "100")); musicVolume.Move(1, 1, musicVolumeLabel); var soundVolumeLabel = new UILabel(i18n.GetString("opt_soundvolume")); soundVolumeLabel.Move(-1, 1, musicVolume); soundVolume = new UITextBox(IniFile.GetValue("audio", "soundvolume", "100")); soundVolume.Move(1, 1, soundVolumeLabel); saveButton = new UIButton(i18n.GetString("opt_save"), (s, e) => { var i = int.Parse(speed.Text); if (i < 1) { i = 1; } if (i > 200) { i = 200; } IniFile.SetValue("misc", "speed", i); IniFile.SetValue("misc", "font", font.Text); IniFile.SetValue("misc", "rememberpause", rememberPause.Checked); IniFile.SetValue("misc", "vistasaves", vistaSaves.Checked); IniFile.SetValue("misc", "xinput", xInput.Checked); IniFile.SetValue("misc", "imperial", imperial.Checked); IniFile.SetValue("misc", "437", fourThirtySeven.Checked); Vista.GamepadEnabled = xInput.Checked; var resetGraphics = false; i = int.Parse(screenCols.Text); if (i < 80) { i = 80; } if (i > 300) { i = 300; } if (i != Program.Cols) { resetGraphics = true; } Program.Cols = i; IniFile.SetValue("misc", "screencols", i); i = int.Parse(screenRows.Text); if (i < 25) { i = 25; } if (i > 100) { i = 100; } if (i != Program.Rows) { resetGraphics = true; } Program.Rows = i; IniFile.SetValue("misc", "screenrows", i); IniFile.SetValue("misc", "imperial", imperial.Checked); IniFile.SetValue("audio", "enabled", enableAudio.Checked); i = int.Parse(musicVolume.Text); if (i < 0) { i = 0; } if (i > 100) { i = 100; } NoxicoGame.Sound.MusicVolume = i / 100f; IniFile.SetValue("audio", "musicvolume", i); i = int.Parse(soundVolume.Text); if (i < 0) { i = 0; } if (i > 100) { i = 100; } NoxicoGame.Sound.SoundVolume = i / 100f; IniFile.SetValue("audio", "soundvolume", i); if (!enableAudio.Checked && NoxicoGame.Sound != null) { NoxicoGame.Sound.ShutDown(); } else if (enableAudio.Checked && !NoxicoGame.Sound.Enabled) { NoxicoGame.Sound = new SoundSystem(); if (NoxicoGame.Me.CurrentBoard != null) { NoxicoGame.Me.CurrentBoard.PlayMusic(); } } if (resetGraphics) { NoxicoGame.HostForm.RestartGraphics(true); } IniFile.Save(string.Empty); cancelButton.DoEnter(); }) { Width = 16 }; saveButton.MoveBeside(2, 0, audioWindow); keysButton = new UIButton(i18n.GetString("opt_keys"), (s, e) => { Controls.Open(); }) { Width = 16 }; keysButton.MoveBelow(0, 1, saveButton); openButton = new UIButton(i18n.GetString("opt_open"), (s, e) => { System.Diagnostics.Process.Start(NoxicoGame.HostForm.IniPath); }) { Width = 16 }; openButton.MoveBelow(0, 1, keysButton); cancelButton = new UIButton(i18n.GetString("opt_cancel"), (s, e) => { UIManager.Elements.Clear(); NoxicoGame.ClearKeys(); NoxicoGame.Immediate = true; NoxicoGame.Me.CurrentBoard.Redraw(); NoxicoGame.Me.CurrentBoard.Draw(true); NoxicoGame.Mode = UserMode.Walkabout; if (FromTitle) { Introduction.Title(); } Subscreens.FirstDraw = true; }) { Width = 16 }; cancelButton.MoveBelow(0, 1, openButton); UIManager.Elements.Add(window); UIManager.Elements.Add(speedLabel); UIManager.Elements.Add(speed); UIManager.Elements.Add(fontLabel); UIManager.Elements.Add(font); UIManager.Elements.Add(screenColsLabel); UIManager.Elements.Add(screenCols); UIManager.Elements.Add(screenRowsLabel); UIManager.Elements.Add(screenRows); UIManager.Elements.Add(miscWindow); UIManager.Elements.Add(rememberPause); UIManager.Elements.Add(vistaSaves); UIManager.Elements.Add(xInput); UIManager.Elements.Add(imperial); UIManager.Elements.Add(fourThirtySeven); UIManager.Elements.Add(audioWindow); UIManager.Elements.Add(enableAudio); UIManager.Elements.Add(musicVolumeLabel); UIManager.Elements.Add(musicVolume); UIManager.Elements.Add(soundVolumeLabel); UIManager.Elements.Add(soundVolume); UIManager.Elements.Add(saveButton); UIManager.Elements.Add(keysButton); UIManager.Elements.Add(openButton); UIManager.Elements.Add(cancelButton); Subscreens.FirstDraw = false; Subscreens.Redraw = true; } if (Subscreens.Redraw) { Subscreens.Redraw = false; UIManager.Draw(); } if (NoxicoGame.IsKeyDown(KeyBinding.Back) || Vista.Triggers == XInputButtons.B) { cancelButton.DoEnter(); } else { UIManager.CheckKeys(); } }
public static void Handler() { var host = NoxicoGame.HostForm; var keys = NoxicoGame.KeyMap; var left = (Program.Cols / 2) - (72 / 2); if (Subscreens.FirstDraw) { scroll = 1; Subscreens.FirstDraw = false; window = new UIWindow(text[0]) { Left = left, Top = 1, Width = 74, Height = Program.Rows - 3 }; window.Draw(); var help = ' ' + i18n.GetString("textscroller_help") + ' '; host.Write(help, UIColors.WindowBorder, Color.Transparent, Program.Rows - 3, (Program.Cols / 2) - (help.Length() / 2)); var empty = new string(' ', 70); for (int i = 1; i < Program.Rows - 5; i++) { host.Write(empty, UIColors.RegularText, UIColors.WindowBackground, 1 + i, left + 2); } for (int i = scroll; i < text.Length && i - scroll < Program.Rows - 5; i++) { if (i < 1) { continue; } host.Write(' ' + text[i].PadEffective(70), UIColors.RegularText, UIColors.WindowBackground, 1 + i, left + 2); } Subscreens.Redraw = true; } if (Subscreens.Redraw) { NoxicoGame.HostForm.SetCell(2, left + 73, (scroll > 1) ? '\x1E' : '\xBA', (scroll > 1) ? UIColors.RegularText : UIColors.WindowBorder, UIColors.WindowBackground); NoxicoGame.HostForm.SetCell(Program.Rows - 4, left + 73, (scroll + 21 < text.Length) ? '\x1F' : '\xBA', (scroll + 21 < text.Length) ? UIColors.RegularText : UIColors.WindowBorder, UIColors.WindowBackground); Subscreens.Redraw = false; } if (keys[System.Windows.Forms.Keys.S]) { File.WriteAllText("current.txt", string.Join("\n", text).ToUnicode()); File.WriteAllText("current.html", string.Join("\n", text).ToUnicode().ToHtml()); } 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; } if ((NoxicoGame.IsKeyDown(KeyBinding.ScrollUp) || Vista.DPad == XInputButtons.Up) && (DateTime.Now - slow).Milliseconds >= 100) { slow = DateTime.Now; scroll--; if (scroll < 1) { scroll = 1; } else { host.ScrollDown(2, Program.Rows - 4, left + 1, left + 72, UIColors.DarkBackground); var i = scroll; host.Write(new string(' ', 72), UIColors.RegularText, UIColors.WindowBackground, 2, left + 1); host.Write(text[i], UIColors.RegularText, UIColors.WindowBackground, 2, left + 2); Subscreens.Redraw = true; } } if ((NoxicoGame.IsKeyDown(KeyBinding.ScrollDown) || Vista.DPad == XInputButtons.Down) && (DateTime.Now - slow).Milliseconds >= 100) { slow = DateTime.Now; scroll++; if (scroll > text.Length - Program.Rows + 4) { scroll = text.Length - Program.Rows + 4; } else if (scroll < 1) { scroll = 1; } else { host.ScrollUp(2, Program.Rows - 4, left + 1, left + 72, UIColors.DarkBackground); var i = scroll + Program.Rows - 6; host.Write(new string(' ', 72), UIColors.RegularText, UIColors.WindowBackground, Program.Rows - 4, left + 1); if (i < text.Length) { host.Write(text[i], UIColors.RegularText, UIColors.WindowBackground, Program.Rows - 4, left + 2); } Subscreens.Redraw = true; } } }
public override void Update() { //base.Update(); if (NoxicoGame.Mode != UserMode.Walkabout) { return; } //START if (NoxicoGame.IsKeyDown(KeyBinding.Pause) || Vista.Triggers == XInputButtons.Start) { NoxicoGame.ClearKeys(); Pause.Open(); return; } var increase = 200 + (int)Character.GetStat("speed"); if (Character.HasToken("haste")) { increase *= 2; } else if (Character.HasToken("slow")) { increase /= 2; } Energy += increase; if (Energy < 5000) { var wasNight = Toolkit.IsNight(); NoxicoGame.InGameTime = NoxicoGame.InGameTime.AddMilliseconds(increase); if (wasNight && !Toolkit.IsNight()) { ParentBoard.UpdateLightmap(this, true); ParentBoard.Redraw(); } EndTurn(); return; } else { if (!NoxicoGame.PlayerReady) { NoxicoGame.AgeMessages(); } NoxicoGame.PlayerReady = true; Energy = 5000; } CheckForTimedItems(); CheckForCopiers(); if (Character.UpdateSex()) { return; } var sleeping = Character.Path("sleeping"); if (sleeping != null) { Character.Heal(2); sleeping.Value--; if (sleeping.Value <= 0) { Character.RemoveToken("sleeping"); Character.RemoveToken("helpless"); NoxicoGame.AddMessage(i18n.GetString("yougetup")); } NoxicoGame.InGameTime = NoxicoGame.InGameTime.AddMinutes(5); EndTurn(); return; //07-04-13 no more sleepwalking } var helpless = Character.HasToken("helpless"); if (helpless) { if (Random.NextDouble() < 0.05) { Character.Heal(2); NoxicoGame.AddMessage(i18n.GetString("yougetup")); Character.RemoveToken("helpless"); helpless = false; } } var flying = Character.HasToken("flying"); #if DEBUG if (NoxicoGame.KeyMap[Keys.Z]) { NoxicoGame.ClearKeys(); NoxicoGame.InGameTime = NoxicoGame.InGameTime.AddMinutes(30); } #endif //Pause menu moved up so you can pause while <5000. //RIGHT if ((NoxicoGame.IsKeyDown(KeyBinding.Travel) || Vista.Triggers == XInputButtons.RightShoulder)) { NoxicoGame.ClearKeys(); if (!this.ParentBoard.AllowTravel) { if (this.ParentBoard.BoardType == BoardType.Dungeon) { NoxicoGame.AddMessage(i18n.GetString("travel_notfromdungeon")); } else { NoxicoGame.AddMessage(i18n.GetString("travel_notfromwilds")); } return; } Travel.Open(); return; } //LEFT if (NoxicoGame.IsKeyDown(KeyBinding.Rest) || Vista.Triggers == XInputButtons.LeftShoulder) { NoxicoGame.ClearKeys(); Energy -= 1000; EndTurn(); return; } //GREEN if (NoxicoGame.IsKeyDown(KeyBinding.Interact) || Vista.Triggers == XInputButtons.A) { NoxicoGame.ClearKeys(); //NoxicoGame.Messages.Add("[Aim message]"); NoxicoGame.Mode = UserMode.Aiming; NoxicoGame.Cursor.ParentBoard = this.ParentBoard; NoxicoGame.Cursor.XPosition = this.XPosition; NoxicoGame.Cursor.YPosition = this.YPosition; NoxicoGame.Cursor.PopulateTabstops(); NoxicoGame.Cursor.Point(); if (Character.HasToken("tutorial") && !Character.GetToken("tutorial").HasToken("interactmode")) { Character.GetToken("tutorial").AddToken("dointeractmode"); NoxicoGame.CheckForTutorialStuff(); } return; } //BLUE if (NoxicoGame.IsKeyDown(KeyBinding.Items) || Vista.Triggers == XInputButtons.X) { NoxicoGame.ClearKeys(); NoxicoGame.Mode = UserMode.Subscreen; NoxicoGame.Subscreen = Inventory.Handler; Subscreens.FirstDraw = true; return; } //YELLOW if ((NoxicoGame.IsKeyDown(KeyBinding.Fly) || Vista.Triggers == XInputButtons.Y) && !helpless) { NoxicoGame.ClearKeys(); if (Character.HasToken("flying")) { LandFromFlight(); } else { if (Character.HasToken("wings")) { if (Character.GetToken("wings").HasToken("small")) { NoxicoGame.AddMessage(i18n.GetString("wingsaretoosmall")); return; } var tile = ParentBoard.Tilemap[XPosition, YPosition]; if (tile.Definition.Ceiling) { if (Character.GetStat("mind") < 10 || (Character.GetStat("mind") < 20 && Random.NextDouble() < 0.5)) { Hurt(2, "death_crackedagainstceiling", null, false); NoxicoGame.AddMessage(i18n.GetString("hittheceiling")); } else { NoxicoGame.AddMessage(i18n.GetString("cantflyinside")); } return; } //Take off Character.AddToken("flying").Value = 100; NoxicoGame.AddMessage(i18n.GetString("youfly")); return; } NoxicoGame.AddMessage(i18n.GetString("flyneedswings")); } return; } //RED if ((NoxicoGame.IsKeyDown(KeyBinding.Activate) || Vista.Triggers == XInputButtons.B) && !helpless && !flying) { NoxicoGame.ClearKeys(); if (OnWarp()) { CheckWarps(); } var container = ParentBoard.Entities.OfType <Container>().FirstOrDefault(c => c.XPosition == XPosition && c.YPosition == YPosition); if (container != null) { NoxicoGame.ClearKeys(); ContainerMan.Setup(container); return; } //Find dropped items var itemsHere = DroppedItem.GetItemsAt(ParentBoard, XPosition, YPosition); if (itemsHere.Count == 1) { var drop = itemsHere[0]; if (drop != null) { drop.Take(this.Character, ParentBoard); NoxicoGame.Me.Player.Energy -= 1000; NoxicoGame.AddMessage(i18n.Format("youpickup_x", drop.Item.ToString(drop.Token, true))); NoxicoGame.Sound.PlaySound("set://GetItem"); ParentBoard.Redraw(); return; } } else if (itemsHere.Count > 1) { DroppedItem.PickItemsFrom(itemsHere); return; } //Find bed //var bed = ParentBoard.Entities.OfType<Clutter>().FirstOrDefault(c => c.XPosition == XPosition && c.YPosition == YPosition && c.Glyph == 0x147); var bed = ParentBoard.Entities.OfType <Clutter>().FirstOrDefault(c => c.XPosition == XPosition && c.YPosition == YPosition && c.DBRole == "bed"); if (bed != null) { var prompt = "It's " + NoxicoGame.InGameTime.ToShortTimeString() + ", " + NoxicoGame.InGameTime.ToLongDateString() + ". Sleep for how long?"; var options = new Dictionary <object, string>(); foreach (var interval in new[] { 1, 2, 4, 8, 12 }) { options[interval] = Toolkit.Count(interval).Titlecase() + (interval == 1 ? " hour" : " hours"); } options[-1] = "Cancel"; MessageBox.List(prompt, options, () => { if ((int)MessageBox.Answer != -1) { Character.AddToken("helpless"); Character.AddToken("sleeping").Value = (int)MessageBox.Answer * 12; } }, true, true, i18n.GetString("Bed")); } return; } #if DEBUG if (NoxicoGame.KeyMap[Keys.F3]) { NoxicoGame.ClearKeys(); ParentBoard.DumpToHtml(string.Empty); NoxicoGame.AddMessage("Board dumped."); return; } #endif if (helpless) { EndTurn(); return; } if (!AutoTravelling) { if (NoxicoGame.IsKeyDown(KeyBinding.Left) || Vista.DPad == XInputButtons.Left) { this.Move(Direction.West); } else if (NoxicoGame.IsKeyDown(KeyBinding.Right) || Vista.DPad == XInputButtons.Right) { this.Move(Direction.East); } else if (NoxicoGame.IsKeyDown(KeyBinding.Up) || Vista.DPad == XInputButtons.Up) { this.Move(Direction.North); } else if (NoxicoGame.IsKeyDown(KeyBinding.Down) || Vista.DPad == XInputButtons.Down) { this.Move(Direction.South); } //And now, attempting to fire a long range weapon in a cardinal. else if (NoxicoGame.IsKeyDown(KeyBinding.ShootLeft)) { this.QuickFire(Direction.West); } else if (NoxicoGame.IsKeyDown(KeyBinding.ShootRight)) { this.QuickFire(Direction.East); } else if (NoxicoGame.IsKeyDown(KeyBinding.ShootUp)) { this.QuickFire(Direction.North); } else if (NoxicoGame.IsKeyDown(KeyBinding.ShootDown)) { this.QuickFire(Direction.South); } } else { if (NoxicoGame.IsKeyDown(KeyBinding.Left) || NoxicoGame.IsKeyDown(KeyBinding.Right) || NoxicoGame.IsKeyDown(KeyBinding.Up) || NoxicoGame.IsKeyDown(KeyBinding.Down)) //(NoxicoGame.KeyMap[(int)Keys.Left] || NoxicoGame.KeyMap[(int)Keys.Right] || NoxicoGame.KeyMap[(int)Keys.Up] || NoxicoGame.KeyMap[(int)Keys.Down]) { AutoTravelling = false; return; } var x = XPosition; var y = YPosition; var dir = Direction.North; if (AutoTravelMap.RollDown(y, x, ref dir)) { Move(dir); } else { AutoTravelling = false; if ((int)AutoTravelLeave > -1) { this.Move(AutoTravelLeave); } } } }
public override void Move(Direction targetDirection, SolidityCheck check = SolidityCheck.Walker) { var lx = XPosition; var ly = YPosition; check = SolidityCheck.Walker; if (Character.IsSlime) { check = SolidityCheck.DryWalker; } if (Character.HasToken("flying")) { check = SolidityCheck.Flyer; } #region Inter-board travel var n = NoxicoGame.Me; Board otherBoard = null; if (ly == 0 && targetDirection == Direction.North && this.ParentBoard.ToNorth > -1) { otherBoard = n.GetBoard(this.ParentBoard.ToNorth); if (this.CanMove(otherBoard, lx, otherBoard.Height - 1, check) != null) { return; } this.YPosition = otherBoard.Height; OpenBoard(this.ParentBoard.ToNorth); } else if (ly == ParentBoard.Height - 1 && targetDirection == Direction.South && this.ParentBoard.ToSouth > -1) { otherBoard = n.GetBoard(this.ParentBoard.ToSouth); if (this.CanMove(otherBoard, lx, 0, check) != null) { return; } this.YPosition = -1; OpenBoard(this.ParentBoard.ToSouth); } else if (lx == 0 && targetDirection == Direction.West && this.ParentBoard.ToWest > -1) { otherBoard = n.GetBoard(this.ParentBoard.ToWest); if (this.CanMove(otherBoard, otherBoard.Width - 1, ly, check) != null) { return; } this.XPosition = otherBoard.Width; OpenBoard(this.ParentBoard.ToWest); } else if (lx == ParentBoard.Width - 1 && targetDirection == Direction.East && this.ParentBoard.ToEast > -1) { otherBoard = n.GetBoard(this.ParentBoard.ToEast); if (this.CanMove(otherBoard, 0, ly, check) != null) { return; } this.XPosition = -1; OpenBoard(this.ParentBoard.ToEast); } #endregion if (Character.HasToken("tutorial")) { Character.GetToken("tutorial").Value++; } var newX = this.XPosition; var newY = this.YPosition; Toolkit.PredictLocation(newX, newY, targetDirection, ref newX, ref newY); foreach (var entity in ParentBoard.Entities.Where(x => x.XPosition == newX && x.YPosition == newY)) { if (entity.Blocking) { NoxicoGame.ClearKeys(); if (entity is BoardChar) { var bc = (BoardChar)entity; if (bc.Character.HasToken("hostile") || (bc.Character.HasToken("teambehavior") && bc.Character.DecideTeamBehavior(Character, TeamBehaviorClass.Attacking) != TeamBehaviorAction.Nothing)) { //Strike at your foes! AutoTravelling = false; MeleeAttack(bc); EndTurn(); return; } if (!bc.OnPlayerBump.IsBlank()) { bc.RunScript(bc.OnPlayerBump); return; } //Displace! NoxicoGame.AddMessage(i18n.Format("youdisplacex", bc.Character.GetKnownName(false, false, true)), bc.GetEffectiveColor()); bc.XPosition = this.XPosition; bc.YPosition = this.YPosition; } } } base.Move(targetDirection, check); ParentBoard.AimCamera(XPosition, YPosition); EndTurn(); if (Character.HasToken("squishy") || (Character.Path("skin/type") != null && Character.Path("skin/type").Text == "slime")) { NoxicoGame.Sound.PlaySound("set://Squish"); } else { NoxicoGame.Sound.PlaySound("set://Step"); } if (lx != XPosition || ly != YPosition) { ParentBoard.UpdateLightmap(this, true); this.DijkstraMap.Hotspots[0] = new Point(XPosition, YPosition); this.DijkstraMap.Update(); } else if (AutoTravelling) { AutoTravelling = false; #if DEBUG NoxicoGame.AddMessage("* TEST: couldn't go any further. *"); #endif } NoxicoGame.ContextMessage = null; if (OnWarp()) { NoxicoGame.ContextMessage = i18n.GetString("context_warp"); } else if (ParentBoard.Entities.OfType <DroppedItem>().FirstOrDefault(c => c.XPosition == XPosition && c.YPosition == YPosition) != null) { NoxicoGame.ContextMessage = i18n.GetString("context_droppeditem"); } else if (ParentBoard.Entities.OfType <Container>().FirstOrDefault(c => c.XPosition == XPosition && c.YPosition == YPosition) != null) { if (ParentBoard.Entities.OfType <Container>().FirstOrDefault(c => c.XPosition == XPosition && c.YPosition == YPosition).Token.HasToken("corpse")) { NoxicoGame.ContextMessage = i18n.GetString("context_corpse"); } else { NoxicoGame.ContextMessage = i18n.GetString("context_container"); } } //else if (ParentBoard.Entities.OfType<Clutter>().FirstOrDefault(c => c.XPosition == XPosition && c.YPosition == YPosition && c.Glyph == 0x147) != null) else if (ParentBoard.Entities.OfType <Clutter>().FirstOrDefault(c => c.XPosition == XPosition && c.YPosition == YPosition && c.DBRole == "bed") != null) { NoxicoGame.ContextMessage = i18n.GetString("context_bed"); } if (NoxicoGame.ContextMessage != null) { NoxicoGame.ContextMessage = Toolkit.TranslateKey(KeyBinding.Activate, false, false) + " - " + NoxicoGame.ContextMessage; } }
public static void Handler() { if (Subscreens.FirstDraw) { Subscreens.FirstDraw = false; var lines = text.Split('\n').Length; var height = lines + 1; var listHeight = 0; if (type == BoxType.List) { listHeight = options.Count; if (listHeight > Program.Rows - 9) { listHeight = Program.Rows - 9; } height += 1 + listHeight; } else if (type == BoxType.Input) { height += 2; } var top = (Program.Rows / 2) - (height / 2); if (top < 0) { top = 0; } if (UIManager.Elements == null || fromWalkaround) { UIManager.Initialize(); } if (icon != null) { icon.Left = Program.Cols - icon.Bitmap.Width; icon.Top = Program.Rows - icon.Bitmap.Height; UIManager.Elements.Add(icon); } var left = (Program.Cols / 2) - (width / 2); win = new UIWindow(type == BoxType.Question ? i18n.GetString("msgbox_question") : title) { Left = left, Top = top, Width = width + 4, Height = height }; UIManager.Elements.Add(win); lbl = new UILabel(text) { Left = left + 2, Top = top + 1, Width = width, Height = lines }; UIManager.Elements.Add(lbl); lst = null; txt = null; if (type == BoxType.List) { lst = new UIList(string.Empty, Enter, options.Values.ToList(), 0) { Left = left + 2, Top = top + lines + 1, Width = width, Height = listHeight }; lst.Change += (s, e) => { option = lst.Index; Answer = options.Keys.ToArray()[option]; }; lst.Change(null, null); UIManager.Elements.Add(lst); } else if (type == BoxType.Input) { txt = new UITextBox((string)Answer) { Left = left + 2, Top = top + lines + 1, Width = width - 1, Height = 1 }; UIManager.Elements.Add(txt); } var keys = string.Empty; if (type == BoxType.Notice || type == BoxType.Input) { keys = " \x137 "; } else if (type == BoxType.Question) { keys = " " + Toolkit.TranslateKey(KeyBinding.Accept) + "/" + Toolkit.TranslateKey(KeyBinding.Back) + " "; } else if (type == BoxType.List) { keys = " \x18/\x19 "; } key = new UILabel(keys) { Top = top + height - 1, Left = left + width - 2 - keys.Length() }; UIManager.Elements.Add(key); Subscreens.Redraw = true; } if (Subscreens.Redraw) { Subscreens.Redraw = false; UIManager.Draw(); } if (NoxicoGame.IsKeyDown(KeyBinding.Back) || NoxicoGame.IsKeyDown(KeyBinding.Accept) || Vista.Triggers == XInputButtons.A || Vista.Triggers == XInputButtons.B) { if (NoxicoGame.IsKeyDown(KeyBinding.Back) || Vista.Triggers == XInputButtons.B) { if (type == BoxType.List) { if (!allowEscape) { return; } else { option = -1; } } else if (type == BoxType.Input) { UIManager.CheckKeys(); return; } } Enter(null, null); if (type == BoxType.Question) { if ((NoxicoGame.IsKeyDown(KeyBinding.Accept) || Vista.Triggers == XInputButtons.A) && onYes != null) { NoxicoGame.ClearKeys(); onYes(); } else if ((NoxicoGame.IsKeyDown(KeyBinding.Back) || Vista.Triggers == XInputButtons.B) && onNo != null) { NoxicoGame.ClearKeys(); onNo(); } } else if (type == BoxType.List) { Answer = option == -1 ? -1 : options.ElementAt(option).Key; onYes(); NoxicoGame.ClearKeys(); } else if (type == BoxType.Input) { Answer = txt.Text; onYes(); NoxicoGame.ClearKeys(); } else { type = BoxType.Notice; NoxicoGame.ClearKeys(); } if (ScriptPauseHandler != null) { ScriptPauseHandler(); ScriptPauseHandler = null; } } else { UIManager.CheckKeys(); } }
/// <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 static void Handler() { var host = NoxicoGame.HostForm; if (Subscreens.FirstDraw) { UIManager.Initialize(); Subscreens.FirstDraw = false; NoxicoGame.ClearKeys(); Subscreens.Redraw = true; var backdrop = new Bitmap(Program.Cols, Program.Rows * 2, System.Drawing.Imaging.PixelFormat.Format24bppRgb); var ccback = Mix.GetBitmap("travelback.png"); var ccpage = Mix.GetBitmap("ccpage.png"); var ccbars = Mix.GetBitmap("ccbars.png"); var pageTop = Program.Rows - (ccpage.Height / 2); using (var gfx = Graphics.FromImage(backdrop)) { gfx.Clear(Color.Black); gfx.DrawImage(ccback, 0, 0, Program.Cols, Program.Rows * 2); gfx.DrawImage(ccpage, 0, pageTop, ccpage.Width, ccpage.Height); var barsSrc = new System.Drawing.Rectangle(0, 3, ccbars.Width, 7); var barsDst = new System.Drawing.Rectangle(0, 0, Program.Cols, 7); gfx.DrawImage(ccbars, barsDst, barsSrc, GraphicsUnit.Pixel); barsSrc = new System.Drawing.Rectangle(0, 0, ccbars.Width, 5); barsDst = new System.Drawing.Rectangle(0, (Program.Rows * 2) - 5, Program.Cols, 5); gfx.DrawImage(ccbars, barsDst, barsSrc, GraphicsUnit.Pixel); } var list = new UIList() { Left = 4, Top = (pageTop / 2) + 4, Width = 34, Height = (ccpage.Height / 2) - 6, Background = Color.White, Foreground = Color.Black, }; UIManager.Elements.Add(new UIPNGBackground(backdrop)); UIManager.Elements.Add(new UILabel(i18n.GetString("travel_header")) { Left = 1, Top = 0, Foreground = Color.Silver }); UIManager.Elements.Add(new UILabel(i18n.GetString("travel_footer")) { Left = 1, Top = Program.Rows - 1, Foreground = Color.Silver }); UIManager.Elements.Add(new UILabel(i18n.GetString("travel_current") + "\n \x07<cCyan> " + (host.Noxico.CurrentBoard.Name ?? "Somewhere")) { Left = 44, Top = (pageTop / 2) + 4, Width = Program.Cols - 46, Foreground = Color.Teal }); UIManager.Elements.Add(list); var targets = new List <int>(); foreach (var target in NoxicoGame.TravelTargets) { targets.Add(target.Key); } targets.Sort(); list.Items.AddRange(targets.Select(x => NoxicoGame.TravelTargets[x])); list.Index = 0; //fixes crash when pressing Enter right away list.Enter = (s, e) => { var newBoard = NoxicoGame.TravelTargets.First(tn => tn.Value == list.Text).Key; if (host.Noxico.CurrentBoard.BoardNum == newBoard) { return; } NoxicoGame.Mode = UserMode.Walkabout; Subscreens.FirstDraw = true; NoxicoGame.InGameTime = NoxicoGame.InGameTime.AddDays(1); while (Toolkit.IsNight()) { NoxicoGame.InGameTime = NoxicoGame.InGameTime.AddHours(Random.Next(1, 3)); } NoxicoGame.InGameTime = NoxicoGame.InGameTime.AddMinutes(Random.Next(10, 50)); host.Noxico.Player.OpenBoard(newBoard); var hereNow = host.Noxico.Player.ParentBoard; if (hereNow.BoardType == BoardType.Dungeon) { //find the exit and place the player there //TODO: something similar for towns var dngExit = hereNow.Warps.FirstOrDefault(w => w.TargetBoard == -2); if (dngExit != null) { host.Noxico.Player.XPosition = dngExit.XPosition; host.Noxico.Player.YPosition = dngExit.YPosition; } } else { host.Noxico.Player.Reposition(); } }; if (host.Noxico.CurrentBoard.Name != null) { var thisBoard = NoxicoGame.TravelTargets.FirstOrDefault(tn => host.Noxico.CurrentBoard.Name.StartsWith(tn.Value)); if (thisBoard.Value != null) { list.Index = list.Items.FindIndex(i => thisBoard.Value.StartsWith(i)); } } } if (Subscreens.Redraw) { Subscreens.Redraw = false; UIManager.Draw(); } if (NoxicoGame.IsKeyDown(KeyBinding.Back) || Vista.Triggers == XInputButtons.B) { NoxicoGame.ClearKeys(); NoxicoGame.Immediate = true; host.Noxico.CurrentBoard.Redraw(); host.Noxico.CurrentBoard.Draw(true); host.Noxico.CurrentBoard.AimCamera(); NoxicoGame.Mode = UserMode.Walkabout; Subscreens.FirstDraw = true; } else { UIManager.CheckKeys(); } }
/// <summary> /// Generic Subscreen handler. /// </summary> public static void Handler() { //TODO: add more things, such as a status bar and a window with the exact results. if (Subscreens.FirstDraw) { UIManager.Initialize(); Subscreens.FirstDraw = false; NoxicoGame.ClearKeys(); Subscreens.Redraw = true; } if (Subscreens.Redraw) { Subscreens.Redraw = false; recipes = GetPossibilities(Carrier); var h = recipes.Count < 40 ? recipes.Count : 40; if (h == 0) { h++; } recipeWindow = new UIWindow(string.Empty) { Top = 2, Left = 2, Width = 76, Height = h + 2 }; recipeList = new UIList(string.Empty, null, recipes.Select(r => r.Display)) { Top = 3, Left = 3, Width = 74, Height = h }; recipeList.Enter = (s, e) => { if (recipes.Count == 0) { return; } var i = recipeList.Index; recipes[i].Apply(); //Redetermine the possibilities and update the UI accordingly. recipes = GetPossibilities(Carrier); if (recipes.Count > 0) { recipeList.Items = recipes.Select(r => r.Display).ToList(); if (i >= recipeList.Items.Count) { i = recipeList.Items.Count - 1; } recipeList.Index = i; h = recipes.Count < 40 ? recipes.Count : 40; } else { h = 1; recipeList.Hidden = true; } recipeWindow.Height = h + 2; recipeList.Height = h; NoxicoGame.Me.CurrentBoard.Redraw(); NoxicoGame.Me.CurrentBoard.Draw(); UIManager.Draw(); }; UIManager.Elements.Add(recipeWindow); UIManager.Elements.Add(new UILabel(i18n.GetString("craft_nothing")) { Left = 3, Top = 3 }); UIManager.Elements.Add(recipeList); UIManager.Highlight = recipeList; 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 { UIManager.CheckKeys(); } }
public static void Handler() { var host = NoxicoGame.HostForm; if (Subscreens.FirstDraw) { Subscreens.FirstDraw = false; UIManager.Initialize(); UIManager.Elements.Add(new UIWindow(i18n.GetString("pause_title")) { Left = 3, Top = 1, Width = 22, Height = pages.Count + 2 }); UIManager.Elements.Add(new UIWindow(string.Empty) { Left = 28, Top = 1, Width = 49, Height = 23 }); list = new UIList() { Width = 20, Height = pages.Count, Left = 4, Top = 2, Background = UIColors.WindowBackground }; list.Items.AddRange(pages.Keys); list.Change += (s, e) => { page = list.Index; text.Text = pages.Values.ElementAt(page); UIManager.Draw(); }; list.Enter += (s, e) => { if (list.Index == list.Items.Count - 1) //can't use absolute index because Debug might be missing. { host.Close(); } else if (list.Index == list.Items.Count - 2) //same { //System.Diagnostics.Process.Start(host.IniPath); Options.Open(); } else if (list.Index == 4) { TextScroller.Plain(Mix.GetString("credits.txt"), i18n.GetString("pause_credits"), false); } }; text = new UILabel("...") { Left = 30, Top = 2 }; UIManager.Elements.Add(list); UIManager.Elements.Add(text); list.Index = IniFile.GetValue("misc", "rememberpause", true) ? page : 0; UIManager.Highlight = list; Subscreens.Redraw = true; } if (Subscreens.Redraw) { Subscreens.Redraw = false; UIManager.Draw(); } 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 { UIManager.CheckKeys(); } }
public static void Open() { var host = NoxicoGame.HostForm; var nox = host.Noxico; var player = nox.Player.Character; var hpNow = player.Health; var hpMax = player.MaximumHealth; var health = hpNow + " / " + hpMax; if (hpNow <= hpMax / 4) { health = "<cRed>" + health + "<cSilver>"; } else if (hpNow <= hpMax / 2) { health = "<cYellow>" + health + "<cSilver>"; } var sb = new StringBuilder(); sb.AppendLine(i18n.GetString("pause_name").PadEffective(20) + player.Name); sb.AppendLine(i18n.GetString("pause_gender").PadEffective(20) + player.Gender); sb.AppendLine(i18n.GetString("pause_health").PadEffective(20) + health); sb.AppendLine(i18n.GetString("pause_money").PadEffective(20) + player.GetToken("money").Value.ToString("C")); sb.AppendLine(i18n.GetString("pause_playtime").PadEffective(20) + nox.Player.PlayingTime.ToString()); sb.AppendLine(i18n.GetString("pause_worldtime").PadEffective(20) + NoxicoGame.InGameTime.ToString()); sb.AppendLine(); player.RecalculateStatBonuses(); player.CheckHasteSlow(); foreach (var stat in Lua.Environment.stats) { if (stat.Value.panel == null) { continue; } string properName = stat.Value.name.ToString(); string statName = properName.ToLowerInvariant(); if (!player.HasToken(statName)) { sb.AppendLine(properName.PadEffective(20) + "<cGray>-?-"); } else { var bonus = string.Empty; var statBonus = player.GetToken(statName + "bonus").Value; var statBase = player.GetToken(statName).Value; var total = statBase + statBonus; if (statBonus > 0) { bonus = "<cGray> (" + statBase + "+" + statBonus + ")<cSilver>"; } else if (statBonus < 0) { bonus = "<cFirebrick> (" + statBase + "-" + (-statBonus) + ")<cSilver>"; } sb.AppendLine(properName.PadEffective(20) + total + bonus); } } pages[i18n.GetString("pause_charstats")] = sb.ToString(); sb.Clear(); foreach (var skill in player.GetToken("skills").Tokens) { if ((int)skill.Value > 0) { var skillName = i18n.GetString("skill_" + skill.Name); if (skillName[0] == '[') //Ignore missing skill translations for now. { skillName = skillName.Substring(7, skillName.Length - 8); } sb.AppendLine(skillName.Replace('_', ' ').Titlecase().PadEffective(30) + ((int)skill.Value).ToString()); } } pages[i18n.GetString("pause_skills")] = sb.ToString(); sb.Clear(); for (var i = 0; i < 4; i++) { sb.Append(Toolkit.TranslateKey((KeyBinding)i)); } sb.AppendLine(" - " + i18n.GetString("pause_keymove")); sb.AppendLine(Toolkit.TranslateKey(KeyBinding.Interact, true).PadEffective(12) + " - " + i18n.GetString("pause_keyinteract")); sb.AppendLine(Toolkit.TranslateKey(KeyBinding.Activate, true).PadEffective(12) + " - " + i18n.GetString("pause_keyactivate")); sb.AppendLine(Toolkit.TranslateKey(KeyBinding.Rest, true).PadEffective(12) + " - " + i18n.GetString("pause_keyrest")); sb.AppendLine(Toolkit.TranslateKey(KeyBinding.Fly, true).PadEffective(12) + " - " + i18n.GetString("pause_keyfly")); sb.AppendLine(Toolkit.TranslateKey(KeyBinding.Items, true).PadEffective(12) + " - " + i18n.GetString("pause_keyitems")); sb.AppendLine(Toolkit.TranslateKey(KeyBinding.Travel, true).PadEffective(12) + " - " + i18n.GetString("pause_keytravel")); sb.AppendLine(Toolkit.TranslateKey(KeyBinding.Accept, true).PadEffective(12) + " - " + i18n.GetString("pause_keyaccept")); sb.AppendLine(Toolkit.TranslateKey(KeyBinding.Back, true).PadEffective(12) + " - " + i18n.GetString("pause_keyback")); pages[i18n.GetString("pause_keys1")] = sb.ToString(); sb.Clear(); sb.AppendLine(Toolkit.TranslateKey(KeyBinding.Pause, true).PadEffective(8) + " - " + i18n.GetString("pause_keypause")); #if DEBUG sb.AppendLine(Toolkit.TranslateKey(System.Windows.Forms.Keys.F3, true).PadEffective(8) + " - Dump board to HTML (debug only)"); #endif sb.AppendLine(Toolkit.TranslateKey(KeyBinding.Screenshot, true).PadEffective(8) + " - " + i18n.GetString("pause_keyscreenshot")); pages[i18n.GetString("pause_keys2")] = sb.ToString(); #if DEBUG var entities = 0; var tokens = 0; foreach (var x in nox.Boards.Where(x => x != null)) { if (x == null) { continue; } entities += x.Entities.Count; foreach (var c in x.Entities.OfType <BoardChar>()) { tokens += c.Character.Tokens.Count; foreach (var t in c.Character.Tokens) { tokens += CountTokens(t); } } } ; NoxicoGame.KnownItems.ForEach(x => { tokens += x.Tokens.Count; foreach (var t in x.Tokens) { tokens += CountTokens(t); } }); pages[i18n.GetString("pause_memstats")] = i18n.Format("pause_memstatscontent", nox.Boards.Count.ToString("G"), nox.Boards.Where(b => b != null).Count().ToString("G"), NoxicoGame.KnownItems.Count.ToString("G"), entities.ToString("G"), tokens.ToString("G")); #endif if (!IniFile.GetValue("misc", "rememberpause", true)) { page = 0; } NoxicoGame.Subscreen = Handler; NoxicoGame.Mode = UserMode.Subscreen; Subscreens.FirstDraw = true; NoxicoGame.ClearKeys(); }