Browse Source

Make NetSendCmdQuest() take a quest structure as input

pull/2651/head
Anders Jenbo 5 years ago
parent
commit
5ddcd90ff9
  1. 8
      Source/debug.cpp
  2. 10
      Source/inv.cpp
  3. 56
      Source/loadsave.cpp
  4. 5
      Source/monster.cpp
  5. 12
      Source/msg.cpp
  6. 4
      Source/msg.h
  7. 122
      Source/quests.cpp
  8. 176
      Source/towners.cpp

8
Source/debug.cpp

@ -225,11 +225,12 @@ std::string DebugCmdQuest(const std::string_view parameter)
if (questId >= MAXQUESTS) if (questId >= MAXQUESTS)
return fmt::format("Quest {} is not known. Do you want to write a mod?", questId); 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); 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); return fmt::format("{} enabled.", QuestData[questId]._qlstr);
} }
@ -343,7 +344,8 @@ void PrintDebugQuest()
{ {
char dstr[128]; 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); NetSendCmdString(1 << MyPlayerId, dstr);
DebugQuestId++; DebugQuestId++;

10
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) { if (player.HoldItem._iCurs == ICURS_RUNE_BOMB && xp >= 79 && xp <= 82 && yp >= 61 && yp <= 64) {
Displacement relativePosition = position - player.position.tile; Displacement relativePosition = position - player.position.tile;
NetSendCmdLocParam2(false, CMD_OPENHIVE, player.position.tile, relativePosition.deltaX, relativePosition.deltaY); 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) { if (gbIsMultiplayer) {
NetSendCmdQuest(true, Q_FARMER); NetSendCmdQuest(true, quest);
return -1; return -1;
} }
return -1; return -1;
} }
if (player.HoldItem.IDidx == IDI_MAPOFDOOM && xp >= 35 && xp <= 38 && yp >= 20 && yp <= 24) { if (player.HoldItem.IDidx == IDI_MAPOFDOOM && xp >= 35 && xp <= 38 && yp >= 20 && yp <= 24) {
NetSendCmd(false, CMD_OPENCRYPT); NetSendCmd(false, CMD_OPENCRYPT);
Quests[Q_GRAVE]._qactive = QUEST_DONE; auto &quest = Quests[Q_GRAVE];
quest._qactive = QUEST_DONE;
if (gbIsMultiplayer) { if (gbIsMultiplayer) {
NetSendCmdQuest(true, Q_GRAVE); NetSendCmdQuest(true, quest);
} }
return -1; return -1;
} }

56
Source/loadsave.cpp

