Skip to content

Commit f0e31e6

Browse files
committed
Merge branch 'refnumhitman' into 'master'
Replace ActorIds with RefNums Closes #7602 See merge request OpenMW/openmw!4323
2 parents 4f72fd8 + d3b4ea0 commit f0e31e6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+614
-724
lines changed

apps/components_tests/esm3/testsaveload.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -524,7 +524,7 @@ namespace ESM
524524
record.mData.mY = 2;
525525
record.mData.mZ = 3;
526526
record.mData.mDuration = 4;
527-
record.mTargetActorId = 5;
527+
record.mTargetActor = RefNum{ .mIndex = 5, .mContentFile = -1 };
528528
record.mTargetId = generateRandomRefId(32);
529529
record.mCellId = generateRandomString(257);
530530
record.mRemainingDuration = 6;
@@ -540,7 +540,10 @@ namespace ESM
540540
EXPECT_EQ(result.mData.mDuration, record.mRemainingDuration);
541541
else
542542
EXPECT_EQ(result.mData.mDuration, record.mData.mDuration);
543-
EXPECT_EQ(result.mTargetActorId, record.mTargetActorId);
543+
if (GetParam() > MaxActorIdSaveGameFormatVersion)
544+
{
545+
EXPECT_EQ(result.mTargetActor, record.mTargetActor);
546+
}
544547
EXPECT_EQ(result.mTargetId, record.mTargetId);
545548
EXPECT_EQ(result.mCellId, record.mCellId);
546549
EXPECT_EQ(result.mRemainingDuration, record.mRemainingDuration);

apps/essimporter/converter.cpp

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ namespace
6464
refId = indexedRefId.substr(0, indexedRefId.size() - 8);
6565
}
6666

67-
int convertActorId(const std::string& indexedRefId, ESSImport::Context& context)
67+
ESM::RefNum convertActorId(const std::string& indexedRefId, ESSImport::Context& context)
6868
{
6969
if (isIndexedRefId(indexedRefId))
7070
{
@@ -73,16 +73,15 @@ namespace
7373
splitIndexedRefId(indexedRefId, refIndex, refId);
7474

7575
auto it = context.mActorIdMap.find(std::make_pair(refIndex, ESM::RefId::stringRefId(refId)));
76-
if (it == context.mActorIdMap.end())
77-
return -1;
78-
return it->second;
76+
if (it != context.mActorIdMap.end())
77+
return it->second;
7978
}
8079
else if (indexedRefId == "PlayerSaveGame")
8180
{
82-
return context.mPlayer.mObject.mCreatureStats.mActorId;
81+
return context.mPlayer.mObject.mRef.mRefNum;
8382
}
8483

85-
return -1;
84+
return {};
8685
}
8786
}
8887

@@ -114,7 +113,7 @@ namespace ESSImport
114113
mGlobalMapImage->scaleImage(maph.size * 2, maph.size * 2, 1, GL_UNSIGNED_BYTE);
115114
}
116115

117-
void ConvertFMAP::write(ESM::ESMWriter& esm)
116+
void ConvertFMAP::write(ESM::ESMWriter& esm) const
118117
{
119118
int numcells = mGlobalMapImage->s() / 18; // NB truncating, doesn't divide perfectly
120119
// with the 512x512 map the game has by default
@@ -314,7 +313,7 @@ namespace ESSImport
314313
mIntCells[cell.mName] = std::move(newcell);
315314
}
316315

