// Use this for initialization
    void Start()
    {
        ActiveTeam winningTeam = GameControl.instance.activeTeams[0].wonGame ? GameControl.instance.activeTeams[0] : null;

        if (winningTeam == null)
        {
            winningTeam = GameControl.instance.activeTeams[1].wonGame ? GameControl.instance.activeTeams[1] : null;
        }
        if (winningTeam == null)
        {
            gameOverText.text     = "They tied. That sucks. Hopefully it was funny anyway.";
            player1Portrait.color = new Color(0, 0, 0, 0);
            player1Name.text      = "";
            player2Portrait.color = new Color(0, 0, 0, 0);
            player2Name.text      = "";
            player3Portrait.color = new Color(0, 0, 0, 0);
            player3Name.text      = "";
        }
        else
        {
            gameOverText.text = winningTeam.name + " won!";
            SetBatterPhoto(winningTeam.players[0], player1Portrait);
            player1Name.text = winningTeam.players[0].name;
            SetBatterPhoto(winningTeam.players[1], player2Portrait);
            player2Name.text = winningTeam.players[1].name;
            SetBatterPhoto(winningTeam.players[2], player3Portrait);
            player3Name.text = winningTeam.players[2].name;
        }
    }
    public static ActiveMission Create(MissionDefinition definition)
    {
        var result = CreateInstance<ActiveMission>();

        result.missionDefinition = definition;
        result.teams = new ActiveTeam[definition.Teams.Count];
        result.name = definition.name;

        bool firstSlot = true;

        for (int team = 0; team < result.teams.Length; ++team)
        {
            var newTeam = new ActiveTeam(definition.Teams[team]);
            
            foreach (var slot in newTeam.Slots)
            {
                slot.Status = firstSlot ? SlotStatus.Human : SlotStatus.AI;
                firstSlot = false;
            }

            result.teams[team] = newTeam;
        }

        return result;
    }
Exemple #3
0
        public ActiveTeamsViewModel GetAllGamesUserCurrentlyPlaying(int userId, int?userTeamId, string footballClub, string searchString)
        {
            //var _activeGames = _games.GetAllGamesUserCurrentlyPlaying(userId);
            var _activeUserTeams = _userTeams.GetAllUserTeamsCurrentlyActive(userId);
            var _activeTeamsVM   = new List <ActiveTeam>();
            var _tempTeam        = new ActiveTeam();
            var _tempTeamOV      = new TeamOverViewViewModel();


            foreach (UserTeam uts in _activeUserTeams)
            {
                _tempTeam.GameName   = uts.Game.Name;
                _tempTeam.IsActive   = (uts.OrderPosition == uts.Game.CurrentOrderPosition);
                _tempTeam.UserTeamId = uts.Id;
                _tempTeam.UserId     = uts.UserId;
                _tempTeam.GameId     = uts.GameId;
                _activeTeamsVM.Add(_tempTeam);
                _tempTeam = new ActiveTeam();  // item stored in list is reference, not copy... need to new up item othrewise just end up with list of same items
            }
            if (userTeamId != null)
            {
                return(new ActiveTeamsViewModel()
                {
                    ActiveTeams = _activeTeamsVM, TeamOverView = GetTeamOverViewViewModel((int)userTeamId, null, footballClub, searchString)
                });
            }
            else
            {
                return(new ActiveTeamsViewModel()
                {
                    ActiveTeams = _activeTeamsVM
                });
            }
        }
        public void SpawnAll(MissionDefinition.TeamDefinition teamDefinition, ActiveTeam activeTeam)
        {
            /* loop around slots, spawning players at each slot in turn until there are
             * no more players 
             */
            var slotsCount = teamDefinition.Slots.Count;
                        
            var allSpawnPoints = new List<Transform>();

            foreach (Transform spawnRoot in spawnPoints)
            {
                foreach (Transform spawnPoint in spawnRoot)
                {
                    allSpawnPoints.Add(spawnPoint);
                }
            }

            Ship firstSpawned = null;

            var spawnsCount = allSpawnPoints.Count;

            for (int slotIndex = 0; slotIndex < slotsCount; ++slotIndex)
            {
                var slotDefinition = teamDefinition.Slots[slotIndex];
                var spawnPoint = allSpawnPoints[slotIndex % spawnsCount];

                var activeSlot = activeTeam.Slots[slotIndex];
                
                if (activeSlot.Status != SlotStatus.Closed || activeSlot.Status == SlotStatus.Open)
                {
                    var ship = slotDefinition.SpawnShip(spawnPoint.position, spawnPoint.rotation, teamDefinition);

                    //first spawned ship becomnes the leader of the fleet
                    if (firstSpawned == null)
                    {
                        firstSpawned = ship;
                    }
                    else
                    {
                        SpaceTraderConfig.FleetManager.AddToFleet(firstSpawned, ship);
                    }

                    switch (activeSlot.Status)
                    {
                        case SlotStatus.AI:
                            SetupAIPlayer(ship);
                            break;
                        case SlotStatus.Human:
                            SetupHumanPlayer(ship, teamDefinition);                            
                            break;
                    }

                    activeSlot.SpawnedShip = ship;
                }
            }
        }
