Skip to main content

Season Handling

Background

Dragon's Dogma Online evolved through three major seasons, each introducing changes to file formats. Some changes were additive (new fields appended), while others were breaking (field reordering, type changes, entirely new file types). The project's architecture must handle all three seasons simultaneously.

SeasonClient VersionClientVersion EnumPeriod
Season 101.01VERSION_1_1Launch – mid-lifecycle
Season 202.03VERSION_2_3Mid-lifecycle expansion
Season 303.04VERSION_3_4Final version (most complete)

Layered Architecture

Layer Responsibilities

LayerResponsibility
lib-apiPure interfaces, records, enums, and utility classes. No deserialization logic. Season-agnostic.
lib-commonContains deserializers for file types whose binary format is identical across all three seasons. Also defines the ClientResourceFileManager abstract base class and the common resource registration logic (addCommonResourceMapping()).
lib-season{1,2,3}Contains deserializers for file types that differ between seasons. Each module provides a ClientResourceFileManagerSeason{N} subclass that registers the season-specific deserializers in setupResourceMapping().

Manager Inheritance

Constructor Flow

When a ClientResourceFileManagerSeason3 is instantiated:

  1. setupResourceMapping() is called first → returns ~100 Season 3-specific ClientResourceFile entries.
  2. addCommonResourceMapping(set) adds ~90 shared entries to the same set (defined in the base class).
  3. If meta-information is requested, setupResourceLookupUtil() creates a ResourceMetadataLookupUtilSeason3 with season-specific item/stage/NPC lookup logic.
  4. The combined set is indexed into clientResourceFileMap (keyed by Pair<Extension, FileHeader>).

This means the common mappings and season-specific mappings coexist in a single flat map. There is no override mechanism — if a season needs a different version number for the same file type, it registers a different FileHeader.

How Season Differences Manifest

Same Extension, Different Deserializer

Many file types exist across all three seasons but with different binary layouts. Each season module provides its own deserializer class:

ResourceExtensionS1 DeserializerS2 DeserializerS3 DeserializerDifference
rAreaInfo.ariseason1...AreaInfoDeserializerseason2...AreaInfoDeserializerseason3...AreaInfoDeserializerFields added/changed per season
rItemList.ipaseason1...ItemListDeserializerseason2...ItemListDeserializerseason3...ItemListDeserializerNew item fields in later seasons and structure completely changed
rPlayerExpTable.expseason1...PlayerExpTableDeserializerseason2...PlayerExpTableDeserializer(removed)S3 no longer provides a table as file

Season-Exclusive Resource Types

Some resource types only exist in certain seasons:

ResourceExtensionS1S2S3Notes
rFurnitureData.fndClan housing added in S2
rFurnitureGroup.fngClan housing added in S2
rEnhancedParamList.eplS3-exclusive enhanced parameters
rJukeBoxItem.jbiS3-exclusive jukebox
rPlanetariumItem.planetS3-exclusive planetarium

Common Resources (Season-Independent)

Resources registered in addCommonResourceMapping() have identical binary formats across all seasons. Examples:

ResourceExtensionMagicVersionNotes
rGUIMessage.gmdGMD\066306Message data — same format throughout
rArchive (encrypted).arcARCC7Encrypted archive format
rArchive (reference).arcARCS7Reference archive format
rTexture.texTEX\08349/41117Texture container
rEnemyGroup.emg(none)1Enemy group definitions
rRageTable.rag(none)257Enemy rage tables

Entity Class Mirroring

Each deserializer has a corresponding entity class (or set of classes) in the same module. The entity package structure mirrors the deserializer package structure:

lib-season3/src/main/java/org/sehkah/ddon/tools/extractor/season3/logic/resource/
├── deserialization/
│ └── stage/
│ ├── StageInfoDeserializer.java
│ └── StageJointDeserializer.java
└── entity/
└── stage/
├── StageInfo.java
└── StageJoint.java

Entity classes are typically records or @Data classes (via Lombok). Top-level entities extend Resource; nested sub-entities are plain records/classes.

ResourceMetadataLookupUtil — Season Subclasses

Each season module provides a ResourceMetadataLookupUtil subclass with season-specific lookup logic:

Season 3's lookup util, for example, has access to ItemList, StageListInfoList, and ItemEquipJobInfoList which are used to resolve item names, stage names, and equipment job mappings.