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); }
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."); } }
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); }
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."); } }
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); }
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; }
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)); } } } }
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); }
/// <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); }
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)); } } } }
/// <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); }