private void PlaceCharacters() { // TODO Log.Info("Placing characters"); int x = 16; int y = 9; foreach (var player in GameFlowData.Get().GetPlayers()) { //UnityUtils.DumpGameObject(player); ActorData actorData = player.GetComponent <ActorData>(); var atsd = actorData.TeamSensitiveData_authority; if (atsd == null) { continue; } BoardSquare start = Board.Get().GetSquare(x++, y); GridPosProp startProp = GridPosProp.FromGridPos(start.GetGridPosition()); atsd.CallRpcMovement(GameEventManager.EventType.Invalid, startProp, startProp, null, ActorData.MovementType.Teleport, false, false); actorData.ServerLastKnownPosSquare = start; actorData.InitialMoveStartSquare = start; actorData.MoveFromBoardSquare = start; Log.Info($"Placing {actorData.DisplayName} at {startProp.m_x}, {startProp.m_y}"); // PATCH internal -> public ActorData.DisplayName } Log.Info("Done placing characters"); }
public AbilityResolver_TrapWire(ActorData actor, Ability ability, AbilityPriority priority, ActorTargeting.AbilityRequestData abilityRequestData) : base(actor, ability, priority, abilityRequestData) { BoardSquare square = GetGameplayRefSquare(abilityRequestData.m_targets[0], m_caster); m_targetSquare = square.GetGridPosition(); m_targetPos = GetHighlightGoalPos(Targeter, abilityRequestData.m_targets[0], m_caster); // TODO fix height if it matters (probably just different heights on different maps) Vector3 pos = m_targetPos * 2 - square.GetWorldPosition(); m_secondarySquare = Board.Get().GetSquare(pos).GetGridPosition(); }
private BoardSquarePathInfo BackOff(ActorData actor, BoardSquarePathInfo pathEnd, HashSet <GridPos> occupiedSquares) { if (actor == null) { Log.Error($"Backoff failed because actor is null!"); return(null); } Log.Info($"Calculating backoff for {actor.DisplayName}"); BoardSquare dest = pathEnd.prev?.square ?? pathEnd.square; if (occupiedSquares.Contains(dest.GetGridPosition())) { bool diagMovementAllowed = GameplayData.Get().m_diagonalMovement != GameplayData.DiagonalMovement.Disabled; List <BoardSquare> neighbours = new List <BoardSquare>(8); Queue <BoardSquare> candidates = new Queue <BoardSquare>(); candidates.Enqueue(pathEnd.square); while (candidates.Count > 0) { BoardSquare s = candidates.Dequeue(); if (!occupiedSquares.Contains(s.GetGridPosition())) { dest = s; break; } neighbours.Clear(); if (!diagMovementAllowed) { Board.Get().GetStraightAdjacentSquares(s.x, s.y, ref neighbours); } else { Board.Get().GetAllAdjacentSquares(s.x, s.y, ref neighbours); } neighbours.Sort(delegate(BoardSquare a, BoardSquare b) { return(dest.HorizontalDistanceInWorldTo(a).CompareTo(dest.HorizontalDistanceInWorldTo(b))); }); foreach (var n in neighbours) { if (n.IsBoardHeight()) { candidates.Enqueue(n); } } } } if (occupiedSquares.Contains(dest.GetGridPosition())) { Log.Error($"Backoff failed to find a free square for {actor.DisplayName}!"); } occupiedSquares.Add(dest.GetGridPosition()); BoardSquarePathInfo result = actor.GetActorMovement().BuildPathTo_IgnoreBarriers(pathEnd.square, dest); result.heuristicCost += pathEnd.heuristicCost; // not actually correct but shouldn't matter result.moveCost += pathEnd.moveCost; result.m_moverBumpedFromClash = true; return(result); }