public static void SetupHostileInRangeforTile(Unit unit, List<Tile> tileList){ List<Unit> allUnitList=FactionManager.GetAllUnit(); List<Unit> allHostileUnitList=new List<Unit>(); for(int i=0; i<allUnitList.Count; i++){ if(allUnitList[i].factionID!=unit.factionID) allHostileUnitList.Add(allUnitList[i]); } List<Unit> allFriendlyUnitList=new List<Unit>(); if(GameControl.EnableFogOfWar()) allFriendlyUnitList=FactionManager.GetAllUnitsOfFaction(unit.factionID); int range=unit.GetAttackRange(); int rangeMin=unit.GetAttackRangeMin(); int sight=unit.GetSight(); for(int i=0; i<tileList.Count; i++){ Tile srcTile=tileList[i]; List<Tile> hostileInRangeList=new List<Tile>(); for(int j=0; j<allHostileUnitList.Count; j++){ Tile targetTile=allHostileUnitList[j].tile; if(GridManager.GetDistance(srcTile, targetTile)>range) continue; if(GridManager.GetDistance(srcTile, targetTile)<rangeMin) continue; if(!GameControl.EnableFogOfWar() && !GameControl.AttackThroughObstacle()){ if(!FogOfWar.InLOS(srcTile, targetTile, 0)) continue; } bool inSight=GameControl.EnableFogOfWar() ? false : true; if(GameControl.EnableFogOfWar()){ if(FogOfWar.InLOS(srcTile, targetTile) && GridManager.GetDistance(srcTile, targetTile)<=sight){ inSight=true; } else if(!unit.requireDirectLOSToAttack){ for(int n=0; n<allFriendlyUnitList.Count; n++){ if(allFriendlyUnitList[n]==unit) continue; if(GridManager.GetDistance(allFriendlyUnitList[n].tile, targetTile)>allFriendlyUnitList[n].GetSight()) continue; if(FogOfWar.InLOS(allFriendlyUnitList[n].tile, targetTile)){ inSight=true; break; } } } } if(inSight) hostileInRangeList.Add(targetTile); } tileList[i].SetHostileInRange(hostileInRangeList); } }
//~ public void ActivateTargetModeUnit(Tile tile, int range, int AOE, bool normalAttack, bool requireDirectLOS, _TargetType type, TargetModeCallBack sCallBack, TargetModeCallBack eCallBack){ public void ActivateTargetModeUnit(Tile tile, UnitAbility ability, int abIndex, TargetModeCallBack sCallBack, ExitTargetModeCallBack eCallBack) { TBTK.OnUnitABTargetMode(abIndex); _ActivateTargetMode(abIndex, ability.GetAOERange(), ability.targetType, sCallBack, eCallBack); if (!ability.AttackInLine()) { if (!ability.normalAttack) { if (targetModeType == _TargetType.EmptyTile) { targetModeTileList = GridManager.GetTilesWithinDistance(tile, ability.GetRange(), true); } else { targetModeTileList = GridManager.GetTilesWithinDistance(tile, ability.GetRange()); } } else { targetModeTileList = new List <Tile>(); List <Tile> tilesInRangeList = GridManager.GetTilesWithinDistance(tile, ability.GetRange()); int sight = tile.unit.GetSight(); List <Unit> allFriendlyUnitList = FactionManager.GetAllUnitsOfFaction(tile.unit.factionID); for (int i = 0; i < tilesInRangeList.Count; i++) { Tile targetTile = tilesInRangeList[i]; if (!GameControl.EnableFogOfWar() && !GameControl.AttackThroughObstacle()) { if (!FogOfWar.InLOS(tile, targetTile, 0)) { continue; } } bool inSight = GameControl.EnableFogOfWar() ? false : true; if (GameControl.EnableFogOfWar()) { if (FogOfWar.InLOS(tile, targetTile) && GridManager.GetDistance(tile, targetTile) <= sight) { inSight = true; } else if (!ability.requireDirectLOS) { for (int n = 0; n < allFriendlyUnitList.Count; n++) { if (allFriendlyUnitList[n] == tile.unit) { continue; } if (GridManager.GetDistance(allFriendlyUnitList[n].tile, targetTile) > allFriendlyUnitList[n].GetSight()) { continue; } if (FogOfWar.InLOS(allFriendlyUnitList[n].tile, targetTile)) { inSight = true; break; } } } } if (inSight) { targetModeTileList.Add(targetTile); } } } } else { /* * List<Tile> neighbourList=tile.GetNeighbourList(); * for(int i=0; i<neighbourList.Count; i++){ * bool walkableOnly=(ability.type==UnitAbility._AbilityType.ChargeAttack); * List<Tile> tileList=GridManager.GetTilesInALine(tile, neighbourList[i], ability.GetRange(), walkableOnly); * * if(tileList.Count>0){ * if(targetModeType!=_TargetType.EmptyTile) targetModeTileList.Add(tileList[tileList.Count-1]); * else if (tileList[tileList.Count-1].unit==null) targetModeTileList.Add(tileList[tileList.Count-1]); * } * } */ } //for(int i=0; i<targetModeTileList.Count; i++) targetModeTileList[i].SetState(_TileState.Range); OverlayManager.ShowAbilityRangeIndicator(targetModeTileList); }