Example #1
0
        public IEnumerator <YieldInstruction> MoveToEditor(bool newGround, string name)
        {
            BaseScene destScene = GroundEditScene.Instance;// newGround ? (BaseScene)GroundScene.Instance : DungeonScene.Instance;

            ZoneLoc destLoc = ZoneLoc.Invalid;

            if (ZoneManager.Instance.CurrentZoneID > -1)
            {
                destLoc = new ZoneLoc(ZoneManager.Instance.CurrentZoneID, ZoneManager.Instance.CurrentMapID);
            }

            exitMap(destScene);

            ZoneManager.Instance.MoveToDevZone(newGround, name);

            //Transparency mode
            MenuBase.Transparent = true;

            //switch in new scene
            MoveToScene(destScene);

            if (newGround)
            {
                GroundEditScene.Instance.EnterGroundEdit(0);
            }
            else
            {
            }
            if (DataManager.Instance.Save != null)
            {
                DataManager.Instance.Save.NextDest = destLoc;
            }
            yield break;
        }
Example #2
0
        public ClearZone(int t0, Actor who, ZoneLoc dest) : base(t0, who)
        {
            m_Zone  = dest;
            threats = who.Threats    // these two should agree on whether they're null or not
#if DEBUG
                      ?? throw new ArgumentNullException("who.Threats")
#endif
            ;
            tourism = who.InterestingLocs
#if DEBUG
                      ?? throw new ArgumentNullException("who.InterestingLocs")
#endif
            ;
            Func <Point, bool> ok = pt => m_Zone.Rect.Contains(pt);
            m_Unverified.UnionWith(threats.ThreatWhere(dest.m).Where(ok));
            m_Unverified.UnionWith(tourism.In(dest.m).Where(ok));
#if OBSOLETE
            // the civilian case
            if (null == threats && null == sights_to_see)
            {
                m_Unverified.UnionWith(m_Zone.Rect.Where(pt => who.CanEnter(new Location(m_Zone.m, pt)))); // \todo? eliminate GC thrashing
            }
#endif
            // nonserialized fields
            oai = (m_Actor.Controller as ObjectiveAI)
#if DEBUG
                  ?? throw new ArgumentNullException("who.Controller is ObjectiveAI")
#endif
            ;
        }
Example #3
0
 public IEnumerator <YieldInstruction> BeginSegment(ZoneLoc nextZone)
 {
     DataManager.Instance.Save.NextDest = nextZone;
     if (DataManager.Instance.RecordingReplay)
     {
         DataManager.Instance.LogState();
     }
     SceneOutcome = MoveToZone(nextZone);
     yield break;
 }
Example #4
0
 public Point Reanchor(Location loc)
 {
     if (m_Domain.m != loc.Map)
     {
         var origin = m_Domain.Rect.Location;
         var tl     = new Location(m_Domain.m, origin);
         var denorm = loc.Map.Denormalize(tl);
         if (null == denorm)
         {
             throw new InvalidOperationException("cannot re-anchor");
         }
         // \todo re-positioned Rectangle ideally would contain loc.Position
         m_Domain = new ZoneLoc(loc.Map, new Rectangle(denorm.Value.Position, m_Domain.Rect.Size));
         return(origin - denorm.Value.Position);
     }
     return(new Point(0, 0));
 }
Example #5
0
        public IEnumerator <YieldInstruction> DebugWarp(ZoneLoc dest, ulong seed)
        {
            DataManager.Instance.MsgLog.Clear();
            DataManager.Instance.EndPlay(null, null);
            if (DataManager.Instance.Save == null)
            {
                newGamePlus(seed);
            }
            else
            {
                DataManager.Instance.Save.Rand = new ReRandom(seed);
            }

            DataManager.Instance.Save.NextDest = dest;
            DataManager.Instance.Save.RestartLogs(MathUtils.Rand.NextUInt64());
            DataManager.Instance.Save.MidAdventure = true;
            yield return(CoroutineManager.Instance.StartCoroutine(MoveToZone(DataManager.Instance.Save.NextDest, true)));
        }
Example #6
0
        public GameProgress()
        {
            ActiveTeam = new ExplorerTeam();

            Dex            = new UnlockState[DataManager.Instance.DataIndices[DataManager.DataType.Monster].Count];
            DungeonUnlocks = new UnlockState[DataManager.Instance.DataIndices[DataManager.DataType.Zone].Count];

            NextDest = ZoneLoc.Invalid;

            StartLevel  = -1;
            StartDate   = "";
            UUID        = "";
            ProfilePics = new ProfilePic[0];
            EndDate     = "";
            Location    = "";
            Trail       = new List <string>();
            Outcome     = ResultType.Unknown;
        }
