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); }
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); } }
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; } } }
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); } } } } }