From 57a3ede76aec0cb957923cfe724ddb2d0fc32bf1 Mon Sep 17 00:00:00 2001 From: obligaron Date: Wed, 22 Jun 2022 23:20:07 +0200 Subject: [PATCH] Introduce UseMultiplayerQuests --- Source/diablo.cpp | 11 +++++++---- Source/msg.cpp | 26 ++++++++++++++------------ Source/quests.cpp | 13 +++++++++---- Source/quests.h | 1 + 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/Source/diablo.cpp b/Source/diablo.cpp index c96479aed..de7fb1bde 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -2745,10 +2745,10 @@ void LoadGameLevel(bool firstflag, lvl_entry lvldir) for (int y = 0; y < DMAXY; y++) UpdateAutomapExplorer({ x, y }, MAP_EXP_SELF); } - if (!gbIsMultiplayer) - ResyncQuests(); - else + if (UseMultiplayerQuests()) ResyncMPQuests(); + else + ResyncQuests(); } else { LoadSetMap(); IncProgress(); @@ -2791,8 +2791,11 @@ void LoadGameLevel(bool firstflag, lvl_entry lvldir) } else { LoadLevel(); } - if (gbIsMultiplayer) + if (gbIsMultiplayer) { DeltaLoadLevel(); + if (!UseMultiplayerQuests()) + ResyncQuests(); + } InitMissiles(); IncProgress(); diff --git a/Source/msg.cpp b/Source/msg.cpp index c05dc451f..2ef7d8069 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -423,14 +423,15 @@ byte *DeltaExportJunk(byte *dst) int q = 0; for (auto &quest : Quests) { - if (!QuestsData[quest._qidx].isSinglePlayerOnly) { - sgJunk.quests[q].qlog = quest._qlog ? 1 : 0; - sgJunk.quests[q].qstate = quest._qactive; - sgJunk.quests[q].qvar1 = quest._qvar1; - memcpy(dst, &sgJunk.quests[q], sizeof(MultiQuests)); - dst += sizeof(MultiQuests); - q++; + if (QuestsData[quest._qidx].isSinglePlayerOnly && UseMultiplayerQuests()) { + continue; } + sgJunk.quests[q].qlog = quest._qlog ? 1 : 0; + sgJunk.quests[q].qstate = quest._qactive; + sgJunk.quests[q].qvar1 = quest._qvar1; + memcpy(dst, &sgJunk.quests[q], sizeof(MultiQuests)); + dst += sizeof(MultiQuests); + q++; } return dst; @@ -450,11 +451,12 @@ void DeltaImportJunk(const byte *src) int q = 0; for (int qidx = 0; qidx < MAXQUESTS; qidx++) { - if (!QuestsData[qidx].isSinglePlayerOnly) { - memcpy(&sgJunk.quests[q], src, sizeof(MultiQuests)); - src += sizeof(MultiQuests); - q++; + if (QuestsData[qidx].isSinglePlayerOnly && UseMultiplayerQuests()) { + continue; } + memcpy(&sgJunk.quests[q], src, sizeof(MultiQuests)); + src += sizeof(MultiQuests); + q++; } } @@ -2537,7 +2539,7 @@ void DeltaSyncJunk() int q = 0; for (auto &quest : Quests) { - if (QuestsData[quest._qidx].isSinglePlayerOnly) { + if (QuestsData[quest._qidx].isSinglePlayerOnly && UseMultiplayerQuests()) { continue; } if (sgJunk.quests[q].qstate != QUEST_INVALID) { diff --git a/Source/quests.cpp b/Source/quests.cpp index 71bb2df38..b21bcb89b 100644 --- a/Source/quests.cpp +++ b/Source/quests.cpp @@ -249,7 +249,7 @@ void InitQuests() quest._qlog = false; quest._qmsg = questData._qdmsg; - if (!gbIsMultiplayer) { + if (!UseMultiplayerQuests()) { quest._qlevel = questData._qdlvl; quest._qactive = QUEST_INIT; } else if (!questData.isSinglePlayerOnly) { @@ -258,7 +258,7 @@ void InitQuests() } } - if (!gbIsMultiplayer && *sgOptions.Gameplay.randomizeQuests) { + if (!UseMultiplayerQuests() && *sgOptions.Gameplay.randomizeQuests) { // Quests are set from the seed used to generate level 16. InitialiseQuestPools(glSeedTbl[15], Quests); } @@ -274,7 +274,7 @@ void InitQuests() if (Quests[Q_ROCK]._qactive == QUEST_NOTAVAIL) Quests[Q_ROCK]._qvar2 = 2; Quests[Q_LTBANNER]._qvar1 = 1; - if (gbIsMultiplayer) + if (UseMultiplayerQuests()) Quests[Q_BETRAYER]._qvar1 = 2; } @@ -804,6 +804,11 @@ void SetMultiQuest(int q, quest_state s, bool log, int v1, int v2) quest._qvar2 = v2; } +bool UseMultiplayerQuests() +{ + return gbIsMultiplayer; +} + bool Quest::IsAvailable() { if (setlevel) @@ -812,7 +817,7 @@ bool Quest::IsAvailable() return false; if (_qactive == QUEST_NOTAVAIL) return false; - if (gbIsMultiplayer && QuestsData[_qidx].isSinglePlayerOnly) + if (QuestsData[_qidx].isSinglePlayerOnly && UseMultiplayerQuests()) return false; return true; diff --git a/Source/quests.h b/Source/quests.h index f11e8b000..2eab3313c 100644 --- a/Source/quests.h +++ b/Source/quests.h @@ -104,6 +104,7 @@ void QuestlogDown(); void QuestlogEnter(); void QuestlogESC(); void SetMultiQuest(int q, quest_state s, bool log, int v1, int v2); +bool UseMultiplayerQuests(); /* rdata */ extern QuestData QuestsData[];