317-
void ConvertCell::writeCell(const Cell& cell, ESM::ESMWriter& esm)
316+
void ConvertCell::writeCell(const Cell& cell, ESM::ESMWriter& esm) const
318317
{
319318
ESM::Cell esmcell = cell.mCell;
320319
esm.startRecord(ESM::REC_CSTA);
@@ -378,9 +377,8 @@ namespace ESSImport
378377
convertNPCC(npccIt->second, objstate);
379378
convertCellRef(cellref, objstate);
380379

381-
objstate.mCreatureStats.mActorId = mContext->generateActorId();
382-
mContext->mActorIdMap.insert(
383-
std::make_pair(std::make_pair(refIndex, out.mRefID), objstate.mCreatureStats.mActorId));
380+
mContext->generateRefNum(objstate.mRef.mRefNum);
381+
mContext->mActorIdMap.emplace(std::make_pair(refIndex, out.mRefID), objstate.mRef.mRefNum);
384382

385383
esm.writeHNT("OBJE", ESM::REC_NPC_);
386384
objstate.save(esm);
@@ -419,9 +417,8 @@ namespace ESSImport
419417
convertCREC(crecIt->second, objstate);
420418
convertCellRef(cellref, objstate);
421419

422-
objstate.mCreatureStats.mActorId = mContext->generateActorId();
423-
mContext->mActorIdMap.insert(
424-
std::make_pair(std::make_pair(refIndex, out.mRefID), objstate.mCreatureStats.mActorId));
420+
mContext->generateRefNum(objstate.mRef.mRefNum);
421+
mContext->mActorIdMap.emplace(std::make_pair(refIndex, out.mRefID), objstate.mRef.mRefNum);
425422

426423
esm.writeHNT("OBJE", ESM::REC_CREA);
427424
objstate.save(esm);
@@ -437,7 +434,7 @@ namespace ESSImport
437434
esm.endRecord(ESM::REC_CSTA);
438435
}
439436

440-
void ConvertCell::write(ESM::ESMWriter& esm)
437+
void ConvertCell::write(ESM::ESMWriter& esm) const
441438
{
442439
for (const auto& cell : mIntCells)
443440
writeCell(cell.second, esm);
@@ -458,7 +455,7 @@ namespace ESSImport
458455
mProj.load(esm);
459456
}
460457

461-
void ConvertPROJ::write(ESM::ESMWriter& esm)
458+
void ConvertPROJ::write(ESM::ESMWriter& esm) const
462459
{
463460
for (const PROJ::PNAM& pnam : mProj.mProjectiles)
464461
{
@@ -501,7 +498,7 @@ namespace ESSImport
501498
}
502499
}
503500

504-
void ConvertPROJ::convertBaseState(ESM::BaseProjectileState& base, const PROJ::PNAM& pnam)
501+
void ConvertPROJ::convertBaseState(ESM::BaseProjectileState& base, const PROJ::PNAM& pnam) const
505502
{
506503
base.mId = ESM::RefId::stringRefId(pnam.mArrowId.toString());
507504
base.mPosition = pnam.mPosition;
@@ -510,7 +507,7 @@ namespace ESSImport
510507
orient.makeRotate(osg::Vec3f(0, 1, 0), pnam.mVelocity);
511508
base.mOrientation = orient;
512509

513-
base.mActorId = convertActorId(pnam.mActorId.toString(), *mContext);
510+
base.mCaster = convertActorId(pnam.mActorId.toString(), *mContext);
514511
}
515512

516513
void ConvertSPLM::read(ESM::ESMReader& esm)
@@ -519,7 +516,7 @@ namespace ESSImport
519516
mContext->mActiveSpells = mSPLM.mActiveSpells;
520517
}
521518

522-
void ConvertSPLM::write(ESM::ESMWriter& esm)
519+
void ConvertSPLM::write(ESM::ESMWriter& esm) const
523520
{
524521
std::cerr << "Warning: Skipped active spell conversion (not implemented)" << std::endl;
525522
}