Exemple #5
0
        public IEnumerator <YieldInstruction> BeginFloor()
        {
            DataManager.Instance.Save.Trail.Add(ZoneManager.Instance.CurrentMap.GetColoredName());
            LogMsg(Text.FormatKey("MSG_ENTER_MAP", ActiveTeam.GetDisplayName(), ZoneManager.Instance.CurrentMap.GetColoredName()), true, false);

            ZoneManager.Instance.CurrentMap.Begun = true;

            //process player happenings
            foreach (Character character in ZoneManager.Instance.CurrentMap.IterateCharacters())
            {
                character.Tactic.Initialize(character);
            }

            //map starts for map statuses
            EventEnqueueFunction <SingleCharEvent> function = (StablePriorityQueue <GameEventPriority, EventQueueElement <SingleCharEvent> > queue, Priority maxPriority, ref Priority nextPriority) =>
            {
                //start with universal
                DataManager.Instance.UniversalEvent.AddEventsToQueue(queue, maxPriority, ref nextPriority, DataManager.Instance.UniversalEvent.OnMapStarts, null);
                ZoneManager.Instance.CurrentMap.MapEffect.AddEventsToQueue(queue, maxPriority, ref nextPriority, ZoneManager.Instance.CurrentMap.MapEffect.OnMapStarts, null);

                foreach (MapStatus mapStatus in ZoneManager.Instance.CurrentMap.Status.Values)
                {
                    MapStatusData entry = DataManager.Instance.GetMapStatus(mapStatus.ID);
                    mapStatus.AddEventsToQueue <SingleCharEvent>(queue, maxPriority, ref nextPriority, entry.OnMapStarts, null);
                }

                int portPriority = 0;
                foreach (Character character in ZoneManager.Instance.CurrentMap.IterateCharacters())
                {
                    if (!character.Dead)
                    {
                        foreach (PassiveContext effectContext in character.IteratePassives(new Priority(portPriority)))
                        {
                            effectContext.AddEventsToQueue(queue, maxPriority, ref nextPriority, effectContext.EventData.OnMapStarts, character);
                        }
                    }
                    portPriority++;
                }
            };

            foreach (EventQueueElement <SingleCharEvent> effect in IterateEvents <SingleCharEvent>(function))
            {
                yield return(CoroutineManager.Instance.StartCoroutine(effect.Event.Apply(effect.Owner, effect.OwnerChar, effect.TargetChar)));
            }

            yield return(CoroutineManager.Instance.StartCoroutine(ZoneManager.Instance.CurrentMap.OnEnter()));

            LogMsg(Text.DIVIDER_STR);
        }
Exemple #6
0
    //Set selected teams as active
    void SetupTeams()
    {
        foreach (var team in GameControl.instance.teams)
        {
            if (team.name == team1.options[team1.value].text)
            {
                ActiveTeam aTeam = new ActiveTeam();
                aTeam.name           = team.name;
                aTeam.abbreviation   = team.abbreviation;
                aTeam.currentlyAtBat = t1Toggle.isOn;
                aTeam.score          = 0;
                aTeam.wins           = team.wins;
                aTeam.ties           = team.ties;
                aTeam.loses          = team.loses;
                AddPlayers(aTeam, 1);
                GameControl.instance.activeTeams.Add(aTeam);
                Color teamColor = new Color(team.colorR, team.colorG, team.colorB);
                GameControl.instance.homeTeamMat.color = teamColor;
                aTeam.color = teamColor;
                break;
            }
        }

        foreach (var team in GameControl.instance.teams)
        {
            if (team.name == team2.options[team2.value].text)
            {
                ActiveTeam aTeam = new ActiveTeam();
                aTeam.name           = team.name;
                aTeam.abbreviation   = team.abbreviation;
                aTeam.score          = 0;
                aTeam.currentlyAtBat = t2Toggle.isOn;
                aTeam.wins           = team.wins;
                aTeam.ties           = team.ties;
                aTeam.loses          = team.loses;
                AddPlayers(aTeam, 2);
                GameControl.instance.activeTeams.Add(aTeam);
                Color teamColor = new Color(team.colorR, team.colorG, team.colorB);
                GameControl.instance.awayTeamMat.color = teamColor;
                aTeam.color = teamColor;
                break;
            }
        }
    }
        public void HandleEvent(TeamRaceStarted teamRaceStarted)
        {
            var xxx  = Stopwatch.StartNew();
            var team = this._teamRepository.Get(teamRaceStarted.TeamId);

            team.StartRace(teamRaceStarted.StartDate);

            this._teamRepository.Update(team);

            var activeTeam = new ActiveTeam
            {
                ChipId = team.ChipId,
                TeamId = team.Id
            };

            this._activeTeamRepository.Add(activeTeam);

            StatsPrinter.Print("TeamRaceStarted", xxx.ElapsedMilliseconds);
        }
