コード例 #1
0
ファイル: TestbedHelper.cs プロジェクト: planetarium/lib9c
        public static AvatarState CreateAvatarState(string name,
                                                    Address agentAddress,
                                                    Address avatarAddress,
                                                    long blockIndex,
                                                    AvatarSheets avatarSheets,
                                                    WorldSheet worldSheet,
                                                    GameConfigState gameConfigState,
                                                    Address rankingMapAddress)
        {
            var avatarState = new AvatarState(
                avatarAddress,
                agentAddress,
                blockIndex,
                avatarSheets,
                gameConfigState,
                rankingMapAddress,
                name != string.Empty ? name : "testId"
                )
            {
                worldInformation = new WorldInformation(
                    0,
                    worldSheet,
                    GameConfig.RequireClearedStageLevel.ActionsInShop),
            };

            return(avatarState);
        }
コード例 #2
0
ファイル: WorldInformation.cs プロジェクト: planetarium/lib9c
        public void AddAndUnlockMimisbrunnrWorld(
            WorldSheet.Row worldRow,
            long unlockedAt,
            WorldSheet worldSheet,
            WorldUnlockSheet worldUnlockSheet)
        {
            var succeed = false;
            var worldId = worldRow.Id;

            if (worldId == GameConfig.MimisbrunnrWorldId)
            {
                var unlockRow = worldUnlockSheet.OrderedList.FirstOrDefault(row => row.WorldIdToUnlock == worldId);
                if (!(unlockRow is null) &&
                    IsStageCleared(unlockRow.StageId))
                {
                    succeed = true;
                }
            }
            else if (IsStageCleared(worldRow.StageBegin - 1))
            {
                succeed = true;
            }

            if (succeed)
            {
                var world = new World(worldRow);
                worlds.Add(worldId, world);
                UnlockWorld(worldId, unlockedAt, worldSheet);
            }
            else
            {
                throw new FailedAddWorldException($"Failed to add {worldId} world to WorldInformation.");
            }
        }
コード例 #3
0
        public static bool TryGetByName(this WorldSheet sheet, string name, out WorldSheet.Row worldRow)
        {
            foreach (var row in sheet.OrderedList.Where(row => row.Name.Equals(name)))
            {
                worldRow = row;
                return(true);
            }

            worldRow = null;
            return(false);
        }
コード例 #4
0
ファイル: WorldInformation.cs プロジェクト: planetarium/lib9c
        public void AddAndUnlockNewWorld(WorldSheet.Row worldRow, long unlockedAt, WorldSheet worldSheet)
        {
            var worldId = worldRow.Id;

            if (IsStageCleared(worldRow.StageBegin - 1))
            {
                var world = new World(worldRow);
                worlds.Add(worldId, world);
                UnlockWorld(worldId, unlockedAt, worldSheet);
            }
            else
            {
                throw new FailedAddWorldException($"Failed to add {worldId} world to WorldInformation.");
            }
        }
コード例 #5
0
        public void Execute()
        {
            var worldSheetCsv = _initialState.GetSheetCsv <WorldSheet>();
            var worldSheet    = new WorldSheet();

            worldSheet.Set(worldSheetCsv);
            var worldSheetRowCount = worldSheet.Count;

            var worldSheetCsvColumnLine = worldSheetCsv.Split('\n').FirstOrDefault();

            Assert.NotNull(worldSheetCsvColumnLine);

            var patchTableSheetAction = new PatchTableSheet
            {
                TableName = nameof(WorldSheet),
                TableCsv  = worldSheetCsvColumnLine,
            };
            var nextState = patchTableSheetAction.Execute(new ActionContext
            {
                BlockIndex     = 0,
                PreviousStates = _initialState,
                Rehearsal      = false,
            });

            var nextWorldSheetCsv = nextState.GetSheetCsv <WorldSheet>();

            Assert.Single(nextWorldSheetCsv.Split('\n'));

            var nextWorldSheet = new WorldSheet();

            nextWorldSheet.Set(nextWorldSheetCsv);
            Assert.Empty(nextWorldSheet);

            patchTableSheetAction = new PatchTableSheet
            {
                TableName = nameof(WorldSheet),
                TableCsv  = worldSheetCsv,
            };
            nextState = patchTableSheetAction.Execute(new ActionContext
            {
                BlockIndex     = 0,
                PreviousStates = _initialState,
                Rehearsal      = false,
            });

            nextWorldSheet = nextState.GetSheet <WorldSheet>();
            Assert.Equal(worldSheetRowCount, nextWorldSheet.Count);
        }
コード例 #6
0
 public AvatarSheets(
     WorldSheet worldSheet,
     QuestSheet questSheet,
     QuestRewardSheet questRewardSheet,
     QuestItemRewardSheet questItemRewardSheet,
     EquipmentItemRecipeSheet equipmentItemRecipeSheet,
     EquipmentItemSubRecipeSheet equipmentItemSubRecipeSheet
     )
 {
     WorldSheet                  = worldSheet;
     QuestSheet                  = questSheet;
     QuestRewardSheet            = questRewardSheet;
     QuestItemRewardSheet        = questItemRewardSheet;
     EquipmentItemRecipeSheet    = equipmentItemRecipeSheet;
     EquipmentItemSubRecipeSheet = equipmentItemSubRecipeSheet;
 }
