mirror of
https://github.com/AxioDL/PrimeWorldEditor.git
synced 2025-12-20 18:29:13 +00:00
Added area cooking support for MP2 and MP3. DKCR support has been started but is currently broken.
This commit is contained in:
@@ -1,71 +1,71 @@
|
||||
#include "CAnimationParameters.h"
|
||||
#include "CAnimSet.h"
|
||||
#include "CResCache.h"
|
||||
#include "CResourceInfo.h"
|
||||
#include <Common/Log.h>
|
||||
#include <iostream>
|
||||
|
||||
CAnimationParameters::CAnimationParameters()
|
||||
{
|
||||
mGame = ePrime;
|
||||
mpCharSet = nullptr;
|
||||
mNodeIndex = 0;
|
||||
mUnknown1 = 0;
|
||||
mUnknown2 = 0;
|
||||
mUnknown3 = 0;
|
||||
mUnknown4 = 0;
|
||||
}
|
||||
|
||||
CAnimationParameters::CAnimationParameters(IInputStream& SCLY, EGame Game)
|
||||
{
|
||||
mGame = Game;
|
||||
mpCharSet = nullptr;
|
||||
mNodeIndex = 0;
|
||||
mUnknown1 = 0;
|
||||
mUnknown2 = 0;
|
||||
mUnknown3 = 0;
|
||||
mUnknown4 = 0;
|
||||
|
||||
if (Game <= eEchoes)
|
||||
{
|
||||
u32 AnimSetID = SCLY.ReadLong();
|
||||
mCharacter = CResourceInfo(SCLY.ReadLong(), "ANCS");
|
||||
mNodeIndex = SCLY.ReadLong();
|
||||
mUnknown1 = SCLY.ReadLong();
|
||||
|
||||
mpCharSet = gResCache.GetResource(AnimSetID, "ANCS");
|
||||
}
|
||||
|
||||
else if (Game <= eCorruption)
|
||||
{
|
||||
u64 CharID = SCLY.ReadLongLong();
|
||||
mCharacter = CResourceInfo(SCLY.ReadLongLong(), "CHAR");
|
||||
mUnknown1 = SCLY.ReadLong();
|
||||
|
||||
mpCharSet = gResCache.GetResource(CharID, "CHAR");
|
||||
}
|
||||
|
||||
else if (Game == eReturns)
|
||||
{
|
||||
SCLY.Seek(-6, SEEK_CUR);
|
||||
u32 Offset = SCLY.Tell();
|
||||
u32 PropID = SCLY.ReadLong();
|
||||
SCLY.Seek(2, SEEK_CUR);
|
||||
u8 Flags = SCLY.ReadByte();
|
||||
|
||||
mUnknown1 = (u32) SCLY.ReadByte();
|
||||
mUnknown1 &= 0xFF;
|
||||
|
||||
if (mUnknown1 == 0x60)
|
||||
// 0x80 - CharacterAnimationSet is empty.
|
||||
if (Flags & 0x80)
|
||||
{
|
||||
u64 charID = SCLY.ReadLongLong();
|
||||
mUnknown2 = SCLY.ReadLong();
|
||||
mUnknown3 = SCLY.ReadLong();
|
||||
mUnknown4 = SCLY.ReadLong();
|
||||
|
||||
mpCharSet = gResCache.GetResource(charID, "CHAR");
|
||||
mUnknown1 = -1;
|
||||
mUnknown2 = 0;
|
||||
mUnknown3 = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
else if (mUnknown1 != 0x80)
|
||||
mCharacter = CResourceInfo(SCLY.ReadLongLong(), "CHAR");
|
||||
|
||||
// 0x20 - Default Anim is present
|
||||
if (Flags & 0x20)
|
||||
mUnknown1 = SCLY.ReadLong();
|
||||
else
|
||||
mUnknown1 = -1;
|
||||
|
||||
// 0x40 - Two-value struct is present
|
||||
if (Flags & 0x40)
|
||||
{
|
||||
Log::FileError(SCLY.GetSourceString(), Offset,
|
||||
"Unexpected AnimationParameters byte: " + TString::HexString(mUnknown1, true, true, 2) + " (property " + TString::HexString(PropID, true, true, 8) + ")");
|
||||
mUnknown2 = SCLY.ReadLong();
|
||||
mUnknown3 = SCLY.ReadLong();
|
||||
}
|
||||
else
|
||||
{
|
||||
mUnknown2 = 0;
|
||||
mUnknown3 = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -74,9 +74,9 @@ void CAnimationParameters::Write(IOutputStream& rSCLY)
|
||||
{
|
||||
if (mGame <= eEchoes)
|
||||
{
|
||||
if (mpCharSet)
|
||||
if (mCharacter.IsValid())
|
||||
{
|
||||
rSCLY.WriteLong(AnimSet()->ResID().ToLong());
|
||||
rSCLY.WriteLong(mCharacter.ID().ToLong());
|
||||
rSCLY.WriteLong(mNodeIndex);
|
||||
rSCLY.WriteLong(mUnknown1);
|
||||
}
|
||||
@@ -87,26 +87,72 @@ void CAnimationParameters::Write(IOutputStream& rSCLY)
|
||||
rSCLY.WriteLong(0xFFFFFFFF);
|
||||
}
|
||||
}
|
||||
|
||||
else if (mGame <= eCorruption)
|
||||
{
|
||||
if (mCharacter.IsValid())
|
||||
{
|
||||
rSCLY.WriteLongLong(mCharacter.ID().ToLongLong());
|
||||
rSCLY.WriteLong(mUnknown1);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
rSCLY.WriteLongLong(CUniqueID::skInvalidID64.ToLongLong());
|
||||
rSCLY.WriteLong(0xFFFFFFFF);
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
if (!mCharacter.IsValid())
|
||||
rSCLY.WriteByte((u8) 0x80);
|
||||
|
||||
else
|
||||
{
|
||||
u8 Flag = 0;
|
||||
if (mUnknown1 != -1) Flag |= 0x20;
|
||||
if (mUnknown2 != 0 || mUnknown3 != 0) Flag |= 0x40;
|
||||
|
||||
rSCLY.WriteByte(Flag);
|
||||
rSCLY.WriteLongLong(mCharacter.ID().ToLongLong());
|
||||
|
||||
if (Flag & 0x20)
|
||||
rSCLY.WriteLong(mUnknown1);
|
||||
|
||||
if (Flag & 0x40)
|
||||
{
|
||||
rSCLY.WriteLong(mUnknown2);
|
||||
rSCLY.WriteLong(mUnknown3);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CModel* CAnimationParameters::GetCurrentModel(s32 NodeIndex /*= -1*/)
|
||||
{
|
||||
if (!mpCharSet) return nullptr;
|
||||
if (mpCharSet->Type() != eAnimSet) return nullptr;
|
||||
if (!mCharacter.IsValid()) return nullptr;
|
||||
|
||||
CAnimSet *pSet = (CAnimSet*) mCharacter.Load();
|
||||
if (!pSet) return nullptr;
|
||||
if (pSet->Type() != eAnimSet) return nullptr;
|
||||
if (NodeIndex == -1) NodeIndex = mNodeIndex;
|
||||
|
||||
if (mpCharSet->getNodeCount() <= (u32) NodeIndex) return nullptr;
|
||||
return mpCharSet->getNodeModel(NodeIndex);
|
||||
if (pSet->getNodeCount() <= (u32) NodeIndex) return nullptr;
|
||||
return pSet->getNodeModel(NodeIndex);
|
||||
}
|
||||
|
||||
TString CAnimationParameters::GetCurrentCharacterName(s32 NodeIndex /*= -1*/)
|
||||
{
|
||||
if (!mpCharSet) return "";
|
||||
if (mpCharSet->Type() != eAnimSet) return "";
|
||||
if (!mCharacter.IsValid()) return "";
|
||||
|
||||
CAnimSet *pSet = (CAnimSet*) mCharacter.Load();
|
||||
if (!pSet) return "";
|
||||
if (pSet->Type() != eAnimSet) return "";
|
||||
if (NodeIndex == -1) NodeIndex = mNodeIndex;
|
||||
|
||||
if (mpCharSet->getNodeCount() <= (u32) NodeIndex) return "";
|
||||
return mpCharSet->getNodeName((u32) NodeIndex);
|
||||
if (pSet->getNodeCount() <= (u32) NodeIndex) return "";
|
||||
return pSet->getNodeName((u32) NodeIndex);
|
||||
}
|
||||
|
||||
// ************ GETTERS ************
|
||||
@@ -117,7 +163,7 @@ EGame CAnimationParameters::Version()
|
||||
|
||||
CAnimSet* CAnimationParameters::AnimSet()
|
||||
{
|
||||
return mpCharSet;
|
||||
return (CAnimSet*) mCharacter.Load();
|
||||
}
|
||||
|
||||
u32 CAnimationParameters::CharacterIndex()
|
||||
@@ -132,21 +178,20 @@ u32 CAnimationParameters::Unknown(u32 Index)
|
||||
case 0: return mUnknown1;
|
||||
case 1: return mUnknown2;
|
||||
case 2: return mUnknown3;
|
||||
case 3: return mUnknown4;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// ************ SETTERS ************
|
||||
void CAnimationParameters::SetResource(CResource *pRes)
|
||||
void CAnimationParameters::SetResource(CResourceInfo Res)
|
||||
{
|
||||
if (!pRes || (pRes->Type() == eAnimSet) || (pRes->Type() == eCharacter))
|
||||
if (Res.Type() == "ANCS" || Res.Type() == "CHAR")
|
||||
{
|
||||
mpCharSet = pRes;
|
||||
mCharacter = Res;
|
||||
mNodeIndex = 0;
|
||||
}
|
||||
else
|
||||
Log::Error("Resource with invalid type passed to CAnimationParameters: " + pRes->Source());
|
||||
Log::Error("Resource with invalid type passed to CAnimationParameters: " + Res.ToString());
|
||||
}
|
||||
|
||||
void CAnimationParameters::SetNodeIndex(u32 Index)
|
||||
@@ -161,6 +206,5 @@ void CAnimationParameters::SetUnknown(u32 Index, u32 Value)
|
||||
case 0: mUnknown1 = Value;
|
||||
case 1: mUnknown2 = Value;
|
||||
case 2: mUnknown3 = Value;
|
||||
case 3: mUnknown4 = Value;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user