Exemple #8
0
        public IEnumerator <YieldInstruction> PrepareFloor()
        {
            DataManager.Instance.Save.Trail.Add(ZoneManager.Instance.CurrentMap.GetSingleLineName());
            LogMsg(Text.FormatKey("MSG_ENTER_MAP", ActiveTeam.GetReferenceName(), ZoneManager.Instance.CurrentMap.GetSingleLineName()), true, false);

            //start emitters for existing map status
            foreach (MapStatus mapStatus in ZoneManager.Instance.CurrentMap.Status.Values)
            {
                mapStatus.StartEmitter(Anims);
            }

            //process events before the map fades in
            foreach (SingleCharEvent effect in ZoneManager.Instance.CurrentMap.PrepareEvents)
            {
                yield return(CoroutineManager.Instance.StartCoroutine(effect.Apply(null, null, FocusedCharacter)));
            }

            //Notify script engine
            LuaEngine.Instance.OnDungeonFloorPrepare();
        }
 static void UpdateTeamData(ActiveTeam aTeam, Team team)
 {
     //Set values of the team to account for updated values in active team
     team.hits              += aTeam.hits;
     team.runs              += aTeam.score;
     team.atbatstrikeouts   += aTeam.GetStrikeoutsAtBat();
     team.pitchedstrikeouts += aTeam.GetPitchedStrikeouts();
     if (aTeam.wonGame)
     {
         team.wins += 1;
     }
     else if (aTeam.lostGame)
     {
         team.loses += 1;
     }
     else if (aTeam.tiedGame)
     {
         team.ties += 1;
     }
 }
    void NextBatter()
    {
        ActiveTeam battingTeam = GetTeamAtBat();
        int        curBatter   = GetCurrentBatter();

        curBatter = curBatter + 1 == battingTeam.players.Count ? 0 : curBatter + 1;

        foreach (var player in battingTeam.players)
        {
            player.isAtBat = false;
        }

        foreach (var runner in Field.runners)
        {
            runner.atBat = false;
        }
        battingTeam.players[curBatter].isAtBat = true;
        AddBatterToField();
        changeCountEvent();
    }
    //Eventually use this to set up the pregame screen
    void Start()
    {
        ActiveTeam homeTeam = GameControl.instance.activeTeams[0];
        ActiveTeam awayTeam = GameControl.instance.activeTeams[1];

        homeTeamName.text     = homeTeam.name;
        homePlayer1Img.sprite = GetPortaitForPlayer(homeTeam.players[0]);
        homePlayer1Name.text  = homeTeam.players[0].name;
        homePlayer2Img.sprite = GetPortaitForPlayer(homeTeam.players[1]);
        homePlayer2Name.text  = homeTeam.players[1].name;
        homePlayer3Img.sprite = GetPortaitForPlayer(homeTeam.players[2]);
        homePlayer3Name.text  = homeTeam.players[2].name;
        homeTeamRecord.text   = homeTeam.wins + "-" + homeTeam.loses + "-" + homeTeam.ties;

        awayTeamName.text     = awayTeam.name;
        awayPlayer1Img.sprite = GetPortaitForPlayer(awayTeam.players[0]);
        awayPlayer1Name.text  = awayTeam.players[0].name;
        awayPlayer2Img.sprite = GetPortaitForPlayer(awayTeam.players[1]);
        awayPlayer2Name.text  = awayTeam.players[1].name;
        awayPlayer3Img.sprite = GetPortaitForPlayer(awayTeam.players[2]);
        awayPlayer3Name.text  = awayTeam.players[2].name;
        awayTeamRecord.text   = awayTeam.wins + "-" + awayTeam.loses + "-" + homeTeam.ties;
    }
Exemple #12
0
    //Add selected players to active team
    void AddPlayers(ActiveTeam team, int teamNumber)
    {
        switch (teamNumber)
        {
        case 1:
            foreach (var player in GameControl.instance.players)
            {
                if (player.name == t1player1.options[t1player1.value].text || player.name == t1player2.options[t1player2.value].text || player.name == t1player3.options[t1player3.value].text)
                {
                    ActivePlayer aPlayer = new ActivePlayer();
                    aPlayer.number       = player.number;
                    aPlayer.name         = player.name;
                    aPlayer.totalAtBats  = player.atBats;
                    aPlayer.totalHits    = player.hits;
                    aPlayer.portraitPath = player.portraitPath;
                    team.players.Add(aPlayer);
                }
            }
            break;

        case 2:
            foreach (var player in GameControl.instance.players)
            {
                if (player.name == t2player1.options[t2player1.value].text || player.name == t2player2.options[t2player2.value].text || player.name == t2player3.options[t2player3.value].text)
                {
                    ActivePlayer aPlayer = new ActivePlayer();
                    aPlayer.number       = player.number;
                    aPlayer.name         = player.name;
                    aPlayer.totalAtBats  = player.atBats;
                    aPlayer.totalHits    = player.hits;
                    aPlayer.portraitPath = player.portraitPath;
                    team.players.Add(aPlayer);
                }
            }
            break;
        }
    }
