コード例 #1
0
        private bool ValidateMoveArrow()
        {
            Game_Unit selected_unit = get_selected_unit();

            if (Move_Arrow.Any() && selected_unit != null)
            {
                int moveCost = 0;
                for (int i = 1; i < Move_Arrow.Count; i++)
                {
                    Move_Arrow_Data loc = Move_Arrow[i];
                    moveCost += selected_unit.move_cost(new Vector2(loc.X, loc.Y));
                }

                // If the arrow has exceeded the move score
                if (moveCost > selected_unit.canto_mov)
                {
                    Move_Arrow.Clear();
                    Selected_Move_Total = 0;
                    return(false);
                }
                else
                {
                    Selected_Move_Total = moveCost;
                }
            }

            return(true);
        }
コード例 #2
0
        protected void reset_move_arrow(Vector2 target_loc, int range)
        {
            // this method throws index out of range sometimes \o_O?
#if DEBUG
            var move_arrow = new List <Move_Arrow_Data>(Move_Arrow);
#endif
            Move_Arrow.Clear();
            var map = new Pathfinding.UnitMovementMap.Builder()
                      .Build(Global.game_system.Selected_Unit_Id);
            List <Vector2> route2 = map.convert_to_motions(
                map.get_route(target_loc, range));
            List <Vector2> route = map.convert_to_motions(
                map.get_reverse_route(target_loc, range));

            Game_Unit selected_unit = get_selected_unit();
            Vector2   current_loc   = selected_unit.loc;

#if DEBUG
            if (route == null)
            {
                throw new Exception(string.Format(
                                        "Attempted move route is null\nDisplayed move range likely doesn't match actual move range\n{0},{1} to {2},{3}",
                                        (int)current_loc.X, (int)current_loc.Y,
                                        (int)target_loc.X, (int)target_loc.Y));
                Move_Arrow = move_arrow;
                return;
            }
#endif

            if (route.Count == 0 || route.Count > range)
            {
                if (route.Count != route2.Count)
                {
                }
                for (int i = 0; i < route.Count; i++)
                {
                    if (route[i] != route2[i])
                    {
                    }
                }
            }

            Selected_Move_Total = 0;
            Move_Arrow.Add(new Move_Arrow_Data((int)current_loc.X, (int)current_loc.Y, 15));

            while (route.Count > 0)
            {
                Vector2 dir = route.pop();
                current_loc         += dir;
                Selected_Move_Total += selected_unit.move_cost(current_loc);
                Move_Arrow.Add(new Move_Arrow_Data((int)current_loc.X, (int)current_loc.Y, move_arrow_facing(dir)));
                Move_Arrow[Move_Arrow.Count - 2].Frame =
                    fix_arrow_turn(Move_Arrow[Move_Arrow.Count - 1].Frame, Move_Arrow[Move_Arrow.Count - 2].Frame);
            }
        }
コード例 #3
0
        public void clear_move_range(bool resetMoveArrow = true)
        {
            lock (Move_Range_Lock)
            {
                Move_Range.Clear();
                Attack_Range.Clear();
                Staff_Range.Clear();
                Talk_Range.Clear();

                if (resetMoveArrow)
                {
                    Move_Arrow.Clear();
                    Selected_Move_Total = 0;
                }
            }
        }
コード例 #4
0
        public void update_move_arrow()
        {
            if (Global.game_temp.menu_call || Global.game_state.is_menuing ||
                (get_scene_map() != null && ((Scene_Map)Global.scene).changing_formation))
            {
                return;
            }
            if (Global.game_system.Selected_Unit_Id == -1)
            {
                Move_Arrow.Clear();
            }
            else
            {
                Game_Unit selected_unit = get_selected_unit();
                int       range         = selected_unit.canto_mov;
                // If the cursor is in the move range
                if (Move_Range.Contains(Global.player.loc))
                {
                    if (Global.player.loc == selected_unit.loc)
                    {
                        Move_Arrow.Clear();
                    }
                    else
                    {
                        int x = (int)Global.player.loc.X;
                        int y = (int)Global.player.loc.Y;
                        // Test if the cursor location already exists in the move arrow
                        if (Move_Arrow.Count > 0)
                        {
                            // Test if the cursor is already at the endpoint
                            if (x == Move_Arrow[Move_Arrow.Count - 1].X && y == Move_Arrow[Move_Arrow.Count - 1].Y)
                            {
                                return;
                            }
                            // Test if the cursor is somewhere else on the list
                            bool already_on_list = false;
                            int  i;
                            for (i = 0; i < Move_Arrow.Count - 1; i++)
                            {
                                if (Move_Arrow[i].X == x && Move_Arrow[i].Y == y)
                                {
                                    already_on_list = true;
                                    break;
                                }
                            }
                            if (already_on_list)
                            {
                                int j = Move_Arrow.Count - 1;
                                while (j >= i)
                                {
                                    Move_Arrow_Data loc = Move_Arrow[j];
                                    Selected_Move_Total -= selected_unit.move_cost(new Vector2(loc.X, loc.Y));
                                    if (Move_Arrow.Count >= 3)
                                    {
                                        Move_Arrow[Move_Arrow.Count - 2].Frame =
                                            unfix_arrow_turn(Move_Arrow[Move_Arrow.Count - 1].Frame,
                                                             Move_Arrow[Move_Arrow.Count - 2].Frame);
                                    }
                                    Move_Arrow.pop();
                                    j--;
                                }
                            }
                        }

                        bool adjacent = Move_Arrow.Count == 1;
                        if (Move_Arrow.Count > 1)
                        {
                            Vector2 test_loc = new Vector2(
                                Move_Arrow[Move_Arrow.Count - 1].X, Move_Arrow[Move_Arrow.Count - 1].Y);
                            foreach (int[] test in new int[][] {
                                new int[] { -1, 0 }, new int[] { 1, 0 }, new int[] { 0, -1 }, new int[] { 0, 1 }
                            })
                            {
                                if (test[0] + x == test_loc.X && test[1] + y == test_loc.Y)
                                {
                                    adjacent = true;
                                    break;
                                }
                            }
                        }
                        if (!adjacent)
                        {
                        }
                        Selected_Move_Total += selected_unit.move_cost(Global.player.loc);
                        if (Selected_Move_Total > range || !adjacent)
                        {
                            reset_move_arrow(Global.player.loc, range);
                        }
                        else
                        {
                            Vector2 dir = new Vector2(x, y) - new Vector2(
                                Move_Arrow[Move_Arrow.Count - 1].X, Move_Arrow[Move_Arrow.Count - 1].Y);
                            Move_Arrow.Add(new Move_Arrow_Data(x, y, move_arrow_facing(dir)));
                            Move_Arrow[Move_Arrow.Count - 2].Frame =
                                fix_arrow_turn(Move_Arrow[Move_Arrow.Count - 1].Frame, Move_Arrow[Move_Arrow.Count - 2].Frame);
                        }
                    }
                }
            }
        }