|
1
|
#include "d2char.h"
|
|
2
3
4
|
#include "d2skills.h"
#include "d2mercs.h"
#include <stdio.h>
|
|
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
uint32_t calcChecksum(D2CharHeader* c, void* charData) {
uint32_t origChecksum = c->checksum;
c->checksum = 0;
uint32_t sum = 0;
void* data = malloc(c->fileSize);
memcpy(data, (void*)c, D2S_HEADER_LENGTH);
memcpy(data + D2S_HEADER_LENGTH, charData, c->fileSize - D2S_HEADER_LENGTH);
for(int i = 0; i < c->fileSize; ++i) {
sum = (sum << 1) + ((uint8_t*)data)[i];
}
free(data);
c->checksum = origChecksum;
return sum;
}
int checkChecksum(D2CharHeader* c, void* charData) {
uint32_t checksum = calcChecksum(c, charData);
return c->checksum == checksum;
}
int isHardcore(D2CharHeader* c) {
return c->charStatus & D2S_CHARSTATUS_HARDCORE;
}
int hasDied(D2CharHeader* c) {
return c->charStatus & D2S_CHARSTATUS_DIED;
}
int isExpansion(D2CharHeader* c) {
return c->charStatus & D2S_CHARSTATUS_EXPANSION;
}
int isLadder(D2CharHeader* c) {
return c->charStatus & D2S_CHARSTATUS_LADDER;
|
|
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
}
int getCurrentAct(D2CharHeader* c) {
if(isExpansion(c)) {
return c->charProgress % 5;
} else {
return c->charProgress % 4;
}
}
int isFemale(D2CharHeader* c) {
return (c->charClass == D2S_CHARCLASS_AMAZON ||
c->charClass == D2S_CHARCLASS_ASSASSIN ||
c->charClass == D2S_CHARCLASS_SORCERESS);
}
const char* getCharacterTitle(D2CharHeader* c) {
int tier;
if(isExpansion(c)) {
// Expansion
tier = c->charProgress / 5;
if(isHardcore(c)) {
// Expansion Hardcore
switch(tier) {
case 0:
return D2S_CHARPROGRESS_TIER0_NAME;
break;
case 1:
return D2S_CHARPROGRESS_EXPANSION_TIER1_NAME_HARDCORE;
break;
case 2:
return D2S_CHARPROGRESS_EXPANSION_TIER2_NAME_HARDCORE;
break;
case 3:
return D2S_CHARPROGRESS_EXPANSION_TIER3_NAME_HARDCORE;
break;
}
} else {
// Expansion Softcore
switch(tier) {
case 0:
return D2S_CHARPROGRESS_TIER0_NAME;
break;
case 1:
return D2S_CHARPROGRESS_EXPANSION_TIER1_NAME;
break;
case 2:
return D2S_CHARPROGRESS_EXPANSION_TIER2_NAME;
break;
case 3:
return isFemale(c) ? D2S_CHARPROGRESS_EXPANSION_TIER3_NAME_F : D2S_CHARPROGRESS_EXPANSION_TIER3_NAME_M;
break;
}
}
} else {
// Classic
if(isHardcore(c)) {
// Classic Hardcore
switch(tier) {
case 0:
return D2S_CHARPROGRESS_TIER0_NAME;
break;
case 1:
return isFemale(c) ? D2S_CHARPROGRESS_CLASSIC_TIER1_NAME_HARDCORE_F : D2S_CHARPROGRESS_CLASSIC_TIER1_NAME_HARDCORE_M;
break;
case 2:
return isFemale(c) ? D2S_CHARPROGRESS_CLASSIC_TIER2_NAME_HARDCORE_F : D2S_CHARPROGRESS_CLASSIC_TIER2_NAME_HARDCORE_M;
break;
case 3:
return isFemale(c) ? D2S_CHARPROGRESS_CLASSIC_TIER3_NAME_HARDCORE_F : D2S_CHARPROGRESS_CLASSIC_TIER3_NAME_HARDCORE_M;
break;
}
} else {
// Classic Softcore
switch(tier) {
case 0:
return D2S_CHARPROGRESS_TIER0_NAME;
break;
case 1:
return isFemale(c) ? D2S_CHARPROGRESS_CLASSIC_TIER1_NAME_F : D2S_CHARPROGRESS_CLASSIC_TIER1_NAME_M;
break;
case 2:
return isFemale(c) ? D2S_CHARPROGRESS_CLASSIC_TIER2_NAME_F : D2S_CHARPROGRESS_CLASSIC_TIER2_NAME_M;
break;
case 3:
return isFemale(c) ? D2S_CHARPROGRESS_CLASSIC_TIER3_NAME_F : D2S_CHARPROGRESS_CLASSIC_TIER3_NAME_M;
break;
}
}
}
|
|
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
}
size_t getLastPlayed(D2CharHeader* c, char* buf, size_t bufLen) {
struct tm* time = localtime(&(c->lastPlayed));
size_t ret = strftime(buf, bufLen, "%c", time);
if(!ret) {
fprintf(stderr,"libd2char error: Provided buffer for time string was too small\n");
}
return ret;
}
const char* getSkillName(int skillID) {
return skills[skillID];
}
int getCurrentDifficulty(D2CharHeader* c) {
for(int i = D2S_DIFFICULTY_NORMAL; i <= D2S_DIFFICULTY_HELL; ++i) {
if(c->difficulty[i] & D2S_DIFFICULTY_ACTIVE) {
return i;
}
}
return D2S_DIFFICULTY_UNKNOWN;
}
const char* getMercName(D2CharHeader* c) {
return getMercNameTableEntry(c->mercenaryType, c->mercenaryNameID);
}
const char* getMercType(D2CharHeader* c) {
return mercTypes[c->mercenaryType];
|
|
160
|
}
|