Exemple #13
0
    private void SetUpScoreboardText()
    {
        ActiveTeam hTeam = GameControl.instance.activeTeams[0];
        ActiveTeam aTeam = GameControl.instance.activeTeams[1];

        hTeamInning1Score.text = hTeam.scoreByInning[0].ToString();
        hTeamInning2Score.text = hTeam.scoreByInning[1].ToString();
        hTeamInning3Score.text = hTeam.scoreByInning[2].ToString();
        hTeamInning4Score.text = hTeam.scoreByInning[3].ToString();
        hTeamInning5Score.text = hTeam.scoreByInning[4].ToString();
        aTeamInning1Score.text = aTeam.scoreByInning[0].ToString();
        aTeamInning2Score.text = aTeam.scoreByInning[1].ToString();
        aTeamInning3Score.text = aTeam.scoreByInning[2].ToString();
        aTeamInning4Score.text = aTeam.scoreByInning[3].ToString();
        aTeamInning5Score.text = aTeam.scoreByInning[4].ToString();
        hTeamHits.text         = hTeam.GetHits().ToString();
        aTeamHits.text         = aTeam.GetHits().ToString();
        hTeamRuns.text         = hTeam.score.ToString();
        aTeamRuns.text         = aTeam.score.ToString();
        aTeamPitches.text      = aTeam.GetPitches().ToString();
        hTeamPitches.text      = hTeam.GetPitches().ToString();
        aTeamAbr.text          = aTeam.abbreviation;
        hTeamAbr.text          = hTeam.abbreviation;
    }
