Exemple #1
0
        public IEnumerator <YieldInstruction> ExitFloor()
        {
            if (ZoneManager.Instance.CurrentMap != null)
            {
                //Notify script engine
                yield return(CoroutineManager.Instance.StartCoroutine(ZoneManager.Instance.CurrentMap.OnExit()));

                //remove statuses
                foreach (Character character in ZoneManager.Instance.CurrentMap.ActiveTeam.EnumerateChars())
                {
                    character.OnRemove();
                }

                ZoneManager.Instance.CurrentMap.ActiveTeam = null;

                //pull out all map statuses that are meant to carry over
                ZoneManager.Instance.CurrentZone.CarryOver.Clear();
                foreach (MapStatus status in ZoneManager.Instance.CurrentMap.Status.Values)
                {
                    MapStatusData data = (MapStatusData)status.GetData();
                    if (data.CarryOver)
                    {
                        ZoneManager.Instance.CurrentZone.CarryOver.Add(status);
                    }
                }

                ZoneManager.Instance.CurrentZone.SetCurrentMap(SegLoc.Invalid);
            }
        }
Exemple #2
0
        public override void Exit()
        {
            if (ZoneManager.Instance.CurrentMap != null)
            {
                //remove statuses
                foreach (Character character in ZoneManager.Instance.CurrentMap.ActiveTeam.Players)
                {
                    character.OnRemove();
                }

                ZoneManager.Instance.CurrentMap.ActiveTeam = null;

                //pull out all map statuses that are meant to carry over
                ZoneManager.Instance.CurrentZone.CarryOver.Clear();
                foreach (MapStatus status in ZoneManager.Instance.CurrentMap.Status.Values)
                {
                    MapStatusData data = (MapStatusData)status.GetData();
                    if (data.CarryOver)
                    {
                        ZoneManager.Instance.CurrentZone.CarryOver.Add(status);
                    }
                }
                ZoneManager.Instance.CurrentZone.SetCurrentMap(SegLoc.Invalid);
                ResetAnims();

                //Notify script engine
                LuaEngine.Instance.OnDungeonFloorEnd();
            }
        }
Exemple #3
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 #4
0
        public void LoadFromData()
        {
            MapStatusData entry = DataManager.Instance.GetMapStatus(ID);

            foreach (MapStatusState state in entry.StatusStates)
            {
                if (!StatusStates.Contains(state.GetType()))
                {
                    StatusStates.Set(state.Clone <MapStatusState>());
                }
            }

            Emitter = (SwitchOffEmitter)entry.Emitter.Clone();//Clone Use Case; convert to Instantiate?
            Hidden  = entry.DefaultHidden;
        }
Exemple #5
0
        public IEnumerator <YieldInstruction> BeginFloor()
        {
            ZoneManager.Instance.CurrentMap.Begun = true;
            //process map-start events (dialogue, map condition announcement, etc)
            foreach (SingleCharEvent effect in ZoneManager.Instance.CurrentMap.StartEvents)
            {
                yield return(CoroutineManager.Instance.StartCoroutine(effect.Apply(null, null, FocusedCharacter)));
            }

            foreach (Character character in ActiveTeam.Players)
            {
                yield return(CoroutineManager.Instance.StartCoroutine(SpecialIntro(character)));
            }

            //process player happenings
            foreach (Character character in ZoneManager.Instance.CurrentMap.IterateCharacters())
            {
                character.Tactic.Initialize(character);
                if (!character.Dead)
                {
                    yield return(CoroutineManager.Instance.StartCoroutine(character.OnMapStart()));
                }
            }

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


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

            foreach (Tuple <GameEventOwner, Character, SingleCharEvent> effect in IterateEvents <SingleCharEvent>(function))
            {
                yield return(CoroutineManager.Instance.StartCoroutine(effect.Item3.Apply(effect.Item1, effect.Item2, null)));
            }

            //Notify script engine
            LuaEngine.Instance.OnDungeonFloorBegin();
        }
