diff --git a/Source/diablo.cpp b/Source/diablo.cpp index c607de5a1..715e95ac0 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -106,11 +106,11 @@ uint16_t gnTickDelay = 50; Keymapper keymapper { // Workaround: remove once the INI library has been replaced. [](const std::string &key, const std::string &value) { - setIniValue("Keymapping", key.c_str(), value.c_str()); + SetIniValue("Keymapping", key.c_str(), value.c_str()); }, [](const std::string &key) -> std::string { std::array result; - if (!getIniValue("Keymapping", key.c_str(), result.data(), result.size())) + if (!GetIniValue("Keymapping", key.c_str(), result.data(), result.size())) return {}; return { result.data() }; } diff --git a/Source/items.cpp b/Source/items.cpp index ee2b25270..8e77566a5 100644 --- a/Source/items.cpp +++ b/Source/items.cpp @@ -3954,7 +3954,6 @@ void UseItem(int p, item_misc_id Mid, spell_id spl) case IMISC_SCROLL: if (spelldata[spl].sTargeted) { player._pTSpell = spl; - player._pTSplType = RSPLTYPE_INVALID; if (p == myplr) NewCursor(CURSOR_TELEPORT); } else { @@ -3972,7 +3971,6 @@ void UseItem(int p, item_misc_id Mid, spell_id spl) case IMISC_SCROLLT: if (spelldata[spl].sTargeted) { player._pTSpell = spl; - player._pTSplType = RSPLTYPE_INVALID; if (p == myplr) NewCursor(CURSOR_TELEPORT); } else { @@ -4032,31 +4030,26 @@ void UseItem(int p, item_misc_id Mid, spell_id spl) break; case IMISC_RUNEF: player._pTSpell = SPL_RUNEFIRE; - player._pTSplType = RSPLTYPE_INVALID; if (p == myplr) NewCursor(CURSOR_TELEPORT); break; case IMISC_RUNEL: player._pTSpell = SPL_RUNELIGHT; - player._pTSplType = RSPLTYPE_INVALID; if (p == myplr) NewCursor(CURSOR_TELEPORT); break; case IMISC_GR_RUNEL: player._pTSpell = SPL_RUNENOVA; - player._pTSplType = RSPLTYPE_INVALID; if (p == myplr) NewCursor(CURSOR_TELEPORT); break; case IMISC_GR_RUNEF: player._pTSpell = SPL_RUNEIMMOLAT; - player._pTSplType = RSPLTYPE_INVALID; if (p == myplr) NewCursor(CURSOR_TELEPORT); break; case IMISC_RUNES: player._pTSpell = SPL_RUNESTONE; - player._pTSplType = RSPLTYPE_INVALID; if (p == myplr) NewCursor(CURSOR_TELEPORT); break; diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index 9ab8d982a..74d5b9edc 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -74,10 +74,10 @@ class LoadHelper { size_t m_size_; template - T next() + T Next() { const auto size = sizeof(T); - if (!isValid(size)) + if (!IsValid(size)) return 0; T value; @@ -93,20 +93,20 @@ public: m_buffer_ = pfile_read(szFileName, &m_size_); } - bool isValid(uint32_t size = 1) + bool IsValid(uint32_t size = 1) { return m_buffer_ != nullptr && m_size_ >= (m_cur_ + size); } - void skip(uint32_t size) + void Skip(uint32_t size) { m_cur_ += size; } - void nextBytes(void *bytes, size_t size) + void NextBytes(void *bytes, size_t size) { - if (!isValid(size)) + if (!IsValid(size)) return; memcpy(bytes, &m_buffer_[m_cur_], size); @@ -114,25 +114,25 @@ public: } template - T nextLE() + T NextLE() { - return SwapLE(next()); + return SwapLE(Next()); } template - T nextBE() + T NextBE() { - return SwapBE(next()); + return SwapBE(Next()); } - bool nextBool8() + bool NextBool8() { - return next() != 0; + return Next() != 0; } - bool nextBool32() + bool NextBool32() { - return next() != 0; + return Next() != 0; } }; @@ -150,21 +150,21 @@ public: { } - bool isValid(uint32_t len = 1) + bool IsValid(uint32_t len = 1) { return m_buffer_ != nullptr && m_capacity_ >= (m_cur_ + len); } - void skip(uint32_t len) + void Skip(uint32_t len) { std::memset(&m_buffer_[m_cur_], 0, len); m_cur_ += len; } - void writeBytes(const void *bytes, size_t len) + void WriteBytes(const void *bytes, size_t len) { - if (!isValid(len)) + if (!IsValid(len)) return; memcpy(&m_buffer_[m_cur_], bytes, len); @@ -172,17 +172,17 @@ public: } template - void writeLE(T value) + void WriteLE(T value) { value = SwapLE(value); - writeBytes(&value, sizeof(value)); + WriteBytes(&value, sizeof(value)); } template - void writeBE(T value) + void WriteBE(T value) { value = SwapBE(value); - writeBytes(&value, sizeof(value)); + WriteBytes(&value, sizeof(value)); } ~SaveHelper() @@ -215,88 +215,88 @@ void RemoveInvalidItem(ItemStruct *pItem) static void LoadItemData(LoadHelper *file, ItemStruct *pItem) { - pItem->_iSeed = file->nextLE(); - pItem->_iCreateInfo = file->nextLE(); - file->skip(2); // Alignment - pItem->_itype = static_cast(file->nextLE()); - pItem->position.x = file->nextLE(); - pItem->position.y = file->nextLE(); - pItem->_iAnimFlag = file->nextBool32(); - file->skip(4); // Skip pointer _iAnimData + pItem->_iSeed = file->NextLE(); + pItem->_iCreateInfo = file->NextLE(); + file->Skip(2); // Alignment + pItem->_itype = static_cast(file->NextLE()); + pItem->position.x = file->NextLE(); + pItem->position.y = file->NextLE(); + pItem->_iAnimFlag = file->NextBool32(); + file->Skip(4); // Skip pointer _iAnimData pItem->AnimInfo = {}; - pItem->AnimInfo.NumberOfFrames = file->nextLE(); - pItem->AnimInfo.CurrentFrame = file->nextLE(); - file->skip(8); // Skip _iAnimWidth and _iAnimWidth2 - file->skip(4); // Unused since 1.02 - pItem->_iSelFlag = file->nextLE(); - file->skip(3); // Alignment - pItem->_iPostDraw = file->nextBool32(); - pItem->_iIdentified = file->nextBool32(); - pItem->_iMagical = static_cast(file->nextLE()); - file->nextBytes(pItem->_iName, 64); - file->nextBytes(pItem->_iIName, 64); - pItem->_iLoc = static_cast(file->nextLE()); - pItem->_iClass = static_cast(file->nextLE()); - file->skip(1); // Alignment - pItem->_iCurs = file->nextLE(); - pItem->_ivalue = file->nextLE(); - pItem->_iIvalue = file->nextLE(); - pItem->_iMinDam = file->nextLE(); - pItem->_iMaxDam = file->nextLE(); - pItem->_iAC = file->nextLE(); - pItem->_iFlags = file->nextLE(); - pItem->_iMiscId = static_cast(file->nextLE()); - pItem->_iSpell = static_cast(file->nextLE()); - pItem->_iCharges = file->nextLE(); - pItem->_iMaxCharges = file->nextLE(); - pItem->_iDurability = file->nextLE(); - pItem->_iMaxDur = file->nextLE(); - pItem->_iPLDam = file->nextLE(); - pItem->_iPLToHit = file->nextLE(); - pItem->_iPLAC = file->nextLE(); - pItem->_iPLStr = file->nextLE(); - pItem->_iPLMag = file->nextLE(); - pItem->_iPLDex = file->nextLE(); - pItem->_iPLVit = file->nextLE(); - pItem->_iPLFR = file->nextLE(); - pItem->_iPLLR = file->nextLE(); - pItem->_iPLMR = file->nextLE(); - pItem->_iPLMana = file->nextLE(); - pItem->_iPLHP = file->nextLE(); - pItem->_iPLDamMod = file->nextLE(); - pItem->_iPLGetHit = file->nextLE(); - pItem->_iPLLight = file->nextLE(); - pItem->_iSplLvlAdd = file->nextLE(); - pItem->_iRequest = file->nextBool8(); - file->skip(2); // Alignment - pItem->_iUid = file->nextLE(); - pItem->_iFMinDam = file->nextLE(); - pItem->_iFMaxDam = file->nextLE(); - pItem->_iLMinDam = file->nextLE(); - pItem->_iLMaxDam = file->nextLE(); - pItem->_iPLEnAc = file->nextLE(); - pItem->_iPrePower = static_cast(file->nextLE()); - pItem->_iSufPower = static_cast(file->nextLE()); - file->skip(2); // Alignment - pItem->_iVAdd1 = file->nextLE(); - pItem->_iVMult1 = file->nextLE(); - pItem->_iVAdd2 = file->nextLE(); - pItem->_iVMult2 = file->nextLE(); - pItem->_iMinStr = file->nextLE(); - pItem->_iMinMag = file->nextLE(); - pItem->_iMinDex = file->nextLE(); - file->skip(1); // Alignment - pItem->_iStatFlag = file->nextBool32(); - pItem->IDidx = static_cast<_item_indexes>(file->nextLE()); + pItem->AnimInfo.NumberOfFrames = file->NextLE(); + pItem->AnimInfo.CurrentFrame = file->NextLE(); + file->Skip(8); // Skip _iAnimWidth and _iAnimWidth2 + file->Skip(4); // Unused since 1.02 + pItem->_iSelFlag = file->NextLE(); + file->Skip(3); // Alignment + pItem->_iPostDraw = file->NextBool32(); + pItem->_iIdentified = file->NextBool32(); + pItem->_iMagical = static_cast(file->NextLE()); + file->NextBytes(pItem->_iName, 64); + file->NextBytes(pItem->_iIName, 64); + pItem->_iLoc = static_cast(file->NextLE()); + pItem->_iClass = static_cast(file->NextLE()); + file->Skip(1); // Alignment + pItem->_iCurs = file->NextLE(); + pItem->_ivalue = file->NextLE(); + pItem->_iIvalue = file->NextLE(); + pItem->_iMinDam = file->NextLE(); + pItem->_iMaxDam = file->NextLE(); + pItem->_iAC = file->NextLE(); + pItem->_iFlags = file->NextLE(); + pItem->_iMiscId = static_cast(file->NextLE()); + pItem->_iSpell = static_cast(file->NextLE()); + pItem->_iCharges = file->NextLE(); + pItem->_iMaxCharges = file->NextLE(); + pItem->_iDurability = file->NextLE(); + pItem->_iMaxDur = file->NextLE(); + pItem->_iPLDam = file->NextLE(); + pItem->_iPLToHit = file->NextLE(); + pItem->_iPLAC = file->NextLE(); + pItem->_iPLStr = file->NextLE(); + pItem->_iPLMag = file->NextLE(); + pItem->_iPLDex = file->NextLE(); + pItem->_iPLVit = file->NextLE(); + pItem->_iPLFR = file->NextLE(); + pItem->_iPLLR = file->NextLE(); + pItem->_iPLMR = file->NextLE(); + pItem->_iPLMana = file->NextLE(); + pItem->_iPLHP = file->NextLE(); + pItem->_iPLDamMod = file->NextLE(); + pItem->_iPLGetHit = file->NextLE(); + pItem->_iPLLight = file->NextLE(); + pItem->_iSplLvlAdd = file->NextLE(); + pItem->_iRequest = file->NextBool8(); + file->Skip(2); // Alignment + pItem->_iUid = file->NextLE(); + pItem->_iFMinDam = file->NextLE(); + pItem->_iFMaxDam = file->NextLE(); + pItem->_iLMinDam = file->NextLE(); + pItem->_iLMaxDam = file->NextLE(); + pItem->_iPLEnAc = file->NextLE(); + pItem->_iPrePower = static_cast(file->NextLE()); + pItem->_iSufPower = static_cast(file->NextLE()); + file->Skip(2); // Alignment + pItem->_iVAdd1 = file->NextLE(); + pItem->_iVMult1 = file->NextLE(); + pItem->_iVAdd2 = file->NextLE(); + pItem->_iVMult2 = file->NextLE(); + pItem->_iMinStr = file->NextLE(); + pItem->_iMinMag = file->NextLE(); + pItem->_iMinDex = file->NextLE(); + file->Skip(1); // Alignment + pItem->_iStatFlag = file->NextBool32(); + pItem->IDidx = static_cast<_item_indexes>(file->NextLE()); if (gbIsSpawn) { pItem->IDidx = RemapItemIdxFromSpawn(pItem->IDidx); } if (!gbIsHellfireSaveGame) { pItem->IDidx = RemapItemIdxFromDiablo(pItem->IDidx); } - pItem->dwBuff = file->nextLE(); + pItem->dwBuff = file->NextLE(); if (gbIsHellfireSaveGame) - pItem->_iDamAcFlags = file->nextLE(); + pItem->_iDamAcFlags = file->NextLE(); else pItem->_iDamAcFlags = 0; @@ -314,214 +314,214 @@ static void LoadPlayer(LoadHelper *file, int p) { auto &player = plr[p]; - player._pmode = static_cast(file->nextLE()); + player._pmode = static_cast(file->NextLE()); for (int8_t &step : player.walkpath) { - step = file->nextLE(); - } - player.plractive = file->nextBool8(); - file->skip(2); // Alignment - player.destAction = static_cast(file->nextLE()); - player.destParam1 = file->nextLE(); - player.destParam2 = file->nextLE(); - player.destParam3 = static_cast(file->nextLE()); - player.destParam4 = file->nextLE(); - player.plrlevel = file->nextLE(); - player.position.tile.x = file->nextLE(); - player.position.tile.y = file->nextLE(); - player.position.future.x = file->nextLE(); - player.position.future.y = file->nextLE(); - file->skip(8); // Skip _ptargx and _ptargy - player.position.last.x = file->nextLE(); - player.position.last.y = file->nextLE(); - player.position.old.x = file->nextLE(); - player.position.old.y = file->nextLE(); - player.position.offset.deltaX = file->nextLE(); - player.position.offset.deltaY = file->nextLE(); - player.position.velocity.deltaX = file->nextLE(); - player.position.velocity.deltaY = file->nextLE(); - player._pdir = static_cast(file->nextLE()); - file->skip(4); // Unused - player._pgfxnum = file->nextLE(); - file->skip(4); // Skip pointer pData + step = file->NextLE(); + } + player.plractive = file->NextBool8(); + file->Skip(2); // Alignment + player.destAction = static_cast(file->NextLE()); + player.destParam1 = file->NextLE(); + player.destParam2 = file->NextLE(); + player.destParam3 = static_cast(file->NextLE()); + player.destParam4 = file->NextLE(); + player.plrlevel = file->NextLE(); + player.position.tile.x = file->NextLE(); + player.position.tile.y = file->NextLE(); + player.position.future.x = file->NextLE(); + player.position.future.y = file->NextLE(); + file->Skip(8); // Skip _ptargx and _ptargy + player.position.last.x = file->NextLE(); + player.position.last.y = file->NextLE(); + player.position.old.x = file->NextLE(); + player.position.old.y = file->NextLE(); + player.position.offset.deltaX = file->NextLE(); + player.position.offset.deltaY = file->NextLE(); + player.position.velocity.deltaX = file->NextLE(); + player.position.velocity.deltaY = file->NextLE(); + player._pdir = static_cast(file->NextLE()); + file->Skip(4); // Unused + player._pgfxnum = file->NextLE(); + file->Skip(4); // Skip pointer pData player.AnimInfo = {}; - player.AnimInfo.TicksPerFrame = file->nextLE() + 1; - player.AnimInfo.TickCounterOfCurrentFrame = file->nextLE(); - player.AnimInfo.NumberOfFrames = file->nextLE(); - player.AnimInfo.CurrentFrame = file->nextLE(); - file->skip(4); // Skip _pAnimWidth - file->skip(4); // Skip _pAnimWidth2 - file->skip(4); // Skip _peflag - player._plid = file->nextLE(); - player._pvid = file->nextLE(); - - player._pSpell = static_cast(file->nextLE()); - player._pSplType = static_cast(file->nextLE()); - player._pSplFrom = file->nextLE(); - file->skip(2); // Alignment - player._pTSpell = static_cast(file->nextLE()); - player._pTSplType = static_cast(file->nextLE()); - file->skip(3); // Alignment - player._pRSpell = static_cast(file->nextLE()); - player._pRSplType = static_cast(file->nextLE()); - file->skip(3); // Alignment - player._pSBkSpell = static_cast(file->nextLE()); - player._pSBkSplType = static_cast(file->nextLE()); + player.AnimInfo.TicksPerFrame = file->NextLE() + 1; + player.AnimInfo.TickCounterOfCurrentFrame = file->NextLE(); + player.AnimInfo.NumberOfFrames = file->NextLE(); + player.AnimInfo.CurrentFrame = file->NextLE(); + file->Skip(4); // Skip _pAnimWidth + file->Skip(4); // Skip _pAnimWidth2 + file->Skip(4); // Skip _peflag + player._plid = file->NextLE(); + player._pvid = file->NextLE(); + + player._pSpell = static_cast(file->NextLE()); + player._pSplType = static_cast(file->NextLE()); + player._pSplFrom = file->NextLE(); + file->Skip(2); // Alignment + player._pTSpell = static_cast(file->NextLE()); + file->Skip(sizeof(int8_t)); // Skip _pTSplType + file->Skip(3); // Alignment + player._pRSpell = static_cast(file->NextLE()); + player._pRSplType = static_cast(file->NextLE()); + file->Skip(3); // Alignment + player._pSBkSpell = static_cast(file->NextLE()); + file->Skip(sizeof(int8_t)); // Skip _pSBkSplType for (int8_t &spellLevel : player._pSplLvl) - spellLevel = file->nextLE(); - file->skip(7); // Alignment - player._pMemSpells = file->nextLE(); - player._pAblSpells = file->nextLE(); - player._pScrlSpells = file->nextLE(); - player._pSpellFlags = file->nextLE(); - file->skip(3); // Alignment + spellLevel = file->NextLE(); + file->Skip(7); // Alignment + player._pMemSpells = file->NextLE(); + player._pAblSpells = file->NextLE(); + player._pScrlSpells = file->NextLE(); + player._pSpellFlags = file->NextLE(); + file->Skip(3); // Alignment for (auto &spell : player._pSplHotKey) - spell = static_cast(file->nextLE()); + spell = static_cast(file->NextLE()); for (auto &spellType : player._pSplTHotKey) - spellType = static_cast(file->nextLE()); - - player._pwtype = static_cast(file->nextLE()); - player._pBlockFlag = file->nextBool8(); - player._pInvincible = file->nextBool8(); - player._pLightRad = file->nextLE(); - player._pLvlChanging = file->nextBool8(); - - file->nextBytes(player._pName, PLR_NAME_LEN); - player._pClass = static_cast(file->nextLE()); - file->skip(3); // Alignment - player._pStrength = file->nextLE(); - player._pBaseStr = file->nextLE(); - player._pMagic = file->nextLE(); - player._pBaseMag = file->nextLE(); - player._pDexterity = file->nextLE(); - player._pBaseDex = file->nextLE(); - player._pVitality = file->nextLE(); - player._pBaseVit = file->nextLE(); - player._pStatPts = file->nextLE(); - player._pDamageMod = file->nextLE(); - player._pBaseToBlk = file->nextLE(); + spellType = static_cast(file->NextLE()); + + player._pwtype = static_cast(file->NextLE()); + player._pBlockFlag = file->NextBool8(); + player._pInvincible = file->NextBool8(); + player._pLightRad = file->NextLE(); + player._pLvlChanging = file->NextBool8(); + + file->NextBytes(player._pName, PLR_NAME_LEN); + player._pClass = static_cast(file->NextLE()); + file->Skip(3); // Alignment + player._pStrength = file->NextLE(); + player._pBaseStr = file->NextLE(); + player._pMagic = file->NextLE(); + player._pBaseMag = file->NextLE(); + player._pDexterity = file->NextLE(); + player._pBaseDex = file->NextLE(); + player._pVitality = file->NextLE(); + player._pBaseVit = file->NextLE(); + player._pStatPts = file->NextLE(); + player._pDamageMod = file->NextLE(); + player._pBaseToBlk = file->NextLE(); if (player._pBaseToBlk == 0) player._pBaseToBlk = ToBlkTbl[static_cast(player._pClass)]; - player._pHPBase = file->nextLE(); - player._pMaxHPBase = file->nextLE(); - player._pHitPoints = file->nextLE(); - player._pMaxHP = file->nextLE(); - file->skip(sizeof(int32_t)); // hpPer - derived value from hp and maxHP. - player._pManaBase = file->nextLE(); - player._pMaxManaBase = file->nextLE(); - player._pMana = file->nextLE(); - player._pMaxMana = file->nextLE(); - file->skip(sizeof(int32_t)); // manaPer - derived value from mana and maxMana - player._pLevel = file->nextLE(); - player._pMaxLvl = file->nextLE(); - file->skip(2); // Alignment - player._pExperience = file->nextLE(); - player._pMaxExp = file->nextLE(); - player._pNextExper = file->nextLE(); - player._pArmorClass = file->nextLE(); - player._pMagResist = file->nextLE(); - player._pFireResist = file->nextLE(); - player._pLghtResist = file->nextLE(); - player._pGold = file->nextLE(); - - player._pInfraFlag = file->nextBool32(); - player.position.temp.x = file->nextLE(); - player.position.temp.y = file->nextLE(); - player.tempDirection = static_cast(file->nextLE()); - player._pVar4 = file->nextLE(); - player._pVar5 = file->nextLE(); - player.position.offset2.deltaX = file->nextLE(); - player.position.offset2.deltaY = file->nextLE(); - file->skip(4); // Skip actionFrame + player._pHPBase = file->NextLE(); + player._pMaxHPBase = file->NextLE(); + player._pHitPoints = file->NextLE(); + player._pMaxHP = file->NextLE(); + file->Skip(sizeof(int32_t)); // Skip _pHPPer - always derived from hp and maxHP. + player._pManaBase = file->NextLE(); + player._pMaxManaBase = file->NextLE(); + player._pMana = file->NextLE(); + player._pMaxMana = file->NextLE(); + file->Skip(sizeof(int32_t)); // Skip _pManaPer - always derived from mana and maxMana + player._pLevel = file->NextLE(); + player._pMaxLvl = file->NextLE(); + file->Skip(2); // Alignment + player._pExperience = file->NextLE(); + player._pMaxExp = file->NextLE(); + player._pNextExper = file->NextLE(); + player._pArmorClass = file->NextLE(); + player._pMagResist = file->NextLE(); + player._pFireResist = file->NextLE(); + player._pLghtResist = file->NextLE(); + player._pGold = file->NextLE(); + + player._pInfraFlag = file->NextBool32(); + player.position.temp.x = file->NextLE(); + player.position.temp.y = file->NextLE(); + player.tempDirection = static_cast(file->NextLE()); + player._pVar4 = file->NextLE(); + player._pVar5 = file->NextLE(); + player.position.offset2.deltaX = file->NextLE(); + player.position.offset2.deltaY = file->NextLE(); + file->Skip(4); // Skip actionFrame for (uint8_t i = 0; i < giNumberOfLevels; i++) - player._pLvlVisited[i] = file->nextBool8(); + player._pLvlVisited[i] = file->NextBool8(); for (uint8_t i = 0; i < giNumberOfLevels; i++) - player._pSLvlVisited[i] = file->nextBool8(); - - file->skip(2); // Alignment - file->skip(4); // skip _pGFXLoad - file->skip(4 * 8); // Skip pointers _pNAnim - player._pNFrames = file->nextLE(); - file->skip(4); // skip _pNWidth - file->skip(4 * 8); // Skip pointers _pWAnim - player._pWFrames = file->nextLE(); - file->skip(4); // skip _pWWidth - file->skip(4 * 8); // Skip pointers _pAAnim - player._pAFrames = file->nextLE(); - file->skip(4); // skip _pAWidth - player._pAFNum = file->nextLE(); - file->skip(4 * 8); // Skip pointers _pLAnim - file->skip(4 * 8); // Skip pointers _pFAnim - file->skip(4 * 8); // Skip pointers _pTAnim - player._pSFrames = file->nextLE(); - file->skip(4); // skip _pSWidth - player._pSFNum = file->nextLE(); - file->skip(4 * 8); // Skip pointers _pHAnim - player._pHFrames = file->nextLE(); - file->skip(4); // skip _pHWidth - file->skip(4 * 8); // Skip pointers _pDAnim - player._pDFrames = file->nextLE(); - file->skip(4); // skip _pDWidth - file->skip(4 * 8); // Skip pointers _pBAnim - player._pBFrames = file->nextLE(); - file->skip(4); // skip _pBWidth + player._pSLvlVisited[i] = file->NextBool8(); + + file->Skip(2); // Alignment + file->Skip(4); // skip _pGFXLoad + file->Skip(4 * 8); // Skip pointers _pNAnim + player._pNFrames = file->NextLE(); + file->Skip(4); // skip _pNWidth + file->Skip(4 * 8); // Skip pointers _pWAnim + player._pWFrames = file->NextLE(); + file->Skip(4); // skip _pWWidth + file->Skip(4 * 8); // Skip pointers _pAAnim + player._pAFrames = file->NextLE(); + file->Skip(4); // skip _pAWidth + player._pAFNum = file->NextLE(); + file->Skip(4 * 8); // Skip pointers _pLAnim + file->Skip(4 * 8); // Skip pointers _pFAnim + file->Skip(4 * 8); // Skip pointers _pTAnim + player._pSFrames = file->NextLE(); + file->Skip(4); // skip _pSWidth + player._pSFNum = file->NextLE(); + file->Skip(4 * 8); // Skip pointers _pHAnim + player._pHFrames = file->NextLE(); + file->Skip(4); // skip _pHWidth + file->Skip(4 * 8); // Skip pointers _pDAnim + player._pDFrames = file->NextLE(); + file->Skip(4); // skip _pDWidth + file->Skip(4 * 8); // Skip pointers _pBAnim + player._pBFrames = file->NextLE(); + file->Skip(4); // skip _pBWidth LoadItems(file, NUM_INVLOC, player.InvBody); LoadItems(file, NUM_INV_GRID_ELEM, player.InvList); - player._pNumInv = file->nextLE(); + player._pNumInv = file->NextLE(); for (int8_t &cell : player.InvGrid) - cell = file->nextLE(); + cell = file->NextLE(); LoadItems(file, MAXBELTITEMS, player.SpdList); LoadItemData(file, &player.HoldItem); - player._pIMinDam = file->nextLE(); - player._pIMaxDam = file->nextLE(); - player._pIAC = file->nextLE(); - player._pIBonusDam = file->nextLE(); - player._pIBonusToHit = file->nextLE(); - player._pIBonusAC = file->nextLE(); - player._pIBonusDamMod = file->nextLE(); - file->skip(4); // Alignment - - player._pISpells = file->nextLE(); - player._pIFlags = file->nextLE(); - player._pIGetHit = file->nextLE(); - player._pISplLvlAdd = file->nextLE(); - file->skip(1); // Unused - file->skip(2); // Alignment - player._pISplDur = file->nextLE(); - player._pIEnAc = file->nextLE(); - player._pIFMinDam = file->nextLE(); - player._pIFMaxDam = file->nextLE(); - player._pILMinDam = file->nextLE(); - player._pILMaxDam = file->nextLE(); - player._pOilType = static_cast(file->nextLE()); - player.pTownWarps = file->nextLE(); - player.pDungMsgs = file->nextLE(); - player.pLvlLoad = file->nextLE(); + player._pIMinDam = file->NextLE(); + player._pIMaxDam = file->NextLE(); + player._pIAC = file->NextLE(); + player._pIBonusDam = file->NextLE(); + player._pIBonusToHit = file->NextLE(); + player._pIBonusAC = file->NextLE(); + player._pIBonusDamMod = file->NextLE(); + file->Skip(4); // Alignment + + player._pISpells = file->NextLE(); + player._pIFlags = file->NextLE(); + player._pIGetHit = file->NextLE(); + player._pISplLvlAdd = file->NextLE(); + file->Skip(1); // Unused + file->Skip(2); // Alignment + player._pISplDur = file->NextLE(); + player._pIEnAc = file->NextLE(); + player._pIFMinDam = file->NextLE(); + player._pIFMaxDam = file->NextLE(); + player._pILMinDam = file->NextLE(); + player._pILMaxDam = file->NextLE(); + player._pOilType = static_cast(file->NextLE()); + player.pTownWarps = file->NextLE(); + player.pDungMsgs = file->NextLE(); + player.pLvlLoad = file->NextLE(); if (gbIsHellfireSaveGame) { - player.pDungMsgs2 = file->nextLE(); + player.pDungMsgs2 = file->NextLE(); player.pBattleNet = false; } else { player.pDungMsgs2 = 0; - player.pBattleNet = file->nextBool8(); + player.pBattleNet = file->NextBool8(); } - player.pManaShield = file->nextBool8(); + player.pManaShield = file->NextBool8(); if (gbIsHellfireSaveGame) { - player.pOriginalCathedral = file->nextBool8(); + player.pOriginalCathedral = file->NextBool8(); } else { - file->skip(1); + file->Skip(1); player.pOriginalCathedral = true; } - file->skip(2); // Available bytes - player.wReflections = file->nextLE(); - file->skip(14); // Available bytes + file->Skip(2); // Available bytes + player.wReflections = file->NextLE(); + file->Skip(14); // Available bytes - player.pDiabloKillLevel = file->nextLE(); - player.pDifficulty = static_cast<_difficulty>(file->nextLE()); - player.pDamAcFlags = file->nextLE(); - file->skip(20); // Available bytes + player.pDiabloKillLevel = file->NextLE(); + player.pDifficulty = static_cast<_difficulty>(file->NextLE()); + player.pDamAcFlags = file->NextLE(); + file->Skip(20); // Available bytes CalcPlrItemVals(p, false); // Omit pointer _pNData @@ -542,94 +542,94 @@ static void LoadMonster(LoadHelper *file, int i) { MonsterStruct *pMonster = &monster[i]; - pMonster->_mMTidx = file->nextLE(); - pMonster->_mmode = static_cast(file->nextLE()); - pMonster->_mgoal = static_cast(file->nextLE()); - file->skip(3); // Alignment - pMonster->_mgoalvar1 = file->nextLE(); - pMonster->_mgoalvar2 = file->nextLE(); - pMonster->_mgoalvar3 = file->nextLE(); - file->skip(4); // Unused - pMonster->_pathcount = file->nextLE(); - file->skip(3); // Alignment - pMonster->position.tile.x = file->nextLE(); - pMonster->position.tile.y = file->nextLE(); - pMonster->position.future.x = file->nextLE(); - pMonster->position.future.y = file->nextLE(); - pMonster->position.old.x = file->nextLE(); - pMonster->position.old.y = file->nextLE(); - pMonster->position.offset.deltaX = file->nextLE(); - pMonster->position.offset.deltaY = file->nextLE(); - pMonster->position.velocity.deltaX = file->nextLE(); - pMonster->position.velocity.deltaY = file->nextLE(); - pMonster->_mdir = static_cast(file->nextLE()); - pMonster->_menemy = file->nextLE(); - pMonster->enemyPosition.x = file->nextLE(); - pMonster->enemyPosition.y = file->nextLE(); - file->skip(2); // Unused - - file->skip(4); // Skip pointer _mAnimData + pMonster->_mMTidx = file->NextLE(); + pMonster->_mmode = static_cast(file->NextLE()); + pMonster->_mgoal = static_cast(file->NextLE()); + file->Skip(3); // Alignment + pMonster->_mgoalvar1 = file->NextLE(); + pMonster->_mgoalvar2 = file->NextLE(); + pMonster->_mgoalvar3 = file->NextLE(); + file->Skip(4); // Unused + pMonster->_pathcount = file->NextLE(); + file->Skip(3); // Alignment + pMonster->position.tile.x = file->NextLE(); + pMonster->position.tile.y = file->NextLE(); + pMonster->position.future.x = file->NextLE(); + pMonster->position.future.y = file->NextLE(); + pMonster->position.old.x = file->NextLE(); + pMonster->position.old.y = file->NextLE(); + pMonster->position.offset.deltaX = file->NextLE(); + pMonster->position.offset.deltaY = file->NextLE(); + pMonster->position.velocity.deltaX = file->NextLE(); + pMonster->position.velocity.deltaY = file->NextLE(); + pMonster->_mdir = static_cast(file->NextLE()); + pMonster->_menemy = file->NextLE(); + pMonster->enemyPosition.x = file->NextLE(); + pMonster->enemyPosition.y = file->NextLE(); + file->Skip(2); // Unused + + file->Skip(4); // Skip pointer _mAnimData pMonster->AnimInfo = {}; - pMonster->AnimInfo.TicksPerFrame = file->nextLE(); - pMonster->AnimInfo.TickCounterOfCurrentFrame = file->nextLE(); - pMonster->AnimInfo.NumberOfFrames = file->nextLE(); - pMonster->AnimInfo.CurrentFrame = file->nextLE(); - file->skip(4); // Skip _meflag - pMonster->_mDelFlag = file->nextBool32(); - pMonster->_mVar1 = file->nextLE(); - pMonster->_mVar2 = file->nextLE(); - pMonster->_mVar3 = file->nextLE(); - pMonster->position.temp.x = file->nextLE(); - pMonster->position.temp.y = file->nextLE(); - pMonster->position.offset2.deltaX = file->nextLE(); - pMonster->position.offset2.deltaY = file->nextLE(); - file->skip(4); // Skip actionFrame - pMonster->_mmaxhp = file->nextLE(); - pMonster->_mhitpoints = file->nextLE(); - - pMonster->_mAi = static_cast<_mai_id>(file->nextLE()); - pMonster->_mint = file->nextLE(); - file->skip(2); // Alignment - pMonster->_mFlags = file->nextLE(); - pMonster->_msquelch = file->nextLE(); - file->skip(3); // Alignment - file->skip(4); // Unused - pMonster->position.last.x = file->nextLE(); - pMonster->position.last.y = file->nextLE(); - pMonster->_mRndSeed = file->nextLE(); - pMonster->_mAISeed = file->nextLE(); - file->skip(4); // Unused - - pMonster->_uniqtype = file->nextLE(); - pMonster->_uniqtrans = file->nextLE(); - pMonster->_udeadval = file->nextLE(); - - pMonster->mWhoHit = file->nextLE(); - pMonster->mLevel = file->nextLE(); - file->skip(1); // Alignment - pMonster->mExp = file->nextLE(); + pMonster->AnimInfo.TicksPerFrame = file->NextLE(); + pMonster->AnimInfo.TickCounterOfCurrentFrame = file->NextLE(); + pMonster->AnimInfo.NumberOfFrames = file->NextLE(); + pMonster->AnimInfo.CurrentFrame = file->NextLE(); + file->Skip(4); // Skip _meflag + pMonster->_mDelFlag = file->NextBool32(); + pMonster->_mVar1 = file->NextLE(); + pMonster->_mVar2 = file->NextLE(); + pMonster->_mVar3 = file->NextLE(); + pMonster->position.temp.x = file->NextLE(); + pMonster->position.temp.y = file->NextLE(); + pMonster->position.offset2.deltaX = file->NextLE(); + pMonster->position.offset2.deltaY = file->NextLE(); + file->Skip(4); // Skip actionFrame + pMonster->_mmaxhp = file->NextLE(); + pMonster->_mhitpoints = file->NextLE(); + + pMonster->_mAi = static_cast<_mai_id>(file->NextLE()); + pMonster->_mint = file->NextLE(); + file->Skip(2); // Alignment + pMonster->_mFlags = file->NextLE(); + pMonster->_msquelch = file->NextLE(); + file->Skip(3); // Alignment + file->Skip(4); // Unused + pMonster->position.last.x = file->NextLE(); + pMonster->position.last.y = file->NextLE(); + pMonster->_mRndSeed = file->NextLE(); + pMonster->_mAISeed = file->NextLE(); + file->Skip(4); // Unused + + pMonster->_uniqtype = file->NextLE(); + pMonster->_uniqtrans = file->NextLE(); + pMonster->_udeadval = file->NextLE(); + + pMonster->mWhoHit = file->NextLE(); + pMonster->mLevel = file->NextLE(); + file->Skip(1); // Alignment + pMonster->mExp = file->NextLE(); if (i < MAX_PLRS) // Don't skip for golems - pMonster->mHit = file->nextLE(); + pMonster->mHit = file->NextLE(); else - file->skip(1); // Skip mHit as it's already initialized - pMonster->mMinDamage = file->nextLE(); - pMonster->mMaxDamage = file->nextLE(); - file->skip(1); // Skip mHit2 as it's already initialized - pMonster->mMinDamage2 = file->nextLE(); - pMonster->mMaxDamage2 = file->nextLE(); - pMonster->mArmorClass = file->nextLE(); - file->skip(1); // Alignment - pMonster->mMagicRes = file->nextLE(); - file->skip(2); // Alignment - - pMonster->mtalkmsg = static_cast<_speech_id>(file->nextLE()); + file->Skip(1); // Skip mHit as it's already initialized + pMonster->mMinDamage = file->NextLE(); + pMonster->mMaxDamage = file->NextLE(); + file->Skip(1); // Skip mHit2 as it's already initialized + pMonster->mMinDamage2 = file->NextLE(); + pMonster->mMaxDamage2 = file->NextLE(); + pMonster->mArmorClass = file->NextLE(); + file->Skip(1); // Alignment + pMonster->mMagicRes = file->NextLE(); + file->Skip(2); // Alignment + + pMonster->mtalkmsg = static_cast<_speech_id>(file->NextLE()); if (pMonster->mtalkmsg == TEXT_KING1) // Fix original bad mapping of NONE for monsters pMonster->mtalkmsg = TEXT_NONE; - pMonster->leader = file->nextLE(); - pMonster->leaderflag = file->nextLE(); - pMonster->packsize = file->nextLE(); - pMonster->mlid = file->nextLE(); + pMonster->leader = file->NextLE(); + pMonster->leaderflag = file->NextLE(); + pMonster->packsize = file->NextLE(); + pMonster->mlid = file->NextLE(); if (pMonster->mlid == plr[myplr]._plid) pMonster->mlid = NO_LIGHT; // Correct incorect values in old saves @@ -647,90 +647,90 @@ static void LoadMissile(LoadHelper *file, int i) { MissileStruct *pMissile = &missile[i]; - pMissile->_mitype = file->nextLE(); - pMissile->position.tile.x = file->nextLE(); - pMissile->position.tile.y = file->nextLE(); - pMissile->position.offset.deltaX = file->nextLE(); - pMissile->position.offset.deltaY = file->nextLE(); - pMissile->position.velocity.deltaX = file->nextLE(); - pMissile->position.velocity.deltaY = file->nextLE(); - pMissile->position.start.x = file->nextLE(); - pMissile->position.start.y = file->nextLE(); - pMissile->position.traveled.deltaX = file->nextLE(); - pMissile->position.traveled.deltaY = file->nextLE(); - pMissile->_mimfnum = file->nextLE(); - pMissile->_mispllvl = file->nextLE(); - pMissile->_miDelFlag = file->nextBool32(); - pMissile->_miAnimType = file->nextLE(); - file->skip(3); // Alignment - pMissile->_miAnimFlags = file->nextLE(); - file->skip(4); // Skip pointer _miAnimData - pMissile->_miAnimDelay = file->nextLE(); - pMissile->_miAnimLen = file->nextLE(); - pMissile->_miAnimWidth = file->nextLE(); - pMissile->_miAnimWidth2 = file->nextLE(); - pMissile->_miAnimCnt = file->nextLE(); - pMissile->_miAnimAdd = file->nextLE(); - pMissile->_miAnimFrame = file->nextLE(); - pMissile->_miDrawFlag = file->nextBool32(); - pMissile->_miLightFlag = file->nextBool32(); - pMissile->_miPreFlag = file->nextBool32(); - pMissile->_miUniqTrans = file->nextLE(); - pMissile->_mirange = file->nextLE(); - pMissile->_misource = file->nextLE(); - pMissile->_micaster = file->nextLE(); - pMissile->_midam = file->nextLE(); - pMissile->_miHitFlag = file->nextBool32(); - pMissile->_midist = file->nextLE(); - pMissile->_mlid = file->nextLE(); - pMissile->_mirnd = file->nextLE(); - pMissile->_miVar1 = file->nextLE(); - pMissile->_miVar2 = file->nextLE(); - pMissile->_miVar3 = file->nextLE(); - pMissile->_miVar4 = file->nextLE(); - pMissile->_miVar5 = file->nextLE(); - pMissile->_miVar6 = file->nextLE(); - pMissile->_miVar7 = file->nextLE(); - pMissile->limitReached = file->nextBool32(); + pMissile->_mitype = file->NextLE(); + pMissile->position.tile.x = file->NextLE(); + pMissile->position.tile.y = file->NextLE(); + pMissile->position.offset.deltaX = file->NextLE(); + pMissile->position.offset.deltaY = file->NextLE(); + pMissile->position.velocity.deltaX = file->NextLE(); + pMissile->position.velocity.deltaY = file->NextLE(); + pMissile->position.start.x = file->NextLE(); + pMissile->position.start.y = file->NextLE(); + pMissile->position.traveled.deltaX = file->NextLE(); + pMissile->position.traveled.deltaY = file->NextLE(); + pMissile->_mimfnum = file->NextLE(); + pMissile->_mispllvl = file->NextLE(); + pMissile->_miDelFlag = file->NextBool32(); + pMissile->_miAnimType = file->NextLE(); + file->Skip(3); // Alignment + pMissile->_miAnimFlags = file->NextLE(); + file->Skip(4); // Skip pointer _miAnimData + pMissile->_miAnimDelay = file->NextLE(); + pMissile->_miAnimLen = file->NextLE(); + pMissile->_miAnimWidth = file->NextLE(); + pMissile->_miAnimWidth2 = file->NextLE(); + pMissile->_miAnimCnt = file->NextLE(); + pMissile->_miAnimAdd = file->NextLE(); + pMissile->_miAnimFrame = file->NextLE(); + pMissile->_miDrawFlag = file->NextBool32(); + pMissile->_miLightFlag = file->NextBool32(); + pMissile->_miPreFlag = file->NextBool32(); + pMissile->_miUniqTrans = file->NextLE(); + pMissile->_mirange = file->NextLE(); + pMissile->_misource = file->NextLE(); + pMissile->_micaster = file->NextLE(); + pMissile->_midam = file->NextLE(); + pMissile->_miHitFlag = file->NextBool32(); + pMissile->_midist = file->NextLE(); + pMissile->_mlid = file->NextLE(); + pMissile->_mirnd = file->NextLE(); + pMissile->_miVar1 = file->NextLE(); + pMissile->_miVar2 = file->NextLE(); + pMissile->_miVar3 = file->NextLE(); + pMissile->_miVar4 = file->NextLE(); + pMissile->_miVar5 = file->NextLE(); + pMissile->_miVar6 = file->NextLE(); + pMissile->_miVar7 = file->NextLE(); + pMissile->limitReached = file->NextBool32(); } static void LoadObject(LoadHelper *file, int i) { ObjectStruct *pObject = &object[i]; - pObject->_otype = static_cast<_object_id>(file->nextLE()); - pObject->position.x = file->nextLE(); - pObject->position.y = file->nextLE(); - pObject->_oLight = file->nextBool32(); - pObject->_oAnimFlag = file->nextLE(); - file->skip(4); // Skip pointer _oAnimData - pObject->_oAnimDelay = file->nextLE(); - pObject->_oAnimCnt = file->nextLE(); - pObject->_oAnimLen = file->nextLE(); - pObject->_oAnimFrame = file->nextLE(); - pObject->_oAnimWidth = file->nextLE(); - file->skip(4); // Skip _oAnimWidth2 - pObject->_oDelFlag = file->nextBool32(); - pObject->_oBreak = file->nextLE(); - file->skip(3); // Alignment - pObject->_oSolidFlag = file->nextBool32(); - pObject->_oMissFlag = file->nextBool32(); - - pObject->_oSelFlag = file->nextLE(); - file->skip(3); // Alignment - pObject->_oPreFlag = file->nextBool32(); - pObject->_oTrapFlag = file->nextBool32(); - pObject->_oDoorFlag = file->nextBool32(); - pObject->_olid = file->nextLE(); - pObject->_oRndSeed = file->nextLE(); - pObject->_oVar1 = file->nextLE(); - pObject->_oVar2 = file->nextLE(); - pObject->_oVar3 = file->nextLE(); - pObject->_oVar4 = file->nextLE(); - pObject->_oVar5 = file->nextLE(); - pObject->_oVar6 = file->nextLE(); - pObject->_oVar7 = static_cast<_speech_id>(file->nextLE()); - pObject->_oVar8 = file->nextLE(); + pObject->_otype = static_cast<_object_id>(file->NextLE()); + pObject->position.x = file->NextLE(); + pObject->position.y = file->NextLE(); + pObject->_oLight = file->NextBool32(); + pObject->_oAnimFlag = file->NextLE(); + file->Skip(4); // Skip pointer _oAnimData + pObject->_oAnimDelay = file->NextLE(); + pObject->_oAnimCnt = file->NextLE(); + pObject->_oAnimLen = file->NextLE(); + pObject->_oAnimFrame = file->NextLE(); + pObject->_oAnimWidth = file->NextLE(); + file->Skip(4); // Skip _oAnimWidth2 + pObject->_oDelFlag = file->NextBool32(); + pObject->_oBreak = file->NextLE(); + file->Skip(3); // Alignment + pObject->_oSolidFlag = file->NextBool32(); + pObject->_oMissFlag = file->NextBool32(); + + pObject->_oSelFlag = file->NextLE(); + file->Skip(3); // Alignment + pObject->_oPreFlag = file->NextBool32(); + pObject->_oTrapFlag = file->NextBool32(); + pObject->_oDoorFlag = file->NextBool32(); + pObject->_olid = file->NextLE(); + pObject->_oRndSeed = file->NextLE(); + pObject->_oVar1 = file->NextLE(); + pObject->_oVar2 = file->NextLE(); + pObject->_oVar3 = file->NextLE(); + pObject->_oVar4 = file->NextLE(); + pObject->_oVar5 = file->NextLE(); + pObject->_oVar6 = file->NextLE(); + pObject->_oVar7 = static_cast<_speech_id>(file->NextLE()); + pObject->_oVar8 = file->NextLE(); } static void LoadItem(LoadHelper *file, int i) @@ -748,61 +748,61 @@ static void LoadQuest(LoadHelper *file, int i) { QuestStruct *pQuest = &quests[i]; - pQuest->_qlevel = file->nextLE(); - pQuest->_qtype = file->nextLE(); - 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 = file->nextLE(); + pQuest->_qlevel = file->NextLE(); + pQuest->_qtype = file->NextLE(); + 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 = file->NextLE(); if (gbIsHellfireSaveGame) { - file->skip(2); // Alignment - pQuest->_qmsg = static_cast<_speech_id>(file->nextLE()); + file->Skip(2); // Alignment + pQuest->_qmsg = static_cast<_speech_id>(file->NextLE()); } else { - pQuest->_qmsg = static_cast<_speech_id>(file->nextLE()); + pQuest->_qmsg = static_cast<_speech_id>(file->NextLE()); } - pQuest->_qvar1 = file->nextLE(); - pQuest->_qvar2 = file->nextLE(); - file->skip(2); // Alignment + pQuest->_qvar1 = file->NextLE(); + pQuest->_qvar2 = file->NextLE(); + file->Skip(2); // Alignment if (!gbIsHellfireSaveGame) - file->skip(1); // Alignment - pQuest->_qlog = file->nextBool32(); - - ReturnLvlX = file->nextBE(); - ReturnLvlY = file->nextBE(); - ReturnLvl = file->nextBE(); - ReturnLvlT = static_cast(file->nextBE()); - DoomQuestState = file->nextBE(); + file->Skip(1); // Alignment + pQuest->_qlog = file->NextBool32(); + + ReturnLvlX = file->NextBE(); + ReturnLvlY = file->NextBE(); + ReturnLvl = file->NextBE(); + ReturnLvlT = static_cast(file->NextBE()); + DoomQuestState = file->NextBE(); } static void LoadLighting(LoadHelper *file, LightListStruct *pLight) { - pLight->position.tile.x = file->nextLE(); - pLight->position.tile.y = file->nextLE(); - pLight->_lradius = file->nextLE(); - pLight->_lid = file->nextLE(); - pLight->_ldel = file->nextBool32(); - pLight->_lunflag = file->nextBool32(); - file->skip(4); // Unused - pLight->position.old.x = file->nextLE(); - pLight->position.old.y = file->nextLE(); - pLight->oldRadius = file->nextLE(); - pLight->position.offset.x = file->nextLE(); - pLight->position.offset.y = file->nextLE(); - pLight->_lflags = file->nextBool32(); + pLight->position.tile.x = file->NextLE(); + pLight->position.tile.y = file->NextLE(); + pLight->_lradius = file->NextLE(); + pLight->_lid = file->NextLE(); + pLight->_ldel = file->NextBool32(); + pLight->_lunflag = file->NextBool32(); + file->Skip(4); // Unused + pLight->position.old.x = file->NextLE(); + pLight->position.old.y = file->NextLE(); + pLight->oldRadius = file->NextLE(); + pLight->position.offset.x = file->NextLE(); + pLight->position.offset.y = file->NextLE(); + pLight->_lflags = file->NextBool32(); } static void LoadPortal(LoadHelper *file, int i) { PortalStruct *pPortal = &portal[i]; - pPortal->open = file->nextBool32(); - pPortal->position.x = file->nextLE(); - pPortal->position.y = file->nextLE(); - pPortal->level = file->nextLE(); - pPortal->ltype = static_cast(file->nextLE()); - pPortal->setlvl = file->nextBool32(); + pPortal->open = file->NextBool32(); + pPortal->position.x = file->NextLE(); + pPortal->position.y = file->NextLE(); + pPortal->level = file->NextLE(); + pPortal->ltype = static_cast(file->NextLE()); + pPortal->setlvl = file->NextBool32(); } _item_indexes RemapItemIdxFromDiablo(_item_indexes i) @@ -985,19 +985,19 @@ static void ConvertLevels() void LoadHotkeys() { LoadHelper file("hotkeys"); - if (!file.isValid()) + if (!file.IsValid()) return; auto &myPlayer = plr[myplr]; for (auto &spellId : myPlayer._pSplHotKey) { - spellId = static_cast(file.nextLE()); + spellId = static_cast(file.NextLE()); } for (auto &spellType : myPlayer._pSplTHotKey) { - spellType = static_cast(file.nextLE()); + spellType = static_cast(file.NextLE()); } - myPlayer._pRSpell = static_cast(file.nextLE()); - myPlayer._pRSplType = static_cast(file.nextLE()); + myPlayer._pRSpell = static_cast(file.NextLE()); + myPlayer._pRSplType = static_cast(file.NextLE()); } void SaveHotkeys() @@ -1010,13 +1010,13 @@ void SaveHotkeys() SaveHelper file("hotkeys", (nHotkeyTypes * 4) + nHotkeySpells + 4 + 1); for (auto &spellId : myPlayer._pSplHotKey) { - file.writeLE(spellId); + file.WriteLE(spellId); } for (auto &spellType : myPlayer._pSplTHotKey) { - file.writeLE(spellType); + file.WriteLE(spellType); } - file.writeLE(myPlayer._pRSpell); - file.writeLE(myPlayer._pRSplType); + file.WriteLE(myPlayer._pRSpell); + file.WriteLE(myPlayer._pRSplType); } static void LoadMatchingItems(LoadHelper *file, const int n, ItemStruct *pItem) @@ -1036,10 +1036,10 @@ static void LoadMatchingItems(LoadHelper *file, const int n, ItemStruct *pItem) void LoadHeroItems(PlayerStruct &player) { LoadHelper file("heroitems"); - if (!file.isValid()) + if (!file.IsValid()) return; - gbIsHellfireSaveGame = file.nextBool8(); + gbIsHellfireSaveGame = file.NextBool8(); LoadMatchingItems(&file, NUM_INVLOC, player.InvBody); LoadMatchingItems(&file, NUM_INV_GRID_ELEM, player.InvList); @@ -1079,10 +1079,10 @@ void LoadGame(bool firstflag) pfile_remove_temp_files(); LoadHelper file("game"); - if (!file.isValid()) + if (!file.IsValid()) app_fatal("%s", _("Unable to open save file archive")); - if (!IsHeaderValid(file.nextLE())) + if (!IsHeaderValid(file.NextLE())) app_fatal("%s", _("Invalid save file")); if (gbIsHellfireSaveGame) { @@ -1096,27 +1096,27 @@ void LoadGame(bool firstflag) giNumberOfSmithPremiumItems = 6; } - setlevel = file.nextBool8(); - setlvlnum = static_cast<_setlevels>(file.nextBE()); - currlevel = file.nextBE(); - leveltype = static_cast(file.nextBE()); + setlevel = file.NextBool8(); + setlvlnum = static_cast<_setlevels>(file.NextBE()); + currlevel = file.NextBE(); + leveltype = static_cast(file.NextBE()); if (!setlevel) leveltype = gnLevelTypeTbl[currlevel]; - int viewX = file.nextBE(); - int viewY = file.nextBE(); - invflag = file.nextBool8(); - chrflag = file.nextBool8(); - int tmpNummonsters = file.nextBE(); - int tmpNumitems = file.nextBE(); - int tmpNummissiles = file.nextBE(); - int tmpNobjects = file.nextBE(); + int viewX = file.NextBE(); + int viewY = file.NextBE(); + invflag = file.NextBool8(); + chrflag = file.NextBool8(); + int tmpNummonsters = file.NextBE(); + int tmpNumitems = file.NextBE(); + int tmpNummissiles = file.NextBE(); + int tmpNobjects = file.NextBE(); if (!gbIsHellfire && currlevel > 17) app_fatal("%s", _("Player is on a Hellfire only level")); for (uint8_t i = 0; i < giNumberOfLevels; i++) { - glSeedTbl[i] = file.nextBE(); - file.skip(4); // Skip loading gnLevelTypeTbl + glSeedTbl[i] = file.NextBE(); + file.Skip(4); // Skip loading gnLevelTypeTbl } LoadPlayer(&file, myplr); @@ -1147,109 +1147,109 @@ void LoadGame(bool firstflag) nobjects = tmpNobjects; for (int &monstkill : monstkills) - monstkill = file.nextBE(); + monstkill = file.NextBE(); if (leveltype != DTYPE_TOWN) { for (int &monsterId : monstactive) - monsterId = file.nextBE(); + monsterId = file.NextBE(); for (int i = 0; i < nummonsters; i++) LoadMonster(&file, monstactive[i]); for (int &missileId : missileactive) - missileId = file.nextLE(); + missileId = file.NextLE(); for (int &missileId : missileavail) - missileId = file.nextLE(); + missileId = file.NextLE(); for (int i = 0; i < nummissiles; i++) LoadMissile(&file, missileactive[i]); for (int &objectId : objectactive) - objectId = file.nextLE(); + objectId = file.NextLE(); for (int &objectId : objectavail) - objectId = file.nextLE(); + objectId = file.NextLE(); for (int i = 0; i < nobjects; i++) LoadObject(&file, objectactive[i]); for (int i = 0; i < nobjects; i++) SyncObjectAnim(objectactive[i]); - numlights = file.nextBE(); + numlights = file.NextBE(); for (uint8_t &lightId : lightactive) - lightId = file.nextLE(); + lightId = file.NextLE(); for (int i = 0; i < numlights; i++) LoadLighting(&file, &LightList[lightactive[i]]); - visionid = file.nextBE(); - numvision = file.nextBE(); + visionid = file.NextBE(); + numvision = file.NextBE(); for (int i = 0; i < numvision; i++) LoadLighting(&file, &VisionList[i]); } for (int &itemId : itemactive) - itemId = file.nextLE(); + itemId = file.NextLE(); for (int &itemId : itemavail) - itemId = file.nextLE(); + itemId = file.NextLE(); for (int i = 0; i < numitems; i++) LoadItem(&file, itemactive[i]); for (bool &UniqueItemFlag : UniqueItemFlags) - UniqueItemFlag = file.nextBool8(); + UniqueItemFlag = file.NextBool8(); for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - dLight[i][j] = file.nextLE(); + dLight[i][j] = file.NextLE(); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - dFlags[i][j] = file.nextLE(); + dFlags[i][j] = file.NextLE(); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - dPlayer[i][j] = file.nextLE(); + dPlayer[i][j] = file.NextLE(); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - dItem[i][j] = file.nextLE(); + dItem[i][j] = file.NextLE(); } if (leveltype != DTYPE_TOWN) { for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - dMonster[i][j] = file.nextBE(); + dMonster[i][j] = file.NextBE(); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - dDead[i][j] = file.nextLE(); + dDead[i][j] = file.NextLE(); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - dObject[i][j] = file.nextLE(); + dObject[i][j] = file.NextLE(); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - dLight[i][j] = file.nextLE(); + dLight[i][j] = file.NextLE(); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - dPreLight[i][j] = file.nextLE(); + dPreLight[i][j] = file.NextLE(); } for (int j = 0; j < DMAXY; j++) { for (int i = 0; i < DMAXX; i++) // NOLINT(modernize-loop-convert) - AutomapView[i][j] = file.nextBool8(); + AutomapView[i][j] = file.NextBool8(); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - dMissile[i][j] = file.nextLE(); + dMissile[i][j] = file.NextLE(); } } - numpremium = file.nextBE(); - premiumlevel = file.nextBE(); + numpremium = file.NextBE(); + premiumlevel = file.NextBE(); for (int i = 0; i < giNumberOfSmithPremiumItems; i++) LoadPremium(&file, i); if (gbIsHellfire && !gbIsHellfireSaveGame) SpawnPremium(myplr); - AutomapActive = file.nextBool8(); - AutoMapScale = file.nextBE(); + AutomapActive = file.NextBool8(); + AutoMapScale = file.NextBE(); AutomapZoomReset(); ResyncQuests(); @@ -1284,84 +1284,84 @@ static void SaveItem(SaveHelper *file, ItemStruct *pItem) iType = ITYPE_NONE; } - file->writeLE(pItem->_iSeed); - file->writeLE(pItem->_iCreateInfo); - file->skip(2); // Alignment - file->writeLE(iType); - file->writeLE(pItem->position.x); - file->writeLE(pItem->position.y); - file->writeLE(pItem->_iAnimFlag ? 1 : 0); - file->skip(4); // Skip pointer _iAnimData - file->writeLE(pItem->AnimInfo.NumberOfFrames); - file->writeLE(pItem->AnimInfo.CurrentFrame); + file->WriteLE(pItem->_iSeed); + file->WriteLE(pItem->_iCreateInfo); + file->Skip(2); // Alignment + file->WriteLE(iType); + file->WriteLE(pItem->position.x); + file->WriteLE(pItem->position.y); + file->WriteLE(pItem->_iAnimFlag ? 1 : 0); + file->Skip(4); // Skip pointer _iAnimData + file->WriteLE(pItem->AnimInfo.NumberOfFrames); + file->WriteLE(pItem->AnimInfo.CurrentFrame); // write _iAnimWidth for vanilla compatibility - file->writeLE(ItemAnimWidth); + file->WriteLE(ItemAnimWidth); // write _iAnimWidth2 for vanilla compatibility - file->writeLE(CalculateWidth2(ItemAnimWidth)); - file->skip(4); // Unused since 1.02 - file->writeLE(pItem->_iSelFlag); - file->skip(3); // Alignment - file->writeLE(pItem->_iPostDraw ? 1 : 0); - file->writeLE(pItem->_iIdentified ? 1 : 0); - file->writeLE(pItem->_iMagical); - file->writeBytes(pItem->_iName, 64); - file->writeBytes(pItem->_iIName, 64); - file->writeLE(pItem->_iLoc); - file->writeLE(pItem->_iClass); - file->skip(1); // Alignment - file->writeLE(pItem->_iCurs); - file->writeLE(pItem->_ivalue); - file->writeLE(pItem->_iIvalue); - file->writeLE(pItem->_iMinDam); - file->writeLE(pItem->_iMaxDam); - file->writeLE(pItem->_iAC); - file->writeLE(pItem->_iFlags); - file->writeLE(pItem->_iMiscId); - file->writeLE(pItem->_iSpell); - file->writeLE(pItem->_iCharges); - file->writeLE(pItem->_iMaxCharges); - file->writeLE(pItem->_iDurability); - file->writeLE(pItem->_iMaxDur); - file->writeLE(pItem->_iPLDam); - file->writeLE(pItem->_iPLToHit); - file->writeLE(pItem->_iPLAC); - file->writeLE(pItem->_iPLStr); - file->writeLE(pItem->_iPLMag); - file->writeLE(pItem->_iPLDex); - file->writeLE(pItem->_iPLVit); - file->writeLE(pItem->_iPLFR); - file->writeLE(pItem->_iPLLR); - file->writeLE(pItem->_iPLMR); - file->writeLE(pItem->_iPLMana); - file->writeLE(pItem->_iPLHP); - file->writeLE(pItem->_iPLDamMod); - file->writeLE(pItem->_iPLGetHit); - file->writeLE(pItem->_iPLLight); - file->writeLE(pItem->_iSplLvlAdd); - file->writeLE(pItem->_iRequest ? 1 : 0); - file->skip(2); // Alignment - file->writeLE(pItem->_iUid); - file->writeLE(pItem->_iFMinDam); - file->writeLE(pItem->_iFMaxDam); - file->writeLE(pItem->_iLMinDam); - file->writeLE(pItem->_iLMaxDam); - file->writeLE(pItem->_iPLEnAc); - file->writeLE(pItem->_iPrePower); - file->writeLE(pItem->_iSufPower); - file->skip(2); // Alignment - file->writeLE(pItem->_iVAdd1); - file->writeLE(pItem->_iVMult1); - file->writeLE(pItem->_iVAdd2); - file->writeLE(pItem->_iVMult2); - file->writeLE(pItem->_iMinStr); - file->writeLE(pItem->_iMinMag); - file->writeLE(pItem->_iMinDex); - file->skip(1); // Alignment - file->writeLE(pItem->_iStatFlag ? 1 : 0); - file->writeLE(idx); - file->writeLE(pItem->dwBuff); + file->WriteLE(CalculateWidth2(ItemAnimWidth)); + file->Skip(4); // Unused since 1.02 + file->WriteLE(pItem->_iSelFlag); + file->Skip(3); // Alignment + file->WriteLE(pItem->_iPostDraw ? 1 : 0); + file->WriteLE(pItem->_iIdentified ? 1 : 0); + file->WriteLE(pItem->_iMagical); + file->WriteBytes(pItem->_iName, 64); + file->WriteBytes(pItem->_iIName, 64); + file->WriteLE(pItem->_iLoc); + file->WriteLE(pItem->_iClass); + file->Skip(1); // Alignment + file->WriteLE(pItem->_iCurs); + file->WriteLE(pItem->_ivalue); + file->WriteLE(pItem->_iIvalue); + file->WriteLE(pItem->_iMinDam); + file->WriteLE(pItem->_iMaxDam); + file->WriteLE(pItem->_iAC); + file->WriteLE(pItem->_iFlags); + file->WriteLE(pItem->_iMiscId); + file->WriteLE(pItem->_iSpell); + file->WriteLE(pItem->_iCharges); + file->WriteLE(pItem->_iMaxCharges); + file->WriteLE(pItem->_iDurability); + file->WriteLE(pItem->_iMaxDur); + file->WriteLE(pItem->_iPLDam); + file->WriteLE(pItem->_iPLToHit); + file->WriteLE(pItem->_iPLAC); + file->WriteLE(pItem->_iPLStr); + file->WriteLE(pItem->_iPLMag); + file->WriteLE(pItem->_iPLDex); + file->WriteLE(pItem->_iPLVit); + file->WriteLE(pItem->_iPLFR); + file->WriteLE(pItem->_iPLLR); + file->WriteLE(pItem->_iPLMR); + file->WriteLE(pItem->_iPLMana); + file->WriteLE(pItem->_iPLHP); + file->WriteLE(pItem->_iPLDamMod); + file->WriteLE(pItem->_iPLGetHit); + file->WriteLE(pItem->_iPLLight); + file->WriteLE(pItem->_iSplLvlAdd); + file->WriteLE(pItem->_iRequest ? 1 : 0); + file->Skip(2); // Alignment + file->WriteLE(pItem->_iUid); + file->WriteLE(pItem->_iFMinDam); + file->WriteLE(pItem->_iFMaxDam); + file->WriteLE(pItem->_iLMinDam); + file->WriteLE(pItem->_iLMaxDam); + file->WriteLE(pItem->_iPLEnAc); + file->WriteLE(pItem->_iPrePower); + file->WriteLE(pItem->_iSufPower); + file->Skip(2); // Alignment + file->WriteLE(pItem->_iVAdd1); + file->WriteLE(pItem->_iVMult1); + file->WriteLE(pItem->_iVAdd2); + file->WriteLE(pItem->_iVMult2); + file->WriteLE(pItem->_iMinStr); + file->WriteLE(pItem->_iMinMag); + file->WriteLE(pItem->_iMinDex); + file->Skip(1); // Alignment + file->WriteLE(pItem->_iStatFlag ? 1 : 0); + file->WriteLE(idx); + file->WriteLE(pItem->dwBuff); if (gbIsHellfire) - file->writeLE(pItem->_iDamAcFlags); + file->WriteLE(pItem->_iDamAcFlags); } static void SaveItems(SaveHelper *file, ItemStruct *pItem, const int n) @@ -1375,213 +1375,213 @@ static void SavePlayer(SaveHelper *file, int p) { auto &player = plr[p]; - file->writeLE(player._pmode); + file->WriteLE(player._pmode); for (int8_t step : player.walkpath) - file->writeLE(step); - file->writeLE(player.plractive ? 1 : 0); - file->skip(2); // Alignment - file->writeLE(player.destAction); - file->writeLE(player.destParam1); - file->writeLE(player.destParam2); - file->writeLE(player.destParam3); - file->writeLE(player.destParam4); - file->writeLE(player.plrlevel); - file->writeLE(player.position.tile.x); - file->writeLE(player.position.tile.y); - file->writeLE(player.position.future.x); - file->writeLE(player.position.future.y); + file->WriteLE(step); + file->WriteLE(player.plractive ? 1 : 0); + file->Skip(2); // Alignment + file->WriteLE(player.destAction); + file->WriteLE(player.destParam1); + file->WriteLE(player.destParam2); + file->WriteLE(player.destParam3); + file->WriteLE(player.destParam4); + file->WriteLE(player.plrlevel); + file->WriteLE(player.position.tile.x); + file->WriteLE(player.position.tile.y); + file->WriteLE(player.position.future.x); + file->WriteLE(player.position.future.y); // For backwards compatibility const Point target = player.GetTargetPosition(); - file->writeLE(target.x); - file->writeLE(target.y); - - file->writeLE(player.position.last.x); - file->writeLE(player.position.last.y); - file->writeLE(player.position.old.x); - file->writeLE(player.position.old.y); - file->writeLE(player.position.offset.deltaX); - file->writeLE(player.position.offset.deltaY); - file->writeLE(player.position.velocity.deltaX); - file->writeLE(player.position.velocity.deltaY); - file->writeLE(player._pdir); - file->skip(4); // Unused - file->writeLE(player._pgfxnum); - file->skip(4); // Skip pointer _pAnimData - file->writeLE(std::max(0, player.AnimInfo.TicksPerFrame - 1)); - file->writeLE(player.AnimInfo.TickCounterOfCurrentFrame); - file->writeLE(player.AnimInfo.NumberOfFrames); - file->writeLE(player.AnimInfo.CurrentFrame); + file->WriteLE(target.x); + file->WriteLE(target.y); + + file->WriteLE(player.position.last.x); + file->WriteLE(player.position.last.y); + file->WriteLE(player.position.old.x); + file->WriteLE(player.position.old.y); + file->WriteLE(player.position.offset.deltaX); + file->WriteLE(player.position.offset.deltaY); + file->WriteLE(player.position.velocity.deltaX); + file->WriteLE(player.position.velocity.deltaY); + file->WriteLE(player._pdir); + file->Skip(4); // Unused + file->WriteLE(player._pgfxnum); + file->Skip(4); // Skip pointer _pAnimData + file->WriteLE(std::max(0, player.AnimInfo.TicksPerFrame - 1)); + file->WriteLE(player.AnimInfo.TickCounterOfCurrentFrame); + file->WriteLE(player.AnimInfo.NumberOfFrames); + file->WriteLE(player.AnimInfo.CurrentFrame); // write _pAnimWidth for vanilla compatibility int animWidth = player.AnimInfo.pCelSprite == nullptr ? 96 : player.AnimInfo.pCelSprite->Width(); - file->writeLE(animWidth); + file->WriteLE(animWidth); // write _pAnimWidth2 for vanilla compatibility - file->writeLE(CalculateWidth2(animWidth)); - file->skip(4); // Skip _peflag - file->writeLE(player._plid); - file->writeLE(player._pvid); - - file->writeLE(player._pSpell); - file->writeLE(player._pSplType); - file->writeLE(player._pSplFrom); - file->skip(2); // Alignment - file->writeLE(player._pTSpell); - file->writeLE(player._pTSplType); - file->skip(3); // Alignment - file->writeLE(player._pRSpell); - file->writeLE(player._pRSplType); - file->skip(3); // Alignment - file->writeLE(player._pSBkSpell); - file->writeLE(player._pSBkSplType); + file->WriteLE(CalculateWidth2(animWidth)); + file->Skip(4); // Skip _peflag + file->WriteLE(player._plid); + file->WriteLE(player._pvid); + + file->WriteLE(player._pSpell); + file->WriteLE(player._pSplType); + file->WriteLE(player._pSplFrom); + file->Skip(2); // Alignment + file->WriteLE(player._pTSpell); + file->Skip(sizeof(int8_t)); // Skip _pTSplType + file->Skip(3); // Alignment + file->WriteLE(player._pRSpell); + file->WriteLE(player._pRSplType); + file->Skip(3); // Alignment + file->WriteLE(player._pSBkSpell); + file->Skip(sizeof(int8_t)); // Skip _pSBkSplType for (int8_t spellLevel : player._pSplLvl) - file->writeLE(spellLevel); - file->skip(7); // Alignment - file->writeLE(player._pMemSpells); - file->writeLE(player._pAblSpells); - file->writeLE(player._pScrlSpells); - file->writeLE(player._pSpellFlags); - file->skip(3); // Alignment + file->WriteLE(spellLevel); + file->Skip(7); // Alignment + file->WriteLE(player._pMemSpells); + file->WriteLE(player._pAblSpells); + file->WriteLE(player._pScrlSpells); + file->WriteLE(player._pSpellFlags); + file->Skip(3); // Alignment for (auto &spellId : player._pSplHotKey) - file->writeLE(spellId); + file->WriteLE(spellId); for (auto &spellType : player._pSplTHotKey) - file->writeLE(spellType); - - file->writeLE(player._pwtype); - file->writeLE(player._pBlockFlag ? 1 : 0); - file->writeLE(player._pInvincible ? 1 : 0); - file->writeLE(player._pLightRad); - file->writeLE(player._pLvlChanging ? 1 : 0); - - file->writeBytes(player._pName, PLR_NAME_LEN); - file->writeLE(static_cast(player._pClass)); - file->skip(3); // Alignment - file->writeLE(player._pStrength); - file->writeLE(player._pBaseStr); - file->writeLE(player._pMagic); - file->writeLE(player._pBaseMag); - file->writeLE(player._pDexterity); - file->writeLE(player._pBaseDex); - file->writeLE(player._pVitality); - file->writeLE(player._pBaseVit); - file->writeLE(player._pStatPts); - file->writeLE(player._pDamageMod); - - file->writeLE(player._pBaseToBlk); - file->writeLE(player._pHPBase); - file->writeLE(player._pMaxHPBase); - file->writeLE(player._pHitPoints); - file->writeLE(player._pMaxHP); - file->skip(sizeof(int32_t)); // was hpPer, loads never use the stored value - file->writeLE(player._pManaBase); - file->writeLE(player._pMaxManaBase); - file->writeLE(player._pMana); - file->writeLE(player._pMaxMana); - file->skip(sizeof(int32_t)); // was manaPer, loads never use the stored value - file->writeLE(player._pLevel); - file->writeLE(player._pMaxLvl); - file->skip(2); // Alignment - file->writeLE(player._pExperience); - file->writeLE(player._pMaxExp); - file->writeLE(player._pNextExper); - file->writeLE(player._pArmorClass); - file->writeLE(player._pMagResist); - file->writeLE(player._pFireResist); - file->writeLE(player._pLghtResist); - file->writeLE(player._pGold); - - file->writeLE(player._pInfraFlag ? 1 : 0); - file->writeLE(player.position.temp.x); - file->writeLE(player.position.temp.y); - file->writeLE(player.tempDirection); - file->writeLE(player._pVar4); - file->writeLE(player._pVar5); - file->writeLE(player.position.offset2.deltaX); - file->writeLE(player.position.offset2.deltaY); + file->WriteLE(spellType); + + file->WriteLE(player._pwtype); + file->WriteLE(player._pBlockFlag ? 1 : 0); + file->WriteLE(player._pInvincible ? 1 : 0); + file->WriteLE(player._pLightRad); + file->WriteLE(player._pLvlChanging ? 1 : 0); + + file->WriteBytes(player._pName, PLR_NAME_LEN); + file->WriteLE(static_cast(player._pClass)); + file->Skip(3); // Alignment + file->WriteLE(player._pStrength); + file->WriteLE(player._pBaseStr); + file->WriteLE(player._pMagic); + file->WriteLE(player._pBaseMag); + file->WriteLE(player._pDexterity); + file->WriteLE(player._pBaseDex); + file->WriteLE(player._pVitality); + file->WriteLE(player._pBaseVit); + file->WriteLE(player._pStatPts); + file->WriteLE(player._pDamageMod); + + file->WriteLE(player._pBaseToBlk); + file->WriteLE(player._pHPBase); + file->WriteLE(player._pMaxHPBase); + file->WriteLE(player._pHitPoints); + file->WriteLE(player._pMaxHP); + file->Skip(sizeof(int32_t)); // Skip _pHPPer + file->WriteLE(player._pManaBase); + file->WriteLE(player._pMaxManaBase); + file->WriteLE(player._pMana); + file->WriteLE(player._pMaxMana); + file->Skip(sizeof(int32_t)); // Skip _pManaPer + file->WriteLE(player._pLevel); + file->WriteLE(player._pMaxLvl); + file->Skip(2); // Alignment + file->WriteLE(player._pExperience); + file->WriteLE(player._pMaxExp); + file->WriteLE(player._pNextExper); + file->WriteLE(player._pArmorClass); + file->WriteLE(player._pMagResist); + file->WriteLE(player._pFireResist); + file->WriteLE(player._pLghtResist); + file->WriteLE(player._pGold); + + file->WriteLE(player._pInfraFlag ? 1 : 0); + file->WriteLE(player.position.temp.x); + file->WriteLE(player.position.temp.y); + file->WriteLE(player.tempDirection); + file->WriteLE(player._pVar4); + file->WriteLE(player._pVar5); + file->WriteLE(player.position.offset2.deltaX); + file->WriteLE(player.position.offset2.deltaY); // Write actionFrame for vanilla compatibility - file->writeLE(0); + file->WriteLE(0); for (uint8_t i = 0; i < giNumberOfLevels; i++) - file->writeLE(player._pLvlVisited[i] ? 1 : 0); + file->WriteLE(player._pLvlVisited[i] ? 1 : 0); for (uint8_t i = 0; i < giNumberOfLevels; i++) - file->writeLE(player._pSLvlVisited[i] ? 1 : 0); // only 10 used + file->WriteLE(player._pSLvlVisited[i] ? 1 : 0); // only 10 used - file->skip(2); // Alignment + file->Skip(2); // Alignment // Write _pGFXLoad for vanilla compatibility - file->writeLE(0); - file->skip(4 * 8); // Skip pointers _pNAnim - file->writeLE(player._pNFrames); - file->skip(4); // Skip _pNWidth - file->skip(4 * 8); // Skip pointers _pWAnim - file->writeLE(player._pWFrames); - file->skip(4); // Skip _pWWidth - file->skip(4 * 8); // Skip pointers _pAAnim - file->writeLE(player._pAFrames); - file->skip(4); // Skip _pAWidth - file->writeLE(player._pAFNum); - file->skip(4 * 8); // Skip pointers _pLAnim - file->skip(4 * 8); // Skip pointers _pFAnim - file->skip(4 * 8); // Skip pointers _pTAnim - file->writeLE(player._pSFrames); - file->skip(4); // Skip _pSWidth - file->writeLE(player._pSFNum); - file->skip(4 * 8); // Skip pointers _pHAnim - file->writeLE(player._pHFrames); - file->skip(4); // Skip _pHWidth - file->skip(4 * 8); // Skip pointers _pDAnim - file->writeLE(player._pDFrames); - file->skip(4); // Skip _pDWidth - file->skip(4 * 8); // Skip pointers _pBAnim - file->writeLE(player._pBFrames); - file->skip(4); // Skip _pBWidth + file->WriteLE(0); + file->Skip(4 * 8); // Skip pointers _pNAnim + file->WriteLE(player._pNFrames); + file->Skip(4); // Skip _pNWidth + file->Skip(4 * 8); // Skip pointers _pWAnim + file->WriteLE(player._pWFrames); + file->Skip(4); // Skip _pWWidth + file->Skip(4 * 8); // Skip pointers _pAAnim + file->WriteLE(player._pAFrames); + file->Skip(4); // Skip _pAWidth + file->WriteLE(player._pAFNum); + file->Skip(4 * 8); // Skip pointers _pLAnim + file->Skip(4 * 8); // Skip pointers _pFAnim + file->Skip(4 * 8); // Skip pointers _pTAnim + file->WriteLE(player._pSFrames); + file->Skip(4); // Skip _pSWidth + file->WriteLE(player._pSFNum); + file->Skip(4 * 8); // Skip pointers _pHAnim + file->WriteLE(player._pHFrames); + file->Skip(4); // Skip _pHWidth + file->Skip(4 * 8); // Skip pointers _pDAnim + file->WriteLE(player._pDFrames); + file->Skip(4); // Skip _pDWidth + file->Skip(4 * 8); // Skip pointers _pBAnim + file->WriteLE(player._pBFrames); + file->Skip(4); // Skip _pBWidth SaveItems(file, player.InvBody, NUM_INVLOC); SaveItems(file, player.InvList, NUM_INV_GRID_ELEM); - file->writeLE(player._pNumInv); + file->WriteLE(player._pNumInv); for (int8_t cell : player.InvGrid) - file->writeLE(cell); + file->WriteLE(cell); SaveItems(file, player.SpdList, MAXBELTITEMS); SaveItem(file, &player.HoldItem); - file->writeLE(player._pIMinDam); - file->writeLE(player._pIMaxDam); - file->writeLE(player._pIAC); - file->writeLE(player._pIBonusDam); - file->writeLE(player._pIBonusToHit); - file->writeLE(player._pIBonusAC); - file->writeLE(player._pIBonusDamMod); - file->skip(4); // Alignment - - file->writeLE(player._pISpells); - file->writeLE(player._pIFlags); - file->writeLE(player._pIGetHit); - - file->writeLE(player._pISplLvlAdd); - file->skip(1); // Unused - file->skip(2); // Alignment - file->writeLE(player._pISplDur); - file->writeLE(player._pIEnAc); - file->writeLE(player._pIFMinDam); - file->writeLE(player._pIFMaxDam); - file->writeLE(player._pILMinDam); - file->writeLE(player._pILMaxDam); - file->writeLE(player._pOilType); - file->writeLE(player.pTownWarps); - file->writeLE(player.pDungMsgs); - file->writeLE(player.pLvlLoad); + file->WriteLE(player._pIMinDam); + file->WriteLE(player._pIMaxDam); + file->WriteLE(player._pIAC); + file->WriteLE(player._pIBonusDam); + file->WriteLE(player._pIBonusToHit); + file->WriteLE(player._pIBonusAC); + file->WriteLE(player._pIBonusDamMod); + file->Skip(4); // Alignment + + file->WriteLE(player._pISpells); + file->WriteLE(player._pIFlags); + file->WriteLE(player._pIGetHit); + + file->WriteLE(player._pISplLvlAdd); + file->Skip(1); // Unused + file->Skip(2); // Alignment + file->WriteLE(player._pISplDur); + file->WriteLE(player._pIEnAc); + file->WriteLE(player._pIFMinDam); + file->WriteLE(player._pIFMaxDam); + file->WriteLE(player._pILMinDam); + file->WriteLE(player._pILMaxDam); + file->WriteLE(player._pOilType); + file->WriteLE(player.pTownWarps); + file->WriteLE(player.pDungMsgs); + file->WriteLE(player.pLvlLoad); if (gbIsHellfire) - file->writeLE(player.pDungMsgs2); + file->WriteLE(player.pDungMsgs2); else - file->writeLE(player.pBattleNet ? 1 : 0); - file->writeLE(player.pManaShield ? 1 : 0); - file->writeLE(player.pOriginalCathedral ? 1 : 0); - file->skip(2); // Available bytes - file->writeLE(player.wReflections); - file->skip(14); // Available bytes - - file->writeLE(player.pDiabloKillLevel); - file->writeLE(player.pDifficulty); - file->writeLE(player.pDamAcFlags); - file->skip(20); // Available bytes + file->WriteLE(player.pBattleNet ? 1 : 0); + file->WriteLE(player.pManaShield ? 1 : 0); + file->WriteLE(player.pOriginalCathedral ? 1 : 0); + file->Skip(2); // Available bytes + file->WriteLE(player.wReflections); + file->Skip(14); // Available bytes + + file->WriteLE(player.pDiabloKillLevel); + file->WriteLE(player.pDifficulty); + file->WriteLE(player.pDamAcFlags); + file->Skip(20); // Available bytes // Omit pointer _pNData // Omit pointer _pWData @@ -1599,89 +1599,89 @@ static void SaveMonster(SaveHelper *file, int i) { MonsterStruct *pMonster = &monster[i]; - file->writeLE(pMonster->_mMTidx); - file->writeLE(pMonster->_mmode); - file->writeLE(pMonster->_mgoal); - file->skip(3); // Alignment - file->writeLE(pMonster->_mgoalvar1); - file->writeLE(pMonster->_mgoalvar2); - file->writeLE(pMonster->_mgoalvar3); - file->skip(4); // Unused - file->writeLE(pMonster->_pathcount); - file->skip(3); // Alignment - file->writeLE(pMonster->position.tile.x); - file->writeLE(pMonster->position.tile.y); - file->writeLE(pMonster->position.future.x); - file->writeLE(pMonster->position.future.y); - file->writeLE(pMonster->position.old.x); - file->writeLE(pMonster->position.old.y); - file->writeLE(pMonster->position.offset.deltaX); - file->writeLE(pMonster->position.offset.deltaY); - file->writeLE(pMonster->position.velocity.deltaX); - file->writeLE(pMonster->position.velocity.deltaY); - file->writeLE(pMonster->_mdir); - file->writeLE(pMonster->_menemy); - file->writeLE(pMonster->enemyPosition.x); - file->writeLE(pMonster->enemyPosition.y); - file->skip(2); // Unused - - file->skip(4); // Skip pointer _mAnimData - file->writeLE(pMonster->AnimInfo.TicksPerFrame); - file->writeLE(pMonster->AnimInfo.TickCounterOfCurrentFrame); - file->writeLE(pMonster->AnimInfo.NumberOfFrames); - file->writeLE(pMonster->AnimInfo.CurrentFrame); - file->skip(4); // Skip _meflag - file->writeLE(pMonster->_mDelFlag ? 1 : 0); - file->writeLE(pMonster->_mVar1); - file->writeLE(pMonster->_mVar2); - file->writeLE(pMonster->_mVar3); - file->writeLE(pMonster->position.temp.x); - file->writeLE(pMonster->position.temp.y); - file->writeLE(pMonster->position.offset2.deltaX); - file->writeLE(pMonster->position.offset2.deltaY); + file->WriteLE(pMonster->_mMTidx); + file->WriteLE(pMonster->_mmode); + file->WriteLE(pMonster->_mgoal); + file->Skip(3); // Alignment + file->WriteLE(pMonster->_mgoalvar1); + file->WriteLE(pMonster->_mgoalvar2); + file->WriteLE(pMonster->_mgoalvar3); + file->Skip(4); // Unused + file->WriteLE(pMonster->_pathcount); + file->Skip(3); // Alignment + file->WriteLE(pMonster->position.tile.x); + file->WriteLE(pMonster->position.tile.y); + file->WriteLE(pMonster->position.future.x); + file->WriteLE(pMonster->position.future.y); + file->WriteLE(pMonster->position.old.x); + file->WriteLE(pMonster->position.old.y); + file->WriteLE(pMonster->position.offset.deltaX); + file->WriteLE(pMonster->position.offset.deltaY); + file->WriteLE(pMonster->position.velocity.deltaX); + file->WriteLE(pMonster->position.velocity.deltaY); + file->WriteLE(pMonster->_mdir); + file->WriteLE(pMonster->_menemy); + file->WriteLE(pMonster->enemyPosition.x); + file->WriteLE(pMonster->enemyPosition.y); + file->Skip(2); // Unused + + file->Skip(4); // Skip pointer _mAnimData + file->WriteLE(pMonster->AnimInfo.TicksPerFrame); + file->WriteLE(pMonster->AnimInfo.TickCounterOfCurrentFrame); + file->WriteLE(pMonster->AnimInfo.NumberOfFrames); + file->WriteLE(pMonster->AnimInfo.CurrentFrame); + file->Skip(4); // Skip _meflag + file->WriteLE(pMonster->_mDelFlag ? 1 : 0); + file->WriteLE(pMonster->_mVar1); + file->WriteLE(pMonster->_mVar2); + file->WriteLE(pMonster->_mVar3); + file->WriteLE(pMonster->position.temp.x); + file->WriteLE(pMonster->position.temp.y); + file->WriteLE(pMonster->position.offset2.deltaX); + file->WriteLE(pMonster->position.offset2.deltaY); // Write actionFrame for vanilla compatibility - file->writeLE(0); - file->writeLE(pMonster->_mmaxhp); - file->writeLE(pMonster->_mhitpoints); - - file->writeLE(pMonster->_mAi); - file->writeLE(pMonster->_mint); - file->skip(2); // Alignment - file->writeLE(pMonster->_mFlags); - file->writeLE(pMonster->_msquelch); - file->skip(3); // Alignment - file->skip(4); // Unused - file->writeLE(pMonster->position.last.x); - file->writeLE(pMonster->position.last.y); - file->writeLE(pMonster->_mRndSeed); - file->writeLE(pMonster->_mAISeed); - file->skip(4); // Unused - - file->writeLE(pMonster->_uniqtype); - file->writeLE(pMonster->_uniqtrans); - file->writeLE(pMonster->_udeadval); - - file->writeLE(pMonster->mWhoHit); - file->writeLE(pMonster->mLevel); - file->skip(1); // Alignment - file->writeLE(pMonster->mExp); - - file->writeLE(pMonster->mHit < UINT8_MAX ? pMonster->mHit : UINT8_MAX); // For backwards compatibility - file->writeLE(pMonster->mMinDamage); - file->writeLE(pMonster->mMaxDamage); - file->writeLE(pMonster->mHit2 < UINT8_MAX ? pMonster->mHit2 : UINT8_MAX); // For backwards compatibility - file->writeLE(pMonster->mMinDamage2); - file->writeLE(pMonster->mMaxDamage2); - file->writeLE(pMonster->mArmorClass); - file->skip(1); // Alignment - file->writeLE(pMonster->mMagicRes); - file->skip(2); // Alignment - - file->writeLE(pMonster->mtalkmsg == TEXT_NONE ? 0 : pMonster->mtalkmsg); // Replicate original bad mapping of none for monsters - file->writeLE(pMonster->leader); - file->writeLE(pMonster->leaderflag); - file->writeLE(pMonster->packsize); - file->writeLE(pMonster->mlid); + file->WriteLE(0); + file->WriteLE(pMonster->_mmaxhp); + file->WriteLE(pMonster->_mhitpoints); + + file->WriteLE(pMonster->_mAi); + file->WriteLE(pMonster->_mint); + file->Skip(2); // Alignment + file->WriteLE(pMonster->_mFlags); + file->WriteLE(pMonster->_msquelch); + file->Skip(3); // Alignment + file->Skip(4); // Unused + file->WriteLE(pMonster->position.last.x); + file->WriteLE(pMonster->position.last.y); + file->WriteLE(pMonster->_mRndSeed); + file->WriteLE(pMonster->_mAISeed); + file->Skip(4); // Unused + + file->WriteLE(pMonster->_uniqtype); + file->WriteLE(pMonster->_uniqtrans); + file->WriteLE(pMonster->_udeadval); + + file->WriteLE(pMonster->mWhoHit); + file->WriteLE(pMonster->mLevel); + file->Skip(1); // Alignment + file->WriteLE(pMonster->mExp); + + file->WriteLE(pMonster->mHit < UINT8_MAX ? pMonster->mHit : UINT8_MAX); // For backwards compatibility + file->WriteLE(pMonster->mMinDamage); + file->WriteLE(pMonster->mMaxDamage); + file->WriteLE(pMonster->mHit2 < UINT8_MAX ? pMonster->mHit2 : UINT8_MAX); // For backwards compatibility + file->WriteLE(pMonster->mMinDamage2); + file->WriteLE(pMonster->mMaxDamage2); + file->WriteLE(pMonster->mArmorClass); + file->Skip(1); // Alignment + file->WriteLE(pMonster->mMagicRes); + file->Skip(2); // Alignment + + file->WriteLE(pMonster->mtalkmsg == TEXT_NONE ? 0 : pMonster->mtalkmsg); // Replicate original bad mapping of none for monsters + file->WriteLE(pMonster->leader); + file->WriteLE(pMonster->leaderflag); + file->WriteLE(pMonster->packsize); + file->WriteLE(pMonster->mlid); // Omit pointer mName; // Omit pointer MType; @@ -1692,91 +1692,91 @@ static void SaveMissile(SaveHelper *file, int i) { MissileStruct *pMissile = &missile[i]; - file->writeLE(pMissile->_mitype); - file->writeLE(pMissile->position.tile.x); - file->writeLE(pMissile->position.tile.y); - file->writeLE(pMissile->position.offset.deltaX); - file->writeLE(pMissile->position.offset.deltaY); - file->writeLE(pMissile->position.velocity.deltaX); - file->writeLE(pMissile->position.velocity.deltaY); - file->writeLE(pMissile->position.start.x); - file->writeLE(pMissile->position.start.y); - file->writeLE(pMissile->position.traveled.deltaX); - file->writeLE(pMissile->position.traveled.deltaY); - file->writeLE(pMissile->_mimfnum); - file->writeLE(pMissile->_mispllvl); - file->writeLE(pMissile->_miDelFlag ? 1 : 0); - file->writeLE(pMissile->_miAnimType); - file->skip(3); // Alignment - file->writeLE(pMissile->_miAnimFlags); - file->skip(4); // Skip pointer _miAnimData - file->writeLE(pMissile->_miAnimDelay); - file->writeLE(pMissile->_miAnimLen); - file->writeLE(pMissile->_miAnimWidth); - file->writeLE(pMissile->_miAnimWidth2); - file->writeLE(pMissile->_miAnimCnt); - file->writeLE(pMissile->_miAnimAdd); - file->writeLE(pMissile->_miAnimFrame); - file->writeLE(pMissile->_miDrawFlag ? 1 : 0); - file->writeLE(pMissile->_miLightFlag ? 1 : 0); - file->writeLE(pMissile->_miPreFlag ? 1 : 0); - file->writeLE(pMissile->_miUniqTrans); - file->writeLE(pMissile->_mirange); - file->writeLE(pMissile->_misource); - file->writeLE(pMissile->_micaster); - file->writeLE(pMissile->_midam); - file->writeLE(pMissile->_miHitFlag ? 1 : 0); - file->writeLE(pMissile->_midist); - file->writeLE(pMissile->_mlid); - file->writeLE(pMissile->_mirnd); - file->writeLE(pMissile->_miVar1); - file->writeLE(pMissile->_miVar2); - file->writeLE(pMissile->_miVar3); - file->writeLE(pMissile->_miVar4); - file->writeLE(pMissile->_miVar5); - file->writeLE(pMissile->_miVar6); - file->writeLE(pMissile->_miVar7); - file->writeLE(pMissile->limitReached ? 1 : 0); + file->WriteLE(pMissile->_mitype); + file->WriteLE(pMissile->position.tile.x); + file->WriteLE(pMissile->position.tile.y); + file->WriteLE(pMissile->position.offset.deltaX); + file->WriteLE(pMissile->position.offset.deltaY); + file->WriteLE(pMissile->position.velocity.deltaX); + file->WriteLE(pMissile->position.velocity.deltaY); + file->WriteLE(pMissile->position.start.x); + file->WriteLE(pMissile->position.start.y); + file->WriteLE(pMissile->position.traveled.deltaX); + file->WriteLE(pMissile->position.traveled.deltaY); + file->WriteLE(pMissile->_mimfnum); + file->WriteLE(pMissile->_mispllvl); + file->WriteLE(pMissile->_miDelFlag ? 1 : 0); + file->WriteLE(pMissile->_miAnimType); + file->Skip(3); // Alignment + file->WriteLE(pMissile->_miAnimFlags); + file->Skip(4); // Skip pointer _miAnimData + file->WriteLE(pMissile->_miAnimDelay); + file->WriteLE(pMissile->_miAnimLen); + file->WriteLE(pMissile->_miAnimWidth); + file->WriteLE(pMissile->_miAnimWidth2); + file->WriteLE(pMissile->_miAnimCnt); + file->WriteLE(pMissile->_miAnimAdd); + file->WriteLE(pMissile->_miAnimFrame); + file->WriteLE(pMissile->_miDrawFlag ? 1 : 0); + file->WriteLE(pMissile->_miLightFlag ? 1 : 0); + file->WriteLE(pMissile->_miPreFlag ? 1 : 0); + file->WriteLE(pMissile->_miUniqTrans); + file->WriteLE(pMissile->_mirange); + file->WriteLE(pMissile->_misource); + file->WriteLE(pMissile->_micaster); + file->WriteLE(pMissile->_midam); + file->WriteLE(pMissile->_miHitFlag ? 1 : 0); + file->WriteLE(pMissile->_midist); + file->WriteLE(pMissile->_mlid); + file->WriteLE(pMissile->_mirnd); + file->WriteLE(pMissile->_miVar1); + file->WriteLE(pMissile->_miVar2); + file->WriteLE(pMissile->_miVar3); + file->WriteLE(pMissile->_miVar4); + file->WriteLE(pMissile->_miVar5); + file->WriteLE(pMissile->_miVar6); + file->WriteLE(pMissile->_miVar7); + file->WriteLE(pMissile->limitReached ? 1 : 0); } static void SaveObject(SaveHelper *file, int i) { ObjectStruct *pObject = &object[i]; - file->writeLE(pObject->_otype); - file->writeLE(pObject->position.x); - file->writeLE(pObject->position.y); - file->writeLE(pObject->_oLight ? 1 : 0); - file->writeLE(pObject->_oAnimFlag); - file->skip(4); // Skip pointer _oAnimData - file->writeLE(pObject->_oAnimDelay); - file->writeLE(pObject->_oAnimCnt); - file->writeLE(pObject->_oAnimLen); - file->writeLE(pObject->_oAnimFrame); - file->writeLE(pObject->_oAnimWidth); - file->writeLE(CalculateWidth2(pObject->_oAnimWidth)); + file->WriteLE(pObject->_otype); + file->WriteLE(pObject->position.x); + file->WriteLE(pObject->position.y); + file->WriteLE(pObject->_oLight ? 1 : 0); + file->WriteLE(pObject->_oAnimFlag); + file->Skip(4); // Skip pointer _oAnimData + file->WriteLE(pObject->_oAnimDelay); + file->WriteLE(pObject->_oAnimCnt); + file->WriteLE(pObject->_oAnimLen); + file->WriteLE(pObject->_oAnimFrame); + file->WriteLE(pObject->_oAnimWidth); + file->WriteLE(CalculateWidth2(pObject->_oAnimWidth)); // Write _oAnimWidth2 for vanilla compatibility - file->writeLE(pObject->_oDelFlag ? 1 : 0); - file->writeLE(pObject->_oBreak); - file->skip(3); // Alignment - file->writeLE(pObject->_oSolidFlag ? 1 : 0); - file->writeLE(pObject->_oMissFlag ? 1 : 0); - - file->writeLE(pObject->_oSelFlag); - file->skip(3); // Alignment - file->writeLE(pObject->_oPreFlag ? 1 : 0); - file->writeLE(pObject->_oTrapFlag ? 1 : 0); - file->writeLE(pObject->_oDoorFlag ? 1 : 0); - file->writeLE(pObject->_olid); - file->writeLE(pObject->_oRndSeed); - file->writeLE(pObject->_oVar1); - file->writeLE(pObject->_oVar2); - file->writeLE(pObject->_oVar3); - file->writeLE(pObject->_oVar4); - file->writeLE(pObject->_oVar5); - file->writeLE(pObject->_oVar6); - file->writeLE(pObject->_oVar7); - file->writeLE(pObject->_oVar8); + file->WriteLE(pObject->_oDelFlag ? 1 : 0); + file->WriteLE(pObject->_oBreak); + file->Skip(3); // Alignment + file->WriteLE(pObject->_oSolidFlag ? 1 : 0); + file->WriteLE(pObject->_oMissFlag ? 1 : 0); + + file->WriteLE(pObject->_oSelFlag); + file->Skip(3); // Alignment + file->WriteLE(pObject->_oPreFlag ? 1 : 0); + file->WriteLE(pObject->_oTrapFlag ? 1 : 0); + file->WriteLE(pObject->_oDoorFlag ? 1 : 0); + file->WriteLE(pObject->_olid); + file->WriteLE(pObject->_oRndSeed); + file->WriteLE(pObject->_oVar1); + file->WriteLE(pObject->_oVar2); + file->WriteLE(pObject->_oVar3); + file->WriteLE(pObject->_oVar4); + file->WriteLE(pObject->_oVar5); + file->WriteLE(pObject->_oVar6); + file->WriteLE(pObject->_oVar7); + file->WriteLE(pObject->_oVar8); } static void SavePremium(SaveHelper *file, int i) @@ -1788,61 +1788,61 @@ static void SaveQuest(SaveHelper *file, int i) { QuestStruct *pQuest = &quests[i]; - file->writeLE(pQuest->_qlevel); - file->writeLE(pQuest->_qtype); - 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); + file->WriteLE(pQuest->_qlevel); + file->WriteLE(pQuest->_qtype); + 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); if (gbIsHellfire) { - file->skip(2); // Alignment - file->writeLE(pQuest->_qmsg); + file->Skip(2); // Alignment + file->WriteLE(pQuest->_qmsg); } else { - file->writeLE(pQuest->_qmsg); + file->WriteLE(pQuest->_qmsg); } - file->writeLE(pQuest->_qvar1); - file->writeLE(pQuest->_qvar2); - file->skip(2); // Alignment + file->WriteLE(pQuest->_qvar1); + file->WriteLE(pQuest->_qvar2); + file->Skip(2); // Alignment if (!gbIsHellfire) - file->skip(1); // Alignment - file->writeLE(pQuest->_qlog ? 1 : 0); - - file->writeBE(ReturnLvlX); - file->writeBE(ReturnLvlY); - file->writeBE(ReturnLvl); - file->writeBE(ReturnLvlT); - file->writeBE(DoomQuestState); + file->Skip(1); // Alignment + file->WriteLE(pQuest->_qlog ? 1 : 0); + + file->WriteBE(ReturnLvlX); + file->WriteBE(ReturnLvlY); + file->WriteBE(ReturnLvl); + file->WriteBE(ReturnLvlT); + file->WriteBE(DoomQuestState); } static void SaveLighting(SaveHelper *file, LightListStruct *pLight) { - file->writeLE(pLight->position.tile.x); - file->writeLE(pLight->position.tile.y); - file->writeLE(pLight->_lradius); - file->writeLE(pLight->_lid); - file->writeLE(pLight->_ldel ? 1 : 0); - file->writeLE(pLight->_lunflag ? 1 : 0); - file->skip(4); // Unused - file->writeLE(pLight->position.old.x); - file->writeLE(pLight->position.old.y); - file->writeLE(pLight->oldRadius); - file->writeLE(pLight->position.offset.x); - file->writeLE(pLight->position.offset.y); - file->writeLE(pLight->_lflags ? 1 : 0); + file->WriteLE(pLight->position.tile.x); + file->WriteLE(pLight->position.tile.y); + file->WriteLE(pLight->_lradius); + file->WriteLE(pLight->_lid); + file->WriteLE(pLight->_ldel ? 1 : 0); + file->WriteLE(pLight->_lunflag ? 1 : 0); + file->Skip(4); // Unused + file->WriteLE(pLight->position.old.x); + file->WriteLE(pLight->position.old.y); + file->WriteLE(pLight->oldRadius); + file->WriteLE(pLight->position.offset.x); + file->WriteLE(pLight->position.offset.y); + file->WriteLE(pLight->_lflags ? 1 : 0); } static void SavePortal(SaveHelper *file, int i) { PortalStruct *pPortal = &portal[i]; - file->writeLE(pPortal->open ? 1 : 0); - file->writeLE(pPortal->position.x); - file->writeLE(pPortal->position.y); - file->writeLE(pPortal->level); - file->writeLE(pPortal->ltype); - file->writeLE(pPortal->setlvl ? 1 : 0); + file->WriteLE(pPortal->open ? 1 : 0); + file->WriteLE(pPortal->position.x); + file->WriteLE(pPortal->position.y); + file->WriteLE(pPortal->level); + file->WriteLE(pPortal->ltype); + file->WriteLE(pPortal->setlvl ? 1 : 0); } const int DiabloItemSaveSize = 368; @@ -1853,7 +1853,7 @@ void SaveHeroItems(PlayerStruct &player) size_t items = NUM_INVLOC + NUM_INV_GRID_ELEM + MAXBELTITEMS; SaveHelper file("heroitems", items * (gbIsHellfire ? HellfireItemSaveSize : DiabloItemSaveSize) + sizeof(uint8_t)); - file.writeLE(gbIsHellfire ? 1 : 0); + file.WriteLE(gbIsHellfire ? 1 : 0); SaveItems(&file, player.InvBody, NUM_INVLOC); SaveItems(&file, player.InvList, NUM_INV_GRID_ELEM); @@ -1869,13 +1869,13 @@ void SaveGameData() SaveHelper file("game", FILEBUFF); if (gbIsSpawn && !gbIsHellfire) - file.writeLE(LoadLE32("SHAR")); + file.WriteLE(LoadLE32("SHAR")); else if (gbIsSpawn && gbIsHellfire) - file.writeLE(LoadLE32("SHLF")); + file.WriteLE(LoadLE32("SHLF")); else if (!gbIsSpawn && gbIsHellfire) - file.writeLE(LoadLE32("HELF")); + file.WriteLE(LoadLE32("HELF")); else if (!gbIsSpawn && !gbIsHellfire) - file.writeLE(LoadLE32("RETL")); + file.WriteLE(LoadLE32("RETL")); else app_fatal("%s", _("Invalid game state")); @@ -1889,22 +1889,22 @@ void SaveGameData() giNumberOfSmithPremiumItems = 6; } - file.writeLE(setlevel ? 1 : 0); - file.writeBE(setlvlnum); - file.writeBE(currlevel); - file.writeBE(leveltype); - file.writeBE(ViewX); - file.writeBE(ViewY); - file.writeLE(invflag ? 1 : 0); - file.writeLE(chrflag ? 1 : 0); - file.writeBE(nummonsters); - file.writeBE(numitems); - file.writeBE(nummissiles); - file.writeBE(nobjects); + file.WriteLE(setlevel ? 1 : 0); + file.WriteBE(setlvlnum); + file.WriteBE(currlevel); + file.WriteBE(leveltype); + file.WriteBE(ViewX); + file.WriteBE(ViewY); + file.WriteLE(invflag ? 1 : 0); + file.WriteLE(chrflag ? 1 : 0); + file.WriteBE(nummonsters); + file.WriteBE(numitems); + file.WriteBE(nummissiles); + file.WriteBE(nobjects); for (uint8_t i = 0; i < giNumberOfLevels; i++) { - file.writeBE(glSeedTbl[i]); - file.writeBE(gnLevelTypeTbl[i]); + file.WriteBE(glSeedTbl[i]); + file.WriteBE(gnLevelTypeTbl[i]); } plr[myplr].pDifficulty = sgGameInitInfo.nDifficulty; @@ -1915,105 +1915,105 @@ void SaveGameData() for (int i = 0; i < MAXPORTAL; i++) SavePortal(&file, i); for (int monstkill : monstkills) - file.writeBE(monstkill); + file.WriteBE(monstkill); if (leveltype != DTYPE_TOWN) { for (int monsterId : monstactive) - file.writeBE(monsterId); + file.WriteBE(monsterId); for (int i = 0; i < nummonsters; i++) SaveMonster(&file, monstactive[i]); for (int missileId : missileactive) - file.writeLE(missileId); + file.WriteLE(missileId); for (int missileId : missileavail) - file.writeLE(missileId); + file.WriteLE(missileId); for (int i = 0; i < nummissiles; i++) SaveMissile(&file, missileactive[i]); for (int objectId : objectactive) - file.writeLE(objectId); + file.WriteLE(objectId); for (int objectId : objectavail) - file.writeLE(objectId); + file.WriteLE(objectId); for (int i = 0; i < nobjects; i++) SaveObject(&file, objectactive[i]); - file.writeBE(numlights); + file.WriteBE(numlights); for (uint8_t lightId : lightactive) - file.writeLE(lightId); + file.WriteLE(lightId); for (int i = 0; i < numlights; i++) SaveLighting(&file, &LightList[lightactive[i]]); - file.writeBE(visionid); - file.writeBE(numvision); + file.WriteBE(visionid); + file.WriteBE(numvision); for (int i = 0; i < numvision; i++) SaveLighting(&file, &VisionList[i]); } for (int itemId : itemactive) - file.writeLE(itemId); + file.WriteLE(itemId); for (int itemId : itemavail) - file.writeLE(itemId); + file.WriteLE(itemId); for (int i = 0; i < numitems; i++) SaveItem(&file, &items[itemactive[i]]); for (bool UniqueItemFlag : UniqueItemFlags) - file.writeLE(UniqueItemFlag ? 1 : 0); + file.WriteLE(UniqueItemFlag ? 1 : 0); for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - file.writeLE(dLight[i][j]); + file.WriteLE(dLight[i][j]); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - file.writeLE(dFlags[i][j] & ~(BFLAG_MISSILE | BFLAG_VISIBLE | BFLAG_DEAD_PLAYER)); + file.WriteLE(dFlags[i][j] & ~(BFLAG_MISSILE | BFLAG_VISIBLE | BFLAG_DEAD_PLAYER)); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - file.writeLE(dPlayer[i][j]); + file.WriteLE(dPlayer[i][j]); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - file.writeLE(dItem[i][j]); + file.WriteLE(dItem[i][j]); } if (leveltype != DTYPE_TOWN) { for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - file.writeBE(dMonster[i][j]); + file.WriteBE(dMonster[i][j]); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - file.writeLE(dDead[i][j]); + file.WriteLE(dDead[i][j]); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - file.writeLE(dObject[i][j]); + file.WriteLE(dObject[i][j]); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - file.writeLE(dLight[i][j]); + file.WriteLE(dLight[i][j]); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - file.writeLE(dPreLight[i][j]); + file.WriteLE(dPreLight[i][j]); } for (int j = 0; j < DMAXY; j++) { for (int i = 0; i < DMAXX; i++) // NOLINT(modernize-loop-convert) - file.writeLE(AutomapView[i][j] ? 1 : 0); + file.WriteLE(AutomapView[i][j] ? 1 : 0); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - file.writeLE(dMissile[i][j]); + file.WriteLE(dMissile[i][j]); } } - file.writeBE(numpremium); - file.writeBE(premiumlevel); + file.WriteBE(numpremium); + file.WriteBE(premiumlevel); for (int i = 0; i < giNumberOfSmithPremiumItems; i++) SavePremium(&file, i); - file.writeLE(AutomapActive ? 1 : 0); - file.writeBE(AutoMapScale); + file.WriteLE(AutomapActive ? 1 : 0); + file.WriteBE(AutoMapScale); } void SaveGame() @@ -2038,68 +2038,68 @@ void SaveLevel() if (leveltype != DTYPE_TOWN) { for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - file.writeLE(dDead[i][j]); + file.WriteLE(dDead[i][j]); } } - file.writeBE(nummonsters); - file.writeBE(numitems); - file.writeBE(nobjects); + file.WriteBE(nummonsters); + file.WriteBE(numitems); + file.WriteBE(nobjects); if (leveltype != DTYPE_TOWN) { for (int monsterId : monstactive) - file.writeBE(monsterId); + file.WriteBE(monsterId); for (int i = 0; i < nummonsters; i++) SaveMonster(&file, monstactive[i]); for (int objectId : objectactive) - file.writeLE(objectId); + file.WriteLE(objectId); for (int objectId : objectavail) - file.writeLE(objectId); + file.WriteLE(objectId); for (int i = 0; i < nobjects; i++) SaveObject(&file, objectactive[i]); } for (int itemId : itemactive) - file.writeLE(itemId); + file.WriteLE(itemId); for (int itemId : itemavail) - file.writeLE(itemId); + file.WriteLE(itemId); for (int i = 0; i < numitems; i++) SaveItem(&file, &items[itemactive[i]]); for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - file.writeLE(dFlags[i][j] & ~(BFLAG_MISSILE | BFLAG_VISIBLE | BFLAG_DEAD_PLAYER)); + file.WriteLE(dFlags[i][j] & ~(BFLAG_MISSILE | BFLAG_VISIBLE | BFLAG_DEAD_PLAYER)); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - file.writeLE(dItem[i][j]); + file.WriteLE(dItem[i][j]); } if (leveltype != DTYPE_TOWN) { for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - file.writeBE(dMonster[i][j]); + file.WriteBE(dMonster[i][j]); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - file.writeLE(dObject[i][j]); + file.WriteLE(dObject[i][j]); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - file.writeLE(dLight[i][j]); + file.WriteLE(dLight[i][j]); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - file.writeLE(dPreLight[i][j]); + file.WriteLE(dPreLight[i][j]); } for (int j = 0; j < DMAXY; j++) { for (int i = 0; i < DMAXX; i++) // NOLINT(modernize-loop-convert) - file.writeLE(AutomapView[i][j] ? 1 : 0); + file.WriteLE(AutomapView[i][j] ? 1 : 0); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - file.writeLE(dMissile[i][j]); + file.WriteLE(dMissile[i][j]); } } @@ -2114,30 +2114,30 @@ void LoadLevel() char szName[MAX_PATH]; GetPermLevelNames(szName); LoadHelper file(szName); - if (!file.isValid()) + if (!file.IsValid()) app_fatal("%s", _("Unable to open save file archive")); if (leveltype != DTYPE_TOWN) { for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - dDead[i][j] = file.nextLE(); + dDead[i][j] = file.NextLE(); } SetDead(); } - nummonsters = file.nextBE(); - numitems = file.nextBE(); - nobjects = file.nextBE(); + nummonsters = file.NextBE(); + numitems = file.NextBE(); + nobjects = file.NextBE(); if (leveltype != DTYPE_TOWN) { for (int &monsterId : monstactive) - monsterId = file.nextBE(); + monsterId = file.NextBE(); for (int i = 0; i < nummonsters; i++) LoadMonster(&file, monstactive[i]); for (int &objectId : objectactive) - objectId = file.nextLE(); + objectId = file.NextLE(); for (int &objectId : objectavail) - objectId = file.nextLE(); + objectId = file.NextLE(); for (int i = 0; i < nobjects; i++) LoadObject(&file, objectactive[i]); if (!gbSkipSync) { @@ -2147,45 +2147,45 @@ void LoadLevel() } for (int &itemId : itemactive) - itemId = file.nextLE(); + itemId = file.NextLE(); for (int &itemId : itemavail) - itemId = file.nextLE(); + itemId = file.NextLE(); for (int i = 0; i < numitems; i++) LoadItem(&file, itemactive[i]); for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - dFlags[i][j] = file.nextLE(); + dFlags[i][j] = file.NextLE(); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - dItem[i][j] = file.nextLE(); + dItem[i][j] = file.NextLE(); } if (leveltype != DTYPE_TOWN) { for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - dMonster[i][j] = file.nextBE(); + dMonster[i][j] = file.NextBE(); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - dObject[i][j] = file.nextLE(); + dObject[i][j] = file.NextLE(); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - dLight[i][j] = file.nextLE(); + dLight[i][j] = file.NextLE(); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - dPreLight[i][j] = file.nextLE(); + dPreLight[i][j] = file.NextLE(); } for (int j = 0; j < DMAXY; j++) { for (int i = 0; i < DMAXX; i++) // NOLINT(modernize-loop-convert) - AutomapView[i][j] = file.nextBool8(); + AutomapView[i][j] = file.NextBool8(); } for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) - dMissile[i][j] = 0; /// BUGFIX: supposed to load saved missiles with "file.nextLE()"? + dMissile[i][j] = 0; /// BUGFIX: supposed to load saved missiles with "file.NextLE()"? } } diff --git a/Source/monster.cpp b/Source/monster.cpp index f70cb4d68..338b6314d 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -2784,15 +2784,15 @@ bool M_DumbWalk(int i, Direction md) return ok; } -static Direction turn(Direction direction, bool turnLeft) +static Direction Turn(Direction direction, bool turnLeft) { return turnLeft ? left[direction] : right[direction]; } bool M_RoundWalk(int i, Direction direction, int *dir) { - Direction turn45deg = turn(direction, *dir != 0); - Direction turn90deg = turn(turn45deg, *dir != 0); + Direction turn45deg = Turn(direction, *dir != 0); + Direction turn90deg = Turn(turn45deg, *dir != 0); if (DirOK(i, turn90deg)) { // Turn 90 degrees diff --git a/Source/msg.cpp b/Source/msg.cpp index 74e85170f..4c939f439 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -33,26 +33,29 @@ namespace devilution { -#define MAX_CHUNKS (NUMLEVELS + 4) - -static DWORD sgdwOwnerWait; -static DWORD sgdwRecvOffset; -static int sgnCurrMegaPlayer; -static DLevel sgLevels[NUMLEVELS]; -static BYTE sbLastCmd; -static TMegaPkt *sgpCurrPkt; -static byte sgRecvBuf[sizeof(DLevel) + 1]; -static BYTE sgbRecvCmd; -static LocalLevel sgLocals[NUMLEVELS]; -static DJunk sgJunk; -static TMegaPkt *sgpMegaPkt; -static bool sgbDeltaChanged; -static BYTE sgbDeltaChunks; bool deltaload; BYTE gbBufferMsgs; int dwRecCount; -static void msg_get_next_packet() +namespace { + +#define MAX_CHUNKS (NUMLEVELS + 4) + +DWORD sgdwOwnerWait; +DWORD sgdwRecvOffset; +int sgnCurrMegaPlayer; +DLevel sgLevels[NUMLEVELS]; +BYTE sbLastCmd; +TMegaPkt *sgpCurrPkt; +byte sgRecvBuf[sizeof(DLevel) + 1]; +BYTE sgbRecvCmd; +LocalLevel sgLocals[NUMLEVELS]; +DJunk sgJunk; +TMegaPkt *sgpMegaPkt; +bool sgbDeltaChanged; +BYTE sgbDeltaChunks; + +void GetNextPacket() { TMegaPkt *result; @@ -67,7 +70,7 @@ static void msg_get_next_packet() result->pNext = sgpCurrPkt; } -static void msg_free_packets() +void FreePackets() { while (sgpMegaPkt != nullptr) { sgpCurrPkt = sgpMegaPkt->pNext; @@ -76,7 +79,7 @@ static void msg_free_packets() } } -static void msg_pre_packet() +void PrePacket() { uint8_t playerId = -1; for (TMegaPkt *pkt = sgpMegaPkt; pkt != nullptr; pkt = pkt->pNext) { @@ -108,7 +111,7 @@ static void msg_pre_packet() } } -static void msg_send_packet(int pnum, const void *packet, DWORD dwSize) +void SendPacket(int pnum, const void *packet, DWORD dwSize) { TFakeCmdPlr cmd; @@ -116,26 +119,16 @@ static void msg_send_packet(int pnum, const void *packet, DWORD dwSize) sgnCurrMegaPlayer = pnum; cmd.bCmd = FAKE_CMD_SETID; cmd.bPlr = pnum; - msg_send_packet(pnum, &cmd, sizeof(cmd)); + SendPacket(pnum, &cmd, sizeof(cmd)); } if (sgpCurrPkt->dwSpaceLeft < dwSize) - msg_get_next_packet(); + GetNextPacket(); memcpy(sgpCurrPkt->data + sizeof(sgpCurrPkt->data) - sgpCurrPkt->dwSpaceLeft, packet, dwSize); sgpCurrPkt->dwSpaceLeft -= dwSize; } -void msg_send_drop_pkt(int pnum, int reason) -{ - TFakeDropPlr cmd; - - cmd.dwReason = reason; - cmd.bCmd = FAKE_CMD_DROPID; - cmd.bPlr = pnum; - msg_send_packet(pnum, &cmd, sizeof(cmd)); -} - -static int msg_wait_for_turns() +int WaitForTurns() { bool received; DWORD turns; @@ -168,55 +161,12 @@ static int msg_wait_for_turns() return 100 * sgbDeltaChunks / MAX_CHUNKS; } -bool msg_wait_resync() -{ - bool success; - - msg_get_next_packet(); - sgbDeltaChunks = 0; - sgnCurrMegaPlayer = -1; - sgbRecvCmd = CMD_DLEVEL_END; - gbBufferMsgs = 1; - sgdwOwnerWait = SDL_GetTicks(); - success = UiProgressDialog(_("Waiting for game data..."), msg_wait_for_turns); - gbBufferMsgs = 0; - if (!success) { - msg_free_packets(); - return false; - } - - if (gbGameDestroyed) { - DrawDlg("%s", _("The game ended")); - msg_free_packets(); - return false; - } - - if (sgbDeltaChunks != MAX_CHUNKS) { - DrawDlg("%s", _("Unable to get level data")); - msg_free_packets(); - return false; - } - - return true; -} - -void run_delta_info() -{ - if (!gbIsMultiplayer) - return; - - gbBufferMsgs = 2; - msg_pre_packet(); - gbBufferMsgs = 0; - msg_free_packets(); -} - -static byte *DeltaExportItem(byte *dst, TCmdPItem *src) +byte *DeltaExportItem(byte *dst, TCmdPItem *src) { for (int i = 0; i < MAXITEMS; i++, src++) { - if (src->bCmd == 0xFF) + if (src->bCmd == 0xFF) { *dst++ = byte { 0xFF }; - else { + } else { memcpy(dst, src, sizeof(TCmdPItem)); dst += sizeof(TCmdPItem); } @@ -225,7 +175,7 @@ static byte *DeltaExportItem(byte *dst, TCmdPItem *src) return dst; } -static byte *DeltaImportItem(byte *src, TCmdPItem *dst) +byte *DeltaImportItem(byte *src, TCmdPItem *dst) { for (int i = 0; i < MAXITEMS; i++, dst++) { if (*src == byte { 0xFF }) { @@ -240,24 +190,24 @@ static byte *DeltaImportItem(byte *src, TCmdPItem *dst) return src; } -static byte *DeltaExportObject(byte *dst, DObjectStr *src) +byte *DeltaExportObject(byte *dst, DObjectStr *src) { memcpy(dst, src, sizeof(DObjectStr) * MAXOBJECTS); return dst + sizeof(DObjectStr) * MAXOBJECTS; } -static byte *DeltaImportObject(byte *src, DObjectStr *dst) +byte *DeltaImportObject(byte *src, DObjectStr *dst) { memcpy(dst, src, sizeof(DObjectStr) * MAXOBJECTS); return src + sizeof(DObjectStr) * MAXOBJECTS; } -static byte *DeltaExportMonster(byte *dst, DMonsterStr *src) +byte *DeltaExportMonster(byte *dst, DMonsterStr *src) { for (int i = 0; i < MAXMONSTERS; i++, src++) { - if (src->_mx == 0xFF) + if (src->_mx == 0xFF) { *dst++ = byte { 0xFF }; - else { + } else { memcpy(dst, src, sizeof(DMonsterStr)); dst += sizeof(DMonsterStr); } @@ -266,7 +216,7 @@ static byte *DeltaExportMonster(byte *dst, DMonsterStr *src) return dst; } -static byte *DeltaImportMonster(byte *src, DMonsterStr *dst) +byte *DeltaImportMonster(byte *src, DMonsterStr *dst) { for (int i = 0; i < MAXMONSTERS; i++, dst++) { if (*src == byte { 0xFF }) { @@ -281,7 +231,7 @@ static byte *DeltaImportMonster(byte *src, DMonsterStr *dst) return src; } -static byte *DeltaExportJunk(byte *dst) +byte *DeltaExportJunk(byte *dst) { for (auto &portal : sgJunk.portal) { if (portal.x == 0xFF) { @@ -307,7 +257,7 @@ static byte *DeltaExportJunk(byte *dst) return dst; } -static void DeltaImportJunk(byte *src) +void DeltaImportJunk(byte *src) { for (int i = 0; i < MAXPORTAL; i++) { if (*src == byte { 0xFF }) { @@ -340,7 +290,7 @@ static void DeltaImportJunk(byte *src) } } -static DWORD msg_comp_level(byte *buffer, byte *end) +DWORD CompressData(byte *buffer, byte *end) { DWORD size = end - buffer - 1; DWORD pkSize = PkwareCompress(buffer + 1, size); @@ -350,30 +300,7 @@ static DWORD msg_comp_level(byte *buffer, byte *end) return pkSize + 1; } -void DeltaExportData(int pnum) -{ - if (sgbDeltaChanged) { - int size; - std::unique_ptr dst { new byte[sizeof(DLevel) + 1] }; - byte *dstEnd; - for (int i = 0; i < NUMLEVELS; i++) { - dstEnd = &dst[1]; - dstEnd = DeltaExportItem(dstEnd, sgLevels[i].item); - dstEnd = DeltaExportObject(dstEnd, sgLevels[i].object); - dstEnd = DeltaExportMonster(dstEnd, sgLevels[i].monster); - size = msg_comp_level(dst.get(), dstEnd); - dthread_send_delta(pnum, static_cast<_cmd_id>(i + CMD_DLEVEL_0), dst.get(), size); - } - dstEnd = &dst[1]; - dstEnd = DeltaExportJunk(dstEnd); - size = msg_comp_level(dst.get(), dstEnd); - dthread_send_delta(pnum, CMD_DLEVEL_JUNK, dst.get(), size); - } - byte src { 0 }; - dthread_send_delta(pnum, CMD_DLEVEL_END, &src, 1); -} - -static void DeltaImportData(BYTE cmd, DWORD recv_offset) +void DeltaImportData(BYTE cmd, DWORD recv_offset) { if (sgRecvBuf[0] != byte { 0 }) PkwareDecompress(&sgRecvBuf[1], recv_offset, sizeof(sgRecvBuf) - 1); @@ -394,7 +321,7 @@ static void DeltaImportData(BYTE cmd, DWORD recv_offset) sgbDeltaChanged = true; } -static DWORD On_DLEVEL(int pnum, TCmd *pCmd) +DWORD OnLevelData(int pnum, TCmd *pCmd) { auto *p = (TCmdPlrInfoHdr *)pCmd; @@ -437,59 +364,7 @@ static DWORD On_DLEVEL(int pnum, TCmd *pCmd) return p->wBytes + sizeof(*p); } -void delta_init() -{ - sgbDeltaChanged = false; - memset(&sgJunk, 0xFF, sizeof(sgJunk)); - memset(sgLevels, 0xFF, sizeof(sgLevels)); - memset(sgLocals, 0, sizeof(sgLocals)); - deltaload = false; -} - -void delta_kill_monster(int mi, Point position, BYTE bLevel) -{ - if (!gbIsMultiplayer) - return; - - sgbDeltaChanged = true; - DMonsterStr *pD = &sgLevels[bLevel].monster[mi]; - pD->_mx = position.x; - pD->_my = position.y; - pD->_mdir = monster[mi]._mdir; - pD->_mhitpoints = 0; -} - -void delta_monster_hp(int mi, int hp, BYTE bLevel) -{ - if (!gbIsMultiplayer) - return; - - sgbDeltaChanged = true; - DMonsterStr *pD = &sgLevels[bLevel].monster[mi]; - if (pD->_mhitpoints > hp) - pD->_mhitpoints = hp; -} - -void delta_sync_monster(const TSyncMonster *pSync, BYTE bLevel) -{ - if (!gbIsMultiplayer) - return; - - assert(pSync != nullptr); - assert(bLevel < NUMLEVELS); - sgbDeltaChanged = true; - - DMonsterStr *pD = &sgLevels[bLevel].monster[pSync->_mndx]; - if (pD->_mhitpoints == 0) - return; - - pD->_mx = pSync->_mx; - pD->_my = pSync->_my; - pD->_mactive = UINT8_MAX; - pD->_menemy = pSync->_menemy; -} - -void delta_sync_golem(TCmdGolem *pG, int pnum, BYTE bLevel) +void DeltaSyncGolem(TCmdGolem *pG, int pnum, BYTE bLevel) { if (!gbIsMultiplayer) return; @@ -504,7 +379,7 @@ void delta_sync_golem(TCmdGolem *pG, int pnum, BYTE bLevel) pD->_mhitpoints = pG->_mhitpoints; } -void delta_leave_sync(BYTE bLevel) +void DeltaLeaveSync(BYTE bLevel) { if (!gbIsMultiplayer) return; @@ -529,7 +404,7 @@ void delta_leave_sync(BYTE bLevel) memcpy(&sgLocals[bLevel].automapsv, AutomapView, sizeof(AutomapView)); } -static void delta_sync_object(int oi, _cmd_id bCmd, BYTE bLevel) +void DeltaSyncObject(int oi, _cmd_id bCmd, BYTE bLevel) { if (!gbIsMultiplayer) return; @@ -538,7 +413,7 @@ static void delta_sync_object(int oi, _cmd_id bCmd, BYTE bLevel) sgLevels[bLevel].object[oi].bCmd = bCmd; } -static bool delta_get_item(TCmdGItem *pI, BYTE bLevel) +bool DeltaGetItem(TCmdGItem *pI, BYTE bLevel) { int i; @@ -599,7 +474,7 @@ static bool delta_get_item(TCmdGItem *pI, BYTE bLevel) return true; } -static void delta_put_item(TCmdPItem *pI, int x, int y, BYTE bLevel) +void DeltaPutItem(TCmdPItem *pI, int x, int y, BYTE bLevel) { int i; @@ -632,1877 +507,1995 @@ static void delta_put_item(TCmdPItem *pI, int x, int y, BYTE bLevel) } } -bool delta_portal_inited(int i) +bool IOwnLevel(int nReqLevel) { - return sgJunk.portal[i].x == 0xFF; + int i; + + for (i = 0; i < MAX_PLRS; i++) { + if (!plr[i].plractive) + continue; + if (plr[i]._pLvlChanging) + continue; + if (plr[i].plrlevel != nReqLevel) + continue; + if (i == myplr && gbBufferMsgs != 0) + continue; + break; + } + return i == myplr; } -bool delta_quest_inited(int i) +void DeltaOpenPortal(int pnum, uint8_t x, uint8_t y, uint8_t bLevel, dungeon_type bLType, bool bSetLvl) { - return sgJunk.quests[i].qstate != QUEST_INVALID; + sgbDeltaChanged = true; + sgJunk.portal[pnum].x = x; + sgJunk.portal[pnum].y = y; + sgJunk.portal[pnum].level = bLevel; + sgJunk.portal[pnum].ltype = bLType; + sgJunk.portal[pnum].setlvl = bSetLvl ? 1 : 0; } -void DeltaAddItem(int ii) +void CheckUpdatePlayer(int pnum) { - int i; - - if (!gbIsMultiplayer) - return; + if (gbIsMultiplayer && pnum == myplr) + pfile_update(true); +} - TCmdPItem *pD = sgLevels[currlevel].item; - for (i = 0; i < MAXITEMS; i++, pD++) { - if (pD->bCmd != 0xFF - && pD->wIndx == items[ii].IDidx - && pD->wCI == items[ii]._iCreateInfo - && pD->dwSeed == items[ii]._iSeed - && (pD->bCmd == CMD_WALKXY || pD->bCmd == CMD_STAND)) { - return; - } - } +void PlayerMessageFormat(const char *pszFmt, ...) +{ + static DWORD msg_err_timer; + DWORD ticks; + char msg[256]; + va_list va; - pD = sgLevels[currlevel].item; - for (i = 0; i < MAXITEMS; i++, pD++) { - if (pD->bCmd == 0xFF) { - sgbDeltaChanged = true; - pD->bCmd = CMD_STAND; - pD->x = items[ii].position.x; - pD->y = items[ii].position.y; - pD->wIndx = items[ii].IDidx; - pD->wCI = items[ii]._iCreateInfo; - pD->dwSeed = items[ii]._iSeed; - pD->bId = items[ii]._iIdentified ? 1 : 0; - pD->bDur = items[ii]._iDurability; - pD->bMDur = items[ii]._iMaxDur; - pD->bCh = items[ii]._iCharges; - pD->bMCh = items[ii]._iMaxCharges; - pD->wValue = items[ii]._ivalue; - pD->wToHit = items[ii]._iPLToHit; - pD->wMaxDam = items[ii]._iMaxDam; - pD->bMinStr = items[ii]._iMinStr; - pD->bMinMag = items[ii]._iMinMag; - pD->bMinDex = items[ii]._iMinDex; - pD->bAC = items[ii]._iAC; - pD->dwBuff = items[ii].dwBuff; - return; - } + va_start(va, pszFmt); + ticks = SDL_GetTicks(); + if (ticks - msg_err_timer >= 5000) { + msg_err_timer = ticks; + vsprintf(msg, pszFmt, va); + ErrorPlrMsg(msg); } + va_end(va); } -void DeltaSaveLevel() +void NetSendCmdGItem2(bool usonly, _cmd_id bCmd, BYTE mast, BYTE pnum, TCmdGItem *p) { - if (!gbIsMultiplayer) + TCmdGItem cmd; + + memcpy(&cmd, p, sizeof(cmd)); + cmd.bPnum = pnum; + cmd.bCmd = bCmd; + cmd.bMaster = mast; + + if (!usonly) { + cmd.dwTime = 0; + NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); return; + } - for (int i = 0; i < MAX_PLRS; i++) { - if (i != myplr) - ResetPlayerGFX(plr[i]); + int ticks = SDL_GetTicks(); + if (cmd.dwTime == 0) { + cmd.dwTime = ticks; + } else if (ticks - cmd.dwTime > 5000) { + return; } - plr[myplr]._pLvlVisited[currlevel] = true; - delta_leave_sync(currlevel); + + multi_msg_add((byte *)&cmd.bCmd, sizeof(cmd)); } -void DeltaLoadLevel() +bool NetSendCmdReq2(_cmd_id bCmd, BYTE mast, BYTE pnum, TCmdGItem *p) { - if (!gbIsMultiplayer) - return; + TCmdGItem cmd; - deltaload = true; - if (currlevel != 0) { - for (int i = 0; i < nummonsters; i++) { - if (sgLevels[currlevel].monster[i]._mx != 0xFF) { - M_ClearSquares(i); - int x = sgLevels[currlevel].monster[i]._mx; - int y = sgLevels[currlevel].monster[i]._my; - monster[i].position.tile = { x, y }; - monster[i].position.old = { x, y }; - monster[i].position.future = { x, y }; - if (sgLevels[currlevel].monster[i]._mhitpoints != -1) - monster[i]._mhitpoints = sgLevels[currlevel].monster[i]._mhitpoints; - if (sgLevels[currlevel].monster[i]._mhitpoints == 0) { - M_ClearSquares(i); - if (monster[i]._mAi != AI_DIABLO) { - if (monster[i]._uniqtype == 0) { - assert(monster[i].MType != nullptr); - AddDead(monster[i].position.tile, monster[i].MType->mdeadval, monster[i]._mdir); - } else { - AddDead(monster[i].position.tile, monster[i]._udeadval, monster[i]._mdir); - } - } - monster[i]._mDelFlag = true; - M_UpdateLeader(i); - } else { - decode_enemy(i, sgLevels[currlevel].monster[i]._menemy); - if (monster[i].position.tile != Point { 0, 0 } && monster[i].position.tile != Point { 1, 0 }) - dMonster[monster[i].position.tile.x][monster[i].position.tile.y] = i + 1; - if (i < MAX_PLRS) { - MAI_Golum(i); - monster[i]._mFlags |= (MFLAG_TARGETS_MONSTER | MFLAG_GOLEM); - } else { - M_StartStand(i, monster[i]._mdir); - } - monster[i]._msquelch = sgLevels[currlevel].monster[i]._mactive; - } - } - } - memcpy(AutomapView, &sgLocals[currlevel], sizeof(AutomapView)); - } - - for (int i = 0; i < MAXITEMS; i++) { - if (sgLevels[currlevel].item[i].bCmd != 0xFF) { - if (sgLevels[currlevel].item[i].bCmd == CMD_WALKXY) { - int ii = FindGetItem( - sgLevels[currlevel].item[i].wIndx, - sgLevels[currlevel].item[i].wCI, - sgLevels[currlevel].item[i].dwSeed); - if (ii != -1) { - if (dItem[items[ii].position.x][items[ii].position.y] == ii + 1) - dItem[items[ii].position.x][items[ii].position.y] = 0; - DeleteItem(ii, i); - } - } - if (sgLevels[currlevel].item[i].bCmd == CMD_ACK_PLRINFO) { - int ii = AllocateItem(); + memcpy(&cmd, p, sizeof(cmd)); + cmd.bCmd = bCmd; + cmd.bPnum = pnum; + cmd.bMaster = mast; - if (sgLevels[currlevel].item[i].wIndx == IDI_EAR) { - RecreateEar( - ii, - sgLevels[currlevel].item[i].wCI, - sgLevels[currlevel].item[i].dwSeed, - sgLevels[currlevel].item[i].bId, - sgLevels[currlevel].item[i].bDur, - sgLevels[currlevel].item[i].bMDur, - sgLevels[currlevel].item[i].bCh, - sgLevels[currlevel].item[i].bMCh, - sgLevels[currlevel].item[i].wValue, - sgLevels[currlevel].item[i].dwBuff); - } else { - RecreateItem( - ii, - sgLevels[currlevel].item[i].wIndx, - sgLevels[currlevel].item[i].wCI, - sgLevels[currlevel].item[i].dwSeed, - sgLevels[currlevel].item[i].wValue, - (sgLevels[currlevel].item[i].dwBuff & CF_HELLFIRE) != 0); - if (sgLevels[currlevel].item[i].bId != 0) - items[ii]._iIdentified = true; - items[ii]._iDurability = sgLevels[currlevel].item[i].bDur; - items[ii]._iMaxDur = sgLevels[currlevel].item[i].bMDur; - items[ii]._iCharges = sgLevels[currlevel].item[i].bCh; - items[ii]._iMaxCharges = sgLevels[currlevel].item[i].bMCh; - items[ii]._iPLToHit = sgLevels[currlevel].item[i].wToHit; - items[ii]._iMaxDam = sgLevels[currlevel].item[i].wMaxDam; - items[ii]._iMinStr = sgLevels[currlevel].item[i].bMinStr; - items[ii]._iMinMag = sgLevels[currlevel].item[i].bMinMag; - items[ii]._iMinDex = sgLevels[currlevel].item[i].bMinDex; - items[ii]._iAC = sgLevels[currlevel].item[i].bAC; - items[ii].dwBuff = sgLevels[currlevel].item[i].dwBuff; - } - int x = sgLevels[currlevel].item[i].x; - int y = sgLevels[currlevel].item[i].y; - if (!CanPut({ x, y })) { - bool done = false; - for (int k = 1; k < 50 && !done; k++) { - for (int j = -k; j <= k && !done; j++) { - int yy = y + j; - for (int l = -k; l <= k && !done; l++) { - int xx = x + l; - if (CanPut({ xx, yy })) { - done = true; - x = xx; - y = yy; - } - } - } - } - } - items[ii].position = { x, y }; - dItem[items[ii].position.x][items[ii].position.y] = ii + 1; - RespawnItem(&items[ii], false); - } - } - } + int ticks = SDL_GetTicks(); + if (cmd.dwTime == 0) + cmd.dwTime = ticks; + else if (ticks - cmd.dwTime > 5000) + return false; - if (currlevel != 0) { - for (int i = 0; i < MAXOBJECTS; i++) { - switch (sgLevels[currlevel].object[i].bCmd) { - case CMD_OPENDOOR: - case CMD_CLOSEDOOR: - case CMD_OPERATEOBJ: - case CMD_PLROPOBJ: - SyncOpObject(-1, sgLevels[currlevel].object[i].bCmd, i); - break; - case CMD_BREAKOBJ: - SyncBreakObj(-1, i); - break; - default: - break; - } - } + multi_msg_add((byte *)&cmd.bCmd, sizeof(cmd)); - for (int i = 0; i < nobjects; i++) { - int ot = object[objectactive[i]]._otype; - if (ot == OBJ_TRAPL || ot == OBJ_TRAPR) - Obj_Trap(objectactive[i]); - } - } - deltaload = false; + return true; } -void NetSendCmd(bool bHiPri, _cmd_id bCmd) +void NetSendCmdExtra(TCmdGItem *p) { - TCmd cmd; + TCmdGItem cmd; - cmd.bCmd = bCmd; - if (bHiPri) - NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); - else - NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); + memcpy(&cmd, p, sizeof(cmd)); + cmd.dwTime = 0; + cmd.bCmd = CMD_ITEMEXTRA; + NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); } -void NetSendCmdGolem(BYTE mx, BYTE my, Direction dir, BYTE menemy, int hp, BYTE cl) +DWORD OnSyncData(TCmd *pCmd, int pnum) { - TCmdGolem cmd; - - cmd.bCmd = CMD_AWAKEGOLEM; - cmd._mx = mx; - cmd._my = my; - cmd._mdir = dir; - cmd._menemy = menemy; - cmd._mhitpoints = hp; - cmd._currlevel = cl; - NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); + return sync_update(pnum, (const byte *)pCmd); } -void NetSendCmdLoc(int playerId, bool bHiPri, _cmd_id bCmd, Point position) +DWORD OnWalk(TCmd *pCmd, int pnum) { - TCmdLoc cmd; + auto *p = (TCmdLoc *)pCmd; - cmd.bCmd = bCmd; - cmd.x = position.x; - cmd.y = position.y; - if (bHiPri) - NetSendHiPri(playerId, (byte *)&cmd, sizeof(cmd)); - else - NetSendLoPri(playerId, (byte *)&cmd, sizeof(cmd)); + if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { + ClrPlrPath(plr[pnum]); + MakePlrPath(pnum, { p->x, p->y }, true); + plr[pnum].destAction = ACTION_NONE; + } + + return sizeof(*p); } -void NetSendCmdLocParam1(bool bHiPri, _cmd_id bCmd, Point position, uint16_t wParam1) +DWORD OnAddStrength(TCmd *pCmd, int pnum) { - TCmdLocParam1 cmd; + auto *p = (TCmdParam1 *)pCmd; - cmd.bCmd = bCmd; - cmd.x = position.x; - cmd.y = position.y; - cmd.wParam1 = wParam1; - if (bHiPri) - NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); - else - NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); + if (gbBufferMsgs == 1) + SendPacket(pnum, p, sizeof(*p)); + else if (p->wParam1 <= 256) + ModifyPlrStr(pnum, p->wParam1); + + return sizeof(*p); } -void NetSendCmdLocParam2(bool bHiPri, _cmd_id bCmd, Point position, uint16_t wParam1, uint16_t wParam2) +DWORD OnAddMagic(TCmd *pCmd, int pnum) { - TCmdLocParam2 cmd; + auto *p = (TCmdParam1 *)pCmd; - cmd.bCmd = bCmd; - cmd.x = position.x; - cmd.y = position.y; - cmd.wParam1 = wParam1; - cmd.wParam2 = wParam2; - if (bHiPri) - NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); - else - NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); + if (gbBufferMsgs == 1) + SendPacket(pnum, p, sizeof(*p)); + else if (p->wParam1 <= 256) + ModifyPlrMag(pnum, p->wParam1); + + return sizeof(*p); } -void NetSendCmdLocParam3(bool bHiPri, _cmd_id bCmd, Point position, uint16_t wParam1, uint16_t wParam2, uint16_t wParam3) +DWORD OnAddDexterity(TCmd *pCmd, int pnum) { - TCmdLocParam3 cmd; + auto *p = (TCmdParam1 *)pCmd; - cmd.bCmd = bCmd; - cmd.x = position.x; - cmd.y = position.y; - cmd.wParam1 = wParam1; - cmd.wParam2 = wParam2; - cmd.wParam3 = wParam3; - if (bHiPri) - NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); - else - NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); + if (gbBufferMsgs == 1) + SendPacket(pnum, p, sizeof(*p)); + else if (p->wParam1 <= 256) + ModifyPlrDex(pnum, p->wParam1); + + return sizeof(*p); } -void NetSendCmdParam1(bool bHiPri, _cmd_id bCmd, uint16_t wParam1) +DWORD OnAddVitality(TCmd *pCmd, int pnum) { - TCmdParam1 cmd; + auto *p = (TCmdParam1 *)pCmd; - cmd.bCmd = bCmd; - cmd.wParam1 = wParam1; - if (bHiPri) - NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); - else - NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); + if (gbBufferMsgs == 1) + SendPacket(pnum, p, sizeof(*p)); + else if (p->wParam1 <= 256) + ModifyPlrVit(pnum, p->wParam1); + + return sizeof(*p); } -void NetSendCmdParam2(bool bHiPri, _cmd_id bCmd, uint16_t wParam1, uint16_t wParam2) +DWORD OnGotoGetItem(TCmd *pCmd, int pnum) { - TCmdParam2 cmd; + auto *p = (TCmdLocParam1 *)pCmd; - cmd.bCmd = bCmd; - cmd.wParam1 = wParam1; - cmd.wParam2 = wParam2; - if (bHiPri) - NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); - else - NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); + if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { + MakePlrPath(pnum, { p->x, p->y }, false); + plr[pnum].destAction = ACTION_PICKUPITEM; + plr[pnum].destParam1 = p->wParam1; + } + + return sizeof(*p); } -void NetSendCmdParam3(bool bHiPri, _cmd_id bCmd, uint16_t wParam1, uint16_t wParam2, uint16_t wParam3) +DWORD OnRequestGetItem(TCmd *pCmd, int pnum) { - TCmdParam3 cmd; + auto *p = (TCmdGItem *)pCmd; - cmd.bCmd = bCmd; - cmd.wParam1 = wParam1; - cmd.wParam2 = wParam2; - cmd.wParam3 = wParam3; - if (bHiPri) - NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); - else - NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); -} - -void NetSendCmdQuest(bool bHiPri, BYTE q) -{ - TCmdQuest cmd; + if (gbBufferMsgs != 1 && IOwnLevel(plr[pnum].plrlevel)) { + if (GetItemRecord(p->dwSeed, p->wCI, p->wIndx)) { + int ii = FindGetItem(p->wIndx, p->wCI, p->dwSeed); + if (ii != -1) { + NetSendCmdGItem2(false, CMD_GETITEM, myplr, p->bPnum, p); + if (p->bPnum != myplr) + SyncGetItem({ p->x, p->y }, p->wIndx, p->wCI, p->dwSeed); + else + InvGetItem(myplr, &items[ii], ii); + SetItemRecord(p->dwSeed, p->wCI, p->wIndx); + } else if (!NetSendCmdReq2(CMD_REQUESTGITEM, myplr, p->bPnum, p)) { + NetSendCmdExtra(p); + } + } + } - cmd.q = q; - cmd.bCmd = CMD_SYNCQUEST; - cmd.qstate = quests[q]._qactive; - cmd.qlog = quests[q]._qlog ? 1 : 0; - cmd.qvar1 = quests[q]._qvar1; - if (bHiPri) - NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); - else - NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); + return sizeof(*p); } -void NetSendCmdGItem(bool bHiPri, _cmd_id bCmd, BYTE mast, BYTE pnum, BYTE ii) +DWORD OnGetItem(TCmd *pCmd, int pnum) { - TCmdGItem cmd; - - cmd.bCmd = bCmd; - cmd.bPnum = pnum; - cmd.bMaster = mast; - cmd.bLevel = currlevel; - cmd.bCursitem = ii; - cmd.dwTime = 0; - cmd.x = items[ii].position.x; - cmd.y = items[ii].position.y; - cmd.wIndx = items[ii].IDidx; + auto *p = (TCmdGItem *)pCmd; - if (items[ii].IDidx == IDI_EAR) { - cmd.wCI = items[ii]._iName[8] | (items[ii]._iName[7] << 8); - cmd.dwSeed = items[ii]._iName[12] | ((items[ii]._iName[11] | ((items[ii]._iName[10] | (items[ii]._iName[9] << 8)) << 8)) << 8); - cmd.bId = items[ii]._iName[13]; - cmd.bDur = items[ii]._iName[14]; - cmd.bMDur = items[ii]._iName[15]; - cmd.bCh = items[ii]._iName[16]; - cmd.bMCh = items[ii]._iName[17]; - cmd.wValue = items[ii]._ivalue | (items[ii]._iName[18] << 8) | ((items[ii]._iCurs - ICURS_EAR_SORCERER) << 6); - cmd.dwBuff = items[ii]._iName[22] | ((items[ii]._iName[21] | ((items[ii]._iName[20] | (items[ii]._iName[19] << 8)) << 8)) << 8); + if (gbBufferMsgs == 1) { + SendPacket(pnum, p, sizeof(*p)); } else { - cmd.wCI = items[ii]._iCreateInfo; - cmd.dwSeed = items[ii]._iSeed; - cmd.bId = items[ii]._iIdentified ? 1 : 0; - cmd.bDur = items[ii]._iDurability; - cmd.bMDur = items[ii]._iMaxDur; - cmd.bCh = items[ii]._iCharges; - cmd.bMCh = items[ii]._iMaxCharges; - cmd.wValue = items[ii]._ivalue; - cmd.wToHit = items[ii]._iPLToHit; - cmd.wMaxDam = items[ii]._iMaxDam; - cmd.bMinStr = items[ii]._iMinStr; - cmd.bMinMag = items[ii]._iMinMag; - cmd.bMinDex = items[ii]._iMinDex; - cmd.bAC = items[ii]._iAC; - cmd.dwBuff = items[ii].dwBuff; + int ii = FindGetItem(p->wIndx, p->wCI, p->dwSeed); + if (DeltaGetItem(p, p->bLevel)) { + if ((currlevel == p->bLevel || p->bPnum == myplr) && p->bMaster != myplr) { + if (p->bPnum == myplr) { + if (currlevel != p->bLevel) { + ii = SyncPutItem(plr[myplr], plr[myplr].position.tile, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC); + if (ii != -1) + InvGetItem(myplr, &items[ii], ii); + } else { + InvGetItem(myplr, &items[ii], ii); + } + } else { + SyncGetItem({ p->x, p->y }, p->wIndx, p->wCI, p->dwSeed); + } + } + } else { + NetSendCmdGItem2(true, CMD_GETITEM, p->bMaster, p->bPnum, p); + } } - if (bHiPri) - NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); - else - NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); + return sizeof(*p); } -void NetSendCmdGItem2(bool usonly, _cmd_id bCmd, BYTE mast, BYTE pnum, TCmdGItem *p) +DWORD OnGotoAutoGetItem(TCmd *pCmd, int pnum) { - TCmdGItem cmd; - - memcpy(&cmd, p, sizeof(cmd)); - cmd.bPnum = pnum; - cmd.bCmd = bCmd; - cmd.bMaster = mast; - - if (!usonly) { - cmd.dwTime = 0; - NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); - return; - } + auto *p = (TCmdLocParam1 *)pCmd; - int ticks = SDL_GetTicks(); - if (cmd.dwTime == 0) { - cmd.dwTime = ticks; - } else if (ticks - cmd.dwTime > 5000) { - return; + if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { + MakePlrPath(pnum, { p->x, p->y }, false); + plr[pnum].destAction = ACTION_PICKUPAITEM; + plr[pnum].destParam1 = p->wParam1; } - multi_msg_add((byte *)&cmd.bCmd, sizeof(cmd)); + return sizeof(*p); } -bool NetSendCmdReq2(_cmd_id bCmd, BYTE mast, BYTE pnum, TCmdGItem *p) +DWORD OnRequestAutoGetItem(TCmd *pCmd, int pnum) { - TCmdGItem cmd; - - memcpy(&cmd, p, sizeof(cmd)); - cmd.bCmd = bCmd; - cmd.bPnum = pnum; - cmd.bMaster = mast; - - int ticks = SDL_GetTicks(); - if (cmd.dwTime == 0) - cmd.dwTime = ticks; - else if (ticks - cmd.dwTime > 5000) - return false; + auto *p = (TCmdGItem *)pCmd; - multi_msg_add((byte *)&cmd.bCmd, sizeof(cmd)); + if (gbBufferMsgs != 1 && IOwnLevel(plr[pnum].plrlevel)) { + if (GetItemRecord(p->dwSeed, p->wCI, p->wIndx)) { + int ii = FindGetItem(p->wIndx, p->wCI, p->dwSeed); + if (ii != -1) { + NetSendCmdGItem2(false, CMD_AGETITEM, myplr, p->bPnum, p); + if (p->bPnum != myplr) + SyncGetItem({ p->x, p->y }, p->wIndx, p->wCI, p->dwSeed); + else + AutoGetItem(myplr, &items[p->bCursitem], p->bCursitem); + SetItemRecord(p->dwSeed, p->wCI, p->wIndx); + } else if (!NetSendCmdReq2(CMD_REQUESTAGITEM, myplr, p->bPnum, p)) { + NetSendCmdExtra(p); + } + } + } - return true; + return sizeof(*p); } -void NetSendCmdExtra(TCmdGItem *p) +DWORD OnAutoGetItem(TCmd *pCmd, int pnum) { - TCmdGItem cmd; + auto *p = (TCmdGItem *)pCmd; - memcpy(&cmd, p, sizeof(cmd)); - cmd.dwTime = 0; - cmd.bCmd = CMD_ITEMEXTRA; - NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); + if (gbBufferMsgs == 1) { + SendPacket(pnum, p, sizeof(*p)); + } else { + FindGetItem(p->wIndx, p->wCI, p->dwSeed); + if (DeltaGetItem(p, p->bLevel)) { + if ((currlevel == p->bLevel || p->bPnum == myplr) && p->bMaster != myplr) { + if (p->bPnum == myplr) { + if (currlevel != p->bLevel) { + int ii = SyncPutItem(plr[myplr], plr[myplr].position.tile, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC); + if (ii != -1) + AutoGetItem(myplr, &items[ii], ii); + } else { + AutoGetItem(myplr, &items[p->bCursitem], p->bCursitem); + } + } else { + SyncGetItem({ p->x, p->y }, p->wIndx, p->wCI, p->dwSeed); + } + } + } else { + NetSendCmdGItem2(true, CMD_AGETITEM, p->bMaster, p->bPnum, p); + } + } + + return sizeof(*p); } -void NetSendCmdPItem(bool bHiPri, _cmd_id bCmd, Point position) +DWORD OnItemExtra(TCmd *pCmd, int pnum) { - TCmdPItem cmd; - - cmd.bCmd = bCmd; - cmd.x = position.x; - cmd.y = position.y; - cmd.wIndx = plr[myplr].HoldItem.IDidx; + auto *p = (TCmdGItem *)pCmd; - if (plr[myplr].HoldItem.IDidx == IDI_EAR) { - cmd.wCI = plr[myplr].HoldItem._iName[8] | (plr[myplr].HoldItem._iName[7] << 8); - cmd.dwSeed = plr[myplr].HoldItem._iName[12] | ((plr[myplr].HoldItem._iName[11] | ((plr[myplr].HoldItem._iName[10] | (plr[myplr].HoldItem._iName[9] << 8)) << 8)) << 8); - cmd.bId = plr[myplr].HoldItem._iName[13]; - cmd.bDur = plr[myplr].HoldItem._iName[14]; - cmd.bMDur = plr[myplr].HoldItem._iName[15]; - cmd.bCh = plr[myplr].HoldItem._iName[16]; - cmd.bMCh = plr[myplr].HoldItem._iName[17]; - cmd.wValue = plr[myplr].HoldItem._ivalue | (plr[myplr].HoldItem._iName[18] << 8) | ((plr[myplr].HoldItem._iCurs - ICURS_EAR_SORCERER) << 6); - cmd.dwBuff = plr[myplr].HoldItem._iName[22] | ((plr[myplr].HoldItem._iName[21] | ((plr[myplr].HoldItem._iName[20] | (plr[myplr].HoldItem._iName[19] << 8)) << 8)) << 8); + if (gbBufferMsgs == 1) { + SendPacket(pnum, p, sizeof(*p)); } else { - cmd.wCI = plr[myplr].HoldItem._iCreateInfo; - cmd.dwSeed = plr[myplr].HoldItem._iSeed; - cmd.bId = plr[myplr].HoldItem._iIdentified ? 1 : 0; - cmd.bDur = plr[myplr].HoldItem._iDurability; - cmd.bMDur = plr[myplr].HoldItem._iMaxDur; - cmd.bCh = plr[myplr].HoldItem._iCharges; - cmd.bMCh = plr[myplr].HoldItem._iMaxCharges; - cmd.wValue = plr[myplr].HoldItem._ivalue; - cmd.wToHit = plr[myplr].HoldItem._iPLToHit; - cmd.wMaxDam = plr[myplr].HoldItem._iMaxDam; - cmd.bMinStr = plr[myplr].HoldItem._iMinStr; - cmd.bMinMag = plr[myplr].HoldItem._iMinMag; - cmd.bMinDex = plr[myplr].HoldItem._iMinDex; - cmd.bAC = plr[myplr].HoldItem._iAC; - cmd.dwBuff = plr[myplr].HoldItem.dwBuff; + DeltaGetItem(p, p->bLevel); + if (currlevel == plr[pnum].plrlevel) + SyncGetItem({ p->x, p->y }, p->wIndx, p->wCI, p->dwSeed); } - if (bHiPri) - NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); - else - NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); + return sizeof(*p); } -void NetSendCmdChItem(bool bHiPri, BYTE bLoc) +DWORD OnPutItem(TCmd *pCmd, int pnum) { - TCmdChItem cmd; + auto *p = (TCmdPItem *)pCmd; - cmd.bCmd = CMD_CHANGEPLRITEMS; - cmd.bLoc = bLoc; - cmd.wIndx = plr[myplr].HoldItem.IDidx; - cmd.wCI = plr[myplr].HoldItem._iCreateInfo; - cmd.dwSeed = plr[myplr].HoldItem._iSeed; - cmd.bId = plr[myplr].HoldItem._iIdentified ? 1 : 0; - cmd.dwBuff = plr[myplr].HoldItem.dwBuff; + if (gbBufferMsgs == 1) + SendPacket(pnum, p, sizeof(*p)); + else if (currlevel == plr[pnum].plrlevel) { + int ii; + if (pnum == myplr) + ii = InvPutItem(plr[pnum], { p->x, p->y }); + else + ii = SyncPutItem(plr[pnum], { p->x, p->y }, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC); + if (ii != -1) { + PutItemRecord(p->dwSeed, p->wCI, p->wIndx); + DeltaPutItem(p, items[ii].position.x, items[ii].position.y, plr[pnum].plrlevel); + CheckUpdatePlayer(pnum); + } + return sizeof(*p); + } else { + PutItemRecord(p->dwSeed, p->wCI, p->wIndx); + DeltaPutItem(p, p->x, p->y, plr[pnum].plrlevel); + CheckUpdatePlayer(pnum); + } - if (bHiPri) - NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); - else - NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); + return sizeof(*p); } -void NetSendCmdDelItem(bool bHiPri, BYTE bLoc) +DWORD OnSyncPutItem(TCmd *pCmd, int pnum) { - TCmdDelItem cmd; + auto *p = (TCmdPItem *)pCmd; - cmd.bLoc = bLoc; - cmd.bCmd = CMD_DELPLRITEMS; - if (bHiPri) - NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); - else - NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); + if (gbBufferMsgs == 1) + SendPacket(pnum, p, sizeof(*p)); + else if (currlevel == plr[pnum].plrlevel) { + int ii = SyncPutItem(plr[pnum], { p->x, p->y }, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC); + if (ii != -1) { + PutItemRecord(p->dwSeed, p->wCI, p->wIndx); + DeltaPutItem(p, items[ii].position.x, items[ii].position.y, plr[pnum].plrlevel); + CheckUpdatePlayer(pnum); + } + return sizeof(*p); + } else { + PutItemRecord(p->dwSeed, p->wCI, p->wIndx); + DeltaPutItem(p, p->x, p->y, plr[pnum].plrlevel); + CheckUpdatePlayer(pnum); + } + + return sizeof(*p); } -void NetSendCmdDItem(bool bHiPri, int ii) +DWORD OnRespawnItem(TCmd *pCmd, int pnum) { - TCmdPItem cmd; - - cmd.bCmd = CMD_DROPITEM; - cmd.x = items[ii].position.x; - cmd.y = items[ii].position.y; - cmd.wIndx = items[ii].IDidx; + auto *p = (TCmdPItem *)pCmd; - if (items[ii].IDidx == IDI_EAR) { - cmd.wCI = items[ii]._iName[8] | (items[ii]._iName[7] << 8); - cmd.dwSeed = items[ii]._iName[12] | ((items[ii]._iName[11] | ((items[ii]._iName[10] | (items[ii]._iName[9] << 8)) << 8)) << 8); - cmd.bId = items[ii]._iName[13]; - cmd.bDur = items[ii]._iName[14]; - cmd.bMDur = items[ii]._iName[15]; - cmd.bCh = items[ii]._iName[16]; - cmd.bMCh = items[ii]._iName[17]; - cmd.wValue = items[ii]._ivalue | (items[ii]._iName[18] << 8) | ((items[ii]._iCurs - ICURS_EAR_SORCERER) << 6); - cmd.dwBuff = items[ii]._iName[22] | ((items[ii]._iName[21] | ((items[ii]._iName[20] | (items[ii]._iName[19] << 8)) << 8)) << 8); + if (gbBufferMsgs == 1) { + SendPacket(pnum, p, sizeof(*p)); } else { - cmd.wCI = items[ii]._iCreateInfo; - cmd.dwSeed = items[ii]._iSeed; - cmd.bId = items[ii]._iIdentified ? 1 : 0; - cmd.bDur = items[ii]._iDurability; - cmd.bMDur = items[ii]._iMaxDur; - cmd.bCh = items[ii]._iCharges; - cmd.bMCh = items[ii]._iMaxCharges; - cmd.wValue = items[ii]._ivalue; - cmd.wToHit = items[ii]._iPLToHit; - cmd.wMaxDam = items[ii]._iMaxDam; - cmd.bMinStr = items[ii]._iMinStr; - cmd.bMinMag = items[ii]._iMinMag; - cmd.bMinDex = items[ii]._iMinDex; - cmd.bAC = items[ii]._iAC; - cmd.dwBuff = items[ii].dwBuff; + if (currlevel == plr[pnum].plrlevel && pnum != myplr) { + SyncPutItem(plr[pnum], { p->x, p->y }, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC); + } + PutItemRecord(p->dwSeed, p->wCI, p->wIndx); + DeltaPutItem(p, p->x, p->y, plr[pnum].plrlevel); } - if (bHiPri) - NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); - else - NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); + return sizeof(*p); } -static bool i_own_level(int nReqLevel) +DWORD OnAttackTile(TCmd *pCmd, int pnum) { - int i; + auto *p = (TCmdLoc *)pCmd; - for (i = 0; i < MAX_PLRS; i++) { - if (!plr[i].plractive) - continue; - if (plr[i]._pLvlChanging) - continue; - if (plr[i].plrlevel != nReqLevel) - continue; - if (i == myplr && gbBufferMsgs != 0) - continue; - break; + if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { + MakePlrPath(pnum, { p->x, p->y }, false); + plr[pnum].destAction = ACTION_ATTACK; + plr[pnum].destParam1 = p->x; + plr[pnum].destParam2 = p->y; } - return i == myplr; + + return sizeof(*p); } -void NetSendCmdDamage(bool bHiPri, uint8_t bPlr, DWORD dwDam) +DWORD OnStandingAttackTile(TCmd *pCmd, int pnum) { - TCmdDamage cmd; + auto *p = (TCmdLoc *)pCmd; - cmd.bCmd = CMD_PLRDAMAGE; - cmd.bPlr = bPlr; - cmd.dwDam = dwDam; - if (bHiPri) - NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); - else - NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); + if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { + ClrPlrPath(plr[pnum]); + plr[pnum].destAction = ACTION_ATTACK; + plr[pnum].destParam1 = p->x; + plr[pnum].destParam2 = p->y; + } + + return sizeof(*p); } -void NetSendCmdMonDmg(bool bHiPri, uint16_t wMon, DWORD dwDam) +DWORD OnRangedAttackTile(TCmd *pCmd, int pnum) { - TCmdMonDamage cmd; + auto *p = (TCmdLoc *)pCmd; - cmd.bCmd = CMD_MONSTDAMAGE; - cmd.wMon = wMon; - cmd.dwDam = dwDam; - if (bHiPri) - NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); - else - NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); + if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { + ClrPlrPath(plr[pnum]); + plr[pnum].destAction = ACTION_RATTACK; + plr[pnum].destParam1 = p->x; + plr[pnum].destParam2 = p->y; + } + + return sizeof(*p); } -void NetSendCmdString(uint32_t pmask, const char *pszStr) +DWORD OnSpellWall(TCmd *pCmd, int pnum) { - int dwStrLen; - TCmdString cmd; + auto *p = (TCmdLocParam3 *)pCmd; - dwStrLen = strlen(pszStr); - cmd.bCmd = CMD_STRING; - strcpy(cmd.str, pszStr); - multi_send_msg_packet(pmask, (byte *)&cmd.bCmd, dwStrLen + 2); + if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { + auto spell = static_cast(p->wParam1); + if (currlevel != 0 || spelldata[spell].sTownSpell) { + ClrPlrPath(plr[pnum]); + plr[pnum].destAction = ACTION_SPELLWALL; + plr[pnum].destParam1 = p->x; + plr[pnum].destParam2 = p->y; + plr[pnum].destParam3 = static_cast(p->wParam2); + plr[pnum].destParam4 = p->wParam3; + plr[pnum]._pSpell = spell; + plr[pnum]._pSplType = plr[pnum]._pRSplType; + plr[pnum]._pSplFrom = 0; + } else { + PlayerMessageFormat(fmt::format(_("{:s} has cast an illegal spell."), plr[pnum]._pName).c_str()); + } + } + + return sizeof(*p); } -static DWORD On_STRING2(int pnum, TCmd *pCmd) +DWORD OnSpellTile(TCmd *pCmd, int pnum) { - auto *p = (TCmdString *)pCmd; + auto *p = (TCmdLocParam2 *)pCmd; - int len = strlen(p->str); - if (gbBufferMsgs == 0) - SendPlrMsg(pnum, p->str); + if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { + auto spell = static_cast(p->wParam1); + if (currlevel != 0 || spelldata[spell].sTownSpell) { + ClrPlrPath(plr[pnum]); + plr[pnum].destAction = ACTION_SPELL; + plr[pnum].destParam1 = p->x; + plr[pnum].destParam2 = p->y; + plr[pnum].destParam3 = static_cast(p->wParam2); + plr[pnum]._pSpell = spell; + plr[pnum]._pSplType = plr[pnum]._pRSplType; + plr[pnum]._pSplFrom = 0; + } else { + PlayerMessageFormat(fmt::format(_("{:s} has cast an illegal spell."), plr[pnum]._pName).c_str()); + } + } - return len + 2; // length of string + nul terminator + sizeof(p->bCmd) + return sizeof(*p); } -static void delta_open_portal(int pnum, uint8_t x, uint8_t y, uint8_t bLevel, dungeon_type bLType, bool bSetLvl) +DWORD OnTargetSpellTile(TCmd *pCmd, int pnum) { - sgbDeltaChanged = true; - sgJunk.portal[pnum].x = x; - sgJunk.portal[pnum].y = y; - sgJunk.portal[pnum].level = bLevel; - sgJunk.portal[pnum].ltype = bLType; - sgJunk.portal[pnum].setlvl = bSetLvl ? 1 : 0; -} + auto *p = (TCmdLocParam2 *)pCmd; -void delta_close_portal(int pnum) -{ - memset(&sgJunk.portal[pnum], 0xFF, sizeof(sgJunk.portal[pnum])); - sgbDeltaChanged = true; -} + if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { + auto spell = static_cast(p->wParam1); + if (currlevel != 0 || spelldata[spell].sTownSpell) { + ClrPlrPath(plr[pnum]); + plr[pnum].destAction = ACTION_SPELL; + plr[pnum].destParam1 = p->x; + plr[pnum].destParam2 = p->y; + plr[pnum].destParam3 = static_cast(p->wParam2); + plr[pnum]._pSpell = spell; + plr[pnum]._pSplType = RSPLTYPE_INVALID; + plr[pnum]._pSplFrom = 2; + } else { + PlayerMessageFormat(fmt::format(_("{:s} has cast an illegal spell."), plr[pnum]._pName).c_str()); + } + } -static void check_update_plr(int pnum) -{ - if (gbIsMultiplayer && pnum == myplr) - pfile_update(true); + return sizeof(*p); } -static void msg_errorf(const char *pszFmt, ...) +DWORD OnOperateObjectTile(TCmd *pCmd, int pnum) { - static DWORD msg_err_timer; - DWORD ticks; - char msg[256]; - va_list va; + auto *p = (TCmdLocParam1 *)pCmd; - va_start(va, pszFmt); - ticks = SDL_GetTicks(); - if (ticks - msg_err_timer >= 5000) { - msg_err_timer = ticks; - vsprintf(msg, pszFmt, va); - ErrorPlrMsg(msg); + if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { + if (object[p->wParam1]._oSolidFlag || object[p->wParam1]._oDoorFlag) + MakePlrPath(pnum, { p->x, p->y }, false); + else + MakePlrPath(pnum, { p->x, p->y }, true); + plr[pnum].destAction = ACTION_OPERATE; + plr[pnum].destParam1 = p->wParam1; } - va_end(va); -} -static DWORD On_SYNCDATA(TCmd *pCmd, int pnum) -{ - return sync_update(pnum, (const byte *)pCmd); + return sizeof(*p); } -static DWORD On_WALKXY(TCmd *pCmd, int pnum) +DWORD OnDisarm(TCmd *pCmd, int pnum) { - auto *p = (TCmdLoc *)pCmd; + auto *p = (TCmdLocParam1 *)pCmd; if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { - ClrPlrPath(plr[pnum]); - MakePlrPath(pnum, { p->x, p->y }, true); - plr[pnum].destAction = ACTION_NONE; + if (object[p->wParam1]._oSolidFlag || object[p->wParam1]._oDoorFlag) + MakePlrPath(pnum, { p->x, p->y }, false); + else + MakePlrPath(pnum, { p->x, p->y }, true); + plr[pnum].destAction = ACTION_DISARM; + plr[pnum].destParam1 = p->wParam1; } return sizeof(*p); } -static DWORD On_ADDSTR(TCmd *pCmd, int pnum) +DWORD OnOperateObjectTelekinesis(TCmd *pCmd, int pnum) { auto *p = (TCmdParam1 *)pCmd; - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else if (p->wParam1 <= 256) - ModifyPlrStr(pnum, p->wParam1); + if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { + plr[pnum].destAction = ACTION_OPERATETK; + plr[pnum].destParam1 = p->wParam1; + } return sizeof(*p); } -static DWORD On_ADDMAG(TCmd *pCmd, int pnum) +DWORD OnAttackMonster(TCmd *pCmd, int pnum) { auto *p = (TCmdParam1 *)pCmd; - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else if (p->wParam1 <= 256) - ModifyPlrMag(pnum, p->wParam1); + if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { + if (plr[pnum].position.tile.WalkingDistance(monster[p->wParam1].position.future) > 1) + MakePlrPath(pnum, monster[p->wParam1].position.future, false); + plr[pnum].destAction = ACTION_ATTACKMON; + plr[pnum].destParam1 = p->wParam1; + } return sizeof(*p); } -static DWORD On_ADDDEX(TCmd *pCmd, int pnum) +DWORD OnAttackPlayer(TCmd *pCmd, int pnum) { auto *p = (TCmdParam1 *)pCmd; - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else if (p->wParam1 <= 256) - ModifyPlrDex(pnum, p->wParam1); + if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { + MakePlrPath(pnum, plr[p->wParam1].position.future, false); + plr[pnum].destAction = ACTION_ATTACKPLR; + plr[pnum].destParam1 = p->wParam1; + } return sizeof(*p); } -static DWORD On_ADDVIT(TCmd *pCmd, int pnum) +DWORD OnRangedAttackMonster(TCmd *pCmd, int pnum) { auto *p = (TCmdParam1 *)pCmd; - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else if (p->wParam1 <= 256) - ModifyPlrVit(pnum, p->wParam1); + if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { + ClrPlrPath(plr[pnum]); + plr[pnum].destAction = ACTION_RATTACKMON; + plr[pnum].destParam1 = p->wParam1; + } return sizeof(*p); } -static DWORD On_SBSPELL(TCmd *pCmd, int pnum) +DWORD OnRangedAttackPlayer(TCmd *pCmd, int pnum) { auto *p = (TCmdParam1 *)pCmd; - if (gbBufferMsgs != 1) { - auto spell = static_cast(p->wParam1); + if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { + ClrPlrPath(plr[pnum]); + plr[pnum].destAction = ACTION_RATTACKPLR; + plr[pnum].destParam1 = p->wParam1; + } + + return sizeof(*p); +} + +DWORD OnSpellMonster(TCmd *pCmd, int pnum) +{ + auto *p = (TCmdParam3 *)pCmd; + + if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { + auto spell = static_cast(p->wParam2); if (currlevel != 0 || spelldata[spell].sTownSpell) { + ClrPlrPath(plr[pnum]); + plr[pnum].destAction = ACTION_SPELLMON; + plr[pnum].destParam1 = p->wParam1; + plr[pnum].destParam2 = p->wParam3; plr[pnum]._pSpell = spell; - plr[pnum]._pSplType = plr[pnum]._pSBkSplType; - plr[pnum]._pSplFrom = 1; - plr[pnum].destAction = ACTION_SPELL; - } else - msg_errorf(fmt::format(_("{:s} has cast an illegal spell."), plr[pnum]._pName).c_str()); + plr[pnum]._pSplType = plr[pnum]._pRSplType; + plr[pnum]._pSplFrom = 0; + } else { + PlayerMessageFormat(fmt::format(_("{:s} has cast an illegal spell."), plr[pnum]._pName).c_str()); + } } return sizeof(*p); } -static DWORD On_GOTOGETITEM(TCmd *pCmd, int pnum) +DWORD OnSpellPlayer(TCmd *pCmd, int pnum) { - auto *p = (TCmdLocParam1 *)pCmd; + auto *p = (TCmdParam3 *)pCmd; if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { - MakePlrPath(pnum, { p->x, p->y }, false); - plr[pnum].destAction = ACTION_PICKUPITEM; - plr[pnum].destParam1 = p->wParam1; + auto spell = static_cast(p->wParam2); + if (currlevel != 0 || spelldata[spell].sTownSpell) { + ClrPlrPath(plr[pnum]); + plr[pnum].destAction = ACTION_SPELLPLR; + plr[pnum].destParam1 = p->wParam1; + plr[pnum].destParam2 = p->wParam3; + plr[pnum]._pSpell = spell; + plr[pnum]._pSplType = plr[pnum]._pRSplType; + plr[pnum]._pSplFrom = 0; + } else { + PlayerMessageFormat(fmt::format(_("{:s} has cast an illegal spell."), plr[pnum]._pName).c_str()); + } } return sizeof(*p); } -static DWORD On_REQUESTGITEM(TCmd *pCmd, int pnum) +DWORD OnTargetSpellMonster(TCmd *pCmd, int pnum) { - auto *p = (TCmdGItem *)pCmd; + auto *p = (TCmdParam3 *)pCmd; - if (gbBufferMsgs != 1 && i_own_level(plr[pnum].plrlevel)) { - if (GetItemRecord(p->dwSeed, p->wCI, p->wIndx)) { - int ii = FindGetItem(p->wIndx, p->wCI, p->dwSeed); - if (ii != -1) { - NetSendCmdGItem2(false, CMD_GETITEM, myplr, p->bPnum, p); - if (p->bPnum != myplr) - SyncGetItem({ p->x, p->y }, p->wIndx, p->wCI, p->dwSeed); - else - InvGetItem(myplr, &items[ii], ii); - SetItemRecord(p->dwSeed, p->wCI, p->wIndx); - } else if (!NetSendCmdReq2(CMD_REQUESTGITEM, myplr, p->bPnum, p)) - NetSendCmdExtra(p); + if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { + auto spell = static_cast(p->wParam2); + if (currlevel != 0 || spelldata[spell].sTownSpell) { + ClrPlrPath(plr[pnum]); + plr[pnum].destAction = ACTION_SPELLMON; + plr[pnum].destParam1 = p->wParam1; + plr[pnum].destParam2 = p->wParam3; + plr[pnum]._pSpell = spell; + plr[pnum]._pSplType = RSPLTYPE_INVALID; + plr[pnum]._pSplFrom = 2; + } else { + PlayerMessageFormat(fmt::format(_("{:s} has cast an illegal spell."), plr[pnum]._pName).c_str()); } } return sizeof(*p); } -static DWORD On_GETITEM(TCmd *pCmd, int pnum) +DWORD OnTargetSpellPlayer(TCmd *pCmd, int pnum) { - auto *p = (TCmdGItem *)pCmd; + auto *p = (TCmdParam3 *)pCmd; - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else { - int ii = FindGetItem(p->wIndx, p->wCI, p->dwSeed); - if (delta_get_item(p, p->bLevel)) { - if ((currlevel == p->bLevel || p->bPnum == myplr) && p->bMaster != myplr) { - if (p->bPnum == myplr) { - if (currlevel != p->bLevel) { - ii = SyncPutItem(plr[myplr], plr[myplr].position.tile, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC); - if (ii != -1) - InvGetItem(myplr, &items[ii], ii); - } else - InvGetItem(myplr, &items[ii], ii); - } else - SyncGetItem({ p->x, p->y }, p->wIndx, p->wCI, p->dwSeed); - } - } else - NetSendCmdGItem2(true, CMD_GETITEM, p->bMaster, p->bPnum, p); + if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { + auto spell = static_cast(p->wParam2); + if (currlevel != 0 || spelldata[spell].sTownSpell) { + ClrPlrPath(plr[pnum]); + plr[pnum].destAction = ACTION_SPELLPLR; + plr[pnum].destParam1 = p->wParam1; + plr[pnum].destParam2 = p->wParam3; + plr[pnum]._pSpell = spell; + plr[pnum]._pSplType = RSPLTYPE_INVALID; + plr[pnum]._pSplFrom = 2; + } else { + PlayerMessageFormat(fmt::format(_("{:s} has cast an illegal spell."), plr[pnum]._pName).c_str()); + } } return sizeof(*p); } -static DWORD On_GOTOAGETITEM(TCmd *pCmd, int pnum) +DWORD OnKnockback(TCmd *pCmd, int pnum) { - auto *p = (TCmdLocParam1 *)pCmd; + auto *p = (TCmdParam1 *)pCmd; if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { - MakePlrPath(pnum, { p->x, p->y }, false); - plr[pnum].destAction = ACTION_PICKUPAITEM; - plr[pnum].destParam1 = p->wParam1; + M_GetKnockback(p->wParam1); + M_StartHit(p->wParam1, pnum, 0); } return sizeof(*p); } -static DWORD On_REQUESTAGITEM(TCmd *pCmd, int pnum) +DWORD OnResurrect(TCmd *pCmd, int pnum) { - auto *p = (TCmdGItem *)pCmd; + auto *p = (TCmdParam1 *)pCmd; - if (gbBufferMsgs != 1 && i_own_level(plr[pnum].plrlevel)) { - if (GetItemRecord(p->dwSeed, p->wCI, p->wIndx)) { - int ii = FindGetItem(p->wIndx, p->wCI, p->dwSeed); - if (ii != -1) { - NetSendCmdGItem2(false, CMD_AGETITEM, myplr, p->bPnum, p); - if (p->bPnum != myplr) - SyncGetItem({ p->x, p->y }, p->wIndx, p->wCI, p->dwSeed); - else - AutoGetItem(myplr, &items[p->bCursitem], p->bCursitem); - SetItemRecord(p->dwSeed, p->wCI, p->wIndx); - } else if (!NetSendCmdReq2(CMD_REQUESTAGITEM, myplr, p->bPnum, p)) - NetSendCmdExtra(p); - } + if (gbBufferMsgs == 1) { + SendPacket(pnum, p, sizeof(*p)); + } else { + DoResurrect(pnum, p->wParam1); + CheckUpdatePlayer(pnum); } return sizeof(*p); } -static DWORD On_AGETITEM(TCmd *pCmd, int pnum) +DWORD OnHealOther(TCmd *pCmd, int pnum) { - auto *p = (TCmdGItem *)pCmd; + auto *p = (TCmdParam1 *)pCmd; - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else { - FindGetItem(p->wIndx, p->wCI, p->dwSeed); - if (delta_get_item(p, p->bLevel)) { - if ((currlevel == p->bLevel || p->bPnum == myplr) && p->bMaster != myplr) { - if (p->bPnum == myplr) { - if (currlevel != p->bLevel) { - int ii = SyncPutItem(plr[myplr], plr[myplr].position.tile, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC); - if (ii != -1) - AutoGetItem(myplr, &items[ii], ii); - } else - AutoGetItem(myplr, &items[p->bCursitem], p->bCursitem); - } else - SyncGetItem({ p->x, p->y }, p->wIndx, p->wCI, p->dwSeed); - } - } else - NetSendCmdGItem2(true, CMD_AGETITEM, p->bMaster, p->bPnum, p); - } + if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) + DoHealOther(pnum, p->wParam1); return sizeof(*p); } -static DWORD On_ITEMEXTRA(TCmd *pCmd, int pnum) +DWORD OnTalkXY(TCmd *pCmd, int pnum) { - auto *p = (TCmdGItem *)pCmd; + auto *p = (TCmdLocParam1 *)pCmd; - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else { - delta_get_item(p, p->bLevel); - if (currlevel == plr[pnum].plrlevel) - SyncGetItem({ p->x, p->y }, p->wIndx, p->wCI, p->dwSeed); + if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { + MakePlrPath(pnum, { p->x, p->y }, false); + plr[pnum].destAction = ACTION_TALK; + plr[pnum].destParam1 = p->wParam1; } return sizeof(*p); } -static DWORD On_PUTITEM(TCmd *pCmd, int pnum) +DWORD OnNewLevel(TCmd *pCmd, int pnum) { - auto *p = (TCmdPItem *)pCmd; + auto *p = (TCmdParam2 *)pCmd; if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else if (currlevel == plr[pnum].plrlevel) { - int ii; - if (pnum == myplr) - ii = InvPutItem(plr[pnum], { p->x, p->y }); - else - ii = SyncPutItem(plr[pnum], { p->x, p->y }, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC); - if (ii != -1) { - PutItemRecord(p->dwSeed, p->wCI, p->wIndx); - delta_put_item(p, items[ii].position.x, items[ii].position.y, plr[pnum].plrlevel); - check_update_plr(pnum); - } - return sizeof(*p); + SendPacket(pnum, p, sizeof(*p)); + else if (pnum != myplr) + StartNewLvl(pnum, (interface_mode)p->wParam1, p->wParam2); + + return sizeof(*p); +} + +DWORD OnWarp(TCmd *pCmd, int pnum) +{ + auto *p = (TCmdParam1 *)pCmd; + + if (gbBufferMsgs == 1) { + SendPacket(pnum, p, sizeof(*p)); } else { - PutItemRecord(p->dwSeed, p->wCI, p->wIndx); - delta_put_item(p, p->x, p->y, plr[pnum].plrlevel); - check_update_plr(pnum); + StartWarpLvl(pnum, p->wParam1); } return sizeof(*p); } -static DWORD On_SYNCPUTITEM(TCmd *pCmd, int pnum) +DWORD OnMonstDeath(TCmd *pCmd, int pnum) { - auto *p = (TCmdPItem *)pCmd; + auto *p = (TCmdLocParam1 *)pCmd; if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else if (currlevel == plr[pnum].plrlevel) { - int ii = SyncPutItem(plr[pnum], { p->x, p->y }, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC); - if (ii != -1) { - PutItemRecord(p->dwSeed, p->wCI, p->wIndx); - delta_put_item(p, items[ii].position.x, items[ii].position.y, plr[pnum].plrlevel); - check_update_plr(pnum); - } - return sizeof(*p); - } else { - PutItemRecord(p->dwSeed, p->wCI, p->wIndx); - delta_put_item(p, p->x, p->y, plr[pnum].plrlevel); - check_update_plr(pnum); + SendPacket(pnum, p, sizeof(*p)); + else if (pnum != myplr) { + if (currlevel == plr[pnum].plrlevel) + M_SyncStartKill(p->wParam1, { p->x, p->y }, pnum); + delta_kill_monster(p->wParam1, { p->x, p->y }, plr[pnum].plrlevel); } return sizeof(*p); } -static DWORD On_RESPAWNITEM(TCmd *pCmd, int pnum) +DWORD OnKillGolem(TCmd *pCmd, int pnum) { - auto *p = (TCmdPItem *)pCmd; + auto *p = (TCmdLocParam1 *)pCmd; if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else { - if (currlevel == plr[pnum].plrlevel && pnum != myplr) { - SyncPutItem(plr[pnum], { p->x, p->y }, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC); - } - PutItemRecord(p->dwSeed, p->wCI, p->wIndx); - delta_put_item(p, p->x, p->y, plr[pnum].plrlevel); + SendPacket(pnum, p, sizeof(*p)); + else if (pnum != myplr) { + if (currlevel == p->wParam1) + M_SyncStartKill(pnum, { p->x, p->y }, pnum); + delta_kill_monster(pnum, { p->x, p->y }, plr[pnum].plrlevel); } return sizeof(*p); } -static DWORD On_ATTACKXY(TCmd *pCmd, int pnum) +DWORD OnAwakeGolem(TCmd *pCmd, int pnum) { - auto *p = (TCmdLoc *)pCmd; + auto *p = (TCmdGolem *)pCmd; - if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { - MakePlrPath(pnum, { p->x, p->y }, false); - plr[pnum].destAction = ACTION_ATTACK; - plr[pnum].destParam1 = p->x; - plr[pnum].destParam2 = p->y; + if (gbBufferMsgs == 1) + SendPacket(pnum, p, sizeof(*p)); + else if (currlevel != plr[pnum].plrlevel) + DeltaSyncGolem(p, pnum, p->_currlevel); + else if (pnum != myplr) { + int i; + // check if this player already has an active golem + bool addGolem = true; + for (i = 0; i < nummissiles; i++) { + int mi = missileactive[i]; + if (missile[mi]._mitype == MIS_GOLEM && missile[mi]._misource == pnum) { + addGolem = false; + // CODEFIX: break, don't need to check the rest + } + } + if (addGolem) + AddMissile(plr[pnum].position.tile, { p->_mx, p->_my }, p->_mdir, MIS_GOLEM, TARGET_MONSTERS, pnum, 0, 1); } return sizeof(*p); } -static DWORD On_SATTACKXY(TCmd *pCmd, int pnum) +DWORD OnMonstDamage(TCmd *pCmd, int pnum) { - auto *p = (TCmdLoc *)pCmd; + auto *p = (TCmdMonDamage *)pCmd; - if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { - ClrPlrPath(plr[pnum]); - plr[pnum].destAction = ACTION_ATTACK; - plr[pnum].destParam1 = p->x; - plr[pnum].destParam2 = p->y; + if (gbBufferMsgs == 1) + SendPacket(pnum, p, sizeof(*p)); // BUGFIX: change to sizeof(*p) or it still uses TCmdParam2 size for hellfire (fixed) + else if (pnum != myplr) { + if (currlevel == plr[pnum].plrlevel) { + monster[p->wMon].mWhoHit |= 1 << pnum; + if (monster[p->wMon]._mhitpoints > 0) { + monster[p->wMon]._mhitpoints -= p->dwDam; + if ((monster[p->wMon]._mhitpoints >> 6) < 1) + monster[p->wMon]._mhitpoints = 1 << 6; + delta_monster_hp(p->wMon, monster[p->wMon]._mhitpoints, plr[pnum].plrlevel); + } + } } return sizeof(*p); } -static DWORD On_RATTACKXY(TCmd *pCmd, int pnum) +DWORD OnPlayerDeath(TCmd *pCmd, int pnum) { - auto *p = (TCmdLoc *)pCmd; + auto *p = (TCmdParam1 *)pCmd; - if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { - ClrPlrPath(plr[pnum]); - plr[pnum].destAction = ACTION_RATTACK; - plr[pnum].destParam1 = p->x; - plr[pnum].destParam2 = p->y; - } + if (gbBufferMsgs == 1) + SendPacket(pnum, p, sizeof(*p)); + else if (pnum != myplr) + StartPlayerKill(pnum, p->wParam1); + else + CheckUpdatePlayer(pnum); return sizeof(*p); } -static DWORD On_SPELLXYD(TCmd *pCmd, int pnum) +DWORD OnPlayerDamage(TCmd *pCmd, int pnum) { - auto *p = (TCmdLocParam3 *)pCmd; + auto *p = (TCmdDamage *)pCmd; - if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { - auto spell = static_cast(p->wParam1); - if (currlevel != 0 || spelldata[spell].sTownSpell) { - ClrPlrPath(plr[pnum]); - plr[pnum].destAction = ACTION_SPELLWALL; - plr[pnum].destParam1 = p->x; - plr[pnum].destParam2 = p->y; - plr[pnum].destParam3 = static_cast(p->wParam2); - plr[pnum].destParam4 = p->wParam3; - plr[pnum]._pSpell = spell; - plr[pnum]._pSplType = plr[pnum]._pRSplType; - plr[pnum]._pSplFrom = 0; - } else - msg_errorf(fmt::format(_("{:s} has cast an illegal spell."), plr[pnum]._pName).c_str()); + if (p->bPlr == myplr && currlevel != 0 && gbBufferMsgs != 1) { + if (currlevel == plr[pnum].plrlevel && p->dwDam <= 192000 && plr[myplr]._pHitPoints >> 6 > 0) { + ApplyPlrDamage(myplr, 0, 0, p->dwDam, 1); + } } return sizeof(*p); } -static DWORD On_SPELLXY(TCmd *pCmd, int pnum) +DWORD OnOpenDoor(TCmd *pCmd, int pnum) { - auto *p = (TCmdLocParam2 *)pCmd; + auto *p = (TCmdParam1 *)pCmd; - if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { - auto spell = static_cast(p->wParam1); - if (currlevel != 0 || spelldata[spell].sTownSpell) { - ClrPlrPath(plr[pnum]); - plr[pnum].destAction = ACTION_SPELL; - plr[pnum].destParam1 = p->x; - plr[pnum].destParam2 = p->y; - plr[pnum].destParam3 = static_cast(p->wParam2); - plr[pnum]._pSpell = spell; - plr[pnum]._pSplType = plr[pnum]._pRSplType; - plr[pnum]._pSplFrom = 0; - } else - msg_errorf(fmt::format(_("{:s} has cast an illegal spell."), plr[pnum]._pName).c_str()); + if (gbBufferMsgs == 1) { + SendPacket(pnum, p, sizeof(*p)); + } else { + if (currlevel == plr[pnum].plrlevel) + SyncOpObject(pnum, CMD_OPENDOOR, p->wParam1); + DeltaSyncObject(p->wParam1, CMD_OPENDOOR, plr[pnum].plrlevel); } return sizeof(*p); } -static DWORD On_TSPELLXY(TCmd *pCmd, int pnum) +DWORD OnCloseDoor(TCmd *pCmd, int pnum) { - auto *p = (TCmdLocParam2 *)pCmd; + auto *p = (TCmdParam1 *)pCmd; - if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { - auto spell = static_cast(p->wParam1); - if (currlevel != 0 || spelldata[spell].sTownSpell) { - ClrPlrPath(plr[pnum]); - plr[pnum].destAction = ACTION_SPELL; - plr[pnum].destParam1 = p->x; - plr[pnum].destParam2 = p->y; - plr[pnum].destParam3 = static_cast(p->wParam2); - plr[pnum]._pSpell = spell; - plr[pnum]._pSplType = plr[pnum]._pTSplType; - plr[pnum]._pSplFrom = 2; - } else - msg_errorf(fmt::format(_("{:s} has cast an illegal spell."), plr[pnum]._pName).c_str()); + if (gbBufferMsgs == 1) { + SendPacket(pnum, p, sizeof(*p)); + } else { + if (currlevel == plr[pnum].plrlevel) + SyncOpObject(pnum, CMD_CLOSEDOOR, p->wParam1); + DeltaSyncObject(p->wParam1, CMD_CLOSEDOOR, plr[pnum].plrlevel); } return sizeof(*p); } -static DWORD On_OPOBJXY(TCmd *pCmd, int pnum) +DWORD OnOperateObject(TCmd *pCmd, int pnum) { - auto *p = (TCmdLocParam1 *)pCmd; + auto *p = (TCmdParam1 *)pCmd; - if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { - if (object[p->wParam1]._oSolidFlag || object[p->wParam1]._oDoorFlag) - MakePlrPath(pnum, { p->x, p->y }, false); - else - MakePlrPath(pnum, { p->x, p->y }, true); - plr[pnum].destAction = ACTION_OPERATE; - plr[pnum].destParam1 = p->wParam1; + if (gbBufferMsgs == 1) { + SendPacket(pnum, p, sizeof(*p)); + } else { + if (currlevel == plr[pnum].plrlevel) + SyncOpObject(pnum, CMD_OPERATEOBJ, p->wParam1); + DeltaSyncObject(p->wParam1, CMD_OPERATEOBJ, plr[pnum].plrlevel); } return sizeof(*p); } -static DWORD On_DISARMXY(TCmd *pCmd, int pnum) +DWORD OnPlayerOperateObject(TCmd *pCmd, int pnum) { - auto *p = (TCmdLocParam1 *)pCmd; + auto *p = (TCmdParam2 *)pCmd; - if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { - if (object[p->wParam1]._oSolidFlag || object[p->wParam1]._oDoorFlag) - MakePlrPath(pnum, { p->x, p->y }, false); - else - MakePlrPath(pnum, { p->x, p->y }, true); - plr[pnum].destAction = ACTION_DISARM; - plr[pnum].destParam1 = p->wParam1; + if (gbBufferMsgs == 1) { + SendPacket(pnum, p, sizeof(*p)); + } else { + if (currlevel == plr[pnum].plrlevel) + SyncOpObject(p->wParam1, CMD_PLROPOBJ, p->wParam2); + DeltaSyncObject(p->wParam2, CMD_PLROPOBJ, plr[pnum].plrlevel); } return sizeof(*p); } -static DWORD On_OPOBJT(TCmd *pCmd, int pnum) +DWORD OnBreakObject(TCmd *pCmd, int pnum) { - auto *p = (TCmdParam1 *)pCmd; + auto *p = (TCmdParam2 *)pCmd; - if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { - plr[pnum].destAction = ACTION_OPERATETK; - plr[pnum].destParam1 = p->wParam1; + if (gbBufferMsgs == 1) { + SendPacket(pnum, p, sizeof(*p)); + } else { + if (currlevel == plr[pnum].plrlevel) + SyncBreakObj(p->wParam1, p->wParam2); + DeltaSyncObject(p->wParam2, CMD_BREAKOBJ, plr[pnum].plrlevel); } return sizeof(*p); } -static DWORD On_ATTACKID(TCmd *pCmd, int pnum) +DWORD OnChangePlayerItems(TCmd *pCmd, int pnum) { - auto *p = (TCmdParam1 *)pCmd; + auto *p = (TCmdChItem *)pCmd; - if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { - if (plr[pnum].position.tile.WalkingDistance(monster[p->wParam1].position.future) > 1) - MakePlrPath(pnum, monster[p->wParam1].position.future, false); - plr[pnum].destAction = ACTION_ATTACKMON; - plr[pnum].destParam1 = p->wParam1; - } + if (gbBufferMsgs == 1) + SendPacket(pnum, p, sizeof(*p)); + else if (pnum != myplr) + CheckInvSwap(pnum, p->bLoc, p->wIndx, p->wCI, p->dwSeed, p->bId != 0, p->dwBuff); return sizeof(*p); } -static DWORD On_ATTACKPID(TCmd *pCmd, int pnum) +DWORD OnDeletePlayerItems(TCmd *pCmd, int pnum) { - auto *p = (TCmdParam1 *)pCmd; + auto *p = (TCmdDelItem *)pCmd; - if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { - MakePlrPath(pnum, plr[p->wParam1].position.future, false); - plr[pnum].destAction = ACTION_ATTACKPLR; - plr[pnum].destParam1 = p->wParam1; - } + if (gbBufferMsgs == 1) + SendPacket(pnum, p, sizeof(*p)); + else if (pnum != myplr) + inv_update_rem_item(pnum, p->bLoc); return sizeof(*p); } -static DWORD On_RATTACKID(TCmd *pCmd, int pnum) +DWORD OnPlayerLevel(TCmd *pCmd, int pnum) { auto *p = (TCmdParam1 *)pCmd; - if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { - ClrPlrPath(plr[pnum]); - plr[pnum].destAction = ACTION_RATTACKMON; - plr[pnum].destParam1 = p->wParam1; - } + if (gbBufferMsgs == 1) + SendPacket(pnum, p, sizeof(*p)); + else if (p->wParam1 <= MAXCHARLEVEL && pnum != myplr) + plr[pnum]._pLevel = p->wParam1; return sizeof(*p); } -static DWORD On_RATTACKPID(TCmd *pCmd, int pnum) +DWORD OnDropItem(TCmd *pCmd, int pnum) { - auto *p = (TCmdParam1 *)pCmd; + auto *p = (TCmdPItem *)pCmd; - if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { - ClrPlrPath(plr[pnum]); - plr[pnum].destAction = ACTION_RATTACKPLR; - plr[pnum].destParam1 = p->wParam1; - } + if (gbBufferMsgs == 1) + SendPacket(pnum, p, sizeof(*p)); + else + DeltaPutItem(p, p->x, p->y, plr[pnum].plrlevel); return sizeof(*p); } -static DWORD On_SPELLID(TCmd *pCmd, int pnum) +DWORD OnSendPlayerInfo(TCmd *pCmd, int pnum) { - auto *p = (TCmdParam3 *)pCmd; + auto *p = (TCmdPlrInfoHdr *)pCmd; - if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { - auto spell = static_cast(p->wParam2); - if (currlevel != 0 || spelldata[spell].sTownSpell) { - ClrPlrPath(plr[pnum]); - plr[pnum].destAction = ACTION_SPELLMON; - plr[pnum].destParam1 = p->wParam1; - plr[pnum].destParam2 = p->wParam3; - plr[pnum]._pSpell = spell; - plr[pnum]._pSplType = plr[pnum]._pRSplType; - plr[pnum]._pSplFrom = 0; - } else - msg_errorf(fmt::format(_("{:s} has cast an illegal spell."), plr[pnum]._pName).c_str()); - } + if (gbBufferMsgs == 1) + SendPacket(pnum, p, p->wBytes + sizeof(*p)); + else + recv_plrinfo(pnum, p, p->bCmd == CMD_ACK_PLRINFO); - return sizeof(*p); + return p->wBytes + sizeof(*p); } -static DWORD On_SPELLPID(TCmd *pCmd, int pnum) +DWORD OnPlayerJoinLevel(TCmd *pCmd, int pnum) { - auto *p = (TCmdParam3 *)pCmd; + auto *p = (TCmdLocParam1 *)pCmd; - if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { - auto spell = static_cast(p->wParam2); - if (currlevel != 0 || spelldata[spell].sTownSpell) { - ClrPlrPath(plr[pnum]); - plr[pnum].destAction = ACTION_SPELLPLR; - plr[pnum].destParam1 = p->wParam1; - plr[pnum].destParam2 = p->wParam3; - plr[pnum]._pSpell = spell; - plr[pnum]._pSplType = plr[pnum]._pRSplType; - plr[pnum]._pSplFrom = 0; - } else - msg_errorf(fmt::format(_("{:s} has cast an illegal spell."), plr[pnum]._pName).c_str()); + if (gbBufferMsgs == 1) { + SendPacket(pnum, p, sizeof(*p)); + return sizeof(*p); } - return sizeof(*p); -} + auto &player = plr[pnum]; -static DWORD On_TSPELLID(TCmd *pCmd, int pnum) -{ - auto *p = (TCmdParam3 *)pCmd; + player._pLvlChanging = false; + if (player._pName[0] != 0 && !player.plractive) { + ResetPlayerGFX(player); + player.plractive = true; + gbActivePlayers++; + EventPlrMsg(fmt::format(_("Player '{:s}' (level {:d}) just joined the game"), player._pName, player._pLevel).c_str()); + } - if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { - auto spell = static_cast(p->wParam2); - if (currlevel != 0 || spelldata[spell].sTownSpell) { - ClrPlrPath(plr[pnum]); - plr[pnum].destAction = ACTION_SPELLMON; - plr[pnum].destParam1 = p->wParam1; - plr[pnum].destParam2 = p->wParam3; - plr[pnum]._pSpell = spell; - plr[pnum]._pSplType = plr[pnum]._pTSplType; - plr[pnum]._pSplFrom = 2; - } else - msg_errorf(fmt::format(_("{:s} has cast an illegal spell."), plr[pnum]._pName).c_str()); + if (player.plractive && myplr != pnum) { + player.position.tile = { p->x, p->y }; + player.plrlevel = p->wParam1; + ResetPlayerGFX(player); + if (currlevel == player.plrlevel) { + SyncInitPlr(pnum); + if ((player._pHitPoints >> 6) > 0) { + StartStand(pnum, DIR_S); + } else { + player._pgfxnum = 0; + player._pmode = PM_DEATH; + NewPlrAnim(player, player_graphic::Death, DIR_S, player._pDFrames, 1); + player.AnimInfo.CurrentFrame = player.AnimInfo.NumberOfFrames - 1; + dFlags[player.position.tile.x][player.position.tile.y] |= BFLAG_DEAD_PLAYER; + } + + player._pvid = AddVision(player.position.tile, player._pLightRad, pnum == myplr); + player._plid = NO_LIGHT; + } } return sizeof(*p); } -static DWORD On_TSPELLPID(TCmd *pCmd, int pnum) +DWORD OnActivatePortal(TCmd *pCmd, int pnum) { - auto *p = (TCmdParam3 *)pCmd; + auto *p = (TCmdLocParam3 *)pCmd; - if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { - auto spell = static_cast(p->wParam2); - if (currlevel != 0 || spelldata[spell].sTownSpell) { - ClrPlrPath(plr[pnum]); - plr[pnum].destAction = ACTION_SPELLPLR; - plr[pnum].destParam1 = p->wParam1; - plr[pnum].destParam2 = p->wParam3; - plr[pnum]._pSpell = spell; - plr[pnum]._pSplType = plr[pnum]._pTSplType; - plr[pnum]._pSplFrom = 2; - } else - msg_errorf(fmt::format(_("{:s} has cast an illegal spell."), plr[pnum]._pName).c_str()); + if (gbBufferMsgs == 1) { + SendPacket(pnum, p, sizeof(*p)); + } else { + ActivatePortal(pnum, p->x, p->y, p->wParam1, static_cast(p->wParam2), p->wParam3 != 0); + if (pnum != myplr) { + if (currlevel == 0) + AddInTownPortal(pnum); + else if (currlevel == plr[pnum].plrlevel) { + bool addPortal = true; + for (int i = 0; i < nummissiles; i++) { + int mi = missileactive[i]; + if (missile[mi]._mitype == MIS_TOWN && missile[mi]._misource == pnum) { + addPortal = false; + // CODEFIX: break + } + } + if (addPortal) + AddWarpMissile(pnum, p->x, p->y); + } else { + RemovePortalMissile(pnum); + } + } + DeltaOpenPortal(pnum, p->x, p->y, p->wParam1, static_cast(p->wParam2), p->wParam3 != 0); } return sizeof(*p); } -static DWORD On_KNOCKBACK(TCmd *pCmd, int pnum) +DWORD OnDeactivatePortal(TCmd *pCmd, int pnum) { - auto *p = (TCmdParam1 *)pCmd; - - if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { - M_GetKnockback(p->wParam1); - M_StartHit(p->wParam1, pnum, 0); + if (gbBufferMsgs == 1) { + SendPacket(pnum, pCmd, sizeof(*pCmd)); + } else { + if (PortalOnLevel(pnum)) + RemovePortalMissile(pnum); + DeactivatePortal(pnum); + delta_close_portal(pnum); } - return sizeof(*p); + return sizeof(*pCmd); } -static DWORD On_RESURRECT(TCmd *pCmd, int pnum) +DWORD OnRestartTown(TCmd *pCmd, int pnum) { - auto *p = (TCmdParam1 *)pCmd; - - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else { - DoResurrect(pnum, p->wParam1); - check_update_plr(pnum); + if (gbBufferMsgs == 1) { + SendPacket(pnum, pCmd, sizeof(*pCmd)); + } else { + if (pnum == myplr) { + deathflag = false; + gamemenu_off(); + } + RestartTownLvl(pnum); } - return sizeof(*p); + return sizeof(*pCmd); } -static DWORD On_HEALOTHER(TCmd *pCmd, int pnum) +DWORD OnSetStrength(TCmd *pCmd, int pnum) { auto *p = (TCmdParam1 *)pCmd; - if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) - DoHealOther(pnum, p->wParam1); + if (gbBufferMsgs == 1) + SendPacket(pnum, p, sizeof(*p)); + else if (p->wParam1 <= 750 && pnum != myplr) + SetPlrStr(pnum, p->wParam1); return sizeof(*p); } -static DWORD On_TALKXY(TCmd *pCmd, int pnum) +DWORD OnSetDexterity(TCmd *pCmd, int pnum) { - auto *p = (TCmdLocParam1 *)pCmd; + auto *p = (TCmdParam1 *)pCmd; - if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) { - MakePlrPath(pnum, { p->x, p->y }, false); - plr[pnum].destAction = ACTION_TALK; - plr[pnum].destParam1 = p->wParam1; - } + if (gbBufferMsgs == 1) + SendPacket(pnum, p, sizeof(*p)); + else if (p->wParam1 <= 750 && pnum != myplr) + SetPlrDex(pnum, p->wParam1); return sizeof(*p); } -static DWORD On_NEWLVL(TCmd *pCmd, int pnum) +DWORD OnSetMagic(TCmd *pCmd, int pnum) { - auto *p = (TCmdParam2 *)pCmd; + auto *p = (TCmdParam1 *)pCmd; if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else if (pnum != myplr) - StartNewLvl(pnum, (interface_mode)p->wParam1, p->wParam2); + SendPacket(pnum, p, sizeof(*p)); + else if (p->wParam1 <= 750 && pnum != myplr) + SetPlrMag(pnum, p->wParam1); return sizeof(*p); } -static DWORD On_WARP(TCmd *pCmd, int pnum) +DWORD OnSetVitality(TCmd *pCmd, int pnum) { auto *p = (TCmdParam1 *)pCmd; if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else { - StartWarpLvl(pnum, p->wParam1); - } + SendPacket(pnum, p, sizeof(*p)); + else if (p->wParam1 <= 750 && pnum != myplr) + SetPlrVit(pnum, p->wParam1); return sizeof(*p); } -static DWORD On_MONSTDEATH(TCmd *pCmd, int pnum) +DWORD OnString(TCmd *pCmd, int pnum) { - auto *p = (TCmdLocParam1 *)pCmd; + auto *p = (TCmdString *)pCmd; - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else if (pnum != myplr) { - if (currlevel == plr[pnum].plrlevel) - M_SyncStartKill(p->wParam1, { p->x, p->y }, pnum); - delta_kill_monster(p->wParam1, { p->x, p->y }, plr[pnum].plrlevel); - } + int len = strlen(p->str); + if (gbBufferMsgs == 0) + SendPlrMsg(pnum, p->str); - return sizeof(*p); + return len + 2; // length of string + nul terminator + sizeof(p->bCmd) } -static DWORD On_KILLGOLEM(TCmd *pCmd, int pnum) +DWORD OnSyncQuest(TCmd *pCmd, int pnum) { - auto *p = (TCmdLocParam1 *)pCmd; + auto *p = (TCmdQuest *)pCmd; - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else if (pnum != myplr) { - if (currlevel == p->wParam1) - M_SyncStartKill(pnum, { p->x, p->y }, pnum); - delta_kill_monster(pnum, { p->x, p->y }, plr[pnum].plrlevel); + if (gbBufferMsgs == 1) { + SendPacket(pnum, p, sizeof(*p)); + } else { + if (pnum != myplr) + SetMultiQuest(p->q, p->qstate, p->qlog != 0, p->qvar1); + sgbDeltaChanged = true; } return sizeof(*p); } -static DWORD On_AWAKEGOLEM(TCmd *pCmd, int pnum) +DWORD OnEndShield(TCmd *pCmd, int pnum) { - auto *p = (TCmdGolem *)pCmd; - - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else if (currlevel != plr[pnum].plrlevel) - delta_sync_golem(p, pnum, p->_currlevel); - else if (pnum != myplr) { - int i; - // check if this player already has an active golem - bool addGolem = true; - for (i = 0; i < nummissiles; i++) { + if (gbBufferMsgs != 1 && pnum != myplr && currlevel == plr[pnum].plrlevel) { + for (int i = 0; i < nummissiles; i++) { int mi = missileactive[i]; - if (missile[mi]._mitype == MIS_GOLEM && missile[mi]._misource == pnum) { - addGolem = false; - // CODEFIX: break, don't need to check the rest + if (missile[mi]._mitype == MIS_MANASHIELD && missile[mi]._misource == pnum) { + ClearMissileSpot(mi); + DeleteMissile(mi, i); } } - if (addGolem) - AddMissile(plr[pnum].position.tile, { p->_mx, p->_my }, p->_mdir, MIS_GOLEM, TARGET_MONSTERS, pnum, 0, 1); } - return sizeof(*p); + return sizeof(*pCmd); } -static DWORD On_MONSTDAMAGE(TCmd *pCmd, int pnum) +DWORD OnCheatExperience(TCmd *pCmd, int pnum) // NOLINT(misc-unused-parameters) { - auto *p = (TCmdMonDamage *)pCmd; - +#ifdef _DEBUG if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); // BUGFIX: change to sizeof(*p) or it still uses TCmdParam2 size for hellfire (fixed) - else if (pnum != myplr) { - if (currlevel == plr[pnum].plrlevel) { - monster[p->wMon].mWhoHit |= 1 << pnum; - if (monster[p->wMon]._mhitpoints > 0) { - monster[p->wMon]._mhitpoints -= p->dwDam; - if ((monster[p->wMon]._mhitpoints >> 6) < 1) - monster[p->wMon]._mhitpoints = 1 << 6; - delta_monster_hp(p->wMon, monster[p->wMon]._mhitpoints, plr[pnum].plrlevel); - } + SendPacket(pnum, pCmd, sizeof(*pCmd)); + else if (plr[pnum]._pLevel < MAXCHARLEVEL - 1) { + plr[pnum]._pExperience = plr[pnum]._pNextExper; + if (sgOptions.Gameplay.bExperienceBar) { + force_redraw = 255; } + NextPlrLevel(pnum); } - - return sizeof(*p); +#endif + return sizeof(*pCmd); } -static DWORD On_PLRDEAD(TCmd *pCmd, int pnum) +DWORD OnCheatSpellLevel(TCmd *pCmd, int pnum) // NOLINT(misc-unused-parameters) { - auto *p = (TCmdParam1 *)pCmd; - +#ifdef _DEBUG if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else if (pnum != myplr) - StartPlayerKill(pnum, p->wParam1); + SendPacket(pnum, pCmd, sizeof(*pCmd)); else - check_update_plr(pnum); + plr[pnum]._pSplLvl[plr[pnum]._pRSpell]++; +#endif + return sizeof(*pCmd); +} - return sizeof(*p); +DWORD OnDebug(TCmd *pCmd) +{ + return sizeof(*pCmd); } -static DWORD On_PLRDAMAGE(TCmd *pCmd, int pnum) +DWORD OnNova(TCmd *pCmd, int pnum) { - auto *p = (TCmdDamage *)pCmd; + auto *p = (TCmdLoc *)pCmd; - if (p->bPlr == myplr && currlevel != 0 && gbBufferMsgs != 1) { - if (currlevel == plr[pnum].plrlevel && p->dwDam <= 192000 && plr[myplr]._pHitPoints >> 6 > 0) { - ApplyPlrDamage(myplr, 0, 0, p->dwDam, 1); - } + if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel && pnum != myplr) { + ClrPlrPath(plr[pnum]); + plr[pnum]._pSpell = SPL_NOVA; + plr[pnum]._pSplType = RSPLTYPE_INVALID; + plr[pnum]._pSplFrom = 3; + plr[pnum].destAction = ACTION_SPELL; + plr[pnum].destParam1 = p->x; + plr[pnum].destParam2 = p->y; } return sizeof(*p); } -static DWORD On_OPENDOOR(TCmd *pCmd, int pnum) +DWORD OnSetShield(TCmd *pCmd, int pnum) { - auto *p = (TCmdParam1 *)pCmd; + if (gbBufferMsgs != 1) + plr[pnum].pManaShield = true; - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else { - if (currlevel == plr[pnum].plrlevel) - SyncOpObject(pnum, CMD_OPENDOOR, p->wParam1); - delta_sync_object(p->wParam1, CMD_OPENDOOR, plr[pnum].plrlevel); + return sizeof(*pCmd); +} + +DWORD OnRemoveShield(TCmd *pCmd, int pnum) +{ + if (gbBufferMsgs != 1) + plr[pnum].pManaShield = false; + + return sizeof(*pCmd); +} + +DWORD OnReflect(TCmd *pCmd, int pnum) +{ + if (gbBufferMsgs != 1 && pnum != myplr && currlevel == plr[pnum].plrlevel) { + for (int i = 0; i < nummissiles; i++) { + int mx = missileactive[i]; + if (missile[mx]._mitype == MIS_REFLECT && missile[mx]._misource == pnum) { + ClearMissileSpot(mx); + DeleteMissile(mx, i); + } + } + } + + return sizeof(*pCmd); +} + +DWORD OnNakrul(TCmd *pCmd) +{ + if (gbBufferMsgs != 1) { + OperateNakrulLever(); + IsUberRoomOpened = true; + quests[Q_NAKRUL]._qactive = QUEST_DONE; + monster_some_crypt(); } + return sizeof(*pCmd); +} +DWORD OnOpenHive(TCmd *pCmd, int pnum) +{ + auto *p = (TCmdLocParam2 *)pCmd; + if (gbBufferMsgs != 1) { + AddMissile({ p->x, p->y }, { p->wParam1, p->wParam2 }, 0, MIS_HIVEEXP2, TARGET_MONSTERS, pnum, 0, 0); + TownOpenHive(); + } return sizeof(*p); } -static DWORD On_CLOSEDOOR(TCmd *pCmd, int pnum) +DWORD OnOpenCrypt(TCmd *pCmd) { - auto *p = (TCmdParam1 *)pCmd; + if (gbBufferMsgs != 1) { + TownOpenGrave(); + InitTownTriggers(); + if (currlevel == 0) + PlaySFX(IS_SARC); + } + return sizeof(*pCmd); +} - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else { - if (currlevel == plr[pnum].plrlevel) - SyncOpObject(pnum, CMD_CLOSEDOOR, p->wParam1); - delta_sync_object(p->wParam1, CMD_CLOSEDOOR, plr[pnum].plrlevel); +} // namespace + +void msg_send_drop_pkt(int pnum, int reason) +{ + TFakeDropPlr cmd; + + cmd.dwReason = reason; + cmd.bCmd = FAKE_CMD_DROPID; + cmd.bPlr = pnum; + SendPacket(pnum, &cmd, sizeof(cmd)); +} + +bool msg_wait_resync() +{ + bool success; + + GetNextPacket(); + sgbDeltaChunks = 0; + sgnCurrMegaPlayer = -1; + sgbRecvCmd = CMD_DLEVEL_END; + gbBufferMsgs = 1; + sgdwOwnerWait = SDL_GetTicks(); + success = UiProgressDialog(_("Waiting for game data..."), WaitForTurns); + gbBufferMsgs = 0; + if (!success) { + FreePackets(); + return false; } - return sizeof(*p); + if (gbGameDestroyed) { + DrawDlg("%s", _("The game ended")); + FreePackets(); + return false; + } + + if (sgbDeltaChunks != MAX_CHUNKS) { + DrawDlg("%s", _("Unable to get level data")); + FreePackets(); + return false; + } + + return true; } -static DWORD On_OPERATEOBJ(TCmd *pCmd, int pnum) +void run_delta_info() { - auto *p = (TCmdParam1 *)pCmd; + if (!gbIsMultiplayer) + return; - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else { - if (currlevel == plr[pnum].plrlevel) - SyncOpObject(pnum, CMD_OPERATEOBJ, p->wParam1); - delta_sync_object(p->wParam1, CMD_OPERATEOBJ, plr[pnum].plrlevel); + gbBufferMsgs = 2; + PrePacket(); + gbBufferMsgs = 0; + FreePackets(); +} + +void DeltaExportData(int pnum) +{ + if (sgbDeltaChanged) { + int size; + std::unique_ptr dst { new byte[sizeof(DLevel) + 1] }; + byte *dstEnd; + for (int i = 0; i < NUMLEVELS; i++) { + dstEnd = &dst[1]; + dstEnd = DeltaExportItem(dstEnd, sgLevels[i].item); + dstEnd = DeltaExportObject(dstEnd, sgLevels[i].object); + dstEnd = DeltaExportMonster(dstEnd, sgLevels[i].monster); + size = CompressData(dst.get(), dstEnd); + dthread_send_delta(pnum, static_cast<_cmd_id>(i + CMD_DLEVEL_0), dst.get(), size); + } + dstEnd = &dst[1]; + dstEnd = DeltaExportJunk(dstEnd); + size = CompressData(dst.get(), dstEnd); + dthread_send_delta(pnum, CMD_DLEVEL_JUNK, dst.get(), size); } + byte src { 0 }; + dthread_send_delta(pnum, CMD_DLEVEL_END, &src, 1); +} - return sizeof(*p); +void delta_init() +{ + sgbDeltaChanged = false; + memset(&sgJunk, 0xFF, sizeof(sgJunk)); + memset(sgLevels, 0xFF, sizeof(sgLevels)); + memset(sgLocals, 0, sizeof(sgLocals)); + deltaload = false; } -static DWORD On_PLROPOBJ(TCmd *pCmd, int pnum) +void delta_kill_monster(int mi, Point position, BYTE bLevel) { - auto *p = (TCmdParam2 *)pCmd; + if (!gbIsMultiplayer) + return; - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else { - if (currlevel == plr[pnum].plrlevel) - SyncOpObject(p->wParam1, CMD_PLROPOBJ, p->wParam2); - delta_sync_object(p->wParam2, CMD_PLROPOBJ, plr[pnum].plrlevel); + sgbDeltaChanged = true; + DMonsterStr *pD = &sgLevels[bLevel].monster[mi]; + pD->_mx = position.x; + pD->_my = position.y; + pD->_mdir = monster[mi]._mdir; + pD->_mhitpoints = 0; +} + +void delta_monster_hp(int mi, int hp, BYTE bLevel) +{ + if (!gbIsMultiplayer) + return; + + sgbDeltaChanged = true; + DMonsterStr *pD = &sgLevels[bLevel].monster[mi]; + if (pD->_mhitpoints > hp) + pD->_mhitpoints = hp; +} + +void delta_sync_monster(const TSyncMonster *pSync, BYTE bLevel) +{ + if (!gbIsMultiplayer) + return; + + assert(pSync != nullptr); + assert(bLevel < NUMLEVELS); + sgbDeltaChanged = true; + + DMonsterStr *pD = &sgLevels[bLevel].monster[pSync->_mndx]; + if (pD->_mhitpoints == 0) + return; + + pD->_mx = pSync->_mx; + pD->_my = pSync->_my; + pD->_mactive = UINT8_MAX; + pD->_menemy = pSync->_menemy; +} + +bool delta_portal_inited(int i) +{ + return sgJunk.portal[i].x == 0xFF; +} + +bool delta_quest_inited(int i) +{ + return sgJunk.quests[i].qstate != QUEST_INVALID; +} + +void DeltaAddItem(int ii) +{ + int i; + + if (!gbIsMultiplayer) + return; + + TCmdPItem *pD = sgLevels[currlevel].item; + for (i = 0; i < MAXITEMS; i++, pD++) { + if (pD->bCmd != 0xFF + && pD->wIndx == items[ii].IDidx + && pD->wCI == items[ii]._iCreateInfo + && pD->dwSeed == items[ii]._iSeed + && (pD->bCmd == CMD_WALKXY || pD->bCmd == CMD_STAND)) { + return; + } } - return sizeof(*p); + pD = sgLevels[currlevel].item; + for (i = 0; i < MAXITEMS; i++, pD++) { + if (pD->bCmd == 0xFF) { + sgbDeltaChanged = true; + pD->bCmd = CMD_STAND; + pD->x = items[ii].position.x; + pD->y = items[ii].position.y; + pD->wIndx = items[ii].IDidx; + pD->wCI = items[ii]._iCreateInfo; + pD->dwSeed = items[ii]._iSeed; + pD->bId = items[ii]._iIdentified ? 1 : 0; + pD->bDur = items[ii]._iDurability; + pD->bMDur = items[ii]._iMaxDur; + pD->bCh = items[ii]._iCharges; + pD->bMCh = items[ii]._iMaxCharges; + pD->wValue = items[ii]._ivalue; + pD->wToHit = items[ii]._iPLToHit; + pD->wMaxDam = items[ii]._iMaxDam; + pD->bMinStr = items[ii]._iMinStr; + pD->bMinMag = items[ii]._iMinMag; + pD->bMinDex = items[ii]._iMinDex; + pD->bAC = items[ii]._iAC; + pD->dwBuff = items[ii].dwBuff; + return; + } + } } -static DWORD On_BREAKOBJ(TCmd *pCmd, int pnum) +void DeltaSaveLevel() { - auto *p = (TCmdParam2 *)pCmd; + if (!gbIsMultiplayer) + return; - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else { - if (currlevel == plr[pnum].plrlevel) - SyncBreakObj(p->wParam1, p->wParam2); - delta_sync_object(p->wParam2, CMD_BREAKOBJ, plr[pnum].plrlevel); + for (int i = 0; i < MAX_PLRS; i++) { + if (i != myplr) + ResetPlayerGFX(plr[i]); + } + plr[myplr]._pLvlVisited[currlevel] = true; + DeltaLeaveSync(currlevel); +} + +void DeltaLoadLevel() +{ + if (!gbIsMultiplayer) + return; + + deltaload = true; + if (currlevel != 0) { + for (int i = 0; i < nummonsters; i++) { + if (sgLevels[currlevel].monster[i]._mx != 0xFF) { + M_ClearSquares(i); + int x = sgLevels[currlevel].monster[i]._mx; + int y = sgLevels[currlevel].monster[i]._my; + monster[i].position.tile = { x, y }; + monster[i].position.old = { x, y }; + monster[i].position.future = { x, y }; + if (sgLevels[currlevel].monster[i]._mhitpoints != -1) + monster[i]._mhitpoints = sgLevels[currlevel].monster[i]._mhitpoints; + if (sgLevels[currlevel].monster[i]._mhitpoints == 0) { + M_ClearSquares(i); + if (monster[i]._mAi != AI_DIABLO) { + if (monster[i]._uniqtype == 0) { + assert(monster[i].MType != nullptr); + AddDead(monster[i].position.tile, monster[i].MType->mdeadval, monster[i]._mdir); + } else { + AddDead(monster[i].position.tile, monster[i]._udeadval, monster[i]._mdir); + } + } + monster[i]._mDelFlag = true; + M_UpdateLeader(i); + } else { + decode_enemy(i, sgLevels[currlevel].monster[i]._menemy); + if (monster[i].position.tile != Point { 0, 0 } && monster[i].position.tile != Point { 1, 0 }) + dMonster[monster[i].position.tile.x][monster[i].position.tile.y] = i + 1; + if (i < MAX_PLRS) { + MAI_Golum(i); + monster[i]._mFlags |= (MFLAG_TARGETS_MONSTER | MFLAG_GOLEM); + } else { + M_StartStand(i, monster[i]._mdir); + } + monster[i]._msquelch = sgLevels[currlevel].monster[i]._mactive; + } + } + } + memcpy(AutomapView, &sgLocals[currlevel], sizeof(AutomapView)); + } + + for (int i = 0; i < MAXITEMS; i++) { + if (sgLevels[currlevel].item[i].bCmd != 0xFF) { + if (sgLevels[currlevel].item[i].bCmd == CMD_WALKXY) { + int ii = FindGetItem( + sgLevels[currlevel].item[i].wIndx, + sgLevels[currlevel].item[i].wCI, + sgLevels[currlevel].item[i].dwSeed); + if (ii != -1) { + if (dItem[items[ii].position.x][items[ii].position.y] == ii + 1) + dItem[items[ii].position.x][items[ii].position.y] = 0; + DeleteItem(ii, i); + } + } + if (sgLevels[currlevel].item[i].bCmd == CMD_ACK_PLRINFO) { + int ii = AllocateItem(); + + if (sgLevels[currlevel].item[i].wIndx == IDI_EAR) { + RecreateEar( + ii, + sgLevels[currlevel].item[i].wCI, + sgLevels[currlevel].item[i].dwSeed, + sgLevels[currlevel].item[i].bId, + sgLevels[currlevel].item[i].bDur, + sgLevels[currlevel].item[i].bMDur, + sgLevels[currlevel].item[i].bCh, + sgLevels[currlevel].item[i].bMCh, + sgLevels[currlevel].item[i].wValue, + sgLevels[currlevel].item[i].dwBuff); + } else { + RecreateItem( + ii, + sgLevels[currlevel].item[i].wIndx, + sgLevels[currlevel].item[i].wCI, + sgLevels[currlevel].item[i].dwSeed, + sgLevels[currlevel].item[i].wValue, + (sgLevels[currlevel].item[i].dwBuff & CF_HELLFIRE) != 0); + if (sgLevels[currlevel].item[i].bId != 0) + items[ii]._iIdentified = true; + items[ii]._iDurability = sgLevels[currlevel].item[i].bDur; + items[ii]._iMaxDur = sgLevels[currlevel].item[i].bMDur; + items[ii]._iCharges = sgLevels[currlevel].item[i].bCh; + items[ii]._iMaxCharges = sgLevels[currlevel].item[i].bMCh; + items[ii]._iPLToHit = sgLevels[currlevel].item[i].wToHit; + items[ii]._iMaxDam = sgLevels[currlevel].item[i].wMaxDam; + items[ii]._iMinStr = sgLevels[currlevel].item[i].bMinStr; + items[ii]._iMinMag = sgLevels[currlevel].item[i].bMinMag; + items[ii]._iMinDex = sgLevels[currlevel].item[i].bMinDex; + items[ii]._iAC = sgLevels[currlevel].item[i].bAC; + items[ii].dwBuff = sgLevels[currlevel].item[i].dwBuff; + } + int x = sgLevels[currlevel].item[i].x; + int y = sgLevels[currlevel].item[i].y; + if (!CanPut({ x, y })) { + bool done = false; + for (int k = 1; k < 50 && !done; k++) { + for (int j = -k; j <= k && !done; j++) { + int yy = y + j; + for (int l = -k; l <= k && !done; l++) { + int xx = x + l; + if (CanPut({ xx, yy })) { + done = true; + x = xx; + y = yy; + } + } + } + } + } + items[ii].position = { x, y }; + dItem[items[ii].position.x][items[ii].position.y] = ii + 1; + RespawnItem(&items[ii], false); + } + } } - return sizeof(*p); -} - -static DWORD On_CHANGEPLRITEMS(TCmd *pCmd, int pnum) -{ - auto *p = (TCmdChItem *)pCmd; - - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else if (pnum != myplr) - CheckInvSwap(pnum, p->bLoc, p->wIndx, p->wCI, p->dwSeed, p->bId != 0, p->dwBuff); + if (currlevel != 0) { + for (int i = 0; i < MAXOBJECTS; i++) { + switch (sgLevels[currlevel].object[i].bCmd) { + case CMD_OPENDOOR: + case CMD_CLOSEDOOR: + case CMD_OPERATEOBJ: + case CMD_PLROPOBJ: + SyncOpObject(-1, sgLevels[currlevel].object[i].bCmd, i); + break; + case CMD_BREAKOBJ: + SyncBreakObj(-1, i); + break; + default: + break; + } + } - return sizeof(*p); + for (int i = 0; i < nobjects; i++) { + int ot = object[objectactive[i]]._otype; + if (ot == OBJ_TRAPL || ot == OBJ_TRAPR) + Obj_Trap(objectactive[i]); + } + } + deltaload = false; } -static DWORD On_DELPLRITEMS(TCmd *pCmd, int pnum) +void NetSendCmd(bool bHiPri, _cmd_id bCmd) { - auto *p = (TCmdDelItem *)pCmd; - - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else if (pnum != myplr) - inv_update_rem_item(pnum, p->bLoc); + TCmd cmd; - return sizeof(*p); + cmd.bCmd = bCmd; + if (bHiPri) + NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); + else + NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); } -static DWORD On_PLRLEVEL(TCmd *pCmd, int pnum) +void NetSendCmdGolem(BYTE mx, BYTE my, Direction dir, BYTE menemy, int hp, BYTE cl) { - auto *p = (TCmdParam1 *)pCmd; - - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else if (p->wParam1 <= MAXCHARLEVEL && pnum != myplr) - plr[pnum]._pLevel = p->wParam1; + TCmdGolem cmd; - return sizeof(*p); + cmd.bCmd = CMD_AWAKEGOLEM; + cmd._mx = mx; + cmd._my = my; + cmd._mdir = dir; + cmd._menemy = menemy; + cmd._mhitpoints = hp; + cmd._currlevel = cl; + NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); } -static DWORD On_DROPITEM(TCmd *pCmd, int pnum) +void NetSendCmdLoc(int playerId, bool bHiPri, _cmd_id bCmd, Point position) { - auto *p = (TCmdPItem *)pCmd; + TCmdLoc cmd; - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); + cmd.bCmd = bCmd; + cmd.x = position.x; + cmd.y = position.y; + if (bHiPri) + NetSendHiPri(playerId, (byte *)&cmd, sizeof(cmd)); else - delta_put_item(p, p->x, p->y, plr[pnum].plrlevel); - - return sizeof(*p); + NetSendLoPri(playerId, (byte *)&cmd, sizeof(cmd)); } -static DWORD On_SEND_PLRINFO(TCmd *pCmd, int pnum) +void NetSendCmdLocParam1(bool bHiPri, _cmd_id bCmd, Point position, uint16_t wParam1) { - auto *p = (TCmdPlrInfoHdr *)pCmd; + TCmdLocParam1 cmd; - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, p->wBytes + sizeof(*p)); + cmd.bCmd = bCmd; + cmd.x = position.x; + cmd.y = position.y; + cmd.wParam1 = wParam1; + if (bHiPri) + NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); else - recv_plrinfo(pnum, p, p->bCmd == CMD_ACK_PLRINFO); - - return p->wBytes + sizeof(*p); -} - -static DWORD On_ACK_PLRINFO(TCmd *pCmd, int pnum) -{ - return On_SEND_PLRINFO(pCmd, pnum); -} - -static DWORD On_PLAYER_JOINLEVEL(TCmd *pCmd, int pnum) -{ - auto *p = (TCmdLocParam1 *)pCmd; - - if (gbBufferMsgs == 1) { - msg_send_packet(pnum, p, sizeof(*p)); - return sizeof(*p); - } - - auto &player = plr[pnum]; - - player._pLvlChanging = false; - if (player._pName[0] != 0 && !player.plractive) { - ResetPlayerGFX(player); - player.plractive = true; - gbActivePlayers++; - EventPlrMsg(fmt::format(_("Player '{:s}' (level {:d}) just joined the game"), player._pName, player._pLevel).c_str()); - } - - if (player.plractive && myplr != pnum) { - player.position.tile = { p->x, p->y }; - player.plrlevel = p->wParam1; - ResetPlayerGFX(player); - if (currlevel == player.plrlevel) { - SyncInitPlr(pnum); - if ((player._pHitPoints >> 6) > 0) - StartStand(pnum, DIR_S); - else { - player._pgfxnum = 0; - player._pmode = PM_DEATH; - NewPlrAnim(player, player_graphic::Death, DIR_S, player._pDFrames, 1); - player.AnimInfo.CurrentFrame = player.AnimInfo.NumberOfFrames - 1; - dFlags[player.position.tile.x][player.position.tile.y] |= BFLAG_DEAD_PLAYER; - } - - player._pvid = AddVision(player.position.tile, player._pLightRad, pnum == myplr); - player._plid = NO_LIGHT; - } - } - - return sizeof(*p); -} - -static DWORD On_ACTIVATEPORTAL(TCmd *pCmd, int pnum) -{ - auto *p = (TCmdLocParam3 *)pCmd; - - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else { - ActivatePortal(pnum, p->x, p->y, p->wParam1, static_cast(p->wParam2), p->wParam3 != 0); - if (pnum != myplr) { - if (currlevel == 0) - AddInTownPortal(pnum); - else if (currlevel == plr[pnum].plrlevel) { - bool addPortal = true; - for (int i = 0; i < nummissiles; i++) { - int mi = missileactive[i]; - if (missile[mi]._mitype == MIS_TOWN && missile[mi]._misource == pnum) { - addPortal = false; - // CODEFIX: break - } - } - if (addPortal) - AddWarpMissile(pnum, p->x, p->y); - } else - RemovePortalMissile(pnum); - } - delta_open_portal(pnum, p->x, p->y, p->wParam1, static_cast(p->wParam2), p->wParam3 != 0); - } - - return sizeof(*p); + NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); } -static DWORD On_DEACTIVATEPORTAL(TCmd *pCmd, int pnum) +void NetSendCmdLocParam2(bool bHiPri, _cmd_id bCmd, Point position, uint16_t wParam1, uint16_t wParam2) { - if (gbBufferMsgs == 1) - msg_send_packet(pnum, pCmd, sizeof(*pCmd)); - else { - if (PortalOnLevel(pnum)) - RemovePortalMissile(pnum); - DeactivatePortal(pnum); - delta_close_portal(pnum); - } + TCmdLocParam2 cmd; - return sizeof(*pCmd); + cmd.bCmd = bCmd; + cmd.x = position.x; + cmd.y = position.y; + cmd.wParam1 = wParam1; + cmd.wParam2 = wParam2; + if (bHiPri) + NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); + else + NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); } -static DWORD On_RETOWN(TCmd *pCmd, int pnum) +void NetSendCmdLocParam3(bool bHiPri, _cmd_id bCmd, Point position, uint16_t wParam1, uint16_t wParam2, uint16_t wParam3) { - if (gbBufferMsgs == 1) - msg_send_packet(pnum, pCmd, sizeof(*pCmd)); - else { - if (pnum == myplr) { - deathflag = false; - gamemenu_off(); - } - RestartTownLvl(pnum); - } + TCmdLocParam3 cmd; - return sizeof(*pCmd); + cmd.bCmd = bCmd; + cmd.x = position.x; + cmd.y = position.y; + cmd.wParam1 = wParam1; + cmd.wParam2 = wParam2; + cmd.wParam3 = wParam3; + if (bHiPri) + NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); + else + NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); } -static DWORD On_SETSTR(TCmd *pCmd, int pnum) +void NetSendCmdParam1(bool bHiPri, _cmd_id bCmd, uint16_t wParam1) { - auto *p = (TCmdParam1 *)pCmd; - - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else if (p->wParam1 <= 750 && pnum != myplr) - SetPlrStr(pnum, p->wParam1); + TCmdParam1 cmd; - return sizeof(*p); + cmd.bCmd = bCmd; + cmd.wParam1 = wParam1; + if (bHiPri) + NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); + else + NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); } -static DWORD On_SETDEX(TCmd *pCmd, int pnum) +void NetSendCmdParam2(bool bHiPri, _cmd_id bCmd, uint16_t wParam1, uint16_t wParam2) { - auto *p = (TCmdParam1 *)pCmd; - - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else if (p->wParam1 <= 750 && pnum != myplr) - SetPlrDex(pnum, p->wParam1); + TCmdParam2 cmd; - return sizeof(*p); + cmd.bCmd = bCmd; + cmd.wParam1 = wParam1; + cmd.wParam2 = wParam2; + if (bHiPri) + NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); + else + NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); } -static DWORD On_SETMAG(TCmd *pCmd, int pnum) +void NetSendCmdParam3(bool bHiPri, _cmd_id bCmd, uint16_t wParam1, uint16_t wParam2, uint16_t wParam3) { - auto *p = (TCmdParam1 *)pCmd; - - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else if (p->wParam1 <= 750 && pnum != myplr) - SetPlrMag(pnum, p->wParam1); + TCmdParam3 cmd; - return sizeof(*p); + cmd.bCmd = bCmd; + cmd.wParam1 = wParam1; + cmd.wParam2 = wParam2; + cmd.wParam3 = wParam3; + if (bHiPri) + NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); + else + NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); } -static DWORD On_SETVIT(TCmd *pCmd, int pnum) +void NetSendCmdQuest(bool bHiPri, BYTE q) { - auto *p = (TCmdParam1 *)pCmd; - - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else if (p->wParam1 <= 750 && pnum != myplr) - SetPlrVit(pnum, p->wParam1); + TCmdQuest cmd; - return sizeof(*p); + cmd.q = q; + cmd.bCmd = CMD_SYNCQUEST; + cmd.qstate = quests[q]._qactive; + cmd.qlog = quests[q]._qlog ? 1 : 0; + cmd.qvar1 = quests[q]._qvar1; + if (bHiPri) + NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); + else + NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); } -static DWORD On_STRING(TCmd *pCmd, int pnum) +void NetSendCmdGItem(bool bHiPri, _cmd_id bCmd, BYTE mast, BYTE pnum, BYTE ii) { - return On_STRING2(pnum, pCmd); -} + TCmdGItem cmd; -static DWORD On_SYNCQUEST(TCmd *pCmd, int pnum) -{ - auto *p = (TCmdQuest *)pCmd; + cmd.bCmd = bCmd; + cmd.bPnum = pnum; + cmd.bMaster = mast; + cmd.bLevel = currlevel; + cmd.bCursitem = ii; + cmd.dwTime = 0; + cmd.x = items[ii].position.x; + cmd.y = items[ii].position.y; + cmd.wIndx = items[ii].IDidx; - if (gbBufferMsgs == 1) - msg_send_packet(pnum, p, sizeof(*p)); - else { - if (pnum != myplr) - SetMultiQuest(p->q, p->qstate, p->qlog != 0, p->qvar1); - sgbDeltaChanged = true; + if (items[ii].IDidx == IDI_EAR) { + cmd.wCI = items[ii]._iName[8] | (items[ii]._iName[7] << 8); + cmd.dwSeed = items[ii]._iName[12] | ((items[ii]._iName[11] | ((items[ii]._iName[10] | (items[ii]._iName[9] << 8)) << 8)) << 8); + cmd.bId = items[ii]._iName[13]; + cmd.bDur = items[ii]._iName[14]; + cmd.bMDur = items[ii]._iName[15]; + cmd.bCh = items[ii]._iName[16]; + cmd.bMCh = items[ii]._iName[17]; + cmd.wValue = items[ii]._ivalue | (items[ii]._iName[18] << 8) | ((items[ii]._iCurs - ICURS_EAR_SORCERER) << 6); + cmd.dwBuff = items[ii]._iName[22] | ((items[ii]._iName[21] | ((items[ii]._iName[20] | (items[ii]._iName[19] << 8)) << 8)) << 8); + } else { + cmd.wCI = items[ii]._iCreateInfo; + cmd.dwSeed = items[ii]._iSeed; + cmd.bId = items[ii]._iIdentified ? 1 : 0; + cmd.bDur = items[ii]._iDurability; + cmd.bMDur = items[ii]._iMaxDur; + cmd.bCh = items[ii]._iCharges; + cmd.bMCh = items[ii]._iMaxCharges; + cmd.wValue = items[ii]._ivalue; + cmd.wToHit = items[ii]._iPLToHit; + cmd.wMaxDam = items[ii]._iMaxDam; + cmd.bMinStr = items[ii]._iMinStr; + cmd.bMinMag = items[ii]._iMinMag; + cmd.bMinDex = items[ii]._iMinDex; + cmd.bAC = items[ii]._iAC; + cmd.dwBuff = items[ii].dwBuff; } - return sizeof(*p); + if (bHiPri) + NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); + else + NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); } -static DWORD On_ENDSHIELD(TCmd *pCmd, int pnum) +void NetSendCmdPItem(bool bHiPri, _cmd_id bCmd, Point position) { - if (gbBufferMsgs != 1 && pnum != myplr && currlevel == plr[pnum].plrlevel) { - for (int i = 0; i < nummissiles; i++) { - int mi = missileactive[i]; - if (missile[mi]._mitype == MIS_MANASHIELD && missile[mi]._misource == pnum) { - ClearMissileSpot(mi); - DeleteMissile(mi, i); - } - } - } + TCmdPItem cmd; - return sizeof(*pCmd); -} + cmd.bCmd = bCmd; + cmd.x = position.x; + cmd.y = position.y; + cmd.wIndx = plr[myplr].HoldItem.IDidx; -static DWORD On_CHEAT_EXPERIENCE(TCmd *pCmd, int pnum) // NOLINT(misc-unused-parameters) -{ -#ifdef _DEBUG - if (gbBufferMsgs == 1) - msg_send_packet(pnum, pCmd, sizeof(*pCmd)); - else if (plr[pnum]._pLevel < MAXCHARLEVEL - 1) { - plr[pnum]._pExperience = plr[pnum]._pNextExper; - if (sgOptions.Gameplay.bExperienceBar) { - force_redraw = 255; - } - NextPlrLevel(pnum); + if (plr[myplr].HoldItem.IDidx == IDI_EAR) { + cmd.wCI = plr[myplr].HoldItem._iName[8] | (plr[myplr].HoldItem._iName[7] << 8); + cmd.dwSeed = plr[myplr].HoldItem._iName[12] | ((plr[myplr].HoldItem._iName[11] | ((plr[myplr].HoldItem._iName[10] | (plr[myplr].HoldItem._iName[9] << 8)) << 8)) << 8); + cmd.bId = plr[myplr].HoldItem._iName[13]; + cmd.bDur = plr[myplr].HoldItem._iName[14]; + cmd.bMDur = plr[myplr].HoldItem._iName[15]; + cmd.bCh = plr[myplr].HoldItem._iName[16]; + cmd.bMCh = plr[myplr].HoldItem._iName[17]; + cmd.wValue = plr[myplr].HoldItem._ivalue | (plr[myplr].HoldItem._iName[18] << 8) | ((plr[myplr].HoldItem._iCurs - ICURS_EAR_SORCERER) << 6); + cmd.dwBuff = plr[myplr].HoldItem._iName[22] | ((plr[myplr].HoldItem._iName[21] | ((plr[myplr].HoldItem._iName[20] | (plr[myplr].HoldItem._iName[19] << 8)) << 8)) << 8); + } else { + cmd.wCI = plr[myplr].HoldItem._iCreateInfo; + cmd.dwSeed = plr[myplr].HoldItem._iSeed; + cmd.bId = plr[myplr].HoldItem._iIdentified ? 1 : 0; + cmd.bDur = plr[myplr].HoldItem._iDurability; + cmd.bMDur = plr[myplr].HoldItem._iMaxDur; + cmd.bCh = plr[myplr].HoldItem._iCharges; + cmd.bMCh = plr[myplr].HoldItem._iMaxCharges; + cmd.wValue = plr[myplr].HoldItem._ivalue; + cmd.wToHit = plr[myplr].HoldItem._iPLToHit; + cmd.wMaxDam = plr[myplr].HoldItem._iMaxDam; + cmd.bMinStr = plr[myplr].HoldItem._iMinStr; + cmd.bMinMag = plr[myplr].HoldItem._iMinMag; + cmd.bMinDex = plr[myplr].HoldItem._iMinDex; + cmd.bAC = plr[myplr].HoldItem._iAC; + cmd.dwBuff = plr[myplr].HoldItem.dwBuff; } -#endif - return sizeof(*pCmd); -} -static DWORD On_CHEAT_SPELL_LEVEL(TCmd *pCmd, int pnum) // NOLINT(misc-unused-parameters) -{ -#ifdef _DEBUG - if (gbBufferMsgs == 1) - msg_send_packet(pnum, pCmd, sizeof(*pCmd)); + if (bHiPri) + NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); else - plr[pnum]._pSplLvl[plr[pnum]._pRSpell]++; -#endif - return sizeof(*pCmd); -} - -static DWORD On_DEBUG(TCmd *pCmd) -{ - return sizeof(*pCmd); + NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); } -static DWORD On_NOVA(TCmd *pCmd, int pnum) +void NetSendCmdChItem(bool bHiPri, BYTE bLoc) { - auto *p = (TCmdLoc *)pCmd; + TCmdChItem cmd; - if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel && pnum != myplr) { - ClrPlrPath(plr[pnum]); - plr[pnum]._pSpell = SPL_NOVA; - plr[pnum]._pSplType = RSPLTYPE_INVALID; - plr[pnum]._pSplFrom = 3; - plr[pnum].destAction = ACTION_SPELL; - plr[pnum].destParam1 = p->x; - plr[pnum].destParam2 = p->y; - } + cmd.bCmd = CMD_CHANGEPLRITEMS; + cmd.bLoc = bLoc; + cmd.wIndx = plr[myplr].HoldItem.IDidx; + cmd.wCI = plr[myplr].HoldItem._iCreateInfo; + cmd.dwSeed = plr[myplr].HoldItem._iSeed; + cmd.bId = plr[myplr].HoldItem._iIdentified ? 1 : 0; + cmd.dwBuff = plr[myplr].HoldItem.dwBuff; - return sizeof(*p); + if (bHiPri) + NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); + else + NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); } -static DWORD On_SETSHIELD(TCmd *pCmd, int pnum) +void NetSendCmdDelItem(bool bHiPri, BYTE bLoc) { - if (gbBufferMsgs != 1) - plr[pnum].pManaShield = true; + TCmdDelItem cmd; - return sizeof(*pCmd); + cmd.bLoc = bLoc; + cmd.bCmd = CMD_DELPLRITEMS; + if (bHiPri) + NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); + else + NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); } -static DWORD On_REMSHIELD(TCmd *pCmd, int pnum) +void NetSendCmdDItem(bool bHiPri, int ii) { - if (gbBufferMsgs != 1) - plr[pnum].pManaShield = false; + TCmdPItem cmd; - return sizeof(*pCmd); + cmd.bCmd = CMD_DROPITEM; + cmd.x = items[ii].position.x; + cmd.y = items[ii].position.y; + cmd.wIndx = items[ii].IDidx; + + if (items[ii].IDidx == IDI_EAR) { + cmd.wCI = items[ii]._iName[8] | (items[ii]._iName[7] << 8); + cmd.dwSeed = items[ii]._iName[12] | ((items[ii]._iName[11] | ((items[ii]._iName[10] | (items[ii]._iName[9] << 8)) << 8)) << 8); + cmd.bId = items[ii]._iName[13]; + cmd.bDur = items[ii]._iName[14]; + cmd.bMDur = items[ii]._iName[15]; + cmd.bCh = items[ii]._iName[16]; + cmd.bMCh = items[ii]._iName[17]; + cmd.wValue = items[ii]._ivalue | (items[ii]._iName[18] << 8) | ((items[ii]._iCurs - ICURS_EAR_SORCERER) << 6); + cmd.dwBuff = items[ii]._iName[22] | ((items[ii]._iName[21] | ((items[ii]._iName[20] | (items[ii]._iName[19] << 8)) << 8)) << 8); + } else { + cmd.wCI = items[ii]._iCreateInfo; + cmd.dwSeed = items[ii]._iSeed; + cmd.bId = items[ii]._iIdentified ? 1 : 0; + cmd.bDur = items[ii]._iDurability; + cmd.bMDur = items[ii]._iMaxDur; + cmd.bCh = items[ii]._iCharges; + cmd.bMCh = items[ii]._iMaxCharges; + cmd.wValue = items[ii]._ivalue; + cmd.wToHit = items[ii]._iPLToHit; + cmd.wMaxDam = items[ii]._iMaxDam; + cmd.bMinStr = items[ii]._iMinStr; + cmd.bMinMag = items[ii]._iMinMag; + cmd.bMinDex = items[ii]._iMinDex; + cmd.bAC = items[ii]._iAC; + cmd.dwBuff = items[ii].dwBuff; + } + + if (bHiPri) + NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); + else + NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); } -static DWORD On_REFLECT(TCmd *pCmd, int pnum) +void NetSendCmdDamage(bool bHiPri, uint8_t bPlr, DWORD dwDam) { - if (gbBufferMsgs != 1 && pnum != myplr && currlevel == plr[pnum].plrlevel) { - for (int i = 0; i < nummissiles; i++) { - int mx = missileactive[i]; - if (missile[mx]._mitype == MIS_REFLECT && missile[mx]._misource == pnum) { - ClearMissileSpot(mx); - DeleteMissile(mx, i); - } - } - } + TCmdDamage cmd; - return sizeof(*pCmd); + cmd.bCmd = CMD_PLRDAMAGE; + cmd.bPlr = bPlr; + cmd.dwDam = dwDam; + if (bHiPri) + NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); + else + NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); } -static DWORD On_NAKRUL(TCmd *pCmd) +void NetSendCmdMonDmg(bool bHiPri, uint16_t wMon, DWORD dwDam) { - if (gbBufferMsgs != 1) { - OperateNakrulLever(); - IsUberRoomOpened = true; - quests[Q_NAKRUL]._qactive = QUEST_DONE; - monster_some_crypt(); - } - return sizeof(*pCmd); + TCmdMonDamage cmd; + + cmd.bCmd = CMD_MONSTDAMAGE; + cmd.wMon = wMon; + cmd.dwDam = dwDam; + if (bHiPri) + NetSendHiPri(myplr, (byte *)&cmd, sizeof(cmd)); + else + NetSendLoPri(myplr, (byte *)&cmd, sizeof(cmd)); } -static DWORD On_OPENHIVE(TCmd *pCmd, int pnum) +void NetSendCmdString(uint32_t pmask, const char *pszStr) { - auto *p = (TCmdLocParam2 *)pCmd; - if (gbBufferMsgs != 1) { - AddMissile({ p->x, p->y }, { p->wParam1, p->wParam2 }, 0, MIS_HIVEEXP2, TARGET_MONSTERS, pnum, 0, 0); - TownOpenHive(); - } - return sizeof(*p); + int dwStrLen; + TCmdString cmd; + + dwStrLen = strlen(pszStr); + cmd.bCmd = CMD_STRING; + strcpy(cmd.str, pszStr); + multi_send_msg_packet(pmask, (byte *)&cmd.bCmd, dwStrLen + 2); } -static DWORD On_OPENCRYPT(TCmd *pCmd) +void delta_close_portal(int pnum) { - if (gbBufferMsgs != 1) { - TownOpenGrave(); - InitTownTriggers(); - if (currlevel == 0) - PlaySFX(IS_SARC); - } - return sizeof(*pCmd); + memset(&sgJunk.portal[pnum], 0xFF, sizeof(sgJunk.portal[pnum])); + sgbDeltaChanged = true; } DWORD ParseCmd(int pnum, TCmd *pCmd) @@ -2513,161 +2506,158 @@ DWORD ParseCmd(int pnum, TCmd *pCmd) switch (pCmd->bCmd) { case CMD_SYNCDATA: - return On_SYNCDATA(pCmd, pnum); + return OnSyncData(pCmd, pnum); case CMD_WALKXY: - return On_WALKXY(pCmd, pnum); + return OnWalk(pCmd, pnum); case CMD_ADDSTR: - return On_ADDSTR(pCmd, pnum); + return OnAddStrength(pCmd, pnum); case CMD_ADDDEX: - return On_ADDDEX(pCmd, pnum); + return OnAddDexterity(pCmd, pnum); case CMD_ADDMAG: - return On_ADDMAG(pCmd, pnum); + return OnAddMagic(pCmd, pnum); case CMD_ADDVIT: - return On_ADDVIT(pCmd, pnum); - case CMD_SBSPELL: - return On_SBSPELL(pCmd, pnum); + return OnAddVitality(pCmd, pnum); case CMD_GOTOGETITEM: - return On_GOTOGETITEM(pCmd, pnum); + return OnGotoGetItem(pCmd, pnum); case CMD_REQUESTGITEM: - return On_REQUESTGITEM(pCmd, pnum); + return OnRequestGetItem(pCmd, pnum); case CMD_GETITEM: - return On_GETITEM(pCmd, pnum); + return OnGetItem(pCmd, pnum); case CMD_GOTOAGETITEM: - return On_GOTOAGETITEM(pCmd, pnum); + return OnGotoAutoGetItem(pCmd, pnum); case CMD_REQUESTAGITEM: - return On_REQUESTAGITEM(pCmd, pnum); + return OnRequestAutoGetItem(pCmd, pnum); case CMD_AGETITEM: - return On_AGETITEM(pCmd, pnum); + return OnAutoGetItem(pCmd, pnum); case CMD_ITEMEXTRA: - return On_ITEMEXTRA(pCmd, pnum); + return OnItemExtra(pCmd, pnum); case CMD_PUTITEM: - return On_PUTITEM(pCmd, pnum); + return OnPutItem(pCmd, pnum); case CMD_SYNCPUTITEM: - return On_SYNCPUTITEM(pCmd, pnum); + return OnSyncPutItem(pCmd, pnum); case CMD_RESPAWNITEM: - return On_RESPAWNITEM(pCmd, pnum); + return OnRespawnItem(pCmd, pnum); case CMD_ATTACKXY: - return On_ATTACKXY(pCmd, pnum); + return OnAttackTile(pCmd, pnum); case CMD_SATTACKXY: - return On_SATTACKXY(pCmd, pnum); + return OnStandingAttackTile(pCmd, pnum); case CMD_RATTACKXY: - return On_RATTACKXY(pCmd, pnum); + return OnRangedAttackTile(pCmd, pnum); case CMD_SPELLXYD: - return On_SPELLXYD(pCmd, pnum); + return OnSpellWall(pCmd, pnum); case CMD_SPELLXY: - return On_SPELLXY(pCmd, pnum); + return OnSpellTile(pCmd, pnum); case CMD_TSPELLXY: - return On_TSPELLXY(pCmd, pnum); + return OnTargetSpellTile(pCmd, pnum); case CMD_OPOBJXY: - return On_OPOBJXY(pCmd, pnum); + return OnOperateObjectTile(pCmd, pnum); case CMD_DISARMXY: - return On_DISARMXY(pCmd, pnum); + return OnDisarm(pCmd, pnum); case CMD_OPOBJT: - return On_OPOBJT(pCmd, pnum); + return OnOperateObjectTelekinesis(pCmd, pnum); case CMD_ATTACKID: - return On_ATTACKID(pCmd, pnum); + return OnAttackMonster(pCmd, pnum); case CMD_ATTACKPID: - return On_ATTACKPID(pCmd, pnum); + return OnAttackPlayer(pCmd, pnum); case CMD_RATTACKID: - return On_RATTACKID(pCmd, pnum); + return OnRangedAttackMonster(pCmd, pnum); case CMD_RATTACKPID: - return On_RATTACKPID(pCmd, pnum); + return OnRangedAttackPlayer(pCmd, pnum); case CMD_SPELLID: - return On_SPELLID(pCmd, pnum); + return OnSpellMonster(pCmd, pnum); case CMD_SPELLPID: - return On_SPELLPID(pCmd, pnum); + return OnSpellPlayer(pCmd, pnum); case CMD_TSPELLID: - return On_TSPELLID(pCmd, pnum); + return OnTargetSpellMonster(pCmd, pnum); case CMD_TSPELLPID: - return On_TSPELLPID(pCmd, pnum); + return OnTargetSpellPlayer(pCmd, pnum); case CMD_KNOCKBACK: - return On_KNOCKBACK(pCmd, pnum); + return OnKnockback(pCmd, pnum); case CMD_RESURRECT: - return On_RESURRECT(pCmd, pnum); + return OnResurrect(pCmd, pnum); case CMD_HEALOTHER: - return On_HEALOTHER(pCmd, pnum); + return OnHealOther(pCmd, pnum); case CMD_TALKXY: - return On_TALKXY(pCmd, pnum); + return OnTalkXY(pCmd, pnum); case CMD_DEBUG: - return On_DEBUG(pCmd); + return OnDebug(pCmd); case CMD_NEWLVL: - return On_NEWLVL(pCmd, pnum); + return OnNewLevel(pCmd, pnum); case CMD_WARP: - return On_WARP(pCmd, pnum); + return OnWarp(pCmd, pnum); case CMD_MONSTDEATH: - return On_MONSTDEATH(pCmd, pnum); + return OnMonstDeath(pCmd, pnum); case CMD_KILLGOLEM: - return On_KILLGOLEM(pCmd, pnum); + return OnKillGolem(pCmd, pnum); case CMD_AWAKEGOLEM: - return On_AWAKEGOLEM(pCmd, pnum); + return OnAwakeGolem(pCmd, pnum); case CMD_MONSTDAMAGE: - return On_MONSTDAMAGE(pCmd, pnum); + return OnMonstDamage(pCmd, pnum); case CMD_PLRDEAD: - return On_PLRDEAD(pCmd, pnum); + return OnPlayerDeath(pCmd, pnum); case CMD_PLRDAMAGE: - return On_PLRDAMAGE(pCmd, pnum); + return OnPlayerDamage(pCmd, pnum); case CMD_OPENDOOR: - return On_OPENDOOR(pCmd, pnum); + return OnOpenDoor(pCmd, pnum); case CMD_CLOSEDOOR: - return On_CLOSEDOOR(pCmd, pnum); + return OnCloseDoor(pCmd, pnum); case CMD_OPERATEOBJ: - return On_OPERATEOBJ(pCmd, pnum); + return OnOperateObject(pCmd, pnum); case CMD_PLROPOBJ: - return On_PLROPOBJ(pCmd, pnum); + return OnPlayerOperateObject(pCmd, pnum); case CMD_BREAKOBJ: - return On_BREAKOBJ(pCmd, pnum); + return OnBreakObject(pCmd, pnum); case CMD_CHANGEPLRITEMS: - return On_CHANGEPLRITEMS(pCmd, pnum); + return OnChangePlayerItems(pCmd, pnum); case CMD_DELPLRITEMS: - return On_DELPLRITEMS(pCmd, pnum); + return OnDeletePlayerItems(pCmd, pnum); case CMD_PLRLEVEL: - return On_PLRLEVEL(pCmd, pnum); + return OnPlayerLevel(pCmd, pnum); case CMD_DROPITEM: - return On_DROPITEM(pCmd, pnum); + return OnDropItem(pCmd, pnum); case CMD_ACK_PLRINFO: - return On_ACK_PLRINFO(pCmd, pnum); case CMD_SEND_PLRINFO: - return On_SEND_PLRINFO(pCmd, pnum); + return OnSendPlayerInfo(pCmd, pnum); case CMD_PLAYER_JOINLEVEL: - return On_PLAYER_JOINLEVEL(pCmd, pnum); + return OnPlayerJoinLevel(pCmd, pnum); case CMD_ACTIVATEPORTAL: - return On_ACTIVATEPORTAL(pCmd, pnum); + return OnActivatePortal(pCmd, pnum); case CMD_DEACTIVATEPORTAL: - return On_DEACTIVATEPORTAL(pCmd, pnum); + return OnDeactivatePortal(pCmd, pnum); case CMD_RETOWN: - return On_RETOWN(pCmd, pnum); + return OnRestartTown(pCmd, pnum); case CMD_SETSTR: - return On_SETSTR(pCmd, pnum); + return OnSetStrength(pCmd, pnum); case CMD_SETMAG: - return On_SETMAG(pCmd, pnum); + return OnSetMagic(pCmd, pnum); case CMD_SETDEX: - return On_SETDEX(pCmd, pnum); + return OnSetDexterity(pCmd, pnum); case CMD_SETVIT: - return On_SETVIT(pCmd, pnum); + return OnSetVitality(pCmd, pnum); case CMD_STRING: - return On_STRING(pCmd, pnum); + return OnString(pCmd, pnum); case CMD_SYNCQUEST: - return On_SYNCQUEST(pCmd, pnum); + return OnSyncQuest(pCmd, pnum); case CMD_ENDSHIELD: - return On_ENDSHIELD(pCmd, pnum); + return OnEndShield(pCmd, pnum); case CMD_CHEAT_EXPERIENCE: - return On_CHEAT_EXPERIENCE(pCmd, pnum); + return OnCheatExperience(pCmd, pnum); case CMD_CHEAT_SPELL_LEVEL: - return On_CHEAT_SPELL_LEVEL(pCmd, pnum); + return OnCheatSpellLevel(pCmd, pnum); case CMD_NOVA: - return On_NOVA(pCmd, pnum); + return OnNova(pCmd, pnum); case CMD_SETSHIELD: - return On_SETSHIELD(pCmd, pnum); + return OnSetShield(pCmd, pnum); case CMD_REMSHIELD: - return On_REMSHIELD(pCmd, pnum); + return OnRemoveShield(pCmd, pnum); case CMD_REFLECT: - return On_REFLECT(pCmd, pnum); + return OnReflect(pCmd, pnum); case CMD_NAKRUL: - return On_NAKRUL(pCmd); + return OnNakrul(pCmd); case CMD_OPENHIVE: - return On_OPENHIVE(pCmd, pnum); + return OnOpenHive(pCmd, pnum); case CMD_OPENCRYPT: - return On_OPENCRYPT(pCmd); + return OnOpenCrypt(pCmd); default: break; } @@ -2677,7 +2667,7 @@ DWORD ParseCmd(int pnum, TCmd *pCmd) return 0; } - return On_DLEVEL(pnum, pCmd); + return OnLevelData(pnum, pCmd); } } // namespace devilution diff --git a/Source/msg.h b/Source/msg.h index b2f571bb2..c002416cf 100644 --- a/Source/msg.h +++ b/Source/msg.h @@ -27,7 +27,6 @@ enum _cmd_id : uint8_t { CMD_ADDMAG, CMD_ADDDEX, CMD_ADDVIT, - CMD_SBSPELL, CMD_GETITEM, CMD_AGETITEM, CMD_PUTITEM, diff --git a/Source/options.cpp b/Source/options.cpp index 4d7a31c91..5ebff0474 100644 --- a/Source/options.cpp +++ b/Source/options.cpp @@ -38,18 +38,18 @@ namespace devilution { namespace { -std::string getIniPath() +std::string GetIniPath() { auto path = paths::ConfigPath() + std::string("diablo.ini"); return path; } -CSimpleIni &getIni() +CSimpleIni &GetIni() { static CSimpleIni ini; static bool isIniLoaded = false; if (!isIniLoaded) { - auto path = getIniPath(); + auto path = GetIniPath(); auto stream = CreateFileStream(path.c_str(), std::fstream::in | std::fstream::binary); ini.SetSpaces(false); if (stream != nullptr) @@ -59,68 +59,68 @@ CSimpleIni &getIni() return ini; } -int getIniInt(const char *keyname, const char *valuename, int defaultValue) +int GetIniInt(const char *keyname, const char *valuename, int defaultValue) { - long value = getIni().GetLongValue(keyname, valuename, defaultValue); + long value = GetIni().GetLongValue(keyname, valuename, defaultValue); return value; } -bool getIniBool(const char *sectionName, const char *keyName, bool defaultValue) +bool GetIniBool(const char *sectionName, const char *keyName, bool defaultValue) { - bool value = getIni().GetBoolValue(sectionName, keyName, defaultValue); + bool value = GetIni().GetBoolValue(sectionName, keyName, defaultValue); return value; } -float getIniFloat(const char *sectionName, const char *keyName, float defaultValue) +float GetIniFloat(const char *sectionName, const char *keyName, float defaultValue) { - const double value = getIni().GetDoubleValue(sectionName, keyName, defaultValue); + const double value = GetIni().GetDoubleValue(sectionName, keyName, defaultValue); return (float)value; } -void setIniValue(const char *keyname, const char *valuename, int value) +void SetIniValue(const char *keyname, const char *valuename, int value) { - getIni().SetLongValue(keyname, valuename, value); + GetIni().SetLongValue(keyname, valuename, value); } -void setIniValue(const char *keyname, const char *valuename, std::uint8_t value) +void SetIniValue(const char *keyname, const char *valuename, std::uint8_t value) { - getIni().SetLongValue(keyname, valuename, value); + GetIni().SetLongValue(keyname, valuename, value); } -void setIniValue(const char *keyname, const char *valuename, std::uint32_t value) +void SetIniValue(const char *keyname, const char *valuename, std::uint32_t value) { - getIni().SetLongValue(keyname, valuename, value); + GetIni().SetLongValue(keyname, valuename, value); } -void setIniValue(const char *keyname, const char *valuename, bool value) +void SetIniValue(const char *keyname, const char *valuename, bool value) { - getIni().SetLongValue(keyname, valuename, value ? 1 : 0); + GetIni().SetLongValue(keyname, valuename, value ? 1 : 0); } -void setIniValue(const char *keyname, const char *valuename, float value) +void SetIniValue(const char *keyname, const char *valuename, float value) { - getIni().SetDoubleValue(keyname, valuename, value); + GetIni().SetDoubleValue(keyname, valuename, value); } void SaveIni() { - auto iniPath = getIniPath(); + auto iniPath = GetIniPath(); auto stream = CreateFileStream(iniPath.c_str(), std::fstream::out | std::fstream::trunc | std::fstream::binary); - getIni().Save(*stream, true); + GetIni().Save(*stream, true); } } // namespace -void setIniValue(const char *sectionName, const char *keyName, const char *value, int len) +void SetIniValue(const char *sectionName, const char *keyName, const char *value, int len) { - auto &ini = getIni(); + auto &ini = GetIni(); std::string stringValue(value, len != 0 ? len : strlen(value)); ini.SetValue(sectionName, keyName, stringValue.c_str()); } -bool getIniValue(const char *sectionName, const char *keyName, char *string, int stringSize, const char *defaultString) +bool GetIniValue(const char *sectionName, const char *keyName, char *string, int stringSize, const char *defaultString) { - const char *value = getIni().GetValue(sectionName, keyName); + const char *value = GetIni().GetValue(sectionName, keyName); if (value == nullptr) { strncpy(string, defaultString, stringSize); return false; @@ -138,84 +138,84 @@ bool sbWasOptionsLoaded = false; */ void LoadOptions() { - sgOptions.Diablo.bIntro = getIniBool("Diablo", "Intro", true); - sgOptions.Hellfire.bIntro = getIniBool("Hellfire", "Intro", true); - getIniValue("Hellfire", "SItem", sgOptions.Hellfire.szItem, sizeof(sgOptions.Hellfire.szItem), ""); - - sgOptions.Audio.nSoundVolume = getIniInt("Audio", "Sound Volume", VOLUME_MAX); - sgOptions.Audio.nMusicVolume = getIniInt("Audio", "Music Volume", VOLUME_MAX); - sgOptions.Audio.bWalkingSound = getIniBool("Audio", "Walking Sound", true); - sgOptions.Audio.bAutoEquipSound = getIniBool("Audio", "Auto Equip Sound", false); - - sgOptions.Audio.nSampleRate = getIniInt("Audio", "Sample Rate", DEFAULT_AUDIO_SAMPLE_RATE); - sgOptions.Audio.nChannels = getIniInt("Audio", "Channels", DEFAULT_AUDIO_CHANNELS); - sgOptions.Audio.nBufferSize = getIniInt("Audio", "Buffer Size", DEFAULT_AUDIO_BUFFER_SIZE); - sgOptions.Audio.nResamplingQuality = getIniInt("Audio", "Resampling Quality", DEFAULT_AUDIO_RESAMPLING_QUALITY); - - sgOptions.Graphics.nWidth = getIniInt("Graphics", "Width", DEFAULT_WIDTH); - sgOptions.Graphics.nHeight = getIniInt("Graphics", "Height", DEFAULT_HEIGHT); + sgOptions.Diablo.bIntro = GetIniBool("Diablo", "Intro", true); + sgOptions.Hellfire.bIntro = GetIniBool("Hellfire", "Intro", true); + GetIniValue("Hellfire", "SItem", sgOptions.Hellfire.szItem, sizeof(sgOptions.Hellfire.szItem), ""); + + sgOptions.Audio.nSoundVolume = GetIniInt("Audio", "Sound Volume", VOLUME_MAX); + sgOptions.Audio.nMusicVolume = GetIniInt("Audio", "Music Volume", VOLUME_MAX); + sgOptions.Audio.bWalkingSound = GetIniBool("Audio", "Walking Sound", true); + sgOptions.Audio.bAutoEquipSound = GetIniBool("Audio", "Auto Equip Sound", false); + + sgOptions.Audio.nSampleRate = GetIniInt("Audio", "Sample Rate", DEFAULT_AUDIO_SAMPLE_RATE); + sgOptions.Audio.nChannels = GetIniInt("Audio", "Channels", DEFAULT_AUDIO_CHANNELS); + sgOptions.Audio.nBufferSize = GetIniInt("Audio", "Buffer Size", DEFAULT_AUDIO_BUFFER_SIZE); + sgOptions.Audio.nResamplingQuality = GetIniInt("Audio", "Resampling Quality", DEFAULT_AUDIO_RESAMPLING_QUALITY); + + sgOptions.Graphics.nWidth = GetIniInt("Graphics", "Width", DEFAULT_WIDTH); + sgOptions.Graphics.nHeight = GetIniInt("Graphics", "Height", DEFAULT_HEIGHT); #ifndef __vita__ - sgOptions.Graphics.bFullscreen = getIniBool("Graphics", "Fullscreen", true); + sgOptions.Graphics.bFullscreen = GetIniBool("Graphics", "Fullscreen", true); #else sgOptions.Graphics.bFullscreen = true; #endif #if !defined(USE_SDL1) - sgOptions.Graphics.bUpscale = getIniBool("Graphics", "Upscale", true); + sgOptions.Graphics.bUpscale = GetIniBool("Graphics", "Upscale", true); #else sgOptions.Graphics.bUpscale = false; #endif - sgOptions.Graphics.bFitToScreen = getIniBool("Graphics", "Fit to Screen", true); - getIniValue("Graphics", "Scaling Quality", sgOptions.Graphics.szScaleQuality, sizeof(sgOptions.Graphics.szScaleQuality), "2"); - sgOptions.Graphics.bIntegerScaling = getIniBool("Graphics", "Integer Scaling", false); - sgOptions.Graphics.bVSync = getIniBool("Graphics", "Vertical Sync", true); - sgOptions.Graphics.bBlendedTransparancy = getIniBool("Graphics", "Blended Transparency", true); - sgOptions.Graphics.nGammaCorrection = getIniInt("Graphics", "Gamma Correction", 100); - sgOptions.Graphics.bColorCycling = getIniBool("Graphics", "Color Cycling", true); + sgOptions.Graphics.bFitToScreen = GetIniBool("Graphics", "Fit to Screen", true); + GetIniValue("Graphics", "Scaling Quality", sgOptions.Graphics.szScaleQuality, sizeof(sgOptions.Graphics.szScaleQuality), "2"); + sgOptions.Graphics.bIntegerScaling = GetIniBool("Graphics", "Integer Scaling", false); + sgOptions.Graphics.bVSync = GetIniBool("Graphics", "Vertical Sync", true); + sgOptions.Graphics.bBlendedTransparancy = GetIniBool("Graphics", "Blended Transparency", true); + sgOptions.Graphics.nGammaCorrection = GetIniInt("Graphics", "Gamma Correction", 100); + sgOptions.Graphics.bColorCycling = GetIniBool("Graphics", "Color Cycling", true); #ifndef USE_SDL1 - sgOptions.Graphics.bHardwareCursor = getIniBool("Graphics", "Hardware Cursor", false); + sgOptions.Graphics.bHardwareCursor = GetIniBool("Graphics", "Hardware Cursor", false); #else sgOptions.Graphics.bHardwareCursor = false; #endif - sgOptions.Graphics.bFPSLimit = getIniBool("Graphics", "FPS Limiter", true); - sgOptions.Graphics.bShowFPS = (getIniInt("Graphics", "Show FPS", 0) != 0); - - sgOptions.Gameplay.nTickRate = getIniInt("Game", "Speed", 20); - sgOptions.Gameplay.bRunInTown = getIniBool("Game", "Run in Town", false); - sgOptions.Gameplay.bGrabInput = getIniBool("Game", "Grab Input", false); - sgOptions.Gameplay.bTheoQuest = getIniBool("Game", "Theo Quest", false); - sgOptions.Gameplay.bCowQuest = getIniBool("Game", "Cow Quest", false); - sgOptions.Gameplay.bFriendlyFire = getIniBool("Game", "Friendly Fire", true); - sgOptions.Gameplay.bTestBard = getIniBool("Game", "Test Bard", false); - sgOptions.Gameplay.bTestBarbarian = getIniBool("Game", "Test Barbarian", false); - sgOptions.Gameplay.bExperienceBar = getIniBool("Game", "Experience Bar", false); - sgOptions.Gameplay.bEnemyHealthBar = getIniBool("Game", "Enemy Health Bar", false); - sgOptions.Gameplay.bAutoGoldPickup = getIniBool("Game", "Auto Gold Pickup", false); - sgOptions.Gameplay.bAdriaRefillsMana = getIniBool("Game", "Adria Refills Mana", false); - sgOptions.Gameplay.bAutoEquipWeapons = getIniBool("Game", "Auto Equip Weapons", true); - sgOptions.Gameplay.bAutoEquipArmor = getIniBool("Game", "Auto Equip Armor", false); - sgOptions.Gameplay.bAutoEquipHelms = getIniBool("Game", "Auto Equip Helms", false); - sgOptions.Gameplay.bAutoEquipShields = getIniBool("Game", "Auto Equip Shields", false); - sgOptions.Gameplay.bAutoEquipJewelry = getIniBool("Game", "Auto Equip Jewelry", false); - sgOptions.Gameplay.bRandomizeQuests = getIniBool("Game", "Randomize Quests", true); - sgOptions.Gameplay.bShowMonsterType = getIniBool("Game", "Show Monster Type", false); - sgOptions.Gameplay.bDisableCripplingShrines = getIniBool("Game", "Disable Crippling Shrines", false); - - getIniValue("Network", "Bind Address", sgOptions.Network.szBindAddress, sizeof(sgOptions.Network.szBindAddress), "0.0.0.0"); - sgOptions.Network.nPort = getIniInt("Network", "Port", 6112); - getIniValue("Network", "Previous Host", sgOptions.Network.szPreviousHost, sizeof(sgOptions.Network.szPreviousHost), ""); + sgOptions.Graphics.bFPSLimit = GetIniBool("Graphics", "FPS Limiter", true); + sgOptions.Graphics.bShowFPS = (GetIniInt("Graphics", "Show FPS", 0) != 0); + + sgOptions.Gameplay.nTickRate = GetIniInt("Game", "Speed", 20); + sgOptions.Gameplay.bRunInTown = GetIniBool("Game", "Run in Town", false); + sgOptions.Gameplay.bGrabInput = GetIniBool("Game", "Grab Input", false); + sgOptions.Gameplay.bTheoQuest = GetIniBool("Game", "Theo Quest", false); + sgOptions.Gameplay.bCowQuest = GetIniBool("Game", "Cow Quest", false); + sgOptions.Gameplay.bFriendlyFire = GetIniBool("Game", "Friendly Fire", true); + sgOptions.Gameplay.bTestBard = GetIniBool("Game", "Test Bard", false); + sgOptions.Gameplay.bTestBarbarian = GetIniBool("Game", "Test Barbarian", false); + sgOptions.Gameplay.bExperienceBar = GetIniBool("Game", "Experience Bar", false); + sgOptions.Gameplay.bEnemyHealthBar = GetIniBool("Game", "Enemy Health Bar", false); + sgOptions.Gameplay.bAutoGoldPickup = GetIniBool("Game", "Auto Gold Pickup", false); + sgOptions.Gameplay.bAdriaRefillsMana = GetIniBool("Game", "Adria Refills Mana", false); + sgOptions.Gameplay.bAutoEquipWeapons = GetIniBool("Game", "Auto Equip Weapons", true); + sgOptions.Gameplay.bAutoEquipArmor = GetIniBool("Game", "Auto Equip Armor", false); + sgOptions.Gameplay.bAutoEquipHelms = GetIniBool("Game", "Auto Equip Helms", false); + sgOptions.Gameplay.bAutoEquipShields = GetIniBool("Game", "Auto Equip Shields", false); + sgOptions.Gameplay.bAutoEquipJewelry = GetIniBool("Game", "Auto Equip Jewelry", false); + sgOptions.Gameplay.bRandomizeQuests = GetIniBool("Game", "Randomize Quests", true); + sgOptions.Gameplay.bShowMonsterType = GetIniBool("Game", "Show Monster Type", false); + sgOptions.Gameplay.bDisableCripplingShrines = GetIniBool("Game", "Disable Crippling Shrines", false); + + GetIniValue("Network", "Bind Address", sgOptions.Network.szBindAddress, sizeof(sgOptions.Network.szBindAddress), "0.0.0.0"); + sgOptions.Network.nPort = GetIniInt("Network", "Port", 6112); + GetIniValue("Network", "Previous Host", sgOptions.Network.szPreviousHost, sizeof(sgOptions.Network.szPreviousHost), ""); for (size_t i = 0; i < QUICK_MESSAGE_OPTIONS; i++) - getIniValue("NetMsg", QuickMessages[i].key, sgOptions.Chat.szHotKeyMsgs[i], MAX_SEND_STR_LEN, ""); + GetIniValue("NetMsg", QuickMessages[i].key, sgOptions.Chat.szHotKeyMsgs[i], MAX_SEND_STR_LEN, ""); - getIniValue("Controller", "Mapping", sgOptions.Controller.szMapping, sizeof(sgOptions.Controller.szMapping), ""); - sgOptions.Controller.bSwapShoulderButtonMode = getIniBool("Controller", "Swap Shoulder Button Mode", false); - sgOptions.Controller.bDpadHotkeys = getIniBool("Controller", "Dpad Hotkeys", false); - sgOptions.Controller.fDeadzone = getIniFloat("Controller", "deadzone", 0.07); + GetIniValue("Controller", "Mapping", sgOptions.Controller.szMapping, sizeof(sgOptions.Controller.szMapping), ""); + sgOptions.Controller.bSwapShoulderButtonMode = GetIniBool("Controller", "Swap Shoulder Button Mode", false); + sgOptions.Controller.bDpadHotkeys = GetIniBool("Controller", "Dpad Hotkeys", false); + sgOptions.Controller.fDeadzone = GetIniFloat("Controller", "deadzone", 0.07); #ifdef __vita__ - sgOptions.Controller.bRearTouch = getIniBool("Controller", "Enable Rear Touchpad", true); + sgOptions.Controller.bRearTouch = GetIniBool("Controller", "Enable Rear Touchpad", true); #endif - getIniValue("Language", "Code", sgOptions.Language.szCode, sizeof(sgOptions.Language.szCode), "en"); + GetIniValue("Language", "Code", sgOptions.Language.szCode, sizeof(sgOptions.Language.szCode), "en"); keymapper.load(); @@ -227,77 +227,77 @@ void LoadOptions() */ void SaveOptions() { - setIniValue("Diablo", "Intro", sgOptions.Diablo.bIntro); - setIniValue("Hellfire", "Intro", sgOptions.Hellfire.bIntro); - setIniValue("Hellfire", "SItem", sgOptions.Hellfire.szItem); - - setIniValue("Audio", "Sound Volume", sgOptions.Audio.nSoundVolume); - setIniValue("Audio", "Music Volume", sgOptions.Audio.nMusicVolume); - setIniValue("Audio", "Walking Sound", sgOptions.Audio.bWalkingSound); - setIniValue("Audio", "Auto Equip Sound", sgOptions.Audio.bAutoEquipSound); - - setIniValue("Audio", "Sample Rate", sgOptions.Audio.nSampleRate); - setIniValue("Audio", "Channels", sgOptions.Audio.nChannels); - setIniValue("Audio", "Buffer Size", sgOptions.Audio.nBufferSize); - setIniValue("Audio", "Resampling Quality", sgOptions.Audio.nResamplingQuality); - setIniValue("Graphics", "Width", sgOptions.Graphics.nWidth); - setIniValue("Graphics", "Height", sgOptions.Graphics.nHeight); + SetIniValue("Diablo", "Intro", sgOptions.Diablo.bIntro); + SetIniValue("Hellfire", "Intro", sgOptions.Hellfire.bIntro); + SetIniValue("Hellfire", "SItem", sgOptions.Hellfire.szItem); + + SetIniValue("Audio", "Sound Volume", sgOptions.Audio.nSoundVolume); + SetIniValue("Audio", "Music Volume", sgOptions.Audio.nMusicVolume); + SetIniValue("Audio", "Walking Sound", sgOptions.Audio.bWalkingSound); + SetIniValue("Audio", "Auto Equip Sound", sgOptions.Audio.bAutoEquipSound); + + SetIniValue("Audio", "Sample Rate", sgOptions.Audio.nSampleRate); + SetIniValue("Audio", "Channels", sgOptions.Audio.nChannels); + SetIniValue("Audio", "Buffer Size", sgOptions.Audio.nBufferSize); + SetIniValue("Audio", "Resampling Quality", sgOptions.Audio.nResamplingQuality); + SetIniValue("Graphics", "Width", sgOptions.Graphics.nWidth); + SetIniValue("Graphics", "Height", sgOptions.Graphics.nHeight); #ifndef __vita__ - setIniValue("Graphics", "Fullscreen", sgOptions.Graphics.bFullscreen); + SetIniValue("Graphics", "Fullscreen", sgOptions.Graphics.bFullscreen); #endif #if !defined(USE_SDL1) - setIniValue("Graphics", "Upscale", sgOptions.Graphics.bUpscale); + SetIniValue("Graphics", "Upscale", sgOptions.Graphics.bUpscale); #endif - setIniValue("Graphics", "Fit to Screen", sgOptions.Graphics.bFitToScreen); - setIniValue("Graphics", "Scaling Quality", sgOptions.Graphics.szScaleQuality); - setIniValue("Graphics", "Integer Scaling", sgOptions.Graphics.bIntegerScaling); - setIniValue("Graphics", "Vertical Sync", sgOptions.Graphics.bVSync); - setIniValue("Graphics", "Blended Transparency", sgOptions.Graphics.bBlendedTransparancy); - setIniValue("Graphics", "Gamma Correction", sgOptions.Graphics.nGammaCorrection); - setIniValue("Graphics", "Color Cycling", sgOptions.Graphics.bColorCycling); + SetIniValue("Graphics", "Fit to Screen", sgOptions.Graphics.bFitToScreen); + SetIniValue("Graphics", "Scaling Quality", sgOptions.Graphics.szScaleQuality); + SetIniValue("Graphics", "Integer Scaling", sgOptions.Graphics.bIntegerScaling); + SetIniValue("Graphics", "Vertical Sync", sgOptions.Graphics.bVSync); + SetIniValue("Graphics", "Blended Transparency", sgOptions.Graphics.bBlendedTransparancy); + SetIniValue("Graphics", "Gamma Correction", sgOptions.Graphics.nGammaCorrection); + SetIniValue("Graphics", "Color Cycling", sgOptions.Graphics.bColorCycling); #ifndef USE_SDL1 - setIniValue("Graphics", "Hardware Cursor", sgOptions.Graphics.bHardwareCursor); + SetIniValue("Graphics", "Hardware Cursor", sgOptions.Graphics.bHardwareCursor); #endif - setIniValue("Graphics", "FPS Limiter", sgOptions.Graphics.bFPSLimit); - setIniValue("Graphics", "Show FPS", sgOptions.Graphics.bShowFPS); - - setIniValue("Game", "Speed", sgOptions.Gameplay.nTickRate); - setIniValue("Game", "Run in Town", sgOptions.Gameplay.bRunInTown); - setIniValue("Game", "Grab Input", sgOptions.Gameplay.bGrabInput); - setIniValue("Game", "Theo Quest", sgOptions.Gameplay.bTheoQuest); - setIniValue("Game", "Cow Quest", sgOptions.Gameplay.bCowQuest); - setIniValue("Game", "Friendly Fire", sgOptions.Gameplay.bFriendlyFire); - setIniValue("Game", "Test Bard", sgOptions.Gameplay.bTestBard); - setIniValue("Game", "Test Barbarian", sgOptions.Gameplay.bTestBarbarian); - setIniValue("Game", "Experience Bar", sgOptions.Gameplay.bExperienceBar); - setIniValue("Game", "Enemy Health Bar", sgOptions.Gameplay.bEnemyHealthBar); - setIniValue("Game", "Auto Gold Pickup", sgOptions.Gameplay.bAutoGoldPickup); - setIniValue("Game", "Adria Refills Mana", sgOptions.Gameplay.bAdriaRefillsMana); - setIniValue("Game", "Auto Equip Weapons", sgOptions.Gameplay.bAutoEquipWeapons); - setIniValue("Game", "Auto Equip Armor", sgOptions.Gameplay.bAutoEquipArmor); - setIniValue("Game", "Auto Equip Helms", sgOptions.Gameplay.bAutoEquipHelms); - setIniValue("Game", "Auto Equip Shields", sgOptions.Gameplay.bAutoEquipShields); - setIniValue("Game", "Auto Equip Jewelry", sgOptions.Gameplay.bAutoEquipJewelry); - setIniValue("Game", "Randomize Quests", sgOptions.Gameplay.bRandomizeQuests); - setIniValue("Game", "Show Monster Type", sgOptions.Gameplay.bShowMonsterType); - setIniValue("Game", "Disable Crippling Shrines", sgOptions.Gameplay.bDisableCripplingShrines); - - setIniValue("Network", "Bind Address", sgOptions.Network.szBindAddress); - setIniValue("Network", "Port", sgOptions.Network.nPort); - setIniValue("Network", "Previous Host", sgOptions.Network.szPreviousHost); + SetIniValue("Graphics", "FPS Limiter", sgOptions.Graphics.bFPSLimit); + SetIniValue("Graphics", "Show FPS", sgOptions.Graphics.bShowFPS); + + SetIniValue("Game", "Speed", sgOptions.Gameplay.nTickRate); + SetIniValue("Game", "Run in Town", sgOptions.Gameplay.bRunInTown); + SetIniValue("Game", "Grab Input", sgOptions.Gameplay.bGrabInput); + SetIniValue("Game", "Theo Quest", sgOptions.Gameplay.bTheoQuest); + SetIniValue("Game", "Cow Quest", sgOptions.Gameplay.bCowQuest); + SetIniValue("Game", "Friendly Fire", sgOptions.Gameplay.bFriendlyFire); + SetIniValue("Game", "Test Bard", sgOptions.Gameplay.bTestBard); + SetIniValue("Game", "Test Barbarian", sgOptions.Gameplay.bTestBarbarian); + SetIniValue("Game", "Experience Bar", sgOptions.Gameplay.bExperienceBar); + SetIniValue("Game", "Enemy Health Bar", sgOptions.Gameplay.bEnemyHealthBar); + SetIniValue("Game", "Auto Gold Pickup", sgOptions.Gameplay.bAutoGoldPickup); + SetIniValue("Game", "Adria Refills Mana", sgOptions.Gameplay.bAdriaRefillsMana); + SetIniValue("Game", "Auto Equip Weapons", sgOptions.Gameplay.bAutoEquipWeapons); + SetIniValue("Game", "Auto Equip Armor", sgOptions.Gameplay.bAutoEquipArmor); + SetIniValue("Game", "Auto Equip Helms", sgOptions.Gameplay.bAutoEquipHelms); + SetIniValue("Game", "Auto Equip Shields", sgOptions.Gameplay.bAutoEquipShields); + SetIniValue("Game", "Auto Equip Jewelry", sgOptions.Gameplay.bAutoEquipJewelry); + SetIniValue("Game", "Randomize Quests", sgOptions.Gameplay.bRandomizeQuests); + SetIniValue("Game", "Show Monster Type", sgOptions.Gameplay.bShowMonsterType); + SetIniValue("Game", "Disable Crippling Shrines", sgOptions.Gameplay.bDisableCripplingShrines); + + SetIniValue("Network", "Bind Address", sgOptions.Network.szBindAddress); + SetIniValue("Network", "Port", sgOptions.Network.nPort); + SetIniValue("Network", "Previous Host", sgOptions.Network.szPreviousHost); for (size_t i = 0; i < QUICK_MESSAGE_OPTIONS; i++) - setIniValue("NetMsg", QuickMessages[i].key, sgOptions.Chat.szHotKeyMsgs[i]); + SetIniValue("NetMsg", QuickMessages[i].key, sgOptions.Chat.szHotKeyMsgs[i]); - setIniValue("Controller", "Mapping", sgOptions.Controller.szMapping); - setIniValue("Controller", "Swap Shoulder Button Mode", sgOptions.Controller.bSwapShoulderButtonMode); - setIniValue("Controller", "Dpad Hotkeys", sgOptions.Controller.bDpadHotkeys); - setIniValue("Controller", "deadzone", sgOptions.Controller.fDeadzone); + SetIniValue("Controller", "Mapping", sgOptions.Controller.szMapping); + SetIniValue("Controller", "Swap Shoulder Button Mode", sgOptions.Controller.bSwapShoulderButtonMode); + SetIniValue("Controller", "Dpad Hotkeys", sgOptions.Controller.bDpadHotkeys); + SetIniValue("Controller", "deadzone", sgOptions.Controller.fDeadzone); #ifdef __vita__ - setIniValue("Controller", "Enable Rear Touchpad", sgOptions.Controller.bRearTouch); + SetIniValue("Controller", "Enable Rear Touchpad", sgOptions.Controller.bRearTouch); #endif - setIniValue("Language", "Code", sgOptions.Language.szCode); + SetIniValue("Language", "Code", sgOptions.Language.szCode); keymapper.save(); diff --git a/Source/options.h b/Source/options.h index cdd0ee9aa..795b8e0b3 100644 --- a/Source/options.h +++ b/Source/options.h @@ -158,8 +158,8 @@ struct Options { LanguageOptions Language; }; -bool getIniValue(const char *sectionName, const char *keyName, char *string, int stringSize, const char *defaultString = ""); -void setIniValue(const char *sectionName, const char *keyName, const char *value, int len = 0); +bool GetIniValue(const char *sectionName, const char *keyName, char *string, int stringSize, const char *defaultString = ""); +void SetIniValue(const char *sectionName, const char *keyName, const char *value, int len = 0); extern Options sgOptions; extern bool sbWasOptionsLoaded; diff --git a/Source/player.h b/Source/player.h index 71c4b2832..9835b12d3 100644 --- a/Source/player.h +++ b/Source/player.h @@ -191,11 +191,9 @@ struct PlayerStruct { spell_type _pSplType; int8_t _pSplFrom; // TODO Create enum spell_id _pTSpell; - spell_type _pTSplType; spell_id _pRSpell; spell_type _pRSplType; spell_id _pSBkSpell; - spell_type _pSBkSplType; int8_t _pSplLvl[64]; uint64_t _pMemSpells; // Bitmask of learned spells uint64_t _pAblSpells; // Bitmask of abilities diff --git a/Source/town.cpp b/Source/town.cpp index bdfc500d3..22b166cf8 100644 --- a/Source/town.cpp +++ b/Source/town.cpp @@ -23,7 +23,7 @@ namespace { * @param xi upper left destination * @param yy upper left destination */ -void T_FillSector(const char *path, int xi, int yy) +void FillSector(const char *path, int xi, int yy) { auto dunData = LoadFileInMem(path); @@ -66,7 +66,7 @@ void T_FillSector(const char *path, int xi, int yy) * @param yy upper left destination * @param t tile id */ -void T_FillTile(int xx, int yy, int t) +void FillTile(int xx, int yy, int t) { MegaTile mega = pMegaTiles[t - 1]; @@ -151,7 +151,7 @@ void TownCloseGrave() /** * @brief Initialize all of the levels data */ -void T_Pass3() +void DrlgTPass3() { for (int yy = 0; yy < MAXDUNY; yy += 2) { for (int xx = 0; xx < MAXDUNX; xx += 2) { @@ -162,22 +162,22 @@ void T_Pass3() } } - T_FillSector("Levels\\TownData\\Sector1s.DUN", 46, 46); - T_FillSector("Levels\\TownData\\Sector2s.DUN", 46, 0); - T_FillSector("Levels\\TownData\\Sector3s.DUN", 0, 46); - T_FillSector("Levels\\TownData\\Sector4s.DUN", 0, 0); + FillSector("Levels\\TownData\\Sector1s.DUN", 46, 46); + FillSector("Levels\\TownData\\Sector2s.DUN", 46, 0); + FillSector("Levels\\TownData\\Sector3s.DUN", 0, 46); + FillSector("Levels\\TownData\\Sector4s.DUN", 0, 0); if (gbIsSpawn || !gbIsMultiplayer) { if (gbIsSpawn || ((plr[myplr].pTownWarps & 1) == 0 && (!gbIsHellfire || plr[myplr]._pLevel < 10))) { - T_FillTile(48, 20, 320); + FillTile(48, 20, 320); } if (gbIsSpawn || ((plr[myplr].pTownWarps & 2) == 0 && (!gbIsHellfire || plr[myplr]._pLevel < 15))) { - T_FillTile(16, 68, 332); - T_FillTile(16, 70, 331); + FillTile(16, 68, 332); + FillTile(16, 70, 331); } if (gbIsSpawn || ((plr[myplr].pTownWarps & 4) == 0 && (!gbIsHellfire || plr[myplr]._pLevel < 20))) { for (int x = 36; x < 46; x++) { - T_FillTile(x, 78, GenerateRnd(4) + 1); + FillTile(x, 78, GenerateRnd(4) + 1); } } } @@ -195,9 +195,9 @@ void T_Pass3() } if (quests[Q_PWATER]._qactive != QUEST_DONE && quests[Q_PWATER]._qactive != QUEST_NOTAVAIL) { - T_FillTile(60, 70, 342); + FillTile(60, 70, 342); } else { - T_FillTile(60, 70, 71); + FillTile(60, 70, 71); } } @@ -317,7 +317,7 @@ void CreateTown(lvl_entry entry) } } - T_Pass3(); + DrlgTPass3(); memset(dFlags, 0, sizeof(dFlags)); memset(dLight, 0, sizeof(dLight)); memset(dFlags, 0, sizeof(dFlags)); diff --git a/test/writehero_test.cpp b/test/writehero_test.cpp index c32d254d5..4e6f9993c 100644 --- a/test/writehero_test.cpp +++ b/test/writehero_test.cpp @@ -300,11 +300,9 @@ static void AssertPlayer(PlayerStruct &player) ASSERT_EQ(player._pSplType, 4); ASSERT_EQ(player._pSplFrom, 0); ASSERT_EQ(player._pTSpell, 0); - ASSERT_EQ(player._pTSplType, 0); ASSERT_EQ(player._pRSpell, -1); ASSERT_EQ(player._pRSplType, 4); ASSERT_EQ(player._pSBkSpell, -1); - ASSERT_EQ(player._pSBkSplType, 0); ASSERT_EQ(player._pAblSpells, 134217728); ASSERT_EQ(player._pScrlSpells, 0); ASSERT_EQ(player._pSpellFlags, 0);