protected bool UnitPosValidation(List <Unit> units, List <Cube> cubes) { // 같은 큐브에 같은 유닛이 배치되어있는지 확인 foreach (Unit unit in units) { // plan속 유닛 APUnit apUnit = _gameState._units.Find(u => u.owner == unit); // plan에는 유닛이 있지만 실제론 없음 if (apUnit == null) { return(false); } // 실제론 unit이 존재하는 plan에는 없음 if (_gameState._unitPos.TryGetValue(apUnit, out _) == false) { return(false); } // 실제와 plan 둘다 해당 유닛이 있는데 Cube cubeInPlan; if (_gameState._unitPos.TryGetValue(apUnit, out cubeInPlan)) { // 다른 큐브에 있다면 if (cubeInPlan != unit.GetCube) { return(false); } } } return(true); }
public APUnit(APUnit apUnit) { owner = apUnit.owner; //cube = apUnit.cube; health = apUnit.health; actionPoint = apUnit.actionPoint; isSelf = apUnit.isSelf; }
public void RequestAsync(APGameState gameState, Action <List <PFPath> > OnServe) { List <INavable> navables = new List <INavable>(gameState._cubes); APUnit unit = gameState.self; int maxDistance = unit.actionPoint / unit.owner.GetActionSlot(ActionType.Move).cost; Cube start = gameState._unitPos[unit]; Func <INavable, bool> cubeIgnore = (cube) => { return(cube.IsAccupied() == true); }; StartCoroutine(BFSPathfinding(start, navables, unit.actionPoint, OnServe, cubeIgnore)); }
protected bool UnitHealthValidation(List <Unit> units) { foreach (Unit unit in units) { APUnit simulUnit = _gameState._units.Find(u => u.owner == unit); if (simulUnit == null) // 실제 유닛은 있지만 plan속 유닛이 없는 경우 { return(false); } if (simulUnit.health != unit.currHealth) // 둘다 있지만 체력이 다른 경우 { return(false); } } return(true); }
private IEnumerator Simulate_Coroutine(Action OnSimulationCompleted, List <APActionNode> attackNodes) { // 액션포인트가 충분한지부터 체크 if (_gameState.self.actionPoint < _gameState.self.owner.GetActionSlot(ActionType.Attack).cost) { OnSimulationCompleted(); yield break; } // 현실 큐브로 기본공격 범위를 먼저 Get Cube centerCube = _gameState._unitPos[_gameState.self]; List <Cube> cubesInAttackRange = MapMgr.Instance.GetCubes( _gameState.self.owner.basicAttackRange, centerCube ); // 공격 가능한 모든 곳으로 공격하는 모든 경우의 수는 List로 생성 foreach (Cube cube in cubesInAttackRange) { // 자기 자신의 위치를 공격하는 것은 예외처리 if (cube == centerCube) { continue; } // cubesInAttackRange안의 적유닛이 있는 한 큐브를 공격하는 AttackActionNode if (_gameState._unitPos.ContainsValue(cube)) { APUnit apUnit = _gameState._unitPos.FirstOrDefault(p => p.Value == cube).Key; Cube gameStateCube = _gameState._unitPos[apUnit]; if (gameStateCube != null && _gameState._unitPos[_gameState.self] != gameStateCube && _gameState.self.owner.team.enemyTeams.Contains(apUnit.owner.team)) { attackNodes.Add(ActionNode_Attack.Create(_gameState, _prevScore, _actionPointPanel, apUnit.owner)); } } yield return(null); } OnSimulationCompleted(); }
public override void SimulateSkillCasting(APUnit unit) { unit.health = Mathf.Max(unit.health - amountAvg, 0); }
public virtual void SimulateSkillCasting(APUnit unit) { }