Exemple #14
0
        //the intention, and its result to that frame
        //"choose the action to partake in"
        public IEnumerator <YieldInstruction> ProcessInput(GameAction action, Character character, ActionResult result)
        {
            //translates commands into actions
            if (character.AttackOnly && character.CantWalk && action.Type == GameAction.ActionType.Wait)
            {
                action = new GameAction(GameAction.ActionType.Attack, action.Dir);
            }

            ProcessDir(action.Dir, character);

            switch (action.Type)
            {
            case GameAction.ActionType.Dir:
            {
                //result.Success = ActionResult.ResultType.Success;
                break;
            }

            case GameAction.ActionType.Wait:
            {
                result.Success = ActionResult.ResultType.TurnTaken;

                //if it's a team character and it's team mode, wait a little while
                if (DataManager.Instance.Save.TeamMode && character.MemberTeam == ActiveTeam)
                {
                    DungeonScene.Instance.LogMsg(Text.FormatKey("MSG_SKIP_TURN", character.GetDisplayName(false)), false, true);
                    yield return(new WaitForFrames(GameManager.Instance.ModifyBattleSpeed(20)));
                }
                else if (character == FocusedCharacter)       //add just one little wait to slow down the turn-passing when no enemies are in view
                {
                    yield return(new WaitForFrames(1));       //this will cause 1-frame breaks when waiting with walking characters in view, but it's barely noticable
                }
                yield return(CoroutineManager.Instance.StartCoroutine(FinishTurn(character, true, false, false)));

                break;
            }

            case GameAction.ActionType.Move:
            {
                yield return(CoroutineManager.Instance.StartCoroutine(ProcessWalk(character, (action[0] == 1), result)));

                break;
            }

            case GameAction.ActionType.Pickup:
            {
                yield return(CoroutineManager.Instance.StartCoroutine(ProcessPickup(character, result)));

                break;
            }

            case GameAction.ActionType.Drop:
            {
                //takes an index argument
                //[0] = item slot to use (-1 for the held item)
                yield return(CoroutineManager.Instance.StartCoroutine(ProcessPlaceItem(character, action[0], result)));

                break;
            }

            case GameAction.ActionType.Give:
            {
                //[0] = item slot to use (-1 for the ground item)
                //[1] = who to give it to (-1 for the user)
                yield return(CoroutineManager.Instance.StartCoroutine(ProcessGiveItem(character, action[0], action[1], result)));

                break;
            }

            case GameAction.ActionType.Take:
            {
                //[0] = team slot to take from
                yield return(CoroutineManager.Instance.StartCoroutine(ProcessTakeItem(character, action[0], result)));

                break;
            }

            case GameAction.ActionType.Tile:
            {
                yield return(CoroutineManager.Instance.StartCoroutine(ProcessTileInteract(character, result)));

                break;
            }

            case GameAction.ActionType.Attack:
            {
                yield return(CoroutineManager.Instance.StartCoroutine(ProcessObjectInteract(character, result)));

                break;
            }

            case GameAction.ActionType.UseSkill:
            {
                yield return(CoroutineManager.Instance.StartCoroutine(ProcessUseSkill(character, action[0], result)));

                break;
            }

            case GameAction.ActionType.UseItem:
            {
                //[0] = item slot to use (-1 for held item, -2 for the ground item)
                //[1] = who to use it on (-1 for the user)
                //others: which slot to delete,
                //which intrinsic to have, which team member/item to send in, etc.
                yield return(CoroutineManager.Instance.StartCoroutine(ProcessUseItem(character, action[0], action[1], result)));

                break;
            }

            case GameAction.ActionType.Throw:
            {
                //[0] = item slot to use (-1 for held item, -2 for the ground item)
                yield return(CoroutineManager.Instance.StartCoroutine(ProcessThrowItem(character, action[0], result)));

                break;
            }

            case GameAction.ActionType.TeamMode:
            {
                yield return(CoroutineManager.Instance.StartCoroutine(ToggleTeamMode(result)));

                break;
            }

            case GameAction.ActionType.ShiftTeam:
            {
                result.Success = ActionResult.ResultType.Success;

                SwitchTeam(action[0]);
                break;
            }

            case GameAction.ActionType.SetLeader:
            {
                yield return(CoroutineManager.Instance.StartCoroutine(MakeLeader(action[0], result)));

                break;
            }

            case GameAction.ActionType.SendHome:
            {
                result.Success = ActionResult.ResultType.Success;

                yield return(CoroutineManager.Instance.StartCoroutine(SendHome(action[0])));

                break;
            }

            case GameAction.ActionType.GiveUp:
            {
                result.Success = ActionResult.ResultType.Success;

                yield return(CoroutineManager.Instance.StartCoroutine(GameManager.Instance.EndSegment((GameProgress.ResultType)action[0])));

                break;
            }

            case GameAction.ActionType.Tactics:
            {
                result.Success = ActionResult.ResultType.Success;

                //saves all the settings to the characters
                for (int ii = 0; ii < ActiveTeam.Players.Count; ii++)
                {
                    int       choice = action[ii];
                    Character target = ActiveTeam.Players[ii];
                    AITactic  tactic = DataManager.Instance.GetAITactic(choice);
                    if (tactic.ID != target.Tactic.ID)
                    {
                        target.Tactic = new AITactic(tactic);
                    }
                    target.Tactic.Initialize(target);
                }
                break;
            }

            case GameAction.ActionType.SetSkill:
            {
                result.Success = ActionResult.ResultType.Success;

                Skill skill = ActiveTeam.Players[action[0]].Skills[action[1]].Element;
                skill.Enabled = !skill.Enabled;
                break;
            }

            case GameAction.ActionType.ShiftSkill:
            {
                result.Success = ActionResult.ResultType.Success;

                ActiveTeam.Players[action[0]].SwitchSkills(action[1]);
                break;
            }

            case GameAction.ActionType.SortItems:
            {
                result.Success = ActionResult.ResultType.Success;

                ActiveTeam.SortItems();
                break;
            }

            default:
            {
                throw new Exception("Undefined Command: " + action.Type);
            }
            }
        }
Exemple #15
0
 private void Init()
 {
     startPosition = Field.fieldPositions[position].transform;
     playPosition  = Field.playPositions[position].transform;
     team          = GameControl.instance.GetTeamInField();
 }
