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