Implement FillJournal console command

This commit is contained in:
Aussiemon 2025-05-14 23:04:11 -06:00 committed by Aussiemon
parent c232ad55b4
commit 6c70c403be
4 changed files with 53 additions and 11 deletions

View File

@ -22,6 +22,20 @@
namespace MWScript
{
static void addJournalEntry(ESM::RefId quest, int index, MWWorld::Ptr ptr)
{
// Invoking Journal with a non-existing index is allowed, and triggers no errors. Seriously? :(
try
{
MWBase::Environment::get().getJournal()->addEntry(quest, index, ptr);
}
catch (...)
{
if (MWBase::Environment::get().getJournal()->getJournalIndex(quest) < index)
MWBase::Environment::get().getJournal()->setJournalIndex(quest, index);
}
}
namespace Dialogue
{
template <class R>
@ -40,16 +54,7 @@ namespace MWScript
Interpreter::Type_Integer index = runtime[0].mInteger;
runtime.pop();
// Invoking Journal with a non-existing index is allowed, and triggers no errors. Seriously? :(
try
{
MWBase::Environment::get().getJournal()->addEntry(quest, index, ptr);
}
catch (...)
{
if (MWBase::Environment::get().getJournal()->getJournalIndex(quest) < index)
MWBase::Environment::get().getJournal()->setJournalIndex(quest, index);
}
addJournalEntry(quest, index, ptr);
}
};
@ -82,6 +87,39 @@ namespace MWScript
}
};
class OpFillJournal : public Interpreter::Opcode0
{
public:
void execute(Interpreter::Runtime& runtime) override
{
const MWWorld::Store<ESM::Dialogue>& dialogues = MWBase::Environment::get().getESMStore()->get<ESM::Dialogue>();
MWWorld::Ptr ptr = MWBase::Environment::get().getWorld()->getPlayerPtr();
for (auto it = dialogues.begin(); it != dialogues.end(); ++it)
{
const ESM::Dialogue::Type type = it->mType;
if (type == ESM::Dialogue::Type::Journal)
{
ESM::RefId quest = ESM::RefId::stringRefId(it->mStringId);
const std::list<ESM::DialInfo> orderedInfo = it->mInfoOrder.getOrderedInfo();
for (auto info = orderedInfo.begin(); info != orderedInfo.end(); ++info)
{
addJournalEntry(quest, info->mData.mJournalIndex, ptr);
}
}
else if (type == ESM::Dialogue::Type::Topic)
{
ESM::RefId topic = ESM::RefId::stringRefId(it->mStringId);
const std::list<ESM::DialInfo> orderedInfo = it->mInfoOrder.getOrderedInfo();
for (auto info = orderedInfo.begin(); info != orderedInfo.end(); ++info)
{
MWBase::Environment::get().getJournal()->addTopic(topic, info->mId, ptr);
}
}
}
}
};
class OpAddTopic : public Interpreter::Opcode0
{
public:
@ -288,6 +326,7 @@ namespace MWScript
interpreter.installSegment5<OpJournal<ExplicitRef>>(Compiler::Dialogue::opcodeJournalExplicit);
interpreter.installSegment5<OpSetJournalIndex>(Compiler::Dialogue::opcodeSetJournalIndex);
interpreter.installSegment5<OpGetJournalIndex>(Compiler::Dialogue::opcodeGetJournalIndex);
interpreter.installSegment5<OpFillJournal>(Compiler::Dialogue::opcodeFillJournal);
interpreter.installSegment5<OpAddTopic>(Compiler::Dialogue::opcodeAddTopic);
interpreter.installSegment3<OpChoice>(Compiler::Dialogue::opcodeChoice);
interpreter.installSegment5<OpForceGreeting<ImplicitRef>>(Compiler::Dialogue::opcodeForceGreeting);

View File

@ -485,5 +485,6 @@ op 0x2000322: GetPCVisionBonus
op 0x2000323: SetPCVisionBonus
op 0x2000324: ModPCVisionBonus
op 0x2000325: TestModels, T3D
op 0x2000326: FillJournal
opcodes 0x2000326-0x3ffffff unused
opcodes 0x2000327-0x3ffffff unused

View File

@ -163,6 +163,7 @@ namespace Compiler
extensions.registerInstruction("journal", "cl", opcodeJournal, opcodeJournalExplicit);
extensions.registerInstruction("setjournalindex", "cl", opcodeSetJournalIndex);
extensions.registerFunction("getjournalindex", 'l', "c", opcodeGetJournalIndex);
extensions.registerInstruction("filljournal", "", opcodeFillJournal);
extensions.registerInstruction("addtopic", "S", opcodeAddTopic);
extensions.registerInstruction(
"choice", "j/SlSlSlSlSlSlSlSlSlSlSlSlSlSlSlSlSlSlSlSlSlSlSlSl", opcodeChoice);

View File

@ -155,6 +155,7 @@ namespace Compiler
const int opcodeJournalExplicit = 0x200030b;
const int opcodeSetJournalIndex = 0x2000134;
const int opcodeGetJournalIndex = 0x2000135;
const int opcodeFillJournal = 0x2000326;
const int opcodeAddTopic = 0x200013a;
const int opcodeChoice = 0x2000a;
const int opcodeForceGreeting = 0x200014f;