d2char.c
1000 Bytes
1
2
3
4
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
#include "d2char.h"
#include <stdlib.h>
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;
}