apps/essimporter/converter.hpp

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ namespace ESSImport
5454
{
5555
public:
5656
/// @return the order for writing this converter's records to the output file, in relation to other converters
57-
virtual int getStage() { return 1; }
57+
virtual int getStage() const { return 1; }
5858

5959
virtual ~Converter() = default;
6060

@@ -66,7 +66,7 @@ namespace ESSImport
6666

6767
/// Called after the input file has been read in completely, which may be necessary
6868
/// if the conversion process relies on information in other records
69-
virtual void write(ESM::ESMWriter& esm) {}
69+
virtual void write(ESM::ESMWriter& esm) const {}
7070

7171
protected:
7272
Context* mContext;
@@ -77,7 +77,7 @@ namespace ESSImport
7777
class DefaultConverter : public Converter
7878
{
7979
public:
80-
int getStage() override { return 0; }
80+
int getStage() const override { return 0; }
8181

8282
void read(ESM::ESMReader& esm) override
8383
{
@@ -88,7 +88,7 @@ namespace ESSImport
8888
mRecords[record.mId] = record;
8989
}
9090

91-
void write(ESM::ESMWriter& esm) override
91+
void write(ESM::ESMWriter& esm) const override
9292
{
9393
for (auto it = mRecords.begin(); it != mRecords.end(); ++it)
9494
{
@@ -257,7 +257,7 @@ namespace ESSImport
257257
}
258258
}
259259
}
260-
void write(ESM::ESMWriter& esm) override
260+
void write(ESM::ESMWriter& esm) const override
261261
{
262262
esm.startRecord(ESM::REC_ASPL);
263263
esm.writeHNRefId("ID__", mSelectedSpell);
@@ -286,7 +286,7 @@ namespace ESSImport
286286
convertPCDT(pcdt, mContext->mPlayer, mContext->mDialogueState.mKnownTopics, mFirstPersonCam,
287287
mTeleportingEnabled, mLevitationEnabled, mContext->mControlsState);
288288
}
289-
void write(ESM::ESMWriter& esm) override
289+
void write(ESM::ESMWriter& esm) const override
290290
{
291291
esm.startRecord(ESM::REC_ENAB);
292292
esm.writeHNT("TELE", mTeleportingEnabled);
@@ -331,7 +331,7 @@ namespace ESSImport
331331
{
332332
public:
333333
void read(ESM::ESMReader& esm) override;
334-
void write(ESM::ESMWriter& esm) override;
334+
void write(ESM::ESMWriter& esm) const override;
335335

336336
private:
337337
osg::ref_ptr<osg::Image> mGlobalMapImage;
@@ -341,7 +341,7 @@ namespace ESSImport
341341
{
342342
public:
343343
void read(ESM::ESMReader& esm) override;
344-
void write(ESM::ESMWriter& esm) override;
344+
void write(ESM::ESMWriter& esm) const override;
345345

346346
private:
347347
struct Cell
@@ -356,7 +356,7 @@ namespace ESSImport
356356

357357
std::vector<ESM::CustomMarker> mMarkers;
358358

359-
void writeCell(const Cell& cell, ESM::ESMWriter& esm);
359+
void writeCell(const Cell& cell, ESM::ESMWriter& esm) const;
360360
};
361361

362362
class ConvertKLST : public Converter
@@ -371,7 +371,7 @@ namespace ESSImport
371371
mContext->mPlayer.mObject.mNpcStats.mWerewolfKills = klst.mWerewolfKills;
372372
}
373373

374-
void write(ESM::ESMWriter& esm) override
374+
void write(ESM::ESMWriter& esm) const override
375375
{
376376
esm.startRecord(ESM::REC_DCOU);
377377
for (const auto& [id, count] : mKillCounter)
@@ -428,7 +428,7 @@ namespace ESSImport
428428
}
429429
}
430430
}
431-
void write(ESM::ESMWriter& esm) override
431+
void write(ESM::ESMWriter& esm) const override
432432
{
433433
ESM::StolenItems items;
434434
for (auto it = mStolenItems.begin(); it != mStolenItems.end(); ++it)
@@ -486,7 +486,7 @@ namespace ESSImport
486486
if (dial.mIndex > 0)
487487
mDials[id] = dial;
488488
}
489-
void write(ESM::ESMWriter& esm) override
489+
void write(ESM::ESMWriter& esm) const override
490490
{
491491
for (auto it = mDials.begin(); it != mDials.end(); ++it)
492492
{
@@ -539,7 +539,7 @@ namespace ESSImport
539539
mHasGame = true;
540540
}
541541

542-
int validateWeatherID(int weatherID)
542+
int validateWeatherID(int weatherID) const
543543
{
544544
if (weatherID >= -1 && weatherID < 10)
545545
{
@@ -551,7 +551,7 @@ namespace ESSImport
551551
}
552552
}
553553

554-
void write(ESM::ESMWriter& esm) override
554+
void write(ESM::ESMWriter& esm) const override
555555
{
556556
if (!mHasGame)
557557
return;
@@ -586,7 +586,7 @@ namespace ESSImport
586586
convertSCPT(script, out);
587587
mScripts.push_back(std::move(out));
588588
}
589-
void write(ESM::ESMWriter& esm) override
589+
void write(ESM::ESMWriter& esm) const override
590590
{
591591
for (const auto& script : mScripts)
592592
{
@@ -604,20 +604,20 @@ namespace ESSImport
604604
class ConvertPROJ : public Converter
605605
{
606606
public:
607-
int getStage() override { return 2; }
607+
int getStage() const override { return 2; }
608608
void read(ESM::ESMReader& esm) override;
609-
void write(ESM::ESMWriter& esm) override;
609+
void write(ESM::ESMWriter& esm) const override;
610610

611611
private:
612-
void convertBaseState(ESM::BaseProjectileState& base, const PROJ::PNAM& pnam);
612+
void convertBaseState(ESM::BaseProjectileState& base, const PROJ::PNAM& pnam) const;
613613
PROJ mProj;
614614
};
615615

616616
class ConvertSPLM : public Converter
617617
{
618618
public:
619619
void read(ESM::ESMReader& esm) override;
620-
void write(ESM::ESMWriter& esm) override;
620+
void write(ESM::ESMWriter& esm) const override;
621621

622622
private:
623623
SPLM mSPLM;

apps/essimporter/importer.cpp

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -388,25 +388,34 @@ namespace ESSImport
388388
profile.save(writer);
389389
writer.endRecord(ESM::REC_SAVE);
390390

391+
writer.startRecord(ESM::REC_DIAS);
392+
context.mDialogueState.save(writer);
393+
writer.endRecord(ESM::REC_DIAS);
394+
395+
writer.startRecord(ESM::REC_LUAM);
396+
writer.writeHNT<double>("LUAW", 0);
397+
writer.writeFormId(context.mNextRefNum, true);
398+
writer.endRecord(ESM::REC_LUAM);
399+
391400
// Writing order should be Dynamic Store -> Cells -> Player,
392401
// so that references to dynamic records can be recognized when loading
393-
for (auto it = converters.begin(); it != converters.end(); ++it)
402+
for (const auto& [_, converter] : converters)
394403
{
395-
if (it->second->getStage() != 0)
404+
if (converter->getStage() != 0)
396405
continue;
397-
it->second->write(writer);
406+
converter->write(writer);
398407
}
399408

400409
writer.startRecord(ESM::REC_NPC_);
401410
context.mPlayerBase.mId = ESM::RefId::stringRefId("Player");
402411
context.mPlayerBase.save(writer);
403412
writer.endRecord(ESM::REC_NPC_);
404413

405-
for (auto it = converters.begin(); it != converters.end(); ++it)
414+
for (const auto& [_, converter] : converters)
406415
{
407-
if (it->second->getStage() != 1)
416+
if (converter->getStage() != 1)
408417
continue;
409-
it->second->write(writer);
418+
converter->write(writer);
410419
}
411420

412421
writer.startRecord(ESM::REC_PLAY);
@@ -418,22 +427,14 @@ namespace ESSImport
418427
context.mPlayer.save(writer);
419428
writer.endRecord(ESM::REC_PLAY);
420429

421-
writer.startRecord(ESM::REC_ACTC);
422-
writer.writeHNT("COUN", context.mNextActorId);
423-
writer.endRecord(ESM::REC_ACTC);
424-
425430
// Stage 2 requires cell references to be written / actors IDs assigned
426-
for (auto it = converters.begin(); it != converters.end(); ++it)
431+
for (const auto& [_, converter] : converters)
427432
{
428-
if (it->second->getStage() != 2)
433+
if (converter->getStage() != 2)
429434
continue;
430-
it->second->write(writer);
435+
converter->write(writer);
431436
}
432437

433-
writer.startRecord(ESM::REC_DIAS);
434-
context.mDialogueState.save(writer);
435-
writer.endRecord(ESM::REC_DIAS);
436-
437438
writer.startRecord(ESM::REC_INPU);
438439
context.mControlsState.save(writer);
439440
writer.endRecord(ESM::REC_INPU);

0 commit comments

Comments
 (0)