Example #7
0
 public MapKripke(ZoneLoc z, Actor?viewpoint = null)
 {
     m_Domain   = z;
     _viewpoint = viewpoint;
     if (null != viewpoint)
     {
         update(viewpoint.Controller.FOVloc); // AI
     }
     else                                     // Socrates' Daimon
     {
         m_Domain.DoForEach(loc => {
             var obj = loc.MapObject;
             if (null != obj)
             {
                 (_knownMapObjects ??= new Dictionary <Location, MapObject>()).Add(loc, obj);
             }
         });
     }
 }
Example #8
0
        public SOSMail(GameProgress progress, ZoneLoc goal, LocalText goalText, string dateTime, Version version)
        {
            TeamName        = progress.ActiveTeam.Name;
            TeamID          = progress.UUID;
            DateDefeated    = dateTime;
            DefeatedVersion = version;

            List <MonsterID> teamProfile = new List <MonsterID>();

            foreach (Character chara in progress.ActiveTeam.Players)
            {
                teamProfile.Add(chara.BaseForm);
            }
            TeamProfile = teamProfile.ToArray();

            Seed        = progress.Rand.FirstSeed;
            TurnsTaken  = progress.TotalTurns;
            Goal        = goal;
            GoalText    = goalText;
            OfferedItem = new MapItem();
        }
Example #9
0
        public IEnumerator <YieldInstruction> BeginGameInSegment(ZoneLoc nextZone, GameProgress.DungeonStakes stakes, bool recorded, bool silentRestrict)
        {
            yield return(CoroutineManager.Instance.StartCoroutine(BeginGame(nextZone.ID, MathUtils.Rand.NextUInt64(), stakes, recorded, silentRestrict)));

            yield return(CoroutineManager.Instance.StartCoroutine(BeginSegment(nextZone)));
        }
Example #10
0
        public IEnumerator <YieldInstruction> MoveToZone(ZoneLoc destId, bool forceNewZone = false, bool preserveMusic = false)
        {
            bool      newGround = (destId.StructID.Segment <= -1);
            BaseScene destScene = newGround ? (BaseScene)GroundScene.Instance : DungeonScene.Instance;

            exitMap(destScene);

            //switch location
            if (destId.ID == ZoneManager.Instance.CurrentZoneID && !forceNewZone)
            {
                ZoneManager.Instance.CurrentZone.SetCurrentMap(destId.StructID);
            }
            else
            {
                ZoneManager.Instance.MoveToZone(destId.ID, destId.StructID, unchecked (DataManager.Instance.Save.Rand.FirstSeed + (ulong)destId.ID));//NOTE: there are better ways to seed a multi-dungeon adventure
                yield return(CoroutineManager.Instance.StartCoroutine(ZoneManager.Instance.CurrentZone.OnInit()));
            }

            //Transparency mode
            MenuBase.Transparent = !newGround;

            //switch in new scene
            MoveToScene(destScene);
            if (newGround && CurrentScene != GroundScene.Instance)
            {
                LuaEngine.Instance.OnGroundModeBegin();
            }
            else if (!newGround && CurrentScene != DungeonScene.Instance)
            {
                LuaEngine.Instance.OnDungeonModeBegin();
            }


            if (newGround)
            {
                if (!preserveMusic)
                {
                    BGM(ZoneManager.Instance.CurrentGround.Music, true);
                }

                GroundScene.Instance.EnterGround(destId.EntryPoint);
                yield return(CoroutineManager.Instance.StartCoroutine(GroundScene.Instance.InitGround()));

                //no fade; the script handles that itself
                yield return(CoroutineManager.Instance.StartCoroutine(GroundScene.Instance.BeginGround()));
            }
            else
            {
                if (!preserveMusic)
                {
                    BGM(ZoneManager.Instance.CurrentMap.Music, true);
                }

                DungeonScene.Instance.EnterFloor(destId.EntryPoint);
                yield return(CoroutineManager.Instance.StartCoroutine(DungeonScene.Instance.PrepareFloor()));

                if (IsFaded())
                {
                    if (ZoneManager.Instance.CurrentMap.DropTitle)
                    {
                        yield return(CoroutineManager.Instance.StartCoroutine(FadeTitle(true, ZoneManager.Instance.CurrentMap.Name.ToLocal())));

                        yield return(new WaitForFrames(30));

                        yield return(CoroutineManager.Instance.StartCoroutine(FadeTitle(false, "")));
                    }
                    yield return(CoroutineManager.Instance.StartCoroutine(FadeIn()));
                }

                yield return(CoroutineManager.Instance.StartCoroutine(DungeonScene.Instance.BeginFloor()));
            }
            DataManager.Instance.Save.NextDest = ZoneLoc.Invalid;
        }