Exemple #6
0
        public MainMenu()
        {
            bool equippedItems = false;

            foreach (Character character in DataManager.Instance.Save.ActiveTeam.Players)
            {
                if (!character.Dead && character.EquippedItem.ID > -1)
                {
                    equippedItems = true;
                    break;
                }
            }
            bool invEnabled = !(DataManager.Instance.Save.ActiveTeam.GetInvCount() == 0 && !equippedItems);

            List <MenuTextChoice> choices = new List <MenuTextChoice>();

            choices.Add(new MenuTextChoice(Text.FormatKey("MENU_MAIN_SKILLS"), () =>
            {
                int mainIndex = DataManager.Instance.Save.ActiveTeam.LeaderIndex;
                if (GameManager.Instance.CurrentScene == DungeonScene.Instance)
                {
                    CharIndex turnChar = ZoneManager.Instance.CurrentMap.CurrentTurnMap.GetCurrentTurnChar();
                    if (turnChar.Team == -1)
                    {
                        mainIndex = turnChar.Char;
                    }
                }
                MenuManager.Instance.AddMenu(new SkillMenu(mainIndex), false);
            }));
            choices.Add(new MenuTextChoice(Text.FormatKey("MENU_MAIN_INVENTORY"), () => { MenuManager.Instance.AddMenu(new ItemMenu(), false); }, invEnabled, invEnabled ? Color.White : Color.Red));

            bool hasTactics = (DataManager.Instance.Save.ActiveTeam.Players.Count > 1);
            bool inReplay   = (DataManager.Instance.CurrentReplay != null);

            choices.Add(new MenuTextChoice(Text.FormatKey("MENU_TACTICS_TITLE"), () => { MenuManager.Instance.AddMenu(new TacticsMenu(), false); }, (hasTactics && !inReplay), (hasTactics && !inReplay) ? Color.White : Color.Red));
            choices.Add(new MenuTextChoice(Text.FormatKey("MENU_TEAM_TITLE"), () => { MenuManager.Instance.AddMenu(new TeamMenu(false), false); }));

            if (GameManager.Instance.CurrentScene == DungeonScene.Instance)
            {
                bool hasGround = DungeonScene.Instance.CanCheckGround();
                choices.Add(new MenuTextChoice(Text.FormatKey("MENU_GROUND_TITLE"), checkGround, (hasGround && !inReplay), (hasGround && !inReplay) ? Color.White : Color.Red));
            }

            choices.Add(new MenuTextChoice(Text.FormatKey("MENU_OTHERS_TITLE"), () => { MenuManager.Instance.AddMenu(new OthersMenu(), false); }));
            if (!inReplay)
            {
                if (((GameManager.Instance.CurrentScene == DungeonScene.Instance)) || DataManager.Instance.Save is RogueProgress)
                {
                    choices.Add(new MenuTextChoice(Text.FormatKey("MENU_REST_TITLE"), () => { MenuManager.Instance.AddMenu(new RestMenu(), false); }));
                }
                else
                {
                    choices.Add(new MenuTextChoice(Text.FormatKey("MENU_MAIN_SAVE"), SaveAction));
                }
            }
            else
            {
                choices.Add(new MenuTextChoice(Text.FormatKey("MENU_REPLAY_TITLE"), () => { MenuManager.Instance.AddMenu(new ReplayMenu(), false); }));
            }
            choices.Add(new MenuTextChoice(Text.FormatKey("MENU_EXIT"), MenuManager.Instance.RemoveMenu));

            Initialize(new Loc(16, 16), CalculateChoiceLength(choices, 72), choices.ToArray(), Math.Min(Math.Max(0, defaultChoice), choices.Count - 1));

            titleMenu = new SummaryMenu(Rect.FromPoints(new Loc(Bounds.End.X + 16, 32), new Loc(GraphicsManager.ScreenWidth - 16, 32 + LINE_SPACE + GraphicsManager.MenuBG.TileHeight * 2)));
            MenuText title = new MenuText((GameManager.Instance.CurrentScene == DungeonScene.Instance) ? ZoneManager.Instance.CurrentMap.GetSingleLineName() : ZoneManager.Instance.CurrentGround.GetSingleLineName(),
                                          new Loc((titleMenu.Bounds.X + titleMenu.Bounds.End.X) / 2, titleMenu.Bounds.Y + GraphicsManager.MenuBG.TileHeight), DirH.None);

            title.Color = TextTan;
            titleMenu.Elements.Add(title);

            summaryMenu = new SummaryMenu(Rect.FromPoints(new Loc(16, 32 + choices.Count * VERT_SPACE + GraphicsManager.MenuBG.TileHeight * 2),
                                                          new Loc(GraphicsManager.ScreenWidth - 16, GraphicsManager.ScreenHeight - 8)));
            summaryMenu.Elements.Add(new MenuText(Text.FormatKey("MENU_BAG_MONEY", Text.FormatKey("MONEY_AMOUNT", DataManager.Instance.Save.ActiveTeam.Money)),
                                                  new Loc(summaryMenu.Bounds.X + GraphicsManager.MenuBG.TileWidth + 8, summaryMenu.Bounds.Y + GraphicsManager.MenuBG.TileHeight)));

            if (GameManager.Instance.CurrentScene == DungeonScene.Instance)
            {
                string weather = DataManager.Instance.GetMapStatus(0).Name.ToLocal();
                foreach (MapStatus status in ZoneManager.Instance.CurrentMap.Status.Values)
                {
                    if (status.StatusStates.Contains <MapWeatherState>())
                    {
                        MapStatusData entry = (MapStatusData)status.GetData();
                        weather = entry.Name.ToLocal();
                        break;
                    }
                }
                summaryMenu.Elements.Add(new MenuText(Text.FormatKey("MENU_MAP_CONDITION", weather),
                                                      new Loc(GraphicsManager.ScreenWidth / 2, summaryMenu.Bounds.Y + GraphicsManager.MenuBG.TileHeight)));
            }

            int level_length  = GraphicsManager.TextFont.SubstringWidth(Text.FormatKey("MENU_TEAM_LEVEL_SHORT", DataManager.Instance.MaxLevel));
            int hp_length     = GraphicsManager.TextFont.SubstringWidth(Text.FormatKey("MENU_TEAM_HP", 999, 999));
            int hunger_length = GraphicsManager.TextFont.SubstringWidth(Text.FormatKey("MENU_TEAM_HUNGER", Character.MAX_FULLNESS, Character.MAX_FULLNESS));

            int remaining_width = summaryMenu.Bounds.End.X - summaryMenu.Bounds.X - (GraphicsManager.MenuBG.TileWidth + 4) * 2 - level_length - hp_length - hunger_length - NicknameMenu.MAX_LENGTH;

            for (int ii = 0; ii < DataManager.Instance.Save.ActiveTeam.Players.Count; ii++)
            {
                Character character  = DataManager.Instance.Save.ActiveTeam.Players[ii];
                int       text_start = summaryMenu.Bounds.X + GraphicsManager.MenuBG.TileWidth + 4;
                summaryMenu.Elements.Add(new MenuText(character.BaseName,
                                                      new Loc(text_start, summaryMenu.Bounds.Y + GraphicsManager.MenuBG.TileHeight + (ii + 1) * LINE_SPACE)));
                text_start += NicknameMenu.MAX_LENGTH + remaining_width / 3;
                summaryMenu.Elements.Add(new MenuText(Text.FormatKey("MENU_TEAM_LEVEL_SHORT", character.Level),
                                                      new Loc(text_start + level_length / 2, summaryMenu.Bounds.Y + GraphicsManager.MenuBG.TileHeight + (ii + 1) * LINE_SPACE), DirH.None));
                text_start += level_length + remaining_width / 3;
                summaryMenu.Elements.Add(new MenuText(Text.FormatKey("MENU_TEAM_HP", character.HP, character.MaxHP),
                                                      new Loc(text_start + hp_length / 2, summaryMenu.Bounds.Y + GraphicsManager.MenuBG.TileHeight + (ii + 1) * LINE_SPACE), DirH.None));
                text_start += hp_length + remaining_width / 3;
                summaryMenu.Elements.Add(new MenuText(Text.FormatKey("MENU_TEAM_HUNGER", character.Fullness, character.MaxFullness),
                                                      new Loc(text_start + hunger_length / 2, summaryMenu.Bounds.Y + GraphicsManager.MenuBG.TileHeight + (ii + 1) * LINE_SPACE), DirH.None));
            }
        }
