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); } }
//called by EffectTracker public void IterateForcedVisibleDuration() { forcedVisibleDuration.Iterate(); if (forcedVisibleDuration.Due()) { SetVisible(FogOfWar.CheckTileVisibility(this)); EffectTracker.UntrackVisible(this); } //~ forcedVisible.Iterate(); //~ if(forcedVisible.duration<=0){ //~ SetVisible(FogOfWar.CheckTileVisibility(this)); //~ if(fogOfWarObj!=null) fogOfWarObj.SetActive(!visible); //~ //GameControl.onIterateTurnE -= IterateForcedVisible; //~ } }
//analyse the grid to know where the unit should move to private Tile Analyse(Unit unit, _AIMode activeMode) { //get all wakable tiles in range first List <Tile> walkableTilesInRange = GridManager.GetTilesWithinDistance(unit.tile, unit.GetEffectiveMoveRange(), true); walkableTilesInRange.Add(unit.tile); //get all visible hostile List <Unit> allHostileInSight = FactionManager.GetAllHostileUnit(unit.factionID); if (GameControl.EnableFogOfWar()) { for (int i = 0; i < allHostileInSight.Count; i++) { if (!FogOfWar.IsTileVisibleToFaction(allHostileInSight[i].tile, unit.factionID)) { allHostileInSight.RemoveAt(i); i -= 1; } } } //if cover system is in used if (GameControl.EnableCover()) { Tile tile = AnalyseCoverSystem(unit, walkableTilesInRange, allHostileInSight); if (tile != null) { return(tile); } } //if there are hostile if (allHostileInSight.Count > 0) { //fill up the walkableTilesInRange hostile list //then filter thru walkableTilesInRange, those that have a hostile in range will be add to a tilesWithHostileInRange List <Tile> tilesWithHostileInRange = new List <Tile>(); GridManager.SetupHostileInRangeforTile(unit, walkableTilesInRange); for (int i = 0; i < walkableTilesInRange.Count; i++) { if (walkableTilesInRange[i].GetHostileInRange().Count > 0) { tilesWithHostileInRange.Add(walkableTilesInRange[i]); } } //if the tilesWithHostileInRange is not empty after the process, means there's tiles which the unit can move into and attack //return one of those in the tilesWithHostileInRange so the unit can attack if (tilesWithHostileInRange.Count > 0) { //if the unit current tile is one of those tiles with hostile, just stay put and attack if (tilesWithHostileInRange.Contains(unit.tile)) { //randomize it a bit so the unit do move around but not stay in place all the time if (Random.Range(0f, 1f) > 0.25f) { return(unit.tile); } } return(tilesWithHostileInRange[Random.Range(0, tilesWithHostileInRange.Count)]); } } //if there's not potential target at all, check if the unit has any previous attacker //if there are, go after the last attacker if (unit.lastAttacker != null) { return(unit.lastAttacker.tile); } //for aggresive mode with FogOfWar disabled, try move towards the nearest unit if (activeMode == _AIMode.Aggressive && Random.Range(0f, 1f) > 0.25f) { List <Unit> allHostile = FactionManager.GetAllHostileUnit(unit.factionID); float nearest = Mathf.Infinity; int nearestIndex = 0; for (int i = 0; i < allHostile.Count; i++) { float dist = GridManager.GetDistance(allHostile[i].tile, unit.tile); if (dist < nearest) { nearest = dist; nearestIndex = i; } } return(allHostile[nearestIndex].tile); } //if there's really no hostile to go after, then just move randomly in one of the walkable int rand = Random.Range(0, walkableTilesInRange.Count); //clear in hostileInRange list for all moveable tile so, just in case the list is not empty (hostileInRange dont clear after each move) //so the unit dont try to attack anything when it moves into the targetTile walkableTilesInRange[rand].SetHostileInRange(new List <Tile>()); return(walkableTilesInRange[rand]); }
//called by GameControl to setup the grid for Fog-of-war public static void SetupGridForFogOfWar(){ FogOfWar.InitGrid(instance.grid.tileList); }
//~ 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); }