コード例 #7
0
ファイル: WorldInformation.cs プロジェクト: planetarium/lib9c
        public WorldInformation(long blockIndex, WorldSheet worldSheet, int clearStageId = 0)
        {
            if (worldSheet is null)
            {
                return;
            }

            var orderedSheet = worldSheet.OrderedList;

            _worlds = new Dictionary <int, World>();

            if (clearStageId > 0)
            {
                foreach (var row in orderedSheet)
                {
                    if (row.StageBegin > clearStageId)
                    {
                        _worlds.Add(row.Id, new World(row));
                    }
                    else if (row.StageEnd > clearStageId)
                    {
                        _worlds.Add(row.Id, new World(row, blockIndex, blockIndex, clearStageId));
                    }
                    else
                    {
                        _worlds.Add(row.Id, new World(row, blockIndex, blockIndex, row.StageEnd));
                    }
                }
            }
            else
            {
                var isFirst = true;
                foreach (var row in orderedSheet)
                {
                    var worldId = row.Id;
                    if (isFirst)
                    {
                        isFirst = false;
                        _worlds.Add(worldId, new World(row, blockIndex));
                    }
                    else
                    {
                        _worlds.Add(worldId, new World(row));
                    }
                }
            }
        }
コード例 #8
0
        public static bool TryGetByStageId(this WorldSheet sheet, int stageId,
                                           out WorldSheet.Row worldRow)
        {
            foreach (var row in sheet.OrderedList)
            {
                if (stageId < row.StageBegin || stageId > row.StageEnd)
                {
                    continue;
                }

                worldRow = row;
                return(true);
            }

            worldRow = null;
            return(false);
        }
コード例 #9
0
ファイル: WorldInformation.cs プロジェクト: planetarium/lib9c
        /// <summary>
        /// Unlock a specific world.
        /// </summary>
        /// <param name="worldId"></param>
        /// <param name="unlockedAt"></param>
        /// <param name="worldSheet"></param>
        /// <exception cref="FailedToUnlockWorldException"></exception>
        public void UnlockWorld(int worldId, long unlockedAt, WorldSheet worldSheet)
        {
            World world;

            if (worlds.ContainsKey(worldId))
            {
                world = worlds[worldId];
            }
            else if (!worldSheet.TryGetValue(worldId, out var worldRow) ||
                     !TryAddWorld(worldRow, out world))
            {
                throw new FailedToUnlockWorldException($"{nameof(worldId)}: {worldId}");
            }

            if (world.IsUnlocked)
            {
                return;
            }

            worlds[worldId] = new World(world, unlockedAt);
        }
コード例 #10
0
ファイル: WorldInformation.cs プロジェクト: planetarium/lib9c
        public WorldInformation(
            long blockIndex,
            WorldSheet worldSheet,
            bool openAllOfWorldsAndStages = false)
        {
            if (worldSheet is null)
            {
                return;
            }

            var orderedSheet = worldSheet.OrderedList;

            _worlds = new Dictionary <int, World>();

            if (openAllOfWorldsAndStages)
            {
                foreach (var row in orderedSheet)
                {
                    _worlds.Add(row.Id, new World(row, blockIndex, blockIndex, row.StageEnd));
                }
            }
            else
            {
                var isFirst = true;
                foreach (var row in orderedSheet)
                {
                    var worldId = row.Id;
                    if (isFirst)
                    {
                        isFirst = false;
                        _worlds.Add(worldId, new World(row, blockIndex));
                    }
                    else
                    {
                        _worlds.Add(worldId, new World(row));
                    }
                }
            }
        }
コード例 #11
0
ファイル: WorldInformation.cs プロジェクト: planetarium/lib9c
        /// <summary>
        /// Clear a specific stage. And consider world unlock.
        /// </summary>
        /// <param name="worldId"></param>
        /// <param name="stageId"></param>
        /// <param name="clearedAt"></param>
        /// <param name="worldSheet"></param>
        /// <param name="worldUnlockSheet"></param>
        /// <exception cref="FailedToUnlockWorldException"></exception>
        public void ClearStage(
            int worldId,
            int stageId,
            long clearedAt,
            WorldSheet worldSheet,
            WorldUnlockSheet worldUnlockSheet)
        {
            if (!worlds.ContainsKey(worldId))
            {
                return;
            }

            var world = worlds[worldId];

            if (stageId < world.StageBegin ||
                stageId > world.StageEnd)
            {
                return;
            }

            // NOTE: Always consider world unlock.
            // Because even a stage that has already been cleared can be a trigger for world unlock due to the table patch.
            if (worldUnlockSheet.TryGetUnlockedInformation(worldId, stageId, out var worldIdsToUnlock))
            {
                foreach (var worldIdToUnlock in worldIdsToUnlock)
                {
                    UnlockWorld(worldIdToUnlock, clearedAt, worldSheet);
                }
            }

            if (stageId <= world.StageClearedId)
            {
                return;
            }

            worlds[worldId] = new World(world, clearedAt, stageId);
        }