예제 #1
0
    public HashSet <TileData> GetReachableTiles(Player p, TileData fromTile, int distance)
    {
        HashSet <TileData> foundTiles = new HashSet <TileData>();

        if (distance == 0 || fromTile == null)
        {
            return(foundTiles);
        }
        foreach (TileData t in fromTile.GetConnectedTiles())
        {
            if (t == p.CommanderPosition)
            {
                continue;
            }
            if ((p.Type == PlayerType.Battlebeard && t.Building != BuildingType.StartTileStormshaper) || (p.Type == PlayerType.Stormshaper && t.Building != BuildingType.StartTileBattlebeard))
            {
                foundTiles.Add(t);
            }
            HashSet <TileData> tilesForT = GetReachableTiles(p, t, distance - 1);
            foreach (TileData tt in tilesForT)
            {
                //check that thetile is not the oponents start tile
                if ((p.Type == PlayerType.Battlebeard && t.Building != BuildingType.StartTileStormshaper) || (p.Type == PlayerType.Stormshaper && t.Building != BuildingType.StartTileBattlebeard))
                {
                    foundTiles.Add(tt);
                }
            }
        }
        return(foundTiles);
    }
예제 #2
0
    void HandleTileEvent(TileData tile)
    {
        _OverworldUI.Disable();
        _GameStateHolder._ActivePlayer.HasMoved = true;
        if (_GameStateHolder._ActivePlayer.IsScouting) {
            _GameStateHolder._ActivePlayer.IsScouting = false;
            endTurn ();
        } else {
            ModalPanel p = ModalPanel.Instance ();
            switch (tile.Building) {
            case BuildingType.Armoury:
                if (!_GameStateHolder._ActivePlayer.LandedArmoury) {
                    _GameStateHolder._ActivePlayer.LandedArmoury = true;
                    TutorialPanel.Instance().Tutor(_GameStateHolder._ActivePlayer.Type,
                       "Armoury",
                       "Welcome to the Armoury!\n" +
                        "You can use resources that you have earned to expand your army or purchase upgrades.",
                       false);
                }
                _OverworldUI._ArmouryUI.Show(_GameStateHolder._ActivePlayer);
                break;
            case BuildingType.Camp:
                if (!_GameStateHolder._ActivePlayer.LandedCamp) {
                    _GameStateHolder._ActivePlayer.LandedCamp = true;
                    TutorialPanel.Instance().Tutor(_GameStateHolder._ActivePlayer.Type,
                        "Camp",
                        "You just landed on a camp. You can add it to your empire if you defeat the enemies lurking there.",
                       false);
                }
                if (tile.Owner != _GameStateHolder._ActivePlayer.Type) {
                    if (tile.Owner == PlayerType.None) {
                        // MONSTER BATTLE
                        p.ShowOK ("Camp", "You see a camp and enter it. Monsters attack!", () => {
                            startBattle (BattleType.Monster);
                        });
                    } else {

                        if (tile.IsDefended()) {
                            p.ShowOK("Camp", "You see a camp, there appears to be an enemy unit defending. The enemy attacks you!", () => {
                                startBattle(BattleType.PvP);
                            });
                        } else {
                            _Board.SetTileOwner(tile, _GameStateHolder._ActivePlayer.Type);
                            Unit prisoner = _GameStateHolder._ActivePlayer.PlayerArmy.GetDefendingUnit(tile);
                            if (prisoner != null) {
                                _Board.UnsetTilePrisoner(tile);
                                PromptForReturnPrisoner(_GameStateHolder._ActivePlayer, prisoner, tile, p, endTurn);
                            } else if (_GameStateHolder._ActivePlayer.PlayerArmy.GetActiveUnits().Count > 1) {
                                StartCoroutine(PromptForDefendingUnit("You enter the camp, it's been abandoned. Leave a unit to defend this camp?", _GameStateHolder._ActivePlayer, p, endTurn));
                            } else {
                                //TODO: Add some text here to give the player some info
                                endTurn();
                            }
                        }
                    }
                    break;
                }
                if (tile.IsDefended ()) {
                    Unit defendingUnit = _GameStateHolder._ActivePlayer.PlayerArmy.GetDefendingUnit (tile);
                    p.ShowOKCancel("Take back unit", "Should this " + defendingUnit.Type + " stop defending this area?", () =>
                        StartCoroutine(PromptToReplaceDefendingUnit (_GameStateHolder._ActivePlayer, defendingUnit, p, endTurn)),
                        endTurn);
                } else {
                    if (_GameStateHolder._ActivePlayer.PlayerArmy.GetActiveUnits().Count > 1) {
                            StartCoroutine(PromptForDefendingUnit ("Your land is undefended. Would you like to leave a unit to defend this camp?", _GameStateHolder._ActivePlayer, p, endTurn));
                    } else {
                        endTurn ();
                    }
                }
                break;
            case BuildingType.Cave:
                if (tile.Owner != _GameStateHolder._ActivePlayer.Type) {
                    if (tile.Owner != PlayerType.None && tile.IsDefended()) {
                        p.ShowOK("Cave", "You enter the cave to explore. An enemy unit ambushes you!", () => {
                            startBattle(BattleType.PvP);
                        });
                        return;
                    }

                    if(!_GameStateHolder._ActivePlayer.LandedCave) {
                        _GameStateHolder._ActivePlayer.LandedCave = true;
                        TutorialPanel.Instance().Tutor(_GameStateHolder._ActivePlayer.Type,
                            "Cave",
                            "There's a decent stash of treasure in this cave.",
                            true);
                    }
                    if(!_GameStateHolder._ActivePlayer.HasCaptured) {
                        _GameStateHolder._ActivePlayer.HasCaptured = true;
                        TutorialPanel.Instance().Tutor(_GameStateHolder._ActivePlayer.Type,
                            "Cave",
                            "You captured the cave and made it part of your empire!",
                            true);
                    }
                    CardData c =_CardSystem.GetRandomCard(_AvailableCaveCards.cards);
                    _GameStateHolder._ActivePlayer.AddCard(c);
                    _Board.SetTileOwner(tile, _GameStateHolder._ActivePlayer.Type);

                    Unit prisoner = _GameStateHolder._ActivePlayer.PlayerArmy.GetDefendingUnit(tile);
                    if (prisoner != null) {
                        _Board.UnsetTilePrisoner(tile);
                        PromptForReturnPrisoner(_GameStateHolder._ActivePlayer, prisoner, tile, p, endTurn);
                    } else if (_GameStateHolder._ActivePlayer.PlayerArmy.GetActiveUnits().Count > 1) {
                        StartCoroutine(PromptForDefendingUnit("You enter the cave, there's no sign of the enemy. Leave a unit to defend this cave?", _GameStateHolder._ActivePlayer, p, endTurn));
                    } else {
                        endTurn();
                    }
                } else {
                    if (tile.IsDefended ()) {
                        Unit defendingUnit = _GameStateHolder._ActivePlayer.PlayerArmy.GetDefendingUnit (tile);
                        p.ShowOKCancel("Take back unit", "Should this " + defendingUnit.Type + " stop defending this cave?", () =>
                            StartCoroutine(PromptToReplaceDefendingUnit (_GameStateHolder._ActivePlayer, defendingUnit, p, endTurn)),
                            endTurn);
                    } else {
                        if (_GameStateHolder._ActivePlayer.PlayerArmy.GetActiveUnits().Count > 1) {
                                StartCoroutine(PromptForDefendingUnit ("Your land is undefended. Would you like to leave a unit to defend this cave?", _GameStateHolder._ActivePlayer, p, endTurn));
                        } else {
                            endTurn ();
                        }
                    }
                }
                break;
            case BuildingType.Fortress:
                bool ownsSurroundingTiles = tile.GetConnectedTiles().FindAll(t => t.Owner == _GameStateHolder._ActivePlayer.Type).Count >= 3;
                if (!_GameStateHolder._ActivePlayer.LandedFortress) {
                    _GameStateHolder._ActivePlayer.LandedFortress = true;
                    TutorialPanel.Instance().Tutor(_GameStateHolder._ActivePlayer.Type,
                        "Fortress",
                        "This fortress seems eerie. It looks like there are many like it around Nekark.",
                        true);
                    if (!ownsSurroundingTiles) {
                        TutorialPanel.Instance().Tutor(_GameStateHolder._ActivePlayer.Type,
                            "Fortress",
                            "I suggest securing the surrounding area!",
                            false);
                    }
                }
                // Make sure that the fortress type matches the player type
                if (tile.Owner == _GameStateHolder._ActivePlayer.Type) {
                    // make sure the player owns at least 3 surrounding tiles
                    if (ownsSurroundingTiles) {
                        // Battle lost immortal
                        p.ShowOK("Fortress", "A bloody Lost Immortal just showed up innit blud!", () => {
                            startBattle(BattleType.LostImmortal);
                        });
                    } else {
                        p.ShowOK ("Fortress", "You felt a chill in the air, but nothing appeared.", endTurn);
                    }
                    break;
                }
                endTurn();
                break;
            case BuildingType.Inn:
                if(!_GameStateHolder._ActivePlayer.LandedInn) {
                    _GameStateHolder._ActivePlayer.LandedInn = true;
                    TutorialPanel.Instance().Tutor(_GameStateHolder._ActivePlayer.Type,
                        "Inn",
                        "The Inn is a good place to heal your units.\n"+
                        "Inns are a good place to rest and revive your units when they are knocked out.",
                        true);
                    TutorialPanel.Instance().Tutor(_GameStateHolder._ActivePlayer.Type,
                        "Inn",
                        "Unfortunately, sometimes units cannot be healed and you will need to visit the inn another time.",
                        false);
                }
                Audio.AudioInstance.PlaySFX(SoundEffect.Inn);
                if (_GameStateHolder._InactivePlayer.CastleProgress >= 4) {
                        if(!_GameStateHolder._ActivePlayer.LandedInnUnavailable) {
                            _GameStateHolder._ActivePlayer.LandedInnUnavailable = true;
                            TutorialPanel.Instance().Tutor(_GameStateHolder._ActivePlayer.Type,
                                "Inn",
                                "Oh no!" +
                                "The inn has turned you away! The " + _GameStateHolder._InactivePlayer.Type.ToString() + "army is putting too much pressure on them!.\n" +
                                "Looks like there's no rest for us anymore...",
                                true);
                        }
                        p.ShowOK ("Oh No!", "The inn won't accept you!", endTurn);
                    break;
                }

                var rnd = UnityEngine.Random.Range (0, 3);
                List<Unit> units;

                units = _GameStateHolder._ActivePlayer.PlayerArmy.GetRandomUnits (rnd, _GameStateHolder._ActivePlayer.PlayerArmy.GetKOUnits());

                foreach (var unit in units) {
                    unit.Heal ();
                }

                string content, title;

                if (_GameStateHolder._ActivePlayer.PlayerArmy.GetKOUnits ().Count == 0) {
                    title = "The Inn Welcomes You";
                    content = "You are well rested.";
                } else {
                    title = units.Count + " Units Healed";
                    content = rnd == 0 ?
                        "Their wounds were too great. Looks like they'll need some more time." :
                        "Your army is well rested.";
                }
                p.ShowOK (title, content, endTurn);
                break;
            default:
                endTurn ();
                break;
            }
        }
    }
예제 #3
0
파일: Board.cs 프로젝트: EpicPants90/ELB
 public HashSet<TileData> GetReachableTiles(Player p, TileData fromTile, int distance)
 {
     HashSet<TileData> foundTiles = new HashSet<TileData>();
     if (distance == 0 || fromTile == null) {
         return foundTiles;
     }
     foreach (TileData t in fromTile.GetConnectedTiles()) {
         if (t == p.CommanderPosition) {
             continue;
         }
         if ((p.Type == PlayerType.Battlebeard && t.Building != BuildingType.StartTileStormshaper) || (p.Type == PlayerType.Stormshaper && t.Building != BuildingType.StartTileBattlebeard))
             foundTiles.Add(t);
         HashSet<TileData> tilesForT = GetReachableTiles(p, t, distance - 1);
         foreach (TileData tt in tilesForT) {
             //check that thetile is not the oponents start tile
             if ((p.Type == PlayerType.Battlebeard && t.Building != BuildingType.StartTileStormshaper) || (p.Type == PlayerType.Stormshaper && t.Building != BuildingType.StartTileBattlebeard))
                 foundTiles.Add(tt);
         }
     }
     return foundTiles;
 }