Example #1
0
    // Map 產生完畢後呼叫, PS: 因為 load level 是 async, 所以 is done 由 map generator 判定
    public void TriggerMapGenerateDone()
    {
        if (_currentPlayStatus != PlayStatus.MapGenerating)
        {
            DebugLog("Status error. Should be MapGenerating");
            return;
        }

        DebugLog("蟲族先攻");

        _logic.InitialMap(MapGenerator.GeneratedData, MapGenerator.GeneratedHoleData);
        _currentPlayStatus = PlayStatus.RoundScarabTurn; //蟲族先攻

        DebugLog("PlayStatus: " + _currentPlayStatus.ToString());
    }
Example #2
0
    //------------  Map 控制相關 -------------------
    // player click a tile in Map, Top Left is 0, 0
    public void MapTileClick(MapBlockData data)
    {
        switch (_currentPlayStatus)
        {
        // 開始選擇要控制哪個 UNIT
        case PlayStatus.RoundHumanTurn:
        case PlayStatus.RoundScarabTurn:
            if (NowHitter == Creature.None)
            {
                DebugLog(" Status error : not round turn status. " + _currentPlayStatus.ToString());
                return;
            }

            UIManager.Instance.ScarabCount = _logic.ScarabCount;
            UIManager.Instance.HumanCount  = _logic.PeopleCount;

            IVector2 vec = new IVector2();
            vec.x = data.Column;
            vec.y = data.Row;
            ControlMessage controlMsg = _logic.CanControl(vec, NowHitter);

            if (controlMsg != ControlMessage.OK)
            {
                UIManager.Instance.ShowCenterMsg("you can't do it !");
                return;
            }

            // todo: some click effect
            if (_currentSelection != null)
            {
                _currentSelection.Block.CreatureComponent.UnHighLight();
            }

            // ready click 2
            if (NowHitter == Creature.People)
            {
                _currentPlayStatus = PlayStatus.RoundHumanReadyMove;
            }
            else if (NowHitter == Creature.Scarab)
            {
                _currentPlayStatus = PlayStatus.RoundScarabReadyMove;
            }
            _currentChoosedBlock = data;
            _currentSelection    = _currentChoosedBlock;
            _currentSelection.Block.CreatureComponent.HighLight();

            DebugLog("PlayStatus: " + _currentPlayStatus.ToString());
            break;

        // 開始選擇要移動到哪裡
        case PlayStatus.RoundHumanReadyMove:
        case PlayStatus.RoundScarabReadyMove:

            //debug
            //StartCoroutine(WaitReturnToMain()); //準備回到主畫面

            if (_currentSelection != null)
            {
                _currentSelection.Block.CreatureComponent.UnHighLight();
            }

            //檢查是否為重新選取 unit
            if ((data.Block.LivingObject == Creature.People) && (_currentPlayStatus == PlayStatus.RoundHumanReadyMove))
            {
                _currentPlayStatus = PlayStatus.RoundHumanTurn;     // 回到選取狀態
                MapTileClick(data);
                return;
            }
            else if ((data.Block.LivingObject == Creature.Scarab) && (_currentPlayStatus == PlayStatus.RoundScarabReadyMove))
            {
                _currentPlayStatus = PlayStatus.RoundScarabTurn;     // 回到選取狀態
                MapTileClick(data);
                return;
            }

            bool legal = _logic.IsLegalMove(_currentChoosedBlock.Block.Pos, data.Block.Pos);
            if (legal == false)
            {
                UIManager.Instance.ShowCenterMsg("wrong move position !");
                return;
            }

            List <IVector2> infectPositions = new List <IVector2>();
            IVector2        realEnd;
            MoveType        moveType       = _logic.Move(_currentChoosedBlock.Block.Pos, data.Block.Pos, out realEnd, out infectPositions);
            bool            isHoleTeleport = ((data.Block.Pos.x != realEnd.x) && (data.Block.Pos.y != realEnd.y));

            DebugLog(" Move Start : " + _currentChoosedBlock.Block.Pos.x.ToString() + "," + _currentChoosedBlock.Block.Pos.y.ToString() +
                     "    End: " + data.Block.Pos.x.ToString() + "," + data.Block.Pos.y.ToString() +
                     "   Real End " + realEnd.x.ToString() + "," + realEnd.y.ToString() + "   MoveType : " + moveType.ToString());

            if (moveType == MoveType.Move)
            {
                //移動場景物件
                MapBlock destBlockMove = _logic.GetMapBlock(realEnd);
                MapGenerator.CopyMoveUnit(_currentChoosedBlock.Block, destBlockMove);

                for (int i = 0; i < infectPositions.Count; i++)
                {
                    MapBlock block = _logic.GetMapBlock(infectPositions[i]);

                    //人類
                    if (_lastPlayStatus == PlayStatus.RoundHumanReadyMove)
                    {
                        MapGenerator.HumanInfectBlock(block);
                    }
                    //蟲類
                    else
                    {
                        MapGenerator.ScarabInfectBlock(block);
                    }
                }

                if (infectPositions.Count > 0)
                {
                    UIManager.Instance.ShowCenterMsg((isHoleTeleport? "[Teleport]":"") + " Infect !!! ");
                }
                else
                {
                    UIManager.Instance.ShowCenterMsg((isHoleTeleport ? "[Teleport]" : "") + " Move !");
                }

                DebugLog(" 淫內感染   infect nums. " + infectPositions.Count.ToString());
            }
            else if (moveType == MoveType.Clone)
            {
                MapBlock destBlock = _logic.GetMapBlock(realEnd);
                //人類
                if (_lastPlayStatus == PlayStatus.RoundHumanReadyMove)
                {
                    MapGenerator.HumanInfectBlock(destBlock);
                }
                //蟲類
                else
                {
                    MapGenerator.ScarabInfectBlock(destBlock);
                }

                for (int i = 0; i < infectPositions.Count; i++)
                {
                    MapBlock blockClone = _logic.GetMapBlock(infectPositions[i]);

                    //人類
                    if (_lastPlayStatus == PlayStatus.RoundHumanReadyMove)
                    {
                        MapGenerator.HumanInfectBlock(blockClone);
                    }
                    //蟲類
                    else
                    {
                        MapGenerator.ScarabInfectBlock(blockClone);
                    }
                }

                if (infectPositions.Count > 0)
                {
                    UIManager.Instance.ShowCenterMsg((isHoleTeleport ? "[Teleport]" : "") + " Clone and Infect !!! ");
                }
                else
                {
                    UIManager.Instance.ShowCenterMsg((isHoleTeleport ? "[Teleport]" : "") + " Clone ! ");
                }

                DebugLog("MoveType.Clone " + realEnd.DataToString());
            }
            else
            {
                DebugLog("MoveType.None");
            }

            BattleResult res = BattleResult.None;
            if (_currentPlayStatus == PlayStatus.RoundHumanReadyMove)
            {
                _currentPlayStatus = PlayStatus.RoundScarabTurn;     // 換蟲方
                res = _logic.DecideResult(Creature.Scarab);
            }
            else if (_currentPlayStatus == PlayStatus.RoundScarabReadyMove)
            {
                _currentPlayStatus = PlayStatus.RoundHumanTurn;     // 換人方
                res = _logic.DecideResult(Creature.People);
            }

            if (res != BattleResult.None)
            {
                UIManager.Instance.ShowResult(res);
                _currentPlayStatus = PlayStatus.BattleResult; //本局結束

                StartCoroutine(WaitReturnToMain());           //準備回到主畫面

                if (res == BattleResult.Draw)
                {
                    UIManager.Instance.ShowCenterMsg("Draw !");
                }
                else if (res == BattleResult.PeopleWin)
                {
                    UIManager.Instance.ShowCenterMsg("Human Win !");
                }
                else if (res == BattleResult.ScarabWin)
                {
                    UIManager.Instance.ShowCenterMsg("Scarab Win !\n\n Colonization Success !!!");
                }
            }

            _currentChoosedBlock = null;

            break;

        default:
            DebugLog("Click Tile valid. " + _currentPlayStatus.ToString());
            break;
        }
    }