public void UnitRotate(uint userId, int dir) { User user = d.GetUser(userId); Unit unit = user.GetSelectUnit(); Battle battle = d.GetBattle(user.battleId); if (!battle.IsUserTurn(userId)) { return; } int ap = GameUtil.CalcDir(unit.dir, dir) * GameData.unitInfo[unit.id].apRotate; if (unit.ap < ap) { return; } unit.ap -= ap; unit.dir = dir; BattleData data = battle.GetData(); for (int i = 0; i < data.users.Count; i++) { Vector2w pos = d.GetBattleUnitPos(data.users[i].userid); if (data.users[i].userid == userId || VisiblePoint.IsVisible(unit.pos, pos, battle.GetMap(), GameData.blockInfo)) { Data.t.netMsg.Add(new MsgServerGameAction(data.users[i].userid, new GameActionRotateUnit(unit.uid, unit.dir, unit.pos))); Data.t.netMsg.Add(new MsgServerGameAction(data.users[i].userid, new GameActionInfoUnit(unit))); } } }
private void ClampRoad(List <Vector2w> road, int ap, int dir, UnitInfoItem unitInfo) { int curDir = dir; int count = 0; for (int i = 0; i < road.Count - 1; i++) { int direction = GameUtil.GetDir(road[i], road[i + 1]); if (direction != curDir) { ap -= GameUtil.CalcDir(curDir, direction) * unitInfo.apRotate; if (ap < 0) { break; } } ap -= unitInfo.apMove; if (ap < 0) { break; } count++; } road.RemoveRange(count, road.Count - count); }
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); } } }