Exemple #7
0
        private IEnumerator <YieldInstruction> ProcessMapTurnEnd()
        {
            //turn ends for all
            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.OnMapTurnEnds, null);
                ZoneManager.Instance.CurrentMap.MapEffect.AddEventsToQueue(queue, maxPriority, ref nextPriority, ZoneManager.Instance.CurrentMap.MapEffect.OnMapTurnEnds, 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.OnMapTurnEnds, 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.OnMapTurnEnds, character);
                        }
                    }
                    portPriority++;
                }
            };

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


            ZoneManager.Instance.CurrentMap.MapTurns++;
            DataManager.Instance.Save.TotalTurns++;


            //Map Respawns
            if (ZoneManager.Instance.CurrentMap.RespawnTime > 0 && ZoneManager.Instance.CurrentMap.MapTurns % ZoneManager.Instance.CurrentMap.RespawnTime == 0)
            {
                int totalFoes = 0;
                foreach (Team team in ZoneManager.Instance.CurrentMap.MapTeams)
                {
                    foreach (Character character in team.Players)
                    {
                        if (!character.Dead)
                        {
                            totalFoes++;
                        }
                    }
                }
                if (totalFoes < ZoneManager.Instance.CurrentMap.MaxFoes)
                {
                    List <Character> respawns = ZoneManager.Instance.CurrentMap.RespawnMob();
                    foreach (Character respawn in respawns)
                    {
                        respawn.Tactic.Initialize(respawn);
                        if (!respawn.Dead)
                        {
                            yield return(CoroutineManager.Instance.StartCoroutine(respawn.OnMapStart()));

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

            //check EXP because someone could've died
            yield return(CoroutineManager.Instance.StartCoroutine(CheckEXP()));

            ////increment time for zone manager
            //ZoneManager.TimeOfDay prevTime = DataManager.Instance.Save.Time;
            //ZoneManager.Instance.TimeCycle = (DataManager.Instance.Save.TimeCycle + 1) % (2 * (DataManager.MAJOR_TIME_DUR + DataManager.MINOR_TIME_DUR));
            //if (prevTime != DataManager.Instance.Save.Time)
            //DataManager.Instance.Save.LogMsg(Text.FormatKey("MENU_TIME_OF_DAY", DataManager.Instance.Save.Time));
        }