public void LandFromFlight(bool forced = false) { NoxicoGame.AddMessage(i18n.GetString("youland")); Character.RemoveToken("flying"); //add swim capability? var tile = ParentBoard.Tilemap[XPosition, YPosition]; if (tile.Fluid != Fluids.Dry && !tile.Shallow && Character.IsSlime) { Hurt(9999, "death_doveinanddrowned", null, false); } else if (tile.Definition.Cliff) { Hurt(9999, "death_doveintodepths", null, false, false); } else if (tile.Definition.Fence) { //I guess I'm still a little... on the fence. /* * var tileDesc = tile.GetDescription(); * if (!tileDesc.HasValue) * tileDesc = new TileDescription() { Color = Color.Silver, Name = "obstacle" }; * NoxicoGame.AddMessage("You fall off the " + tileDesc.Value.Name + ".", tileDesc.Value.Color); * Hurt(5, "landed on " + (tileDesc.Value.Name.StartsWithVowel() ? "an" : "a") + ' ' + tileDesc.Value.Name, null, false, true); */ //YEEEEAAAAH!!!!!!!! } }
private static void TryDrop(BoardChar boardchar, Token token, InventoryItem chosen) { //Subscreens.PreviousScreen.Push(NoxicoGame.Subscreen); itemList.Enabled = false; if (token.HasToken("equipped")) { try { chosen.Unequip(boardchar.Character); } catch (ItemException x) { MessageBox.Notice(x.Message.Viewpoint(boardchar.Character)); } } if (!token.HasToken("equipped")) { NoxicoGame.AddMessage(i18n.Format("dropped_x", chosen.ToString(token, true, true))); NoxicoGame.Sound.PlaySound("set://PutItem"); chosen.Drop(boardchar, token); NoxicoGame.Me.CurrentBoard.Update(); //NoxicoGame.Me.CurrentBoard.Draw(); NoxicoGame.Subscreen = Inventory.Handler; Subscreens.Redraw = true; } itemList.Enabled = true; }
public void Eat(Character gourmand, Token item) { if (item.HasToken("fat")) { var hwa = Random.Flip() ? "hips" : Random.Flip() ? "waist" : "ass/size"; if (gourmand.Path(hwa) == null) { return; } var change = Random.NextDouble() * 0.25; if (change > 0) { gourmand.Path(hwa).Value += (float)change; if (!gourmand.HasToken("player")) { return; } if (hwa == "ass/size") { hwa = "butt"; } NoxicoGame.AddMessage(i18n.GetString("eat_toyour" + hwa).Viewpoint(gourmand)); } } }
public bool UpdateSex() { if (!EnsureSexPartner()) { return(false); } if (HasToken("havingsex_initsex")) { var runinit = SexManager.GetResult("initsex", this, sexPartner); SexManager.Apply(runinit, this, sexPartner, new Action <string>(x => NoxicoGame.AddMessage(x))); RemoveToken("havingsex_initsex"); } var everysexturn = SexManager.GetResult("everysexturn", this, sexPartner); SexManager.Apply(everysexturn, this, sexPartner, new Action <string>(x => NoxicoGame.AddMessage(x))); if (this.GetStat("pleasure") >= 100) { var result = SexManager.GetResult("climax", this, sexPartner); if (this.HasItemEquipped("orgasm_denial_ring")) { result = SexManager.GetResult("orgasm_denial_ring", this, sexPartner); } SexManager.Apply(result, this, sexPartner, new Action <string>(x => NoxicoGame.AddMessage(x))); this.BoardChar.Energy -= (int)result.GetToken("time").Value; return(true); } var possibilities = SexManager.GetPossibilities(this, sexPartner); if (this.BoardChar is Player) { ActionList.Show(string.Empty, this.BoardChar.XPosition, this.BoardChar.YPosition, possibilities, () => { var answer = ActionList.Answer as Token; var action = (answer == null) ? "wait" : answer.Text; var result = SexManager.GetResult(action, this, sexPartner); SexManager.Apply(result, this, sexPartner, new Action <string>(x => NoxicoGame.AddMessage(x))); this.BoardChar.Energy -= (int)result.GetToken("time").Value; } ); } else { //var keys = possibilities.Keys.Select(p => p as string).ToArray(); //var choice = Toolkit.PickOne(keys); var choice = possibilities.Keys.OfType <Token>().ToList().PickWeighted().Text; var result = SexManager.GetResult(choice, this, sexPartner); SexManager.Apply(result, this, sexPartner, new Action <string>(x => NoxicoGame.AddMessage(x))); this.BoardChar.Energy -= (int)result.GetToken("time").Value; } return(true); }
public static void PickItemsFrom(List <DroppedItem> items) { var itemDict = new Dictionary <object, string>(); foreach (var item in items) { var name = item.Item.ToString(item.Token, false, false); name = name.Substring(0, 1).ToUpperInvariant() + name.Substring(1); itemDict.Add(item, name); } itemDict.Add(-2, i18n.GetString("action_pickup_all")); itemDict.Add(-1, i18n.GetString("action_pickup_cancel")); //"...nothing" ActionList.Show(i18n.GetString("action_pickup_window") /* "Pick up..." */, items[0].XPosition, items[0].YPosition, itemDict, () => { var player = NoxicoGame.Me.Player; if (ActionList.Answer is int && (int)ActionList.Answer == -1) { //Cancelled. return; } else if (ActionList.Answer is int && (int)ActionList.Answer == -2) { //All foreach (var d in items) { d.Take(player.Character, player.ParentBoard); player.Energy -= 1000; } NoxicoGame.AddMessage(i18n.Format("youpickup_all")); } else { var drop = ActionList.Answer as DroppedItem; var item = drop.Item; var token = drop.Token; drop.Take(player.Character, player.ParentBoard); player.Energy -= 1000; NoxicoGame.AddMessage(i18n.Format("youpickup_x", item.ToString(token, true))); //, drop.ForegroundColor); } NoxicoGame.Sound.PlaySound("set://GetItem"); player.ParentBoard.Redraw(); } ); }
public void Drop(BoardChar boardChar, Token item) { //Find a spot to drop the item int lives = 1000, x = 0, y = 0; while (lives > 0) { x = boardChar.XPosition + Random.Next(-1, 2); y = boardChar.YPosition + Random.Next(-1, 2); if (!boardChar.ParentBoard.IsSolid(y, x) && !boardChar.ParentBoard.IsBurning(y, x)) { break; } lives--; } var tile = boardChar.ParentBoard.Tilemap[x, y]; if (tile.Fluid != Fluids.Dry || tile.Definition.Cliff) { NoxicoGame.AddMessage(i18n.Format(tile.Definition.Cliff ? "x_dropped_y_inthedepths" : ("x_dropped_y_inthe_" + tile.Fluid.ToString().ToLowerInvariant()), this.ToString(item, true, false)).Viewpoint(boardChar.Character)); } if (lives == 0) { boardChar.Character.GetToken("items").Tokens.Remove(item); boardChar.Character.CheckHasteSlow(); return; } var droppedItem = new DroppedItem(this, item) { XPosition = x, YPosition = y, ParentBoard = boardChar.ParentBoard, }; droppedItem.AdjustView(); droppedItem.ParentBoard.EntitiesToAdd.Add(droppedItem); boardChar.Character.GetToken("items").Tokens.Remove(item); boardChar.Character.CheckHasteSlow(); }
public void EndTurn() { var nrg = Energy; Energy = 5000; var r = Lua.Environment.EachBoardCharTurn(this, this.Character); Energy = nrg; NoxicoGame.PlayerReady = false; if (Character.HasToken("flying")) { var f = Character.GetToken("flying"); f.Value--; if (!Character.HasToken("wings") || Character.GetToken("wings").HasToken("small")) { NoxicoGame.AddMessage(i18n.GetString("losewings")); f.Value = -10; } if (f.Value <= 0) { LandFromFlight(true); } } if (ParentBoard == null) { return; } ParentBoard.Update(true); if (ParentBoard.IsBurning(YPosition, XPosition)) { Hurt(10, "death_burned", null, false, false); } //Leave EntitiesToAdd/Remove to Board.Update next passive cycle. }
public new void AimShot(Entity target) { //TODO: throw whatever is being held by the player at the target, according to their Throwing skill and the total distance. //If it's a gun they're holding, fire it instead, according to their Shooting skill. //MessageBox.Message("Can't shoot yet, sorry.", true); if (target is Player) { MessageBox.Notice("Don't shoot yourself in the foot!", true); return; } var weapon = Character.CanShoot(); var weap = weapon.GetToken("weapon"); var skill = weap.GetToken("skill"); if (new[] { "throwing", "small_firearm", "large_firearm", "huge_firearm" }.Contains(skill.Text)) { if (weap.HasToken("ammo")) { var ammoName = weap.GetToken("ammo").Text; var carriedAmmo = this.Character.GetToken("items").Tokens.Find(ci => ci.Name == ammoName); if (carriedAmmo == null) { return; } var knownAmmo = NoxicoGame.KnownItems.Find(ki => ki.ID == ammoName); if (knownAmmo == null) { return; } knownAmmo.Consume(Character, carriedAmmo); } else if (weapon.HasToken("charge")) { var carriedGun = this.Character.GetToken("items").Tokens.Find(ci => ci.Name == weapon.ID && ci.HasToken("equipped")); weapon.Consume(Character, carriedGun); } if (weapon != null) { FireLine(weapon.Path("effect"), target); } } else { MessageBox.Notice("Can't throw yet, sorry.", true); return; } var aimSuccess = true; //TODO: make this skill-relevant. if (aimSuccess) { if (target is BoardChar) { var hit = target as BoardChar; var damage = weap.Path("damage").Value *GetDefenseFactor(weap, hit.Character); var overallArmor = 0f; foreach (var targetArmor in hit.Character.GetToken("items").Tokens.Where(t => t.HasToken("equipped"))) { var targetArmorItem = NoxicoGame.KnownItems.FirstOrDefault(i => i.Name == targetArmor.Name); if (targetArmorItem == null) { continue; } if (!targetArmorItem.HasToken("armor")) { continue; } if (targetArmorItem.GetToken("armor").Value > overallArmor) { overallArmor = Math.Max(1.5f, targetArmorItem.GetToken("armor").Value); } } if (overallArmor != 0) { damage /= overallArmor; } NoxicoGame.AddMessage(i18n.Format("youhitxfory", hit.Character.GetKnownName(false, false, true), damage, i18n.Pluralize("point", (int)damage))); hit.Hurt(damage, "death_shot", this, false); } this.Character.IncreaseSkill(skill.Text); } NoxicoGame.Mode = UserMode.Walkabout; Energy -= 500; EndTurn(); }
public override bool Hurt(float damage, string cause, object aggressor, bool finishable = false, bool leaveCorpse = true) { if (AutoTravelling) { NoxicoGame.AddMessage(i18n.Format("autotravelstop")); AutoTravelling = false; } if (Character.HasItemEquipped("eternitybrooch")) { var brooch = Character.GetEquippedItemBySlot("neck"); //can assume the neck slot has the brooch. var today = NoxicoGame.InGameTime.DayOfYear; if (!brooch.HasToken("lastTrigger")) { brooch.AddToken("lastTrigger", today - 2); } if (Math.Abs(brooch.GetToken("lastTrigger").Value - today) >= 2 && Character.Health - damage <= 0) { brooch.GetToken("lastTrigger").Value = today; NoxicoGame.AddMessage(i18n.GetString("eternitybrooched")); Character.Health = Character.MaximumHealth; Reposition(); return(false); } } var dead = base.Hurt(damage, cause, aggressor, finishable); if (dead) { if (aggressor != null && aggressor is BoardChar) { var aggChar = ((BoardChar)aggressor).Character; var relation = Character.Path("ships/" + aggChar.ID); if (relation == null) { relation = new Token(aggChar.ID); Character.Path("ships").Tokens.Add(relation); } relation.AddToken("killer"); if (aggChar.HasToken("stolenfrom")) { var myItems = Character.GetToken("items").Tokens; var hisItems = aggChar.GetToken("items").Tokens; var stolenGoods = myItems.Where(t => t.HasToken("owner") && t.GetToken("owner").Text == aggChar.ID).ToList(); foreach (var item in stolenGoods) { hisItems.Add(item); myItems.Remove(item); } aggChar.GetToken("stolenfrom").Name = "wasstolenfrom"; aggChar.RemoveToken("hostile"); } } if (Lives == 0) { Character.AddToken("gameover"); NoxicoGame.AddMessage(i18n.GetString("gameover_title"), Color.Red); //var playerFile = Path.Combine(NoxicoGame.SavePath, NoxicoGame.WorldName, "player.bin"); //File.Delete(playerFile); var world = string.Empty; if (NoxicoGame.WorldName != "<Testing Arena>") { world = System.IO.Path.Combine(NoxicoGame.SavePath, NoxicoGame.WorldName); } NoxicoGame.Sound.PlayMusic("set://Death"); NoxicoGame.InGame = false; var c = i18n.GetString(cause + "_player"); if (c[0] == '[') { c = i18n.GetString(cause); } MessageBox.Ask( i18n.Format("youdied", c), () => { Character.CreateInfoDump(); if (NoxicoGame.WorldName != "<Testing Arena>") { Directory.Delete(world, true); } NoxicoGame.HostForm.Close(); }, () => { if (NoxicoGame.WorldName != "<Testing Arena>") { Directory.Delete(world, true); } NoxicoGame.HostForm.Close(); } ); } else { Respawn(); } } return(dead); }
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 static void Apply(Token result, Character actor, Character target, Action <string> writer) { if (!result.HasToken("effect")) { return; } var f = result.GetToken("effect"); var script = f.Tokens.Count == 1 ? f.Tokens[0].Text : f.Text; var env = Lua.Environment; env.top = actor; env.bottom = target; env.consentual = !target.HasToken("helpless"); env.nonconsentual = target.HasToken("helpless"); env.masturbating = actor == target; env.MessageR = new Action <object, Color>((x, y) => { if (x is Neo.IronLua.LuaTable) { x = ((Neo.IronLua.LuaTable)x).ArrayList.ToArray(); } while (x is object[]) { var options = (object[])x; x = options.PickOne(); if (x is Neo.IronLua.LuaTable) { x = ((Neo.IronLua.LuaTable)x).ArrayList.ToArray(); } } NoxicoGame.AddMessage(ApplyMemory(x.ToString()).Viewpoint(actor, target), y); }); env.Stop = new Action(() => { actor.RemoveAll("havingsex"); target.RemoveAll("havingsex"); }); env.Roll = new Func <object, object, bool>((x, y) => { float a, b; if (!float.TryParse(x.ToString(), out a)) { if (Character.StatNames.Contains(x.ToString().ToLowerInvariant())) { a = actor.GetStat(x.ToString()); } else { a = actor.GetSkillLevel(x.ToString()); } } if (!float.TryParse(y.ToString(), out b)) { if (Character.StatNames.Contains(x.ToString().ToLowerInvariant())) { b = actor.GetStat(x.ToString()); } else { b = target.GetSkillLevel(y.ToString()); } } return(a >= b); }); // Okay, Sparky. What I did was, I put all the error handling in Lua.cs, with a Run method. // Instead of worrying about presentation, it just uses a standard WinForms MessageBox. // After all, the game's already in a broken state by now. var msg = env.Message; env.Message = new Action <object, object>((x, y) => { if (x is Neo.IronLua.LuaTable) { x = ((Neo.IronLua.LuaTable)x).ArrayList.ToArray(); } while (x is object[]) { var options = (object[])x; x = options.PickOne(); if (x is Neo.IronLua.LuaTable) { x = ((Neo.IronLua.LuaTable)x).ArrayList.ToArray(); } } NoxicoGame.AddMessage(ApplyMemory(x.ToString()).Viewpoint(actor, target), y); }); Lua.Run(script, env); env.Message = msg; /* * try * { * // really should just compile once at startup but we're just testing the debugger trace * // anyway here's how you'd do it. * //LuaChunk chunk = env.Lua.CompileChunk(script, "lol.lua", new LuaStackTraceDebugger()); * //env.DoChunk(chunk, "lol.lua"); * env.DoChunk(script, "lol.lua"); * } * catch (Neo.IronLua.LuaParseException lpe) * { * string complain = String.Format("Exception: {0} line {1} col {2},\r\n", * lpe.Message, lpe.Line, lpe.Column); * * LuaExceptionData lex = LuaExceptionData.GetData(lpe); * foreach (LuaStackFrame lsf in lex) * { * complain += String.Format("StackTrace: {0} line {1} col {2},\r\n", * lsf.MethodName, lsf.LineNumber, lsf.ColumnNumber); * } * * var paused = true; * MessageBox.ScriptPauseHandler = () => paused = false; * MessageBox.Notice(complain); * while (paused) * { * NoxicoGame.Me.Update(); * System.Windows.Forms.Application.DoEvents(); * } * // kawa! things get REALLY BROKEN at this point but at least you got a MessageBox -- sparks * } */ }
private static Bitmap backdrop; //, backWithPortrait; /// <summary> /// Don't see a Subscreen with multiple handlers often... /// </summary> public static void CharacterCreator() { if (Subscreens.FirstDraw) { //Start creating the world as we work... if (worldgen == null) //Conditional added by Mat. { worldgen = new System.Threading.Thread(NoxicoGame.Me.CreateRealm); worldgen.Start(); } //Load all bonus traits. var traits = new List <string>(); var traitHelps = new List <string>(); var traitsDoc = Mix.GetTokenTree("bonustraits.tml"); foreach (var trait in traitsDoc.Where(t => t.Name == "trait")) { traits.Add(trait.GetToken("display").Text); traitHelps.Add(trait.GetToken("description").Text); } //Define the help texts for the standard controls. controlHelps = new Dictionary <string, string>() { { "back", i18n.GetString("cchelp_back") }, { "next", i18n.GetString("cchelp_next") }, { "play", Random.NextDouble() > 0.7 ? "FRUITY ANGELS MOLEST SHARKY" : "ENGAGE RIDLEY MOTHER F****R" }, { "name", i18n.GetString("cchelp_name") }, { "species", string.Empty }, { "sex", i18n.GetString("cchelp_sex") }, { "gid", i18n.GetString("cchelp_gid") }, { "pref", i18n.GetString("cchelp_pref") }, { "tutorial", i18n.GetString("cchelp_tutorial") }, { "easy", i18n.GetString("cchelp_easy") }, { "gift", traitHelps[0] }, }; var xScale = Program.Cols / 80f; var yScale = Program.Rows / 25f; //backdrop = Mix.GetBitmap("chargen.png"); backdrop = new Bitmap(Program.Cols, Program.Rows * 2, System.Drawing.Imaging.PixelFormat.Format24bppRgb); var ccback = Mix.GetBitmap("ccback.png"); var ccpage = Mix.GetBitmap("ccpage.png"); var ccbars = Mix.GetBitmap("ccbars.png"); var pageLeft = Program.Cols - ccpage.Width - (int)(2 * yScale); 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, pageLeft, 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); } //Build the interface. var title = "\xB4 " + i18n.GetString("cc_title") + " \xC3"; var bar = new string('\xC4', 33); string[] sexoptions = { i18n.GetString("Male"), i18n.GetString("Female"), i18n.GetString("Herm"), i18n.GetString("Neuter") }; string[] prefoptions = { i18n.GetString("Male"), i18n.GetString("Female"), i18n.GetString("Either") }; var labelL = pageLeft + 5; var cntrlL = labelL + 2; var header = (pageTop / 2) + 3; var top = header + 2; var buttons = (pageTop / 2) + 20; controls = new Dictionary <string, UIElement>() { { "backdrop", new UIPNGBackground(backdrop) }, //backWithPortrait) }, { "headerline", new UILabel(bar) { Left = labelL, Top = header, Foreground = Color.Black } }, { "header", new UILabel(title) { Left = labelL + 17 - (title.Length() / 2), Top = header, Width = title.Length(), Foreground = Color.Black } }, { "back", new UIButton(i18n.GetString("cc_back"), null) { Left = labelL, Top = buttons, Width = 10, Height = 1 } }, { "next", new UIButton(i18n.GetString("cc_next"), null) { Left = labelL + 23, Top = buttons, Width = 10, Height = 1 } }, { "wait", new UILabel(i18n.GetString("cc_wait")) { Left = labelL + 23, Top = buttons, Foreground = Color.Silver } }, { "play", new UIButton(i18n.GetString("cc_play"), null) { Left = labelL + 23, Top = buttons, Width = 10, Height = 1, Hidden = true } }, { "nameLabel", new UILabel(i18n.GetString("cc_name")) { Left = labelL, Top = top, Foreground = Color.Gray } }, { "name", new UITextBox(string.Empty) { Left = cntrlL, Top = top + 1, Width = 24, Foreground = Color.Black, Background = Color.Transparent } }, { "nameRandom", new UILabel(i18n.GetString("cc_random")) { Left = cntrlL + 2, Top = top + 1, Foreground = Color.Gray } }, { "speciesLabel", new UILabel(i18n.GetString("cc_species")) { Left = labelL, Top = top + 3, Foreground = Color.Gray } }, { "species", new UISingleList() { Left = cntrlL, Top = top + 4, Width = 26, Foreground = Color.Black, Background = Color.Transparent } }, { "tutorial", new UIToggle(i18n.GetString("cc_tutorial")) { Left = labelL, Top = top + 6, Width = 24, Foreground = Color.Black, Background = Color.Transparent } }, { "easy", new UIToggle(i18n.GetString("cc_easy")) { Left = labelL, Top = top + 7, Width = 24, Foreground = Color.Black, Background = Color.Transparent } }, { "sexLabel", new UILabel(i18n.GetString("cc_sex")) { Left = labelL, Top = top, Foreground = Color.Gray } }, { "sex", new UIRadioList(sexoptions) { Left = cntrlL, Top = top + 1, Width = 24, Foreground = Color.Black, Background = Color.Transparent } }, { "gidLabel", new UILabel(i18n.GetString("cc_gid")) { Left = labelL, Top = top + 6, Foreground = Color.Gray } }, { "gid", new UISingleList(string.Empty, null, sexoptions.ToList(), 0) { Left = cntrlL, Top = top + 7, Width = 26, Foreground = Color.Black, Background = Color.Transparent } }, { "prefLabel", new UILabel(i18n.GetString("cc_pref")) { Left = labelL, Top = top + 9, Foreground = Color.Gray } }, { "pref", new UISingleList(string.Empty, null, prefoptions.ToList(), 1) { Left = cntrlL, Top = top + 10, Width = 26, Foreground = Color.Black, Background = Color.Transparent } }, { "giftLabel", new UILabel(i18n.GetString("cc_gift")) { Left = labelL, Top = top, Foreground = Color.Gray } }, { "gift", new UIList(string.Empty, null, traits) { Left = cntrlL, Top = top + 1, Width = 30, Height = 24, Foreground = Color.Black, Background = Color.Transparent } }, { "controlHelp", new UILabel(traitHelps[0]) { Left = 1, Top = 1, Width = pageLeft - 2, Height = 4, Foreground = Color.White, Darken = true } }, { "topHeader", new UILabel(i18n.GetString("cc_header")) { Left = 1, Top = 0, Foreground = Color.Silver } }, { "helpLine", new UILabel(i18n.GetString("cc_footer")) { Left = 1, Top = Program.Rows - 1, Foreground = Color.Silver } }, }; //Map the controls to pages. pages = new List <UIElement>[] { new List <UIElement>() { controls["backdrop"], controls["headerline"], controls["header"], controls["topHeader"], controls["helpLine"], controls["nameLabel"], controls["name"], controls["nameRandom"], controls["speciesLabel"], controls["species"], controls["tutorial"], controls["easy"], controls["controlHelp"], controls["next"], }, new List <UIElement>() { controls["backdrop"], controls["headerline"], controls["header"], controls["topHeader"], controls["helpLine"], controls["sexLabel"], controls["sex"], controls["gidLabel"], controls["gid"], controls["prefLabel"], controls["pref"], controls["controlHelp"], controls["back"], controls["next"], }, new List <UIElement>(), //Placeholder, filled in on-demand from PlayableRace.ColorItems. new List <UIElement>() { controls["backdrop"], controls["headerline"], controls["header"], controls["topHeader"], controls["helpLine"], controls["giftLabel"], controls["gift"], controls["controlHelp"], controls["back"], controls["wait"], controls["play"], }, }; CollectPlayables(); loadPage = new Action <int>(p => { UIManager.Elements.Clear(); UIManager.Elements.AddRange(pages[page]); UIManager.Highlight = UIManager.Elements[5]; //select whatever comes after helpLine. }); //Called when changing species. loadColors = new Action <int>(i => { var species = playables[i]; controlHelps["species"] = species.Bestiary; pages[2].Clear(); pages[2].AddRange(new[] { controls["backdrop"], controls["headerline"], controls["header"], controls["topHeader"], controls["helpLine"] }); pages[2].AddRange(species.ColorItems.Values); pages[2].AddRange(new[] { controls["controlHelp"], controls["back"], controls["next"] }); }); controls["back"].Enter = (s, e) => { page--; loadPage(page); UIManager.Draw(); }; controls["next"].Enter = (s, e) => { page++; loadPage(page); UIManager.Draw(); }; controls["play"].Enter = (s, e) => { var playerName = controls["name"].Text; var sex = ((UIRadioList)controls["sex"]).Value; var gid = ((UISingleList)controls["gid"]).Index; var pref = ((UISingleList)controls["pref"]).Index; var species = ((UISingleList)controls["species"]).Index; var tutorial = ((UIToggle)controls["tutorial"]).Checked; var easy = ((UIToggle)controls["easy"]).Checked; var bonus = ((UIList)controls["gift"]).Text; var colorMap = new Dictionary <string, string>(); foreach (var editable in playables[species].ColorItems) { if (editable.Key.StartsWith("lbl")) { continue; } var path = editable.Key; var value = ((UISingleList)editable.Value).Text; colorMap.Add(path, value); } NoxicoGame.Me.CreatePlayerCharacter(playerName.Trim(), (Gender)(sex + 1), (Gender)(gid + 1), pref, playables[species].ID, colorMap, bonus); if (tutorial) { NoxicoGame.Me.Player.Character.AddToken("tutorial"); } if (easy) { NoxicoGame.Me.Player.Character.AddToken("easymode"); } NoxicoGame.InGameTime = NoxicoGame.InGameTime.AddYears(Random.Next(0, 10)); NoxicoGame.InGameTime = NoxicoGame.InGameTime.AddDays(Random.Next(20, 340)); NoxicoGame.InGameTime = NoxicoGame.InGameTime.AddHours(Random.Next(10, 54)); NoxicoGame.Me.CurrentBoard.UpdateLightmap(NoxicoGame.Me.Player, true); Subscreens.FirstDraw = true; NoxicoGame.Immediate = true; /* #if DEBUG * NoxicoGame.Me.Player.Character.GetToken("items").AddToken("orgasm_denial_ring"); * NoxicoGame.Me.Player.Character.GetToken("items").AddToken("baseballbat"); * NoxicoGame.Me.Player.Character.GetToken("items").AddToken("really_kinky_panties"); * NoxicoGame.Me.Player.Character.GetToken("items").AddToken("timertest"); * NoxicoGame.Me.Player.Character.GetToken("items").AddToken("clit_regenring"); * NoxicoGame.Me.Player.Character.GetToken("items").AddToken("gExtractor"); * NoxicoGame.Me.Player.Character.GetToken("items").AddToken("strapon_ovi"); * NoxicoGame.Me.Player.Character.GetToken("items").AddToken("strapon"); #if FREETESTPOTIONS * NoxicoGame.Me.Player.Character.GetToken("items").AddToken("foxite"); // ok * NoxicoGame.Me.Player.Character.GetToken("items").AddToken("odd_nip"); // ok * //NoxicoGame.Me.Player.Character.GetToken("items").AddToken("dogmorph"); no bodyplan * //NoxicoGame.Me.Player.Character.GetToken("items").AddToken("bunnymorph"); no bodyplan * NoxicoGame.Me.Player.Character.GetToken("items").AddToken("chaos_potion"); // ok * NoxicoGame.Me.Player.Character.GetToken("items").AddToken("enhanced_chaos_potion"); // ok * NoxicoGame.Me.Player.Character.GetToken("items").AddToken("demonite_potion"); * NoxicoGame.Me.Player.Character.GetToken("items").AddToken("tentacle_potion"); * NoxicoGame.Me.Player.Character.GetToken("items").AddToken("cock_potion"); * NoxicoGame.Me.Player.Character.GetToken("items").AddToken("corrupted_cock_potion"); * NoxicoGame.Me.Player.Character.GetToken("items").AddToken("neutralizer_potion"); * NoxicoGame.Me.Player.Character.GetToken("items").AddToken("spidermorph"); #endif #endif */ NoxicoGame.AddMessage(i18n.GetString("welcometonoxico"), Color.Yellow); NoxicoGame.AddMessage(i18n.GetString("rememberhelp")); //Story(); }; ((UISingleList)controls["species"]).Items.Clear(); playables.ForEach(x => ((UISingleList)controls["species"]).Items.Add(x.Name.Titlecase())); ((UISingleList)controls["species"]).Index = 0; loadColors(0); ((UIRadioList)controls["sex"]).ItemsEnabled = playables[0].SexLocks; controls["species"].Change = (s, e) => { var speciesIndex = ((UISingleList)controls["species"]).Index; loadColors(speciesIndex); var playable = playables[speciesIndex]; controlHelps["species"] = playable.Bestiary; controls["controlHelp"].Text = playable.Bestiary.Wordwrap(controls["controlHelp"].Width); var sexList = (UIRadioList)controls["sex"]; sexList.ItemsEnabled = playable.SexLocks; if (!sexList.ItemsEnabled[sexList.Value]) { //Uh-oh. Select the first non-disabled item. for (var i = 0; i < sexList.ItemsEnabled.Length; i++) { if (sexList.ItemsEnabled[i]) { sexList.Value = i; break; } } } //redrawBackdrop(0); UIManager.Draw(); }; controls["sex"].Change = (s, e) => { //redrawBackdrop(0); UIManager.Draw(); }; controls["name"].Change = (s, e) => { controls["nameRandom"].Hidden = !controls["name"].Text.IsBlank(); UIManager.Draw(); }; controls["gift"].Change = (s, e) => { var giftIndex = ((UIList)controls["gift"]).Index; controls["controlHelp"].Text = traitHelps[giftIndex].Wordwrap(controls["controlHelp"].Width); controls["controlHelp"].Top = controls["gift"].Top + giftIndex; UIManager.Draw(); }; ((UIToggle)controls["tutorial"]).Checked = IniFile.GetValue("misc", "tutorial", true); ((UIToggle)controls["easy"]).Checked = IniFile.GetValue("misc", "easymode", false); UIManager.Initialize(); UIManager.HighlightChanged = (s, e) => { var c = controls.FirstOrDefault(x => x.Value == UIManager.Highlight); if (c.Key != null && controlHelps.ContainsKey(c.Key)) { controls["controlHelp"].Text = controlHelps[c.Key].Wordwrap(controls["controlHelp"].Width); controls["controlHelp"].Top = c.Value.Top; } else { controls["controlHelp"].Text = string.Empty; } UIManager.Draw(); }; loadPage(page); //redrawBackdrop(0); Subscreens.FirstDraw = false; Subscreens.Redraw = true; UIManager.HighlightChanged(null, null); NoxicoGame.Sound.PlayMusic("set://Character Creation", false); NoxicoGame.InGame = false; } if (Subscreens.Redraw) { UIManager.Draw(); Subscreens.Redraw = false; } if (WorldGenFinished) { WorldGenFinished = false; controls["play"].Hidden = false; UIManager.Draw(); } UIManager.CheckKeys(); }
public object RunScript(Token item, string script, Character character, BoardChar boardchar, Action <string> running) { var env = Lua.Environment; env.user = character; env.thisItem = this; env.thisToken = item; env.Consume = new Action <string>(x => this.Consume(character, item) /* character.GetToken("items").Tokens.Remove(item) */); env.print = new Action <string, bool>((x, y) => { var paused = true; MessageBox.ScriptPauseHandler = () => { paused = false; }; MessageBox.Notice((y ? x : x.Viewpoint(character)), true); while (paused) { NoxicoGame.Me.Update(); System.Windows.Forms.Application.DoEvents(); } }); env.ReportSet = new Action <List <string> >(x => { foreach (var result in x) { if (!result.IsBlank() && result[0] != '\uE2FC') { NoxicoGame.AddMessage(result.Viewpoint(character)); } } }); env.Identify = new Action <string>(x => { if (character.GetStat("mind") < 10) { //Dumb characters can't identify as well. if (Random.NextDouble() < 0.5) { return; } } //Random potion identification /* * if (this.HasToken("randomized")) * { * var rid = (int)this.GetToken("randomized").Value; * if (this.Path("equipable/ring") != null && rid < 128) * rid += 128; * var rdesc = NoxicoGame.Me.Potions[rid]; * if (rdesc[0] != '!') * { * //Still unidentified. Let's rock. * rdesc = '!' + rdesc; * NoxicoGame.Me.Potions[rid] = rdesc; * this.UnknownName = null; * } * //Random potions and rings are un-unidentified by taking away their UnknownName, but we clear the unidentified state anyway. * //item.RemoveToken("unidentified"; * //runningDesc += "You have identified this as " + this.ToString(item, true) + "."; * //return; * } */ //Regular item identification if (!this.UnknownName.IsBlank() && !NoxicoGame.Identifications.Contains(this.ID)) { NoxicoGame.Identifications.Add(this.ID); if (running != null) { running(i18n.Format("inventory_identify_as_x", this.ToString(item, true))); } } }); //var ret = env.DoChunk(script, "lol.lua"); return(Lua.Run(script, env)); }
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)); } }
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 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 void QuickFire(Direction targetDirection) { NoxicoGame.Modifiers[0] = false; if (this.ParentBoard.BoardType == BoardType.Town && !this.ParentBoard.HasToken("combat")) { return; } var weapon = Character.CanShoot(); if (weapon == null) { return; //Don't whine about it. } var weap = weapon.GetToken("weapon"); if (weap.HasToken("ammo")) { var ammoName = weap.GetToken("ammo").Text; var carriedAmmo = this.Character.GetToken("items").Tokens.Find(ci => ci.Name == ammoName); if (carriedAmmo == null) { return; } var knownAmmo = NoxicoGame.KnownItems.Find(ki => ki.ID == ammoName); if (knownAmmo == null) { return; } knownAmmo.Consume(Character, carriedAmmo); } else if (weapon.HasToken("charge")) { var carriedGun = this.Character.GetToken("items").Tokens.Find(ci => ci.Name == weapon.ID && ci.HasToken("equipped")); weapon.Consume(Character, carriedGun); } if (weapon == null) { return; } Energy -= 500; var x = this.XPosition; var y = this.YPosition; var distance = 0; var range = (int)weapon.Path("weapon/range").Value; //var damage = (int)weapon.Path("weapon/damage").Value; var skill = weap.GetToken("skill").Text; Func <int, int, bool> gotHit = (xPos, yPos) => { if (this.ParentBoard.IsSolid(y, x, SolidityCheck.Projectile)) { FireLine(weapon.Path("effect"), x, y); return(true); } var hit = this.ParentBoard.Entities.OfType <BoardChar>().FirstOrDefault(e => e.XPosition == x && e.YPosition == y); if (hit != null) { var damage = weap.Path("damage").Value *GetDefenseFactor(weap, hit.Character); var overallArmor = 0f; foreach (var targetArmor in hit.Character.GetToken("items").Tokens.Where(t => t.HasToken("equipped"))) { var targetArmorItem = NoxicoGame.KnownItems.FirstOrDefault(i => i.Name == targetArmor.Name); if (targetArmorItem == null) { continue; } if (!targetArmorItem.HasToken("armor")) { continue; } if (targetArmorItem.GetToken("armor").Value > overallArmor) { overallArmor = Math.Max(1.5f, targetArmorItem.GetToken("armor").Value); } } if (overallArmor != 0) { damage /= overallArmor; } FireLine(weapon.Path("effect"), x, y); NoxicoGame.AddMessage(i18n.Format("youhitxfory", hit.Character.GetKnownName(false, false, true), damage, i18n.Pluralize("point", (int)Math.Ceiling(damage)))); hit.Hurt(damage, "death_shot", this, false); this.Character.IncreaseSkill(skill); return(true); } return(false); }; if (targetDirection == Direction.East) { for (x++; x < this.ParentBoard.Width && distance < range; x++, distance++) //TODO: confirm if boardspace or screenspace { if (gotHit(x, y)) { break; } } } else if (targetDirection == Direction.West) { for (x--; x >= 0 && distance < range; x--, distance++) { if (gotHit(x, y)) { break; } } } else if (targetDirection == Direction.South) { for (y++; y < this.ParentBoard.Height && distance < range; y++, distance++) //TODO: confirm if boardspace or screenspace { if (gotHit(x, y)) { break; } } } else if (targetDirection == Direction.North) { for (y--; y >= 0 && distance < range; y--, distance++) { if (gotHit(x, y)) { break; } } } }
/// <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; } } ); } }
/// <summary> /// Ascertains that the Lua environment has various Noxico-specific types and functions. /// </summary> /// <param name="env"></param> public static void Ascertain(dynamic env = null) { if (env == null) { env = Environment; } if (env.player == null && NoxicoGame.HostForm != null && NoxicoGame.Me.Player != null) { env.player = NoxicoGame.Me.Player; } if (env.ascertained != null) { return; } env.RegisterVPTags = new Action <LuaTable>(t => i18n.RegisterVPTags(t)); env.dofile = new Func <object, LuaResult>(f => RunFile(f.ToString())); //Replace IronLua's printer with our own. Why? Because f**k you. env.print = new Action <object[]>(x => { if (x.Length == 1 && x[0] is LuaTable) { Program.WriteLine("Table: {{ " + ((LuaTable)x[0]).Values.Select(v => string.Format("{0} = {1}", v.Key, v.Value is string? '\"' + v.Value.ToString() + '\"' : v.Value)).Join() + " }}"); } else { Program.WriteLine(string.Join("\t", x.Select(v => v ?? "nil"))); } }); //TODO: predefine ALL THE THINGS. var env2 = (LuaGlobal)env; env2.RegisterPackage("Board", typeof(Board)); env2.RegisterPackage("BoardChar", typeof(BoardChar)); env2.RegisterPackage("BoardType", typeof(BoardType)); env2.RegisterPackage("Character", typeof(Character)); env2.RegisterPackage("Clutter", typeof(Clutter)); env2.RegisterPackage("Color", typeof(Color)); env2.RegisterPackage("Door", typeof(Door)); env2.RegisterPackage("DroppedItem", typeof(DroppedItem)); env2.RegisterPackage("Entity", typeof(Entity)); env2.RegisterPackage("Gender", typeof(Gender)); env2.RegisterPackage("InventoryItem", typeof(InventoryItem)); env2.RegisterPackage("MorphReport", typeof(MorphReportLevel)); env2.RegisterPackage("Mutations", typeof(Mutations)); env2.RegisterPackage("Random", typeof(Random)); env2.RegisterPackage("Realms", typeof(Realms)); //env2.RegisterPackage("Stat", typeof(Stat)); env2.RegisterPackage("SceneSystem", typeof(SceneSystem)); env2.RegisterPackage("Tile", typeof(Tile)); env2.RegisterPackage("Warp", typeof(Warp)); //env2.RegisterPackage("Task", typeof(Task)); //env2.RegisterPackage("TaskType", typeof(TaskType)); env2.RegisterPackage("Token", typeof(Token)); env2.RegisterPackage("Descriptions", typeof(Descriptions)); env2.RegisterPackage("i18n", typeof(i18n)); env2.RegisterPackage("Toolkit", typeof(Toolkit)); env.PlaySound = new Action <string>(x => NoxicoGame.Sound.PlaySound(x)); env.Message = new Action <object, object>((x, y) => NoxicoGame.AddMessage(x, y)); env.Titlecase = new Func <string, string>(x => x.Titlecase()); env.GetBoard = new Func <int, Board>(x => NoxicoGame.Me.GetBoard(x)); env.GetBiomeByName = new Func <string, int>(BiomeData.ByName); env.StartsWithVowel = new Func <string, bool>(x => x.StartsWithVowel()); /* * //Because apparently we can't use the Color type directly anymore? * //Turns out this was because RegisterPackage is a thing you need for Types. * env.colors = new LuaTable(); * for (var i = 0; i < 16; i++) * env.colors[i] = Color.FromCGA(i); * foreach (var c in new[] { * "Black", "Silver", "Gray", "White", "Maroon", "Red", * "Purple", "Fuchsia", "Green", "Lime", "Olive", "Yellow", * "Navy", "Blue", "Teal", "Aqua", "Brown", "Orange", "DarkGray" * }) * env.colors[c] = Color.FromName(c); * env.colors.Get = new Func<object, Color>(x => * { * if (x is string) return Color.FromName((string)x); * if (x is int) return Color.FromArgb((int)x); * return Color.Black; * }); */ env.DefineStats = new Action <object, object>((x, y) => StatusDisplay.DefineStats(x, y)); RunFile("init.lua"); env.ascertained = true; }