// 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()); }
//------------ 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; } }