public void UnitMove(uint userId, Vector2w pos) { User user = d.GetUser(userId); Unit unit = user.GetSelectUnit(); Battle battle = d.GetBattle(user.battleId); if (!battle.IsUserTurn(userId)) { return; } List <Vector2w> road = new List <Vector2w>(); if (battle.findRoad.Find(unit.pos, pos, battle.GetMap(), GameData.blockInfo, road)) { ClampRoad(road, unit.ap, unit.dir, GameData.unitInfo[unit.id]); if (road.Count > 1)//move { UnitVisible unitVisible = CreateUnitVisible(userId, unit.pos, battle); battle.GetMap().RemoveUnitPos(unit.pos); List <GameAction> actions = new List <GameAction>(); for (int i = 1; i < road.Count; i++) { int direction = GameUtil.GetDir(road[i - 1], road[i]); if (unit.dir != direction) { unit.ap -= GameUtil.CalcDir(unit.dir, direction) * GameData.unitInfo[unit.id].apRotate; unit.dir = direction; actions.Add(new GameActionRotateUnit(unit.uid, unit.dir, unit.pos)); } unit.ap -= GameData.unitInfo[unit.id].apMove; unit.pos = road[i]; actions.Add(new GameActionMoveUnit(unit.uid, unit.pos)); //проверка обнаруженных юнитов и остановка if (IsNewUnitVisible(unitVisible, userId, unit.pos, battle)) { break; } } battle.GetMap().SetUnitPos(unit.pos); SendAllMoveUnit(userId, unit, battle, actions); SendAllInfoUnit(unit, battle); //обновление видимости вражеских юнитов UpdateEnemyVisible(userId, unit.pos, battle); } } }
private bool IsNewUnitVisible(UnitVisible unitVisible, uint userId, Vector2w pos, Battle battle) { var data = battle.GetData(); for (int i = 0; i < data.users.Count; i++) { if (data.users[i].userid != userId) { Vector2w unitPos = d.GetBattleUnitPos(userId); if (VisiblePoint.IsVisible(pos, unitPos, battle.GetMap(), GameData.blockInfo) && !unitVisible.IsVisible(data.users[i].userid)) { return(true); } } } return(false); }
private UnitVisible CreateUnitVisible(uint userId, Vector2w pos, Battle battle) { UnitVisible unitVisible = new UnitVisible(); var data = battle.GetData(); for (int i = 0; i < data.users.Count; i++) { if (data.users[i].userid != userId) { Vector2w unitPos = d.GetBattleUnitPos(userId); if (VisiblePoint.IsVisible(pos, unitPos, battle.GetMap(), GameData.blockInfo)) { unitVisible.AddVisible(data.users[i].userid); } } } return(unitVisible); }
void SetVisible(UnitVisible elem) { elem.State = UnitVisible.TypeVisible.Visible; }
void SetFade(UnitVisible elem) { elem.State = UnitVisible.TypeVisible.Fade; }