Example #11
0
        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));
            }
        }
Example #12
0
        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.Name.ToLocal();

                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(DataManager.REPLAY_PATH + recordFile, false);
                AOKMail    aok         = new AOKMail(sos, DataManager.Instance.Save, dateRescued, replay);
                GeneratedAOK = DataManager.SaveRescueMail(DataManager.RESCUE_OUT_PATH + DataManager.AOK_PATH, aok, false);
                string deletePath = DataManager.FindRescueMail(DataManager.RESCUE_IN_PATH + DataManager.SOS_PATH, 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.GetSingleLineName();
                }
                else if (GameManager.Instance.CurrentScene == DungeonScene.Instance)
                {
                    Location = ZoneManager.Instance.CurrentMap.GetSingleLineName();
                }

                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.Name.ToLocal();

                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.Players)
            {
                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()));

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

            MenuBase.Transparent = false;

            if (recorded && display)
            {
                GameProgress ending = DataManager.Instance.GetRecord(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));
        }
Example #13
0
 public abstract IEnumerator <YieldInstruction> EndGame(ResultType result, ZoneLoc nextArea, bool display, bool fanfare);
Example #14
0
        public IEnumerator <YieldInstruction> travelMenuFlow(LuaTable dungeons, LuaTable grounds)
        {
            ZoneLoc chosenDest = ZoneLoc.Invalid;

            List <int> availableDungeons         = new List <int>();
            List <Tuple <int, int[]> > goodsList = new List <Tuple <int, int[]> >();

            foreach (object key in dungeons.Keys)
            {
                int entry = (int)(Int64)dungeons[key];
                availableDungeons.Add(entry);
            }

            List <ZoneLoc> availableGrounds = new List <ZoneLoc>();

            foreach (object key in grounds.Keys)
            {
                LuaTable entry      = grounds[key] as LuaTable;
                int      zone       = (int)(Int64)entry["Zone"];
                int      id         = (int)(Int64)entry["ID"];
                int      entryPoint = (int)(Int64)entry["Entry"];
                availableGrounds.Add(new ZoneLoc(zone, new SegLoc(-1, id), entryPoint));
            }

            if (availableDungeons.Count + availableGrounds.Count == 1)
            {
                if (availableDungeons.Count == 1)
                {
                    //ask directly if the player wants to enter the one dungeon possible
                    yield return(CoroutineManager.Instance.StartCoroutine(askDungeonQuestion(availableDungeons[0], () => { chosenDest = new ZoneLoc(availableDungeons[0], new SegLoc(0, 0)); }, () => { })));
                }
                if (availableGrounds.Count == 1)
                {
                    ZoneData       zone     = DataManager.Instance.GetZone(availableGrounds[0].ID);
                    QuestionDialog question = MenuManager.Instance.CreateQuestion(Text.FormatKey("DLG_ASK_ENTER_GROUND", DataManager.Instance.GetGround(zone.GroundMaps[availableGrounds[0].StructID.ID]).GetSingleLineName()),
                                                                                  () => { chosenDest = availableGrounds[0]; }, () => { });
                    yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.ProcessMenuCoroutine(question)));
                }
            }
            else if (availableDungeons.Count + availableGrounds.Count > 1)
            {
                //give the player the choice between all the possible dungeons
                yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.ProcessMenuCoroutine(new DungeonsMenu(availableDungeons, availableGrounds,
                                                                                                                                 (int choice) => { chosenDest = new ZoneLoc(availableDungeons[choice], new SegLoc(0, 0)); },
                                                                                                                                 (int choice) => { chosenDest = new ZoneLoc(availableGrounds[choice].ID, new SegLoc(-1, availableGrounds[choice].StructID.ID), availableGrounds[choice].EntryPoint); }))));
            }

            if (chosenDest.IsValid())
            {
                GameManager.Instance.BGM("", true);
                yield return(CoroutineManager.Instance.StartCoroutine(GameManager.Instance.FadeOut(false)));

                if (chosenDest.StructID.Segment > -1)
                {
                    yield return(CoroutineManager.Instance.StartCoroutine(GameManager.Instance.BeginGameInSegment(chosenDest, GameProgress.DungeonStakes.Risk, true, false)));
                }
                else
                {
                    GameManager.Instance.SceneOutcome = GameManager.Instance.MoveToZone(chosenDest);
                }
            }
        }