예제 #1
0
        public void CheckWarps()
        {
            var warp = ParentBoard.Warps.Find(w => /* !String.IsNullOrEmpty(w.TargetBoard) && */ w.XPosition == XPosition && w.YPosition == YPosition);

            if (warp != null)
            {
                if (warp.TargetBoard == -1)                 //ungenerated dungeon
                {
                    DungeonGenerator.DungeonGeneratorEntranceBoardNum = ParentBoard.BoardNum;
                    DungeonGenerator.DungeonGeneratorEntranceWarpID   = warp.ID;
                    DungeonGenerator.DungeonGeneratorBiome            = (int)ParentBoard.GetToken("biome").Value;
                    DungeonGenerator.CreateDungeon();
                    return;
                }
                else if (warp.TargetBoard == -2)                 //unconnected dungeon
                {
                    Travel.Open();
                    return;
                }

                var game        = NoxicoGame.Me;
                var targetBoard = game.GetBoard(warp.TargetBoard);                 //game.Boards[warp.TargetBoard]; //.Find(b => b.ID == warp.TargetBoard);

                var sourceBoard = ParentBoard;

                ParentBoard.EntitiesToRemove.Add(this);
                game.CurrentBoard = targetBoard;
                ParentBoard       = targetBoard;
                ParentBoard.Entities.Add(this);
                var twarp = targetBoard.Warps.Find(w => w.ID == warp.TargetWarpID);
                if (twarp == null)
                {
                    XPosition = 0;
                    YPosition = 0;
                }
                else
                {
                    XPosition = twarp.XPosition;
                    YPosition = twarp.YPosition;
                }
                ParentBoard.AimCamera();
                ParentBoard.UpdateLightmap(this, true);
                ParentBoard.Redraw();
                ParentBoard.PlayMusic();
                NoxicoGame.Immediate = true;

                //Going from a dungeon to a wild board?
                if (targetBoard.GetToken("type").Value == 0 && sourceBoard.GetToken("type").Value == 2)
                {
                    game.FlushDungeons();
                }
            }
        }
예제 #2
0
        public void OpenBoard(int index)
        {
            if (this.ParentBoard != null)
            {
                this.ParentBoard.EntitiesToRemove.Add(this);
                this.ParentBoard.SaveToFile(this.ParentBoard.BoardNum);
            }
            var n = NoxicoGame.Me;

            this.ParentBoard = n.GetBoard(index);
            n.CurrentBoard   = this.ParentBoard;
            this.ParentBoard.Entities.Add(this);
            ParentBoard.CheckCombatStart();
            ParentBoard.CheckCombatFinish();
            ParentBoard.UpdateLightmap(this, true);
            ParentBoard.Redraw();
            ParentBoard.PlayMusic();
            NoxicoGame.Immediate = true;

            if (ParentBoard.BoardType == BoardType.Town)
            {
                var boardName = ParentBoard.Name;
                var known     = NoxicoGame.TravelTargets.ContainsValue(boardName);
                if (!known)
                {
                    NoxicoGame.TravelTargets.Add(index, boardName);
                    Program.WriteLine("Registered {0} as a fast-travel target.", boardName);
                }
            }

            this.ParentBoard.AimCamera(XPosition, YPosition);

            if (this.DijkstraMap != null)
            {
                this.DijkstraMap.UpdateWalls(ParentBoard, !Character.IsSlime);
                this.DijkstraMap.Update();
            }
            if (this.AutoTravelMap == null)
            {
                this.AutoTravelMap = new Dijkstra(this.ParentBoard);
                this.AutoTravelMap.Hotspots.Add(new Point(this.XPosition, this.YPosition));
            }
            this.AutoTravelMap.UpdateWalls(ParentBoard, !Character.IsSlime);
        }
예제 #3
0
        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);
                    }
                }
            }
        }
예제 #4
0
        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;
            }
        }