Devilution
Diablo devolved - magic behind the 1996 computer game
pfile.cpp
Go to the documentation of this file.
1 #include "all.h"
2 #include "../3rdParty/Storm/Source/storm.h"
3 #include "../DiabloUI/diabloui.h"
4 #include "file_util.h"
5 
7 
8 #ifdef SPAWN
9 #define PASSWORD_SINGLE "adslhfb1"
10 #define PASSWORD_MULTI "lshbkfg1"
11 #else
12 #define PASSWORD_SINGLE "xrgyrkj1"
13 #define PASSWORD_MULTI "szqnlsk1"
14 #endif
15 
19 
21 {
22  DWORD save_num;
23  PkPlayerStruct pkplr;
24 
25  save_num = pfile_get_save_num_from_name(plr[myplr]._pName);
26  if (pfile_open_archive(TRUE, save_num)) {
27  PackPlayer(&pkplr, myplr, gbMaxPlayers == 1);
28  pfile_encode_hero(&pkplr);
29  pfile_flush(gbMaxPlayers == 1, save_num);
30  }
31 }
32 
33 DWORD pfile_get_save_num_from_name(const char *name)
34 {
35  DWORD i;
36 
37  for (i = 0; i < MAX_CHARACTERS; i++) {
38  if (!strcasecmp(hero_names[i], name))
39  break;
40  }
41 
42  return i;
43 }
44 
46 {
47  BYTE *packed;
48  DWORD packed_len;
49  char password[16] = PASSWORD_SINGLE;
50 
51  if (gbMaxPlayers > 1)
52  strcpy(password, PASSWORD_MULTI);
53 
54  packed_len = codec_get_encoded_len(sizeof(*pPack));
55  packed = (BYTE *)DiabloAllocPtr(packed_len);
56  memcpy(packed, pPack, sizeof(*pPack));
57  codec_encode(packed, sizeof(*pPack), packed_len, password);
58  mpqapi_write_file("hero", packed, packed_len);
59  mem_free_dbg(packed);
60 }
61 
62 BOOL pfile_open_archive(BOOL update, DWORD save_num)
63 {
64  char FileName[MAX_PATH];
65 
66  pfile_get_save_path(FileName, sizeof(FileName), save_num);
67  if (OpenMPQ(FileName, save_num))
68  return TRUE;
69 
70  return FALSE;
71 }
72 
73 void pfile_get_save_path(char *pszBuf, DWORD dwBufSize, DWORD save_num)
74 {
75  char path[MAX_PATH];
76 
77 #ifdef SPAWN
78  const char *fmt = "%sshare_%d.sv";
79 
80  if (gbMaxPlayers <= 1)
81  fmt = "%sspawn%d.sv";
82 #else
83  const char *fmt = "%smulti_%d.sv";
84 
85  if (gbMaxPlayers <= 1)
86  fmt = "%ssingle_%d.sv";
87 #endif
88 
89  GetPrefPath(path, MAX_PATH);
90  snprintf(pszBuf, MAX_PATH, fmt, path, save_num);
91 }
92 
93 void pfile_flush(BOOL is_single_player, DWORD save_num)
94 {
95  char FileName[MAX_PATH];
96 
97  pfile_get_save_path(FileName, sizeof(FileName), save_num);
98  mpqapi_flush_and_close(FileName, is_single_player, save_num);
99 }
100 
101 BOOL pfile_create_player_description(char *dst, DWORD len)
102 {
103  char desc[128];
104  _uiheroinfo uihero;
105 
106  myplr = 0;
109  UiSetupPlayerInfo(gszHero, &uihero, GAME_ID);
110 
111  if (dst != NULL && len) {
112  if (UiCreatePlayerDescription(&uihero, GAME_ID, desc) == 0)
113  return FALSE;
114  SStrCopy(dst, desc, len);
115  }
116  return TRUE;
117 }
118 
119 BOOL pfile_rename_hero(const char *name_1, const char *name_2)
120 {
121  int i;
122  DWORD save_num;
123  _uiheroinfo uihero;
124  BOOL found = FALSE;
125 
127  for (i = 0; i != MAX_PLRS; i++) {
128  if (!strcasecmp(name_1, plr[i]._pName)) {
129  found = TRUE;
130  break;
131  }
132  }
133  }
134 
135  if (!found)
136  return FALSE;
137  save_num = pfile_get_save_num_from_name(name_1);
138  if (save_num == MAX_CHARACTERS)
139  return FALSE;
140 
141  SStrCopy(hero_names[save_num], name_2, PLR_NAME_LEN);
142  SStrCopy(plr[i]._pName, name_2, PLR_NAME_LEN);
143  if (!strcasecmp(gszHero, name_1))
144  SStrCopy(gszHero, name_2, sizeof(gszHero));
146  UiSetupPlayerInfo(gszHero, &uihero, GAME_ID);
148  return TRUE;
149 }
150 
152 {
154 }
155 
156 void game_2_ui_player(const PlayerStruct *p, _uiheroinfo *heroinfo, BOOL bHasSaveFile)
157 {
158  memset(heroinfo, 0, sizeof(*heroinfo));
159  strncpy(heroinfo->name, p->_pName, sizeof(heroinfo->name) - 1);
160  heroinfo->name[sizeof(heroinfo->name) - 1] = '\0';
161  heroinfo->level = p->_pLevel;
162  heroinfo->heroclass = game_2_ui_class(p);
163  heroinfo->strength = p->_pStrength;
164  heroinfo->magic = p->_pMagic;
165  heroinfo->dexterity = p->_pDexterity;
166  heroinfo->vitality = p->_pVitality;
167  heroinfo->gold = p->_pGold;
168  heroinfo->hassaved = bHasSaveFile;
169  heroinfo->herorank = p->pDiabloKillLevel;
170 #ifdef SPAWN
171  heroinfo->spawned = TRUE;
172 #else
173  heroinfo->spawned = FALSE;
174 #endif
175 }
176 
178 {
179  BYTE uiclass;
180  if (p->_pClass == PC_WARRIOR)
181  uiclass = UI_WARRIOR;
182  else if (p->_pClass == PC_ROGUE)
183  uiclass = UI_ROGUE;
184  else
185  uiclass = UI_SORCERER;
186 
187  return uiclass;
188 }
189 
190 BOOL pfile_ui_set_hero_infos(BOOL(*ui_add_hero_info)(_uiheroinfo *))
191 {
192  DWORD i, save_num;
193  char FileName[MAX_PATH];
194  char NewFileName[MAX_PATH];
195  BOOL showFixedMsg;
196 
197  memset(hero_names, 0, sizeof(hero_names));
198 
199  showFixedMsg = TRUE;
200  for (i = 0; i < MAX_CHARACTERS; i++) {
201  PkPlayerStruct pkplr;
202  HANDLE archive = pfile_open_save_archive(&showFixedMsg, i);
203  if (archive) {
204  if (pfile_read_hero(archive, &pkplr)) {
205  _uiheroinfo uihero;
206  strcpy(hero_names[i], pkplr.pName);
207  UnPackPlayer(&pkplr, 0, FALSE);
208  game_2_ui_player(plr, &uihero, pfile_archive_contains_game(archive, i));
209  ui_add_hero_info(&uihero);
210  }
211  pfile_SFileCloseArchive(archive);
212  }
213  }
214 
215  return TRUE;
216 }
217 
218 BOOL pfile_read_hero(HANDLE archive, PkPlayerStruct *pPack)
219 {
220  HANDLE file;
221  DWORD dwlen, nSize;
222  BYTE *buf;
223 
224  if (!SFileOpenFileEx(archive, "hero", 0, &file)) {
225  return FALSE;
226  } else {
227  BOOL ret = FALSE;
228  char password[16] = PASSWORD_SINGLE;
229  nSize = 16;
230 
231  if (gbMaxPlayers > 1)
232  strcpy(password, PASSWORD_MULTI);
233 
234  dwlen = SFileGetFileSize(file, NULL);
235  if (dwlen) {
236  DWORD read;
237  buf = DiabloAllocPtr(dwlen);
238  if (SFileReadFile(file, buf, dwlen, &read, NULL)) {
239  read = codec_decode(buf, dwlen, password);
240  if (read == sizeof(*pPack)) {
241  memcpy(pPack, buf, sizeof(*pPack));
242  ret = TRUE;
243  }
244  }
245  if (buf)
246  mem_free_dbg(buf);
247  }
248  SFileCloseFile(file);
249  return ret;
250  }
251 }
252 
256 HANDLE pfile_open_save_archive(BOOL *showFixedMsg, DWORD save_num)
257 {
258  char SrcStr[MAX_PATH];
259  HANDLE archive;
260 
261  pfile_get_save_path(SrcStr, sizeof(SrcStr), save_num);
262  if (SFileOpenArchive(SrcStr, 0x7000, FS_PC, &archive))
263  return archive;
264  return NULL;
265 }
266 
267 void pfile_SFileCloseArchive(HANDLE hsArchive)
268 {
269  SFileCloseArchive(hsArchive);
270 }
271 
272 BOOL pfile_archive_contains_game(HANDLE hsArchive, DWORD save_num)
273 {
274  HANDLE file;
275 
276  if (gbMaxPlayers != 1)
277  return FALSE;
278 
279  if (!SFileOpenFileEx(hsArchive, "game", 0, &file))
280  return FALSE;
281 
282  SFileCloseFile(file);
283  return TRUE;
284 }
285 
286 BOOL pfile_ui_set_class_stats(unsigned int player_class_nr, _uidefaultstats *class_stats)
287 {
288  int c;
289 
290  c = pfile_get_player_class(player_class_nr);
291  class_stats->strength = StrengthTbl[c];
292  class_stats->magic = MagicTbl[c];
293  class_stats->dexterity = DexterityTbl[c];
294  class_stats->vitality = VitalityTbl[c];
295  return TRUE;
296 }
297 
298 char pfile_get_player_class(unsigned int player_class_nr)
299 {
300  char pc_class;
301 
302  if (player_class_nr == UI_WARRIOR)
303  pc_class = PC_WARRIOR;
304  else if (player_class_nr == UI_ROGUE)
305  pc_class = PC_ROGUE;
306  else
307  pc_class = PC_SORCERER;
308  return pc_class;
309 }
310 
312 {
313  DWORD save_num;
314  char cl;
315  PkPlayerStruct pkplr;
316 
317  save_num = pfile_get_save_num_from_name(heroinfo->name);
318  if (save_num == MAX_CHARACTERS) {
319  for (save_num = 0; save_num < MAX_CHARACTERS; save_num++) {
320  if (!hero_names[save_num][0])
321  break;
322  }
323  if (save_num == MAX_CHARACTERS)
324  return FALSE;
325  }
326  if (!pfile_open_archive(FALSE, save_num))
327  return FALSE;
329  strncpy(hero_names[save_num], heroinfo->name, PLR_NAME_LEN);
330  hero_names[save_num][PLR_NAME_LEN - 1] = '\0';
331  cl = pfile_get_player_class(heroinfo->heroclass);
332  CreatePlayer(0, cl);
333  strncpy(plr[0]._pName, heroinfo->name, PLR_NAME_LEN);
334  plr[0]._pName[PLR_NAME_LEN - 1] = '\0';
335  PackPlayer(&pkplr, 0, TRUE);
336  pfile_encode_hero(&pkplr);
337  game_2_ui_player(&plr[0], heroinfo, FALSE);
338  pfile_flush(TRUE, save_num);
339  return TRUE;
340 }
341 
342 BOOL pfile_get_file_name(DWORD lvl, char *dst)
343 {
344  const char *fmt;
345 
346  if (gbMaxPlayers > 1) {
347  if (lvl)
348  return FALSE;
349  fmt = "hero";
350  } else {
351  if (lvl < 17)
352  fmt = "perml%02d";
353  else if (lvl < 34) {
354  lvl -= 17;
355  fmt = "perms%02d";
356  } else if (lvl == 34)
357  fmt = "game";
358  else if (lvl == 35)
359  fmt = "hero";
360  else
361  return FALSE;
362  }
363  sprintf(dst, fmt, lvl);
364  return TRUE;
365 }
366 
368 {
369  DWORD save_num;
370  char FileName[MAX_PATH];
371 
372  save_num = pfile_get_save_num_from_name(hero_info->name);
373  if (save_num < MAX_CHARACTERS) {
374  hero_names[save_num][0] = '\0';
375  pfile_get_save_path(FileName, sizeof(FileName), save_num);
376  RemoveFile(FileName);
377  }
378  return TRUE;
379 }
380 
382 {
383  HANDLE archive;
384  DWORD save_num;
385  PkPlayerStruct pkplr;
386 
388  archive = pfile_open_save_archive(NULL, save_num);
389  if (archive == NULL)
390  app_fatal("Unable to open archive");
391  if (!pfile_read_hero(archive, &pkplr))
392  app_fatal("Unable to load character");
393 
394  UnPackPlayer(&pkplr, myplr, FALSE);
395  gbValidSaveFile = pfile_archive_contains_game(archive, save_num);
396  pfile_SFileCloseArchive(archive);
397 }
398 
399 void GetTempLevelNames(char *szTemp)
400 {
401  // BUGFIX: function call has no purpose
403  if (setlevel)
404  sprintf(szTemp, "temps%02d", setlvlnum);
405  else
406  sprintf(szTemp, "templ%02d", currlevel);
407 }
408 
409 void GetPermLevelNames(char *szPerm)
410 {
411  DWORD save_num;
412  BOOL has_file;
413 
414  save_num = pfile_get_save_num_from_name(plr[myplr]._pName);
415  GetTempLevelNames(szPerm);
416  if (!pfile_open_archive(FALSE, save_num))
417  app_fatal("Unable to read to save file archive");
418 
419  has_file = mpqapi_has_file(szPerm);
420  pfile_flush(TRUE, save_num);
421  if (!has_file) {
422  if (setlevel)
423  sprintf(szPerm, "perms%02d", setlvlnum);
424  else
425  sprintf(szPerm, "perml%02d", currlevel);
426  }
427 }
428 
429 void pfile_get_game_name(char *dst)
430 {
431  // BUGFIX: function call with no purpose
433  strcpy(dst, "game");
434 }
435 
437 {
438  if (gbMaxPlayers <= 1) {
439  DWORD save_num = pfile_get_save_num_from_name(plr[myplr]._pName);
440  if (!pfile_open_archive(FALSE, save_num))
441  app_fatal("Unable to write to save file archive");
443  pfile_flush(TRUE, save_num);
444  }
445 }
446 
447 BOOL GetTempSaveNames(DWORD dwIndex, char *szTemp)
448 {
449  const char *fmt;
450 
451  if (dwIndex < 17)
452  fmt = "templ%02d";
453  else if (dwIndex < 34) {
454  dwIndex -= 17;
455  fmt = "temps%02d";
456  } else
457  return FALSE;
458 
459  sprintf(szTemp, fmt, dwIndex);
460  return TRUE;
461 }
462 
464 {
465  DWORD dwChar, dwIndex;
466  BOOL bResult;
467  char szTemp[MAX_PATH];
468  char szPerm[MAX_PATH];
469 
470  dwChar = pfile_get_save_num_from_name(plr[myplr]._pName);
471  assert(dwChar < MAX_CHARACTERS);
472  assert(gbMaxPlayers == 1);
473  if (!pfile_open_archive(FALSE, dwChar))
474  app_fatal("Unable to write to save file archive");
475 
476  dwIndex = 0;
477  while (GetTempSaveNames(dwIndex, szTemp)) {
478  bResult = GetPermSaveNames(dwIndex, szPerm);
479  assert(bResult);
480  dwIndex++;
481  if (mpqapi_has_file(szTemp)) {
482  if (mpqapi_has_file(szPerm))
483  mpqapi_remove_hash_entry(szPerm);
484  mpqapi_rename(szTemp, szPerm);
485  }
486  }
487  assert(! GetPermSaveNames(dwIndex,szPerm));
488  pfile_flush(TRUE, dwChar);
489 }
490 
491 BOOL GetPermSaveNames(DWORD dwIndex, char *szPerm)
492 {
493  const char *fmt;
494 
495  if (dwIndex < 17)
496  fmt = "perml%02d";
497  else if (dwIndex < 34) {
498  dwIndex -= 17;
499  fmt = "perms%02d";
500  } else
501  return FALSE;
502 
503  sprintf(szPerm, fmt, dwIndex);
504  return TRUE;
505 }
506 
507 void pfile_write_save_file(const char *pszName, BYTE *pbData, DWORD dwLen, DWORD qwLen)
508 {
509  DWORD save_num;
510  char FileName[MAX_PATH];
511 
512  pfile_strcpy(FileName, pszName);
513  save_num = pfile_get_save_num_from_name(plr[myplr]._pName);
514  {
515  char password[16] = PASSWORD_SINGLE;
516  if (gbMaxPlayers > 1)
517  strcpy(password, PASSWORD_MULTI);
518 
519  codec_encode(pbData, dwLen, qwLen, password);
520  }
521  if (!pfile_open_archive(FALSE, save_num))
522  app_fatal("Unable to write so save file archive");
523  mpqapi_write_file(FileName, pbData, qwLen);
524  pfile_flush(TRUE, save_num);
525 }
526 
527 void pfile_strcpy(char *dst, const char *src)
528 {
529  strcpy(dst, src);
530 }
531 
532 BYTE *pfile_read(const char *pszName, DWORD *pdwLen)
533 {
534  DWORD save_num, nread;
535  char FileName[MAX_PATH];
536  HANDLE archive, save;
537  BYTE *buf;
538 
539  pfile_strcpy(FileName, pszName);
540  save_num = pfile_get_save_num_from_name(plr[myplr]._pName);
541  archive = pfile_open_save_archive(NULL, save_num);
542  if (archive == NULL)
543  app_fatal("Unable to open save file archive");
544 
545  if (!SFileOpenFileEx(archive, FileName, 0, &save))
546  app_fatal("Unable to open save file");
547 
548  *pdwLen = SFileGetFileSize(save, NULL);
549  if (*pdwLen == 0)
550  app_fatal("Invalid save file");
551 
552  buf = (BYTE *)DiabloAllocPtr(*pdwLen);
553  if (!SFileReadFile(save, buf, *pdwLen, &nread, NULL))
554  app_fatal("Unable to read save file");
555  SFileCloseFile(save);
556  pfile_SFileCloseArchive(archive);
557 
558  {
559  char password[16] = PASSWORD_SINGLE;
560  DWORD nSize = 16;
561 
562  if (gbMaxPlayers > 1)
563  strcpy(password, PASSWORD_MULTI);
564 
565  *pdwLen = codec_decode(buf, *pdwLen, password);
566  if (*pdwLen == 0) {
567  app_fatal("Invalid save file");
568  }
569  }
570  return buf;
571 }
572 
573 void pfile_update(BOOL force_save)
574 {
575  // BUGFIX: these tick values should be treated as unsigned to handle overflows correctly
576  static int save_prev_tc;
577 
578  if (gbMaxPlayers != 1) {
579  int tick = SDL_GetTicks();
580  if (force_save || tick - save_prev_tc > 60000) {
581  save_prev_tc = tick;
583  }
584  }
585 }
586 
VitalityTbl
int VitalityTbl[3]
Definition: player.cpp:53
MagicTbl
int MagicTbl[3]
Definition: player.cpp:51
pfile_write_save_file
void pfile_write_save_file(const char *pszName, BYTE *pbData, DWORD dwLen, DWORD qwLen)
Definition: pfile.cpp:507
PlayerStruct::_pGold
int _pGold
Definition: structs.h:275
pfile_create_player_description
BOOL pfile_create_player_description(char *dst, DWORD len)
Definition: pfile.cpp:101
_uiheroinfo::herorank
BYTE herorank
Definition: structs.h:1229
currlevel
BYTE currlevel
Definition: gendung.cpp:40
mpqapi_flush_and_close
BOOL mpqapi_flush_and_close(const char *pszArchive, BOOL bFree, DWORD dwChar)
Definition: mpqapi.cpp:695
_uiheroinfo::dexterity
WORD dexterity
Definition: structs.h:1232
MAX_PLRS
#define MAX_PLRS
Definition: defs.h:16
pfile_read_player_from_save
void pfile_read_player_from_save()
Definition: pfile.cpp:381
_uiheroinfo::hassaved
int hassaved
Definition: structs.h:1235
_uiheroinfo::vitality
WORD vitality
Definition: structs.h:1233
_uiheroinfo::level
WORD level
Definition: structs.h:1227
PLR_NAME_LEN
#define PLR_NAME_LEN
Definition: defs.h:70
GetPermLevelNames
void GetPermLevelNames(char *szPerm)
Definition: pfile.cpp:409
PlayerStruct::_pVitality
int _pVitality
Definition: structs.h:251
pfile_update
void pfile_update(BOOL force_save)
Definition: pfile.cpp:573
PlayerStruct::_pLevel
char _pLevel
Definition: structs.h:266
all.h
pfile_rename_temp_to_perm
void pfile_rename_temp_to_perm()
Definition: pfile.cpp:463
_uidefaultstats::vitality
WORD vitality
Definition: structs.h:1221
pfile_ui_save_create
BOOL pfile_ui_save_create(_uiheroinfo *heroinfo)
Definition: pfile.cpp:311
PkPlayerStruct::pName
char pName[PLR_NAME_LEN]
Definition: structs.h:1385
PlayerStruct::_pMagic
int _pMagic
Definition: structs.h:247
pfile_strcpy
void pfile_strcpy(char *dst, const char *src)
Definition: pfile.cpp:527
PlayerStruct::_pClass
char _pClass
Definition: structs.h:244
UI_SORCERER
@ UI_SORCERER
Definition: enums.h:2715
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
pfile_flush
void pfile_flush(BOOL is_single_player, DWORD save_num)
Definition: pfile.cpp:93
assert
#define assert(exp)
Definition: defs.h:168
pfile_rename_hero
BOOL pfile_rename_hero(const char *name_1, const char *name_2)
Definition: pfile.cpp:119
mpqapi_remove_hash_entries
void mpqapi_remove_hash_entries(BOOL(*fnGetName)(DWORD, char *))
Definition: mpqapi.cpp:451
app_fatal
void app_fatal(const char *pszFmt,...)
Definition: appfat.cpp:18
pfile_write_hero
void pfile_write_hero()
Definition: pfile.cpp:20
_uiheroinfo::gold
int gold
Definition: structs.h:1234
DEVILUTION_END_NAMESPACE
#define DEVILUTION_END_NAMESPACE
Definition: types.h:10
_uidefaultstats::dexterity
WORD dexterity
Definition: structs.h:1220
OpenMPQ
BOOL OpenMPQ(const char *pszArchive, DWORD dwChar)
Definition: mpqapi.cpp:641
mpqapi_write_file
BOOL mpqapi_write_file(const char *pszName, const BYTE *pbData, DWORD dwLen)
Definition: mpqapi.cpp:462
_uiheroinfo::spawned
BOOL spawned
Definition: structs.h:1236
PlayerStruct::pDiabloKillLevel
DWORD pDiabloKillLevel
Definition: structs.h:345
_uidefaultstats::magic
WORD magic
Definition: structs.h:1219
pfile_get_file_name
BOOL pfile_get_file_name(DWORD lvl, char *dst)
Definition: pfile.cpp:342
_uidefaultstats
Definition: structs.h:1217
pfile_encode_hero
void pfile_encode_hero(const PkPlayerStruct *pPack)
Definition: pfile.cpp:45
PASSWORD_SINGLE
#define PASSWORD_SINGLE
Definition: pfile.cpp:12
UnPackPlayer
void UnPackPlayer(PkPlayerStruct *pPack, int pnum, BOOL killok)
Definition: pack.cpp:168
pfile_archive_contains_game
BOOL pfile_archive_contains_game(HANDLE hsArchive, DWORD save_num)
Definition: pfile.cpp:272
pfile_read_hero
BOOL pfile_read_hero(HANDLE archive, PkPlayerStruct *pPack)
Definition: pfile.cpp:218
_uiheroinfo::strength
WORD strength
Definition: structs.h:1230
GetTempSaveNames
BOOL GetTempSaveNames(DWORD dwIndex, char *szTemp)
Definition: pfile.cpp:447
UI_ROGUE
@ UI_ROGUE
Definition: enums.h:2714
pfile_read
BYTE * pfile_read(const char *pszName, DWORD *pdwLen)
Definition: pfile.cpp:532
pfile_get_game_name
void pfile_get_game_name(char *dst)
Definition: pfile.cpp:429
mpqapi_has_file
BOOL mpqapi_has_file(const char *pszName)
Definition: mpqapi.cpp:636
mpqapi_remove_hash_entry
void mpqapi_remove_hash_entry(const char *pszName)
Definition: mpqapi.cpp:349
pfile_get_save_num_from_name
DWORD pfile_get_save_num_from_name(const char *name)
Definition: pfile.cpp:33
codec_get_encoded_len
DWORD codec_get_encoded_len(DWORD dwSrcBytes)
Definition: codec.cpp:96
GetTempLevelNames
void GetTempLevelNames(char *szTemp)
Definition: pfile.cpp:399
game_2_ui_class
BYTE game_2_ui_class(const PlayerStruct *p)
Definition: pfile.cpp:177
StrengthTbl
int StrengthTbl[3]
Definition: player.cpp:50
pfile_flush_W
void pfile_flush_W()
Definition: pfile.cpp:151
MAX_CHARACTERS
#define MAX_CHARACTERS
Definition: defs.h:18
setlevel
BOOLEAN setlevel
Definition: gendung.cpp:65
pfile_open_archive
BOOL pfile_open_archive(BOOL update, DWORD save_num)
Definition: pfile.cpp:62
game_2_ui_player
void game_2_ui_player(const PlayerStruct *p, _uiheroinfo *heroinfo, BOOL bHasSaveFile)
Definition: pfile.cpp:156
codec_encode
void codec_encode(BYTE *pbSrcDst, DWORD size, int size_64, char *pszPassword)
Definition: codec.cpp:103
GetPermSaveNames
BOOL GetPermSaveNames(DWORD dwIndex, char *szPerm)
Definition: pfile.cpp:491
DiabloAllocPtr
BYTE * DiabloAllocPtr(DWORD dwBytes)
Multithreaded safe malloc.
Definition: engine.cpp:765
setlvlnum
BYTE setlvlnum
Definition: gendung.cpp:58
mpqapi_rename
void mpqapi_rename(char *pszOld, char *pszNew)
Definition: mpqapi.cpp:619
pfile_remove_temp_files
void pfile_remove_temp_files()
Definition: pfile.cpp:436
pfile_ui_set_hero_infos
BOOL pfile_ui_set_hero_infos(BOOL(*ui_add_hero_info)(_uiheroinfo *))
Definition: pfile.cpp:190
pfile_get_save_path
void pfile_get_save_path(char *pszBuf, DWORD dwBufSize, DWORD save_num)
Definition: pfile.cpp:73
_uiheroinfo::name
char name[16]
Definition: structs.h:1226
myplr
int myplr
Definition: player.cpp:9
CreatePlayer
void CreatePlayer(int pnum, char c)
Definition: player.cpp:530
mem_free_dbg
void mem_free_dbg(void *p)
Multithreaded safe memfree.
Definition: engine.cpp:786
PC_WARRIOR
@ PC_WARRIOR
Definition: enums.h:2706
GAME_ID
#define GAME_ID
Definition: defs.h:83
PlayerStruct::_pStrength
int _pStrength
Definition: structs.h:245
PkPlayerStruct
Definition: structs.h:1375
pfile_get_player_class
char pfile_get_player_class(unsigned int player_class_nr)
Definition: pfile.cpp:298
FS_PC
@ FS_PC
Definition: enums.h:1358
PC_ROGUE
@ PC_ROGUE
Definition: enums.h:2707
gbValidSaveFile
BOOL gbValidSaveFile
Definition: pfile.cpp:18
_uiheroinfo::magic
WORD magic
Definition: structs.h:1231
DEVILUTION_BEGIN_NAMESPACE
Definition: sha.cpp:10
pfile_open_save_archive
HANDLE pfile_open_save_archive(BOOL *showFixedMsg, DWORD save_num)
Definition: pfile.cpp:256
pfile_delete_save
BOOL pfile_delete_save(_uiheroinfo *hero_info)
Definition: pfile.cpp:367
_uidefaultstats::strength
WORD strength
Definition: structs.h:1218
codec_decode
int codec_decode(BYTE *pbSrcDst, DWORD size, char *pszPassword)
Definition: codec.cpp:20
pfile_SFileCloseArchive
void pfile_SFileCloseArchive(HANDLE hsArchive)
Definition: pfile.cpp:267
pfile_ui_set_class_stats
BOOL pfile_ui_set_class_stats(unsigned int player_class_nr, _uidefaultstats *class_stats)
Definition: pfile.cpp:286
PackPlayer
void PackPlayer(PkPlayerStruct *pPack, int pnum, BOOL manashield)
Definition: pack.cpp:35
_uiheroinfo::heroclass
BYTE heroclass
Definition: structs.h:1228
DexterityTbl
int DexterityTbl[3]
Definition: player.cpp:52
PASSWORD_MULTI
#define PASSWORD_MULTI
Definition: pfile.cpp:13
PlayerStruct::_pName
char _pName[PLR_NAME_LEN]
Definition: structs.h:237
hero_names
static char hero_names[MAX_CHARACTERS][PLR_NAME_LEN]
List of character names for the character selection screen.
Definition: pfile.cpp:17
UI_WARRIOR
@ UI_WARRIOR
Definition: enums.h:2713
plr
PlayerStruct plr[MAX_PLRS]
Definition: player.cpp:10
PlayerStruct
Definition: structs.h:178
PC_SORCERER
@ PC_SORCERER
Definition: enums.h:2708
_uiheroinfo
Definition: structs.h:1224
gszHero
DEVILUTION_BEGIN_NAMESPACE char gszHero[16]
Definition: mainmenu.cpp:12
PlayerStruct::_pDexterity
int _pDexterity
Definition: structs.h:249