diff --git a/Source/debug.cpp b/Source/debug.cpp index 99b687ee1..ef147faaa 100644 --- a/Source/debug.cpp +++ b/Source/debug.cpp @@ -225,11 +225,12 @@ std::string DebugCmdQuest(const std::string_view parameter) if (questId >= MAXQUESTS) return fmt::format("Quest {} is not known. Do you want to write a mod?", questId); + auto &quest = Quests[questId]; - if (IsNoneOf(Quests[questId]._qactive, QUEST_NOTAVAIL, QUEST_INIT)) + if (IsNoneOf(quest._qactive, QUEST_NOTAVAIL, QUEST_INIT)) return fmt::format("{} was already given.", QuestData[questId]._qlstr); - Quests[questId]._qactive = QUEST_ACTIVE; + quest._qactive = QUEST_ACTIVE; return fmt::format("{} enabled.", QuestData[questId]._qlstr); } @@ -343,7 +344,8 @@ void PrintDebugQuest() { char dstr[128]; - sprintf(dstr, "Quest %i : Active = %i, Var1 = %i", DebugQuestId, Quests[DebugQuestId]._qactive, Quests[DebugQuestId]._qvar1); + auto &quest = Quests[DebugQuestId]; + sprintf(dstr, "Quest %i : Active = %i, Var1 = %i", DebugQuestId, quest._qactive, quest._qvar1); NetSendCmdString(1 << MyPlayerId, dstr); DebugQuestId++; diff --git a/Source/inv.cpp b/Source/inv.cpp index d5fd4bfd3..0989e40a8 100644 --- a/Source/inv.cpp +++ b/Source/inv.cpp @@ -1786,18 +1786,20 @@ int InvPutItem(PlayerStruct &player, Point position) if (player.HoldItem._iCurs == ICURS_RUNE_BOMB && xp >= 79 && xp <= 82 && yp >= 61 && yp <= 64) { Displacement relativePosition = position - player.position.tile; NetSendCmdLocParam2(false, CMD_OPENHIVE, player.position.tile, relativePosition.deltaX, relativePosition.deltaY); - Quests[Q_FARMER]._qactive = QUEST_DONE; + auto &quest = Quests[Q_FARMER]; + quest._qactive = QUEST_DONE; if (gbIsMultiplayer) { - NetSendCmdQuest(true, Q_FARMER); + NetSendCmdQuest(true, quest); return -1; } return -1; } if (player.HoldItem.IDidx == IDI_MAPOFDOOM && xp >= 35 && xp <= 38 && yp >= 20 && yp <= 24) { NetSendCmd(false, CMD_OPENCRYPT); - Quests[Q_GRAVE]._qactive = QUEST_DONE; + auto &quest = Quests[Q_GRAVE]; + quest._qactive = QUEST_DONE; if (gbIsMultiplayer) { - NetSendCmdQuest(true, Q_GRAVE); + NetSendCmdQuest(true, quest); } return -1; } diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index d5c0e9626..1baf12e65 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -738,28 +738,28 @@ void LoadPremium(LoadHelper *file, int i) void LoadQuest(LoadHelper *file, int i) { - QuestStruct *pQuest = &Quests[i]; + auto &quest = Quests[i]; - pQuest->_qlevel = file->NextLE(); + quest._qlevel = file->NextLE(); file->Skip(); // _qtype, identical to _qidx - pQuest->_qactive = static_cast(file->NextLE()); - pQuest->_qlvltype = static_cast(file->NextLE()); - pQuest->position.x = file->NextLE(); - pQuest->position.y = file->NextLE(); - pQuest->_qslvl = static_cast<_setlevels>(file->NextLE()); - pQuest->_qidx = static_cast(file->NextLE()); + quest._qactive = static_cast(file->NextLE()); + quest._qlvltype = static_cast(file->NextLE()); + quest.position.x = file->NextLE(); + quest.position.y = file->NextLE(); + quest._qslvl = static_cast<_setlevels>(file->NextLE()); + quest._qidx = static_cast(file->NextLE()); if (gbIsHellfireSaveGame) { file->Skip(2); // Alignment - pQuest->_qmsg = static_cast<_speech_id>(file->NextLE()); + quest._qmsg = static_cast<_speech_id>(file->NextLE()); } else { - pQuest->_qmsg = static_cast<_speech_id>(file->NextLE()); + quest._qmsg = static_cast<_speech_id>(file->NextLE()); } - pQuest->_qvar1 = file->NextLE(); - pQuest->_qvar2 = file->NextLE(); + quest._qvar1 = file->NextLE(); + quest._qvar2 = file->NextLE(); file->Skip(2); // Alignment if (!gbIsHellfireSaveGame) file->Skip(1); // Alignment - pQuest->_qlog = file->NextBool32(); + quest._qlog = file->NextBool32(); ReturnLvlX = file->NextBE(); ReturnLvlY = file->NextBE(); @@ -1381,28 +1381,28 @@ void SavePremium(SaveHelper *file, int i) void SaveQuest(SaveHelper *file, int i) { - QuestStruct *pQuest = &Quests[i]; - - file->WriteLE(pQuest->_qlevel); - file->WriteLE(pQuest->_qidx); // _qtype for compatability, used in DRLG_CheckQuests - file->WriteLE(pQuest->_qactive); - file->WriteLE(pQuest->_qlvltype); - file->WriteLE(pQuest->position.x); - file->WriteLE(pQuest->position.y); - file->WriteLE(pQuest->_qslvl); - file->WriteLE(pQuest->_qidx); + auto &quest = Quests[i]; + + file->WriteLE(quest._qlevel); + file->WriteLE(quest._qidx); // _qtype for compatability, used in DRLG_CheckQuests + file->WriteLE(quest._qactive); + file->WriteLE(quest._qlvltype); + file->WriteLE(quest.position.x); + file->WriteLE(quest.position.y); + file->WriteLE(quest._qslvl); + file->WriteLE(quest._qidx); if (gbIsHellfire) { file->Skip(2); // Alignment - file->WriteLE(pQuest->_qmsg); + file->WriteLE(quest._qmsg); } else { - file->WriteLE(pQuest->_qmsg); + file->WriteLE(quest._qmsg); } - file->WriteLE(pQuest->_qvar1); - file->WriteLE(pQuest->_qvar2); + file->WriteLE(quest._qvar1); + file->WriteLE(quest._qvar2); file->Skip(2); // Alignment if (!gbIsHellfire) file->Skip(1); // Alignment - file->WriteLE(pQuest->_qlog ? 1 : 0); + file->WriteLE(quest._qlog ? 1 : 0); file->WriteBE(ReturnLvlX); file->WriteBE(ReturnLvlY); diff --git a/Source/monster.cpp b/Source/monster.cpp index fad75aa96..a04531bd7 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -1061,9 +1061,10 @@ void StartEating(MonsterStruct &monster) void DiabloDeath(MonsterStruct &diablo, bool sendmsg) { PlaySFX(USFX_DIABLOD); - Quests[Q_DIABLO]._qactive = QUEST_DONE; + auto &quest = Quests[Q_DIABLO]; + quest._qactive = QUEST_DONE; if (sendmsg) - NetSendCmdQuest(true, Q_DIABLO); + NetSendCmdQuest(true, quest); sgbSaveSoundOn = gbSoundOn; gbProcessPlayers = false; for (int j = 0; j < ActiveMonsterCount; j++) { diff --git a/Source/msg.cpp b/Source/msg.cpp index a72190d8b..1e0a63270 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -2313,15 +2313,15 @@ void NetSendCmdParam3(bool bHiPri, _cmd_id bCmd, uint16_t wParam1, uint16_t wPar NetSendLoPri(MyPlayerId, (byte *)&cmd, sizeof(cmd)); } -void NetSendCmdQuest(bool bHiPri, BYTE q) +void NetSendCmdQuest(bool bHiPri, const QuestStruct &quest) { TCmdQuest cmd; - - cmd.q = q; cmd.bCmd = CMD_SYNCQUEST; - cmd.qstate = Quests[q]._qactive; - cmd.qlog = Quests[q]._qlog ? 1 : 0; - cmd.qvar1 = Quests[q]._qvar1; + cmd.q = quest._qidx, + cmd.qstate = quest._qactive; + cmd.qlog = quest._qlog ? 1 : 0; + cmd.qvar1 = quest._qvar1; + if (bHiPri) NetSendHiPri(MyPlayerId, (byte *)&cmd, sizeof(cmd)); else diff --git a/Source/msg.h b/Source/msg.h index 1d600cab9..caf718781 100644 --- a/Source/msg.h +++ b/Source/msg.h @@ -198,7 +198,7 @@ struct TCmdGolem { struct TCmdQuest { _cmd_id bCmd; - uint8_t q; + int8_t q; quest_state qstate; uint8_t qlog; uint8_t qvar1; @@ -431,7 +431,7 @@ void NetSendCmdLocParam3(bool bHiPri, _cmd_id bCmd, Point position, uint16_t wPa void NetSendCmdParam1(bool bHiPri, _cmd_id bCmd, uint16_t wParam1); void NetSendCmdParam2(bool bHiPri, _cmd_id bCmd, uint16_t wParam1, uint16_t wParam2); void NetSendCmdParam3(bool bHiPri, _cmd_id bCmd, uint16_t wParam1, uint16_t wParam2, uint16_t wParam3); -void NetSendCmdQuest(bool bHiPri, BYTE q); +void NetSendCmdQuest(bool bHiPri, const QuestStruct &quest); void NetSendCmdGItem(bool bHiPri, _cmd_id bCmd, BYTE mast, BYTE pnum, BYTE ii); void NetSendCmdPItem(bool bHiPri, _cmd_id bCmd, Point position); void NetSendCmdChItem(bool bHiPri, BYTE bLoc); diff --git a/Source/quests.cpp b/Source/quests.cpp index 1a594f5de..42d4ba6ff 100644 --- a/Source/quests.cpp +++ b/Source/quests.cpp @@ -337,40 +337,41 @@ void CheckQuests() if (gbIsSpawn) return; - if (Quests[Q_BETRAYER].IsAvailable() && gbIsMultiplayer && Quests[Q_BETRAYER]._qvar1 == 2) { + auto &quest = Quests[Q_BETRAYER]; + if (quest.IsAvailable() && gbIsMultiplayer && quest._qvar1 == 2) { AddObject(OBJ_ALTBOY, { 2 * setpc_x + 20, 2 * setpc_y + 22 }); - Quests[Q_BETRAYER]._qvar1 = 3; - NetSendCmdQuest(true, Q_BETRAYER); + quest._qvar1 = 3; + NetSendCmdQuest(true, quest); } if (gbIsMultiplayer) { return; } - if (currlevel == Quests[Q_BETRAYER]._qlevel + if (currlevel == quest._qlevel && !setlevel - && Quests[Q_BETRAYER]._qvar1 >= 2 - && (Quests[Q_BETRAYER]._qactive == QUEST_ACTIVE || Quests[Q_BETRAYER]._qactive == QUEST_DONE) - && (Quests[Q_BETRAYER]._qvar2 == 0 || Quests[Q_BETRAYER]._qvar2 == 2)) { - Quests[Q_BETRAYER].position.x = 2 * Quests[Q_BETRAYER].position.x + 16; - Quests[Q_BETRAYER].position.y = 2 * Quests[Q_BETRAYER].position.y + 16; - int rportx = Quests[Q_BETRAYER].position.x; - int rporty = Quests[Q_BETRAYER].position.y; + && quest._qvar1 >= 2 + && (quest._qactive == QUEST_ACTIVE || quest._qactive == QUEST_DONE) + && (quest._qvar2 == 0 || quest._qvar2 == 2)) { + quest.position.x = 2 * quest.position.x + 16; + quest.position.y = 2 * quest.position.y + 16; + int rportx = quest.position.x; + int rporty = quest.position.y; AddMissile({ rportx, rporty }, { rportx, rporty }, 0, MIS_RPORTAL, TARGET_MONSTERS, MyPlayerId, 0, 0); - Quests[Q_BETRAYER]._qvar2 = 1; - if (Quests[Q_BETRAYER]._qactive == QUEST_ACTIVE) { - Quests[Q_BETRAYER]._qvar1 = 3; + quest._qvar2 = 1; + if (quest._qactive == QUEST_ACTIVE) { + quest._qvar1 = 3; } } - if (Quests[Q_BETRAYER]._qactive == QUEST_DONE + if (quest._qactive == QUEST_DONE && setlevel && setlvlnum == SL_VILEBETRAYER - && Quests[Q_BETRAYER]._qvar2 == 4) { + && quest._qvar2 == 4) { int rportx = 35; int rporty = 32; AddMissile({ rportx, rporty }, { rportx, rporty }, 0, MIS_RPORTAL, TARGET_MONSTERS, MyPlayerId, 0, 0); - Quests[Q_BETRAYER]._qvar2 = 3; + quest._qvar2 = 3; } if (setlevel) { @@ -437,16 +438,18 @@ void CheckQuestKill(const MonsterStruct &monster, bool sendmsg) auto &myPlayer = Players[MyPlayerId]; if (monster.MType->mtype == MT_SKING) { - Quests[Q_SKELKING]._qactive = QUEST_DONE; + auto &quest = Quests[Q_SKELKING]; + quest._qactive = QUEST_DONE; myPlayer.Say(HeroSpeech::RestWellLeoricIllFindYourSon, 30); if (sendmsg) - NetSendCmdQuest(true, Q_SKELKING); + NetSendCmdQuest(true, quest); } else if (monster.MType->mtype == MT_CLEAVER) { - Quests[Q_BUTCHER]._qactive = QUEST_DONE; + auto &quest = Quests[Q_BUTCHER]; + quest._qactive = QUEST_DONE; myPlayer.Say(HeroSpeech::TheSpiritsOfTheDeadAreNowAvenged, 30); if (sendmsg) - NetSendCmdQuest(true, Q_BUTCHER); + NetSendCmdQuest(true, quest); } else if (monster._uniqtype - 1 == UMT_GARBUD) { //"Gharbad the Weak" Quests[Q_GARBUD]._qactive = QUEST_DONE; myPlayer.Say(HeroSpeech::ImNotImpressed, 30); @@ -454,9 +457,11 @@ void CheckQuestKill(const MonsterStruct &monster, bool sendmsg) Quests[Q_ZHAR]._qactive = QUEST_DONE; myPlayer.Say(HeroSpeech::ImSorryDidIBreakYourConcentration, 30); } else if (monster._uniqtype - 1 == UMT_LAZARUS && gbIsMultiplayer) { //"Arch-Bishop Lazarus" - Quests[Q_BETRAYER]._qactive = QUEST_DONE; - Quests[Q_BETRAYER]._qvar1 = 7; - Quests[Q_DIABLO]._qactive = QUEST_ACTIVE; + auto &betrayerQuest = Quests[Q_BETRAYER]; + auto &diabloQuest = Quests[Q_DIABLO]; + betrayerQuest._qactive = QUEST_DONE; + betrayerQuest._qvar1 = 7; + diabloQuest._qactive = QUEST_ACTIVE; for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) { @@ -469,8 +474,8 @@ void CheckQuestKill(const MonsterStruct &monster, bool sendmsg) } myPlayer.Say(HeroSpeech::YourMadnessEndsHereBetrayer, 30); if (sendmsg) { - NetSendCmdQuest(true, Q_BETRAYER); - NetSendCmdQuest(true, Q_DIABLO); + NetSendCmdQuest(true, betrayerQuest); + NetSendCmdQuest(true, diabloQuest); } } else if (monster._uniqtype - 1 == UMT_LAZARUS && !gbIsMultiplayer) { //"Arch-Bishop Lazarus" Quests[Q_BETRAYER]._qactive = QUEST_DONE; @@ -589,39 +594,52 @@ void ResyncMPQuests() if (gbIsSpawn) return; - if (Quests[Q_SKELKING]._qactive == QUEST_INIT - && currlevel >= Quests[Q_SKELKING]._qlevel - 1 - && currlevel <= Quests[Q_SKELKING]._qlevel + 1) { - Quests[Q_SKELKING]._qactive = QUEST_ACTIVE; - NetSendCmdQuest(true, Q_SKELKING); + auto &kingQuest = Quests[Q_SKELKING]; + if (kingQuest._qactive == QUEST_INIT + && currlevel >= kingQuest._qlevel - 1 + && currlevel <= kingQuest._qlevel + 1) { + kingQuest._qactive = QUEST_ACTIVE; + NetSendCmdQuest(true, kingQuest); } - if (Quests[Q_BUTCHER]._qactive == QUEST_INIT - && currlevel >= Quests[Q_BUTCHER]._qlevel - 1 - && currlevel <= Quests[Q_BUTCHER]._qlevel + 1) { - Quests[Q_BUTCHER]._qactive = QUEST_ACTIVE; - NetSendCmdQuest(true, Q_BUTCHER); + + auto &butcherQuest = Quests[Q_BUTCHER]; + if (butcherQuest._qactive == QUEST_INIT + && currlevel >= butcherQuest._qlevel - 1 + && currlevel <= butcherQuest._qlevel + 1) { + butcherQuest._qactive = QUEST_ACTIVE; + NetSendCmdQuest(true, butcherQuest); } - if (Quests[Q_BETRAYER]._qactive == QUEST_INIT && currlevel == Quests[Q_BETRAYER]._qlevel - 1) { - Quests[Q_BETRAYER]._qactive = QUEST_ACTIVE; - NetSendCmdQuest(true, Q_BETRAYER); + + auto &betrayerQuest = Quests[Q_BETRAYER]; + if (betrayerQuest._qactive == QUEST_INIT && currlevel == betrayerQuest._qlevel - 1) { + betrayerQuest._qactive = QUEST_ACTIVE; + NetSendCmdQuest(true, betrayerQuest); } - if (Quests[Q_BETRAYER].IsAvailable()) + if (betrayerQuest.IsAvailable()) AddObject(OBJ_ALTBOY, { 2 * setpc_x + 20, 2 * setpc_y + 22 }); - if (Quests[Q_GRAVE]._qactive == QUEST_INIT && currlevel == Quests[Q_GRAVE]._qlevel - 1) { - Quests[Q_GRAVE]._qactive = QUEST_ACTIVE; - NetSendCmdQuest(true, Q_GRAVE); + + auto &cryptQuest = Quests[Q_GRAVE]; + if (cryptQuest._qactive == QUEST_INIT && currlevel == cryptQuest._qlevel - 1) { + cryptQuest._qactive = QUEST_ACTIVE; + NetSendCmdQuest(true, cryptQuest); } - if (Quests[Q_DEFILER]._qactive == QUEST_INIT && currlevel == Quests[Q_DEFILER]._qlevel - 1) { - Quests[Q_DEFILER]._qactive = QUEST_ACTIVE; - NetSendCmdQuest(true, Q_DEFILER); + + auto &defilerQuest = Quests[Q_DEFILER]; + if (defilerQuest._qactive == QUEST_INIT && currlevel == defilerQuest._qlevel - 1) { + defilerQuest._qactive = QUEST_ACTIVE; + NetSendCmdQuest(true, defilerQuest); } - if (Quests[Q_NAKRUL]._qactive == QUEST_INIT && currlevel == Quests[Q_NAKRUL]._qlevel - 1) { - Quests[Q_NAKRUL]._qactive = QUEST_ACTIVE; - NetSendCmdQuest(true, Q_NAKRUL); + + auto &nakrulQuest = Quests[Q_NAKRUL]; + if (nakrulQuest._qactive == QUEST_INIT && currlevel == nakrulQuest._qlevel - 1) { + nakrulQuest._qactive = QUEST_ACTIVE; + NetSendCmdQuest(true, nakrulQuest); } - if (Quests[Q_JERSEY]._qactive == QUEST_INIT && currlevel == Quests[Q_JERSEY]._qlevel - 1) { - Quests[Q_JERSEY]._qactive = QUEST_ACTIVE; - NetSendCmdQuest(true, Q_JERSEY); + + auto &cowQuest = Quests[Q_JERSEY]; + if (cowQuest._qactive == QUEST_INIT && currlevel == cowQuest._qlevel - 1) { + cowQuest._qactive = QUEST_ACTIVE; + NetSendCmdQuest(true, cowQuest); } } diff --git a/Source/towners.cpp b/Source/towners.cpp index adf13e74d..d2efa3308 100644 --- a/Source/towners.cpp +++ b/Source/towners.cpp @@ -297,45 +297,47 @@ void TalkToBarOwner(PlayerStruct &player, TownerStruct &barOwner) return; } - if (Quests[Q_SKELKING]._qactive != QUEST_NOTAVAIL) { + auto &kingQuest = Quests[Q_SKELKING]; + if (kingQuest._qactive != QUEST_NOTAVAIL) { if (player._pLvlVisited[2] || player._pLvlVisited[4]) { - if (Quests[Q_SKELKING]._qvar2 == 0) { - Quests[Q_SKELKING]._qvar2 = 1; - Quests[Q_SKELKING]._qlog = true; - if (Quests[Q_SKELKING]._qactive == QUEST_INIT) { - Quests[Q_SKELKING]._qactive = QUEST_ACTIVE; - Quests[Q_SKELKING]._qvar1 = 1; + if (kingQuest._qvar2 == 0) { + kingQuest._qvar2 = 1; + kingQuest._qlog = true; + if (kingQuest._qactive == QUEST_INIT) { + kingQuest._qactive = QUEST_ACTIVE; + kingQuest._qvar1 = 1; } InitQTextMsg(TEXT_KING2); - NetSendCmdQuest(true, Q_SKELKING); + NetSendCmdQuest(true, kingQuest); return; } - if (Quests[Q_SKELKING]._qactive == QUEST_DONE && Quests[Q_SKELKING]._qvar2 == 1) { - Quests[Q_SKELKING]._qvar2 = 2; - Quests[Q_SKELKING]._qvar1 = 2; + if (kingQuest._qactive == QUEST_DONE && kingQuest._qvar2 == 1) { + kingQuest._qvar2 = 2; + kingQuest._qvar1 = 2; InitQTextMsg(TEXT_KING4); - NetSendCmdQuest(true, Q_SKELKING); + NetSendCmdQuest(true, kingQuest); return; } } } - if (Quests[Q_LTBANNER]._qactive != QUEST_NOTAVAIL) { - if (player._pLvlVisited[3] && Quests[Q_LTBANNER]._qactive != QUEST_DONE) { - if (Quests[Q_LTBANNER]._qvar2 == 0) { - Quests[Q_LTBANNER]._qvar2 = 1; - if (Quests[Q_LTBANNER]._qactive == QUEST_INIT) { - Quests[Q_LTBANNER]._qvar1 = 1; - Quests[Q_LTBANNER]._qactive = QUEST_ACTIVE; + auto &bannerQuest = Quests[Q_LTBANNER]; + if (bannerQuest._qactive != QUEST_NOTAVAIL) { + if (player._pLvlVisited[3] && bannerQuest._qactive != QUEST_DONE) { + if (bannerQuest._qvar2 == 0) { + bannerQuest._qvar2 = 1; + if (bannerQuest._qactive == QUEST_INIT) { + bannerQuest._qvar1 = 1; + bannerQuest._qactive = QUEST_ACTIVE; } - Quests[Q_LTBANNER]._qlog = true; + bannerQuest._qlog = true; InitQTextMsg(TEXT_BANNER2); return; } - if (Quests[Q_LTBANNER]._qvar2 == 1 && player.TryRemoveInvItemById(IDI_BANNER)) { - Quests[Q_LTBANNER]._qactive = QUEST_DONE; - Quests[Q_LTBANNER]._qvar1 = 3; + if (bannerQuest._qvar2 == 1 && player.TryRemoveInvItemById(IDI_BANNER)) { + bannerQuest._qactive = QUEST_DONE; + bannerQuest._qvar1 = 3; SpawnUnique(UITEM_HARCREST, barOwner.position + DIR_SW); InitQTextMsg(TEXT_BANNER3); return; @@ -349,20 +351,21 @@ void TalkToBarOwner(PlayerStruct &player, TownerStruct &barOwner) void TalkToDeadguy(PlayerStruct &player, TownerStruct & /*deadguy*/) { - if (Quests[Q_BUTCHER]._qactive == QUEST_DONE) + auto &quest = Quests[Q_BUTCHER]; + if (quest._qactive == QUEST_DONE) return; - if (Quests[Q_BUTCHER]._qvar1 == 1) { + if (quest._qvar1 == 1) { player.SaySpecific(HeroSpeech::YourDeathWillBeAvenged); return; } - Quests[Q_BUTCHER]._qactive = QUEST_ACTIVE; - Quests[Q_BUTCHER]._qlog = true; - Quests[Q_BUTCHER]._qmsg = TEXT_BUTCH9; - Quests[Q_BUTCHER]._qvar1 = 1; + quest._qactive = QUEST_ACTIVE; + quest._qlog = true; + quest._qmsg = TEXT_BUTCH9; + quest._qvar1 = 1; InitQTextMsg(TEXT_BUTCH9); - NetSendCmdQuest(true, Q_BUTCHER); + NetSendCmdQuest(true, quest); } void TalkToBlackSmith(PlayerStruct &player, TownerStruct &blackSmith) @@ -517,29 +520,31 @@ void TalkToBoy(PlayerStruct & /*player*/, TownerStruct & /*boy*/) void TalkToStoryteller(PlayerStruct &player, TownerStruct & /*storyteller*/) { + auto &betrayerQuest = Quests[Q_BETRAYER]; if (!gbIsMultiplayer) { - if (Quests[Q_BETRAYER]._qactive == QUEST_INIT && player.TryRemoveInvItemById(IDI_LAZSTAFF)) { + if (betrayerQuest._qactive == QUEST_INIT && player.TryRemoveInvItemById(IDI_LAZSTAFF)) { InitQTextMsg(TEXT_VILE1); - Quests[Q_BETRAYER]._qlog = true; - Quests[Q_BETRAYER]._qactive = QUEST_ACTIVE; - Quests[Q_BETRAYER]._qvar1 = 2; + betrayerQuest._qlog = true; + betrayerQuest._qactive = QUEST_ACTIVE; + betrayerQuest._qvar1 = 2; return; } } else { - if (Quests[Q_BETRAYER]._qactive == QUEST_ACTIVE && !Quests[Q_BETRAYER]._qlog) { + if (betrayerQuest._qactive == QUEST_ACTIVE && !betrayerQuest._qlog) { InitQTextMsg(TEXT_VILE1); - Quests[Q_BETRAYER]._qlog = true; - NetSendCmdQuest(true, Q_BETRAYER); + betrayerQuest._qlog = true; + NetSendCmdQuest(true, betrayerQuest); return; } } - if (Quests[Q_BETRAYER]._qactive == QUEST_DONE && Quests[Q_BETRAYER]._qvar1 == 7) { - Quests[Q_BETRAYER]._qvar1 = 8; + if (betrayerQuest._qactive == QUEST_DONE && betrayerQuest._qvar1 == 7) { + betrayerQuest._qvar1 = 8; InitQTextMsg(TEXT_VILE3); - Quests[Q_DIABLO]._qlog = true; + auto &diabloQuest = Quests[Q_DIABLO]; + diabloQuest._qlog = true; if (gbIsMultiplayer) { - NetSendCmdQuest(true, Q_BETRAYER); - NetSendCmdQuest(true, Q_DIABLO); + NetSendCmdQuest(true, betrayerQuest); + NetSendCmdQuest(true, diabloQuest); } return; } @@ -580,17 +585,18 @@ void TalkToCow(PlayerStruct &player, TownerStruct &cow) void TalkToFarmer(PlayerStruct &player, TownerStruct &farmer) { - switch (Quests[Q_FARMER]._qactive) { + auto &quest = Quests[Q_FARMER]; + switch (quest._qactive) { case QUEST_NOTAVAIL: case QUEST_INIT: if (player.HasItem(IDI_RUNEBOMB)) { InitQTextMsg(TEXT_FARMER2); - Quests[Q_FARMER]._qactive = QUEST_ACTIVE; - Quests[Q_FARMER]._qvar1 = 1; - Quests[Q_FARMER]._qmsg = TEXT_FARMER1; - Quests[Q_FARMER]._qlog = true; + quest._qactive = QUEST_ACTIVE; + quest._qvar1 = 1; + quest._qmsg = TEXT_FARMER1; + quest._qlog = true; if (gbIsMultiplayer) - NetSendCmdQuest(true, Q_FARMER); + NetSendCmdQuest(true, quest); break; } @@ -607,13 +613,13 @@ void TalkToFarmer(PlayerStruct &player, TownerStruct &farmer) } InitQTextMsg(TEXT_FARMER1); - Quests[Q_FARMER]._qactive = QUEST_ACTIVE; - Quests[Q_FARMER]._qvar1 = 1; - Quests[Q_FARMER]._qlog = true; - Quests[Q_FARMER]._qmsg = TEXT_FARMER1; + quest._qactive = QUEST_ACTIVE; + quest._qvar1 = 1; + quest._qlog = true; + quest._qmsg = TEXT_FARMER1; SpawnRuneBomb(farmer.position + Displacement { 1, 0 }); if (gbIsMultiplayer) - NetSendCmdQuest(true, Q_FARMER); + NetSendCmdQuest(true, quest); break; case QUEST_ACTIVE: InitQTextMsg(player.HasItem(IDI_RUNEBOMB) ? TEXT_FARMER2 : TEXT_FARMER3); @@ -621,10 +627,10 @@ void TalkToFarmer(PlayerStruct &player, TownerStruct &farmer) case QUEST_DONE: InitQTextMsg(TEXT_FARMER4); SpawnRewardItem(IDI_AURIC, farmer.position + Displacement { 1, 0 }); - Quests[Q_FARMER]._qactive = QUEST_HIVE_DONE; - Quests[Q_FARMER]._qlog = false; + quest._qactive = QUEST_HIVE_DONE; + quest._qlog = false; if (gbIsMultiplayer) - NetSendCmdQuest(true, Q_FARMER); + NetSendCmdQuest(true, quest); break; case QUEST_HIVE_DONE: break; @@ -641,30 +647,32 @@ void TalkToCowFarmer(PlayerStruct &player, TownerStruct &cowFarmer) return; } + auto &quest = Quests[Q_JERSEY]; + if (player.TryRemoveInvItemById(IDI_BROWNSUIT)) { SpawnUnique(UITEM_BOVINE, cowFarmer.position + DIR_SE); InitQTextMsg(TEXT_JERSEY8); - Quests[Q_JERSEY]._qactive = QUEST_DONE; + quest._qactive = QUEST_DONE; LoadTownerAnimations(cowFarmer, "Towners\\Farmer\\mfrmrn2.CEL", 15, DIR_SW, 3); return; } if (player.HasItem(IDI_RUNEBOMB)) { InitQTextMsg(TEXT_JERSEY5); - Quests[Q_JERSEY]._qactive = QUEST_ACTIVE; - Quests[Q_JERSEY]._qvar1 = 1; - Quests[Q_JERSEY]._qmsg = TEXT_JERSEY4; - Quests[Q_JERSEY]._qlog = true; + quest._qactive = QUEST_ACTIVE; + quest._qvar1 = 1; + quest._qmsg = TEXT_JERSEY4; + quest._qlog = true; return; } - switch (Quests[Q_JERSEY]._qactive) { + switch (quest._qactive) { case QUEST_NOTAVAIL: case QUEST_INIT: InitQTextMsg(TEXT_JERSEY1); - Quests[Q_JERSEY]._qactive = QUEST_HIVE_TEASE1; + quest._qactive = QUEST_HIVE_TEASE1; if (gbIsMultiplayer) - NetSendCmdQuest(true, Q_JERSEY); + NetSendCmdQuest(true, quest); break; case QUEST_ACTIVE: InitQTextMsg(TEXT_JERSEY5); @@ -674,15 +682,15 @@ void TalkToCowFarmer(PlayerStruct &player, TownerStruct &cowFarmer) break; case QUEST_HIVE_TEASE1: InitQTextMsg(TEXT_JERSEY2); - Quests[Q_JERSEY]._qactive = QUEST_HIVE_TEASE2; + quest._qactive = QUEST_HIVE_TEASE2; if (gbIsMultiplayer) - NetSendCmdQuest(true, Q_JERSEY); + NetSendCmdQuest(true, quest); break; case QUEST_HIVE_TEASE2: InitQTextMsg(TEXT_JERSEY3); - Quests[Q_JERSEY]._qactive = QUEST_HIVE_ACTIVE; + quest._qactive = QUEST_HIVE_ACTIVE; if (gbIsMultiplayer) - NetSendCmdQuest(true, Q_JERSEY); + NetSendCmdQuest(true, quest); break; case QUEST_HIVE_ACTIVE: if (!player._pLvlVisited[9] && player._pLevel < 15) { @@ -703,13 +711,13 @@ void TalkToCowFarmer(PlayerStruct &player, TownerStruct &cowFarmer) } InitQTextMsg(TEXT_JERSEY4); - Quests[Q_JERSEY]._qactive = QUEST_ACTIVE; - Quests[Q_JERSEY]._qvar1 = 1; - Quests[Q_JERSEY]._qmsg = TEXT_JERSEY4; - Quests[Q_JERSEY]._qlog = true; + quest._qactive = QUEST_ACTIVE; + quest._qvar1 = 1; + quest._qmsg = TEXT_JERSEY4; + quest._qlog = true; SpawnRuneBomb(cowFarmer.position + Displacement { 1, 0 }); if (gbIsMultiplayer) - NetSendCmdQuest(true, Q_JERSEY); + NetSendCmdQuest(true, quest); break; default: InitQTextMsg(TEXT_JERSEY5); @@ -719,27 +727,29 @@ void TalkToCowFarmer(PlayerStruct &player, TownerStruct &cowFarmer) void TalkToGirl(PlayerStruct &player, TownerStruct &girl) { - if (Quests[Q_GIRL]._qactive != QUEST_DONE && player.TryRemoveInvItemById(IDI_THEODORE)) { + auto &quest = Quests[Q_GIRL]; + + if (quest._qactive != QUEST_DONE && player.TryRemoveInvItemById(IDI_THEODORE)) { InitQTextMsg(TEXT_GIRL4); CreateAmulet(girl.position, 13, false, true); - Quests[Q_GIRL]._qlog = false; - Quests[Q_GIRL]._qactive = QUEST_DONE; + quest._qlog = false; + quest._qactive = QUEST_DONE; LoadTownerAnimations(girl, "Towners\\Girl\\Girls1.CEL", 20, DIR_S, 6); if (gbIsMultiplayer) - NetSendCmdQuest(true, Q_GIRL); + NetSendCmdQuest(true, quest); return; } - switch (Quests[Q_GIRL]._qactive) { + switch (quest._qactive) { case QUEST_NOTAVAIL: case QUEST_INIT: InitQTextMsg(TEXT_GIRL2); - Quests[Q_GIRL]._qactive = QUEST_ACTIVE; - Quests[Q_GIRL]._qvar1 = 1; - Quests[Q_GIRL]._qlog = true; - Quests[Q_GIRL]._qmsg = TEXT_GIRL2; + quest._qactive = QUEST_ACTIVE; + quest._qvar1 = 1; + quest._qlog = true; + quest._qmsg = TEXT_GIRL2; if (gbIsMultiplayer) - NetSendCmdQuest(true, Q_GIRL); + NetSendCmdQuest(true, quest); return; case QUEST_ACTIVE: InitQTextMsg(TEXT_GIRL3);