Devilution
Diablo devolved - magic behind the 1996 computer game
pack.cpp
Go to the documentation of this file.
1 #include "all.h"
2 
4 
5 static void PackItem(PkItemStruct *id, ItemStruct *is)
6 {
7  if (is->_itype == ITYPE_NONE) {
8  id->idx = 0xFFFF;
9  } else {
10  id->idx = SwapLE16(is->IDidx);
11  if (is->IDidx == IDI_EAR) {
12  id->iCreateInfo = is->_iName[8] | (is->_iName[7] << 8);
13  id->iSeed = SwapLE32(is->_iName[12] | ((is->_iName[11] | ((is->_iName[10] | (is->_iName[9] << 8)) << 8)) << 8));
14  id->bId = is->_iName[13];
15  id->bDur = is->_iName[14];
16  id->bMDur = is->_iName[15];
17  id->bCh = is->_iName[16];
18  id->bMCh = is->_iName[17];
19  id->wValue = SwapLE16(is->_ivalue | (is->_iName[18] << 8) | ((is->_iCurs - 19) << 6));
20  id->dwBuff = SwapLE32(is->_iName[22] | ((is->_iName[21] | ((is->_iName[20] | (is->_iName[19] << 8)) << 8)) << 8));
21  } else {
22  id->iSeed = SwapLE32(is->_iSeed);
23  id->iCreateInfo = SwapLE16(is->_iCreateInfo);
24  id->bId = is->_iIdentified + 2 * is->_iMagical;
25  id->bDur = is->_iDurability;
26  id->bMDur = is->_iMaxDur;
27  id->bCh = is->_iCharges;
28  id->bMCh = is->_iMaxCharges;
29  if (is->IDidx == IDI_GOLD)
30  id->wValue = SwapLE16(is->_ivalue);
31  }
32  }
33 }
34 
35 void PackPlayer(PkPlayerStruct *pPack, int pnum, BOOL manashield)
36 {
37  PlayerStruct *pPlayer;
38  int i;
39  ItemStruct *pi;
40  PkItemStruct *pki;
41 
42  memset(pPack, 0, sizeof(*pPack));
43  pPlayer = &plr[pnum];
44  pPack->destAction = pPlayer->destAction;
45  pPack->destParam1 = pPlayer->destParam1;
46  pPack->destParam2 = pPlayer->destParam2;
47  pPack->plrlevel = pPlayer->plrlevel;
48  pPack->px = pPlayer->WorldX;
49  pPack->py = pPlayer->WorldY;
50  pPack->targx = pPlayer->_ptargx;
51  pPack->targy = pPlayer->_ptargy;
52  strcpy(pPack->pName, pPlayer->_pName);
53  pPack->pClass = pPlayer->_pClass;
54  pPack->pBaseStr = pPlayer->_pBaseStr;
55  pPack->pBaseMag = pPlayer->_pBaseMag;
56  pPack->pBaseDex = pPlayer->_pBaseDex;
57  pPack->pBaseVit = pPlayer->_pBaseVit;
58  pPack->pLevel = pPlayer->_pLevel;
59  pPack->pStatPts = pPlayer->_pStatPts;
60  pPack->pExperience = SwapLE32(pPlayer->_pExperience);
61  pPack->pGold = SwapLE32(pPlayer->_pGold);
62  pPack->pHPBase = SwapLE32(pPlayer->_pHPBase);
63  pPack->pMaxHPBase = SwapLE32(pPlayer->_pMaxHPBase);
64  pPack->pManaBase = SwapLE32(pPlayer->_pManaBase);
65  pPack->pMaxManaBase = SwapLE32(pPlayer->_pMaxManaBase);
66  pPack->pMemSpells = SDL_SwapLE64(pPlayer->_pMemSpells);
67 
68  for (i = 0; i < MAX_SPELLS; i++)
69  pPack->pSplLvl[i] = pPlayer->_pSplLvl[i];
70 
71  pki = &pPack->InvBody[0];
72  pi = &pPlayer->InvBody[0];
73 
74  for (i = 0; i < NUM_INVLOC; i++) {
75  PackItem(pki, pi);
76  pki++;
77  pi++;
78  }
79 
80  pki = &pPack->InvList[0];
81  pi = &pPlayer->InvList[0];
82 
83  for (i = 0; i < NUM_INV_GRID_ELEM; i++) {
84  PackItem(pki, pi);
85  pki++;
86  pi++;
87  }
88 
89  for (i = 0; i < NUM_INV_GRID_ELEM; i++)
90  pPack->InvGrid[i] = pPlayer->InvGrid[i];
91 
92  pPack->_pNumInv = pPlayer->_pNumInv;
93  pki = &pPack->SpdList[0];
94  pi = &pPlayer->SpdList[0];
95 
96  for (i = 0; i < MAXBELTITEMS; i++) {
97  PackItem(pki, pi);
98  pki++;
99  pi++;
100  }
101 
102  pPack->pDiabloKillLevel = SwapLE32(pPlayer->pDiabloKillLevel);
103 
104  if (gbMaxPlayers == 1 || manashield)
105  pPack->pManaShield = SwapLE32(pPlayer->pManaShield);
106  else
107  pPack->pManaShield = FALSE;
108 }
109 
118 static void UnPackItem(PkItemStruct *is, ItemStruct *id)
119 {
120  WORD idx = SwapLE16(is->idx);
121 
122  if (idx == 0xFFFF) {
123  id->_itype = ITYPE_NONE;
124  } else {
125  if (idx == IDI_EAR) {
126  RecreateEar(
127  MAXITEMS,
128  SwapLE16(is->iCreateInfo),
129  SwapLE32(is->iSeed),
130  is->bId,
131  is->bDur,
132  is->bMDur,
133  is->bCh,
134  is->bMCh,
135  SwapLE16(is->wValue),
136  SwapLE32(is->dwBuff));
137  } else {
139  item[MAXITEMS]._iMagical = is->bId >> 1;
140  item[MAXITEMS]._iIdentified = is->bId & 1;
142  item[MAXITEMS]._iMaxDur = is->bMDur;
143  item[MAXITEMS]._iCharges = is->bCh;
145  }
146  *id = item[MAXITEMS];
147  }
148 }
149 
151 {
152  int i, j;
153 
154  for (i = 0; i < pPlayer->_pNumInv; i++) {
155  if (pPlayer->InvList[i].IDidx == IDI_GOLD) {
156  for (j = 0; j < pPlayer->_pNumInv; j++) {
157  if (i != j) {
158  if (pPlayer->InvList[j].IDidx == IDI_GOLD && pPlayer->InvList[i]._iSeed == pPlayer->InvList[j]._iSeed) {
159  pPlayer->InvList[i]._iSeed = GetRndSeed();
160  j = -1;
161  }
162  }
163  }
164  }
165  }
166 }
167 
168 void UnPackPlayer(PkPlayerStruct *pPack, int pnum, BOOL killok)
169 {
170  PlayerStruct *pPlayer;
171  int i;
172  ItemStruct *pi;
173  PkItemStruct *pki;
174 
175  pPlayer = &plr[pnum];
176  ClearPlrRVars(pPlayer);
177  pPlayer->WorldX = pPack->px;
178  pPlayer->WorldY = pPack->py;
179  pPlayer->_px = pPack->px;
180  pPlayer->_py = pPack->py;
181  pPlayer->_ptargx = pPack->targx;
182  pPlayer->_ptargy = pPack->targy;
183  pPlayer->plrlevel = pPack->plrlevel;
184  ClrPlrPath(pnum);
185  pPlayer->destAction = ACTION_NONE;
186  strcpy(pPlayer->_pName, pPack->pName);
187  pPlayer->_pClass = pPack->pClass;
188  InitPlayer(pnum, TRUE);
189  pPlayer->_pBaseStr = pPack->pBaseStr;
190  pPlayer->_pStrength = pPack->pBaseStr;
191  pPlayer->_pBaseMag = pPack->pBaseMag;
192  pPlayer->_pMagic = pPack->pBaseMag;
193  pPlayer->_pBaseDex = pPack->pBaseDex;
194  pPlayer->_pDexterity = pPack->pBaseDex;
195  pPlayer->_pBaseVit = pPack->pBaseVit;
196  pPlayer->_pVitality = pPack->pBaseVit;
197  pPlayer->_pLevel = pPack->pLevel;
198  pPlayer->_pStatPts = pPack->pStatPts;
199  pPlayer->_pExperience = SwapLE32(pPack->pExperience);
200  pPlayer->_pGold = SwapLE32(pPack->pGold);
201  pPlayer->_pMaxHPBase = SwapLE32(pPack->pMaxHPBase);
202  pPlayer->_pHPBase = SwapLE32(pPack->pHPBase);
203  if (!killok)
204  if ((int)(pPlayer->_pHPBase & 0xFFFFFFC0) < 64)
205  pPlayer->_pHPBase = 64;
206 
207  pPlayer->_pMaxManaBase = SwapLE32(pPack->pMaxManaBase);
208  pPlayer->_pManaBase = SwapLE32(pPack->pManaBase);
209  pPlayer->_pMemSpells = SDL_SwapLE64(pPack->pMemSpells);
210 
211  for (i = 0; i < MAX_SPELLS; i++)
212  pPlayer->_pSplLvl[i] = pPack->pSplLvl[i];
213 
214  pki = &pPack->InvBody[0];
215  pi = &pPlayer->InvBody[0];
216 
217  for (i = 0; i < NUM_INVLOC; i++) {
218  UnPackItem(pki, pi);
219  pki++;
220  pi++;
221  }
222 
223  pki = &pPack->InvList[0];
224  pi = &pPlayer->InvList[0];
225 
226  for (i = 0; i < NUM_INV_GRID_ELEM; i++) {
227  UnPackItem(pki, pi);
228  pki++;
229  pi++;
230  }
231 
232  for (i = 0; i < NUM_INV_GRID_ELEM; i++)
233  pPlayer->InvGrid[i] = pPack->InvGrid[i];
234 
235  pPlayer->_pNumInv = pPack->_pNumInv;
236  VerifyGoldSeeds(pPlayer);
237 
238  pki = &pPack->SpdList[0];
239  pi = &pPlayer->SpdList[0];
240 
241  for (i = 0; i < MAXBELTITEMS; i++) {
242  UnPackItem(pki, pi);
243  pki++;
244  pi++;
245  }
246 
247  if (pnum == myplr) {
248  for (i = 0; i < 20; i++)
249  witchitem[i]._itype = ITYPE_NONE;
250  }
251 
252  CalcPlrInv(pnum, FALSE);
253  pPlayer->pTownWarps = 0;
254  pPlayer->pDungMsgs = 0;
255  pPlayer->pLvlLoad = 0;
256  pPlayer->pDiabloKillLevel = SwapLE32(pPack->pDiabloKillLevel);
257  pPlayer->pBattleNet = pPack->pBattleNet;
258  pPlayer->pManaShield = SwapLE32(pPack->pManaShield);
259 }
260 
ItemStruct::_iSeed
int _iSeed
Definition: structs.h:100
PlayerStruct::_pManaBase
int _pManaBase
Definition: structs.h:261
PlayerStruct::_pGold
int _pGold
Definition: structs.h:275
PkItemStruct::iSeed
DWORD iSeed
Definition: structs.h:1363
PlayerStruct::InvGrid
char InvGrid[NUM_INV_GRID_ELEM]
Definition: structs.h:316
PlayerStruct::pLvlLoad
unsigned char pLvlLoad
Definition: structs.h:340
PlayerStruct::_pBaseStr
int _pBaseStr
Definition: structs.h:246
PkPlayerStruct::pExperience
int pExperience
Definition: structs.h:1393
ItemStruct::_iCurs
int _iCurs
Definition: structs.h:121
PlayerStruct::_ptargx
int _ptargx
Definition: structs.h:192
PlayerStruct::destAction
int destAction
Definition: structs.h:182
PlayerStruct::pTownWarps
unsigned char pTownWarps
Definition: structs.h:338
NUM_INVLOC
@ NUM_INVLOC
Definition: enums.h:2796
PlayerStruct::pManaShield
BOOLEAN pManaShield
Definition: structs.h:342
PkItemStruct
Definition: structs.h:1362
PlayerStruct::_pMaxHPBase
int _pMaxHPBase
Definition: structs.h:257
PlayerStruct::_pBaseDex
int _pBaseDex
Definition: structs.h:250
SwapLE16
#define SwapLE16
Definition: defs.h:183
PkPlayerStruct::pStatPts
BYTE pStatPts
Definition: structs.h:1392
PlayerStruct::_pNumInv
int _pNumInv
Definition: structs.h:315
PkItemStruct::bMCh
BYTE bMCh
Definition: structs.h:1370
PlayerStruct::WorldX
int WorldX
Definition: structs.h:188
PkPlayerStruct::px
BYTE px
Definition: structs.h:1381
PkPlayerStruct::py
BYTE py
Definition: structs.h:1382
PlayerStruct::_pHPBase
int _pHPBase
Definition: structs.h:256
PkItemStruct::bMDur
BYTE bMDur
Definition: structs.h:1368
ItemStruct::_iDurability
int _iDurability
Definition: structs.h:135
PkPlayerStruct::pGold
int pGold
Definition: structs.h:1394
item
ItemStruct item[MAXITEMS+1]
Definition: items.cpp:15
MAXITEMS
#define MAXITEMS
Definition: defs.h:27
ItemStruct::_itype
int _itype
Definition: structs.h:102
PkPlayerStruct::destParam1
char destParam1
Definition: structs.h:1378
ITYPE_NONE
@ ITYPE_NONE
Definition: enums.h:2495
IDI_EAR
@ IDI_EAR
Definition: enums.h:2524
PlayerStruct::_pSplLvl
char _pSplLvl[64]
Definition: structs.h:225
PlayerStruct::InvList
ItemStruct InvList[NUM_INV_GRID_ELEM]
Definition: structs.h:314
PlayerStruct::_pVitality
int _pVitality
Definition: structs.h:251
ClrPlrPath
void ClrPlrPath(int pnum)
Definition: player.cpp:3466
PlayerStruct::_pExperience
int _pExperience
Definition: structs.h:268
PkPlayerStruct::pHPBase
int pHPBase
Definition: structs.h:1395
PkPlayerStruct::InvBody
PkItemStruct InvBody[NUM_INVLOC]
Definition: structs.h:1401
PlayerStruct::_pLevel
char _pLevel
Definition: structs.h:266
CalcPlrInv
void CalcPlrInv(int p, BOOL Loadgfx)
Definition: items.cpp:764
ItemStruct::_ivalue
int _ivalue
Definition: structs.h:122
PkPlayerStruct::_pNumInv
BYTE _pNumInv
Definition: structs.h:1404
all.h
RecreateItem
void RecreateItem(int ii, int idx, WORD icreateinfo, int iseed, int ivalue)
Definition: items.cpp:2251
PkPlayerStruct::pSplLvl
char pSplLvl[MAX_SPELLS]
Definition: structs.h:1399
PlayerStruct::SpdList
ItemStruct SpdList[MAXBELTITEMS]
Definition: structs.h:317
ItemStruct::_iMagical
char _iMagical
Definition: structs.h:115
PkPlayerStruct::plrlevel
BYTE plrlevel
Definition: structs.h:1380
PkPlayerStruct::pDiabloKillLevel
int pDiabloKillLevel
Definition: structs.h:1413
PkPlayerStruct::pName
char pName[PLR_NAME_LEN]
Definition: structs.h:1385
PkItemStruct::bId
BYTE bId
Definition: structs.h:1366
PlayerStruct::destParam1
int destParam1
Definition: structs.h:183
PlayerStruct::_pMagic
int _pMagic
Definition: structs.h:247
PkItemStruct::bCh
BYTE bCh
Definition: structs.h:1369
PlayerStruct::_pClass
char _pClass
Definition: structs.h:244
MAXBELTITEMS
#define MAXBELTITEMS
Definition: defs.h:28
ItemStruct
Definition: structs.h:99
gbMaxPlayers
BYTE gbMaxPlayers
Specifies the maximum number of players in a game, where 1 represents a single player game and 4 repr...
Definition: multi.cpp:34
PkPlayerStruct::pBaseStr
BYTE pBaseStr
Definition: structs.h:1387
PkPlayerStruct::pClass
char pClass
Definition: structs.h:1386
PlayerStruct::destParam2
int destParam2
Definition: structs.h:184
ItemStruct::_iMaxDur
int _iMaxDur
Definition: structs.h:136
PlayerStruct::_px
int _px
Definition: structs.h:190
PkPlayerStruct::InvGrid
char InvGrid[NUM_INV_GRID_ELEM]
Definition: structs.h:1403
PkPlayerStruct::destAction
char destAction
Definition: structs.h:1377
DEVILUTION_END_NAMESPACE
#define DEVILUTION_END_NAMESPACE
Definition: types.h:10
PkPlayerStruct::targx
BYTE targx
Definition: structs.h:1383
PkPlayerStruct::pMaxHPBase
int pMaxHPBase
Definition: structs.h:1396
PkPlayerStruct::pManaShield
BOOLEAN pManaShield
Definition: structs.h:1410
PkPlayerStruct::pLevel
char pLevel
Definition: structs.h:1391
PkItemStruct::dwBuff
DWORD dwBuff
Definition: structs.h:1372
PlayerStruct::pDiabloKillLevel
DWORD pDiabloKillLevel
Definition: structs.h:345
PlayerStruct::_pBaseMag
int _pBaseMag
Definition: structs.h:248
PkPlayerStruct::pManaBase
int pManaBase
Definition: structs.h:1397
UnPackPlayer
void UnPackPlayer(PkPlayerStruct *pPack, int pnum, BOOL killok)
Definition: pack.cpp:168
IDI_GOLD
@ IDI_GOLD
Definition: enums.h:2499
PkPlayerStruct::pBattleNet
char pBattleNet
Definition: structs.h:1409
PlayerStruct::_pMaxManaBase
int _pMaxManaBase
Definition: structs.h:262
UnPackItem
static void UnPackItem(PkItemStruct *is, ItemStruct *id)
Expand a PkItemStruct in to a ItemStruct.
Definition: pack.cpp:118
GetRndSeed
int GetRndSeed()
Get the current RNG seed.
Definition: engine.cpp:739
PlayerStruct::_pMemSpells
uint64_t _pMemSpells
Definition: structs.h:226
PkItemStruct::iCreateInfo
WORD iCreateInfo
Definition: structs.h:1364
ItemStruct::_iCharges
int _iCharges
Definition: structs.h:133
PlayerStruct::_ptargy
int _ptargy
Definition: structs.h:193
ItemStruct::_iName
char _iName[64]
Definition: structs.h:116
PkItemStruct::idx
WORD idx
Definition: structs.h:1365
PkPlayerStruct::pBaseMag
BYTE pBaseMag
Definition: structs.h:1388
witchitem
ItemStruct witchitem[20]
Definition: stores.cpp:20
PkItemStruct::wValue
WORD wValue
Definition: structs.h:1371
ItemStruct::_iIdentified
BOOL _iIdentified
Definition: structs.h:114
PkPlayerStruct::InvList
PkItemStruct InvList[NUM_INV_GRID_ELEM]
Definition: structs.h:1402
PkPlayerStruct::destParam2
char destParam2
Definition: structs.h:1379
PkPlayerStruct::pBaseVit
BYTE pBaseVit
Definition: structs.h:1390
PlayerStruct::InvBody
ItemStruct InvBody[NUM_INVLOC]
Definition: structs.h:313
PkPlayerStruct::pMaxManaBase
int pMaxManaBase
Definition: structs.h:1398
PkPlayerStruct::targy
BYTE targy
Definition: structs.h:1384
PlayerStruct::_pStatPts
int _pStatPts
Definition: structs.h:253
SwapLE32
#define SwapLE32
Definition: defs.h:182
ClearPlrRVars
void ClearPlrRVars(PlayerStruct *p)
Definition: player.cpp:504
PkPlayerStruct::pMemSpells
uint64_t pMemSpells
Definition: structs.h:1400
ItemStruct::IDidx
int IDidx
Definition: structs.h:170
myplr
int myplr
Definition: player.cpp:9
PlayerStruct::pDungMsgs
unsigned char pDungMsgs
Definition: structs.h:339
VerifyGoldSeeds
void VerifyGoldSeeds(PlayerStruct *pPlayer)
Definition: pack.cpp:150
ItemStruct::_iMaxCharges
int _iMaxCharges
Definition: structs.h:134
PkItemStruct::bDur
BYTE bDur
Definition: structs.h:1367
PlayerStruct::plrlevel
int plrlevel
Definition: structs.h:187
PlayerStruct::_pStrength
int _pStrength
Definition: structs.h:245
PkPlayerStruct
Definition: structs.h:1375
PackItem
static DEVILUTION_BEGIN_NAMESPACE void PackItem(PkItemStruct *id, ItemStruct *is)
Definition: pack.cpp:5
PlayerStruct::pBattleNet
unsigned char pBattleNet
Definition: structs.h:341
DEVILUTION_BEGIN_NAMESPACE
Definition: sha.cpp:10
PkPlayerStruct::SpdList
PkItemStruct SpdList[MAXBELTITEMS]
Definition: structs.h:1405
PlayerStruct::_py
int _py
Definition: structs.h:191
ACTION_NONE
@ ACTION_NONE
Definition: enums.h:2906
PlayerStruct::_pBaseVit
int _pBaseVit
Definition: structs.h:252
NUM_INV_GRID_ELEM
#define NUM_INV_GRID_ELEM
Definition: defs.h:46
PlayerStruct::WorldY
int WorldY
Definition: structs.h:189
PackPlayer
void PackPlayer(PkPlayerStruct *pPack, int pnum, BOOL manashield)
Definition: pack.cpp:35
PlayerStruct::_pName
char _pName[PLR_NAME_LEN]
Definition: structs.h:237
RecreateEar
void RecreateEar(int ii, WORD ic, int iseed, int Id, int dur, int mdur, int ch, int mch, int ivalue, int ibuff)
Definition: items.cpp:2297
plr
PlayerStruct plr[MAX_PLRS]
Definition: player.cpp:10
PlayerStruct
Definition: structs.h:178
MAX_SPELLS
#define MAX_SPELLS
Definition: defs.h:22
PkPlayerStruct::pBaseDex
BYTE pBaseDex
Definition: structs.h:1389
ItemStruct::_iCreateInfo
WORD _iCreateInfo
Definition: structs.h:101
InitPlayer
void InitPlayer(int pnum, BOOL FirstTime)
Definition: player.cpp:837
PlayerStruct::_pDexterity
int _pDexterity
Definition: structs.h:249