Fixed major issues when exporting DKCR
This commit is contained in:
parent
7f18a33fae
commit
b45eaae106
|
@ -5,6 +5,8 @@
|
||||||
|
|
||||||
class CAnimEventData : public CResource
|
class CAnimEventData : public CResource
|
||||||
{
|
{
|
||||||
|
DECLARE_RESOURCE_TYPE(eAnimEventData)
|
||||||
|
|
||||||
struct SEvent
|
struct SEvent
|
||||||
{
|
{
|
||||||
u32 mCharacterIndex;
|
u32 mCharacterIndex;
|
||||||
|
|
|
@ -72,6 +72,7 @@ public:
|
||||||
|
|
||||||
TString TagName = rkStr.SubString(TagIdx + 1, NameEnd - TagIdx - 1);
|
TString TagName = rkStr.SubString(TagIdx + 1, NameEnd - TagIdx - 1);
|
||||||
TString ParamString = rkStr.SubString(NameEnd + 1, TagEnd - NameEnd - 1);
|
TString ParamString = rkStr.SubString(NameEnd + 1, TagEnd - NameEnd - 1);
|
||||||
|
if (ParamString.IsEmpty()) continue;
|
||||||
|
|
||||||
// Font
|
// Font
|
||||||
if (TagName == "font")
|
if (TagName == "font")
|
||||||
|
@ -103,6 +104,9 @@ public:
|
||||||
else if (ImageType == "SA")
|
else if (ImageType == "SA")
|
||||||
TexturesStart = 4;
|
TexturesStart = 4;
|
||||||
|
|
||||||
|
else if (ImageType == "B")
|
||||||
|
TexturesStart = 2;
|
||||||
|
|
||||||
else if (ImageType.IsHexString(false, IDLength * 2))
|
else if (ImageType.IsHexString(false, IDLength * 2))
|
||||||
TexturesStart = 0;
|
TexturesStart = 0;
|
||||||
|
|
||||||
|
|
|
@ -397,7 +397,10 @@ CMaterial* CMaterialLoader::ReadCorruptionMaterial()
|
||||||
case 6: // Model Matrix
|
case 6: // Model Matrix
|
||||||
case 10: // Yet-to-be-named
|
case 10: // Yet-to-be-named
|
||||||
break;
|
break;
|
||||||
case 8: // Unknown/unsupported animation type
|
|
||||||
|
// Unknown/unsupported animation type
|
||||||
|
case 8:
|
||||||
|
case 11:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Log::FileError(mpFile->GetSourceString(), mpFile->Tell() - 8, "Unsupported animation mode encountered: " + TString::HexString((u32) pPass->mAnimMode));
|
Log::FileError(mpFile->GetSourceString(), mpFile->Tell() - 8, "Unsupported animation mode encountered: " + TString::HexString((u32) pPass->mAnimMode));
|
||||||
|
|
|
@ -3,6 +3,41 @@
|
||||||
#include "Core/GameProject/CResourceIterator.h"
|
#include "Core/GameProject/CResourceIterator.h"
|
||||||
#include "Core/Resource/CWorld.h"
|
#include "Core/Resource/CWorld.h"
|
||||||
|
|
||||||
|
void CUnsupportedFormatLoader::PerformCheating(IInputStream& rFile, EGame Game, std::list<CAssetID>& rAssetList)
|
||||||
|
{
|
||||||
|
// Analyze file contents and check every sequence of 4/8 bytes for asset IDs
|
||||||
|
std::vector<u8> Data(rFile.Size() - rFile.Tell());
|
||||||
|
rFile.ReadBytes(Data.data(), Data.size());
|
||||||
|
|
||||||
|
u32 MaxIndex = (Game <= eEchoes ? Data.size() - 3 : Data.size() - 7);
|
||||||
|
CAssetID ID;
|
||||||
|
|
||||||
|
for (u32 iByte = 0; iByte < MaxIndex; iByte++)
|
||||||
|
{
|
||||||
|
if (Game <= eEchoes)
|
||||||
|
{
|
||||||
|
ID = ( (Data[iByte+0] << 24) |
|
||||||
|
(Data[iByte+1] << 16) |
|
||||||
|
(Data[iByte+2] << 8) |
|
||||||
|
(Data[iByte+3] << 0) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ID = ( ((u64) Data[iByte+0] << 56) |
|
||||||
|
((u64) Data[iByte+1] << 48) |
|
||||||
|
((u64) Data[iByte+2] << 40) |
|
||||||
|
((u64) Data[iByte+3] << 32) |
|
||||||
|
((u64) Data[iByte+4] << 24) |
|
||||||
|
((u64) Data[iByte+5] << 16) |
|
||||||
|
((u64) Data[iByte+6] << 8) |
|
||||||
|
((u64) Data[iByte+7] << 0) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gpResourceStore->IsResourceRegistered(ID))
|
||||||
|
rAssetList.push_back(ID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
CAudioMacro* CUnsupportedFormatLoader::LoadCAUD(IInputStream& rCAUD, CResourceEntry *pEntry)
|
CAudioMacro* CUnsupportedFormatLoader::LoadCAUD(IInputStream& rCAUD, CResourceEntry *pEntry)
|
||||||
{
|
{
|
||||||
u32 Magic = rCAUD.ReadLong();
|
u32 Magic = rCAUD.ReadLong();
|
||||||
|
@ -18,10 +53,15 @@ CAudioMacro* CUnsupportedFormatLoader::LoadCAUD(IInputStream& rCAUD, CResourceEn
|
||||||
CAudioMacro *pMacro = new CAudioMacro(pEntry);
|
CAudioMacro *pMacro = new CAudioMacro(pEntry);
|
||||||
pMacro->mMacroName = rCAUD.ReadString();
|
pMacro->mMacroName = rCAUD.ReadString();
|
||||||
|
|
||||||
// DKCR needs some reverse engineering work still in order to parse the file correctly, unfortunately
|
// DKCR is missing the sample data size value, and the bulk of the format isn't well understood, unfortunately
|
||||||
if (Game == eReturns)
|
if (Game == eReturns)
|
||||||
{
|
{
|
||||||
Log::Warning("DKCR CAUD dependencies not being handled!");
|
std::list<CAssetID> AssetList;
|
||||||
|
PerformCheating(rCAUD, pEntry->Game(), AssetList);
|
||||||
|
|
||||||
|
for (auto Iter = AssetList.begin(); Iter != AssetList.end(); Iter++)
|
||||||
|
pMacro->mSamples.push_back(*Iter);
|
||||||
|
|
||||||
return pMacro;
|
return pMacro;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,37 +108,13 @@ CDependencyGroup* CUnsupportedFormatLoader::LoadDUMB(IInputStream& rDUMB, CResou
|
||||||
return LoadHIER(rDUMB, pEntry);
|
return LoadHIER(rDUMB, pEntry);
|
||||||
|
|
||||||
// Load other DUMB file. DUMB files don't have a set format - they're different between different files
|
// Load other DUMB file. DUMB files don't have a set format - they're different between different files
|
||||||
std::vector<u8> Data(rDUMB.Size());
|
|
||||||
rDUMB.ReadBytes(Data.data(), Data.size());
|
|
||||||
|
|
||||||
CDependencyGroup *pGroup = new CDependencyGroup(pEntry);
|
CDependencyGroup *pGroup = new CDependencyGroup(pEntry);
|
||||||
u32 MaxIndex = (pEntry->Game() <= eEchoes ? Data.size() - 3 : Data.size() - 7);
|
|
||||||
CAssetID ID;
|
|
||||||
|
|
||||||
for (u32 iByte = 0; iByte < MaxIndex; iByte++)
|
std::list<CAssetID> DepList;
|
||||||
{
|
PerformCheating(rDUMB, pEntry->Game(), DepList);
|
||||||
if (pEntry->Game() <= eEchoes)
|
|
||||||
{
|
|
||||||
ID = ( (Data[iByte+0] << 24) |
|
|
||||||
(Data[iByte+1] << 16) |
|
|
||||||
(Data[iByte+2] << 8) |
|
|
||||||
(Data[iByte+3] << 0) );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ID = ( ((u64) Data[iByte+0] << 56) |
|
|
||||||
((u64) Data[iByte+1] << 48) |
|
|
||||||
((u64) Data[iByte+2] << 40) |
|
|
||||||
((u64) Data[iByte+3] << 32) |
|
|
||||||
((u64) Data[iByte+4] << 24) |
|
|
||||||
((u64) Data[iByte+5] << 16) |
|
|
||||||
((u64) Data[iByte+6] << 8) |
|
|
||||||
((u64) Data[iByte+7] << 0) );
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gpResourceStore->IsResourceRegistered(ID))
|
for (auto Iter = DepList.begin(); Iter != DepList.end(); Iter++)
|
||||||
pGroup->AddDependency(ID);
|
pGroup->AddDependency(*Iter);
|
||||||
}
|
|
||||||
|
|
||||||
return pGroup;
|
return pGroup;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,8 @@ class CUnsupportedFormatLoader
|
||||||
CDependencyGroup *mpGroup;
|
CDependencyGroup *mpGroup;
|
||||||
CUnsupportedFormatLoader() {}
|
CUnsupportedFormatLoader() {}
|
||||||
|
|
||||||
|
static void PerformCheating(IInputStream& rFile, EGame Game, std::list<CAssetID>& rAssetList);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static CAudioMacro* LoadCAUD(IInputStream& rCAUD, CResourceEntry *pEntry);
|
static CAudioMacro* LoadCAUD(IInputStream& rCAUD, CResourceEntry *pEntry);
|
||||||
static CDependencyGroup* LoadCSNG(IInputStream& rCSNG, CResourceEntry *pEntry);
|
static CDependencyGroup* LoadCSNG(IInputStream& rCSNG, CResourceEntry *pEntry);
|
||||||
|
|
|
@ -37,7 +37,7 @@ int main(int argc, char *argv[])
|
||||||
qInstallMessageHandler(QtLogRedirect);
|
qInstallMessageHandler(QtLogRedirect);
|
||||||
|
|
||||||
// Create editor resource store
|
// Create editor resource store
|
||||||
gpEditorStore = new CResourceStore(L"../resources/EditorResourceDB.rdb");
|
gpEditorStore = new CResourceStore("../resources/EditorResourceDB.rdb");
|
||||||
gpEditorStore->LoadResourceDatabase();
|
gpEditorStore->LoadResourceDatabase();
|
||||||
|
|
||||||
// Load templates
|
// Load templates
|
||||||
|
|
|
@ -102,7 +102,7 @@
|
||||||
<object ID="PLAT" template="Script/Platform.xml"/>
|
<object ID="PLAT" template="Script/Platform.xml"/>
|
||||||
<object ID="PNUT" template="Script/Peanut.xml"/>
|
<object ID="PNUT" template="Script/Peanut.xml"/>
|
||||||
<object ID="POIO" template="Script/PoiObject.xml"/>
|
<object ID="POIO" template="Script/PoiObject.xml"/>
|
||||||
<object ID="PRLA" template="Script/PickupRelay.xml"/>
|
<object ID="PRLA" template="Script/ProbabilityRelay.xml"/>
|
||||||
<object ID="PROJ" template="Script/Projectile.xml"/>
|
<object ID="PROJ" template="Script/Projectile.xml"/>
|
||||||
<object ID="PRSP" template="Script/PlayerRespawn.xml"/>
|
<object ID="PRSP" template="Script/PlayerRespawn.xml"/>
|
||||||
<object ID="PTOK" template="Script/PlayerToken.xml"/>
|
<object ID="PTOK" template="Script/PlayerToken.xml"/>
|
||||||
|
|
Loading…
Reference in New Issue