#include "ANCS.hpp" namespace Retro { namespace DNAMP1 { void ANCS::CharacterSet::CharacterInfo::PASDatabase::AnimState::ParmInfo::read(Athena::io::IStreamReader& reader) { parmType = reader.readUint32(); unk1 = reader.readUint32(); unk2 = reader.readFloat(); switch(DataType(parmType)) { case DataType::DTInt32: parmVals[0].int32 = reader.readInt32(); parmVals[1].int32 = reader.readInt32(); break; case DataType::DTUInt32: case DataType::DTEnum: parmVals[0].uint32 = reader.readUint32(); parmVals[1].uint32 = reader.readUint32(); break; case DataType::DTFloat: parmVals[0].float32 = reader.readFloat(); parmVals[1].float32 = reader.readFloat(); break; case DataType::DTBool: parmVals[0].bool1 = reader.readBool(); parmVals[1].bool1 = reader.readBool(); break; } } void ANCS::CharacterSet::CharacterInfo::PASDatabase::AnimState::ParmInfo::write(Athena::io::IStreamWriter& writer) const { writer.writeUint32(parmType); writer.writeUint32(unk1); writer.writeFloat(unk2); switch(DataType(parmType)) { case DataType::DTInt32: writer.writeInt32(parmVals[0].int32); writer.writeInt32(parmVals[1].int32); break; case DataType::DTUInt32: case DataType::DTEnum: writer.writeUint32(parmVals[0].uint32); writer.writeUint32(parmVals[0].uint32); break; case DataType::DTFloat: writer.writeFloat(parmVals[0].float32); writer.writeFloat(parmVals[0].float32); break; case DataType::DTBool: writer.writeBool(parmVals[0].bool1); writer.writeBool(parmVals[0].bool1); break; } } void ANCS::CharacterSet::CharacterInfo::PASDatabase::AnimState::ParmInfo::fromYAML(Athena::io::YAMLDocReader& reader) { parmType = reader.readUint32("parmType"); unk1 = reader.readUint32("unk1"); unk2 = reader.readFloat("unk2"); reader.enterSubVector("parmVals"); switch(DataType(parmType)) { case DataType::DTInt32: parmVals[0].int32 = reader.readInt32(nullptr); parmVals[1].int32 = reader.readInt32(nullptr); break; case DataType::DTUInt32: case DataType::DTEnum: parmVals[0].uint32 = reader.readUint32(nullptr); parmVals[1].uint32 = reader.readUint32(nullptr); break; case DataType::DTFloat: parmVals[0].float32 = reader.readFloat(nullptr); parmVals[1].float32 = reader.readFloat(nullptr); break; case DataType::DTBool: parmVals[0].bool1 = reader.readBool(nullptr); parmVals[1].bool1 = reader.readBool(nullptr); break; default: break; } reader.leaveSubVector(); } void ANCS::CharacterSet::CharacterInfo::PASDatabase::AnimState::ParmInfo::toYAML(Athena::io::YAMLDocWriter& writer) const { writer.writeUint32("parmType", parmType); writer.writeUint32("unk1", unk1); writer.writeFloat("unk2", unk2); writer.enterSubVector("parmVals"); switch(DataType(parmType)) { case DataType::DTInt32: writer.writeInt32(nullptr, parmVals[0].int32); writer.writeInt32(nullptr, parmVals[1].int32); break; case DataType::DTUInt32: case DataType::DTEnum: writer.writeUint32(nullptr, parmVals[0].uint32); writer.writeUint32(nullptr, parmVals[0].uint32); break; case DataType::DTFloat: writer.writeFloat(nullptr, parmVals[0].float32); writer.writeFloat(nullptr, parmVals[0].float32); break; case DataType::DTBool: writer.writeBool(nullptr, parmVals[0].bool1); writer.writeBool(nullptr, parmVals[0].bool1); break; } writer.leaveSubVector(); } void ANCS::CharacterSet::CharacterInfo::PASDatabase::AnimState::read(Athena::io::IStreamReader& reader) { id = reader.readUint32(); atUint32 parmInfoCount = reader.readUint32(); atUint32 animInfoCount = reader.readUint32(); parmInfos.reserve(parmInfoCount); for (int i=0 ; i 5) { atUint32 elscCount = reader.readUint32(); partResData.elsc.clear(); partResData.elsc.reserve(elscCount); for (int i=0 ; i 1) { atUint32 aabbCount = reader.readUint32(); animAABBs.reserve(aabbCount); for (int i=0 ; i 2) { atUint32 effectCount = reader.readUint32(); effects.reserve(effectCount); for (int i=0 ; i 3) { cmdlOverride.read(reader); cskrOverride.read(reader); } animIdxs.clear(); if (sectionCount > 4) { atUint32 aidxCount = reader.readUint32(); animIdxs.reserve(aidxCount); for (int i=0 ; i 5) { writer.writeUint32(partResData.elsc.size()); for (const UniqueID32& id : partResData.elsc) id.write(writer); } writer.writeUint32(unk1); if (sectionCount > 1) { writer.writeUint32(animAABBs.size()); for (const ActionAABB& aabb : animAABBs) aabb.write(writer); } if (sectionCount > 2) { writer.writeUint32(effects.size()); for (const Effect& effect : effects) effect.write(writer); } if (sectionCount > 3) { cmdlOverride.write(writer); cskrOverride.write(writer); } if (sectionCount > 4) { writer.writeUint32(animIdxs.size()); for (atUint32 idx : animIdxs) writer.writeUint32(idx); } } void ANCS::CharacterSet::CharacterInfo::fromYAML(Athena::io::YAMLDocReader& reader) { idx = reader.readUint32("idx"); atUint16 sectionCount = reader.readUint16("sectionCount"); name = reader.readString("name"); reader.enterSubRecord("cmdl"); cmdl.fromYAML(reader); reader.leaveSubRecord(); reader.enterSubRecord("cskr"); cskr.fromYAML(reader); reader.leaveSubRecord(); reader.enterSubRecord("cinf"); cinf.fromYAML(reader); reader.leaveSubRecord(); atUint32 animationCount = reader.readUint32("animationCount"); animations.reserve(animationCount); reader.enterSubVector("animations"); for (int i=0 ; i 5) { atUint32 elscCount = reader.readUint32("elscCount"); partResData.elsc.clear(); partResData.elsc.reserve(elscCount); reader.enterSubVector("elsc"); for (int i=0 ; i 1) { atUint32 aabbCount = reader.readUint32("animAABBCount"); animAABBs.reserve(aabbCount); reader.enterSubVector("animAABBs"); for (int i=0 ; i 2) { atUint32 effectCount = reader.readUint32("effectCount"); effects.reserve(effectCount); reader.enterSubVector("effects"); for (int i=0 ; i 3) { reader.enterSubRecord("cmdlOverride"); cmdlOverride.fromYAML(reader); reader.leaveSubRecord(); reader.enterSubRecord("cskrOverride"); cskrOverride.fromYAML(reader); reader.leaveSubRecord(); } animIdxs.clear(); if (sectionCount > 4) { atUint32 animIdxCount = reader.readUint32("animIdxCount"); animIdxs.reserve(animIdxCount); reader.enterSubVector("animIdxs"); for (int i=0 ; i 5) { writer.writeUint32("elscCount", partResData.elsc.size()); writer.enterSubVector("elsc"); for (const UniqueID32& id : partResData.elsc) { writer.enterSubRecord(nullptr); id.toYAML(writer); writer.leaveSubRecord(); } writer.leaveSubVector(); } writer.writeUint32("unk1", unk1); if (sectionCount > 1) { writer.writeUint32("animAABBCount", animAABBs.size()); writer.enterSubVector("animAABBs"); for (const ActionAABB& aabb : animAABBs) { writer.enterSubRecord(nullptr); aabb.toYAML(writer); writer.leaveSubRecord(); } writer.leaveSubVector(); } if (sectionCount > 2) { writer.writeUint32("effectCount", effects.size()); writer.enterSubVector("effects"); for (const Effect& effect : effects) { writer.enterSubRecord(nullptr); effect.toYAML(writer); writer.leaveSubRecord(); } writer.leaveSubVector(); } if (sectionCount > 3) { writer.enterSubRecord("cmdlOverride"); cmdlOverride.toYAML(writer); writer.leaveSubRecord(); writer.enterSubRecord("cskrOverride"); cskrOverride.toYAML(writer); writer.leaveSubRecord(); } if (sectionCount > 4) { writer.writeUint32("animIdxCount", animIdxs.size()); writer.enterSubVector("animIdxs"); for (atUint32 idx : animIdxs) writer.writeUint32(nullptr, idx); writer.leaveSubVector(); } } void ANCS::AnimationSet::MetaAnimFactory::read(Athena::io::IStreamReader& reader) { IMetaAnim::Type type(IMetaAnim::Type(reader.readUint32())); switch (type) { case IMetaAnim::MAPrimitive: m_anim.reset(new struct MetaAnimPrimitive); m_anim->read(reader); break; case IMetaAnim::MABlend: m_anim.reset(new struct MetaAnimBlend); m_anim->read(reader); break; case IMetaAnim::MAPhaseBlend: m_anim.reset(new struct MetaAnimPhaseBlend); m_anim->read(reader); break; case IMetaAnim::MARandom: m_anim.reset(new struct MetaAnimRandom); m_anim->read(reader); break; case IMetaAnim::MASequence: m_anim.reset(new struct MetaAnimSequence); m_anim->read(reader); break; default: m_anim.reset(nullptr); break; } } void ANCS::AnimationSet::MetaAnimFactory::write(Athena::io::IStreamWriter& writer) const { if (!m_anim) return; writer.writeInt32(m_anim->m_type); m_anim->write(writer); } void ANCS::AnimationSet::MetaAnimFactory::fromYAML(Athena::io::YAMLDocReader& reader) { std::string type = reader.readString("type"); std::transform(type.begin(), type.end(), type.begin(), tolower); if (!type.compare("primitive")) { m_anim.reset(new struct MetaAnimPrimitive); m_anim->fromYAML(reader); } else if (!type.compare("blend")) { m_anim.reset(new struct MetaAnimBlend); m_anim->fromYAML(reader); } else if (!type.compare("phaseblend")) { m_anim.reset(new struct MetaAnimPhaseBlend); m_anim->fromYAML(reader); } else if (!type.compare("random")) { m_anim.reset(new struct MetaAnimRandom); m_anim->fromYAML(reader); } else if (!type.compare("sequence")) { m_anim.reset(new struct MetaAnimSequence); m_anim->fromYAML(reader); } else { m_anim.reset(nullptr); } } void ANCS::AnimationSet::MetaTransFactory::read(Athena::io::IStreamReader& reader) { IMetaTrans::Type type(IMetaTrans::Type(reader.readUint32())); switch (type) { case IMetaTrans::MTMetaAnim: m_trans.reset(new struct MetaTransMetaAnim); m_trans->read(reader); break; case IMetaTrans::MTTrans: m_trans.reset(new struct MetaTransTrans); m_trans->read(reader); break; case IMetaTrans::MTPhaseTrans: m_trans.reset(new struct MetaTransPhaseTrans); m_trans->read(reader); break; case IMetaTrans::MTNoTrans: default: m_trans.reset(nullptr); break; } } void ANCS::AnimationSet::MetaTransFactory::write(Athena::io::IStreamWriter& writer) const { if (!m_trans) { writer.writeInt32(IMetaTrans::MTNoTrans); return; } writer.writeInt32(m_trans->m_type); m_trans->write(writer); } void ANCS::AnimationSet::MetaTransFactory::fromYAML(Athena::io::YAMLDocReader& reader) { std::string type = reader.readString("type"); std::transform(type.begin(), type.end(), type.begin(), tolower); if (!type.compare("metaanim")) { m_trans.reset(new struct MetaTransMetaAnim); m_trans->fromYAML(reader); } else if (!type.compare("trans")) { m_trans.reset(new struct MetaTransTrans); m_trans->fromYAML(reader); } else if (!type.compare("phasetrans")) { m_trans.reset(new struct MetaTransPhaseTrans); m_trans->fromYAML(reader); } else { m_trans.reset(nullptr); } } void ANCS::AnimationSet::MetaTransFactory::toYAML(Athena::io::YAMLDocWriter& writer) const { if (!m_trans) { writer.writeString("type", "NoTrans"); return; } writer.writeString("type", m_trans->m_typeStr?m_trans->m_typeStr:"NoTrans"); m_trans->toYAML(writer); } void ANCS::AnimationSet::MetaAnimFactory::toYAML(Athena::io::YAMLDocWriter& writer) const { if (!m_anim) return; writer.writeString("type", m_anim->m_typeStr); m_anim->toYAML(writer); } void ANCS::AnimationSet::read(Athena::io::IStreamReader& reader) { atUint16 sectionCount = reader.readUint16(); atUint32 animationCount = reader.readUint32(); animations.reserve(animationCount); for (int i=0 ; i 1) { atUint32 additiveAnimCount = reader.readUint32(); additiveAnims.reserve(additiveAnimCount); for (int i=0 ; i 2) { atUint32 halfTransitionCount = reader.readUint32(); halfTransitions.reserve(halfTransitionCount); for (int i=0 ; i 3) { atUint32 animResourcesCount = reader.readUint32(); animResources.reserve(animResourcesCount); for (int i=0 ; i 1) { writer.writeUint32(additiveAnims.size()); for (const auto& aa : additiveAnims) aa.write(writer); writer.writeFloat(floatA); writer.writeFloat(floatB); } if (sectionCount > 2) { writer.writeUint32(halfTransitions.size()); for (const auto& ht : halfTransitions) ht.write(writer); } if (sectionCount > 3) { writer.writeUint32(animResources.size()); for (const auto& ar : animResources) ar.write(writer); } } void ANCS::AnimationSet::fromYAML(Athena::io::YAMLDocReader& reader) { atUint16 sectionCount = reader.readUint16("sectionCount"); atUint32 animationCount = reader.readUint32("animationCount"); animations.reserve(animationCount); reader.enterSubVector("animations"); for (int i=0 ; i 1) { atUint32 additiveAnimCount = reader.readUint32("additiveAnimCount"); additiveAnims.reserve(additiveAnimCount); reader.enterSubVector("additiveAnims"); for (int i=0 ; i 2) { atUint32 halfTransitionCount = reader.readUint32("halfTransitionCount"); halfTransitions.reserve(halfTransitionCount); reader.enterSubVector("halfTransitions"); for (int i=0 ; i 3) { atUint32 animResourcesCount = reader.readUint32("animResourcesCount"); animResources.reserve(animResourcesCount); reader.enterSubVector("animResources"); for (int i=0 ; i 1) { writer.writeUint32("additiveAnimCount", additiveAnims.size()); writer.enterSubVector("additiveAnims"); for (const auto& aa : additiveAnims) { writer.enterSubRecord(nullptr); aa.toYAML(writer); writer.leaveSubRecord(); } writer.leaveSubVector(); writer.writeFloat("floatA", floatA); writer.writeFloat("floatB", floatB); } if (sectionCount > 2) { writer.writeUint32("halfTransitionCount", halfTransitions.size()); writer.enterSubVector("halfTransitions"); for (const auto& ht : halfTransitions) { writer.enterSubRecord(nullptr); ht.toYAML(writer); writer.leaveSubRecord(); } writer.leaveSubVector(); } if (sectionCount > 3) { writer.writeUint32("animResourcesCount", animResources.size()); writer.enterSubVector("animResources"); for (const auto& ar : animResources) { writer.enterSubRecord(nullptr); ar.toYAML(writer); writer.leaveSubRecord(); } writer.leaveSubVector(); } } } }