Exemple #16
0
        public IEnumerator <YieldInstruction> ProcessRescue(GameAction action, SOSMail mail)
        {
            //delete all enemies
            for (int ii = ZoneManager.Instance.CurrentMap.MapTeams.Count - 1; ii >= 0; ii--)
            {
                for (int jj = ZoneManager.Instance.CurrentMap.MapTeams[ii].Players.Count - 1; jj >= 0; jj--)
                {
                    yield return(CoroutineManager.Instance.StartCoroutine(ZoneManager.Instance.CurrentMap.MapTeams[ii].Players[jj].DieSilent()));
                }
                for (int jj = ZoneManager.Instance.CurrentMap.MapTeams[ii].Guests.Count - 1; jj >= 0; jj--)
                {
                    yield return(CoroutineManager.Instance.StartCoroutine(ZoneManager.Instance.CurrentMap.MapTeams[ii].Guests[jj].DieSilent()));
                }
            }


            //heal players
            foreach (Character character in ActiveTeam.IterateMainByRank())
            {
                if (character.Dead)
                {
                    Loc?endLoc = ZoneManager.Instance.CurrentMap.GetClosestTileForChar(character, ActiveTeam.Leader.CharLoc);
                    if (endLoc == null)
                    {
                        endLoc = ActiveTeam.Leader.CharLoc;
                    }
                    character.CharLoc = endLoc.Value;

                    character.HP       = character.MaxHP;
                    character.Dead     = false;
                    character.DefeatAt = "";

                    ZoneManager.Instance.CurrentMap.UpdateExploration(character);
                }
            }

            ZoneManager.Instance.CurrentMap.CurrentTurnMap.CurrentOrder.TurnIndex = 0;
            ZoneManager.Instance.CurrentMap.CurrentTurnMap.CurrentOrder.Faction   = Faction.Player;
            ZoneManager.Instance.CurrentMap.CurrentTurnMap.CurrentOrder.TurnTier  = 0;
            ZoneManager.Instance.CurrentMap.CurrentTurnMap.CurrentOrder.SkipAll   = false;
            RegenerateTurnMap();

            RemoveDeadTeams();

            DataManager.Instance.Save.RescuesLeft--;
            //fade white back with music

            //remove reward item
            MapItem offeredItem = new MapItem((action[0] == 1), action[1]);

            offeredItem.HiddenValue = action[2];

            if (offeredItem.Value > -1)
            {
                if (offeredItem.IsMoney)
                {
                    ActiveTeam.Bank -= offeredItem.Value;
                }
                else
                {
                    ItemData entry = DataManager.Instance.GetItem(offeredItem.Value);
                    if (entry.MaxStack > 1)
                    {
                        List <int> itemsToTake = new List <int>();
                        for (int ii = 0; ii < offeredItem.HiddenValue; ii++)
                        {
                            itemsToTake.Add(offeredItem.Value);
                        }
                        ActiveTeam.TakeItems(itemsToTake);
                    }
                    else if (entry.UsageType == ItemData.UseType.Box)
                    {
                        int chosenIndex = 0;
                        for (int ii = 0; ii < ActiveTeam.BoxStorage.Count; ii++)
                        {
                            if (ActiveTeam.BoxStorage[ii].ID == offeredItem.Value &&
                                ActiveTeam.BoxStorage[ii].HiddenValue == offeredItem.HiddenValue)
                            {
                                chosenIndex = ii;
                                break;
                            }
                        }
                        List <int> itemsToTake = new List <int>();
                        itemsToTake.Add(DataManager.Instance.DataIndices[DataManager.DataType.Item].Count + chosenIndex);
                    }
                    else
                    {
                        List <int> itemsToTake = new List <int>();
                        itemsToTake.Add(offeredItem.Value);
                        ActiveTeam.TakeItems(itemsToTake);
                    }
                }
            }

            if (DataManager.Instance.CurrentReplay == null)
            {
                yield return(CoroutineManager.Instance.StartCoroutine(ZoneManager.Instance.CurrentZone.OnRescued(mail)));

                yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.SetDialogue(Text.FormatKey("MSG_RESCUES_LEFT", DataManager.Instance.Save.RescuesLeft))));

                yield return(new WaitForFrames(1));
            }
            else
            {
                GameManager.Instance.SE(GraphicsManager.ReviveSE);
                GameManager.Instance.SetFade(true, true);
                yield return(CoroutineManager.Instance.StartCoroutine(GameManager.Instance.FadeIn()));

                int    nameLength = action[3];
                string name       = "";
                for (int ii = 0; ii < nameLength; ii++)
                {
                    name += (char)action[4 + ii];
                }
                LogMsg(Text.FormatKey("MSG_RESCUED_BY", name));
            }

            ZoneManager.Instance.CurrentMap.NoRescue = true;

            yield return(CoroutineManager.Instance.StartCoroutine(ProcessTurnStart(CurrentCharacter)));
        }
        public override IEnumerator <YieldInstruction> EndGame(ResultType result, ZoneLoc nextArea, bool display, bool fanfare)
        {
            bool recorded = DataManager.Instance.RecordingReplay;

            //if lose, end the play, display plaque, and go to title
            if (result != ResultType.Cleared)
            {
                if (GameManager.Instance.CurrentScene == GroundScene.Instance)
                {
                    Location = ZoneManager.Instance.CurrentGround.GetSingleLineName();
                }
                else if (GameManager.Instance.CurrentScene == DungeonScene.Instance)
                {
                    Location = ZoneManager.Instance.CurrentMap.GetSingleLineName();
                }

                Outcome = result;

                DataManager.Instance.MsgLog.Clear();
                //end the game with a recorded ending
                string recordFile = DataManager.Instance.EndPlay(this, null);

                MenuBase.Transparent = false;
                //save to the main file
                GameState  state       = DataManager.Instance.LoadMainGameState();
                List <int> newRecruits = new List <int>();
                if (state != null)
                {
                    newRecruits = MergeDexTo(state.Save);
                    DataManager.Instance.SaveGameState(state);
                }


                if (recorded && display)
                {
                    GameProgress ending = DataManager.Instance.GetRecord(Data.DataManager.REPLAY_PATH + recordFile);

                    if (fanfare)
                    {
                        if (result != ResultType.Cleared)
                        {
                            GameManager.Instance.Fanfare("Fanfare/MissionFail");
                        }
                        else
                        {
                            GameManager.Instance.Fanfare("Fanfare/MissionClear");
                        }
                    }
                    else
                    {
                        GameManager.Instance.SE("Menu/Skip");
                    }

                    FinalResultsMenu menu = new FinalResultsMenu(ending);
                    yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.ProcessMenuCoroutine(menu)));

                    Dictionary <int, List <RecordHeaderData> > scores = RecordHeaderData.LoadHighScores();
                    yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.ProcessMenuCoroutine(new ScoreMenu(scores, ZoneManager.Instance.CurrentZoneID, DataManager.REPLAY_PATH + recordFile))));
                }

                if (newRecruits.Count > 0)
                {
                    yield return(new WaitForFrames(10));

                    GameManager.Instance.Fanfare("Fanfare/NewArea");
                    yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.SetDialogue(Text.FormatKey("DLG_NEW_CHARS"))));
                }

                yield return(new WaitForFrames(20));

                GameManager.Instance.SceneOutcome = GameManager.Instance.RestartToTitle();
            }
            else
            {
                int completedZone = ZoneManager.Instance.CurrentZoneID;

                MidAdventure = true;
                ClearDungeonItems();

                //  if there isn't a next area, end the play, display the plaque, return to title screen
                //GameManager.Instance.Fanfare("Fanfare/MissionClear");
                Location = ZoneManager.Instance.CurrentZone.Name.ToLocal();

                Outcome = result;

                DataManager.Instance.MsgLog.Clear();
                //end the game with a recorded ending
                string recordFile = DataManager.Instance.EndPlay(this, null);

                MenuBase.Transparent = false;

                //save to the main file
                GameState state = DataManager.Instance.LoadMainGameState();
                if (state != null)
                {
                    MergeDexTo(state.Save);
                    state.Save.DungeonUnlocks[completedZone] = UnlockState.Completed;
                    DataManager.Instance.SaveGameState(state);
                }



                if (recorded)
                {
                    GameProgress ending = DataManager.Instance.GetRecord(DataManager.REPLAY_PATH + recordFile);

                    if (fanfare)
                    {
                        if (result != ResultType.Cleared)
                        {
                            GameManager.Instance.Fanfare("Fanfare/MissionFail");
                        }
                        else
                        {
                            GameManager.Instance.Fanfare("Fanfare/MissionClear");
                        }
                    }
                    else
                    {
                        GameManager.Instance.SE("Menu/Skip");
                    }

                    FinalResultsMenu menu = new FinalResultsMenu(ending);
                    yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.ProcessMenuCoroutine(menu)));

                    Dictionary <int, List <RecordHeaderData> > scores = RecordHeaderData.LoadHighScores();
                    yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.ProcessMenuCoroutine(new ScoreMenu(scores, ZoneManager.Instance.CurrentZoneID, DataManager.REPLAY_PATH + recordFile))));
                }

                //ask to transfer if the dungeon records progress, and it is NOT a seeded run.
                if (state != null && Stakes != DungeonStakes.None && !Seeded)
                {
                    bool           allowTransfer = false;
                    QuestionDialog question      = MenuManager.Instance.CreateQuestion(Text.FormatKey("DLG_TRANSFER_ASK"),
                                                                                       () => { allowTransfer = true; }, () => { });
                    yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.ProcessMenuCoroutine(question)));

                    if (allowTransfer)
                    {
                        MainProgress mainSave = state.Save as MainProgress;
                        //put the new recruits into assembly
                        foreach (Character character in ActiveTeam.Players)
                        {
                            if (!(character.Dead && DataManager.Instance.GetSkin(character.BaseForm.Skin).Challenge))
                            {
                                mainSave.CharsToStore.Add(new CharData(character));
                            }
                        }
                        foreach (Character character in ActiveTeam.Assembly)
                        {
                            if (!(character.Dead && DataManager.Instance.GetSkin(character.BaseForm.Skin).Challenge))
                            {
                                mainSave.CharsToStore.Add(new CharData(character));
                            }
                        }

                        //put the new items into the storage
                        foreach (InvItem item in ActiveTeam.EnumerateInv())
                        {
                            mainSave.ItemsToStore.Add(item);
                        }
                        foreach (InvItem item in ActiveTeam.BoxStorage)
                        {
                            mainSave.ItemsToStore.Add(item);
                        }

                        mainSave.StorageToStore = ActiveTeam.Storage;

                        mainSave.MoneyToStore = state.Save.ActiveTeam.Money + state.Save.ActiveTeam.Bank;
                    }

                    DataManager.Instance.SaveGameState(state);

                    if (allowTransfer)
                    {
                        yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.SetDialogue(Text.FormatKey("DLG_TRANSFER_COMPLETE"))));
                    }
                }



                yield return(new WaitForFrames(20));
            }
        }
        public override IEnumerator <YieldInstruction> EndGame(ResultType result, ZoneLoc nextArea, bool display, bool fanfare)
        {
            Outcome = result;
            bool   recorded   = DataManager.Instance.RecordingReplay;
            string recordFile = null;

            if (result == ResultType.Rescue)
            {
                Location = ZoneManager.Instance.CurrentZone.GetDisplayName();

                DataManager.Instance.MsgLog.Clear();
                //end the game with a recorded ending
                recordFile = DataManager.Instance.EndPlay(this, StartDate);

                SOSMail    sos         = Rescue.SOS;
                string     dateRescued = String.Format("{0:yyyy-MM-dd}", DateTime.Now);
                ReplayData replay      = DataManager.Instance.LoadReplay(PathMod.ModSavePath(DataManager.REPLAY_PATH, recordFile), false);
                AOKMail    aok         = new AOKMail(sos, DataManager.Instance.Save, dateRescued, replay);
                GeneratedAOK = DataManager.SaveRescueMail(PathMod.NoMod(DataManager.RESCUE_OUT_PATH + DataManager.AOK_FOLDER), aok, false);
                string deletePath = DataManager.FindRescueMail(PathMod.NoMod(DataManager.RESCUE_IN_PATH + DataManager.SOS_FOLDER), sos, sos.Extension);
                if (deletePath != null)
                {
                    File.Delete(deletePath);
                }

                if (nextArea.IsValid()) //  if an exit is specified, go to the exit.
                {
                    NextDest = nextArea;
                }
                else
                {
                    NextDest = new ZoneLoc(1, new SegLoc(-1, 1));
                }
            }
            else if (result != ResultType.Cleared)
            {
                if (GameManager.Instance.CurrentScene == GroundScene.Instance)
                {
                    Location = ZoneManager.Instance.CurrentGround.GetColoredName();
                }
                else if (GameManager.Instance.CurrentScene == DungeonScene.Instance)
                {
                    Location = ZoneManager.Instance.CurrentMap.GetColoredName();
                }

                DataManager.Instance.MsgLog.Clear();
                //end the game with a recorded ending
                recordFile = DataManager.Instance.EndPlay(this, StartDate);

                if (Outcome != ResultType.Escaped && Stakes == DungeonStakes.Risk) //remove all items
                {
                    LossPenalty(this);
                }

                if (nextArea.IsValid()) //  if an exit is specified, go to the exit.
                {
                    NextDest = nextArea;
                }
                else
                {
                    NextDest = new ZoneLoc(1, new SegLoc(-1, 1));
                }
            }
            else
            {
                int completedZone = ZoneManager.Instance.CurrentZoneID;
                DungeonUnlocks[completedZone] = UnlockState.Completed;

                Location = ZoneManager.Instance.CurrentZone.GetDisplayName();

                DataManager.Instance.MsgLog.Clear();
                //end the game with a recorded ending
                recordFile = DataManager.Instance.EndPlay(this, StartDate);

                if (nextArea.IsValid()) //  if an exit is specified, go to the exit.
                {
                    NextDest = nextArea;
                }
                else
                {
                    NextDest = new ZoneLoc(1, new SegLoc(-1, 1));
                }
            }

            TotalAdventures++;

            foreach (Character character in ActiveTeam.EnumerateChars())
            {
                character.Dead = false;
                character.FullRestore();
            }
            foreach (Character character in ActiveTeam.Assembly)
            {
                character.Dead = false;
                character.FullRestore();
            }
            MidAdventure = false;
            ClearDungeonItems();
            //clear rescue status
            Rescue = null;

            //merge back the team if the dungeon was level-limited
            yield return(CoroutineManager.Instance.StartCoroutine(RestoreLevel()));

            GameState    state    = DataManager.Instance.LoadMainGameState();
            MainProgress mainSave = state?.Save as MainProgress;

            //save the result to the main file
            if (Stakes != DungeonStakes.None)
            {
                if (mainSave != null)
                {
                    mainSave.MergeDataTo(this);
                }
                DataManager.Instance.SaveMainGameState();
            }
            else
            {
                if (mainSave != null)
                {
                    DataManager.Instance.SetProgress(mainSave);
                }
                DataManager.Instance.Save.NextDest = NextDest;
            }

            MenuBase.Transparent = false;

            if (recorded && display)
            {
                GameProgress ending = DataManager.Instance.GetRecord(PathMod.ModSavePath(DataManager.REPLAY_PATH, recordFile));

                if (fanfare)
                {
                    if (result != ResultType.Cleared && result != ResultType.Escaped && result != ResultType.Rescue)
                    {
                        GameManager.Instance.Fanfare("Fanfare/MissionFail");
                    }
                    else
                    {
                        GameManager.Instance.Fanfare("Fanfare/MissionClear");
                    }
                }
                else
                {
                    GameManager.Instance.SE("Menu/Skip");
                }

                FinalResultsMenu menu = new FinalResultsMenu(ending);
                yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.ProcessMenuCoroutine(menu)));
            }

            yield return(new WaitForFrames(20));
        }
 //Add team to list of participating teams
 void AddActiveTeam(ActiveTeam team)
 {
     activeTeams.Add(team);
 }