mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-28 16:09:43 +00:00
Updates to ESM4::Ammunition loading
This commit is contained in:
parent
efebb8efd8
commit
3d87bc185d
2 changed files with 77 additions and 49 deletions
|
@ -36,8 +36,6 @@ void ESM4::Ammunition::load(ESM4::Reader& reader)
|
||||||
mFormId = reader.hdr().record.id;
|
mFormId = reader.hdr().record.id;
|
||||||
reader.adjustFormId(mFormId);
|
reader.adjustFormId(mFormId);
|
||||||
mFlags = reader.hdr().record.flags;
|
mFlags = reader.hdr().record.flags;
|
||||||
std::uint32_t esmVer = reader.esmVersion();
|
|
||||||
bool isFONV = esmVer == ESM::VER_132 || esmVer == ESM::VER_133 || esmVer == ESM::VER_134;
|
|
||||||
|
|
||||||
while (reader.getSubRecordHeader())
|
while (reader.getSubRecordHeader())
|
||||||
{
|
{
|
||||||
|
@ -52,36 +50,52 @@ void ESM4::Ammunition::load(ESM4::Reader& reader)
|
||||||
break;
|
break;
|
||||||
case ESM4::SUB_DATA:
|
case ESM4::SUB_DATA:
|
||||||
{
|
{
|
||||||
// if (reader.esmVersion() == ESM::VER_094 || reader.esmVersion() == ESM::VER_170)
|
// FO3/FNV or TES4
|
||||||
if (subHdr.dataSize == 16) // FO3 has 13 bytes even though VER_094
|
if (subHdr.dataSize == 13 || subHdr.dataSize == 18)
|
||||||
{
|
{
|
||||||
FormId projectile;
|
reader.get(mData.mSpeed);
|
||||||
reader.get(projectile); // FIXME: add to mData
|
reader.get(mData.mFlags);
|
||||||
reader.get(mData.flags);
|
mData.mFlags &= 0xFF;
|
||||||
reader.get(mData.weight);
|
reader.get(mData.mValue);
|
||||||
float damageInFloat;
|
if (subHdr.dataSize == 13)
|
||||||
reader.get(damageInFloat); // FIXME: add to mData
|
reader.get(mData.mClipRounds);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
reader.get(mData.mWeight);
|
||||||
|
std::uint16_t damageInt;
|
||||||
|
reader.get(damageInt);
|
||||||
|
mData.mDamage = static_cast<float>(damageInt);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (isFONV || subHdr.dataSize == 13)
|
// TES5/SSE
|
||||||
|
else if (subHdr.dataSize == 16 || subHdr.dataSize == 20)
|
||||||
{
|
{
|
||||||
reader.get(mData.speed);
|
reader.getFormId(mData.mProjectile);
|
||||||
std::uint8_t flags;
|
reader.get(mData.mFlags);
|
||||||
reader.get(flags);
|
reader.get(mData.mDamage);
|
||||||
mData.flags = flags;
|
reader.get(mData.mValue);
|
||||||
static std::uint8_t dummy;
|
if (subHdr.dataSize == 20)
|
||||||
reader.get(dummy);
|
reader.get(mData.mWeight);
|
||||||
reader.get(dummy);
|
|
||||||
reader.get(dummy);
|
|
||||||
reader.get(mData.value);
|
|
||||||
reader.get(mData.clipRounds);
|
|
||||||
}
|
}
|
||||||
else // TES4
|
else
|
||||||
{
|
{
|
||||||
reader.get(mData.speed);
|
reader.skipSubRecordData();
|
||||||
reader.get(mData.flags);
|
}
|
||||||
reader.get(mData.value);
|
break;
|
||||||
reader.get(mData.weight);
|
}
|
||||||
reader.get(mData.damage);
|
case ESM4::SUB_DAT2:
|
||||||
|
{
|
||||||
|
if (subHdr.dataSize == 20)
|
||||||
|
{
|
||||||
|
reader.get(mData.mProjPerShot);
|
||||||
|
reader.getFormId(mData.mProjectile);
|
||||||
|
reader.get(mData.mWeight);
|
||||||
|
reader.getFormId(mData.mConsumedAmmo);
|
||||||
|
reader.get(mData.mConsumedPercentage);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
reader.skipSubRecordData();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -112,15 +126,28 @@ void ESM4::Ammunition::load(ESM4::Reader& reader)
|
||||||
case ESM4::SUB_ZNAM:
|
case ESM4::SUB_ZNAM:
|
||||||
reader.getFormId(mDropSound);
|
reader.getFormId(mDropSound);
|
||||||
break;
|
break;
|
||||||
|
case ESM4::SUB_ONAM:
|
||||||
|
reader.getLocalizedString(mShortName);
|
||||||
|
break;
|
||||||
|
case ESM4::SUB_QNAM: // FONV
|
||||||
|
reader.getLocalizedString(mAbbrev);
|
||||||
|
break;
|
||||||
|
case ESM4::SUB_RCIL:
|
||||||
|
{
|
||||||
|
FormId effect;
|
||||||
|
reader.getFormId(effect);
|
||||||
|
mAmmoEffects.push_back(effect);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ESM4::SUB_SCRI:
|
||||||
|
{
|
||||||
|
reader.getFormId(mScript);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case ESM4::SUB_MODT:
|
case ESM4::SUB_MODT:
|
||||||
case ESM4::SUB_OBND:
|
case ESM4::SUB_OBND:
|
||||||
case ESM4::SUB_KSIZ:
|
case ESM4::SUB_KSIZ:
|
||||||
case ESM4::SUB_KWDA:
|
case ESM4::SUB_KWDA:
|
||||||
case ESM4::SUB_ONAM: // FO3
|
|
||||||
case ESM4::SUB_DAT2: // FONV
|
|
||||||
case ESM4::SUB_QNAM: // FONV
|
|
||||||
case ESM4::SUB_RCIL: // FONV
|
|
||||||
case ESM4::SUB_SCRI: // FONV
|
|
||||||
{
|
{
|
||||||
// std::cout << "AMMO " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
|
// std::cout << "AMMO " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
|
||||||
reader.skipSubRecordData();
|
reader.skipSubRecordData();
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "formid.hpp"
|
#include "formid.hpp"
|
||||||
|
|
||||||
|
@ -39,24 +40,18 @@ namespace ESM4
|
||||||
|
|
||||||
struct Ammunition
|
struct Ammunition
|
||||||
{
|
{
|
||||||
struct Data // FIXME: TES5 projectile, damage (float)
|
struct Data
|
||||||
{
|
{
|
||||||
float speed;
|
float mSpeed{ 0.f };
|
||||||
std::uint32_t flags;
|
std::uint32_t mFlags{ 0u };
|
||||||
std::uint32_t value; // gold
|
std::uint32_t mValue{ 0u };
|
||||||
float weight;
|
float mWeight{ 0.f };
|
||||||
std::uint16_t damage;
|
float mDamage{ 0.f };
|
||||||
std::uint8_t clipRounds; // only in FO3/FONV
|
std::uint8_t mClipRounds{ 0u };
|
||||||
|
std::uint32_t mProjPerShot{ 0u };
|
||||||
Data()
|
FormId mProjectile;
|
||||||
: speed(0.f)
|
FormId mConsumedAmmo;
|
||||||
, flags(0)
|
float mConsumedPercentage{ 0.f };
|
||||||
, value(0)
|
|
||||||
, weight(0.f)
|
|
||||||
, damage(0)
|
|
||||||
, clipRounds(0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
FormId mFormId; // from the header
|
FormId mFormId; // from the header
|
||||||
|
@ -64,6 +59,8 @@ namespace ESM4
|
||||||
|
|
||||||
std::string mEditorId;
|
std::string mEditorId;
|
||||||
std::string mFullName;
|
std::string mFullName;
|
||||||
|
std::string mShortName;
|
||||||
|
std::string mAbbrev;
|
||||||
std::string mModel;
|
std::string mModel;
|
||||||
std::string mText;
|
std::string mText;
|
||||||
std::string mIcon; // inventory
|
std::string mIcon; // inventory
|
||||||
|
@ -77,6 +74,10 @@ namespace ESM4
|
||||||
std::uint16_t mEnchantmentPoints;
|
std::uint16_t mEnchantmentPoints;
|
||||||
FormId mEnchantment;
|
FormId mEnchantment;
|
||||||
|
|
||||||
|
std::vector<FormId> mAmmoEffects;
|
||||||
|
|
||||||
|
FormId mScript;
|
||||||
|
|
||||||
Data mData;
|
Data mData;
|
||||||
|
|
||||||
void load(ESM4::Reader& reader);
|
void load(ESM4::Reader& reader);
|
||||||
|
|
Loading…
Reference in a new issue