@ -738,28 +738,28 @@ void LoadPremium(LoadHelper *file, int i)
void LoadQuest(LoadHelper *file, int i) void LoadQuest(LoadHelper *file, int i)
{ {
QuestStruct *pQuest = &Quests[i]; auto &quest = Quests[i];
pQuest->_qlevel = file->NextLE<uint8_t>(); quest._qlevel = file->NextLE<uint8_t>();
file->Skip<uint8_t>(); // _qtype, identical to _qidx file->Skip<uint8_t>(); // _qtype, identical to _qidx
pQuest->_qactive = static_cast<quest_state>(file->NextLE<uint8_t>()); quest._qactive = static_cast<quest_state>(file->NextLE<uint8_t>());
pQuest->_qlvltype = static_cast<dungeon_type>(file->NextLE<uint8_t>()); quest._qlvltype = static_cast<dungeon_type>(file->NextLE<uint8_t>());
pQuest->position.x = file->NextLE<int32_t>(); quest.position.x = file->NextLE<int32_t>();
pQuest->position.y = file->NextLE<int32_t>(); quest.position.y = file->NextLE<int32_t>();
pQuest->_qslvl = static_cast<_setlevels>(file->NextLE<uint8_t>()); quest._qslvl = static_cast<_setlevels>(file->NextLE<uint8_t>());
pQuest->_qidx = static_cast<quest_id>(file->NextLE<uint8_t>()); quest._qidx = static_cast<quest_id>(file->NextLE<uint8_t>());
if (gbIsHellfireSaveGame) { if (gbIsHellfireSaveGame) {
file->Skip(2); // Alignment file->Skip(2); // Alignment
pQuest->_qmsg = static_cast<_speech_id>(file->NextLE<int32_t>()); quest._qmsg = static_cast<_speech_id>(file->NextLE<int32_t>());
} else { } else {
pQuest->_qmsg = static_cast<_speech_id>(file->NextLE<uint8_t>()); quest._qmsg = static_cast<_speech_id>(file->NextLE<uint8_t>());
} }
pQuest->_qvar1 = file->NextLE<uint8_t>(); quest._qvar1 = file->NextLE<uint8_t>();
pQuest->_qvar2 = file->NextLE<uint8_t>(); quest._qvar2 = file->NextLE<uint8_t>();
file->Skip(2); // Alignment file->Skip(2); // Alignment
if (!gbIsHellfireSaveGame) if (!gbIsHellfireSaveGame)
file->Skip(1); // Alignment file->Skip(1); // Alignment
pQuest->_qlog = file->NextBool32(); quest._qlog = file->NextBool32();
ReturnLvlX = file->NextBE<int32_t>(); ReturnLvlX = file->NextBE<int32_t>();
ReturnLvlY = file->NextBE<int32_t>(); ReturnLvlY = file->NextBE<int32_t>();
@ -1381,28 +1381,28 @@ void SavePremium(SaveHelper *file, int i)
void SaveQuest(SaveHelper *file, int i) void SaveQuest(SaveHelper *file, int i)
{ {
QuestStruct *pQuest = &Quests[i]; auto &quest = Quests[i];
file->WriteLE<uint8_t>(pQuest->_qlevel); file->WriteLE<uint8_t>(quest._qlevel);
file->WriteLE<uint8_t>(pQuest->_qidx); // _qtype for compatability, used in DRLG_CheckQuests file->WriteLE<uint8_t>(quest._qidx); // _qtype for compatability, used in DRLG_CheckQuests
file->WriteLE<uint8_t>(pQuest->_qactive); file->WriteLE<uint8_t>(quest._qactive);
file->WriteLE<uint8_t>(pQuest->_qlvltype); file->WriteLE<uint8_t>(quest._qlvltype);
file->WriteLE<int32_t>(pQuest->position.x); file->WriteLE<int32_t>(quest.position.x);
file->WriteLE<int32_t>(pQuest->position.y); file->WriteLE<int32_t>(quest.position.y);
file->WriteLE<uint8_t>(pQuest->_qslvl); file->WriteLE<uint8_t>(quest._qslvl);
file->WriteLE<uint8_t>(pQuest->_qidx); file->WriteLE<uint8_t>(quest._qidx);
if (gbIsHellfire) { if (gbIsHellfire) {
file->Skip(2); // Alignment file->Skip(2); // Alignment
file->WriteLE<int32_t>(pQuest->_qmsg); file->WriteLE<int32_t>(quest._qmsg);
} else { } else {
file->WriteLE<uint8_t>(pQuest->_qmsg); file->WriteLE<uint8_t>(quest._qmsg);
} }
file->WriteLE<uint8_t>(pQuest->_qvar1); file->WriteLE<uint8_t>(quest._qvar1);
file->WriteLE<uint8_t>(pQuest->_qvar2); file->WriteLE<uint8_t>(quest._qvar2);
file->Skip(2); // Alignment file->Skip(2); // Alignment
if (!gbIsHellfire) if (!gbIsHellfire)
file->Skip(1); // Alignment file->Skip(1); // Alignment
file->WriteLE<uint32_t>(pQuest->_qlog ? 1 : 0); file->WriteLE<uint32_t>(quest._qlog ? 1 : 0);
file->WriteBE<int32_t>(ReturnLvlX); file->WriteBE<int32_t>(ReturnLvlX);
file->WriteBE<int32_t>(ReturnLvlY); file->WriteBE<int32_t>(ReturnLvlY);

5
Source/monster.cpp

@ -1061,9 +1061,10 @@ void StartEating(MonsterStruct &monster)
void DiabloDeath(MonsterStruct &diablo, bool sendmsg) void DiabloDeath(MonsterStruct &diablo, bool sendmsg)
{ {
PlaySFX(USFX_DIABLOD); PlaySFX(USFX_DIABLOD);
Quests[Q_DIABLO]._qactive = QUEST_DONE; auto &quest = Quests[Q_DIABLO];
quest._qactive = QUEST_DONE;
if (sendmsg) if (sendmsg)
NetSendCmdQuest(true, Q_DIABLO); NetSendCmdQuest(true, quest);
sgbSaveSoundOn = gbSoundOn; sgbSaveSoundOn = gbSoundOn;
gbProcessPlayers = false; gbProcessPlayers = false;
for (int j = 0; j < ActiveMonsterCount; j++) { for (int j = 0; j < ActiveMonsterCount; j++) {

12
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)); NetSendLoPri(MyPlayerId, (byte *)&cmd, sizeof(cmd));
} }
void NetSendCmdQuest(bool bHiPri, BYTE q) void NetSendCmdQuest(bool bHiPri, const QuestStruct &quest)
{ {
TCmdQuest cmd; TCmdQuest cmd;
cmd.q = q;
cmd.bCmd = CMD_SYNCQUEST; cmd.bCmd = CMD_SYNCQUEST;
cmd.qstate = Quests[q]._qactive; cmd.q = quest._qidx,
cmd.qlog = Quests[q]._qlog ? 1 : 0; cmd.qstate = quest._qactive;
cmd.qvar1 = Quests[q]._qvar1; cmd.qlog = quest._qlog ? 1 : 0;
cmd.qvar1 = quest._qvar1;
if (bHiPri) if (bHiPri)
NetSendHiPri(MyPlayerId, (byte *)&cmd, sizeof(cmd)); NetSendHiPri(MyPlayerId, (byte *)&cmd, sizeof(cmd));
else else

4
Source/msg.h

@ -198,7 +198,7 @@ struct TCmdGolem {
struct TCmdQuest { struct TCmdQuest {
_cmd_id bCmd; _cmd_id bCmd;
uint8_t q; int8_t q;
quest_state qstate; quest_state qstate;
uint8_t qlog; uint8_t qlog;
uint8_t qvar1; 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 NetSendCmdParam1(bool bHiPri, _cmd_id bCmd, uint16_t wParam1);
void NetSendCmdParam2(bool bHiPri, _cmd_id bCmd, uint16_t wParam1, uint16_t wParam2); 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 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 NetSendCmdGItem(bool bHiPri, _cmd_id bCmd, BYTE mast, BYTE pnum, BYTE ii);
void NetSendCmdPItem(bool bHiPri, _cmd_id bCmd, Point position); void NetSendCmdPItem(bool bHiPri, _cmd_id bCmd, Point position);
void NetSendCmdChItem(bool bHiPri, BYTE bLoc); void NetSendCmdChItem(bool bHiPri, BYTE bLoc);

122
Source/quests.cpp

@ -337,40 +337,41 @@ void CheckQuests()
if (gbIsSpawn) if (gbIsSpawn)
return; 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 }); AddObject(OBJ_ALTBOY, { 2 * setpc_x + 20, 2 * setpc_y + 22 });
Quests[Q_BETRAYER]._qvar1 = 3; quest._qvar1 = 3;
NetSendCmdQuest(true, Q_BETRAYER); NetSendCmdQuest(true, quest);
} }
if (gbIsMultiplayer) { if (gbIsMultiplayer) {
return; return;
} }
if (currlevel == Quests[Q_BETRAYER]._qlevel if (currlevel == quest._qlevel
&& !setlevel && !setlevel
&& Quests[Q_BETRAYER]._qvar1 >= 2 && quest._qvar1 >= 2
&& (Quests[Q_BETRAYER]._qactive == QUEST_ACTIVE || Quests[Q_BETRAYER]._qactive == QUEST_DONE) && (quest._qactive == QUEST_ACTIVE || quest._qactive == QUEST_DONE)
&& (Quests[Q_BETRAYER]._qvar2 == 0 || Quests[Q_BETRAYER]._qvar2 == 2)) { && (quest._qvar2 == 0 || quest._qvar2 == 2)) {
Quests[Q_BETRAYER].position.x = 2 * Quests[Q_BETRAYER].position.x + 16; quest.position.x = 2 * quest.position.x + 16;
Quests[Q_BETRAYER].position.y = 2 * Quests[Q_BETRAYER].position.y + 16; quest.position.y = 2 * quest.position.y + 16;
int rportx = Quests[Q_BETRAYER].position.x; int rportx = quest.position.x;
int rporty = Quests[Q_BETRAYER].position.y; int rporty = quest.position.y;
AddMissile({ rportx, rporty }, { rportx, rporty }, 0, MIS_RPORTAL, TARGET_MONSTERS, MyPlayerId, 0, 0); AddMissile({ rportx, rporty }, { rportx, rporty }, 0, MIS_RPORTAL, TARGET_MONSTERS, MyPlayerId, 0, 0);
Quests[Q_BETRAYER]._qvar2 = 1; quest._qvar2 = 1;
if (Quests[Q_BETRAYER]._qactive == QUEST_ACTIVE) { if (quest._qactive == QUEST_ACTIVE) {
Quests[Q_BETRAYER]._qvar1 = 3; quest._qvar1 = 3;
} }
} }
if (Quests[Q_BETRAYER]._qactive == QUEST_DONE if (quest._qactive == QUEST_DONE
&& setlevel && setlevel
&& setlvlnum == SL_VILEBETRAYER && setlvlnum == SL_VILEBETRAYER
&& Quests[Q_BETRAYER]._qvar2 == 4) { && quest._qvar2 == 4) {
int rportx = 35; int rportx = 35;
int rporty = 32; int rporty = 32;
AddMissile({ rportx, rporty }, { rportx, rporty }, 0, MIS_RPORTAL, TARGET_MONSTERS, MyPlayerId, 0, 0); AddMissile({ rportx, rporty }, { rportx, rporty }, 0, MIS_RPORTAL, TARGET_MONSTERS, MyPlayerId, 0, 0);
Quests[Q_BETRAYER]._qvar2 = 3; quest._qvar2 = 3;
} }
if (setlevel) { if (setlevel) {
@ -437,16 +438,18 @@ void CheckQuestKill(const MonsterStruct &monster, bool sendmsg)
auto &myPlayer = Players[MyPlayerId]; auto &myPlayer = Players[MyPlayerId];
if (monster.MType->mtype == MT_SKING) { 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); myPlayer.Say(HeroSpeech::RestWellLeoricIllFindYourSon, 30);
if (sendmsg) if (sendmsg)
NetSendCmdQuest(true, Q_SKELKING); NetSendCmdQuest(true, quest);
} else if (monster.MType->mtype == MT_CLEAVER) { } 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); myPlayer.Say(HeroSpeech::TheSpiritsOfTheDeadAreNowAvenged, 30);
if (sendmsg) if (sendmsg)
NetSendCmdQuest(true, Q_BUTCHER); NetSendCmdQuest(true, quest);
} else if (monster._uniqtype - 1 == UMT_GARBUD) { //"Gharbad the Weak" } else if (monster._uniqtype - 1 == UMT_GARBUD) { //"Gharbad the Weak"
Quests[Q_GARBUD]._qactive = QUEST_DONE; Quests[Q_GARBUD]._qactive = QUEST_DONE;
myPlayer.Say(HeroSpeech::ImNotImpressed, 30); myPlayer.Say(HeroSpeech::ImNotImpressed, 30);
@ -454,9 +457,11 @@ void CheckQuestKill(const MonsterStruct &monster, bool sendmsg)
Quests[Q_ZHAR]._qactive = QUEST_DONE; Quests[Q_ZHAR]._qactive = QUEST_DONE;
myPlayer.Say(HeroSpeech::ImSorryDidIBreakYourConcentration, 30); myPlayer.Say(HeroSpeech::ImSorryDidIBreakYourConcentration, 30);
} else if (monster._uniqtype - 1 == UMT_LAZARUS && gbIsMultiplayer) { //"Arch-Bishop Lazarus" } else if (monster._uniqtype - 1 == UMT_LAZARUS && gbIsMultiplayer) { //"Arch-Bishop Lazarus"
Quests[Q_BETRAYER]._qactive = QUEST_DONE; auto &betrayerQuest = Quests[Q_BETRAYER];
Quests[Q_BETRAYER]._qvar1 = 7; auto &diabloQuest = Quests[Q_DIABLO];
Quests[Q_DIABLO]._qactive = QUEST_ACTIVE; betrayerQuest._qactive = QUEST_DONE;
betrayerQuest._qvar1 = 7;
diabloQuest._qactive = QUEST_ACTIVE;
for (int j = 0; j < MAXDUNY; j++) { for (int j = 0; j < MAXDUNY; j++) {
for (int i = 0; i < MAXDUNX; i++) { for (int i = 0; i < MAXDUNX; i++) {
@ -469,8 +474,8 @@ void CheckQuestKill(const MonsterStruct &monster, bool sendmsg)
} }
myPlayer.Say(HeroSpeech::YourMadnessEndsHereBetrayer, 30); myPlayer.Say(HeroSpeech::YourMadnessEndsHereBetrayer, 30);
if (sendmsg) { if (sendmsg) {
NetSendCmdQuest(true, Q_BETRAYER); NetSendCmdQuest(true, betrayerQuest);
NetSendCmdQuest(true, Q_DIABLO); NetSendCmdQuest(true, diabloQuest);
} }
} else if (monster._uniqtype - 1 == UMT_LAZARUS && !gbIsMultiplayer) { //"Arch-Bishop Lazarus" } else if (monster._uniqtype - 1 == UMT_LAZARUS && !gbIsMultiplayer) { //"Arch-Bishop Lazarus"
Quests[Q_BETRAYER]._qactive = QUEST_DONE; Quests[Q_BETRAYER]._qactive = QUEST_DONE;
@ -589,39 +594,52 @@ void ResyncMPQuests()
if (gbIsSpawn) if (gbIsSpawn)
return; return;
if (Quests[Q_SKELKING]._qactive == QUEST_INIT auto &kingQuest = Quests[Q_SKELKING];
&& currlevel >= Quests[Q_SKELKING]._qlevel - 1 if (kingQuest._qactive == QUEST_INIT
&& currlevel <= Quests[Q_SKELKING]._qlevel + 1) { && currlevel >= kingQuest._qlevel - 1
Quests[Q_SKELKING]._qactive = QUEST_ACTIVE; && currlevel <= kingQuest._qlevel + 1) {
NetSendCmdQuest(true, Q_SKELKING); kingQuest._qactive = QUEST_ACTIVE;
NetSendCmdQuest(true, kingQuest);
} }
if (Quests[Q_BUTCHER]._qactive == QUEST_INIT
&& currlevel >= Quests[Q_BUTCHER]._qlevel - 1 auto &butcherQuest = Quests[Q_BUTCHER];
&& currlevel <= Quests[Q_BUTCHER]._qlevel + 1) { if (butcherQuest._qactive == QUEST_INIT
Quests[Q_BUTCHER]._qactive = QUEST_ACTIVE; && currlevel >= butcherQuest._qlevel - 1
NetSendCmdQuest(true, Q_BUTCHER); && 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; auto &betrayerQuest = Quests[Q_BETRAYER];
NetSendCmdQuest(true, 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 }); 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; auto &cryptQuest = Quests[Q_GRAVE];
NetSendCmdQuest(true, 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; auto &defilerQuest = Quests[Q_DEFILER];
NetSendCmdQuest(true, 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; auto &nakrulQuest = Quests[Q_NAKRUL];
NetSendCmdQuest(true, 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; auto &cowQuest = Quests[Q_JERSEY];
NetSendCmdQuest(true, Q_JERSEY); if (cowQuest._qactive == QUEST_INIT && currlevel == cowQuest._qlevel - 1) {
cowQuest._qactive = QUEST_ACTIVE;
NetSendCmdQuest(true, cowQuest);
} }
} }

176
Source/towners.cpp

@ -297,45 +297,47 @@ void TalkToBarOwner(PlayerStruct &player, TownerStruct &barOwner)
return; 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 (player._pLvlVisited[2] || player._pLvlVisited[4]) {
if (Quests[Q_SKELKING]._qvar2 == 0) { if (kingQuest._qvar2 == 0) {
Quests[Q_SKELKING]._qvar2 = 1; kingQuest._qvar2 = 1;
Quests[Q_SKELKING]._qlog = true; kingQuest._qlog = true;
if (Quests[Q_SKELKING]._qactive == QUEST_INIT) { if (kingQuest._qactive == QUEST_INIT) {
Quests[Q_SKELKING]._qactive = QUEST_ACTIVE; kingQuest._qactive = QUEST_ACTIVE;
Quests[Q_SKELKING]._qvar1 = 1; kingQuest._qvar1 = 1;
} }
InitQTextMsg(TEXT_KING2); InitQTextMsg(TEXT_KING2);
NetSendCmdQuest(true, Q_SKELKING); NetSendCmdQuest(true, kingQuest);
return; return;
} }
if (Quests[Q_SKELKING]._qactive == QUEST_DONE && Quests[Q_SKELKING]._qvar2 == 1) { if (kingQuest._qactive == QUEST_DONE && kingQuest._qvar2 == 1) {
Quests[Q_SKELKING]._qvar2 = 2; kingQuest._qvar2 = 2;
Quests[Q_SKELKING]._qvar1 = 2; kingQuest._qvar1 = 2;
InitQTextMsg(TEXT_KING4); InitQTextMsg(TEXT_KING4);
NetSendCmdQuest(true, Q_SKELKING); NetSendCmdQuest(true, kingQuest);
return; return;
} }
} }
} }
if (Quests[Q_LTBANNER]._qactive != QUEST_NOTAVAIL) { auto &bannerQuest = Quests[Q_LTBANNER];
if (player._pLvlVisited[3] && Quests[Q_LTBANNER]._qactive != QUEST_DONE) { if (bannerQuest._qactive != QUEST_NOTAVAIL) {
if (Quests[Q_LTBANNER]._qvar2 == 0) { if (player._pLvlVisited[3] && bannerQuest._qactive != QUEST_DONE) {
Quests[Q_LTBANNER]._qvar2 = 1; if (bannerQuest._qvar2 == 0) {
if (Quests[Q_LTBANNER]._qactive == QUEST_INIT) { bannerQuest._qvar2 = 1;
Quests[Q_LTBANNER]._qvar1 = 1; if (bannerQuest._qactive == QUEST_INIT) {
Quests[Q_LTBANNER]._qactive = QUEST_ACTIVE; bannerQuest._qvar1 = 1;
bannerQuest._qactive = QUEST_ACTIVE;
} }
Quests[Q_LTBANNER]._qlog = true; bannerQuest._qlog = true;
InitQTextMsg(TEXT_BANNER2); InitQTextMsg(TEXT_BANNER2);
return; return;
} }
if (Quests[Q_LTBANNER]._qvar2 == 1 && player.TryRemoveInvItemById(IDI_BANNER)) { if (bannerQuest._qvar2 == 1 && player.TryRemoveInvItemById(IDI_BANNER)) {
Quests[Q_LTBANNER]._qactive = QUEST_DONE; bannerQuest._qactive = QUEST_DONE;
Quests[Q_LTBANNER]._qvar1 = 3; bannerQuest._qvar1 = 3;
SpawnUnique(UITEM_HARCREST, barOwner.position + DIR_SW); SpawnUnique(UITEM_HARCREST, barOwner.position + DIR_SW);
InitQTextMsg(TEXT_BANNER3); InitQTextMsg(TEXT_BANNER3);
return; return;
@ -349,20 +351,21 @@ void TalkToBarOwner(PlayerStruct &player, TownerStruct &barOwner)
void TalkToDeadguy(PlayerStruct &player, TownerStruct & /*deadguy*/) void TalkToDeadguy(PlayerStruct &player, TownerStruct & /*deadguy*/)
{ {
if (Quests[Q_BUTCHER]._qactive == QUEST_DONE) auto &quest = Quests[Q_BUTCHER];
if (quest._qactive == QUEST_DONE)
return; return;
if (Quests[Q_BUTCHER]._qvar1 == 1) { if (quest._qvar1 == 1) {
player.SaySpecific(HeroSpeech::YourDeathWillBeAvenged); player.SaySpecific(HeroSpeech::YourDeathWillBeAvenged);
return; return;
} }
Quests[Q_BUTCHER]._qactive = QUEST_ACTIVE; quest._qactive = QUEST_ACTIVE;
Quests[Q_BUTCHER]._qlog = true; quest._qlog = true;
Quests[Q_BUTCHER]._qmsg = TEXT_BUTCH9; quest._qmsg = TEXT_BUTCH9;
Quests[Q_BUTCHER]._qvar1 = 1; quest._qvar1 = 1;
InitQTextMsg(TEXT_BUTCH9); InitQTextMsg(TEXT_BUTCH9);
NetSendCmdQuest(true, Q_BUTCHER); NetSendCmdQuest(true, quest);
} }
void TalkToBlackSmith(PlayerStruct &player, TownerStruct &blackSmith) void TalkToBlackSmith(PlayerStruct &player, TownerStruct &blackSmith)
@ -517,29 +520,31 @@ void TalkToBoy(PlayerStruct & /*player*/, TownerStruct & /*boy*/)
void TalkToStoryteller(PlayerStruct &player, TownerStruct & /*storyteller*/) void TalkToStoryteller(PlayerStruct &player, TownerStruct & /*storyteller*/)
{ {
auto &betrayerQuest = Quests[Q_BETRAYER];
if (!gbIsMultiplayer) { 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); InitQTextMsg(TEXT_VILE1);
Quests[Q_BETRAYER]._qlog = true; betrayerQuest._qlog = true;
Quests[Q_BETRAYER]._qactive = QUEST_ACTIVE; betrayerQuest._qactive = QUEST_ACTIVE;
Quests[Q_BETRAYER]._qvar1 = 2; betrayerQuest._qvar1 = 2;
return; return;
} }
} else { } else {
if (Quests[Q_BETRAYER]._qactive == QUEST_ACTIVE && !Quests[Q_BETRAYER]._qlog) { if (betrayerQuest._qactive == QUEST_ACTIVE && !betrayerQuest._qlog) {
InitQTextMsg(TEXT_VILE1); InitQTextMsg(TEXT_VILE1);
Quests[Q_BETRAYER]._qlog = true; betrayerQuest._qlog = true;
NetSendCmdQuest(true, Q_BETRAYER); NetSendCmdQuest(true, betrayerQuest);
return; return;
} }
} }
if (Quests[Q_BETRAYER]._qactive == QUEST_DONE && Quests[Q_BETRAYER]._qvar1 == 7) { if (betrayerQuest._qactive == QUEST_DONE && betrayerQuest._qvar1 == 7) {
Quests[Q_BETRAYER]._qvar1 = 8; betrayerQuest._qvar1 = 8;
InitQTextMsg(TEXT_VILE3); InitQTextMsg(TEXT_VILE3);
Quests[Q_DIABLO]._qlog = true; auto &diabloQuest = Quests[Q_DIABLO];
diabloQuest._qlog = true;
if (gbIsMultiplayer) { if (gbIsMultiplayer) {
NetSendCmdQuest(true, Q_BETRAYER); NetSendCmdQuest(true, betrayerQuest);
NetSendCmdQuest(true, Q_DIABLO); NetSendCmdQuest(true, diabloQuest);
} }
return; return;
} }
@ -580,17 +585,18 @@ void TalkToCow(PlayerStruct &player, TownerStruct &cow)
void TalkToFarmer(PlayerStruct &player, TownerStruct &farmer) void TalkToFarmer(PlayerStruct &player, TownerStruct &farmer)
{ {
switch (Quests[Q_FARMER]._qactive) { auto &quest = Quests[Q_FARMER];
switch (quest._qactive) {
case QUEST_NOTAVAIL: case QUEST_NOTAVAIL:
case QUEST_INIT: case QUEST_INIT:
if (player.HasItem(IDI_RUNEBOMB)) { if (player.HasItem(IDI_RUNEBOMB)) {
InitQTextMsg(TEXT_FARMER2); InitQTextMsg(TEXT_FARMER2);
Quests[Q_FARMER]._qactive = QUEST_ACTIVE; quest._qactive = QUEST_ACTIVE;
Quests[Q_FARMER]._qvar1 = 1; quest._qvar1 = 1;
Quests[Q_FARMER]._qmsg = TEXT_FARMER1; quest._qmsg = TEXT_FARMER1;
Quests[Q_FARMER]._qlog = true; quest._qlog = true;
if (gbIsMultiplayer) if (gbIsMultiplayer)
NetSendCmdQuest(true, Q_FARMER); NetSendCmdQuest(true, quest);
break; break;
} }
@ -607,13 +613,13 @@ void TalkToFarmer(PlayerStruct &player, TownerStruct &farmer)
} }
InitQTextMsg(TEXT_FARMER1); InitQTextMsg(TEXT_FARMER1);
Quests[Q_FARMER]._qactive = QUEST_ACTIVE; quest._qactive = QUEST_ACTIVE;
Quests[Q_FARMER]._qvar1 = 1; quest._qvar1 = 1;
Quests[Q_FARMER]._qlog = true; quest._qlog = true;
Quests[Q_FARMER]._qmsg = TEXT_FARMER1; quest._qmsg = TEXT_FARMER1;
SpawnRuneBomb(farmer.position + Displacement { 1, 0 }); SpawnRuneBomb(farmer.position + Displacement { 1, 0 });
if (gbIsMultiplayer) if (gbIsMultiplayer)
NetSendCmdQuest(true, Q_FARMER); NetSendCmdQuest(true, quest);
break; break;
case QUEST_ACTIVE: case QUEST_ACTIVE:
InitQTextMsg(player.HasItem(IDI_RUNEBOMB) ? TEXT_FARMER2 : TEXT_FARMER3); InitQTextMsg(player.HasItem(IDI_RUNEBOMB) ? TEXT_FARMER2 : TEXT_FARMER3);
@ -621,10 +627,10 @@ void TalkToFarmer(PlayerStruct &player, TownerStruct &farmer)
case QUEST_DONE: case QUEST_DONE:
InitQTextMsg(TEXT_FARMER4); InitQTextMsg(TEXT_FARMER4);
SpawnRewardItem(IDI_AURIC, farmer.position + Displacement { 1, 0 }); SpawnRewardItem(IDI_AURIC, farmer.position + Displacement { 1, 0 });
Quests[Q_FARMER]._qactive = QUEST_HIVE_DONE; quest._qactive = QUEST_HIVE_DONE;
Quests[Q_FARMER]._qlog = false; quest._qlog = false;
if (gbIsMultiplayer) if (gbIsMultiplayer)
NetSendCmdQuest(true, Q_FARMER); NetSendCmdQuest(true, quest);
break; break;
case QUEST_HIVE_DONE: case QUEST_HIVE_DONE:
break; break;
@ -641,30 +647,32 @@ void TalkToCowFarmer(PlayerStruct &player, TownerStruct &cowFarmer)
return; return;
} }
auto &quest = Quests[Q_JERSEY];
if (player.TryRemoveInvItemById(IDI_BROWNSUIT)) { if (player.TryRemoveInvItemById(IDI_BROWNSUIT)) {
SpawnUnique(UITEM_BOVINE, cowFarmer.position + DIR_SE); SpawnUnique(UITEM_BOVINE, cowFarmer.position + DIR_SE);
InitQTextMsg(TEXT_JERSEY8); InitQTextMsg(TEXT_JERSEY8);
Quests[Q_JERSEY]._qactive = QUEST_DONE; quest._qactive = QUEST_DONE;
LoadTownerAnimations(cowFarmer, "Towners\\Farmer\\mfrmrn2.CEL", 15, DIR_SW, 3); LoadTownerAnimations(cowFarmer, "Towners\\Farmer\\mfrmrn2.CEL", 15, DIR_SW, 3);
return; return;
} }
if (player.HasItem(IDI_RUNEBOMB)) { if (player.HasItem(IDI_RUNEBOMB)) {
InitQTextMsg(TEXT_JERSEY5); InitQTextMsg(TEXT_JERSEY5);
Quests[Q_JERSEY]._qactive = QUEST_ACTIVE; quest._qactive = QUEST_ACTIVE;
Quests[Q_JERSEY]._qvar1 = 1; quest._qvar1 = 1;
Quests[Q_JERSEY]._qmsg = TEXT_JERSEY4; quest._qmsg = TEXT_JERSEY4;
Quests[Q_JERSEY]._qlog = true; quest._qlog = true;
return; return;
} }
switch (Quests[Q_JERSEY]._qactive) { switch (quest._qactive) {
case QUEST_NOTAVAIL: case QUEST_NOTAVAIL:
case QUEST_INIT: case QUEST_INIT:
InitQTextMsg(TEXT_JERSEY1); InitQTextMsg(TEXT_JERSEY1);
Quests[Q_JERSEY]._qactive = QUEST_HIVE_TEASE1; quest._qactive = QUEST_HIVE_TEASE1;
if (gbIsMultiplayer) if (gbIsMultiplayer)
NetSendCmdQuest(true, Q_JERSEY); NetSendCmdQuest(true, quest);
break; break;
case QUEST_ACTIVE: case QUEST_ACTIVE:
InitQTextMsg(TEXT_JERSEY5); InitQTextMsg(TEXT_JERSEY5);
@ -674,15 +682,15 @@ void TalkToCowFarmer(PlayerStruct &player, TownerStruct &cowFarmer)
break; break;
case QUEST_HIVE_TEASE1: case QUEST_HIVE_TEASE1:
InitQTextMsg(TEXT_JERSEY2); InitQTextMsg(TEXT_JERSEY2);
Quests[Q_JERSEY]._qactive = QUEST_HIVE_TEASE2; quest._qactive = QUEST_HIVE_TEASE2;
if (gbIsMultiplayer) if (gbIsMultiplayer)
NetSendCmdQuest(true, Q_JERSEY); NetSendCmdQuest(true, quest);
break; break;
case QUEST_HIVE_TEASE2: case QUEST_HIVE_TEASE2:
InitQTextMsg(TEXT_JERSEY3); InitQTextMsg(TEXT_JERSEY3);
Quests[Q_JERSEY]._qactive = QUEST_HIVE_ACTIVE; quest._qactive = QUEST_HIVE_ACTIVE;
if (gbIsMultiplayer) if (gbIsMultiplayer)
NetSendCmdQuest(true, Q_JERSEY); NetSendCmdQuest(true, quest);
break; break;
case QUEST_HIVE_ACTIVE: case QUEST_HIVE_ACTIVE:
if (!player._pLvlVisited[9] && player._pLevel < 15) { if (!player._pLvlVisited[9] && player._pLevel < 15) {
@ -703,13 +711,13 @@ void TalkToCowFarmer(PlayerStruct &player, TownerStruct &cowFarmer)
} }
InitQTextMsg(TEXT_JERSEY4); InitQTextMsg(TEXT_JERSEY4);
Quests[Q_JERSEY]._qactive = QUEST_ACTIVE; quest._qactive = QUEST_ACTIVE;
Quests[Q_JERSEY]._qvar1 = 1; quest._qvar1 = 1;
Quests[Q_JERSEY]._qmsg = TEXT_JERSEY4; quest._qmsg = TEXT_JERSEY4;
Quests[Q_JERSEY]._qlog = true; quest._qlog = true;
SpawnRuneBomb(cowFarmer.position + Displacement { 1, 0 }); SpawnRuneBomb(cowFarmer.position + Displacement { 1, 0 });
if (gbIsMultiplayer) if (gbIsMultiplayer)
NetSendCmdQuest(true, Q_JERSEY); NetSendCmdQuest(true, quest);
break; break;
default: default:
InitQTextMsg(TEXT_JERSEY5); InitQTextMsg(TEXT_JERSEY5);
@ -719,27 +727,29 @@ void TalkToCowFarmer(PlayerStruct &player, TownerStruct &cowFarmer)
void TalkToGirl(PlayerStruct &player, TownerStruct &girl) 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); InitQTextMsg(TEXT_GIRL4);
CreateAmulet(girl.position, 13, false, true); CreateAmulet(girl.position, 13, false, true);
Quests[Q_GIRL]._qlog = false; quest._qlog = false;
Quests[Q_GIRL]._qactive = QUEST_DONE; quest._qactive = QUEST_DONE;
LoadTownerAnimations(girl, "Towners\\Girl\\Girls1.CEL", 20, DIR_S, 6); LoadTownerAnimations(girl, "Towners\\Girl\\Girls1.CEL", 20, DIR_S, 6);
if (gbIsMultiplayer) if (gbIsMultiplayer)
NetSendCmdQuest(true, Q_GIRL); NetSendCmdQuest(true, quest);
return; return;
} }
switch (Quests[Q_GIRL]._qactive) { switch (quest._qactive) {
case QUEST_NOTAVAIL: case QUEST_NOTAVAIL:
case QUEST_INIT: case QUEST_INIT:
InitQTextMsg(TEXT_GIRL2); InitQTextMsg(TEXT_GIRL2);
Quests[Q_GIRL]._qactive = QUEST_ACTIVE; quest._qactive = QUEST_ACTIVE;
Quests[Q_GIRL]._qvar1 = 1; quest._qvar1 = 1;
Quests[Q_GIRL]._qlog = true; quest._qlog = true;
Quests[Q_GIRL]._qmsg = TEXT_GIRL2; quest._qmsg = TEXT_GIRL2;
if (gbIsMultiplayer) if (gbIsMultiplayer)
NetSendCmdQuest(true, Q_GIRL); NetSendCmdQuest(true, quest);
return; return;
case QUEST_ACTIVE: case QUEST_ACTIVE:
InitQTextMsg(TEXT_GIRL3); InitQTextMsg(TEXT_GIRL3);

Loading…
Cancel
Save