diff --git a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/photobooth/PhotoboothDatabaseParser.java b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/photobooth/PhotoboothDatabaseParser.java index 93ea9dc..e642e83 100644 --- a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/photobooth/PhotoboothDatabaseParser.java +++ b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/photobooth/PhotoboothDatabaseParser.java @@ -46,6 +46,9 @@ private List parsePhotoList(ByteBuffer buffer) { photoData.PhotoFilename = UnrealUtils.readString(buffer); // skip time field + // unclear how this field works + // the first two bytes seem meaningful but the last two bytes are always 0x00 and 0x01 + // possibly the game is bugged and is clobbering the last two bytes with other data buffer.position(buffer.position() + 4); photoData.Favorite = buffer.getInt() != 0; diff --git a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mapper/IXComRawStateObjectReferenceMapperFactory.java b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mapper/IXComRawStateObjectReferenceMapperFactory.java new file mode 100644 index 0000000..b94dc60 --- /dev/null +++ b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mapper/IXComRawStateObjectReferenceMapperFactory.java @@ -0,0 +1,27 @@ +package com.github.rcd47.x2data.lib.unreal.mapper; + +class IXComRawStateObjectReferenceMapperFactory implements IUnrealFieldMapperFactory { + + private Class referencedObjectType; + + IXComRawStateObjectReferenceMapperFactory(Class referencedObjectType) { + this.referencedObjectType = referencedObjectType; + } + + @Override + public IUnrealFieldMapper create(UnrealObjectMapperContext context, Object currentValue) { + return new IXComRawStateObjectReferenceMapper(context); + } + + class IXComRawStateObjectReferenceMapper extends UnrealPrimitiveMapperBase { + IXComRawStateObjectReferenceMapper(UnrealObjectMapperContext context) { + super(context); + } + + @Override + public void visitIntValue(int value) { + visitValue(context.referenceResolver.createStateReference(referencedObjectType, value)); + } + } + +} diff --git a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mapper/UnrealObjectMapper.java b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mapper/UnrealObjectMapper.java index d3dc8ea..fcdc8aa 100644 --- a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mapper/UnrealObjectMapper.java +++ b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mapper/UnrealObjectMapper.java @@ -13,6 +13,7 @@ import com.github.rcd47.x2data.lib.unreal.mapper.ref.IXComIndexObjectReference; import com.github.rcd47.x2data.lib.unreal.mapper.ref.IXComNameObjectReference; import com.github.rcd47.x2data.lib.unreal.mapper.ref.IXComObjectReferenceResolver; +import com.github.rcd47.x2data.lib.unreal.mapper.ref.IXComRawStateObjectReference; import com.github.rcd47.x2data.lib.unreal.mapper.ref.IXComStateObjectReference; import com.github.rcd47.x2data.lib.unreal.mappings.UnrealName; @@ -94,6 +95,8 @@ private > IUnrealFieldMapperFactory getOrCreateMapperFactory(T refFactory = new IXComNameObjectReferenceMapperFactory(referencedObjectType); } else if (IXComStateObjectReference.class.equals(rawClass)) { refFactory = new IXComStateObjectReferenceMapperFactory(referencedObjectType); + } else if (IXComRawStateObjectReference.class.equals(rawClass)) { + refFactory = new IXComRawStateObjectReferenceMapperFactory(referencedObjectType); } else if (IXComIndexObjectReference.class.equals(rawClass)) { refFactory = new IXComIndexObjectReferenceMapperFactory(referencedObjectType); } else { diff --git a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mapper/ref/AbstractXComObjectReference.java b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mapper/ref/AbstractXComObjectReference.java deleted file mode 100644 index 9c5ffe4..0000000 --- a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mapper/ref/AbstractXComObjectReference.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.github.rcd47.x2data.lib.unreal.mapper.ref; - -public class AbstractXComObjectReference { - - public T referencedObject; - -} diff --git a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mapper/ref/IXComObjectReferenceResolver.java b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mapper/ref/IXComObjectReferenceResolver.java index b06bb23..bda5b6b 100644 --- a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mapper/ref/IXComObjectReferenceResolver.java +++ b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mapper/ref/IXComObjectReferenceResolver.java @@ -8,6 +8,8 @@ public interface IXComObjectReferenceResolver { IXComStateObjectReference createStateReference(Class referencedObjectType, int objectId); + IXComRawStateObjectReference createRawStateReference(Class referencedObjectType, int objectId); + IXComNameObjectReference createNameReference(Class referencedObjectType, UnrealName objectName); } diff --git a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mapper/ref/IXComRawStateObjectReference.java b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mapper/ref/IXComRawStateObjectReference.java new file mode 100644 index 0000000..d56487e --- /dev/null +++ b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mapper/ref/IXComRawStateObjectReference.java @@ -0,0 +1,10 @@ +package com.github.rcd47.x2data.lib.unreal.mapper.ref; + +/** + * Sometimes, state objects just have an int field to point to another state object instead of using StateObjectReference. + */ +public interface IXComRawStateObjectReference extends IXComObjectReference { + + int id(); + +} diff --git a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mapper/ref/NullXComObjectReferenceResolver.java b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mapper/ref/NullXComObjectReferenceResolver.java index 63b580d..adeccb7 100644 --- a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mapper/ref/NullXComObjectReferenceResolver.java +++ b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mapper/ref/NullXComObjectReferenceResolver.java @@ -41,6 +41,21 @@ public int id() { }; } + @Override + public IXComRawStateObjectReference createRawStateReference(Class referencedObjectType, int objectId) { + return new IXComRawStateObjectReference() { + @Override + public T get() { + return null; + } + + @Override + public int id() { + return objectId; + } + }; + } + @Override public IXComNameObjectReference createNameReference(Class referencedObjectType, UnrealName objectName) { return new IXComNameObjectReference() { diff --git a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/ReserveSquad.java b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/ReserveSquad.java index 9e60bc8..aaf51a4 100644 --- a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/ReserveSquad.java +++ b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/ReserveSquad.java @@ -1,5 +1,11 @@ package com.github.rcd47.x2data.lib.unreal.mappings.base; +import java.util.List; + +import com.github.rcd47.x2data.lib.unreal.mapper.ref.IXComStateObjectReference; + public class ReserveSquad { + public List> SquadMembers; + } diff --git a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/TDateTime.java b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/TDateTime.java new file mode 100644 index 0000000..00a309f --- /dev/null +++ b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/TDateTime.java @@ -0,0 +1,18 @@ +package com.github.rcd47.x2data.lib.unreal.mappings.base; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; + +public class TDateTime { + + public float m_fTime; + public int m_iDay; + public int m_iMonth; + public int m_iYear; + + public LocalDateTime toLocalDateTime() { + return LocalDateTime.of(LocalDate.of(m_iYear, m_iMonth, m_iDay), LocalTime.ofSecondOfDay((int) m_fTime)); + } + +} diff --git a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/X2ContinentTemplate.java b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/X2ContinentTemplate.java new file mode 100644 index 0000000..d196aef --- /dev/null +++ b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/X2ContinentTemplate.java @@ -0,0 +1,7 @@ +package com.github.rcd47.x2data.lib.unreal.mappings.base; + +public class X2ContinentTemplate extends X2StrategyElementTemplate { + + public String DisplayName; + +} diff --git a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/X2WorldRegionTemplate.java b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/X2WorldRegionTemplate.java new file mode 100644 index 0000000..40aecc1 --- /dev/null +++ b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/X2WorldRegionTemplate.java @@ -0,0 +1,7 @@ +package com.github.rcd47.x2data.lib.unreal.mappings.base; + +public class X2WorldRegionTemplate extends X2StrategyElementTemplate { + + public String DisplayName; + +} diff --git a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_BattleData.java b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_BattleData.java index b7cfd66..b58e06a 100644 --- a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_BattleData.java +++ b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_BattleData.java @@ -2,6 +2,7 @@ import java.util.List; +import com.github.rcd47.x2data.lib.unreal.mapper.ref.IXComRawStateObjectReference; import com.github.rcd47.x2data.lib.unreal.mapper.ref.IXComStateObjectReference; import com.github.rcd47.x2data.lib.unreal.mappings.UnrealName; @@ -15,8 +16,12 @@ public class XComGameState_BattleData extends XComGameState_BaseObject { public DirectTransferInformation DirectTransferInfo; public List DisallowedAbilities; public List HighlightedObjectiveAbilities; + public TDateTime LocalTime; public List LostSwarmIDs; public List m_arrSecondWave; + public IXComRawStateObjectReference m_iMissionID; + public String m_strDesc; + public String m_strLocation; public String m_strOpName; public List MaxLostSpawnTurnCooldown; public List MinLostSpawnTurnCooldown; diff --git a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_CampaignSettings.java b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_CampaignSettings.java index bfef25f..2faf4aa 100644 --- a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_CampaignSettings.java +++ b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_CampaignSettings.java @@ -7,6 +7,7 @@ public class XComGameState_CampaignSettings extends XComGameState_BaseObject { public List EnabledOptionalNarrativeDLC; + public int GameIndex; public List RequiredDLC; public List SecondWaveOptions; diff --git a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_Continent.java b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_Continent.java index a50319f..e24e203 100644 --- a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_Continent.java +++ b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_Continent.java @@ -1,5 +1,13 @@ package com.github.rcd47.x2data.lib.unreal.mappings.base; +import java.util.List; + +import com.github.rcd47.x2data.lib.unreal.mapper.ref.IXComNameObjectReference; +import com.github.rcd47.x2data.lib.unreal.mapper.ref.IXComStateObjectReference; + public class XComGameState_Continent extends XComGameState_GeoscapeEntity { + public List> Regions; + public IXComNameObjectReference m_TemplateName; + } diff --git a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_GeoscapeEntity.java b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_GeoscapeEntity.java index 64881eb..1dc337f 100644 --- a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_GeoscapeEntity.java +++ b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_GeoscapeEntity.java @@ -1,5 +1,10 @@ package com.github.rcd47.x2data.lib.unreal.mappings.base; -public class XComGameState_GeoscapeEntity extends XComGameState_BaseObject { +import com.github.rcd47.x2data.lib.unreal.mapper.ref.IXComStateObjectReference; +public class XComGameState_GeoscapeEntity extends XComGameState_BaseObject { + + public IXComStateObjectReference Continent; + public IXComStateObjectReference Region; + } diff --git a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_HeadquartersXCom.java b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_HeadquartersXCom.java index 0cf0b22..086c843 100644 --- a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_HeadquartersXCom.java +++ b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_HeadquartersXCom.java @@ -3,6 +3,7 @@ import java.util.List; import java.util.Map; +import com.github.rcd47.x2data.lib.unreal.mapper.ref.IXComStateObjectReference; import com.github.rcd47.x2data.lib.unreal.mappings.UnrealName; import com.github.rcd47.x2data.lib.unreal.mappings.UnrealUntypedProperty; @@ -10,12 +11,14 @@ public class XComGameState_HeadquartersXCom extends XComGameState_Airship { public List AllSquads; public List arrGeneratedMissionData; + public List> Crew; public List CurrentOrders; public List EverAcquiredInventoryCounts; public List EverAcquiredInventoryTypes; public List ExtraUpgradeWeaponCats; @UnrealUntypedProperty(1) public Map GenericKVP; + public List> Inventory; public List PendingFacilityDiscounts; public List PlayedAmbientNarrativeMoments; public List PlayedAmbientSpeakers; @@ -32,6 +35,7 @@ public class XComGameState_HeadquartersXCom extends XComGameState_Airship { public List SoldierClassDeck; public List SoldierClassDistribution; public List SoldierUnlockTemplates; + public List> Squad; public List TacticalGameplayTags; public List UnlockedItems; diff --git a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_WorldRegion.java b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_WorldRegion.java index 23a2a2e..8d8fd03 100644 --- a/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_WorldRegion.java +++ b/x2-data-lib/src/main/java/com/github/rcd47/x2data/lib/unreal/mappings/base/XComGameState_WorldRegion.java @@ -1,5 +1,9 @@ package com.github.rcd47.x2data.lib.unreal.mappings.base; +import com.github.rcd47.x2data.lib.unreal.mapper.ref.IXComNameObjectReference; + public class XComGameState_WorldRegion extends XComGameState_ScanningSite { + public IXComNameObjectReference m_TemplateName; + }