diff --git a/Arrowgene.Ddon.Database/Arrowgene.Ddon.Database.csproj b/Arrowgene.Ddon.Database/Arrowgene.Ddon.Database.csproj
index ef7d358a2..c12d88fbd 100644
--- a/Arrowgene.Ddon.Database/Arrowgene.Ddon.Database.csproj
+++ b/Arrowgene.Ddon.Database/Arrowgene.Ddon.Database.csproj
@@ -32,8 +32,18 @@
Files\%(RecursiveDir)%(Filename)%(Extension)
+
+
+
+
+
+
+
+ PreserveNewest
+
+
diff --git a/Arrowgene.Ddon.Database/DdonDatabaseBuilder.cs b/Arrowgene.Ddon.Database/DdonDatabaseBuilder.cs
index dc0073796..cfa8490a0 100644
--- a/Arrowgene.Ddon.Database/DdonDatabaseBuilder.cs
+++ b/Arrowgene.Ddon.Database/DdonDatabaseBuilder.cs
@@ -14,7 +14,7 @@ public static class DdonDatabaseBuilder
private static readonly ILogger Logger = LogProvider.Logger(typeof(DdonDatabaseBuilder));
private const string DefaultSchemaFile = "Script/schema_sqlite.sql";
- public const uint Version = 23;
+ public const uint Version = 24;
public static IDatabase Build(DatabaseSetting settings)
{
diff --git a/Arrowgene.Ddon.Database/Files/Database/Script/migration_epitaph_road.sql b/Arrowgene.Ddon.Database/Files/Database/Script/migration_epitaph_road.sql
new file mode 100644
index 000000000..f2fa7576b
--- /dev/null
+++ b/Arrowgene.Ddon.Database/Files/Database/Script/migration_epitaph_road.sql
@@ -0,0 +1,6 @@
+CREATE TABLE ddon_epitaph_road_unlocks (
+ "character_id" INTEGER NOT NULL,
+ "epitaph_id" INTEGER NOT NULL,
+ CONSTRAINT "pk_ddon_epitaph_road_unlocks" PRIMARY KEY ("character_id", "epitaph_id"),
+ CONSTRAINT "fk_ddon_epitaph_road_unlocks_character_id" FOREIGN KEY ("character_id") REFERENCES "ddon_character"("character_id") ON DELETE CASCADE
+);
diff --git a/Arrowgene.Ddon.Database/Files/Database/Script/schema_sqlite.sql b/Arrowgene.Ddon.Database/Files/Database/Script/schema_sqlite.sql
index 7fc2adf20..e83a0cf6a 100644
--- a/Arrowgene.Ddon.Database/Files/Database/Script/schema_sqlite.sql
+++ b/Arrowgene.Ddon.Database/Files/Database/Script/schema_sqlite.sql
@@ -750,3 +750,10 @@ CREATE TABLE IF NOT EXISTS "ddon_clan_membership"
CONSTRAINT "fk_ddon_clan_membership_character_id" FOREIGN KEY ("character_id") REFERENCES "ddon_character" ("character_id") ON DELETE CASCADE,
CONSTRAINT "fk_ddon_clan_membership_clan_id" FOREIGN KEY ("clan_id") REFERENCES "ddon_clan_param" ("clan_id") ON DELETE CASCADE
);
+
+CREATE TABLE IF NOT EXISTS "ddon_epitaph_road_unlocks" (
+ "character_id" INTEGER NOT NULL,
+ "epitaph_id" INTEGER NOT NULL,
+ CONSTRAINT "pk_ddon_epitaph_road_unlocks" PRIMARY KEY ("character_id", "epitaph_id"),
+ CONSTRAINT "fk_ddon_epitaph_road_unlocks_character_id" FOREIGN KEY ("character_id") REFERENCES "ddon_character"("character_id") ON DELETE CASCADE
+);
diff --git a/Arrowgene.Ddon.Database/IDatabase.cs b/Arrowgene.Ddon.Database/IDatabase.cs
index 2f67291bf..4040bbbaa 100644
--- a/Arrowgene.Ddon.Database/IDatabase.cs
+++ b/Arrowgene.Ddon.Database/IDatabase.cs
@@ -578,5 +578,9 @@ bool InsertBBMContentTreasure(
List GetClanMemberList(uint clanId, DbConnection? connectionIn = null);
CDataClanMemberInfo GetClanMember(uint characterId, DbConnection? connectionIn = null);
bool UpdateClanMember(CDataClanMemberInfo memberInfo, uint clanId, DbConnection? connectionIn = null);
+
+ // Epitaph Road
+ bool InsertEpitahRoadUnlock(uint characterId, uint epitaphId, DbConnection? connectionIn = null);
+ List GetEpitahRoadUnlocks(uint characterId, DbConnection? connectionIn = null);
}
}
diff --git a/Arrowgene.Ddon.Database/Sql/Core/DdonSqlDbEpitaphRoadUnlocks.cs b/Arrowgene.Ddon.Database/Sql/Core/DdonSqlDbEpitaphRoadUnlocks.cs
new file mode 100644
index 000000000..344d40218
--- /dev/null
+++ b/Arrowgene.Ddon.Database/Sql/Core/DdonSqlDbEpitaphRoadUnlocks.cs
@@ -0,0 +1,53 @@
+using System.Collections.Generic;
+using System.Data.Common;
+
+namespace Arrowgene.Ddon.Database.Sql.Core
+{
+ public abstract partial class DdonSqlDb : SqlDb
+ where TCon : DbConnection
+ where TCom : DbCommand
+ where TReader : DbDataReader
+ {
+ /* ddon_epitaph_road_unlocks */
+ protected static readonly string[] EpitaphRoadUnlocksFields = new string[]
+ {
+ "character_id", "epitaph_id"
+ };
+
+ private readonly string SqlSelectEpitaphUnlocks = $"SELECT {BuildQueryField(EpitaphRoadUnlocksFields)} FROM \"ddon_epitaph_road_unlocks\" WHERE \"character_id\"=@character_id;";
+ private readonly string SqlInsertEpitaphUnlocks = $"INSERT INTO \"ddon_epitaph_road_unlocks\" ({BuildQueryField(EpitaphRoadUnlocksFields)}) VALUES ({BuildQueryInsert(EpitaphRoadUnlocksFields)});";
+
+ public bool InsertEpitahRoadUnlock(uint characterId, uint epitaphId, DbConnection? connectionIn = null)
+ {
+ using TCon connection = OpenNewConnection();
+ return ExecuteNonQuery(connection, SqlInsertEpitaphUnlocks, command =>
+ {
+ AddParameter(command, "character_id", characterId);
+ AddParameter(command, "epitaph_id", epitaphId);
+ }) == 1;
+ }
+
+ public List GetEpitahRoadUnlocks(uint characterId, DbConnection? connectionIn = null)
+ {
+ using TCon connection = OpenNewConnection();
+
+ var results = new List();
+
+ ExecuteInTransaction(connection =>
+ {
+ ExecuteReader(connection, SqlSelectEpitaphUnlocks, command =>
+ {
+ AddParameter(command, "character_id", characterId);
+ }, reader =>
+ {
+ while (reader.Read())
+ {
+ results.Add(GetUInt32(reader, "epitaph_id"));
+ }
+ });
+ });
+
+ return results;
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Database/Sql/Core/Migration/00000024_EpitaphRoadMigration.cs b/Arrowgene.Ddon.Database/Sql/Core/Migration/00000024_EpitaphRoadMigration.cs
new file mode 100644
index 000000000..333ff6ec5
--- /dev/null
+++ b/Arrowgene.Ddon.Database/Sql/Core/Migration/00000024_EpitaphRoadMigration.cs
@@ -0,0 +1,24 @@
+using System.Data.Common;
+
+namespace Arrowgene.Ddon.Database.Sql.Core.Migration
+{
+ public class EpitaphRoadMigration : IMigrationStrategy
+ {
+ public uint From => 23;
+ public uint To => 24;
+
+ private readonly DatabaseSetting DatabaseSetting;
+
+ public EpitaphRoadMigration(DatabaseSetting databaseSetting)
+ {
+ DatabaseSetting = databaseSetting;
+ }
+
+ public bool Migrate(IDatabase db, DbConnection conn)
+ {
+ string adaptedSchema = DdonDatabaseBuilder.GetAdaptedSchema(DatabaseSetting, "Script/migration_epitaph_road.sql");
+ db.Execute(conn, adaptedSchema);
+ return true;
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.GameServer/Characters/BonusDungeonManager.cs b/Arrowgene.Ddon.GameServer/Characters/BonusDungeonManager.cs
index 5a884f803..e61301817 100644
--- a/Arrowgene.Ddon.GameServer/Characters/BonusDungeonManager.cs
+++ b/Arrowgene.Ddon.GameServer/Characters/BonusDungeonManager.cs
@@ -38,8 +38,12 @@ public void StartDungeon(PartyGroup party)
}
var dungeonId = _ContentId[party.Id];
- var dungeonInfo = _BonusDungeonAsset.DungeonInfo[dungeonId];
+ if (!_BonusDungeonAsset.DungeonInfo.ContainsKey(dungeonId))
+ {
+ return;
+ }
+ var dungeonInfo = _BonusDungeonAsset.DungeonInfo[dungeonId];
foreach (var memberClient in party.Clients)
{
var itemUpdateList = new List();
@@ -57,7 +61,7 @@ public void StartDungeon(PartyGroup party)
EndPartyReadyCheck(party);
- var ntc = new S2CStageTicketDungeonStartNtc()
+ var ntc = new S2CStageDungeonStartNtc()
{
Unk0 = dungeonId,
StageId = dungeonInfo.StageId,
diff --git a/Arrowgene.Ddon.GameServer/Characters/CharacterManager.cs b/Arrowgene.Ddon.GameServer/Characters/CharacterManager.cs
index 0de957147..576e4aa5c 100644
--- a/Arrowgene.Ddon.GameServer/Characters/CharacterManager.cs
+++ b/Arrowgene.Ddon.GameServer/Characters/CharacterManager.cs
@@ -58,6 +58,8 @@ public Character SelectCharacter(uint characterId)
return null;
}
+ character.EpitaphRoadState.UnlockedContent = _Server.Database.GetEpitahRoadUnlocks(character.CharacterId);
+
UpdateCharacterExtendedParams(character);
SelectPawns(character);
diff --git a/Arrowgene.Ddon.GameServer/Characters/EpitaphRoadManager.cs b/Arrowgene.Ddon.GameServer/Characters/EpitaphRoadManager.cs
new file mode 100644
index 000000000..c54bed0fa
--- /dev/null
+++ b/Arrowgene.Ddon.GameServer/Characters/EpitaphRoadManager.cs
@@ -0,0 +1,715 @@
+using Arrowgene.Ddon.GameServer.Party;
+using Arrowgene.Ddon.Server;
+using Arrowgene.Ddon.Shared.Asset;
+using Arrowgene.Ddon.Shared.Entity.PacketStructure;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Model;
+using Arrowgene.Ddon.Shared.Model.EpitaphRoad;
+using Arrowgene.Logging;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using static System.Collections.Specialized.BitVector32;
+
+namespace Arrowgene.Ddon.GameServer.Characters
+{
+ public class EpitaphPartyRewards
+ {
+ public EpitaphPartyRewards()
+ {
+ ItemRewards = new List();
+ BuffRewards = new List();
+ }
+
+ public uint TrialId { get; set; }
+ public List ItemRewards { get; set; }
+ public List BuffRewards { get; set; }
+ }
+
+ public class EpitaphPartyState
+ {
+ public EpitaphPartyState()
+ {
+ Objectives = new Dictionary();
+ Trial = new EpitaphTrialOption();
+ }
+
+ public uint PartyId { get; set; }
+ public uint TimerId { get; set; }
+ public SoulOrdealObjective PrimaryObjective;
+ public Dictionary Objectives { get; set; }
+ public EpitaphTrialOption Trial { get; set; }
+
+ public List GetObjectiveList()
+ {
+ var results = new List();
+ foreach (var objective in Objectives.Values)
+ {
+ results.Add(objective.AsCDataSoulOrdealObjective());
+ }
+ return results;
+ }
+ }
+
+ public class EpitaphRoadManager
+ {
+ private static readonly ServerLogger Logger = LogProvider.Logger(typeof(EpitaphRoadManager));
+
+ private DdonGameServer _Server;
+ private EpitaphTrialAsset _TrialAssets;
+ private EpitaphRoadAsset _EpitaphAssets;
+
+ private Dictionary _TrialsInProgress;
+ private Dictionary> _TrialHasRewards;
+ private Dictionary>> _PartyBuffs;
+ private Dictionary> _CompletedTrials;
+
+ public EpitaphRoadManager(DdonGameServer server)
+ {
+ _Server = server;
+ _TrialAssets = server.AssetRepository.EpitaphTrialAssets;
+ _EpitaphAssets = server.AssetRepository.EpitaphRoadAssets;
+ _TrialsInProgress = new Dictionary();
+ _TrialHasRewards = new Dictionary>();
+ _PartyBuffs = new Dictionary>>();
+ _CompletedTrials = new Dictionary>();
+ }
+
+ public void StartTrial(PartyGroup party, uint trialId)
+ {
+ lock (_TrialsInProgress)
+ {
+ if (_TrialsInProgress.ContainsKey(party.Id))
+ {
+ Logger.Error($"Party={party.Id} is trying to start a new trial while one is already in progress");
+ return;
+ }
+
+ if (!_CompletedTrials.ContainsKey(party.Id))
+ {
+ _CompletedTrials[party.Id] = new List();
+ }
+
+ var trial = GetTrialOption(trialId);
+
+ var partyState = new EpitaphPartyState()
+ {
+ Trial = trial,
+ PrimaryObjective = trial.Objectives.Values.Where(x => x.Priority == SoulOrdealObjectivePriority.Primary).Select(x => x.Type).First(),
+ Objectives = trial.CreateNewObjectiveState()
+ };
+ _TrialsInProgress[party.Id] = partyState;
+
+ var ntc = new S2CSeasonDungeonExecuteSoulOrdealNtc()
+ {
+ TrialId = trial.TrialId,
+ TrialName = trial.TrialName,
+ ObjectiveList = partyState.GetObjectiveList(),
+ };
+ party.SendToAll(ntc);
+
+ foreach (var enemyGroup in trial.EnemyGroups.Values)
+ {
+ party.InstanceEnemyManager.ResetEnemyNode(enemyGroup.StageId);
+ party.SendToAll(new S2CInstanceEnemyGroupResetNtc() { LayoutId = enemyGroup.StageId.ToStageLayoutId() });
+ }
+
+ if (partyState.Objectives.ContainsKey(SoulOrdealObjective.CompleteConditionsWithinTimeLimit))
+ {
+ partyState.TimerId = _Server.TimerManager.CreateTimer(partyState.Objectives[SoulOrdealObjective.CompleteConditionsWithinTimeLimit].Param1, () =>
+ {
+ Logger.Info($"(SoulOrdeal) Timer expired for Id={party.Id}");
+ EndTrial(party, partyState, SoulOrdealEndState.Failed);
+ });
+ _Server.TimerManager.StartTimer(partyState.TimerId);
+ Logger.Info($"Starting {partyState.Objectives[SoulOrdealObjective.CompleteConditionsWithinTimeLimit].Param1} second timer for PartyId={party.Id}");
+ }
+ }
+ }
+
+ public uint GetTrialIdInProgress(PartyGroup party)
+ {
+ lock (_TrialsInProgress)
+ {
+ if (!_TrialsInProgress.ContainsKey(party.Id))
+ {
+ return 0;
+ }
+ return _TrialsInProgress[party.Id].Trial.TrialId;
+ }
+ }
+
+ public bool TrialInProgress(PartyGroup party)
+ {
+ lock (_TrialsInProgress)
+ {
+ return _TrialsInProgress.ContainsKey(party.Id);
+ }
+ }
+
+ public bool TrialHasRewards(PartyGroup party, StageId OmLayoutId)
+ {
+ lock (_TrialsInProgress)
+ {
+ if (!_TrialHasRewards.ContainsKey(party.Id))
+ {
+ return false;
+ }
+
+ var rewards = _TrialHasRewards[party.Id];
+ return rewards.ContainsKey(OmLayoutId);
+ }
+ }
+
+ public EpitaphPartyRewards GetRewards(PartyGroup party, StageId OmLayoutId)
+ {
+ lock (_TrialsInProgress)
+ {
+ if (!_TrialHasRewards.ContainsKey(party.Id))
+ {
+ return null;
+ }
+
+ var rewards = _TrialHasRewards[party.Id];
+ if (!rewards.ContainsKey(OmLayoutId))
+ {
+ return null;
+ }
+ return rewards[OmLayoutId];
+ }
+ }
+
+ public uint GetRewardTrialId(PartyGroup party, StageId OmLayoutId)
+ {
+ lock (_TrialsInProgress)
+ {
+ if (!_TrialHasRewards.ContainsKey(party.Id))
+ {
+ return 0;
+ }
+
+ var rewards = _TrialHasRewards[party.Id];
+ return rewards[OmLayoutId].TrialId;
+ }
+ }
+
+ public void CollectTrialRewards(PartyGroup party, StageId OmLayoutId)
+ {
+ lock (_TrialsInProgress)
+ {
+ if (!_TrialHasRewards.ContainsKey(party.Id))
+ {
+ return;
+ }
+
+ var rewards = _TrialHasRewards[party.Id];
+ rewards.Remove(OmLayoutId);
+ }
+ }
+
+ public bool TrialHasEnemies(PartyGroup party, StageId stageId, byte subgroupId)
+ {
+ lock (_TrialsInProgress)
+ {
+ if (!_TrialsInProgress.ContainsKey(party.Id))
+ {
+ return false;
+ }
+
+ var trial = _TrialsInProgress[party.Id].Trial;
+ if (trial == null)
+ {
+ return false;
+ }
+
+ return trial.EnemyGroupsByStageId.ContainsKey(stageId) && trial.EnemyGroupsByStageId[stageId].SubGroupId == subgroupId;
+ }
+ }
+
+ public List GetInstancedEnemies(PartyGroup party, StageId stageId, byte subgroupId)
+ {
+ lock (_TrialsInProgress)
+ {
+ if (!_TrialsInProgress.ContainsKey(party.Id))
+ {
+ return new List();
+ }
+
+ var trial = _TrialsInProgress[party.Id].Trial;
+ if (trial == null)
+ {
+ return new List();
+ }
+
+ return trial.EnemyGroupsByStageId[stageId].CreateNewInstance();
+ }
+ }
+
+ public void EvaluateAbnormalStatus(PartyGroup party, uint statusId)
+ {
+ lock (_TrialsInProgress)
+ {
+ var partyState = GetPartyState(party);
+ if (partyState.Objectives.ContainsKey(SoulOrdealObjective.CannotBeAffectedByAbnormalStatus))
+ {
+ var objective = partyState.Objectives[SoulOrdealObjective.CannotBeAffectedByAbnormalStatus];
+
+ objective.Param2 += 1;
+ if (objective.Param2 > objective.Param1)
+ {
+ objective.Param2 = objective.Param1;
+ }
+
+ if (objective.Param1 == objective.Param2)
+ {
+ EndTrial(party, partyState, SoulOrdealEndState.Failed);
+ }
+ }
+ }
+ }
+
+ public void EvaluateItemUsed(PartyGroup party, uint itemId)
+ {
+ lock (_TrialsInProgress)
+ {
+ var partyState = GetPartyState(party);
+ if (partyState.Objectives.ContainsKey(SoulOrdealObjective.ItemNoteUsedMoreThanOnce))
+ {
+ partyState.Objectives[SoulOrdealObjective.ItemNoteUsedMoreThanOnce].Param2 = 0;
+ party.SendToAll(new S2C_SEASON_62_16_16_NTC()
+ {
+ Objectives = partyState.GetObjectiveList()
+ });
+
+ EndTrial(party, partyState, SoulOrdealEndState.Failed);
+ }
+ }
+ }
+
+ public void EvaluateDeath(PartyGroup party)
+ {
+ lock (_TrialsInProgress)
+ {
+ var partyState = GetPartyState(party);
+ if (partyState.Objectives.ContainsKey(SoulOrdealObjective.CannotDieMoreThanOnce))
+ {
+ partyState.Objectives[SoulOrdealObjective.ItemNoteUsedMoreThanOnce].Param2 = 0;
+ party.SendToAll(new S2C_SEASON_62_16_16_NTC()
+ {
+ Objectives = partyState.GetObjectiveList()
+ });
+
+ EndTrial(party, partyState, SoulOrdealEndState.Failed);
+ }
+ }
+ }
+
+ public void EvaluateEnemyKilled(PartyGroup party, StageId stageId, InstancedEnemy enemy)
+ {
+ var partyState = GetPartyState(party);
+
+ bool trialCompleted = false;
+ if (partyState.PrimaryObjective == SoulOrdealObjective.EliminateTheEnemy)
+ {
+ var enemyGroup = party.InstanceEnemyManager.GetInstancedEnemies(stageId);
+ var groupDestroyed = enemyGroup.Where(x => x.IsRequired).All(x => x.IsKilled);
+ if (groupDestroyed)
+ {
+ // Update objective?
+ var pcap = new S2C_SEASON_62_16_16_NTC.Serializer().Read(pcap_data);
+ party.SendToAll(pcap);
+
+ trialCompleted = true;
+ }
+ }
+ else if (partyState.PrimaryObjective == SoulOrdealObjective.DefeatEnemyCount)
+ {
+ if (!TrialHasEnemies(party, stageId, 0))
+ {
+ return;
+ }
+
+ partyState.Objectives[partyState.PrimaryObjective].Param2 += 1;
+
+ party.SendToAll(new S2C_SEASON_62_16_16_NTC()
+ {
+ Objectives = partyState.GetObjectiveList()
+ });
+
+ if (partyState.Objectives[partyState.PrimaryObjective].Param2 >= partyState.Objectives[partyState.PrimaryObjective].Param1)
+ {
+ trialCompleted = true;
+ }
+ }
+
+ if (trialCompleted)
+ {
+ EndTrial(party, partyState, SoulOrdealEndState.Success);
+ }
+ }
+
+ private void EndTrial(PartyGroup party, EpitaphPartyState partyState, SoulOrdealEndState endState)
+ {
+ // Controls camera?
+ // party.SendToAll(new S2C_SEASON_62_26_16_NTC() { LayoutId = stageId.ToStageLayoutId(), Unk1 = 10 });
+
+ if (partyState.TimerId > 0)
+ {
+ _Server.TimerManager.CancelTimer(partyState.TimerId);
+ }
+
+ // End Trial
+ party.SendToAll(new S2CSeasonDungeonEndSoulOrdealNtc() { EndState = endState, LayoutId = partyState.Trial.OmLayoutId.ToStageLayoutId(),
+ EpitaphState = ((endState == SoulOrdealEndState.Success) ? SoulOrdealOmState.TrialComplete : SoulOrdealOmState.TrialAvailable)});
+
+ if (endState == SoulOrdealEndState.Success)
+ {
+ AddRewards(party, partyState);
+
+ _CompletedTrials[party.Id].Add(partyState.Trial.OmLayoutId);
+ }
+
+ if (_TrialsInProgress.ContainsKey(party.Id))
+ {
+ _TrialsInProgress.Remove(party.Id);
+ }
+
+ foreach (var enemyGroup in partyState.Trial.EnemyGroups.Values)
+ {
+ party.InstanceEnemyManager.ResetEnemyNode(enemyGroup.StageId);
+ party.SendToAll(new S2CInstanceEnemyGroupResetNtc() { LayoutId = enemyGroup.StageId.ToStageLayoutId() });
+ }
+ }
+
+ private void AddRewards(PartyGroup party, EpitaphPartyState partyState)
+ {
+ lock (_TrialsInProgress)
+ {
+ if (!_TrialHasRewards.ContainsKey(party.Id))
+ {
+ _TrialHasRewards[party.Id] = new Dictionary();
+ }
+
+ var rewards = new EpitaphPartyRewards()
+ {
+ TrialId = partyState.Trial.TrialId,
+ };
+
+ foreach (var type in Enum.GetValues())
+ {
+ var reward = _EpitaphAssets.BuffsByType[type][Random.Shared.Next(_EpitaphAssets.BuffsByType[type].Count)];
+ rewards.BuffRewards.Add(reward.AsCDataSeasonDungeonBuffEffectReward());
+ }
+
+ uint slotNo = 0;
+ foreach (var item in partyState.Trial.ItemRewards)
+ {
+ var rolledItems = item.AsCDataGatheringItemElement();
+ foreach (var rolledItem in rolledItems)
+ {
+ if (rolledItem.ItemNum > 0)
+ {
+ rolledItem.SlotNo = slotNo++;
+ rewards.ItemRewards.Add(rolledItem);
+ }
+ }
+ }
+
+ _TrialHasRewards[party.Id][partyState.Trial.OmLayoutId] = rewards;
+ }
+ }
+
+ private readonly byte[] pcap_data = new byte[] { 0x00, 0x00, 0x00, 0x03, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x38, 0xE3, 0x82, 0xA2, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x86, 0xE3, 0x83, 0xA0, 0xE3, 0x82, 0x92, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE4, 0xBD, 0xBF, 0xE7, 0x94, 0xA8, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE6, 0xAD, 0xBB, 0xE4, 0xBA, 0xA1, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0xC0, 0x81, 0xC1, 0x3A, 0xE0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00 };
+
+ private EpitaphPartyState GetPartyState(PartyGroup party)
+ {
+ lock (_TrialsInProgress)
+ {
+ if (!_TrialsInProgress.ContainsKey(party.Id))
+ {
+ return null;
+ }
+ return _TrialsInProgress[party.Id];
+ }
+ }
+
+ public EpitaphTrialOption GetTrialOption(uint TrialId)
+ {
+ if (_TrialAssets == null || !_TrialAssets.TrialsOptionById.ContainsKey(TrialId))
+ {
+ return null;
+ }
+
+ return _TrialAssets.TrialsOptionById[TrialId];
+ }
+
+ public EpitaphTrialOption GetTrialOption(PartyGroup party)
+ {
+ lock (_TrialsInProgress)
+ {
+ if (!_TrialsInProgress.ContainsKey(party.Id))
+ {
+ return null;
+ }
+
+ return _TrialsInProgress[party.Id].Trial;
+ }
+ }
+
+ public EpitaphTrial GetTrial(StageId stageId)
+ {
+ if (_TrialAssets == null || !_TrialAssets.Trials.ContainsKey(stageId))
+ {
+ return null;
+ }
+ return _TrialAssets.Trials[stageId];
+ }
+
+ public EpitaphTrial GetTrial(uint epitaphId)
+ {
+ if (_TrialAssets == null || !_TrialAssets.TrialsById.ContainsKey(epitaphId))
+ {
+ return null;
+ }
+ return _TrialAssets.TrialsById[epitaphId];
+ }
+
+ public void AddPlayerBuff(GameClient client, PartyGroup party, uint buffId, uint increment)
+ {
+ lock (_PartyBuffs)
+ {
+ if (!_PartyBuffs.ContainsKey(party.Id))
+ {
+ _PartyBuffs[party.Id] = new Dictionary>();
+ }
+
+ var partybuffs = _PartyBuffs[party.Id];
+ if (!partybuffs.ContainsKey(client.Character.CharacterId))
+ {
+ partybuffs[client.Character.CharacterId] = new Dictionary();
+ }
+
+ var buffs = partybuffs[client.Character.CharacterId];
+ if (!buffs.ContainsKey(buffId) && buffs.Count >= 6)
+ {
+ return;
+ }
+
+ if (!buffs.ContainsKey(buffId))
+ {
+ buffs[buffId] = new EpitaphBuff(_EpitaphAssets.BuffsById[buffId])
+ {
+ Increment = 0
+ };
+ }
+
+ buffs[buffId].Increment += increment;
+ if (buffs[buffId].Increment > 4)
+ {
+ buffs[buffId].Increment = 4;
+ }
+ }
+ }
+
+ public List GetPartyBuffs(PartyGroup party)
+ {
+ lock (_PartyBuffs)
+ {
+ if (!_PartyBuffs.ContainsKey(party.Id))
+ {
+ return new List();
+ }
+
+ var results = new Dictionary();
+ foreach (var playerBuffs in _PartyBuffs[party.Id].Values)
+ {
+ foreach (var buff in playerBuffs.Values)
+ {
+ if (!results.ContainsKey(buff.BuffId))
+ {
+ results[buff.BuffId] = new EpitaphBuff()
+ {
+ BuffId = buff.BuffId,
+ BuffEffect = buff.BuffEffect,
+ Name = buff.Name,
+ Type = buff.Type,
+ Increment = 0
+ };
+ }
+ results[buff.BuffId].Increment += buff.Increment;
+ if (results[buff.BuffId].Increment > 4)
+ {
+ results[buff.BuffId].Increment = 4;
+ }
+ }
+ }
+ return results.Values.ToList();
+ }
+ }
+
+ public List GetPlayerBuffs(GameClient client, PartyGroup party)
+ {
+ lock (_PartyBuffs)
+ {
+ if (!_PartyBuffs.ContainsKey(party.Id))
+ {
+ return new List();
+ }
+
+ if (!_PartyBuffs[party.Id].ContainsKey(client.Character.CharacterId))
+ {
+ return new List();
+ }
+
+ return _PartyBuffs[party.Id][client.Character.CharacterId].Values.ToList();
+ }
+ }
+
+ public SoulOrdealOmState GetEpitaphState(PartyGroup party, StageId stageId)
+ {
+ lock (_TrialsInProgress)
+ {
+ if (!_TrialAssets.Trials.ContainsKey(stageId))
+ {
+ return SoulOrdealOmState.Locked;
+ }
+
+ var trial = _TrialAssets.Trials[stageId];
+ if (!party.Leader.Client.Character.EpitaphRoadState.UnlockedContent.Contains(trial.EpitaphId))
+ {
+ return SoulOrdealOmState.Locked;
+ }
+
+ if (_TrialHasRewards.ContainsKey(party.Id) && _TrialHasRewards[party.Id].ContainsKey(stageId))
+ {
+ return SoulOrdealOmState.RewardAvailable;
+ }
+
+ if (!_CompletedTrials.ContainsKey(party.Id) || !_CompletedTrials[party.Id].Contains(stageId))
+ {
+ return SoulOrdealOmState.TrialAvailable;
+ }
+
+ return SoulOrdealOmState.RewardReceived;
+ }
+ }
+
+ public bool TrialCompleted(PartyGroup party, StageId stageId)
+ {
+ lock (_TrialsInProgress)
+ {
+ if (!_CompletedTrials.ContainsKey(party.Id))
+ {
+ return false;
+ }
+ return _CompletedTrials[party.Id].Contains(stageId);
+ }
+ }
+
+ public void AreaChange(GameClient client, uint stageId)
+ {
+ // var pcap = new S2CSeasonDungeonAreaBuffEffectNtc.Serializer().Read(epitah_buff_pcap);
+ client.Party.SendToAll(new S2CSeasonDungeonAreaBuffEffectNtc());
+
+ // Buff effects sent to other party members?
+ client.Party.SendToAll(new S2C_SEASON_62_39_16_NTC()
+ {
+ CharacterId = client.Character.CharacterId
+ });
+
+ var dungeonInfo = _Server.EpitaphRoadManager.GetDungeonInfoByStageId(stageId);
+ if (dungeonInfo != null)
+ {
+ foreach (var section in dungeonInfo.Sections)
+ {
+ if (!client.Character.EpitaphRoadState.UnlockedContent.Contains(section.EpitaphId))
+ {
+ foreach (var omId in section.BarrierOmIds)
+ {
+ client.Party.SendToAll(new S2CSeasonDungeonSetOmStateNtc()
+ {
+ LayoutId = new CDataStageLayoutId()
+ {
+ StageId = section.StageId,
+ GroupId = omId
+ },
+ State = SoulOrdealOmState.Locked
+ });
+ }
+ }
+ }
+ }
+ }
+
+ public List GetCostByEpitahId(uint epitahId)
+ {
+ if (_Server.AssetRepository.EpitaphTrialAssets.CostById.ContainsKey(epitahId))
+ {
+ return _Server.AssetRepository.EpitaphTrialAssets.CostById[epitahId];
+ }
+ else if (_Server.AssetRepository.EpitaphRoadAssets.SectionById.ContainsKey(epitahId))
+ {
+ return _Server.AssetRepository.EpitaphRoadAssets.SectionById[epitahId].UnlockCost;
+ }
+ return new List();
+ }
+
+ public EpitaphPath GetDungeonInfo(NpcId npcId)
+ {
+ return _Server.AssetRepository.EpitaphRoadAssets.Paths.Values.Where(x => x.NpcId == npcId).FirstOrDefault();
+ }
+
+ public EpitaphPath GetDungeonInfo(uint dungeonId)
+ {
+ return _Server.AssetRepository.EpitaphRoadAssets.Paths.Values.Where(x => x.DungeonId == dungeonId).FirstOrDefault();
+ }
+
+ public EpitaphPath GetDungeonInfoByStageId(uint stageId)
+ {
+ return _Server.AssetRepository.EpitaphRoadAssets.Paths.Values.Where(x => x.StageIds.Contains(stageId)).FirstOrDefault();
+ }
+
+ public EpitaphSection GetSectionById(uint epitaphId)
+ {
+ if (_Server.AssetRepository.EpitaphRoadAssets.SectionById.ContainsKey(epitaphId))
+ {
+ return _Server.AssetRepository.EpitaphRoadAssets.SectionById[epitaphId];
+ }
+ return null;
+ }
+
+ public bool IsTrialUnlocked(PartyGroup party, EpitaphTrial trial)
+ {
+ if (trial == null)
+ {
+ return false;
+ }
+
+ if (trial.UnlockCost.Count == 0)
+ {
+ return true;
+ }
+
+ return party.Leader.Client.Character.EpitaphRoadState.UnlockedContent.Contains(trial.EpitaphId);
+ }
+
+ public bool IsTrialUnlocked(PartyGroup party, uint epitaphId)
+ {
+ if (!_Server.AssetRepository.EpitaphTrialAssets.TrialsById.ContainsKey(epitaphId))
+ {
+ return false;
+ }
+
+ return IsTrialUnlocked(party, _Server.AssetRepository.EpitaphTrialAssets.TrialsById[epitaphId]);
+ }
+
+ public bool IsTrialUnlocked(PartyGroup party, StageId stageId)
+ {
+ if (!_Server.AssetRepository.EpitaphTrialAssets.Trials.ContainsKey(stageId))
+ {
+ return false;
+ }
+ return IsTrialUnlocked(party, _Server.AssetRepository.EpitaphTrialAssets.Trials[stageId]);
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.GameServer/Chat/Command/ChatCommandHandler.cs b/Arrowgene.Ddon.GameServer/Chat/Command/ChatCommandHandler.cs
index 730e0bd56..ea6d4a7a1 100644
--- a/Arrowgene.Ddon.GameServer/Chat/Command/ChatCommandHandler.cs
+++ b/Arrowgene.Ddon.GameServer/Chat/Command/ChatCommandHandler.cs
@@ -33,6 +33,7 @@ public ChatCommandHandler(DdonGameServer server)
AddCommand(new FinishQuestCommand(server));
AddCommand(new GivePawnCommand(server));
AddCommand(new SkipTutorialCommand(server));
+ AddCommand(new SendPacketsCommand(server));
AddCommand(new GivePowerfulItemsCommand(server));
AddCommand(new WarpCommand(server));
AddCommand(new TimeCommand(server));
diff --git a/Arrowgene.Ddon.GameServer/Chat/Command/Commands/SendPacketsCommand.cs b/Arrowgene.Ddon.GameServer/Chat/Command/Commands/SendPacketsCommand.cs
new file mode 100644
index 000000000..1705565d3
--- /dev/null
+++ b/Arrowgene.Ddon.GameServer/Chat/Command/Commands/SendPacketsCommand.cs
@@ -0,0 +1,55 @@
+using Arrowgene.Ddon.Database.Model;
+using Arrowgene.Ddon.Shared.Entity.PacketStructure;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Model;
+using Arrowgene.Ddon.Shared.Model.EpitaphRoad;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Arrowgene.Ddon.GameServer.Chat.Command.Commands
+{
+ public class SendPacketsCommand : ChatCommand
+ {
+ public override AccountStateType AccountState => AccountStateType.User;
+ public override string Key => "send";
+ public override string HelpText => "usage: `/send groupid value`";
+
+ private DdonGameServer Server;
+
+ public SendPacketsCommand(DdonGameServer server)
+ {
+ Server = server;
+ }
+
+ public override void Execute(string[] command, GameClient client, ChatMessage message, List responses)
+ {
+ if (command.Length < 2)
+ {
+ responses.Add(ChatResponse.CommandError(client, "no arguments provided"));
+ return;
+ }
+
+ try
+ {
+ uint groupId = uint.Parse(command[0]);
+ byte value = byte.Parse(command[1]);
+
+ var ntc = new S2CSeasonDungeonSetOmStateNtc()
+ {
+ LayoutId = new CDataStageLayoutId()
+ {
+ StageId = client.Character.Stage.Id,
+ GroupId = groupId
+ },
+ State = (SoulOrdealOmState) value
+ };
+ client.Party.SendToAll(ntc);
+ }
+ catch (Exception)
+ {
+ responses.Add(ChatResponse.CommandError(client, "invalid arguments"));
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.GameServer/DdonGameServer.cs b/Arrowgene.Ddon.GameServer/DdonGameServer.cs
index 840781847..0f030034c 100644
--- a/Arrowgene.Ddon.GameServer/DdonGameServer.cs
+++ b/Arrowgene.Ddon.GameServer/DdonGameServer.cs
@@ -78,6 +78,7 @@ public DdonGameServer(GameServerSetting setting, IDatabase database, AssetReposi
BoardManager = new BoardManager(this);
TimerManager = new TimerManager(this);
ClanManager = new ClanManager(this);
+ EpitaphRoadManager = new EpitaphRoadManager(this);
// Orb Management is slightly complex and requires updating fields across multiple systems
OrbUnlockManager = new OrbUnlockManager(database, WalletManager, JobManager, CharacterManager);
@@ -113,6 +114,7 @@ public DdonGameServer(GameServerSetting setting, IDatabase database, AssetReposi
public BoardManager BoardManager { get; }
public TimerManager TimerManager { get; }
public ClanManager ClanManager { get; }
+ public EpitaphRoadManager EpitaphRoadManager { get; }
public ChatLogHandler ChatLogHandler { get; }
@@ -561,6 +563,21 @@ private void LoadPacketHandler()
AddHandler(new EntryBoardEntryBoardItemExtendTimeoutHandler(this));
AddHandler(new EntryBoardPartyRecruitCategoryListHandler(this));
+ AddHandler(new SeasonDungeon62_40_16_Handler(this));
+ AddHandler(new SeasonDungeonGetIdFromNpcIdHandler(this));
+ AddHandler(new SeasonDungeonGetInfoHandler(this));
+ AddHandler(new SeasonDungeonGetExtendableBlockadeListFromNpcIdHandler(this));
+ AddHandler(new SeasonDungeonGetSoulOrdealListFromOmHandler(this));
+ AddHandler(new SeasonDungeonSoulOrdealReadyHandler(this));
+ AddHandler(new SeasonDungeonExecuteSoulOrdealHandler(this));
+ AddHandler(new SeasonDungeonGetSoulOrdealRewardListHandler(this));
+ AddHandler(new SeasonDungeonReceiveSoulOrdealBuffHandler(this));
+ AddHandler(new SeasonDungeonReceiveSoulOrdealRewardHandler(this));
+ AddHandler(new SeasonDungeon62_12_16_Handler(this));
+ AddHandler(new SeasonDungeonGetBlockadeIdFromOmHandler(this));
+ AddHandler(new SeasonDungeonGetExRequiredItemHandler(this));
+ AddHandler(new SeasonDungeonDeliverItemForExHandler(this));
+
AddHandler(new ServerGameTimeGetBaseinfoHandler(this));
AddHandler(new ServerGetGameSettingHandler(this));
AddHandler(new ServerGetRealTimeHandler(this));
@@ -616,6 +633,8 @@ private void LoadPacketHandler()
AddHandler(new StageUnisonAreaChangeGetRecruitmentStateHandler(this));
AddHandler(new StageUnisonAreaChangeReadyHandler(this));
AddHandler(new StageUnisonAreaChangeReadyCancelHandler(this));
+ AddHandler(new StageGetSpAreaChangeIdFromNpcIdHandler(this));
+ AddHandler(new StageGetSpAreaChangeInfoHandler(this));
AddHandler(new StampBonusCheckHandler(this));
AddHandler(new StampBonusGetListHandler(this));
diff --git a/Arrowgene.Ddon.GameServer/Handler/CharacterCharacterDeadHandler.cs b/Arrowgene.Ddon.GameServer/Handler/CharacterCharacterDeadHandler.cs
index c8afe401c..67d2e1802 100644
--- a/Arrowgene.Ddon.GameServer/Handler/CharacterCharacterDeadHandler.cs
+++ b/Arrowgene.Ddon.GameServer/Handler/CharacterCharacterDeadHandler.cs
@@ -11,7 +11,11 @@ public CharacterCharacterDeadHandler(DdonGameServer server) : base(server)
public override void Handle(GameClient client, StructurePacket packet)
{
- //Unsure what CAPCOM wanted with this packet.
+ // Unsure what CAPCOM wanted with this packet.
+ if (Server.EpitaphRoadManager.TrialInProgress(client.Party))
+ {
+ Server.EpitaphRoadManager.EvaluateDeath(client.Party);
+ }
}
}
}
diff --git a/Arrowgene.Ddon.GameServer/Handler/InstanceCharacterStartBadStatusHandler.cs b/Arrowgene.Ddon.GameServer/Handler/InstanceCharacterStartBadStatusHandler.cs
index ff49b0ce8..76072a449 100644
--- a/Arrowgene.Ddon.GameServer/Handler/InstanceCharacterStartBadStatusHandler.cs
+++ b/Arrowgene.Ddon.GameServer/Handler/InstanceCharacterStartBadStatusHandler.cs
@@ -11,7 +11,12 @@ public InstanceCharacterStartBadStatusHandler(DdonGameServer server) : base(serv
public override void Handle(GameClient client, StructurePacket packet)
{
- //Unsure what CAPCOM wanted with this packet.
+ // Unsure what CAPCOM wanted with this packet.
+
+ if (Server.EpitaphRoadManager.TrialInProgress(client.Party))
+ {
+ Server.EpitaphRoadManager.EvaluateAbnormalStatus(client.Party, packet.Structure.StatusId);
+ }
}
}
}
diff --git a/Arrowgene.Ddon.GameServer/Handler/InstanceEnemyKillHandler.cs b/Arrowgene.Ddon.GameServer/Handler/InstanceEnemyKillHandler.cs
index a6efe3ebd..32f10593b 100644
--- a/Arrowgene.Ddon.GameServer/Handler/InstanceEnemyKillHandler.cs
+++ b/Arrowgene.Ddon.GameServer/Handler/InstanceEnemyKillHandler.cs
@@ -61,7 +61,6 @@ public override S2CInstanceEnemyKillRes Handle(GameClient client, C2SInstanceEne
}
InstancedEnemy enemyKilled = client.Party.InstanceEnemyManager.GetInstanceEnemy(stageId, (byte)packet.SetId);
-
if (enemyKilled is null)
{
Logger.Error(client, $"Enemy killed data missing; {layoutId}.{packet.SetId}");
@@ -90,6 +89,11 @@ public override S2CInstanceEnemyKillRes Handle(GameClient client, C2SInstanceEne
enemyKilled.IsKilled = true;
}
+ if (_gameServer.EpitaphRoadManager.TrialInProgress(client.Party))
+ {
+ _gameServer.EpitaphRoadManager.EvaluateEnemyKilled(client.Party, stageId, enemyKilled);
+ }
+
Server.Database.ExecuteInTransaction(connectionIn =>
{
diff --git a/Arrowgene.Ddon.GameServer/Handler/InstanceGetEnemySetListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/InstanceGetEnemySetListHandler.cs
index f08993f99..c32af57d7 100644
--- a/Arrowgene.Ddon.GameServer/Handler/InstanceGetEnemySetListHandler.cs
+++ b/Arrowgene.Ddon.GameServer/Handler/InstanceGetEnemySetListHandler.cs
@@ -16,8 +16,11 @@ public class InstanceGetEnemySetListHandler : StructurePacketHandler(typeof(InstanceGetEnemySetListHandler));
+ private DdonGameServer _Server;
+
public InstanceGetEnemySetListHandler(DdonGameServer server) : base(server)
{
+ _Server = server;
}
public override void Handle(GameClient client, StructurePacket request)
@@ -54,44 +57,37 @@ public override void Handle(GameClient client, StructurePacket instancedEnemyList;
+
bool notifyStrongEnemy = false;
if (IsQuestControlled && quest != null)
{
response.QuestId = (uint) quest.QuestId;
var questStateManager = QuestManager.GetQuestStateManager(client, quest);
- foreach (var enemy in questStateManager.GetInstancedEnemies(quest, stageId, subGroupId))
- {
- response.EnemyList.Add(new CDataLayoutEnemyData()
- {
- PositionIndex = enemy.Index,
- EnemyInfo = enemy.asCDataStageLayoutEnemyPresetEnemyInfoClient()
- });
- client.Party.InstanceEnemyManager.SetInstanceEnemy(stageId, enemy.Index, enemy);
-
- if (enemy.NotifyStrongEnemy)
- {
- notifyStrongEnemy = true;
- }
- }
+ instancedEnemyList = questStateManager.GetInstancedEnemies(quest, stageId, subGroupId);
+ }
+ else if (_Server.EpitaphRoadManager.TrialHasEnemies(client.Party, stageId, subGroupId))
+ {
+ instancedEnemyList = _Server.EpitaphRoadManager.GetInstancedEnemies(client.Party, stageId, subGroupId);
}
else
{
- var instancedEnemyList = client.Party.InstanceEnemyManager.GetAssets(stageId)
- .Where(x => x.Subgroup == subGroupId);
- foreach (var asset in instancedEnemyList)
+ instancedEnemyList = client.Party.InstanceEnemyManager.GetAssets(stageId).Where(x => x.Subgroup == subGroupId).ToList();
+ }
+
+ foreach (var enemy in instancedEnemyList)
+ {
+ response.EnemyList.Add(new CDataLayoutEnemyData()
+ {
+ PositionIndex = enemy.Index,
+ EnemyInfo = enemy.asCDataStageLayoutEnemyPresetEnemyInfoClient()
+ });
+ client.Party.InstanceEnemyManager.SetInstanceEnemy(stageId, enemy.Index, enemy);
+
+ if (enemy.NotifyStrongEnemy)
{
- response.EnemyList.Add(new CDataLayoutEnemyData()
- {
- PositionIndex = asset.Index,
- EnemyInfo = asset.asCDataStageLayoutEnemyPresetEnemyInfoClient()
- });
- client.Party.InstanceEnemyManager.SetInstanceEnemy(stageId, asset.Index, asset);
-
- if (asset.NotifyStrongEnemy)
- {
- notifyStrongEnemy = true;
- }
+ notifyStrongEnemy = true;
}
}
diff --git a/Arrowgene.Ddon.GameServer/Handler/InstanceSetOmInstantKeyValueHandler.cs b/Arrowgene.Ddon.GameServer/Handler/InstanceSetOmInstantKeyValueHandler.cs
index 1a7fa87f4..bc404f713 100644
--- a/Arrowgene.Ddon.GameServer/Handler/InstanceSetOmInstantKeyValueHandler.cs
+++ b/Arrowgene.Ddon.GameServer/Handler/InstanceSetOmInstantKeyValueHandler.cs
@@ -18,6 +18,8 @@ public InstanceSetOmInstantKeyValueHandler(DdonGameServer server) : base(server)
public override void Handle(GameClient client, StructurePacket req)
{
+ Logger.Debug($"OM: Key={req.Structure.Key}, Value={req.Structure.Value}");
+
OmManager.SetOmData(client.Party.InstanceOmData, client.Character.Stage.Id, req.Structure.Key, req.Structure.Value);
S2CInstanceSetOmInstantKeyValueNtc ntc = new S2CInstanceSetOmInstantKeyValueNtc();
diff --git a/Arrowgene.Ddon.GameServer/Handler/ItemUseBagItemHandler.cs b/Arrowgene.Ddon.GameServer/Handler/ItemUseBagItemHandler.cs
index a0e448a33..074b7efad 100644
--- a/Arrowgene.Ddon.GameServer/Handler/ItemUseBagItemHandler.cs
+++ b/Arrowgene.Ddon.GameServer/Handler/ItemUseBagItemHandler.cs
@@ -51,6 +51,11 @@ public override void Handle(GameClient client, StructurePacket> gNpcExtendedBehavior = new Dictionary>()
+ {
+ // TODO: Parse these from JSON?
+ [NpcId.Morgan] = new List()
+ {
+ new CDataNpcExtendedFacilityMenuItem() { FunctionClass = NpcFunction.WarMissions, FunctionSelect = NpcFunction.HeroicSpiritSleepingPath, Unk2 = 4452}
+ }
+ };
+
private readonly byte[] pcap_data = new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xC2, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x11, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x43, 0x20, 0xFB, 0xE8, 0xC0, 0xA0, 0xEC};
}
}
diff --git a/Arrowgene.Ddon.GameServer/Handler/SeasonDungeon62_12_16_Handler.cs b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeon62_12_16_Handler.cs
new file mode 100644
index 000000000..575843188
--- /dev/null
+++ b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeon62_12_16_Handler.cs
@@ -0,0 +1,33 @@
+using Arrowgene.Ddon.Server;
+using Arrowgene.Ddon.Shared.Entity.PacketStructure;
+using Arrowgene.Ddon.Shared.Model.EpitaphRoad;
+using Arrowgene.Ddon.Shared.Network;
+using Arrowgene.Logging;
+
+namespace Arrowgene.Ddon.GameServer.Handler
+{
+ public class SeasonDungeon62_12_16_Handler : GameStructurePacketHandler
+ {
+ private static readonly ServerLogger Logger = LogProvider.Logger(typeof(SeasonDungeon62_12_16_Handler));
+
+ public SeasonDungeon62_12_16_Handler(DdonGameServer server) : base(server)
+ {
+ }
+
+ public override void Handle(GameClient client, StructurePacket packet)
+ {
+ Logger.Debug($"{packet.Structure.LayoutId.AsStageId()}, Unk0={packet.Structure.Unk0}");
+
+ var stageId = packet.Structure.LayoutId.AsStageId();
+
+ var state = Server.EpitaphRoadManager.GetEpitaphState(client.Party, stageId);
+
+ // Renders tombstones with white/red/blue marker
+ client.Party.SendToAll(new S2CSeasonDungeonSetOmStateNtc()
+ {
+ LayoutId = packet.Structure.LayoutId,
+ State = state,
+ });
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.GameServer/Handler/SeasonDungeon62_40_16_Handler.cs b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeon62_40_16_Handler.cs
new file mode 100644
index 000000000..7edcda463
--- /dev/null
+++ b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeon62_40_16_Handler.cs
@@ -0,0 +1,32 @@
+using Arrowgene.Ddon.Server;
+using Arrowgene.Ddon.Shared.Entity.PacketStructure;
+using Arrowgene.Ddon.Shared.Model;
+using Arrowgene.Ddon.Shared.Model.EpitaphRoad;
+using Arrowgene.Ddon.Shared.Network;
+using Arrowgene.Logging;
+
+namespace Arrowgene.Ddon.GameServer.Handler
+{
+ public class SeasonDungeon62_40_16_Handler : GameStructurePacketHandler
+ {
+ private static readonly ServerLogger Logger = LogProvider.Logger(typeof(SeasonDungeon62_40_16_Handler));
+
+ public SeasonDungeon62_40_16_Handler(DdonGameServer server) : base(server)
+ {
+ }
+
+ public override void Handle(GameClient client, StructurePacket packet)
+ {
+ StageId stageId = packet.Structure.LayoutId.AsStageId();
+ Logger.Info($"Other packet: {stageId}");
+
+ // TODO: Query conditions
+ client.Party.SendToAll(new S2CSeasonDungeonSetOmStateNtc()
+ {
+ LayoutId = packet.Structure.LayoutId,
+ Unk0 = packet.Structure.Unk0,
+ State = SoulOrdealOmState.Locked
+ });
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonDeliverItemForExHandler.cs b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonDeliverItemForExHandler.cs
new file mode 100644
index 000000000..d8d6fdecc
--- /dev/null
+++ b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonDeliverItemForExHandler.cs
@@ -0,0 +1,58 @@
+using Arrowgene.Ddon.Server;
+using Arrowgene.Ddon.Shared.Entity.PacketStructure;
+using Arrowgene.Ddon.Shared.Model;
+using Arrowgene.Ddon.Shared.Model.EpitaphRoad;
+using Arrowgene.Logging;
+
+namespace Arrowgene.Ddon.GameServer.Handler
+{
+ public class SeasonDungeonDeliverItemForExHandler : GameRequestPacketHandler
+ {
+ private static readonly ServerLogger Logger = LogProvider.Logger(typeof(SeasonDungeonDeliverItemForExHandler));
+
+ public SeasonDungeonDeliverItemForExHandler(DdonGameServer server) : base(server)
+ {
+ }
+
+ public override S2CSeasonDungeonDeliverItemForExRes Handle(GameClient client, C2SSeasonDungeonDeliverItemForExReq request)
+ {
+ S2CItemUpdateCharacterItemNtc ntc = new S2CItemUpdateCharacterItemNtc()
+ {
+ UpdateType = ItemNoticeType.ConsumeBag
+ };
+
+ Server.Database.ExecuteInTransaction(connection =>
+ {
+ foreach (var item in request.ItemList)
+ {
+ var itemUpdate = Server.ItemManager.ConsumeItemByUId(Server, client.Character, StorageType.ItemBagMaterial, item.ItemUId, item.Num, connection);
+ ntc.UpdateItemList.Add(itemUpdate);
+ }
+ });
+
+ if ((EpitahId.GetIdType(request.EpitaphId) == EpitaphTypeId.Path) ||
+ (EpitahId.GetIdType(request.EpitaphId) == EpitaphTypeId.Trial && EpitahId.GetIdIndex(request.EpitaphId) == 0))
+ {
+ Server.Database.InsertEpitahRoadUnlock(client.Character.CharacterId, request.EpitaphId);
+ client.Character.EpitaphRoadState.UnlockedContent.Add(request.EpitaphId);
+ }
+
+ if (EpitahId.GetIdType(request.EpitaphId) == EpitaphTypeId.Trial && EpitahId.GetIdIndex(request.EpitaphId) == 0)
+ {
+ var trial = Server.EpitaphRoadManager.GetTrial(request.EpitaphId);
+ client.Party.SendToAll(new S2CSeasonDungeonSetOmStateNtc()
+ {
+ LayoutId = trial.OmLayoutId.ToStageLayoutId(),
+ State = SoulOrdealOmState.TrialAvailable,
+ });
+ }
+
+ if (ntc.UpdateItemList.Count > 0 || ntc.UpdateWalletList.Count > 0)
+ {
+ client.Send(ntc);
+ }
+
+ return new S2CSeasonDungeonDeliverItemForExRes();
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonExecuteSoulOrdealHandler.cs b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonExecuteSoulOrdealHandler.cs
new file mode 100644
index 000000000..e9effbff9
--- /dev/null
+++ b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonExecuteSoulOrdealHandler.cs
@@ -0,0 +1,88 @@
+using Arrowgene.Ddon.GameServer.Characters;
+using Arrowgene.Ddon.Server;
+using Arrowgene.Ddon.Shared.Entity.PacketStructure;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Model;
+using Arrowgene.Logging;
+using System.Collections.Generic;
+using System.IO;
+
+namespace Arrowgene.Ddon.GameServer.Handler
+{
+ public class SeasonDungeonExecuteSoulOrdealHandler : GameRequestPacketHandler
+ {
+ private static readonly ServerLogger Logger = LogProvider.Logger(typeof(SeasonDungeonExecuteSoulOrdealHandler));
+
+ public SeasonDungeonExecuteSoulOrdealHandler(DdonGameServer server) : base(server)
+ {
+ }
+
+ public override S2CSeasonDungeonExecuteSoulOrdealRes Handle(GameClient client, C2SSeasonDungeonExecuteSoulOrdealReq request)
+ {
+ // var pcap0 = new C2SSeasonDungeonExecuteSoulOrdealReq.Serializer().Read(req_pcap0);
+
+ // Notify Players
+ client.Party.SendToAll(new S2C_SEASON_62_22_16_NTC());
+
+ // TODO: If all players are ready, start it
+
+ var itemUpdateResults = new List();
+ Server.Database.ExecuteInTransaction(connection =>
+ {
+ foreach (var item in request.TrialCost)
+ {
+ itemUpdateResults.Add(Server.ItemManager.ConsumeItemByUIdFromItemBag(Server, client.Character, item.ItemUId, item.Num, connection));
+ }
+ });
+
+ if (itemUpdateResults.Count > 0)
+ {
+ client.Send(new S2CItemUpdateCharacterItemNtc()
+ {
+ UpdateType = (ushort)ItemNoticeType.Default,
+ UpdateItemList = itemUpdateResults
+ });
+ }
+
+ Server.EpitaphRoadManager.StartTrial(client.Party, request.TrialId);
+
+ return new S2CSeasonDungeonExecuteSoulOrdealRes();
+ }
+
+ private static readonly List ntc_pcap_data = new List
+ {
+ // 85_11_1
+ new byte[] {0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x8B, 0x00, 0x00, 0x00, 0x03, 0x07, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x38, 0xE3, 0x82, 0xA2, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x86, 0xE3, 0x83, 0xA0, 0xE3, 0x82, 0x92, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE4, 0xBD, 0xBF, 0xE7, 0x94, 0xA8, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x04, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE6, 0xAD, 0xBB, 0xE4, 0xBA, 0xA1, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x3E, 0x3E, 0x1F, 0x8A, 0xEF, 0x05, 0xC2 },
+ new byte[] {0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x00, 0x03, 0x05, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x33, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE7, 0x8A, 0xB6, 0xE6, 0x85, 0x8B, 0xE7, 0x95, 0xB0, 0xE5, 0xB8, 0xB8, 0xE3, 0x81, 0xAB, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0xA3, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0x84, 0xE3, 0x81, 0x91, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x33, 0x04, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE6, 0xAD, 0xBB, 0xE4, 0xBA, 0xA1, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ new byte[] {0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x03, 0x05, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x33, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE7, 0x8A, 0xB6, 0xE6, 0x85, 0x8B, 0xE7, 0x95, 0xB0, 0xE5, 0xB8, 0xB8, 0xE3, 0x81, 0xAB, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0xA3, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0x84, 0xE3, 0x81, 0x91, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x33, 0x0A, 0x02, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2A, 0xE5, 0x88, 0xB6, 0xE9, 0x99, 0x90, 0xE6, 0x99, 0x82, 0xE9, 0x96, 0x93, 0xE4, 0xBB, 0xA5, 0xE5, 0x86, 0x85, 0xE3, 0x81, 0xAB, 0xE6, 0x9D, 0xA1, 0xE4, 0xBB, 0xB6, 0xE3, 0x82, 0x92, 0xE9, 0x81, 0x94, 0xE6, 0x88, 0x90, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x00, 0x5D, 0x05, 0xA0, 0x0D, 0x01 },
+ new byte[] {0x00, 0x0F,0xE8,0x8B,0xB1,0xE9,0x9C,0x8A,0xE3,0x81,0xAE,0xE8,0xA9,0xA6,0xE7,0xB7,0xB4,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x03,0x07,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x38,0xE3,0x82,0xA2,0xE3,0x82,0xA4,0xE3,0x83,0x86,0xE3,0x83,0xA0,0xE3,0x82,0x92,0x31,0xE5,0x9B,0x9E,0xE4,0xBB,0xA5,0xE4,0xB8,0x8A,0xE4,0xBD,0xBF,0xE7,0x94,0xA8,0xE3,0x81,0x97,0xE3,0x81,0xA6,0xE3,0x81,0xAF,0xE3,0x81,0xAA,0xE3,0x82,0x89,0xE3,0x81,0xAA,0xE3,0x81,0x84,0x20,0x30,0x2F,0x31,0x0A,0x02,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x01,0x00,0x2A,0xE5,0x88,0xB6,0xE9,0x99,0x90,0xE6,0x99,0x82,0xE9,0x96,0x93,0xE4,0xBB,0xA5,0xE5,0x86,0x85,0xE3,0x81,0xAB,0xE6,0x9D,0xA1,0xE4,0xBB,0xB6,0xE3,0x82,0x92,0xE9,0x81,0x94,0xE6,0x88,0x90,0xE3,0x81,0x9B,0xE3,0x82,0x88,0x01,0x01,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x22,0xE6,0x95,0xB5,0xE3,0x82,0x92,0x32,0x30,0xE4,0xBD,0x93,0xE4,0xBB,0xA5,0xE4,0xB8,0x8A,0xE8,0xA8,0x8E,0xE4,0xBC,0x90,0xE3,0x81,0x9B,0xE3,0x82,0x88,0x20,0x30,0x2F,0x32,0x30,0x92,0x43,0x05,0x52,0x77,0xFC},
+ new byte[] {0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE6, 0xAD, 0xBB, 0xE4, 0xBA, 0xA1, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x07, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x38, 0xE3, 0x82, 0xA2, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x86, 0xE3, 0x83, 0xA0, 0xE3, 0x82, 0x92, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE4, 0xBD, 0xBF, 0xE7, 0x94, 0xA8, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x00, 0x00, 0x64, 0x0B, 0x02, 0x00, 0x00 },
+ new byte[] {0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0x03, 0x07, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x38, 0xE3, 0x82, 0xA2, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x86, 0xE3, 0x83, 0xA0, 0xE3, 0x82, 0x92, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE4, 0xBD, 0xBF, 0xE7, 0x94, 0xA8, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x0A, 0x02, 0x00, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2A, 0xE5, 0x88, 0xB6, 0xE9, 0x99, 0x90, 0xE6, 0x99, 0x82, 0xE9, 0x96, 0x93, 0xE4, 0xBB, 0xA5, 0xE5, 0x86, 0x85, 0xE3, 0x81, 0xAB, 0xE6, 0x9D, 0xA1, 0xE4, 0xBB, 0xB6, 0xE3, 0x82, 0x92, 0xE9, 0x81, 0x94, 0xE6, 0x88, 0x90, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x4C, 0x20, 0xB2, 0x86, 0x1F, 0x1A },
+ new byte[] {0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x03, 0x05, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x33, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE7, 0x8A, 0xB6, 0xE6, 0x85, 0x8B, 0xE7, 0x95, 0xB0, 0xE5, 0xB8, 0xB8, 0xE3, 0x81, 0xAB, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0xA3, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0x84, 0xE3, 0x81, 0x91, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x33, 0x04, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE6, 0xAD, 0xBB, 0xE4, 0xBA, 0xA1, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x00, 0x00, 0x43, 0x85, 0x7F, 0xFB, 0xC0 },
+ new byte[] {0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x00, 0x03, 0x07, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x38, 0xE3, 0x82, 0xA2, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x86, 0xE3, 0x83, 0xA0, 0xE3, 0x82, 0x92, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE4, 0xBD, 0xBF, 0xE7, 0x94, 0xA8, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x0A, 0x02, 0x00, 0x00, 0x00, 0xB4, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2A, 0xE5, 0x88, 0xB6, 0xE9, 0x99, 0x90, 0xE6, 0x99, 0x82, 0xE9, 0x96, 0x93, 0xE4, 0xBB, 0xA5, 0xE5, 0x86, 0x85, 0xE3, 0x81, 0xAB, 0xE6, 0x9D, 0xA1, 0xE4, 0xBB, 0xB6, 0xE3, 0x82, 0x92, 0xE9, 0x81, 0x94, 0xE6, 0x88, 0x90, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0xC5, 0x4C, 0xF7, 0xA5, 0x36, 0x72 },
+ // 85_11_2
+ new byte[] { 0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x00, 0x03, 0x07, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x38, 0xE3, 0x82, 0xA2, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x86, 0xE3, 0x83, 0xA0, 0xE3, 0x82, 0x92, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE4, 0xBD, 0xBF, 0xE7, 0x94, 0xA8, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x0A, 0x02, 0x00, 0x00, 0x00, 0xB4, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2A, 0xE5, 0x88, 0xB6, 0xE9, 0x99, 0x90, 0xE6, 0x99, 0x82, 0xE9, 0x96, 0x93, 0xE4, 0xBB, 0xA5, 0xE5, 0x86, 0x85, 0xE3, 0x81, 0xAB, 0xE6, 0x9D, 0xA1, 0xE4, 0xBB, 0xB6, 0xE3, 0x82, 0x92, 0xE9, 0x81, 0x94, 0xE6, 0x88, 0x90, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ new byte[] { 0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x8B, 0x00, 0x00, 0x00, 0x03, 0x07, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x38, 0xE3, 0x82, 0xA2, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x86, 0xE3, 0x83, 0xA0, 0xE3, 0x82, 0x92, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE4, 0xBD, 0xBF, 0xE7, 0x94, 0xA8, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x04, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE6, 0xAD, 0xBB, 0xE4, 0xBA, 0xA1, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0xCE, 0xB8, 0x47, 0x9D, 0xBE, 0x1D, 0xB2 },
+ new byte[] { 0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x00, 0x03, 0x05, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x33, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE7, 0x8A, 0xB6, 0xE6, 0x85, 0x8B, 0xE7, 0x95, 0xB0, 0xE5, 0xB8, 0xB8, 0xE3, 0x81, 0xAB, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0xA3, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0x84, 0xE3, 0x81, 0x91, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x33, 0x04, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE6, 0xAD, 0xBB, 0xE4, 0xBA, 0xA1, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ new byte[] { 0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x03, 0x05, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x33, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE7, 0x8A, 0xB6, 0xE6, 0x85, 0x8B, 0xE7, 0x95, 0xB0, 0xE5, 0xB8, 0xB8, 0xE3, 0x81, 0xAB, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0xA3, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0x84, 0xE3, 0x81, 0x91, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x33, 0x04, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE6, 0xAD, 0xBB, 0xE4, 0xBA, 0xA1, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x00, 0x00, 0x01, 0xF9, 0x00, 0x00, 0x02 },
+ new byte[] { 0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x03, 0x07, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE3, 0x82, 0xA2, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x86, 0xE3, 0x83, 0xA0, 0xE3, 0x82, 0x92, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE4, 0xBD, 0xBF, 0xE7, 0x94, 0xA8, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x04, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE6, 0xAD, 0xBB, 0xE4, 0xBA, 0xA1, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x00, 0x00, 0x64, 0x0B, 0x02, 0x00, 0x00 },
+ new byte[] { 0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x03, 0x07, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE3, 0x82, 0xA2, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x86, 0xE3, 0x83, 0xA0, 0xE3, 0x82, 0x92, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE4, 0xBD, 0xBF, 0xE7, 0x94, 0xA8, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x04, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE6, 0xAD, 0xBB, 0xE4, 0xBA, 0xA1, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x00, 0x00, 0x64, 0x0B, 0x02, 0x00, 0x00 },
+ new byte[] { 0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x03, 0x07, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE3, 0x82, 0xA2, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x86, 0xE3, 0x83, 0xA0, 0xE3, 0x82, 0x92, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE4, 0xBD, 0xBF, 0xE7, 0x94, 0xA8, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x04, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE6, 0xAD, 0xBB, 0xE4, 0xBA, 0xA1, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x00, 0x00, 0x64, 0x0B, 0x02, 0x00, 0x00 },
+ new byte[] { 0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x03, 0x07, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE3, 0x82, 0xA2, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x86, 0xE3, 0x83, 0xA0, 0xE3, 0x82, 0x92, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE4, 0xBD, 0xBF, 0xE7, 0x94, 0xA8, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x04, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE6, 0xAD, 0xBB, 0xE4, 0xBA, 0xA1, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x76, 0x4C, 0x48, 0x00, 0x00, 0x00, 0x00 },
+ new byte[] { 0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x00, 0x03, 0x07, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x38, 0xE3, 0x82, 0xA2, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x86, 0xE3, 0x83, 0xA0, 0xE3, 0x82, 0x92, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE4, 0xBD, 0xBF, 0xE7, 0x94, 0xA8, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x0A, 0x02, 0x00, 0x00, 0x00, 0xB4, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2A, 0xE5, 0x88, 0xB6, 0xE9, 0x99, 0x90, 0xE6, 0x99, 0x82, 0xE9, 0x96, 0x93, 0xE4, 0xBB, 0xA5, 0xE5, 0x86, 0x85, 0xE3, 0x81, 0xAB, 0xE6, 0x9D, 0xA1, 0xE4, 0xBB, 0xB6, 0xE3, 0x82, 0x92, 0xE9, 0x81, 0x94, 0xE6, 0x88, 0x90, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ new byte[] { 0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x00, 0x03, 0x07, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x38, 0xE3, 0x82, 0xA2, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x86, 0xE3, 0x83, 0xA0, 0xE3, 0x82, 0x92, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE4, 0xBD, 0xBF, 0xE7, 0x94, 0xA8, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x0A, 0x02, 0x00, 0x00, 0x00, 0xB4, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2A, 0xE5, 0x88, 0xB6, 0xE9, 0x99, 0x90, 0xE6, 0x99, 0x82, 0xE9, 0x96, 0x93, 0xE4, 0xBB, 0xA5, 0xE5, 0x86, 0x85, 0xE3, 0x81, 0xAB, 0xE6, 0x9D, 0xA1, 0xE4, 0xBB, 0xB6, 0xE3, 0x82, 0x92, 0xE9, 0x81, 0x94, 0xE6, 0x88, 0x90, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x76, 0x63, 0x66, 0x54, 0xAB, 0xB3 },
+ new byte[] { 0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x8B, 0x00, 0x00, 0x00, 0x03, 0x07, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x38, 0xE3, 0x82, 0xA2, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x86, 0xE3, 0x83, 0xA0, 0xE3, 0x82, 0x92, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE4, 0xBD, 0xBF, 0xE7, 0x94, 0xA8, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x04, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE6, 0xAD, 0xBB, 0xE4, 0xBA, 0xA1, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x00, 0x00, 0x64, 0x0B, 0x02, 0x00, 0x00 },
+ new byte[] { 0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x00, 0x03, 0x05, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x33, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE7, 0x8A, 0xB6, 0xE6, 0x85, 0x8B, 0xE7, 0x95, 0xB0, 0xE5, 0xB8, 0xB8, 0xE3, 0x81, 0xAB, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0xA3, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0x84, 0xE3, 0x81, 0x91, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x33, 0x04, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE6, 0xAD, 0xBB, 0xE4, 0xBA, 0xA1, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x5B, 0xA4, 0x89, 0xE1, 0x53, 0x66, 0xBE },
+ new byte[] { 0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x03, 0x05, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x33, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE7, 0x8A, 0xB6, 0xE6, 0x85, 0x8B, 0xE7, 0x95, 0xB0, 0xE5, 0xB8, 0xB8, 0xE3, 0x81, 0xAB, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0xA3, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0x84, 0xE3, 0x81, 0x91, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x33, 0x04, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE6, 0xAD, 0xBB, 0xE4, 0xBA, 0xA1, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x48, 0x00, 0xF3, 0x00, 0xAB, 0x00, 0xA2 },
+ new byte[] { 0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x03, 0x07, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE3, 0x82, 0xA2, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x86, 0xE3, 0x83, 0xA0, 0xE3, 0x82, 0x92, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE4, 0xBD, 0xBF, 0xE7, 0x94, 0xA8, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x04, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE6, 0xAD, 0xBB, 0xE4, 0xBA, 0xA1, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x63, 0x46, 0xF9, 0x46, 0xBB, 0xC3, 0x24 },
+ // 85_11_3
+ new byte[] { 0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x00, 0x03, 0x07, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x38, 0xE3, 0x82, 0xA2, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x86, 0xE3, 0x83, 0xA0, 0xE3, 0x82, 0x92, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE4, 0xBD, 0xBF, 0xE7, 0x94, 0xA8, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x0A, 0x02, 0x00, 0x00, 0x00, 0xB4, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2A, 0xE5, 0x88, 0xB6, 0xE9, 0x99, 0x90, 0xE6, 0x99, 0x82, 0xE9, 0x96, 0x93, 0xE4, 0xBB, 0xA5, 0xE5, 0x86, 0x85, 0xE3, 0x81, 0xAB, 0xE6, 0x9D, 0xA1, 0xE4, 0xBB, 0xB6, 0xE3, 0x82, 0x92, 0xE9, 0x81, 0x94, 0xE6, 0x88, 0x90, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0xBD, 0xA7, 0x8B, 0x21, 0x3B, 0xA3 },
+ new byte[] { 0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x8E, 0x00, 0x00, 0x00, 0x03, 0x07, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x38, 0xE3, 0x82, 0xA2, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x86, 0xE3, 0x83, 0xA0, 0xE3, 0x82, 0x92, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE4, 0xBD, 0xBF, 0xE7, 0x94, 0xA8, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x0A, 0x02, 0x00, 0x00, 0x00, 0xD2, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2A, 0xE5, 0x88, 0xB6, 0xE9, 0x99, 0x90, 0xE6, 0x99, 0x82, 0xE9, 0x96, 0x93, 0xE4, 0xBB, 0xA5, 0xE5, 0x86, 0x85, 0xE3, 0x81, 0xAB, 0xE6, 0x9D, 0xA1, 0xE4, 0xBB, 0xB6, 0xE3, 0x82, 0x92, 0xE9, 0x81, 0x94, 0xE6, 0x88, 0x90, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x00, 0x64, 0x0B, 0x02, 0x00, 0x00 },
+ new byte[] { 0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x8D, 0x00, 0x00, 0x00, 0x03, 0x07, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x38, 0xE3, 0x82, 0xA2, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x86, 0xE3, 0x83, 0xA0, 0xE3, 0x82, 0x92, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE4, 0xBD, 0xBF, 0xE7, 0x94, 0xA8, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x0A, 0x02, 0x00, 0x00, 0x00, 0xD2, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2A, 0xE5, 0x88, 0xB6, 0xE9, 0x99, 0x90, 0xE6, 0x99, 0x82, 0xE9, 0x96, 0x93, 0xE4, 0xBB, 0xA5, 0xE5, 0x86, 0x85, 0xE3, 0x81, 0xAB, 0xE6, 0x9D, 0xA1, 0xE4, 0xBB, 0xB6, 0xE3, 0x82, 0x92, 0xE9, 0x81, 0x94, 0xE6, 0x88, 0x90, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ new byte[] { 0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x03, 0x05, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x33, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE7, 0x8A, 0xB6, 0xE6, 0x85, 0x8B, 0xE7, 0x95, 0xB0, 0xE5, 0xB8, 0xB8, 0xE3, 0x81, 0xAB, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0xA3, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0x84, 0xE3, 0x81, 0x91, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x33, 0x04, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE6, 0xAD, 0xBB, 0xE4, 0xBA, 0xA1, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ new byte[] { 0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x03, 0x05, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x33, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE7, 0x8A, 0xB6, 0xE6, 0x85, 0x8B, 0xE7, 0x95, 0xB0, 0xE5, 0xB8, 0xB8, 0xE3, 0x81, 0xAB, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0xA3, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0x84, 0xE3, 0x81, 0x91, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x33, 0x04, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE6, 0xAD, 0xBB, 0xE4, 0xBA, 0xA1, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ new byte[] { 0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x00, 0x03, 0x05, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x33, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE7, 0x8A, 0xB6, 0xE6, 0x85, 0x8B, 0xE7, 0x95, 0xB0, 0xE5, 0xB8, 0xB8, 0xE3, 0x81, 0xAB, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0xA3, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0x84, 0xE3, 0x81, 0x91, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x33, 0x04, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE6, 0xAD, 0xBB, 0xE4, 0xBA, 0xA1, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x00, 0x53, 0x8E, 0x00, 0x00, 0x00, 0x08 },
+ new byte[] { 0x00, 0x0F, 0xE8, 0x8B, 0xB1, 0xE9, 0x9C, 0x8A, 0xE3, 0x81, 0xAE, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x00, 0x03, 0x05, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x33, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE7, 0x8A, 0xB6, 0xE6, 0x85, 0x8B, 0xE7, 0x95, 0xB0, 0xE5, 0xB8, 0xB8, 0xE3, 0x81, 0xAB, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0xA3, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0x84, 0xE3, 0x81, 0x91, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x33, 0x04, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x31, 0xE5, 0x9B, 0x9E, 0xE4, 0xBB, 0xA5, 0xE4, 0xB8, 0x8A, 0xE6, 0xAD, 0xBB, 0xE4, 0xBA, 0xA1, 0xE3, 0x81, 0x97, 0xE3, 0x81, 0xA6, 0xE3, 0x81, 0xAF, 0xE3, 0x81, 0xAA, 0xE3, 0x82, 0x89, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x84, 0x20, 0x30, 0x2F, 0x31, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xE6, 0x95, 0xB5, 0xE3, 0x82, 0x92, 0xE5, 0x85, 0xA8, 0xE6, 0xBB, 0x85, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x88, 0x9F, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00 }
+ };
+ }
+}
diff --git a/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonGetBlockadeIdFromOmHandler.cs b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonGetBlockadeIdFromOmHandler.cs
new file mode 100644
index 000000000..13d57f7f7
--- /dev/null
+++ b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonGetBlockadeIdFromOmHandler.cs
@@ -0,0 +1,27 @@
+using Arrowgene.Ddon.Server;
+using Arrowgene.Ddon.Shared.Entity.PacketStructure;
+using Arrowgene.Logging;
+
+namespace Arrowgene.Ddon.GameServer.Handler
+{
+ public class SeasonDungeonGetBlockadeIdFromOmHandler : GameRequestPacketHandler
+ {
+ private static readonly ServerLogger Logger = LogProvider.Logger(typeof(SeasonDungeonGetBlockadeIdFromOmHandler));
+
+ public SeasonDungeonGetBlockadeIdFromOmHandler(DdonGameServer server) : base(server)
+ {
+ }
+
+ public override S2CSeasonDungeonGetBlockadeIdFromOmRes Handle(GameClient client, C2SSeasonDungeonGetBlockadeIdFromOmReq request)
+ {
+ var result = new S2CSeasonDungeonGetBlockadeIdFromOmRes();
+
+ var stageId = request.LayoutId.AsStageId();
+ if (Server.AssetRepository.EpitaphTrialAssets.Trials.ContainsKey(stageId))
+ {
+ result.EpitaphId = Server.AssetRepository.EpitaphTrialAssets.Trials[stageId].EpitaphId;
+ }
+ return result;
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonGetExRequiredItemHandler.cs b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonGetExRequiredItemHandler.cs
new file mode 100644
index 000000000..f95f13cba
--- /dev/null
+++ b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonGetExRequiredItemHandler.cs
@@ -0,0 +1,24 @@
+using Arrowgene.Ddon.Server;
+using Arrowgene.Ddon.Shared.Entity.PacketStructure;
+using Arrowgene.Ddon.Shared.Model;
+using Arrowgene.Ddon.Shared.Model.EpitaphRoad;
+using Arrowgene.Logging;
+
+namespace Arrowgene.Ddon.GameServer.Handler
+{
+ public class SeasonDungeonGetExRequiredItemHandler : GameRequestPacketHandler
+ {
+ private static readonly ServerLogger Logger = LogProvider.Logger(typeof(SeasonDungeonGetExRequiredItemHandler));
+
+ public SeasonDungeonGetExRequiredItemHandler(DdonGameServer server) : base(server)
+ {
+ }
+
+ public override S2CSeasonDungeonGetExRequiredItemRes Handle(GameClient client, C2SSeasonDungeonGetExRequiredItemReq request)
+ {
+ var result = new S2CSeasonDungeonGetExRequiredItemRes();
+ result.ItemList = Server.EpitaphRoadManager.GetCostByEpitahId(request.EpitaphId);
+ return result;
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonGetExtendableBlockadeListFromNpcIdHandler.cs b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonGetExtendableBlockadeListFromNpcIdHandler.cs
new file mode 100644
index 000000000..525ad7dfa
--- /dev/null
+++ b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonGetExtendableBlockadeListFromNpcIdHandler.cs
@@ -0,0 +1,41 @@
+using Arrowgene.Ddon.Server;
+using Arrowgene.Ddon.Shared.Entity.PacketStructure;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Logging;
+using System.Collections.Generic;
+
+namespace Arrowgene.Ddon.GameServer.Handler
+{
+ public class SeasonDungeonGetExtendableBlockadeListFromNpcIdHandler : GameRequestPacketHandler
+ {
+ private static readonly ServerLogger Logger = LogProvider.Logger(typeof(SeasonDungeonGetExtendableBlockadeListFromNpcIdHandler));
+
+ public SeasonDungeonGetExtendableBlockadeListFromNpcIdHandler(DdonGameServer server) : base(server)
+ {
+ }
+
+ public override S2CSeasonDungeonGetExtendableBlockadeListFromNpcIdRes Handle(GameClient client, C2SSeasonDungeonGetExtendableBlockadeListFromNpcIdReq request)
+ {
+ // This list is how you unlock paths/checkpoints into the dungeon
+ var result = new S2CSeasonDungeonGetExtendableBlockadeListFromNpcIdRes();
+
+ var dungeonInfo = Server.EpitaphRoadManager.GetDungeonInfo(request.NpcId);
+
+ foreach (var section in dungeonInfo.Sections)
+ {
+ if (section.UnlockCost.Count == 0 || client.Character.EpitaphRoadState.UnlockedContent.Contains(section.EpitaphId))
+ {
+ continue;
+ }
+
+ result.BlockadeList.Add(new CDataSeasonDungeonBlockadeElement()
+ {
+ EpitaphId = section.EpitaphId,
+ Name = section.Name
+ });
+ }
+
+ return result;
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonGetIdFromNpcIdHandler.cs b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonGetIdFromNpcIdHandler.cs
new file mode 100644
index 000000000..e5243fa04
--- /dev/null
+++ b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonGetIdFromNpcIdHandler.cs
@@ -0,0 +1,28 @@
+using Arrowgene.Ddon.Server;
+using Arrowgene.Ddon.Shared.Entity.PacketStructure;
+using Arrowgene.Logging;
+using System.Linq;
+
+namespace Arrowgene.Ddon.GameServer.Handler
+{
+ public class SeasonDungeonGetIdFromNpcIdHandler : GameRequestPacketHandler
+ {
+ private static readonly ServerLogger Logger = LogProvider.Logger(typeof(SeasonDungeonGetIdFromNpcIdHandler));
+
+ public SeasonDungeonGetIdFromNpcIdHandler(DdonGameServer server) : base(server)
+ {
+ }
+
+ public override S2CSeasonDungeonGetIdFromNpcIdRes Handle(GameClient client, C2SSeasonDungeonGetIdFromNpcIdReq request)
+ {
+ var result = new S2CSeasonDungeonGetIdFromNpcIdRes();
+
+ var dungeonInfo = Server.EpitaphRoadManager.GetDungeonInfo(request.NpcId);
+ if (dungeonInfo != null)
+ {
+ result.DungeonId = dungeonInfo.DungeonId;
+ }
+ return result;
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonGetInfoHandler.cs b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonGetInfoHandler.cs
new file mode 100644
index 000000000..86e352d96
--- /dev/null
+++ b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonGetInfoHandler.cs
@@ -0,0 +1,39 @@
+using Arrowgene.Ddon.Server;
+using Arrowgene.Ddon.Shared.Entity.PacketStructure;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Network;
+using Arrowgene.Logging;
+
+namespace Arrowgene.Ddon.GameServer.Handler
+{
+ public class SeasonDungeonGetInfoHandler : GameRequestPacketHandler
+ {
+ private static readonly ServerLogger Logger = LogProvider.Logger(typeof(SeasonDungeonGetInfoHandler));
+
+ public SeasonDungeonGetInfoHandler(DdonGameServer server) : base(server)
+ {
+ }
+
+ public override S2CSeasonDungeonGetInfoRes Handle(GameClient client, C2SSeasonDungeonGetInfoReq request)
+ {
+ var result = new S2CSeasonDungeonGetInfoRes();
+
+ var dungeonInfo = Server.EpitaphRoadManager.GetDungeonInfo(request.DungeonId);
+
+ result.DungeonInfo.Unk0 = 40;
+ result.DungeonInfo.Unk1 = dungeonInfo.Name;
+ result.DungeonInfo.Unk2 = dungeonInfo.DungeonId;
+
+ foreach (var section in dungeonInfo.Sections)
+ {
+ if (section.UnlockCost.Count == 0 ||
+ ((section.UnlockCost.Count > 0) && client.Character.EpitaphRoadState.UnlockedContent.Contains(section.EpitaphId)))
+ {
+ result.DungeonSections.Add(section.AsCDataSeasonDungeonSection());
+ }
+ }
+
+ return result;
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonGetSoulOrdealListFromOmHandler.cs b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonGetSoulOrdealListFromOmHandler.cs
new file mode 100644
index 000000000..35da835bb
--- /dev/null
+++ b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonGetSoulOrdealListFromOmHandler.cs
@@ -0,0 +1,52 @@
+using Arrowgene.Ddon.Server;
+using Arrowgene.Ddon.Shared.Entity.PacketStructure;
+using Arrowgene.Ddon.Shared.Model.EpitaphRoad;
+using Arrowgene.Logging;
+
+namespace Arrowgene.Ddon.GameServer.Handler
+{
+ public class SeasonDungeonGetSoulOrdealListFromOmHandler : GameRequestPacketHandler
+ {
+ private static readonly ServerLogger Logger = LogProvider.Logger(typeof(SeasonDungeonGetSoulOrdealListFromOmHandler));
+
+ public SeasonDungeonGetSoulOrdealListFromOmHandler(DdonGameServer server) : base(server)
+ {
+ }
+
+ public override S2CSeasonDungeonGetSoulOrdealListfromOmRes Handle(GameClient client, C2SSeasonDungeonGetSoulOrdealListfromOmReq request)
+ {
+ var result = new S2CSeasonDungeonGetSoulOrdealListfromOmRes();
+
+ Logger.Debug($"EpitaphOM: {request.StageLayoutId.AsStageId()}, Unk0={request.Unk0}");
+
+ var stageId = request.StageLayoutId.AsStageId();
+ if (Server.EpitaphRoadManager.TrialHasRewards(client.Party, stageId))
+ {
+ result.Type = SoulOrdealOrderState.GetRewards;
+ result.Unk2 = true;
+ }
+ else if (Server.EpitaphRoadManager.TrialInProgress(client.Party))
+ {
+ result.Type = SoulOrdealOrderState.Interrupt;
+ result.Unk2 = true;
+ }
+ else if (!Server.EpitaphRoadManager.TrialCompleted(client.Party, stageId))
+ {
+ result.Type = Server.EpitaphRoadManager.IsTrialUnlocked(client.Party, stageId) ? SoulOrdealOrderState.GetList : SoulOrdealOrderState.UnlockTrial;
+ if (result.Type == SoulOrdealOrderState.GetList)
+ {
+ var trial = Server.EpitaphRoadManager.GetTrial(stageId);
+ result.ElementParamList = trial.SoulOrdealOptions();
+ }
+ result.Unk2 = true;
+ }
+ else
+ {
+ result.Type = SoulOrdealOrderState.Completed;
+ result.Unk2 = true;
+ }
+
+ return result;
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonGetSoulOrdealRewardListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonGetSoulOrdealRewardListHandler.cs
new file mode 100644
index 000000000..d869e721f
--- /dev/null
+++ b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonGetSoulOrdealRewardListHandler.cs
@@ -0,0 +1,32 @@
+using Arrowgene.Ddon.GameServer.Characters;
+using Arrowgene.Ddon.Server;
+using Arrowgene.Ddon.Shared.Entity.PacketStructure;
+using Arrowgene.Ddon.Shared.Network;
+using Arrowgene.Logging;
+using System.Collections.Generic;
+
+namespace Arrowgene.Ddon.GameServer.Handler
+{
+ public class SeasonDungeonGetSoulOrdealRewardListHandler : GameRequestPacketHandler
+ {
+ private static readonly ServerLogger Logger = LogProvider.Logger(typeof(SeasonDungeonGetSoulOrdealRewardListHandler));
+
+ public SeasonDungeonGetSoulOrdealRewardListHandler(DdonGameServer server) : base(server)
+ {
+ }
+
+ public override S2CSeasonDungeonGetSoulOrdealRewardListRes Handle(GameClient client, C2SSeasonDungeonGetSoulOrdealRewardListReq request)
+ {
+ // var result = new S2CSeasonDungeonGetSoulOrdealRewardListRes.Serializer().Read(pcap_data);
+
+ var rewards = Server.EpitaphRoadManager.GetRewards(client.Party, request.LayoutId.AsStageId());
+ return new S2CSeasonDungeonGetSoulOrdealRewardListRes()
+ {
+ BuffRewards = rewards.BuffRewards,
+ ItemRewards = rewards.ItemRewards
+ };
+ }
+
+ private readonly byte[] pcap_data = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xE3, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x49, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x53, 0x8E, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x1A, 0xE6, 0xB0, 0x97, 0xE7, 0xB5, 0xB6, 0xE6, 0x94, 0xBB, 0xE5, 0x8A, 0x9B, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x97, 0x2B, 0x4C, 0x76, 0x2E, 0x31, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x36, 0x00, 0x2A, 0xE7, 0x8A, 0xB6, 0xE6, 0x85, 0x8B, 0xE7, 0x95, 0xB0, 0xE5, 0xB8, 0xB8, 0xE4, 0xBB, 0x98, 0xE4, 0xB8, 0x8E, 0xE3, 0x80, 0x90, 0xE6, 0xB0, 0xB7, 0xE9, 0x98, 0xB2, 0xE4, 0xBD, 0x8E, 0xE4, 0xB8, 0x8B, 0xE3, 0x80, 0x91, 0x4C, 0x76, 0x2E, 0x4D, 0x61, 0x78, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x05, 0x00, 0x1D, 0xE7, 0x89, 0xA9, 0xE7, 0x90, 0x86, 0xE9, 0x98, 0xB2, 0xE5, 0xBE, 0xA1, 0xE5, 0x8A, 0x9B, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x97, 0x2B, 0x4C, 0x76, 0x2E, 0x31, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x23, 0x00, 0x24, 0xE7, 0x8A, 0xB6, 0xE6, 0x85, 0x8B, 0xE7, 0x95, 0xB0, 0xE5, 0xB8, 0xB8, 0xE8, 0x80, 0x90, 0xE6, 0x80, 0xA7, 0xE3, 0x80, 0x90, 0xE9, 0x81, 0x85, 0xE5, 0xBB, 0xB6, 0xE3, 0x80, 0x91, 0x4C, 0x76, 0x2E, 0x4D, 0x61, 0x78, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x42, 0x00, 0x23, 0xE8, 0xA9, 0xA6, 0xE7, 0xB7, 0xB4, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAA, 0xE3, 0x82, 0xA2, 0xE3, 0x81, 0xAE, 0xE5, 0xA0, 0xB1, 0xE9, 0x85, 0xAC, 0xE5, 0xA2, 0x97, 0xE5, 0x8A, 0xA0, 0x2B, 0x4C, 0x76, 0x2E, 0x31, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+ }
+}
diff --git a/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonReceiveSoulOrdealBuffHandler.cs b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonReceiveSoulOrdealBuffHandler.cs
new file mode 100644
index 000000000..73ba53c05
--- /dev/null
+++ b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonReceiveSoulOrdealBuffHandler.cs
@@ -0,0 +1,68 @@
+using Arrowgene.Ddon.GameServer.Characters;
+using Arrowgene.Ddon.Server;
+using Arrowgene.Ddon.Shared.Entity.PacketStructure;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Network;
+using Arrowgene.Logging;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Arrowgene.Ddon.GameServer.Handler
+{
+ public class SeasonDungeonReceiveSoulOrdealBuffHandler : GameRequestPacketHandler
+ {
+ private static readonly ServerLogger Logger = LogProvider.Logger(typeof(SeasonDungeonReceiveSoulOrdealBuffHandler));
+
+ public SeasonDungeonReceiveSoulOrdealBuffHandler(DdonGameServer server) : base(server)
+ {
+ }
+
+ public override S2CSeasonDungeonReceiveSoulOrdealRewardBuffRes Handle(GameClient client, C2SSeasonDungeonReceiveSoulOrdealRewardBuffReq request)
+ {
+ var rewards = Server.EpitaphRoadManager.GetRewards(client.Party, request.LayoutId.AsStageId());
+
+ if (request.BuffId == 0)
+ {
+ // Player choose to not pick a buff reward
+ rewards.BuffRewards.Clear();
+ return new S2CSeasonDungeonReceiveSoulOrdealRewardBuffRes();
+ }
+
+ var newBuff = rewards.BuffRewards.Where(x => x.BuffId == request.BuffId).First();
+
+ Server.EpitaphRoadManager.AddPlayerBuff(client, client.Party, newBuff.BuffId, newBuff.Level);
+
+ var partyBuffs = Server.EpitaphRoadManager.GetPartyBuffs(client.Party);
+
+ var playerNtc = new S2CSeasonDungeonAreaBuffEffectNtc();
+ foreach (var buff in Server.EpitaphRoadManager.GetPlayerBuffs(client, client.Party))
+ {
+ playerNtc.BuffEffectParamList.Add(buff.AsCDataSeasonDungeonBuffEffectParam());
+ }
+ client.Send(playerNtc);
+
+ var partyNtc = new S2C_SEASON_62_39_16_NTC()
+ {
+ CharacterId = client.Character.CharacterId
+ };
+
+ foreach (var buff in Server.EpitaphRoadManager.GetPlayerBuffs(client, client.Party))
+ {
+ partyNtc.BuffList.Add(new CDataSeasonDungeonUnk0()
+ {
+ BuffId = buff.BuffId,
+ Level = buff.Increment
+ });
+ }
+ client.Party.SendToAll(partyNtc);
+
+ // Remove any existing rewards for buffs incase the player cancels out of the receive items menu
+ rewards.BuffRewards.Clear();
+
+ return new S2CSeasonDungeonReceiveSoulOrdealRewardBuffRes();
+ }
+
+ private readonly byte[] pcap_data0 = { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x1B, 0xE6, 0xB0, 0x97, 0xE7, 0xB5, 0xB6, 0xE6, 0x94, 0xBB, 0xE5, 0x8A, 0x9B, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x97, 0x20, 0x4C, 0x76, 0x2E, 0x20, 0x31, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xD1, 0x3F, 0x80, 0x00, 0x00, 0xBF, 0xB5, 0xDB, 0xBF, 0xBF, 0xB5 };
+ private readonly byte[] pcap_data1 = { 0x00, 0x21, 0x55, 0x9B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x01, 0x97, 0xE7, 0xB5, 0xB6, 0xE6, 0x94, 0xBB };
+ }
+}
diff --git a/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonReceiveSoulOrdealRewardHandler.cs b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonReceiveSoulOrdealRewardHandler.cs
new file mode 100644
index 000000000..23022de6c
--- /dev/null
+++ b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonReceiveSoulOrdealRewardHandler.cs
@@ -0,0 +1,62 @@
+using Arrowgene.Ddon.Server;
+using Arrowgene.Ddon.Shared.Entity.PacketStructure;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Model;
+using Arrowgene.Ddon.Shared.Model.EpitaphRoad;
+using Arrowgene.Logging;
+using System.Linq;
+
+namespace Arrowgene.Ddon.GameServer.Handler
+{
+ public class SeasonDungeonReceiveSoulOrdealRewardHandler : GameRequestPacketHandler
+ {
+ private static readonly ServerLogger Logger = LogProvider.Logger(typeof(SeasonDungeonReceiveSoulOrdealRewardHandler));
+
+ public SeasonDungeonReceiveSoulOrdealRewardHandler(DdonGameServer server) : base(server)
+ {
+ }
+
+ public override S2CSeasonDungeonReceiveSoulOrdealRewardRes Handle(GameClient client, C2SSeasonDungeonReceiveSoulOrdealRewardReq request)
+ {
+ client.Send(new S2CSeasonDungeonSetOmStateNtc()
+ {
+ LayoutId = request.StageId,
+ State = SoulOrdealOmState.RewardReceived
+ });
+
+ S2CItemUpdateCharacterItemNtc updateCharacterItemNtc = new S2CItemUpdateCharacterItemNtc()
+ {
+ UpdateType = ItemNoticeType.SoulOrdealReward
+ };
+
+ var rewards = Server.EpitaphRoadManager.GetRewards(client.Party, request.StageId.AsStageId());
+ Server.Database.ExecuteInTransaction(connection =>
+ {
+ foreach (var reward in request.RewardList)
+ {
+ var item = rewards.ItemRewards[(int)reward.RewardIndex];
+ if (Server.ItemManager.IsItemWalletPoint(item.ItemId))
+ {
+ (WalletType walletType, uint amount) = Server.ItemManager.ItemToWalletPoint(item.ItemId);
+ var result = Server.WalletManager.AddToWallet(client.Character, walletType, amount * reward.Amount, connectionIn: connection);
+ updateCharacterItemNtc.UpdateWalletList.Add(result);
+ }
+ else if (reward.Amount > 0)
+ {
+ var result = Server.ItemManager.AddItem(Server, client.Character, true, item.ItemId, reward.Amount, connectionIn: connection);
+ updateCharacterItemNtc.UpdateItemList.AddRange(result);
+ }
+ }
+ });
+ client.Send(updateCharacterItemNtc);
+
+ // TODO: Might need to manage on a per player basis
+ Server.EpitaphRoadManager.CollectTrialRewards(client.Party, request.StageId.AsStageId());
+
+ return new S2CSeasonDungeonReceiveSoulOrdealRewardRes()
+ {
+ RewardList = rewards.ItemRewards.Select((x, index) => new CDataSoulOrdealRewardItem() { RewardIndex = (uint)index, Amount = 0 }).ToList()
+ };
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonSoulOrdealReadyHandler.cs b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonSoulOrdealReadyHandler.cs
new file mode 100644
index 000000000..8f1790f93
--- /dev/null
+++ b/Arrowgene.Ddon.GameServer/Handler/SeasonDungeonSoulOrdealReadyHandler.cs
@@ -0,0 +1,26 @@
+using Arrowgene.Ddon.Server;
+using Arrowgene.Ddon.Shared.Entity.PacketStructure;
+using Arrowgene.Ddon.Shared.Network;
+using Arrowgene.Logging;
+
+namespace Arrowgene.Ddon.GameServer.Handler
+{
+ public class SeasonDungeonSoulOrdealReadyHandler : GameRequestPacketHandler
+ {
+ private static readonly ServerLogger Logger = LogProvider.Logger(typeof(SeasonDungeonSoulOrdealReadyHandler));
+
+ public SeasonDungeonSoulOrdealReadyHandler(DdonGameServer server) : base(server)
+ {
+ }
+
+ public override S2CSeasonDungeonSoulOrdealReadyRes Handle(GameClient client, C2SSeasonDungeonSoulOrdealReadyReq request)
+ {
+ client.Party.SendToAll(new S2CSeasonDungeonGroupReadyNtc()
+ {
+ Ready = true
+ });
+ return new S2CSeasonDungeonSoulOrdealReadyRes();
+ }
+ }
+}
+
diff --git a/Arrowgene.Ddon.GameServer/Handler/StageAreaChangeHandler.cs b/Arrowgene.Ddon.GameServer/Handler/StageAreaChangeHandler.cs
index 85f402254..00df9a03e 100644
--- a/Arrowgene.Ddon.GameServer/Handler/StageAreaChangeHandler.cs
+++ b/Arrowgene.Ddon.GameServer/Handler/StageAreaChangeHandler.cs
@@ -70,13 +70,11 @@ public override S2CStageAreaChangeRes Handle(GameClient client, C2SStageAreaChan
{
client.Party.ResetInstance();
client.Party.SendToAll(new S2CInstanceAreaResetNtc());
- // Next two packets seem to be send when transitioning to a safe area in all pcaps
- // not sure what they do though
- client.Party.SendToAll(new S2C_SEASON_62_38_16_NTC());
- // client.Party.SendToAll(new S2C_SEASON_62_39_16_NTC) ??? Does this go to all, it has a character ID
}
}
+ Server.EpitaphRoadManager.AreaChange(client, packet.StageId);
+
if (client.Party.ExmInProgress && BoardManager.BoardIdIsExm(client.Party.ContentId))
{
var quest = QuestManager.GetQuestByBoardId(client.Party.ContentId);
diff --git a/Arrowgene.Ddon.GameServer/Handler/StageGetSpAreaChangeIdFromNpcIdHandler.cs b/Arrowgene.Ddon.GameServer/Handler/StageGetSpAreaChangeIdFromNpcIdHandler.cs
new file mode 100644
index 000000000..324192089
--- /dev/null
+++ b/Arrowgene.Ddon.GameServer/Handler/StageGetSpAreaChangeIdFromNpcIdHandler.cs
@@ -0,0 +1,23 @@
+using Arrowgene.Ddon.Server;
+using Arrowgene.Ddon.Shared.Entity.PacketStructure;
+using Arrowgene.Logging;
+
+namespace Arrowgene.Ddon.GameServer.Handler
+{
+ public class StageGetSpAreaChangeIdFromNpcIdHandler : GameRequestPacketHandler
+ {
+ private static readonly ServerLogger Logger = LogProvider.Logger(typeof(StageGetSpAreaChangeIdFromNpcIdHandler));
+
+ public StageGetSpAreaChangeIdFromNpcIdHandler(DdonGameServer server) : base(server)
+ {
+ }
+
+ public override S2CStageGetSpAreaChangeIdFromNpcIdRes Handle(GameClient client, C2SStageGetSpAreaChangeIdFromNpcIdReq packet)
+ {
+ return new S2CStageGetSpAreaChangeIdFromNpcIdRes()
+ {
+ StageId = 558
+ };
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.GameServer/Handler/StageGetSpAreaChangeInfoHandler.cs b/Arrowgene.Ddon.GameServer/Handler/StageGetSpAreaChangeInfoHandler.cs
new file mode 100644
index 000000000..8fe10bcfa
--- /dev/null
+++ b/Arrowgene.Ddon.GameServer/Handler/StageGetSpAreaChangeInfoHandler.cs
@@ -0,0 +1,25 @@
+using Arrowgene.Ddon.Server;
+using Arrowgene.Ddon.Shared.Entity.PacketStructure;
+using Arrowgene.Logging;
+
+namespace Arrowgene.Ddon.GameServer.Handler
+{
+ public class StageGetSpAreaChangeInfoHandler : GameRequestPacketHandler
+ {
+ private static readonly ServerLogger Logger = LogProvider.Logger(typeof(StageGetSpAreaChangeIdFromNpcIdHandler));
+
+ public StageGetSpAreaChangeInfoHandler(DdonGameServer server) : base(server)
+ {
+ }
+
+ public override S2CStageGetSpAreaChangeInfoRes Handle(GameClient client, C2SStageGetSpAreaChangeInfoReq packet)
+ {
+ return new S2CStageGetSpAreaChangeInfoRes()
+ {
+ Unk0 = 19,
+ Unk1 = "Memory of Megadosys",
+ StageId = 559,
+ };
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.GameServer/Handler/StageUnisonAreaChangeBeginRecruitmentHandler.cs b/Arrowgene.Ddon.GameServer/Handler/StageUnisonAreaChangeBeginRecruitmentHandler.cs
index 7d8753d1c..520fcf6c8 100644
--- a/Arrowgene.Ddon.GameServer/Handler/StageUnisonAreaChangeBeginRecruitmentHandler.cs
+++ b/Arrowgene.Ddon.GameServer/Handler/StageUnisonAreaChangeBeginRecruitmentHandler.cs
@@ -1,9 +1,9 @@
-using Arrowgene.Ddon.GameServer.Characters;
using Arrowgene.Ddon.Server;
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Model.EpitaphRoad;
using Arrowgene.Logging;
-using System.Collections.Generic;
+using System.IO;
namespace Arrowgene.Ddon.GameServer.Handler
{
@@ -17,13 +17,34 @@ public StageUnisonAreaChangeBeginRecruitmentHandler(DdonGameServer server) : bas
public override S2CStageUnisonAreaChangeBeginRecruitmentRes Handle(GameClient client, C2SStageUnisonAreaChangeBeginRecruitmentReq request)
{
- Server.BonusDungeonManager.MarkReady(client.Party, client.Character, request.Unk0);
- if (Server.BonusDungeonManager.PartyIsReady(client.Party))
+ var pcap = new C2SStageUnisonAreaChangeBeginRecruitmentReq.Serializer().Read(epitah_pcap);
+
+ if (request.EntranceId == 1111)
{
- Server.BonusDungeonManager.StartDungeon(client.Party);
+ var pcap2 = new S2CStageDungeonStartNtc.Serializer().Read(epitah_start);
+
+ var section = Server.EpitaphRoadManager.GetSectionById(request.DungeonId);
+ var ntc = new S2CStageDungeonStartNtc()
+ {
+ StageId = section.StageId,
+ StartPos = section.StartingPos,
+ Unk4 = true,
+ };
+ client.Party.SendToAll(ntc);
+ }
+ else
+ {
+ Server.BonusDungeonManager.MarkReady(client.Party, client.Character, request.DungeonId);
+ if (Server.BonusDungeonManager.PartyIsReady(client.Party))
+ {
+ Server.BonusDungeonManager.StartDungeon(client.Party);
+ }
}
return new S2CStageUnisonAreaChangeBeginRecruitmentRes();
}
+
+ private static readonly byte[] epitah_start = { 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x02, 0x2F, 0x00, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x78, 0x3E, 0xC4, 0x91 };
+ private static readonly byte[] epitah_pcap = { 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x57, 0x00, 0x2A, 0xE7, 0xAC, 0xAC, 0x34, 0xE5, 0x8C, 0xBA, 0xE7, 0x94, 0xBB, 0x20, 0xE3, 0x83, 0xA1, 0xE3, 0x82, 0xAC, 0xE3, 0x83, 0x89, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0xB9, 0xE3, 0x81, 0xAE, 0xE8, 0xA8, 0x98, 0xE6, 0x86, 0xB6, 0x20, 0xE5, 0xB1, 0xB1, 0xE9, 0x81, 0x93, 0x5E, 0x0B, 0x5E, 0x00, 0x00, 0x06, 0x4C, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
}
}
diff --git a/Arrowgene.Ddon.Shared/Asset/BonusDungeonAsset.cs b/Arrowgene.Ddon.Shared/Asset/BonusDungeonAsset.cs
index 11c2cc119..86d8e1998 100644
--- a/Arrowgene.Ddon.Shared/Asset/BonusDungeonAsset.cs
+++ b/Arrowgene.Ddon.Shared/Asset/BonusDungeonAsset.cs
@@ -8,7 +8,7 @@ public class BonusDungeonInfo
public BonusDungeonInfo()
{
EventName = string.Empty;
- EntryCostList = new List();
+ EntryCostList = new List();
}
public uint DungeonId { get; set; }
@@ -17,7 +17,7 @@ public BonusDungeonInfo()
public uint StartingPos { get; set; }
public bool SyncMonsterLevel { get; set; }
- public List EntryCostList { get; set; }
+ public List EntryCostList { get; set; }
}
public class BonusDungeonCategory
diff --git a/Arrowgene.Ddon.Shared/Asset/EpitaphRoadAsset.cs b/Arrowgene.Ddon.Shared/Asset/EpitaphRoadAsset.cs
new file mode 100644
index 000000000..d497eac1c
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Asset/EpitaphRoadAsset.cs
@@ -0,0 +1,128 @@
+using System;
+using System.Collections.Generic;
+using System.Security.Cryptography.X509Certificates;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Model;
+using Arrowgene.Ddon.Shared.Model.EpitaphRoad;
+using Arrowgene.Ddon.Shared.Model.Quest;
+
+namespace Arrowgene.Ddon.Shared.Asset
+{
+ public class EpitaphBuff
+ {
+ public EpitaphBuff()
+ {
+ Name = string.Empty;
+ }
+
+ public EpitaphBuff(EpitaphBuff that)
+ {
+ this.Name = that.Name;
+ this.Type = that.Type;
+ this.BuffId = that.BuffId;
+ this.BuffEffect = that.BuffEffect;
+ this.Increment = that.Increment;
+ }
+
+ public string Name;
+ public SoulOrdealBuffType Type;
+ public uint BuffId;
+ public uint BuffEffect;
+ public uint Increment;
+
+ public CDataSeasonDungeonBuffEffectReward AsCDataSeasonDungeonBuffEffectReward()
+ {
+ string incLbl = (Increment == 1) ? "+Lv.1" : "Lv.Max";
+ string label = $"{Name} {incLbl}";
+ return new CDataSeasonDungeonBuffEffectReward()
+ {
+ Level = Increment,
+ BuffId = BuffId,
+ BuffEffect = BuffEffect,
+ BuffName = label
+ };
+ }
+
+ public CDataSeasonDungeonBuffEffectParam AsCDataSeasonDungeonBuffEffectParam()
+ {
+ string label = (Increment < 4) ? $"{Name} +Lv.{Increment}" : $"{Name} Lv.Max";
+ return new CDataSeasonDungeonBuffEffectParam()
+ {
+ Level = Increment,
+ Unk1 = new CDataSeasonDungeonUnk2()
+ {
+ BuffId = BuffId,
+ Label = label
+ }
+ };
+ }
+ }
+
+ public class EpitaphSection
+ {
+ public EpitaphSection()
+ {
+ Name = string.Empty;
+ UnlockCost = new List();
+ BarrierOmIds = new List();
+ }
+
+ public string Name { get; set; }
+ public uint StageId { get; set; }
+ public uint StartingPos { get; set; }
+ public uint DungeonId { get; set; }
+ public uint EpitaphId { get; set; }
+ public List UnlockCost { get; set; }
+ public List BarrierOmIds { get; set; }
+
+ public CDataSeasonDungeonSection AsCDataSeasonDungeonSection()
+ {
+ return new CDataSeasonDungeonSection()
+ {
+ SectionName = Name,
+ Unk0 = 0,
+ Unk2 = 0,
+ Unk1 = 550,
+ Unk3 = EpitaphId,
+ Unk4 = new CDataSeasonDungeonUnk0() // TODO: This type got renamed incorrect/confused
+ {
+ BuffId = 3,
+ Level = 7
+ },
+ Unk5 = true
+ };
+ }
+ }
+
+ public class EpitaphPath
+ {
+ public EpitaphPath()
+ {
+ Name = string.Empty;
+ Sections = new List();
+ StageIds = new HashSet();
+ }
+
+ public string Name { get; set; }
+ public uint DungeonId { get; set; }
+ public NpcId NpcId;
+ public List Sections { get; set; }
+ public HashSet StageIds { get; set; }
+ }
+
+ public class EpitaphRoadAsset
+ {
+ public EpitaphRoadAsset()
+ {
+ Paths = new Dictionary();
+ BuffsByType = new Dictionary>();
+ BuffsById = new Dictionary();
+ SectionById = new Dictionary();
+ }
+
+ public Dictionary Paths { get; set; }
+ public Dictionary> BuffsByType { get; set; }
+ public Dictionary BuffsById { get; set; }
+ public Dictionary SectionById { get; set; }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Asset/EpitaphTrialAsset.cs b/Arrowgene.Ddon.Shared/Asset/EpitaphTrialAsset.cs
new file mode 100644
index 000000000..b2f602a62
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Asset/EpitaphTrialAsset.cs
@@ -0,0 +1,187 @@
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Model;
+using Arrowgene.Ddon.Shared.Model.EpitaphRoad;
+using Arrowgene.Ddon.Shared.Model.Quest;
+using System;
+using System.Collections.Generic;
+
+namespace Arrowgene.Ddon.Shared.Asset
+{
+ public class EpitaphItemReward
+ {
+ public EpitaphItemReward()
+ {
+ Items = new List<(uint ItemId, uint Amount, SoulOrdealRewardType Type, bool IsHidden, double Chance)>();
+ }
+
+ public SoulOrdealRewardType Type;
+ public uint Rolls { get; set; }
+ public List<(uint ItemId, uint Amount, SoulOrdealRewardType Type, bool IsHidden, double Chance)> Items { get; set; }
+
+ public List AsCDataGatheringItemElement()
+ {
+ var results = new List();
+ for (uint i = 0; i < Rolls; i++)
+ {
+ var item = Items[Random.Shared.Next(Items.Count)];
+ if (item.Chance >= Random.Shared.NextDouble())
+ {
+ results.Add(new CDataGatheringItemElement()
+ {
+ ItemId = item.ItemId,
+ ItemNum = (item.Type == SoulOrdealRewardType.Fixed) ? item.Amount : (uint)Random.Shared.Next(1, (int)item.Amount),
+ IsHidden = item.IsHidden
+ });
+ }
+ }
+ return results;
+ }
+ }
+
+ public class EpitaphObjective
+ {
+ public EpitaphObjective()
+ {
+ }
+
+ public EpitaphObjective(EpitaphObjective that)
+ {
+ this.Type = that.Type;
+ this.Priority = that.Priority;
+ this.Param1 = that.Param1;
+ this.Param2 = that.Param2;
+ }
+
+ public SoulOrdealObjective Type;
+ public SoulOrdealObjectivePriority Priority;
+ public uint Param1;
+ public uint Param2;
+
+ public string Label()
+ {
+ uint counter = 0;
+
+ string label;
+ switch (Type)
+ {
+ case SoulOrdealObjective.DefeatEnemyCount:
+ label = $"Defeat {Param1} or more enemies {Param2}/{Param1}";
+ break;
+ case SoulOrdealObjective.CannotDieMoreThanOnce:
+ counter = (Param2 == 1) ? 0U : 1U;
+ label = $"Cannot die more than once {counter}/1";
+ break;
+ case SoulOrdealObjective.CannotBeAffectedByAbnormalStatus:
+ label = $"Cannot be affected by abnormal status more than {Param1} times {Param2}/{Param1}";
+ break;
+ case SoulOrdealObjective.ItemNoteUsedMoreThanOnce:
+ counter = (Param2 == 1) ? 0U : 1U;
+ label = $"Items must not be used more than once {counter}/1";
+ break;
+ case SoulOrdealObjective.EliminateTheEnemy:
+ label = "Eliminate the enemy";
+ break;
+ case SoulOrdealObjective.CompleteConditionsWithinTimeLimit:
+ label = "Complete the conditions within the time limit";
+ break;
+ default:
+ label = $"TODO: Implement label for objective: {Type}";
+ break;
+ }
+
+ return label;
+ }
+
+ public CDataSoulOrdealObjective AsCDataSoulOrdealObjective()
+ {
+ return new CDataSoulOrdealObjective()
+ {
+ Type = Type,
+ Priority = Priority,
+ Param1 = Param1,
+ Param2 = Param2,
+ ObjectiveLabel = Label()
+ };
+ }
+ }
+
+ public class EpitaphTrialOption
+ {
+ public EpitaphTrialOption()
+ {
+ EnemyGroups = new Dictionary();
+ EnemyGroupsByStageId = new Dictionary();
+ EntryCost = new List();
+ Objectives = new Dictionary();
+ ItemRewards = new List();
+
+ TrialName = string.Empty;
+ }
+
+ public string TrialName { get; set; }
+ public uint TrialId { get; set; }
+ public Dictionary EnemyGroups { get; set; }
+ public Dictionary EnemyGroupsByStageId { get; set; }
+ public List EntryCost { get; set; }
+ public Dictionary Objectives {get; set;}
+ public StageId OmLayoutId { get; set; }
+ public List ItemRewards { get; set; }
+
+ public Dictionary CreateNewObjectiveState()
+ {
+ var results = new Dictionary();
+ foreach (var constraint in Objectives.Values)
+ {
+ results.Add(constraint.Type, new EpitaphObjective(constraint));
+ }
+ return results;
+ }
+ }
+
+ public class EpitaphTrial
+ {
+ public EpitaphTrial()
+ {
+ Options = new List();
+ UnlockCost = new List();
+ }
+
+ public StageId OmLayoutId { get; set; }
+ public uint EpitaphId { get; set; }
+ public List Options { get; set; }
+ public List UnlockCost { get; set; }
+
+ public List SoulOrdealOptions()
+ {
+ List results = new List();
+
+ foreach (var option in Options)
+ {
+ results.Add(new CDataSoulOrdealElementParam()
+ {
+ TrialId = option.TrialId,
+ TrialName = option.TrialName,
+ TrialCost = option.EntryCost
+ });
+ }
+
+ return results;
+ }
+ }
+
+ public class EpitaphTrialAsset
+ {
+ public EpitaphTrialAsset()
+ {
+ Trials = new Dictionary();
+ TrialsById = new Dictionary();
+ TrialsOptionById = new Dictionary();
+ CostById = new Dictionary>();
+ }
+
+ public Dictionary Trials { get; set; }
+ public Dictionary TrialsById { get; set; }
+ public Dictionary TrialsOptionById { get; set; }
+ public Dictionary> CostById { get; set; }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/AssetReader/BonusDungeonAssetDeserializer.cs b/Arrowgene.Ddon.Shared/AssetReader/BonusDungeonAssetDeserializer.cs
index e283c69a5..6c436375b 100644
--- a/Arrowgene.Ddon.Shared/AssetReader/BonusDungeonAssetDeserializer.cs
+++ b/Arrowgene.Ddon.Shared/AssetReader/BonusDungeonAssetDeserializer.cs
@@ -45,7 +45,7 @@ public BonusDungeonAsset ReadPath(string path)
foreach (var jItem in jDungeon.GetProperty("entry_fee").EnumerateArray())
{
- dungeonInfo.EntryCostList.Add(new CDataStageTicketDungeonItem()
+ dungeonInfo.EntryCostList.Add(new CDataStageDungeonItem()
{
ItemId = jItem.GetProperty("item_id").GetUInt32(),
Num = jItem.GetProperty("amount").GetUInt16()
diff --git a/Arrowgene.Ddon.Shared/AssetReader/EnemyAssetCommonDeserializer.cs b/Arrowgene.Ddon.Shared/AssetReader/EnemyAssetCommonDeserializer.cs
new file mode 100644
index 000000000..b5b71f436
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/AssetReader/EnemyAssetCommonDeserializer.cs
@@ -0,0 +1,281 @@
+using Arrowgene.Ddon.Shared.Model;
+using Arrowgene.Ddon.Shared.Model.Quest;
+using Arrowgene.Logging;
+using System;
+using System.Collections.Generic;
+using System.Text.Json;
+
+namespace Arrowgene.Ddon.Shared.AssetReader
+{
+ public class EnemyAssetCommonDeserializer
+ {
+ private static readonly ILogger Logger = LogProvider.Logger(typeof(EnemyAssetCommonDeserializer));
+
+ private Dictionary NamedParams;
+
+ public EnemyAssetCommonDeserializer(Dictionary namedParams)
+ {
+ NamedParams = namedParams;
+ }
+
+ public bool ParseEnemyGroups(Dictionary EnemyGroups, JsonElement jElement)
+ {
+ if (!jElement.TryGetProperty("enemy_groups", out JsonElement jGroups))
+ {
+ // No Enemy groups to parse
+ return true;
+ }
+
+ uint groupId = 0;
+ foreach (var jGroup in jGroups.EnumerateArray())
+ {
+ QuestEnemyGroup enemyGroup = new QuestEnemyGroup();
+
+ if (!jGroup.TryGetProperty("stage_id", out JsonElement jStageId))
+ {
+ Logger.Info("Required stage_id field for enemy group not found.");
+ return false;
+ }
+
+ enemyGroup.StageId = ParseStageId(jStageId);
+
+ enemyGroup.SubGroupId = 0;
+ if (jGroup.TryGetProperty("subgroup_id", out JsonElement jSubGroupId))
+ {
+ enemyGroup.SubGroupId = jSubGroupId.GetUInt32();
+ }
+
+ enemyGroup.StartingIndex = 0;
+ if (jGroup.TryGetProperty("starting_index", out JsonElement jStartingIndex))
+ {
+ enemyGroup.StartingIndex = jStartingIndex.GetUInt32();
+ }
+
+ enemyGroup.PlacementType = QuestEnemyPlacementType.Automatic;
+ if (jGroup.TryGetProperty("placement_type", out JsonElement jPlacementType))
+ {
+ if (!Enum.TryParse(jPlacementType.GetString(), true, out QuestEnemyPlacementType placementType))
+ {
+ Logger.Error($"Invalid Quest Enemy Placement Type");
+ return false;
+ }
+
+ enemyGroup.PlacementType = placementType;
+ }
+
+ foreach (var enemy in jGroup.GetProperty("enemies").EnumerateArray())
+ {
+ bool isBoss = false;
+ if (enemy.TryGetProperty("is_boss", out JsonElement jIsBoss))
+ {
+ isBoss = jIsBoss.GetBoolean();
+ }
+
+ byte index = 0;
+ if (enemyGroup.PlacementType == QuestEnemyPlacementType.Manual)
+ {
+ if (!enemy.TryGetProperty("index", out JsonElement jEnemyIndex))
+ {
+ Logger.Error($"Manual placed enemy group requires an index value. Unable to parse.");
+ return false;
+ }
+ index = jEnemyIndex.GetByte();
+ }
+
+ bool isRequired = true;
+ if (enemy.TryGetProperty("is_required", out JsonElement jIsRequired))
+ {
+ isRequired = jIsRequired.GetBoolean();
+ }
+
+ uint repopWaitSecond = 0;
+ if (enemy.TryGetProperty("repop_wait_second", out JsonElement jRepopWaitSecond))
+ {
+ repopWaitSecond = jRepopWaitSecond.GetUInt32();
+ }
+
+ // Look for custom drops here
+ bool customDropItems = false;
+
+ // Setting default values in case a custom table is defined.
+ DropsTable customTable = new()
+ {
+ Id = 0,
+ MdlType = 0,
+ };
+
+ if (enemy.TryGetProperty("drop_items", out JsonElement itemsList))
+ {
+ customDropItems = true;
+ var list = itemsList.EnumerateArray();
+
+ foreach (var items in list)
+ {
+ GatheringItem dropItems = new()
+ {
+ ItemId = items.GetProperty("item_id").GetUInt32(),
+ ItemNum = items.GetProperty("item_min").GetUInt32(),
+ MaxItemNum = items.GetProperty("item_max").GetUInt32(),
+ Quality = items.GetProperty("quality").GetUInt32(),
+ IsHidden = false,
+ DropChance = items.GetProperty("drop_chance").GetDouble()
+ };
+
+ customTable.Items.Add(dropItems);
+ }
+
+ }
+
+ var questEnemy = new InstancedEnemy()
+ {
+ EnemyId = Convert.ToUInt32(enemy.GetProperty("enemy_id").GetString(), 16),
+ Lv = enemy.GetProperty("level").GetUInt16(),
+ Experience = enemy.GetProperty("exp").GetUInt32(),
+ IsBossBGM = isBoss,
+ IsBossGauge = isBoss,
+ Scale = 100,
+ EnemyTargetTypesId = (byte)(isRequired ? 4 : 1),
+ Index = index,
+ IsRequired = isRequired,
+ RepopWaitSecond = repopWaitSecond,
+ };
+
+ ApplyOptionalEnemyKeys(enemy, questEnemy);
+
+ if (customDropItems)
+ {
+ questEnemy.DropsTable = customTable;
+ }
+
+ enemyGroup.Enemies.Add(questEnemy);
+ }
+
+ EnemyGroups[groupId++] = enemyGroup;
+ }
+
+ return true;
+ }
+
+ private void ApplyOptionalEnemyKeys(JsonElement enemy, Enemy questEnemey)
+ {
+ if (enemy.TryGetProperty("pp", out JsonElement jPpAmount))
+ {
+ questEnemey.PPDrop = jPpAmount.GetUInt32();
+ }
+
+ if (enemy.TryGetProperty("named_enemy_params_id", out JsonElement jNamedEnemyParamsId))
+ {
+ questEnemey.NamedEnemyParams = NamedParams.GetValueOrDefault(jNamedEnemyParamsId.GetUInt32(), NamedParam.DEFAULT_NAMED_PARAM);
+ }
+
+ if (enemy.TryGetProperty("raid_boss_id", out JsonElement jRaidBossId))
+ {
+ questEnemey.RaidBossId = jRaidBossId.GetUInt32();
+ }
+
+ if (enemy.TryGetProperty("scale", out JsonElement jScale))
+ {
+ questEnemey.Scale = jScale.GetUInt16();
+ }
+
+ if (enemy.TryGetProperty("hm_present_no", out JsonElement jHmPresetNo))
+ {
+ questEnemey.HmPresetNo = jHmPresetNo.GetUInt16();
+ }
+
+ if (enemy.TryGetProperty("start_think_tbl_no", out JsonElement jStartThinkTblNo))
+ {
+ questEnemey.StartThinkTblNo = jStartThinkTblNo.GetByte();
+ }
+
+ if (enemy.TryGetProperty("repop_num", out JsonElement jRepopNum))
+ {
+ questEnemey.RepopNum = jRepopNum.GetByte();
+ }
+
+ if (enemy.TryGetProperty("repop_count", out JsonElement jRepopCount))
+ {
+ questEnemey.RepopCount = jRepopCount.GetByte();
+ }
+
+ if (enemy.TryGetProperty("enemy_target_types_id", out JsonElement jEnemyTargetTypesId))
+ {
+ questEnemey.EnemyTargetTypesId = jEnemyTargetTypesId.GetByte();
+ }
+
+ if (enemy.TryGetProperty("montage_fix_no", out JsonElement jMontageFixNo))
+ {
+ questEnemey.MontageFixNo = jMontageFixNo.GetByte();
+ }
+
+ if (enemy.TryGetProperty("set_type", out JsonElement jSetType))
+ {
+ questEnemey.SetType = jSetType.GetByte();
+ }
+
+ if (enemy.TryGetProperty("infection_type", out JsonElement jInfectionType))
+ {
+ questEnemey.InfectionType = jInfectionType.GetByte();
+ }
+
+ if (enemy.TryGetProperty("is_boss_gauge", out JsonElement jIsBossGauge))
+ {
+ questEnemey.IsBossGauge = jIsBossGauge.GetBoolean();
+ }
+
+ if (enemy.TryGetProperty("is_boss_bgm", out JsonElement jIsBossBGM))
+ {
+ questEnemey.IsBossBGM = jIsBossBGM.GetBoolean();
+ }
+
+ if (enemy.TryGetProperty("is_manual_set", out JsonElement jIsManualSet))
+ {
+ questEnemey.IsManualSet = jIsManualSet.GetBoolean();
+ }
+
+ if (enemy.TryGetProperty("is_area_boss", out JsonElement jIsAreaBoss))
+ {
+ questEnemey.IsAreaBoss = jIsAreaBoss.GetBoolean();
+ }
+
+ if (enemy.TryGetProperty("blood_orbs", out JsonElement jBloodOrbs))
+ {
+ questEnemey.BloodOrbs = jBloodOrbs.GetUInt32();
+ }
+
+ if (enemy.TryGetProperty("high_orbs", out JsonElement jHighOrbs))
+ {
+ questEnemey.HighOrbs = jHighOrbs.GetUInt32();
+ }
+
+ if (enemy.TryGetProperty("spawn_time_start", out JsonElement jSpawnTimeStart))
+ {
+ questEnemey.SpawnTimeStart = jSpawnTimeStart.GetUInt32();
+ }
+
+ if (enemy.TryGetProperty("spawn_time_end", out JsonElement jSpawnTimeEnd))
+ {
+ questEnemey.SpawnTimeEnd = jSpawnTimeEnd.GetUInt32();
+ }
+ }
+
+ public StageId ParseStageId(JsonElement jStageId)
+ {
+ uint id = jStageId.GetProperty("id").GetUInt32();
+
+ byte layerNo = 0;
+ if (jStageId.TryGetProperty("layer_no", out JsonElement jLayerNo))
+ {
+ layerNo = jLayerNo.GetByte();
+ }
+
+ uint groupId = 0;
+ if (jStageId.TryGetProperty("group_id", out JsonElement jGroupId))
+ {
+ groupId = jGroupId.GetUInt32();
+ }
+
+ return new StageId(id, layerNo, groupId);
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/AssetReader/EpitaphRoadAssertDeserializer.cs b/Arrowgene.Ddon.Shared/AssetReader/EpitaphRoadAssertDeserializer.cs
new file mode 100644
index 000000000..11c76c128
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/AssetReader/EpitaphRoadAssertDeserializer.cs
@@ -0,0 +1,115 @@
+using Arrowgene.Ddon.Shared.Asset;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Model.EpitaphRoad;
+using Arrowgene.Logging;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text.Json;
+
+namespace Arrowgene.Ddon.Shared.AssetReader
+{
+ public class EpitaphRoadAssertDeserializer : IAssetDeserializer
+ {
+ private static readonly ILogger Logger = LogProvider.Logger(typeof(EpitaphRoadAssertDeserializer));
+
+ public EpitaphRoadAsset ReadPath(string path)
+ {
+ Logger.Info($"Reading {path}");
+
+ EpitaphRoadAsset asset = new EpitaphRoadAsset();
+
+ string json = File.ReadAllText(path);
+ JsonDocument document = JsonDocument.Parse(json);
+
+ foreach (var jEpiPath in document.RootElement.GetProperty("paths").EnumerateArray())
+ {
+ var epiPath = new EpitaphPath()
+ {
+ Name = jEpiPath.GetProperty("name").GetString(),
+ DungeonId = jEpiPath.GetProperty("dungeon_id").GetUInt32(),
+ };
+
+ if (!Enum.TryParse(jEpiPath.GetProperty("npc_id").GetString(), true, out epiPath.NpcId))
+ {
+ Logger.Error("Unable to parse Epitaph Road NpcId. Skipping");
+ continue;
+ }
+
+ foreach (var jStageId in jEpiPath.GetProperty("stage_ids").EnumerateArray())
+ {
+ epiPath.StageIds.Add(jStageId.GetUInt32());
+ }
+
+ uint i = 1;
+ foreach (var jSection in jEpiPath.GetProperty("sections").EnumerateArray())
+ {
+ var section = new EpitaphSection()
+ {
+ Name = jSection.GetProperty("name").GetString(),
+ StageId = jSection.GetProperty("stage_id").GetUInt32(),
+ StartingPos = jSection.GetProperty("start_pos").GetUInt32(),
+ DungeonId = epiPath.DungeonId
+ };
+ section.EpitaphId = EpitahId.GeneratePathId(epiPath.NpcId, i++);
+
+ foreach (var jItem in jSection.GetProperty("unlock_cost").EnumerateArray())
+ {
+ var item = new CDataSoulOrdealItem()
+ {
+ ItemId = jItem.GetProperty("item_id").GetUInt32(),
+ Num = jItem.GetProperty("amount").GetUInt16(),
+ };
+ section.UnlockCost.Add(item);
+ }
+
+ foreach (var jOmId in jSection.GetProperty("barrier_oms").EnumerateArray())
+ {
+ section.BarrierOmIds.Add(jOmId.GetUInt32());
+ }
+
+ asset.SectionById[section.EpitaphId] = section;
+
+ epiPath.Sections.Add(section);
+ }
+
+ var jGathering = jEpiPath.GetProperty("gathering");
+ foreach (var jGatherItem in jGathering.GetProperty("items").EnumerateArray())
+ {
+
+ }
+
+ if (!asset.Paths.ContainsKey(epiPath.DungeonId))
+ {
+ asset.Paths[epiPath.DungeonId] = epiPath;
+ }
+ }
+
+ foreach (var jBuff in document.RootElement.GetProperty("buffs").EnumerateArray())
+ {
+ var buff = new EpitaphBuff();
+ if (!Enum.TryParse(jBuff.GetProperty("type").GetString(), true, out buff.Type))
+ {
+ Logger.Error("Unable to parse Epitaph Road buff. Skipping");
+ continue;
+ }
+
+ buff.BuffId = jBuff.GetProperty("buff_id").GetUInt32();
+ buff.BuffEffect = jBuff.GetProperty("buff_effect").GetUInt32();
+ buff.Increment = jBuff.GetProperty("increment").GetUInt32();
+ buff.Name = jBuff.GetProperty("name").GetString();
+
+ if (!asset.BuffsByType.ContainsKey(buff.Type))
+ {
+ asset.BuffsByType[buff.Type] = new List();
+ }
+
+ asset.BuffsByType[buff.Type].Add(buff);
+ asset.BuffsById[buff.BuffId] = buff;
+ }
+
+ return asset;
+ }
+ }
+}
+
diff --git a/Arrowgene.Ddon.Shared/AssetReader/EpitaphTrialAssetDeserializer.cs b/Arrowgene.Ddon.Shared/AssetReader/EpitaphTrialAssetDeserializer.cs
new file mode 100644
index 000000000..744c93707
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/AssetReader/EpitaphTrialAssetDeserializer.cs
@@ -0,0 +1,249 @@
+using Arrowgene.Ddon.Shared.Asset;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Model;
+using Arrowgene.Ddon.Shared.Model.EpitaphRoad;
+using Arrowgene.Ddon.Shared.Model.Quest;
+using Arrowgene.Logging;
+using Microsoft.VisualBasic.FileIO;
+using System;
+using System.IO;
+using System.Text.Json;
+
+namespace Arrowgene.Ddon.Shared.AssetReader
+{
+ public class EpitaphTrialAssetDeserializer
+ {
+ private static readonly ILogger Logger = LogProvider.Logger(typeof(EpitaphTrialAssetDeserializer));
+
+ private EnemyAssetCommonDeserializer _CommonEnemyDeserializer;
+
+ public EpitaphTrialAssetDeserializer(EnemyAssetCommonDeserializer commonEnemyDeserializer)
+ {
+ _CommonEnemyDeserializer = commonEnemyDeserializer;
+ }
+
+ public bool LoadTrialsFromDirectory(string path, EpitaphTrialAsset trialAssets)
+ {
+ DirectoryInfo info = new DirectoryInfo(path);
+ if (!info.Exists)
+ {
+ Logger.Error($"The directory '{path}' does not exist");
+ return false;
+ }
+
+ Logger.Info($"Reading epitaph road trial files from {path}");
+ foreach (var file in info.EnumerateFiles())
+ {
+ Logger.Info($"{file.FullName}");
+
+ string json = File.ReadAllText(file.FullName);
+ JsonDocument document = JsonDocument.Parse(json);
+
+ var assetData = new EpitaphTrial();
+ if (!ParseTrial(assetData, document.RootElement))
+ {
+ Logger.Error($"Unable to parse '{file.FullName}'. Skipping.");
+ continue;
+ }
+
+ if (trialAssets.Trials.ContainsKey(assetData.OmLayoutId))
+ {
+ Logger.Error($"Multiple Epitaph trials assigned to LayoutId={assetData.OmLayoutId}. Skipping");
+ continue;
+ }
+ trialAssets.Trials[assetData.OmLayoutId] = assetData;
+ trialAssets.TrialsById[assetData.EpitaphId] = assetData;
+
+ foreach (var option in assetData.Options)
+ {
+ if (trialAssets.TrialsOptionById.ContainsKey(option.TrialId))
+ {
+ Logger.Error($"Multiple Epitaph trials have TrialId={option.TrialId}");
+ }
+ trialAssets.TrialsOptionById[option.TrialId] = option;
+ trialAssets.CostById[option.TrialId] = option.EntryCost;
+ }
+ trialAssets.CostById[assetData.EpitaphId] = assetData.UnlockCost;
+ }
+
+ return true;
+ }
+
+ public bool ParseTrial(EpitaphTrial assetData, JsonElement jTrial)
+ {
+ assetData.OmLayoutId = _CommonEnemyDeserializer.ParseStageId(jTrial.GetProperty("stage_id"));
+ assetData.EpitaphId = EpitahId.GenerateTrialId(assetData.OmLayoutId, 0);
+
+ foreach (var jItem in jTrial.GetProperty("unlock_cost").EnumerateArray())
+ {
+ var item = new CDataSoulOrdealItem()
+ {
+ ItemId = jItem.GetProperty("item_id").GetUInt32(),
+ Num = jItem.GetProperty("amount").GetUInt16(),
+ };
+ assetData.UnlockCost.Add(item);
+ }
+
+ uint i = 1;
+ foreach (var jOption in jTrial.GetProperty("options").EnumerateArray())
+ {
+ var trialOption = new EpitaphTrialOption()
+ {
+ TrialId = EpitahId.GenerateTrialId(assetData.OmLayoutId, i++),
+ TrialName = jOption.GetProperty("trial_name").GetString(),
+ OmLayoutId = assetData.OmLayoutId
+ };
+
+ foreach (var jItem in jOption.GetProperty("cost").EnumerateArray())
+ {
+ var item = new CDataSoulOrdealItem()
+ {
+ ItemId = jItem.GetProperty("item_id").GetUInt32(),
+ Num = jItem.GetProperty("amount").GetUInt16(),
+ };
+ trialOption.EntryCost.Add(item);
+ }
+
+ if (!_CommonEnemyDeserializer.ParseEnemyGroups(trialOption.EnemyGroups, jOption))
+ {
+ Logger.Error($"Unable to parse enemies for epitah trial {trialOption.TrialName}:{trialOption.TrialId}. Skipping.");
+ return false;
+ }
+
+ foreach (var jConstraint in jOption.GetProperty("constraints").EnumerateArray())
+ {
+ var constraint = ParseConstraint(jConstraint);
+ if (constraint == null)
+ {
+ Logger.Error($"Unable to parse constraint for epitah trial {trialOption.TrialName}:{trialOption.TrialId}. Skipping.");
+ return false;
+ }
+
+ trialOption.Objectives.Add(constraint.Type, constraint);
+ }
+
+ foreach (var enemyGroup in trialOption.EnemyGroups.Values)
+ {
+ trialOption.EnemyGroupsByStageId[enemyGroup.StageId] = enemyGroup;
+ }
+
+ foreach (var jItemReward in jOption.GetProperty("item_rewards").EnumerateArray())
+ {
+ var reward = new EpitaphItemReward();
+
+ reward.Type = SoulOrdealRewardType.Fixed;
+ if (jItemReward.TryGetProperty("type", out JsonElement jRewardType))
+ {
+ if (!Enum.TryParse(jRewardType.GetString(), true, out reward.Type))
+ {
+ Logger.Error($"Failed to parse reward type for epitah trial {trialOption.TrialName}:{trialOption.TrialId}. Skipping.");
+ return false;
+ }
+ }
+
+ reward.Rolls = 1;
+ if (jItemReward.TryGetProperty("rolls", out JsonElement jRolls))
+ {
+ reward.Rolls = jRolls.GetUInt32();
+ }
+
+ if (reward.Type != SoulOrdealRewardType.Pool)
+ {
+ var itemId = jItemReward.GetProperty("item_id").GetUInt32();
+ var amount = jItemReward.GetProperty("amount").GetUInt32();
+
+ var isHidden = false;
+ if (jItemReward.TryGetProperty("is_hidden", out JsonElement jIsHidden))
+ {
+ isHidden = jIsHidden.GetBoolean();
+ }
+
+ double chance = 1.0;
+ if (jItemReward.TryGetProperty("chance", out JsonElement jChance))
+ {
+ chance = jChance.GetDouble();
+ }
+
+ reward.Items.Add((itemId, amount, reward.Type, isHidden, chance));
+ }
+ else
+ {
+ foreach (var jPoolItem in jItemReward.GetProperty("items").EnumerateArray())
+ {
+ var itemId = jPoolItem.GetProperty("item_id").GetUInt32();
+ var amount = jPoolItem.GetProperty("amount").GetUInt32();
+
+ var type = SoulOrdealRewardType.Fixed;
+ if (jPoolItem.TryGetProperty("type", out JsonElement jPoolRewardType))
+ {
+ if (!Enum.TryParse(jPoolRewardType.GetString(), true, out type))
+ {
+ Logger.Error($"Failed to parse reward type for epitah trial {trialOption.TrialName}:{trialOption.TrialId}. Skipping.");
+ return false;
+ }
+ }
+
+ var isHidden = false;
+ if (jPoolItem.TryGetProperty("is_hidden", out JsonElement jIsHidden))
+ {
+ isHidden = jIsHidden.GetBoolean();
+ }
+
+ double chance = 1.0;
+ if (jPoolItem.TryGetProperty("chance", out JsonElement jChance))
+ {
+ chance = jChance.GetDouble();
+ }
+
+ reward.Items.Add((itemId, amount, type, isHidden, chance));
+ }
+ }
+
+ trialOption.ItemRewards.Add(reward);
+ }
+
+ assetData.Options.Add(trialOption);
+ }
+
+ return true;
+ }
+
+ private EpitaphObjective ParseConstraint(JsonElement jConstraint)
+ {
+ var result = new EpitaphObjective();
+
+ if (!Enum.TryParse(jConstraint.GetProperty("type").GetString(), true, out result.Type))
+ {
+ return null;
+ }
+
+ if (!Enum.TryParse(jConstraint.GetProperty("priority").GetString(), true, out result.Priority))
+ {
+ return null;
+ }
+
+ if (result.Type == SoulOrdealObjective.CompleteConditionsWithinTimeLimit ||
+ result.Type == SoulOrdealObjective.CannotBeAffectedByAbnormalStatus ||
+ result.Type == SoulOrdealObjective.DefeatEnemyCount)
+ {
+ result.Param1 = jConstraint.GetProperty("Param1").GetUInt32();
+ if (result.Type == SoulOrdealObjective.CompleteConditionsWithinTimeLimit)
+ {
+ result.Param2 = 1;
+ }
+ else
+ {
+ result.Param2 = 0;
+ }
+ }
+ else
+ {
+ result.Param1 = 1;
+ result.Param2 = 1;
+ }
+
+ return result;
+ }
+ }
+}
+
diff --git a/Arrowgene.Ddon.Shared/AssetReader/QuestAssetDeserializer.cs b/Arrowgene.Ddon.Shared/AssetReader/QuestAssetDeserializer.cs
index b71e479fc..489a05e09 100644
--- a/Arrowgene.Ddon.Shared/AssetReader/QuestAssetDeserializer.cs
+++ b/Arrowgene.Ddon.Shared/AssetReader/QuestAssetDeserializer.cs
@@ -8,7 +8,6 @@
using System.IO;
using System.Linq;
using System.Text.Json;
-using static Arrowgene.Ddon.Shared.Csv.GmdCsv;
namespace Arrowgene.Ddon.Shared.AssetReader
@@ -17,13 +16,13 @@ public class QuestAssetDeserializer
{
private static readonly ILogger Logger = LogProvider.Logger(typeof(QuestAssetDeserializer));
- private Dictionary namedParams;
- private QuestDropItemAsset questDrops;
+ private QuestDropItemAsset _QuestDrops;
+ private EnemyAssetCommonDeserializer _CommonEnemyDeserializer;
- public QuestAssetDeserializer(Dictionary namedParams, QuestDropItemAsset questDrops)
+ public QuestAssetDeserializer(EnemyAssetCommonDeserializer commonEnemyDeserializer, QuestDropItemAsset questDrops)
{
- this.namedParams = namedParams;
- this.questDrops = questDrops;
+ _QuestDrops = questDrops;
+ _CommonEnemyDeserializer = commonEnemyDeserializer;
}
public bool LoadQuestsFromDirectory(string path, QuestAsset questAssets)
@@ -93,7 +92,7 @@ private bool ParseQuest(QuestAssetData assetData, JsonElement jQuest)
assetData.StageId = StageId.Invalid;
if (questType == QuestType.Tutorial)
{
- assetData.StageId = ParseStageId(jQuest.GetProperty("stage_id"));
+ assetData.StageId = _CommonEnemyDeserializer.ParseStageId(jQuest.GetProperty("stage_id"));
}
assetData.NewsImageId = 0;
@@ -199,7 +198,7 @@ private bool ParseQuest(QuestAssetData assetData, JsonElement jQuest)
return false;
}
- if (!ParseEnemyGroups(assetData, jQuest))
+ if (!_CommonEnemyDeserializer.ParseEnemyGroups(assetData.EnemyGroups, jQuest))
{
Logger.Error($"Unable to create the quest '{assetData.QuestId}'. Skipping.");
return false;
@@ -436,7 +435,7 @@ private bool ParseBlocks(QuestProcess questProcess, JsonElement jBlocks)
if (jblock.TryGetProperty("stage_id", out JsonElement jStageId))
{
- questBlock.StageId = ParseStageId(jStageId);
+ questBlock.StageId = _CommonEnemyDeserializer.ParseStageId(jStageId);
}
questBlock.SubGroupId = 0;
@@ -591,7 +590,7 @@ private bool ParseBlocks(QuestProcess questProcess, JsonElement jBlocks)
{
NpcId = npcId,
MsgId = jblock.GetProperty("message_id").GetInt32(),
- StageId = ParseStageId(jblock.GetProperty("stage_id"))
+ StageId = _CommonEnemyDeserializer.ParseStageId(jblock.GetProperty("stage_id"))
});
}
break;
@@ -613,7 +612,7 @@ private bool ParseBlocks(QuestProcess questProcess, JsonElement jBlocks)
{
NpcId = npcId,
MsgId = jblock.GetProperty("message_id").GetInt32(),
- StageId = ParseStageId(jblock.GetProperty("stage_id"))
+ StageId = _CommonEnemyDeserializer.ParseStageId(jblock.GetProperty("stage_id"))
});
}
break;
@@ -703,7 +702,7 @@ private bool ParseBlocks(QuestProcess questProcess, JsonElement jBlocks)
{
NpcId = npcId,
MsgId = jblock.GetProperty("message_id").GetInt32(),
- StageId = ParseStageId(jblock.GetProperty("stage_id"))
+ StageId = _CommonEnemyDeserializer.ParseStageId(jblock.GetProperty("stage_id"))
});
foreach (var item in jblock.GetProperty("items").EnumerateArray())
@@ -738,7 +737,7 @@ private bool ParseBlocks(QuestProcess questProcess, JsonElement jBlocks)
if (jblock.TryGetProperty("jump_stage_id", out JsonElement jStageJumpId))
{
- questBlock.QuestEvent.JumpStageId = ParseStageId(jStageJumpId);
+ questBlock.QuestEvent.JumpStageId = _CommonEnemyDeserializer.ParseStageId(jStageJumpId);
}
if (jblock.TryGetProperty("start_pos_no", out JsonElement jStartPosNo))
@@ -833,25 +832,6 @@ private bool ParseBlocks(QuestProcess questProcess, JsonElement jBlocks)
return true;
}
- private StageId ParseStageId(JsonElement jStageId)
- {
- uint id = jStageId.GetProperty("id").GetUInt32();
-
- byte layerNo = 0;
- if (jStageId.TryGetProperty("layer_no", out JsonElement jLayerNo))
- {
- layerNo = jLayerNo.GetByte();
- }
-
- uint groupId = 0;
- if (jStageId.TryGetProperty("group_id", out JsonElement jGroupId))
- {
- groupId = jGroupId.GetUInt32();
- }
-
- return new StageId(id, layerNo, groupId);
- }
-
private void ParseAnnoucementSubtypes(QuestBlock questBlock, JsonElement jBlock)
{
var announcements = questBlock.Announcements;
@@ -1035,7 +1015,7 @@ private bool ParseServerActions(QuestAssetData assetData, JsonElement quest)
action.OmInstantValueAction = instantValueAction;
action.Key = jServerAction.GetProperty("key").GetUInt64();
action.Value = jServerAction.GetProperty("value").GetUInt32();
- action.StageId = ParseStageId(jServerAction.GetProperty("stage_id"));
+ action.StageId = _CommonEnemyDeserializer.ParseStageId(jServerAction.GetProperty("stage_id"));
}
assetData.ServerActions.Add(action);
@@ -1044,254 +1024,6 @@ private bool ParseServerActions(QuestAssetData assetData, JsonElement quest)
return true;
}
- private bool ParseEnemyGroups(QuestAssetData assetData, JsonElement quest)
- {
- if (!quest.TryGetProperty("enemy_groups", out JsonElement jGroups))
- {
- // No Enemy groups to parse
- return true;
- }
-
- uint groupId = 0;
- foreach (var jGroup in jGroups.EnumerateArray())
- {
- QuestEnemyGroup enemyGroup = new QuestEnemyGroup();
-
- if (!jGroup.TryGetProperty("stage_id", out JsonElement jStageId))
- {
- Logger.Info("Required stage_id field for enemy group not found.");
- return false;
- }
-
- enemyGroup.StageId = ParseStageId(jStageId);
-
- enemyGroup.SubGroupId = 0;
- if (jGroup.TryGetProperty("subgroup_id", out JsonElement jSubGroupId))
- {
- enemyGroup.SubGroupId = jSubGroupId.GetUInt32();
- }
-
- if (jGroup.TryGetProperty("starting_index", out JsonElement jStartingIndex))
- {
- enemyGroup.StartingIndex = jStartingIndex.GetUInt32();
- }
-
- enemyGroup.PlacementType = QuestEnemyPlacementType.Automatic;
- if (jGroup.TryGetProperty("placement_type", out JsonElement jPlacementType))
- {
- if (!Enum.TryParse(jPlacementType.GetString(), true, out QuestEnemyPlacementType placementType))
- {
- Logger.Error($"Invalid Quest Enemy Placement Type");
- return false;
- }
-
- enemyGroup.PlacementType = placementType;
- }
-
- foreach (var enemy in jGroup.GetProperty("enemies").EnumerateArray())
- {
- bool isBoss = false;
- if (enemy.TryGetProperty("is_boss", out JsonElement jIsBoss))
- {
- isBoss = jIsBoss.GetBoolean();
- }
-
- byte index = 0;
- if (enemyGroup.PlacementType == QuestEnemyPlacementType.Manual)
- {
- if (!enemy.TryGetProperty("index", out JsonElement jEnemyIndex))
- {
- Logger.Error($"Manual placed enemy group requires an index value. Unable to parse.");
- return false;
- }
- index = jEnemyIndex.GetByte();
- }
-
- bool isRequired = true;
- if (enemy.TryGetProperty("is_required", out JsonElement jIsRequired))
- {
- isRequired = jIsRequired.GetBoolean();
- }
-
- uint repopWaitSecond = 0;
- if (enemy.TryGetProperty("repop_wait_second", out JsonElement jRepopWaitSecond))
- {
- repopWaitSecond = jRepopWaitSecond.GetUInt32();
- }
-
- // Look for custom drops here
- bool customDropItems = false;
-
- // Setting default values in case a custom table is defined.
- DropsTable customTable = new()
- {
- Id = 0,
- MdlType = 0,
- };
-
- if (enemy.TryGetProperty("drop_items", out JsonElement itemsList))
- {
- customDropItems = true;
- var list = itemsList.EnumerateArray();
-
- foreach (var items in list)
- {
- GatheringItem dropItems = new()
- {
- ItemId = items.GetProperty("item_id").GetUInt32(),
- ItemNum = items.GetProperty("item_min").GetUInt32(),
- MaxItemNum = items.GetProperty("item_max").GetUInt32(),
- Quality = items.GetProperty("quality").GetUInt32(),
- IsHidden = false,
- DropChance = items.GetProperty("drop_chance").GetDouble()
- };
-
- customTable.Items.Add(dropItems);
- }
-
- }
-
- var questEnemy = new InstancedEnemy()
- {
- EnemyId = Convert.ToUInt32(enemy.GetProperty("enemy_id").GetString(), 16),
- Lv = enemy.GetProperty("level").GetUInt16(),
- Experience = enemy.GetProperty("exp").GetUInt32(),
- IsBossBGM = isBoss,
- IsBossGauge = isBoss,
- Scale = 100,
- EnemyTargetTypesId = (byte)(isRequired ? 4 : 1),
- Index = index,
- IsRequired = isRequired,
- RepopWaitSecond = repopWaitSecond,
- };
-
- ApplyOptionalEnemyKeys(enemy, questEnemy);
-
- // ApplyEnemyDropTable
- if (customDropItems)
- {
- questEnemy.DropsTable = customTable;
- }
- else
- {
- // Get default drops for this enemy id and level.
- DropsTable lootTable = questDrops.GetDropTable(questEnemy.EnemyId, questEnemy.Lv);
-
- questEnemy.DropsTable = lootTable;
- }
-
- enemyGroup.Enemies.Add(questEnemy);
- }
-
- assetData.EnemyGroups[groupId++] = enemyGroup;
- }
-
- return true;
- }
-
- private void ApplyOptionalEnemyKeys(JsonElement enemy, Enemy questEnemey)
- {
- if (enemy.TryGetProperty("pp", out JsonElement jPpAmount))
- {
- questEnemey.PPDrop = jPpAmount.GetUInt32();
- }
-
- if (enemy.TryGetProperty("named_enemy_params_id", out JsonElement jNamedEnemyParamsId))
- {
- questEnemey.NamedEnemyParams = this.namedParams.GetValueOrDefault(jNamedEnemyParamsId.GetUInt32(), NamedParam.DEFAULT_NAMED_PARAM);
- }
-
- if (enemy.TryGetProperty("raid_boss_id", out JsonElement jRaidBossId))
- {
- questEnemey.RaidBossId = jRaidBossId.GetUInt32();
- }
-
- if (enemy.TryGetProperty("scale", out JsonElement jScale))
- {
- questEnemey.Scale = jScale.GetUInt16();
- }
-
- if (enemy.TryGetProperty("hm_present_no", out JsonElement jHmPresetNo))
- {
- questEnemey.HmPresetNo = jHmPresetNo.GetUInt16();
- }
-
- if (enemy.TryGetProperty("start_think_tbl_no", out JsonElement jStartThinkTblNo))
- {
- questEnemey.StartThinkTblNo = jStartThinkTblNo.GetByte();
- }
-
- if (enemy.TryGetProperty("repop_num", out JsonElement jRepopNum))
- {
- questEnemey.RepopNum = jRepopNum.GetByte();
- }
-
- if (enemy.TryGetProperty("repop_count", out JsonElement jRepopCount))
- {
- questEnemey.RepopCount = jRepopCount.GetByte();
- }
-
- if (enemy.TryGetProperty("enemy_target_types_id", out JsonElement jEnemyTargetTypesId))
- {
- questEnemey.EnemyTargetTypesId = jEnemyTargetTypesId.GetByte();
- }
-
- if (enemy.TryGetProperty("montage_fix_no", out JsonElement jMontageFixNo))
- {
- questEnemey.MontageFixNo = jMontageFixNo.GetByte();
- }
-
- if (enemy.TryGetProperty("set_type", out JsonElement jSetType))
- {
- questEnemey.SetType = jSetType.GetByte();
- }
-
- if (enemy.TryGetProperty("infection_type", out JsonElement jInfectionType))
- {
- questEnemey.InfectionType = jInfectionType.GetByte();
- }
-
- if (enemy.TryGetProperty("is_boss_gauge", out JsonElement jIsBossGauge))
- {
- questEnemey.IsBossGauge = jIsBossGauge.GetBoolean();
- }
-
- if (enemy.TryGetProperty("is_boss_bgm", out JsonElement jIsBossBGM))
- {
- questEnemey.IsBossBGM = jIsBossBGM.GetBoolean();
- }
-
- if (enemy.TryGetProperty("is_manual_set", out JsonElement jIsManualSet))
- {
- questEnemey.IsManualSet = jIsManualSet.GetBoolean();
- }
-
- if (enemy.TryGetProperty("is_area_boss", out JsonElement jIsAreaBoss))
- {
- questEnemey.IsAreaBoss = jIsAreaBoss.GetBoolean();
- }
-
- if (enemy.TryGetProperty("blood_orbs", out JsonElement jBloodOrbs))
- {
- questEnemey.BloodOrbs = jBloodOrbs.GetUInt32();
- }
-
- if (enemy.TryGetProperty("high_orbs", out JsonElement jHighOrbs))
- {
- questEnemey.HighOrbs = jHighOrbs.GetUInt32();
- }
-
- if (enemy.TryGetProperty("spawn_time_start", out JsonElement jSpawnTimeStart))
- {
- questEnemey.SpawnTimeStart = jSpawnTimeStart.GetUInt32();
- }
-
- if (enemy.TryGetProperty("spawn_time_end", out JsonElement jSpawnTimeEnd))
- {
- questEnemey.SpawnTimeEnd = jSpawnTimeEnd.GetUInt32();
- }
- }
-
private bool ParseRawBlock(JsonElement jBlock, QuestBlock questBlock)
{
if (jBlock.TryGetProperty("check_commands", out JsonElement jCheckCommands))
diff --git a/Arrowgene.Ddon.Shared/AssetRepository.cs b/Arrowgene.Ddon.Shared/AssetRepository.cs
index a3e37b258..0955000b6 100644
--- a/Arrowgene.Ddon.Shared/AssetRepository.cs
+++ b/Arrowgene.Ddon.Shared/AssetRepository.cs
@@ -39,7 +39,6 @@ public class AssetRepository
public const string GPCourseInfoKey = "GpCourseInfo.json";
public const string SecretAbilityKey = "DefaultSecretAbilities.json";
public const string CostExpScalingInfoKey = "CostExpScalingInfo.json";
- public const string QuestAssestKey = "quests";
public const string JobValueShopKey = "JobValueShop.csv";
public const string StampBonusKey = "StampBonus.csv";
public const string SpecialShopKey = "SpecialShops.json";
@@ -49,6 +48,10 @@ public class AssetRepository
public const string RecruitmentBoardCategoryKey = "RecruitmentGroups.json";
public const string EventDropsKey = "EventDrops.json";
public const string BonusDungeonKey = "BonusDungeon.json";
+ public const string EpitaphRoadKey = "EpitaphRoad.json";
+
+ public const string QuestAssestKey = "quests";
+ public const string EpitaphAssestKey = "epitaph";
private static readonly ILogger Logger = LogProvider.Logger(typeof(AssetRepository));
@@ -97,6 +100,8 @@ public AssetRepository(string folder)
RecruitmentBoardCategoryAsset = new RecruitmentBoardCategoryAsset();
EventDropsAsset = new EventDropsAsset();
BonusDungeonAsset = new BonusDungeonAsset();
+ EpitaphRoadAssets = new EpitaphRoadAsset();
+ EpitaphTrialAssets = new EpitaphTrialAsset();
}
public List ClientErrorCodes { get; private set; }
@@ -129,6 +134,8 @@ public AssetRepository(string folder)
public RecruitmentBoardCategoryAsset RecruitmentBoardCategoryAsset { get; private set; }
public EventDropsAsset EventDropsAsset { get; private set; }
public BonusDungeonAsset BonusDungeonAsset { get; private set; }
+ public EpitaphRoadAsset EpitaphRoadAssets { get; private set; }
+ public EpitaphTrialAsset EpitaphTrialAssets { get; private set; }
public void Initialize()
{
@@ -161,9 +168,16 @@ public void Initialize()
RegisterAsset(value => RecruitmentBoardCategoryAsset = value, RecruitmentBoardCategoryKey, new RecruitmentBoardCategoryDeserializer());
RegisterAsset(value => EventDropsAsset = value, EventDropsKey, new EventDropAssetDeserializer());
RegisterAsset(value => BonusDungeonAsset = value, BonusDungeonKey, new BonusDungeonAssetDeserializer());
+ RegisterAsset(value => EpitaphRoadAssets = value, EpitaphRoadKey, new EpitaphRoadAssertDeserializer());
- var questAssetDeserializer = new QuestAssetDeserializer(this.NamedParamAsset, QuestDropItemAsset);
+ // This must be set before calling QuestAssertDeserializer and EpitaphTrialAssertDeserializer
+ var commonEnemyDeserializer = new EnemyAssetCommonDeserializer(this.NamedParamAsset);
+
+ var questAssetDeserializer = new QuestAssetDeserializer(commonEnemyDeserializer, QuestDropItemAsset);
questAssetDeserializer.LoadQuestsFromDirectory(Path.Combine(_directory.FullName, QuestAssestKey), QuestAssets);
+
+ var epitaphTrialDeserializer = new EpitaphTrialAssetDeserializer(commonEnemyDeserializer);
+ epitaphTrialDeserializer.LoadTrialsFromDirectory(Path.Combine(_directory.FullName, EpitaphAssestKey), EpitaphTrialAssets);
}
private void RegisterAsset(Action onLoadAction, string key, IAssetDeserializer readerWriter)
diff --git a/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs b/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs
index e3f18bc1d..1ed87b75a 100644
--- a/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs
+++ b/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs
@@ -328,6 +328,22 @@ static EntitySerializer()
Create(new CDataSubstoryQuestOrderList.Serializer());
Create(new CDataS2CQuestJoinLobbyQuestInfoNtcUnk0Unk1.Serializer());
Create(new CDataMobHuntQuestOrderList.Serializer());
+
+ Create(new CDataSeasonDungeonInfo.Serializer());
+ Create(new CDataSeasonDungeonSection.Serializer());
+ Create(new CDataSeasonDungeonUnk0.Serializer());
+ Create(new CDataSeasonDungeonBuffEffectParam.Serializer());
+ Create(new CDataSeasonDungeonUnk2.Serializer());
+ Create(new CDataSeasonDungeonBlockadeElement.Serializer());
+ Create(new CDataSoulOrdealElementParam.Serializer());
+ Create(new CDataSoulOrdealUnk0.Serializer());
+ Create(new CDataSoulOrdealUnk1.Serializer());
+ Create(new CDataSoulOrdealItemInfo.Serializer());
+ Create(new CDataSoulOrdealObjective.Serializer());
+ Create(new CDataSeasonDungeonBuffEffectReward.Serializer());
+ Create(new CDataSoulOrdealRewardItem.Serializer());
+ Create(new CDataSoulOrdealItem.Serializer());
+
Create(new CDataSituationObjective.Serializer());
Create(new CDataScreenShotCategory.Serializer());
Create(new CDataSetAcquirementParam.Serializer());
@@ -345,7 +361,7 @@ static EntitySerializer()
Create(new CDataStageAreaChangeResUnk1.Serializer());
Create(new CDataStageTicketDungeonCategory.Serializer());
Create(new CDataStageTicketDungeonCategoryInfo.Serializer());
- Create(new CDataStageTicketDungeonItem.Serializer());
+ Create(new CDataStageDungeonItem.Serializer());
Create(new CDataStageTicketDungeonItemInfo.Serializer());
Create(new CDataStatusInfoSerializer());
@@ -764,6 +780,21 @@ static EntitySerializer()
Create(new C2SSkillSetPresetAbilityNameReq.Serializer());
Create(new C2SSkillSetPresetAbilityListReq.Serializer());
+ Create(new C2S_SEASON_62_40_16_NTC.Serializer());
+ Create(new C2S_SEASON_DUNGEON_62_12_16_NTC.Serializer());
+ Create(new C2SSeasonDungeonGetIdFromNpcIdReq.Serializer());
+ Create(new C2SSeasonDungeonGetInfoReq.Serializer());
+ Create(new C2SSeasonDungeonGetExtendableBlockadeListFromNpcIdReq.Serializer());
+ Create(new C2SSeasonDungeonGetSoulOrdealListfromOmReq.Serializer());
+ Create(new C2SSeasonDungeonSoulOrdealReadyReq.Serializer());
+ Create(new C2SSeasonDungeonExecuteSoulOrdealReq.Serializer());
+ Create(new C2SSeasonDungeonGetSoulOrdealRewardListReq.Serializer());
+ Create(new C2SSeasonDungeonReceiveSoulOrdealRewardBuffReq.Serializer());
+ Create(new C2SSeasonDungeonReceiveSoulOrdealRewardReq.Serializer());
+ Create(new C2SSeasonDungeonGetBlockadeIdFromOmReq.Serializer());
+ Create(new C2SSeasonDungeonGetExRequiredItemReq.Serializer());
+ Create(new C2SSeasonDungeonDeliverItemForExReq.Serializer());
+
Create(new C2SSetShortcutReq.Serializer());
Create(new C2SShopBuyShopGoodsReq.Serializer());
Create(new C2SShopGetShopGoodsListReq.Serializer());
@@ -777,6 +808,8 @@ static EntitySerializer()
Create(new C2SStageUnisonAreaChangeGetRecruitmentStateReq.Serializer());
Create(new C2SStageUnisonAreaChangeReadyReq.Serializer());
Create(new C2SStageUnisonAreaChangeReadyCancelReq.Serializer());
+ Create(new C2SStageGetSpAreaChangeIdFromNpcIdReq.Serializer());
+ Create(new C2SStageGetSpAreaChangeInfoReq.Serializer());
Create(new C2SStampBonusCheckReq.Serializer());
Create(new C2SStampBonusGetListReq.Serializer());
@@ -1288,7 +1321,27 @@ static EntitySerializer()
Create(new S2CQuestGetEndContentsGroupRes.Serializer());
Create(new S2CQuestGetQuestScheduleInfoRes.Serializer());
- Create(new S2CSeason62_26_16Ntc.Serializer());
+ Create(new S2CSeasonDungeonExecuteSoulOrdealNtc.Serializer());
+ Create(new S2CSeasonDungeonEndSoulOrdealNtc.Serializer());
+ Create(new S2C_SEASON_62_16_16_NTC.Serializer());
+ Create(new S2C_SEASON_62_22_16_NTC.Serializer());
+ Create(new S2CSeasonDungeonSetOmStateNtc.Serializer());
+ Create(new S2C_SEASON_62_28_16_NTC.Serializer());
+ Create(new S2C_SEASON_62_39_16_NTC.Serializer());
+ Create(new S2CSeasonDungeonAreaBuffEffectNtc.Serializer());
+ Create(new S2CSeasonDungeonGetIdFromNpcIdRes.Serializer());
+ Create(new S2CSeasonDungeonGetInfoRes.Serializer());
+ Create(new S2CSeasonDungeonGetExtendableBlockadeListFromNpcIdRes.Serializer());
+ Create(new S2CSeasonDungeonGetSoulOrdealListfromOmRes.Serializer());
+ Create(new S2CSeasonDungeonSoulOrdealReadyRes.Serializer());
+ Create(new S2CSeasonDungeonGroupReadyNtc.Serializer());
+ Create(new S2CSeasonDungeonExecuteSoulOrdealRes.Serializer());
+ Create(new S2CSeasonDungeonGetSoulOrdealRewardListRes.Serializer());
+ Create(new S2CSeasonDungeonReceiveSoulOrdealRewardBuffRes.Serializer());
+ Create(new S2CSeasonDungeonReceiveSoulOrdealRewardRes.Serializer());
+ Create(new S2CSeasonDungeonGetBlockadeIdFromOmRes.Serializer());
+ Create(new S2CSeasonDungeonGetExRequiredItemRes.Serializer());
+ Create(new S2CSeasonDungeonDeliverItemForExRes.Serializer());
Create(new S2CServerGameTimeGetBaseInfoRes.Serializer());
Create(new S2CServerGetRealTimeRes.Serializer());
@@ -1349,8 +1402,6 @@ static EntitySerializer()
Create(new S2CSkillSetPresetAbilityNameRes.Serializer());
Create(new S2CSkillSetPresetAbilityListRes.Serializer());
- Create(new S2C_SEASON_62_38_16_NTC.Serializer());
-
Create(new S2CSetCommunicationShortcutRes.Serializer());
Create(new S2CSetShortcutRes.Serializer());
Create(new S2CShopBuyShopGoodsRes.Serializer());
@@ -1363,9 +1414,11 @@ static EntitySerializer()
Create(new S2CStageUnisonAreaChangeBeginRecruitmentRes.Serializer());
Create(new S2CStageUnisonAreaChangeGetRecruitmentStateRes.Serializer());
Create(new S2CStageUnisonAreaChangeReadyRes.Serializer());
- Create(new S2CStageTicketDungeonStartNtc.Serializer());
+ Create(new S2CStageDungeonStartNtc.Serializer());
Create(new S2CStageUnisonAreaChangeReadyCancelRes.Serializer());
Create(new S2CStageUnisonAreaReadyCancelNtc.Serializer());
+ Create(new S2CStageGetSpAreaChangeIdFromNpcIdRes.Serializer());
+ Create(new S2CStageGetSpAreaChangeInfoRes.Serializer());
Create(new S2CInstanceTraningRoomGetEnemyListRes.Serializer());
Create(new S2CInstanceTraningRoomSetEnemyRes.Serializer());
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonDeliverItemForExReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonDeliverItemForExReq.cs
new file mode 100644
index 000000000..2bf17d804
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonDeliverItemForExReq.cs
@@ -0,0 +1,41 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Network;
+using System.Collections.Generic;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class C2SSeasonDungeonDeliverItemForExReq : IPacketStructure
+ {
+ public C2SSeasonDungeonDeliverItemForExReq()
+ {
+ ItemList = new List();
+ }
+
+ public uint EpitaphId { get; set; }
+ public List ItemList { get; set; }
+ public bool Unk0 { get; set; }
+
+ public PacketId Id => PacketId.C2S_SEASON_DUNGEON_DELIVER_ITEM_FOR_EX_REQ;
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, C2SSeasonDungeonDeliverItemForExReq obj)
+ {
+ WriteUInt32(buffer, obj.EpitaphId);
+ WriteEntityList(buffer, obj.ItemList);
+ WriteBool(buffer, obj.Unk0);
+ }
+
+ public override C2SSeasonDungeonDeliverItemForExReq Read(IBuffer buffer)
+ {
+ C2SSeasonDungeonDeliverItemForExReq obj = new C2SSeasonDungeonDeliverItemForExReq();
+ obj.EpitaphId = ReadUInt32(buffer);
+ obj.ItemList = ReadEntityList(buffer);
+ obj.Unk0 = ReadBool(buffer);
+
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonExecuteSoulOrdealReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonExecuteSoulOrdealReq.cs
new file mode 100644
index 000000000..37ea87efc
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonExecuteSoulOrdealReq.cs
@@ -0,0 +1,46 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Model;
+using Arrowgene.Ddon.Shared.Network;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class C2SSeasonDungeonExecuteSoulOrdealReq : IPacketStructure
+ {
+ public C2SSeasonDungeonExecuteSoulOrdealReq()
+ {
+ TrialCost = new List();
+ LayoutId = new CDataStageLayoutId();
+ }
+
+ public PacketId Id => PacketId.C2S_SEASON_DUNGEON_EXECUTE_SOUL_ORDEAL_REQ;
+
+ public uint TrialId { get; set; }
+ public List TrialCost { get; set; }
+ public CDataStageLayoutId LayoutId {get; set;}
+ public uint Unk1 { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, C2SSeasonDungeonExecuteSoulOrdealReq obj)
+ {
+ WriteUInt32(buffer, obj.TrialId);
+ WriteEntityList(buffer, obj.TrialCost);
+ WriteEntity(buffer, obj.LayoutId);
+ WriteUInt32(buffer, obj.Unk1);
+ }
+
+ public override C2SSeasonDungeonExecuteSoulOrdealReq Read(IBuffer buffer)
+ {
+ C2SSeasonDungeonExecuteSoulOrdealReq obj = new C2SSeasonDungeonExecuteSoulOrdealReq();
+ obj.TrialId = ReadUInt32(buffer);
+ obj.TrialCost = ReadEntityList(buffer);
+ obj.LayoutId = ReadEntity(buffer);
+ obj.Unk1 = ReadUInt32(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonGetBlockadeIdFromOmReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonGetBlockadeIdFromOmReq.cs
new file mode 100644
index 000000000..5d1d5d8d6
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonGetBlockadeIdFromOmReq.cs
@@ -0,0 +1,37 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Model;
+using Arrowgene.Ddon.Shared.Network;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class C2SSeasonDungeonGetBlockadeIdFromOmReq : IPacketStructure
+ {
+ public C2SSeasonDungeonGetBlockadeIdFromOmReq()
+ {
+ LayoutId = new CDataStageLayoutId();
+ }
+
+ public PacketId Id => PacketId.C2S_SEASON_DUNGEON_GET_BLOCKADE_ID_FROM_OM_REQ;
+
+ public CDataStageLayoutId LayoutId { get; set; }
+ public uint Unk0 { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, C2SSeasonDungeonGetBlockadeIdFromOmReq obj)
+ {
+ WriteEntity(buffer, obj.LayoutId);
+ WriteUInt32(buffer, obj.Unk0);
+ }
+
+ public override C2SSeasonDungeonGetBlockadeIdFromOmReq Read(IBuffer buffer)
+ {
+ C2SSeasonDungeonGetBlockadeIdFromOmReq obj = new C2SSeasonDungeonGetBlockadeIdFromOmReq();
+ obj.LayoutId = ReadEntity(buffer);
+ obj.Unk0 = ReadUInt32(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonGetExRequiredItemReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonGetExRequiredItemReq.cs
new file mode 100644
index 000000000..7d36e9552
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonGetExRequiredItemReq.cs
@@ -0,0 +1,31 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Network;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class C2SSeasonDungeonGetExRequiredItemReq : IPacketStructure
+ {
+ public C2SSeasonDungeonGetExRequiredItemReq()
+ {
+ }
+
+ public PacketId Id => PacketId.C2S_SEASON_DUNGEON_GET_EX_REQUIRED_ITEM_REQ;
+
+ public uint EpitaphId { get; set; } // Value returned by S2CSeasonDungeonGetBlockadeIdFromOmRes
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, C2SSeasonDungeonGetExRequiredItemReq obj)
+ {
+ WriteUInt32(buffer, obj.EpitaphId);
+ }
+
+ public override C2SSeasonDungeonGetExRequiredItemReq Read(IBuffer buffer)
+ {
+ C2SSeasonDungeonGetExRequiredItemReq obj = new C2SSeasonDungeonGetExRequiredItemReq();
+ obj.EpitaphId = ReadUInt32(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonGetExtendableBlockadeListFromNpcIdReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonGetExtendableBlockadeListFromNpcIdReq.cs
new file mode 100644
index 000000000..4352ac4d8
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonGetExtendableBlockadeListFromNpcIdReq.cs
@@ -0,0 +1,28 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Model;
+using Arrowgene.Ddon.Shared.Network;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class C2SSeasonDungeonGetExtendableBlockadeListFromNpcIdReq : IPacketStructure
+ {
+ public PacketId Id => PacketId.C2S_SEASON_DUNGEON_GET_EXTENDABLE_BLOCKADE_LIST_FROM_NPC_ID_REQ;
+
+ public NpcId NpcId { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, C2SSeasonDungeonGetExtendableBlockadeListFromNpcIdReq obj)
+ {
+ WriteUInt32(buffer, (uint)obj.NpcId);
+ }
+
+ public override C2SSeasonDungeonGetExtendableBlockadeListFromNpcIdReq Read(IBuffer buffer)
+ {
+ C2SSeasonDungeonGetExtendableBlockadeListFromNpcIdReq obj = new C2SSeasonDungeonGetExtendableBlockadeListFromNpcIdReq();
+ obj.NpcId = (NpcId)ReadUInt32(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonGetIdFromNpcIdReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonGetIdFromNpcIdReq.cs
new file mode 100644
index 000000000..63fb77261
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonGetIdFromNpcIdReq.cs
@@ -0,0 +1,28 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Model;
+using Arrowgene.Ddon.Shared.Network;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class C2SSeasonDungeonGetIdFromNpcIdReq : IPacketStructure
+ {
+ public PacketId Id => PacketId.C2S_SEASON_DUNGEON_GET_ID_FROM_NPC_ID_REQ;
+
+ public NpcId NpcId { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, C2SSeasonDungeonGetIdFromNpcIdReq obj)
+ {
+ WriteUInt32(buffer, (uint) obj.NpcId);
+ }
+
+ public override C2SSeasonDungeonGetIdFromNpcIdReq Read(IBuffer buffer)
+ {
+ C2SSeasonDungeonGetIdFromNpcIdReq obj = new C2SSeasonDungeonGetIdFromNpcIdReq();
+ obj.NpcId = (NpcId) ReadUInt32(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonGetInfoReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonGetInfoReq.cs
new file mode 100644
index 000000000..563bade43
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonGetInfoReq.cs
@@ -0,0 +1,28 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Model;
+using Arrowgene.Ddon.Shared.Network;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class C2SSeasonDungeonGetInfoReq : IPacketStructure
+ {
+ public PacketId Id => PacketId.C2S_SEASON_DUNGEON_GET_INFO_REQ;
+
+ public uint DungeonId { get; set; } // Value returned from S2C_SEASON_DUNGEON_GET_ID_FROM_NPC_ID_RES
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, C2SSeasonDungeonGetInfoReq obj)
+ {
+ WriteUInt32(buffer, obj.DungeonId);
+ }
+
+ public override C2SSeasonDungeonGetInfoReq Read(IBuffer buffer)
+ {
+ C2SSeasonDungeonGetInfoReq obj = new C2SSeasonDungeonGetInfoReq();
+ obj.DungeonId = ReadUInt32(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeason62_26_16Ntc.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonGetSoulOrdealListfromOmReq.cs
similarity index 50%
rename from Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeason62_26_16Ntc.cs
rename to Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonGetSoulOrdealListfromOmReq.cs
index 31755397c..29e096e27 100644
--- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeason62_26_16Ntc.cs
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonGetSoulOrdealListfromOmReq.cs
@@ -1,37 +1,37 @@
using Arrowgene.Buffers;
using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Model;
using Arrowgene.Ddon.Shared.Network;
namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
{
- public class S2CSeason62_26_16Ntc : IPacketStructure
+ public class C2SSeasonDungeonGetSoulOrdealListfromOmReq : IPacketStructure
{
- public PacketId Id => PacketId.S2C_SEASON_62_26_16_NTC;
-
- public S2CSeason62_26_16Ntc()
+ public C2SSeasonDungeonGetSoulOrdealListfromOmReq()
{
StageLayoutId = new CDataStageLayoutId();
}
+ public PacketId Id => PacketId.C2S_SEASON_DUNGEON_GET_SOUL_ORDEAL_LIST_FROM_OM_REQ;
+
public CDataStageLayoutId StageLayoutId { get; set; }
public uint Unk0 { get; set; }
- public byte Unk1 { get; set; }
- public class Serializer : PacketEntitySerializer
+ public class Serializer : PacketEntitySerializer
{
- public override void Write(IBuffer buffer, S2CSeason62_26_16Ntc obj)
+
+
+ public override void Write(IBuffer buffer, C2SSeasonDungeonGetSoulOrdealListfromOmReq obj)
{
WriteEntity(buffer, obj.StageLayoutId);
WriteUInt32(buffer, obj.Unk0);
- WriteByte(buffer, obj.Unk1);
}
- public override S2CSeason62_26_16Ntc Read(IBuffer buffer)
+ public override C2SSeasonDungeonGetSoulOrdealListfromOmReq Read(IBuffer buffer)
{
- S2CSeason62_26_16Ntc obj = new S2CSeason62_26_16Ntc();
+ C2SSeasonDungeonGetSoulOrdealListfromOmReq obj = new C2SSeasonDungeonGetSoulOrdealListfromOmReq();
obj.StageLayoutId = ReadEntity(buffer);
obj.Unk0 = ReadUInt32(buffer);
- obj.Unk1 = ReadByte(buffer);
return obj;
}
}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonGetSoulOrdealRewardListReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonGetSoulOrdealRewardListReq.cs
new file mode 100644
index 000000000..000e2c48b
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonGetSoulOrdealRewardListReq.cs
@@ -0,0 +1,37 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Model;
+using Arrowgene.Ddon.Shared.Network;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class C2SSeasonDungeonGetSoulOrdealRewardListReq : IPacketStructure
+ {
+ public C2SSeasonDungeonGetSoulOrdealRewardListReq()
+ {
+ LayoutId = new CDataStageLayoutId();
+ }
+
+ public PacketId Id => PacketId.C2S_SEASON_DUNGEON_GET_SOUL_ORDEAL_REWARD_LIST_REQ;
+
+ public CDataStageLayoutId LayoutId { get; set; }
+ public uint Unk0 { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, C2SSeasonDungeonGetSoulOrdealRewardListReq obj)
+ {
+ WriteEntity(buffer, obj.LayoutId);
+ WriteUInt32(buffer, obj.Unk0);
+ }
+
+ public override C2SSeasonDungeonGetSoulOrdealRewardListReq Read(IBuffer buffer)
+ {
+ C2SSeasonDungeonGetSoulOrdealRewardListReq obj = new C2SSeasonDungeonGetSoulOrdealRewardListReq();
+ obj.LayoutId = ReadEntity(buffer);
+ obj.Unk0 = ReadUInt32(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonReceiveSoulOrdealRewardBuffReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonReceiveSoulOrdealRewardBuffReq.cs
new file mode 100644
index 000000000..5f24a16df
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonReceiveSoulOrdealRewardBuffReq.cs
@@ -0,0 +1,43 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Model;
+using Arrowgene.Ddon.Shared.Network;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class C2SSeasonDungeonReceiveSoulOrdealRewardBuffReq : IPacketStructure
+ {
+ public C2SSeasonDungeonReceiveSoulOrdealRewardBuffReq()
+ {
+ LayoutId = new CDataStageLayoutId();
+ }
+
+ public PacketId Id => PacketId.C2S_SEASON_DUNGEON_RECEIVE_SOUL_ORDEAL_REWARD_BUFF_REQ;
+
+ public CDataStageLayoutId LayoutId { get; set; } // Of the Trial OM
+ public uint Unk0 { get; set; }
+ public uint BuffId { get; set; } // Seems to correspond to unk1 of the buff
+ public uint Unk2 { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, C2SSeasonDungeonReceiveSoulOrdealRewardBuffReq obj)
+ {
+ WriteEntity(buffer, obj.LayoutId);
+ WriteUInt32(buffer, obj.Unk0);
+ WriteUInt32(buffer, obj.BuffId);
+ WriteUInt32(buffer, obj.Unk2);
+ }
+
+ public override C2SSeasonDungeonReceiveSoulOrdealRewardBuffReq Read(IBuffer buffer)
+ {
+ C2SSeasonDungeonReceiveSoulOrdealRewardBuffReq obj = new C2SSeasonDungeonReceiveSoulOrdealRewardBuffReq();
+ obj.LayoutId = ReadEntity(buffer);
+ obj.Unk0 = ReadUInt32(buffer);
+ obj.BuffId = ReadUInt32(buffer);
+ obj.Unk2 = ReadUInt32(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonReceiveSoulOrdealRewardReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonReceiveSoulOrdealRewardReq.cs
new file mode 100644
index 000000000..077afa558
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonReceiveSoulOrdealRewardReq.cs
@@ -0,0 +1,42 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Model;
+using Arrowgene.Ddon.Shared.Network;
+using System.Collections.Generic;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class C2SSeasonDungeonReceiveSoulOrdealRewardReq : IPacketStructure
+ {
+ public C2SSeasonDungeonReceiveSoulOrdealRewardReq()
+ {
+ StageId = new CDataStageLayoutId();
+ RewardList = new List();
+ }
+
+ public PacketId Id => PacketId.C2S_SEASON_DUNGEON_RECEIVE_SOUL_ORDEAL_REWARD_REQ;
+
+ public CDataStageLayoutId StageId { get; set; }
+ public uint Unk0 { get; set; }
+ public List RewardList { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, C2SSeasonDungeonReceiveSoulOrdealRewardReq obj)
+ {
+ WriteEntity(buffer, obj.StageId);
+ WriteUInt32(buffer, obj.Unk0);
+ WriteEntityList(buffer, obj.RewardList);
+ }
+
+ public override C2SSeasonDungeonReceiveSoulOrdealRewardReq Read(IBuffer buffer)
+ {
+ C2SSeasonDungeonReceiveSoulOrdealRewardReq obj = new C2SSeasonDungeonReceiveSoulOrdealRewardReq();
+ obj.StageId = ReadEntity(buffer);
+ obj.Unk0 = ReadUInt32(buffer);
+ obj.RewardList = ReadEntityList(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonSoulOrdealReadyReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonSoulOrdealReadyReq.cs
new file mode 100644
index 000000000..781d085a1
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SSeasonDungeonSoulOrdealReadyReq.cs
@@ -0,0 +1,39 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Model;
+using Arrowgene.Ddon.Shared.Network;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class C2SSeasonDungeonSoulOrdealReadyReq : IPacketStructure
+ {
+ public C2SSeasonDungeonSoulOrdealReadyReq()
+ {
+ }
+
+ public PacketId Id => PacketId.C2S_SEASON_DUNGEON_SOUL_ORDEAL_READY_REQ;
+
+ public uint TrialId { get; set; }
+ public CDataStageLayoutId StageLayoutId { get; set; }
+ public uint Unk1 { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, C2SSeasonDungeonSoulOrdealReadyReq obj)
+ {
+ WriteUInt32(buffer, obj.TrialId);
+ WriteEntity(buffer, obj.StageLayoutId);
+ WriteUInt32(buffer, obj.Unk1);
+ }
+
+ public override C2SSeasonDungeonSoulOrdealReadyReq Read(IBuffer buffer)
+ {
+ C2SSeasonDungeonSoulOrdealReadyReq obj = new C2SSeasonDungeonSoulOrdealReadyReq();
+ obj.TrialId = ReadUInt32(buffer);
+ obj.StageLayoutId = ReadEntity(buffer);
+ obj.Unk1 = ReadUInt32(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SStageGetSpAreaChangeIdFromNpcIdReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SStageGetSpAreaChangeIdFromNpcIdReq.cs
new file mode 100644
index 000000000..7937ee839
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SStageGetSpAreaChangeIdFromNpcIdReq.cs
@@ -0,0 +1,32 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Model;
+using Arrowgene.Ddon.Shared.Network;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class C2SStageGetSpAreaChangeIdFromNpcIdReq : IPacketStructure
+ {
+ public PacketId Id => PacketId.C2S_STAGE_GET_SP_AREA_CHANGE_ID_FROM_NPC_ID_REQ;
+
+ public C2SStageGetSpAreaChangeIdFromNpcIdReq()
+ {
+ }
+
+ public NpcId NpcId {get; set;}
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, C2SStageGetSpAreaChangeIdFromNpcIdReq obj)
+ {
+ WriteUInt32(buffer, (uint) obj.NpcId);
+ }
+
+ public override C2SStageGetSpAreaChangeIdFromNpcIdReq Read(IBuffer buffer)
+ {
+ C2SStageGetSpAreaChangeIdFromNpcIdReq obj = new C2SStageGetSpAreaChangeIdFromNpcIdReq();
+ obj.NpcId = (NpcId)ReadUInt32(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SStageGetSpAreaChangeInfoReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SStageGetSpAreaChangeInfoReq.cs
new file mode 100644
index 000000000..1f54d7f5a
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SStageGetSpAreaChangeInfoReq.cs
@@ -0,0 +1,32 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Model;
+using Arrowgene.Ddon.Shared.Network;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class C2SStageGetSpAreaChangeInfoReq : IPacketStructure
+ {
+ public PacketId Id => PacketId.C2S_STAGE_GET_SP_AREA_CHANGE_INFO_REQ;
+
+ public C2SStageGetSpAreaChangeInfoReq()
+ {
+ }
+
+ public uint StageId { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, C2SStageGetSpAreaChangeInfoReq obj)
+ {
+ WriteUInt32(buffer, obj.StageId);
+ }
+
+ public override C2SStageGetSpAreaChangeInfoReq Read(IBuffer buffer)
+ {
+ C2SStageGetSpAreaChangeInfoReq obj = new C2SStageGetSpAreaChangeInfoReq();
+ obj.StageId = ReadUInt32(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SStageUnisonAreaChangeBeginRecruitmentReq.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SStageUnisonAreaChangeBeginRecruitmentReq.cs
index 70b4c69ca..502df17b1 100644
--- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SStageUnisonAreaChangeBeginRecruitmentReq.cs
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2SStageUnisonAreaChangeBeginRecruitmentReq.cs
@@ -15,27 +15,27 @@ public C2SStageUnisonAreaChangeBeginRecruitmentReq()
Unk2String = string.Empty;
}
- public uint Unk0 { get; set; }
+ public uint DungeonId { get; set; }
public List EntryFeeList { get; set; }
- public uint Unk1 { get; set; }
+ public uint EntranceId { get; set; }
public string Unk2String { get; set; }
public class Serializer : PacketEntitySerializer
{
public override void Write(IBuffer buffer, C2SStageUnisonAreaChangeBeginRecruitmentReq obj)
{
- WriteUInt32(buffer, obj.Unk0);
+ WriteUInt32(buffer, obj.DungeonId);
WriteEntityList(buffer, obj.EntryFeeList);
- WriteUInt32(buffer, obj.Unk1);
+ WriteUInt32(buffer, obj.EntranceId);
WriteMtString(buffer, obj.Unk2String);
}
public override C2SStageUnisonAreaChangeBeginRecruitmentReq Read(IBuffer buffer)
{
C2SStageUnisonAreaChangeBeginRecruitmentReq obj = new C2SStageUnisonAreaChangeBeginRecruitmentReq();
- obj.Unk0 = ReadUInt32(buffer);
+ obj.DungeonId = ReadUInt32(buffer);
obj.EntryFeeList = ReadEntityList(buffer);
- obj.Unk1 = ReadUInt32(buffer);
+ obj.EntranceId = ReadUInt32(buffer);
obj.Unk2String = ReadMtString(buffer);
return obj;
}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2S_SEASON_62_40_16_NTC.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2S_SEASON_62_40_16_NTC.cs
new file mode 100644
index 000000000..187624b47
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2S_SEASON_62_40_16_NTC.cs
@@ -0,0 +1,36 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Network;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class C2S_SEASON_62_40_16_NTC : IPacketStructure
+ {
+ ///
+ /// Packet is sent inside the lobby area of Epitaph.
+ /// Seems to be related to things like "Memory of Megadosys: War God Space"
+ /// and "Memory of Urteca: War God Space".
+ ///
+ public PacketId Id => PacketId.C2S_SEASON_62_40_16_NTC;
+
+ public CDataStageLayoutId LayoutId { get; set; }
+ public uint Unk0 { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, C2S_SEASON_62_40_16_NTC obj)
+ {
+ WriteEntity(buffer, obj.LayoutId);
+ WriteUInt32(buffer, obj.Unk0);
+ }
+
+ public override C2S_SEASON_62_40_16_NTC Read(IBuffer buffer)
+ {
+ C2S_SEASON_62_40_16_NTC obj = new C2S_SEASON_62_40_16_NTC();
+ obj.LayoutId = ReadEntity(buffer);
+ obj.Unk0 = ReadUInt32(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2S_SEASON_DUNGEON_62_12_16_NTC.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2S_SEASON_DUNGEON_62_12_16_NTC.cs
new file mode 100644
index 000000000..1fe6e7d1d
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/C2S_SEASON_DUNGEON_62_12_16_NTC.cs
@@ -0,0 +1,31 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Network;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class C2S_SEASON_DUNGEON_62_12_16_NTC : IPacketStructure
+ {
+ public PacketId Id => PacketId.C2S_SEASON_DUNGEON_62_12_16_NTC;
+
+ public CDataStageLayoutId LayoutId { get; set; }
+ public uint Unk0 { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, C2S_SEASON_DUNGEON_62_12_16_NTC obj)
+ {
+ WriteEntity(buffer, obj.LayoutId);
+ WriteUInt32(buffer, obj.Unk0);
+ }
+
+ public override C2S_SEASON_DUNGEON_62_12_16_NTC Read(IBuffer buffer)
+ {
+ C2S_SEASON_DUNGEON_62_12_16_NTC obj = new C2S_SEASON_DUNGEON_62_12_16_NTC();
+ obj.LayoutId = ReadEntity(buffer);
+ obj.Unk0 = ReadUInt32(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonAreaBuffEffectNtc.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonAreaBuffEffectNtc.cs
new file mode 100644
index 000000000..7d5eb090f
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonAreaBuffEffectNtc.cs
@@ -0,0 +1,34 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Network;
+using System.Collections.Generic;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class S2CSeasonDungeonAreaBuffEffectNtc : IPacketStructure
+ {
+ public PacketId Id => PacketId.S2C_SEASON_DUNGEON_AREA_BUFFS_NTC;
+
+ public S2CSeasonDungeonAreaBuffEffectNtc()
+ {
+ BuffEffectParamList = new List();
+ }
+
+ public List BuffEffectParamList { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, S2CSeasonDungeonAreaBuffEffectNtc obj)
+ {
+ WriteEntityList(buffer, obj.BuffEffectParamList);
+ }
+
+ public override S2CSeasonDungeonAreaBuffEffectNtc Read(IBuffer buffer)
+ {
+ S2CSeasonDungeonAreaBuffEffectNtc obj = new S2CSeasonDungeonAreaBuffEffectNtc();
+ obj.BuffEffectParamList = ReadEntityList(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonDeliverItemForExRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonDeliverItemForExRes.cs
new file mode 100644
index 000000000..8b22be489
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonDeliverItemForExRes.cs
@@ -0,0 +1,30 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Network;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class S2CSeasonDungeonDeliverItemForExRes : ServerResponse
+ {
+ public S2CSeasonDungeonDeliverItemForExRes()
+ {
+ }
+
+ public override PacketId Id => PacketId.S2C_SEASON_DUNGEON_DELIVER_ITEM_FOR_EX_RES;
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, S2CSeasonDungeonDeliverItemForExRes obj)
+ {
+ WriteServerResponse(buffer, obj);
+ }
+
+ public override S2CSeasonDungeonDeliverItemForExRes Read(IBuffer buffer)
+ {
+ S2CSeasonDungeonDeliverItemForExRes obj = new S2CSeasonDungeonDeliverItemForExRes();
+ ReadServerResponse(buffer, obj);
+ return obj;
+ }
+ }
+ }
+}
+
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonEndSoulOrdealNtc.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonEndSoulOrdealNtc.cs
new file mode 100644
index 000000000..1c91226dd
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonEndSoulOrdealNtc.cs
@@ -0,0 +1,48 @@
+using System.Collections.Generic;
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Model.EpitaphRoad;
+using Arrowgene.Ddon.Shared.Network;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class S2CSeasonDungeonEndSoulOrdealNtc : IPacketStructure
+ {
+ public PacketId Id => PacketId.S2C_SEASON_DUNGEON_END_SOUL_ORDEAL_NTC;
+
+ public S2CSeasonDungeonEndSoulOrdealNtc()
+ {
+ LayoutId = new CDataStageLayoutId();
+ }
+
+ public SoulOrdealEndState EndState { get; set; }
+ public CDataStageLayoutId LayoutId { get; set; }
+ public uint Unk1 { get; set; }
+ public SoulOrdealOmState EpitaphState { get; set; }
+ public uint Unk3 { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, S2CSeasonDungeonEndSoulOrdealNtc obj)
+ {
+ WriteByte(buffer, (byte) obj.EndState);
+ WriteEntity(buffer, obj.LayoutId);
+ WriteUInt32(buffer, obj.Unk1);
+ WriteByte(buffer, (byte) obj.EpitaphState);
+ WriteUInt32(buffer, obj.Unk3);
+
+ }
+
+ public override S2CSeasonDungeonEndSoulOrdealNtc Read(IBuffer buffer)
+ {
+ S2CSeasonDungeonEndSoulOrdealNtc obj = new S2CSeasonDungeonEndSoulOrdealNtc();
+ obj.EndState = (SoulOrdealEndState) ReadByte(buffer);
+ obj.LayoutId = ReadEntity(buffer);
+ obj.Unk1 = ReadUInt32(buffer);
+ obj.EpitaphState = (SoulOrdealOmState) ReadByte(buffer);
+ obj.Unk3 = ReadUInt32(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonExecuteSoulOrdealNtc.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonExecuteSoulOrdealNtc.cs
new file mode 100644
index 000000000..d3092d294
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonExecuteSoulOrdealNtc.cs
@@ -0,0 +1,41 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Network;
+using System.Collections.Generic;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class S2CSeasonDungeonExecuteSoulOrdealNtc : IPacketStructure
+ {
+ public S2CSeasonDungeonExecuteSoulOrdealNtc()
+ {
+ TrialName = string.Empty;
+ ObjectiveList = new List();
+ }
+
+ public PacketId Id => PacketId.S2C_SEASON_DUNGEON_EXECUTE_SOUL_ORDEAL_NTC;
+
+ public string TrialName { get; set; }
+ public uint TrialId { get; set; }
+ public List ObjectiveList { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, S2CSeasonDungeonExecuteSoulOrdealNtc obj)
+ {
+ WriteMtString(buffer, obj.TrialName);
+ WriteUInt32(buffer, obj.TrialId);
+ WriteEntityList(buffer, obj.ObjectiveList);
+ }
+
+ public override S2CSeasonDungeonExecuteSoulOrdealNtc Read(IBuffer buffer)
+ {
+ S2CSeasonDungeonExecuteSoulOrdealNtc obj = new S2CSeasonDungeonExecuteSoulOrdealNtc();
+ obj.TrialName = ReadMtString(buffer);
+ obj.TrialId = ReadUInt32(buffer);
+ obj.ObjectiveList = ReadEntityList(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonExecuteSoulOrdealRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonExecuteSoulOrdealRes.cs
new file mode 100644
index 000000000..14023a368
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonExecuteSoulOrdealRes.cs
@@ -0,0 +1,32 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Network;
+using System.Collections.Generic;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class S2CSeasonDungeonExecuteSoulOrdealRes : ServerResponse
+ {
+ public S2CSeasonDungeonExecuteSoulOrdealRes()
+ {
+ }
+
+ public override PacketId Id => PacketId.S2C_SEASON_DUNGEON_EXECUTE_SOUL_ORDEAL_RES;
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, S2CSeasonDungeonExecuteSoulOrdealRes obj)
+ {
+ WriteServerResponse(buffer, obj);
+ }
+
+ public override S2CSeasonDungeonExecuteSoulOrdealRes Read(IBuffer buffer)
+ {
+ S2CSeasonDungeonExecuteSoulOrdealRes obj = new S2CSeasonDungeonExecuteSoulOrdealRes();
+ ReadServerResponse(buffer, obj);
+ return obj;
+ }
+ }
+ }
+}
+
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGetBlockadeIdFromOmRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGetBlockadeIdFromOmRes.cs
new file mode 100644
index 000000000..cab46732d
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGetBlockadeIdFromOmRes.cs
@@ -0,0 +1,29 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Network;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class S2CSeasonDungeonGetBlockadeIdFromOmRes : ServerResponse
+ {
+ public override PacketId Id => PacketId.S2C_SEASON_DUNGEON_GET_BLOCKADE_ID_FROM_OM_RES;
+
+ public uint EpitaphId { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, S2CSeasonDungeonGetBlockadeIdFromOmRes obj)
+ {
+ WriteServerResponse(buffer, obj);
+ WriteUInt32(buffer, obj.EpitaphId);
+ }
+
+ public override S2CSeasonDungeonGetBlockadeIdFromOmRes Read(IBuffer buffer)
+ {
+ S2CSeasonDungeonGetBlockadeIdFromOmRes obj = new S2CSeasonDungeonGetBlockadeIdFromOmRes();
+ ReadServerResponse(buffer, obj);
+ obj.EpitaphId = ReadUInt32(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGetExRequiredItemRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGetExRequiredItemRes.cs
new file mode 100644
index 000000000..c71bdbe7f
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGetExRequiredItemRes.cs
@@ -0,0 +1,42 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Network;
+using System.Collections.Generic;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class S2CSeasonDungeonGetExRequiredItemRes : ServerResponse
+ {
+ public S2CSeasonDungeonGetExRequiredItemRes()
+ {
+ ItemList = new List();
+ }
+
+ public override PacketId Id => PacketId.S2C_SEASON_DUNGEON_GET_EX_REQUIRED_ITEM_RES;
+
+ public bool Unk0 { get; set; }
+ public bool Unk1 { get; set; }
+ public List ItemList { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, S2CSeasonDungeonGetExRequiredItemRes obj)
+ {
+ WriteServerResponse(buffer, obj);
+ WriteBool(buffer, obj.Unk0);
+ WriteBool(buffer, obj.Unk1);
+ WriteEntityList(buffer, obj.ItemList);
+ }
+
+ public override S2CSeasonDungeonGetExRequiredItemRes Read(IBuffer buffer)
+ {
+ S2CSeasonDungeonGetExRequiredItemRes obj = new S2CSeasonDungeonGetExRequiredItemRes();
+ ReadServerResponse(buffer, obj);
+ obj.Unk0 = ReadBool(buffer);
+ obj.Unk1 = ReadBool(buffer);
+ obj.ItemList = ReadEntityList(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGetExtendableBlockadeListFromNpcIdRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGetExtendableBlockadeListFromNpcIdRes.cs
new file mode 100644
index 000000000..ac6e97779
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGetExtendableBlockadeListFromNpcIdRes.cs
@@ -0,0 +1,36 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Network;
+using System.Collections.Generic;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class S2CSeasonDungeonGetExtendableBlockadeListFromNpcIdRes : ServerResponse
+ {
+ public S2CSeasonDungeonGetExtendableBlockadeListFromNpcIdRes()
+ {
+ BlockadeList = new List();
+ }
+
+ public override PacketId Id => PacketId.S2C_SEASON_DUNGEON_GET_EXTENDABLE_BLOCKADE_LIST_FROM_NPC_ID_RES;
+
+ public List BlockadeList { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, S2CSeasonDungeonGetExtendableBlockadeListFromNpcIdRes obj)
+ {
+ WriteServerResponse(buffer, obj);
+ WriteEntityList(buffer, obj.BlockadeList);
+ }
+
+ public override S2CSeasonDungeonGetExtendableBlockadeListFromNpcIdRes Read(IBuffer buffer)
+ {
+ S2CSeasonDungeonGetExtendableBlockadeListFromNpcIdRes obj = new S2CSeasonDungeonGetExtendableBlockadeListFromNpcIdRes();
+ ReadServerResponse(buffer, obj);
+ obj.BlockadeList = ReadEntityList(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGetIdFromNpcIdRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGetIdFromNpcIdRes.cs
new file mode 100644
index 000000000..912f79a68
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGetIdFromNpcIdRes.cs
@@ -0,0 +1,30 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Network;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class S2CSeasonDungeonGetIdFromNpcIdRes : ServerResponse
+ {
+ public override PacketId Id => PacketId.S2C_SEASON_DUNGEON_GET_ID_FROM_NPC_ID_RES;
+
+ public uint DungeonId { get; set; } // Set as 3 in packet capture?
+
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, S2CSeasonDungeonGetIdFromNpcIdRes obj)
+ {
+ WriteServerResponse(buffer, obj);
+ WriteUInt32(buffer, obj.DungeonId);
+ }
+
+ public override S2CSeasonDungeonGetIdFromNpcIdRes Read(IBuffer buffer)
+ {
+ S2CSeasonDungeonGetIdFromNpcIdRes obj = new S2CSeasonDungeonGetIdFromNpcIdRes();
+ ReadServerResponse(buffer, obj);
+ obj.DungeonId = ReadUInt32(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGetInfoRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGetInfoRes.cs
new file mode 100644
index 000000000..3e8f7e02e
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGetInfoRes.cs
@@ -0,0 +1,43 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Network;
+using System.Collections.Generic;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class S2CSeasonDungeonGetInfoRes : ServerResponse
+ {
+ public override PacketId Id => PacketId.S2C_SEASON_DUNGEON_GET_INFO_RES;
+
+ public S2CSeasonDungeonGetInfoRes()
+ {
+ DungeonInfo = new CDataSeasonDungeonInfo();
+ DungeonSections = new List();
+ }
+
+ public CDataSeasonDungeonInfo DungeonInfo { get; set; }
+ public List DungeonSections { get; set;}
+ public byte Unk0 { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, S2CSeasonDungeonGetInfoRes obj)
+ {
+ WriteServerResponse(buffer, obj);
+ WriteEntity(buffer, obj.DungeonInfo);
+ WriteEntityList(buffer, obj.DungeonSections);
+ WriteByte(buffer, obj.Unk0);
+ }
+
+ public override S2CSeasonDungeonGetInfoRes Read(IBuffer buffer)
+ {
+ S2CSeasonDungeonGetInfoRes obj = new S2CSeasonDungeonGetInfoRes();
+ ReadServerResponse(buffer, obj);
+ obj.DungeonInfo = ReadEntity(buffer);
+ obj.DungeonSections = ReadEntityList(buffer);
+ obj.Unk0 = ReadByte(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGetSoulOrdealListfromOmRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGetSoulOrdealListfromOmRes.cs
new file mode 100644
index 000000000..9bd7f9c69
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGetSoulOrdealListfromOmRes.cs
@@ -0,0 +1,52 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Model.EpitaphRoad;
+using Arrowgene.Ddon.Shared.Network;
+using System.Collections.Generic;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class S2CSeasonDungeonGetSoulOrdealListfromOmRes : ServerResponse
+ {
+ public override PacketId Id => PacketId.S2C_SEASON_DUNGEON_GET_SOUL_ORDEAL_LIST_FROM_OM_RES;
+
+ public S2CSeasonDungeonGetSoulOrdealListfromOmRes()
+ {
+ ElementParamList = new List();
+ }
+
+ public SoulOrdealOrderState Type { get; set; }
+ public List ElementParamList { get; set; }
+ public bool Unk2 { get; set; }
+ public byte Unk3 { get; set; }
+ public bool Unk4 { get; set; }
+ public byte Unk5 { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, S2CSeasonDungeonGetSoulOrdealListfromOmRes obj)
+ {
+ WriteServerResponse(buffer, obj);
+ WriteByte(buffer, (byte) obj.Type);
+ WriteEntityList(buffer, obj.ElementParamList);
+ WriteBool(buffer, obj.Unk2);
+ WriteByte(buffer, obj.Unk3);
+ WriteBool(buffer, obj.Unk4);
+ WriteByte(buffer, obj.Unk5);
+ }
+
+ public override S2CSeasonDungeonGetSoulOrdealListfromOmRes Read(IBuffer buffer)
+ {
+ S2CSeasonDungeonGetSoulOrdealListfromOmRes obj = new S2CSeasonDungeonGetSoulOrdealListfromOmRes();
+ ReadServerResponse(buffer, obj);
+ obj.Type = (SoulOrdealOrderState) ReadByte(buffer);
+ obj.ElementParamList = ReadEntityList(buffer);
+ obj.Unk2 = ReadBool(buffer);
+ obj.Unk3 = ReadByte(buffer);
+ obj.Unk4 = ReadBool(buffer);
+ obj.Unk5 = ReadByte(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGetSoulOrdealRewardListRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGetSoulOrdealRewardListRes.cs
new file mode 100644
index 000000000..85a207688
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGetSoulOrdealRewardListRes.cs
@@ -0,0 +1,40 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Network;
+using System.Collections.Generic;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class S2CSeasonDungeonGetSoulOrdealRewardListRes : ServerResponse
+ {
+ public override PacketId Id => PacketId.S2C_SEASON_DUNGEON_GET_SOUL_ORDEAL_REWARD_LIST_RES;
+
+ public S2CSeasonDungeonGetSoulOrdealRewardListRes()
+ {
+ ItemRewards = new List();
+ BuffRewards = new List();
+ }
+
+ public List ItemRewards { get; set; }
+ public List BuffRewards { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, S2CSeasonDungeonGetSoulOrdealRewardListRes obj)
+ {
+ WriteServerResponse(buffer, obj);
+ WriteEntityList(buffer, obj.ItemRewards);
+ WriteEntityList(buffer, obj.BuffRewards);
+ }
+
+ public override S2CSeasonDungeonGetSoulOrdealRewardListRes Read(IBuffer buffer)
+ {
+ S2CSeasonDungeonGetSoulOrdealRewardListRes obj = new S2CSeasonDungeonGetSoulOrdealRewardListRes();
+ ReadServerResponse(buffer, obj);
+ obj.ItemRewards = ReadEntityList(buffer);
+ obj.BuffRewards = ReadEntityList(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGroupReadyNtc.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGroupReadyNtc.cs
new file mode 100644
index 000000000..b73a2f8e2
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonGroupReadyNtc.cs
@@ -0,0 +1,33 @@
+using System.Collections.Generic;
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Network;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class S2CSeasonDungeonGroupReadyNtc : IPacketStructure
+ {
+ public PacketId Id => PacketId.S2C_SEASON_62_23_16_NTC;
+
+ public S2CSeasonDungeonGroupReadyNtc()
+ {
+ }
+
+ public bool Ready { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, S2CSeasonDungeonGroupReadyNtc obj)
+ {
+ WriteBool(buffer, obj.Ready);
+ }
+
+ public override S2CSeasonDungeonGroupReadyNtc Read(IBuffer buffer)
+ {
+ S2CSeasonDungeonGroupReadyNtc obj = new S2CSeasonDungeonGroupReadyNtc();
+ obj.Ready = ReadBool(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonReceiveSoulOrdealRewardBuffRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonReceiveSoulOrdealRewardBuffRes.cs
new file mode 100644
index 000000000..08410dccb
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonReceiveSoulOrdealRewardBuffRes.cs
@@ -0,0 +1,31 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Network;
+using System.Collections.Generic;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class S2CSeasonDungeonReceiveSoulOrdealRewardBuffRes : ServerResponse
+ {
+ public override PacketId Id => PacketId.S2C_SEASON_DUNGEON_RECEIVE_SOUL_ORDEAL_REWARD_BUFF_RES;
+
+ public S2CSeasonDungeonReceiveSoulOrdealRewardBuffRes()
+ {
+ }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, S2CSeasonDungeonReceiveSoulOrdealRewardBuffRes obj)
+ {
+ WriteServerResponse(buffer, obj);
+ }
+
+ public override S2CSeasonDungeonReceiveSoulOrdealRewardBuffRes Read(IBuffer buffer)
+ {
+ S2CSeasonDungeonReceiveSoulOrdealRewardBuffRes obj = new S2CSeasonDungeonReceiveSoulOrdealRewardBuffRes();
+ ReadServerResponse(buffer, obj);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonReceiveSoulOrdealRewardRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonReceiveSoulOrdealRewardRes.cs
new file mode 100644
index 000000000..fdcf5db2e
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonReceiveSoulOrdealRewardRes.cs
@@ -0,0 +1,35 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Network;
+using System.Collections.Generic;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class S2CSeasonDungeonReceiveSoulOrdealRewardRes : ServerResponse
+ {
+ public override PacketId Id => PacketId.S2C_SEASON_DUNGEON_RECEIVE_SOUL_ORDEAL_REWARD_RES;
+
+ public S2CSeasonDungeonReceiveSoulOrdealRewardRes()
+ {
+ }
+
+ public List RewardList { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, S2CSeasonDungeonReceiveSoulOrdealRewardRes obj)
+ {
+ WriteServerResponse(buffer, obj);
+ WriteEntityList(buffer, obj.RewardList);
+ }
+
+ public override S2CSeasonDungeonReceiveSoulOrdealRewardRes Read(IBuffer buffer)
+ {
+ S2CSeasonDungeonReceiveSoulOrdealRewardRes obj = new S2CSeasonDungeonReceiveSoulOrdealRewardRes();
+ ReadServerResponse(buffer, obj);
+ obj.RewardList = ReadEntityList(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonSetOmStateNtc.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonSetOmStateNtc.cs
new file mode 100644
index 000000000..09fd06566
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonSetOmStateNtc.cs
@@ -0,0 +1,35 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Model.EpitaphRoad;
+using Arrowgene.Ddon.Shared.Network;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class S2CSeasonDungeonSetOmStateNtc : IPacketStructure
+ {
+ public PacketId Id => PacketId.S2C_SEASON_DUNGEON_SET_OM_STATE_NTC;
+
+ public CDataStageLayoutId LayoutId { get; set; }
+ public uint Unk0 { get; set; }
+ public SoulOrdealOmState State { get; set; } // Changes marker on map and unlocks doors
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, S2CSeasonDungeonSetOmStateNtc obj)
+ {
+ WriteEntity(buffer, obj.LayoutId);
+ WriteUInt32(buffer, obj.Unk0);
+ WriteByte(buffer, (byte) obj.State);
+ }
+
+ public override S2CSeasonDungeonSetOmStateNtc Read(IBuffer buffer)
+ {
+ S2CSeasonDungeonSetOmStateNtc obj = new S2CSeasonDungeonSetOmStateNtc();
+ obj.LayoutId = ReadEntity(buffer);
+ obj.Unk0 = ReadUInt32(buffer);
+ obj.State = (SoulOrdealOmState) ReadByte(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonSoulOrdealReadyRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonSoulOrdealReadyRes.cs
new file mode 100644
index 000000000..82bebdf77
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CSeasonDungeonSoulOrdealReadyRes.cs
@@ -0,0 +1,31 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Network;
+using System.Collections.Generic;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class S2CSeasonDungeonSoulOrdealReadyRes : ServerResponse
+ {
+ public override PacketId Id => PacketId.S2C_SEASON_DUNGEON_SOUL_ORDEAL_READY_RES;
+
+ public S2CSeasonDungeonSoulOrdealReadyRes()
+ {
+ }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, S2CSeasonDungeonSoulOrdealReadyRes obj)
+ {
+ WriteServerResponse(buffer, obj);
+ }
+
+ public override S2CSeasonDungeonSoulOrdealReadyRes Read(IBuffer buffer)
+ {
+ S2CSeasonDungeonSoulOrdealReadyRes obj = new S2CSeasonDungeonSoulOrdealReadyRes();
+ ReadServerResponse(buffer, obj);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CStageGetSpAreaChangeIdFromNpcIdRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CStageGetSpAreaChangeIdFromNpcIdRes.cs
new file mode 100644
index 000000000..f972ce668
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CStageGetSpAreaChangeIdFromNpcIdRes.cs
@@ -0,0 +1,36 @@
+using System.Collections.Generic;
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Network;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class S2CStageGetSpAreaChangeIdFromNpcIdRes : ServerResponse
+ {
+ public override PacketId Id => PacketId.S2C_STAGE_GET_SP_AREA_CHANGE_ID_FROM_NPC_ID_RES;
+
+ public uint StageId { get; set; }
+
+ public S2CStageGetSpAreaChangeIdFromNpcIdRes()
+ {
+ }
+
+ public class Serializer : PacketEntitySerializer
+ {
+
+ public override void Write(IBuffer buffer, S2CStageGetSpAreaChangeIdFromNpcIdRes obj)
+ {
+ WriteServerResponse(buffer, obj);
+ WriteUInt32(buffer, obj.StageId);
+ }
+
+ public override S2CStageGetSpAreaChangeIdFromNpcIdRes Read(IBuffer buffer)
+ {
+ S2CStageGetSpAreaChangeIdFromNpcIdRes obj = new S2CStageGetSpAreaChangeIdFromNpcIdRes();
+ ReadServerResponse(buffer, obj);
+ obj.StageId = ReadUInt32(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CStageGetSpAreaChangeInfoRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CStageGetSpAreaChangeInfoRes.cs
new file mode 100644
index 000000000..db3453181
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CStageGetSpAreaChangeInfoRes.cs
@@ -0,0 +1,52 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Network;
+using System.Collections.Generic;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class S2CStageGetSpAreaChangeInfoRes : ServerResponse
+ {
+ public override PacketId Id => PacketId.S2C_STAGE_GET_SP_AREA_CHANGE_INFO_RES;
+
+
+ public S2CStageGetSpAreaChangeInfoRes()
+ {
+ }
+
+ public uint Unk0 { get; set; }
+ public string Unk1 { get; set; }
+ public uint StageId { get; set; }
+ public uint StartPos { get; set; }
+ public bool Unk4 { get; set; }
+ public List EntryCostList { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+
+ public override void Write(IBuffer buffer, S2CStageGetSpAreaChangeInfoRes obj)
+ {
+ WriteServerResponse(buffer, obj);
+ WriteUInt32(buffer, obj.Unk0);
+ WriteMtString(buffer, obj.Unk1);
+ WriteUInt32(buffer, obj.StageId);
+ WriteUInt32(buffer, obj.StartPos);
+ WriteBool(buffer, obj.Unk4);
+ WriteEntity(buffer, obj.EntryCostList);
+ }
+
+ public override S2CStageGetSpAreaChangeInfoRes Read(IBuffer buffer)
+ {
+ S2CStageGetSpAreaChangeInfoRes obj = new S2CStageGetSpAreaChangeInfoRes();
+ ReadServerResponse(buffer, obj);
+ obj.Unk0 = ReadUInt32(buffer);
+ obj.Unk1 = ReadMtString(buffer);
+ obj.StageId = ReadUInt32(buffer);
+ obj.StartPos = ReadUInt32(buffer);
+ obj.Unk4 = ReadBool(buffer);
+ obj.EntryCostList = ReadEntityList(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CStageUnisonAreaChangeGetRecruitmentStateRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CStageUnisonAreaChangeGetRecruitmentStateRes.cs
index 4a070de52..a61c51487 100644
--- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CStageUnisonAreaChangeGetRecruitmentStateRes.cs
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CStageUnisonAreaChangeGetRecruitmentStateRes.cs
@@ -9,7 +9,7 @@ public class S2CStageUnisonAreaChangeGetRecruitmentStateRes : ServerResponse
{
public S2CStageUnisonAreaChangeGetRecruitmentStateRes()
{
- EntryCostList = new List();
+ EntryCostList = new List();
Unk1 = string.Empty;
}
@@ -21,7 +21,7 @@ public S2CStageUnisonAreaChangeGetRecruitmentStateRes()
public uint StageId { get; set; }
public uint StartPos { get; set; }
public bool Unk4 { get; set; }
- public List EntryCostList { get; set; }
+ public List EntryCostList { get; set; }
public class Serializer : PacketEntitySerializer
{
@@ -45,7 +45,7 @@ public override S2CStageUnisonAreaChangeGetRecruitmentStateRes Read(IBuffer buff
obj.StageId = ReadUInt32(buffer);
obj.StartPos = ReadUInt32(buffer);
obj.Unk4 = ReadBool(buffer);
- obj.EntryCostList = ReadEntityList(buffer);
+ obj.EntryCostList = ReadEntityList(buffer);
return obj;
}
}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2C_SEASON_62_16_16_NTC.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2C_SEASON_62_16_16_NTC.cs
new file mode 100644
index 000000000..0b8d8c4e6
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2C_SEASON_62_16_16_NTC.cs
@@ -0,0 +1,34 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Network;
+using System.Collections.Generic;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class S2C_SEASON_62_16_16_NTC : IPacketStructure
+ {
+ public S2C_SEASON_62_16_16_NTC()
+ {
+ Objectives = new List();
+ }
+
+ public PacketId Id => PacketId.S2C_SEASON_62_16_16_NTC;
+
+ public List Objectives { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, S2C_SEASON_62_16_16_NTC obj)
+ {
+ WriteEntityList(buffer, obj.Objectives);
+ }
+
+ public override S2C_SEASON_62_16_16_NTC Read(IBuffer buffer)
+ {
+ S2C_SEASON_62_16_16_NTC obj = new S2C_SEASON_62_16_16_NTC();
+ obj.Objectives = ReadEntityList(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2C_SEASON_62_22_16_NTC.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2C_SEASON_62_22_16_NTC.cs
new file mode 100644
index 000000000..f1608203a
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2C_SEASON_62_22_16_NTC.cs
@@ -0,0 +1,24 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Network;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class S2C_SEASON_62_22_16_NTC : IPacketStructure
+ {
+ public PacketId Id => PacketId.S2C_SEASON_62_22_16_NTC;
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, S2C_SEASON_62_22_16_NTC obj)
+ {
+ }
+
+ public override S2C_SEASON_62_22_16_NTC Read(IBuffer buffer)
+ {
+ S2C_SEASON_62_22_16_NTC obj = new S2C_SEASON_62_22_16_NTC();
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2C_SEASON_62_28_16_NTC.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2C_SEASON_62_28_16_NTC.cs
new file mode 100644
index 000000000..767f35fa5
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2C_SEASON_62_28_16_NTC.cs
@@ -0,0 +1,47 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Model.EpitaphRoad;
+using Arrowgene.Ddon.Shared.Network;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class S2C_SEASON_62_28_16_NTC : IPacketStructure
+ {
+ public S2C_SEASON_62_28_16_NTC()
+ {
+ Unk2 = string.Empty;
+ LayoutId = new CDataStageLayoutId();
+ }
+
+ public PacketId Id => PacketId.S2C_SEASON_62_28_16_NTC;
+
+ public uint Unk0 { get; set; }
+ public uint Unk1 { get; set; }
+ public string Unk2 { get; set; } // Makes blue text pop up
+ public CDataStageLayoutId LayoutId { get; set; }
+ public uint Unk3 { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, S2C_SEASON_62_28_16_NTC obj)
+ {
+ WriteUInt32(buffer, obj.Unk0);
+ WriteUInt32(buffer, obj.Unk1);
+ WriteMtString(buffer, obj.Unk2);
+ WriteEntity(buffer, obj.LayoutId);
+ WriteUInt32(buffer, obj.Unk3);
+ }
+
+ public override S2C_SEASON_62_28_16_NTC Read(IBuffer buffer)
+ {
+ S2C_SEASON_62_28_16_NTC obj = new S2C_SEASON_62_28_16_NTC();
+ obj.Unk0 = ReadUInt32(buffer);
+ obj.Unk1 = ReadUInt32(buffer);
+ obj.Unk2 = ReadMtString(buffer);
+ obj.LayoutId = ReadEntity(buffer);
+ obj.Unk3 = ReadUInt32(buffer);
+ return obj;
+ }
+ }
+ }
+}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2C_SEASON_62_38_16_NTC.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2C_SEASON_62_38_16_NTC.cs
deleted file mode 100644
index 4b22a735c..000000000
--- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2C_SEASON_62_38_16_NTC.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using Arrowgene.Buffers;
-using Arrowgene.Ddon.Shared.Network;
-
-namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
-{
- public class S2C_SEASON_62_38_16_NTC : IPacketStructure
- {
- public PacketId Id => PacketId.S2C_SEASON_62_38_16_NTC;
-
- public S2C_SEASON_62_38_16_NTC()
- {
- }
-
- public uint StageNo { get; set; }
-
- public class Serializer : PacketEntitySerializer
- {
- public override void Write(IBuffer buffer, S2C_SEASON_62_38_16_NTC obj)
- {
- }
-
- public override S2C_SEASON_62_38_16_NTC Read(IBuffer buffer)
- {
- S2C_SEASON_62_38_16_NTC obj = new S2C_SEASON_62_38_16_NTC();
- return obj;
- }
- }
- }
-}
diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2C_SEASON_62_39_16_NTC.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2C_SEASON_62_39_16_NTC.cs
new file mode 100644
index 000000000..c4b2bd21d
--- /dev/null
+++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2C_SEASON_62_39_16_NTC.cs
@@ -0,0 +1,38 @@
+using Arrowgene.Buffers;
+using Arrowgene.Ddon.Shared.Entity.Structure;
+using Arrowgene.Ddon.Shared.Network;
+using System.Collections.Generic;
+using System.Security.Cryptography.X509Certificates;
+
+namespace Arrowgene.Ddon.Shared.Entity.PacketStructure
+{
+ public class S2C_SEASON_62_39_16_NTC : IPacketStructure
+ {
+ public PacketId Id => PacketId.S2C_SEASON_62_39_16_NTC;
+
+ public S2C_SEASON_62_39_16_NTC()
+ {
+ BuffList = new List();
+ }
+
+ public uint CharacterId { get; set; }
+ public List BuffList { get; set; }
+
+ public class Serializer : PacketEntitySerializer
+ {
+ public override void Write(IBuffer buffer, S2C_SEASON_62_39_16_NTC obj)
+ {
+ WriteUInt32(buffer, obj.CharacterId);
+ WriteEntityList(buffer, obj.BuffList);
+ }
+
+ public override S2C_SEASON_62_39_16_NTC Read(IBuffer buffer)
+ {
+ S2C_SEASON_62_39_16_NTC obj = new S2C_SEASON_62_39_16_NTC();
+ obj.CharacterId = ReadUInt32(buffer);
+ obj.BuffList = ReadEntityList