/** * @file pack.h * * Interface of functions for minifying player data structure. */ #pragma once #include #include "inv.h" #include "items.h" #include "msg.h" #include "player.h" namespace devilution { #pragma pack(push, 1) struct ItemPack { uint32_t iSeed; uint16_t iCreateInfo; uint16_t idx; uint8_t bId; uint8_t bDur; uint8_t bMDur; uint8_t bCh; uint8_t bMCh; uint16_t wValue; uint32_t dwBuff; }; struct PlayerPack { uint32_t dwLowDateTime; uint32_t dwHighDateTime; int8_t destAction; int8_t destParam1; int8_t destParam2; uint8_t plrlevel; uint8_t px; uint8_t py; uint8_t targx; uint8_t targy; char pName[PlayerNameLength]; uint8_t pClass; uint8_t pBaseStr; uint8_t pBaseMag; uint8_t pBaseDex; uint8_t pBaseVit; uint8_t pLevel; uint8_t pStatPts; uint32_t pExperience; int32_t pGold; int32_t pHPBase; int32_t pMaxHPBase; int32_t pManaBase; int32_t pMaxManaBase; uint8_t pSplLvl[37]; // Should be MAX_SPELLS but set to 37 to make save games compatible uint64_t pMemSpells; ItemPack InvBody[NUM_INVLOC]; ItemPack InvList[InventoryGridCells]; int8_t InvGrid[InventoryGridCells]; uint8_t _pNumInv; ItemPack SpdList[MaxBeltItems]; int8_t pTownWarps; int8_t pDungMsgs; int8_t pLvlLoad; uint8_t pBattleNet; uint8_t pManaShield; uint8_t pDungMsgs2; /** The format the charater is in, 0: Diablo, 1: Hellfire */ int8_t bIsHellfire; uint8_t reserved; // For future use uint16_t wReflections; uint8_t reserved2[2]; // For future use uint8_t pSplLvl2[10]; // Hellfire spells int16_t wReserved8; // For future use uint32_t pDiabloKillLevel; uint32_t pDifficulty; uint32_t pDamAcFlags; // `ItemSpecialEffectHf` is 1 byte but this is 4 bytes. uint8_t reserved3[20]; // For future use }; union ItemNetPack { TItemDef def; TItem item; TEar ear; }; struct PlayerNetPack { uint8_t plrlevel; uint8_t px; uint8_t py; char pName[PlayerNameLength]; uint8_t pClass; uint8_t pBaseStr; uint8_t pBaseMag; uint8_t pBaseDex; uint8_t pBaseVit; int8_t pLevel; uint8_t pStatPts; uint32_t pExperience; int32_t pHPBase; int32_t pMaxHPBase; int32_t pManaBase; int32_t pMaxManaBase; uint8_t pSplLvl[MAX_SPELLS]; uint64_t pMemSpells; ItemNetPack InvBody[NUM_INVLOC]; ItemNetPack InvList[InventoryGridCells]; int8_t InvGrid[InventoryGridCells]; uint8_t _pNumInv; ItemNetPack SpdList[MaxBeltItems]; uint8_t pManaShield; uint16_t wReflections; uint8_t pDiabloKillLevel; uint8_t friendlyMode; uint8_t isOnSetLevel; // For validation int32_t pStrength; int32_t pMagic; int32_t pDexterity; int32_t pVitality; int32_t pHitPoints; int32_t pMaxHP; int32_t pMana; int32_t pMaxMana; int32_t pDamageMod; int32_t pBaseToBlk; int32_t pIMinDam; int32_t pIMaxDam; int32_t pIAC; int32_t pIBonusDam; int32_t pIBonusToHit; int32_t pIBonusAC; int32_t pIBonusDamMod; int32_t pIGetHit; int32_t pIEnAc; int32_t pIFMinDam; int32_t pIFMaxDam; int32_t pILMinDam; int32_t pILMaxDam; }; #pragma pack(pop) void PackPlayer(PlayerPack &pPack, const Player &player); void UnPackPlayer(const PlayerPack &pPack, Player &player); void PackNetPlayer(PlayerNetPack &packed, const Player &player); bool UnPackNetPlayer(const PlayerNetPack &packed, Player &player); /** * @brief Save the attributes needed to recreate this item into an ItemPack struct * * @param packedItem The destination packed struct * @param item The source item * @param isHellfire Whether the item is from Hellfire or not */ void PackItem(ItemPack &packedItem, const Item &item, bool isHellfire); /** * Expand a ItemPack in to a Item * * @param packedItem The source packed item * @param item The destination item * @param isHellfire Whether the item is from Hellfire or not */ void UnPackItem(const ItemPack &packedItem, const Player &player, Item &item, bool isHellfire); } // namespace devilution