Пример #1
0
        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)));
                }
            }
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
                }
            }
        }