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);
        }
Exemple #4
0
 void SetVisible(UnitVisible elem)
 {
     elem.State = UnitVisible.TypeVisible.Visible;
 }
Exemple #5
0
 void SetFade(UnitVisible elem)
 {
     elem.State = UnitVisible.TypeVisible.Fade;
 }