Commit 86f65f02296afb600429f81c6f4ed8a93ebd737e
1 parent
aabd2f7b
Reordered includes, fixed small mistakes and warnings. Quests WIP
Showing
6 changed files
with
349 additions
and
24 deletions
d2char.c
1 | +#include <stdio.h> | |
2 | + | |
1 | 3 | #include "d2char.h" |
2 | -#include "d2skills.h" | |
3 | 4 | #include "d2mercs.h" |
4 | -#include <stdio.h> | |
5 | +#include "d2skills.h" | |
5 | 6 | |
6 | 7 | uint32_t calcChecksum(D2CharHeader* c, void* charData) { |
7 | 8 | uint32_t origChecksum = c->checksum; |
... | ... | @@ -61,9 +62,6 @@ const char* getCharacterTitle(D2CharHeader* c) { |
61 | 62 | if(isHardcore(c)) { |
62 | 63 | // Expansion Hardcore |
63 | 64 | switch(tier) { |
64 | - case 0: | |
65 | - return D2S_CHARPROGRESS_TIER0_NAME; | |
66 | - break; | |
67 | 65 | case 1: |
68 | 66 | return D2S_CHARPROGRESS_EXPANSION_TIER1_NAME_HARDCORE; |
69 | 67 | break; |
... | ... | @@ -77,9 +75,6 @@ const char* getCharacterTitle(D2CharHeader* c) { |
77 | 75 | } else { |
78 | 76 | // Expansion Softcore |
79 | 77 | switch(tier) { |
80 | - case 0: | |
81 | - return D2S_CHARPROGRESS_TIER0_NAME; | |
82 | - break; | |
83 | 78 | case 1: |
84 | 79 | return D2S_CHARPROGRESS_EXPANSION_TIER1_NAME; |
85 | 80 | break; |
... | ... | @@ -96,9 +91,6 @@ const char* getCharacterTitle(D2CharHeader* c) { |
96 | 91 | if(isHardcore(c)) { |
97 | 92 | // Classic Hardcore |
98 | 93 | switch(tier) { |
99 | - case 0: | |
100 | - return D2S_CHARPROGRESS_TIER0_NAME; | |
101 | - break; | |
102 | 94 | case 1: |
103 | 95 | return isFemale(c) ? D2S_CHARPROGRESS_CLASSIC_TIER1_NAME_HARDCORE_F : D2S_CHARPROGRESS_CLASSIC_TIER1_NAME_HARDCORE_M; |
104 | 96 | break; |
... | ... | @@ -112,9 +104,6 @@ const char* getCharacterTitle(D2CharHeader* c) { |
112 | 104 | } else { |
113 | 105 | // Classic Softcore |
114 | 106 | switch(tier) { |
115 | - case 0: | |
116 | - return D2S_CHARPROGRESS_TIER0_NAME; | |
117 | - break; | |
118 | 107 | case 1: |
119 | 108 | return isFemale(c) ? D2S_CHARPROGRESS_CLASSIC_TIER1_NAME_F : D2S_CHARPROGRESS_CLASSIC_TIER1_NAME_M; |
120 | 109 | break; |
... | ... | @@ -127,10 +116,18 @@ const char* getCharacterTitle(D2CharHeader* c) { |
127 | 116 | } |
128 | 117 | } |
129 | 118 | } |
119 | + return D2S_CHARPROGRESS_TIER0_NAME; | |
130 | 120 | } |
131 | 121 | |
132 | 122 | size_t getLastPlayed(D2CharHeader* c, char* buf, size_t bufLen) { |
133 | - struct tm* time = localtime(&(c->lastPlayed)); | |
123 | + // In amd64, since long is 64 bits long, time_t is also 64 bits long | |
124 | + // thus needing conversion from the save file type, which is a uint32_t | |
125 | + #ifdef __x86_64__ | |
126 | + uint64_t convTimestamp = c->lastPlayed; | |
127 | + #else | |
128 | + uint32_t convTimestamp = c->lastPlayed; | |
129 | + #endif | |
130 | + struct tm* time = localtime((time_t*)&convTimestamp); | |
134 | 131 | size_t ret = strftime(buf, bufLen, "%c", time); |
135 | 132 | if(!ret) { |
136 | 133 | fprintf(stderr,"libd2char error: Provided buffer for time string was too small\n"); |
... | ... | @@ -152,7 +149,7 @@ int getCurrentDifficulty(D2CharHeader* c) { |
152 | 149 | } |
153 | 150 | |
154 | 151 | const char* getMercName(D2CharHeader* c) { |
155 | - return getMercNameTableEntry(c->mercenaryType, c->mercenaryNameID); | |
152 | + return _getMercName(c->mercenaryType, c->mercenaryNameID); | |
156 | 153 | } |
157 | 154 | |
158 | 155 | const char* getMercType(D2CharHeader* c) { | ... | ... |
d2char.h
... | ... | @@ -3,6 +3,10 @@ |
3 | 3 | |
4 | 4 | #include <stdint.h> |
5 | 5 | #include <stdlib.h> |
6 | +#include <string.h> | |
7 | +#include <time.h> | |
8 | + | |
9 | +#include "d2quest.h" | |
6 | 10 | #include "d2strings.h" |
7 | 11 | |
8 | 12 | #define D2S_HEADER_LENGTH 765 |
... | ... | @@ -13,7 +17,6 @@ |
13 | 17 | #define D2S_HOTKEYS_LENGTH 64 |
14 | 18 | #define D2S_CHAR_APPEARANCE_LENGTH 32 |
15 | 19 | #define D2S_DIFFICULTY_LENGTH 3 |
16 | -#define D2S_QUESTS_LENGTH 298 | |
17 | 20 | #define D2S_WAYPOINTS_LENGTH 81 |
18 | 21 | #define D2S_NPCDATA_LENGTH 51 |
19 | 22 | |
... | ... | @@ -49,10 +52,10 @@ enum D2S_CHARCLASS { |
49 | 52 | |
50 | 53 | enum D2S_ACT { |
51 | 54 | D2S_ACT1 = 0, |
52 | - D2S_ACT2 = 1, | |
53 | - D2S_ACT3 = 2, | |
54 | - D2S_ACT4 = 3, | |
55 | - D2S_ACT5 = 4 | |
55 | + D2S_ACT2, | |
56 | + D2S_ACT3, | |
57 | + D2S_ACT4, | |
58 | + D2S_ACT5 | |
56 | 59 | }; |
57 | 60 | |
58 | 61 | typedef struct __attribute__((packed)){ |
... | ... | @@ -71,7 +74,7 @@ typedef struct __attribute__((packed)){ |
71 | 74 | uint32_t unknown3; // TODO |
72 | 75 | uint32_t lastPlayed; |
73 | 76 | uint32_t unknown4; // TODO |
74 | - uint8_t hotkeys[D2S_HOTKEYS_LENGTH]; // Not implemented. Too bad! | |
77 | + uint8_t hotkeys[D2S_HOTKEYS_LENGTH]; // Not implemented. (Yet) | |
75 | 78 | uint32_t leftAbility; |
76 | 79 | uint32_t rightAbility; |
77 | 80 | uint32_t leftAbilityAlt; // Left ability when alternative weapon set (II) is selected |
... | ... | @@ -86,7 +89,7 @@ typedef struct __attribute__((packed)){ |
86 | 89 | uint16_t mercenaryType; |
87 | 90 | uint32_t mercenaryExp; |
88 | 91 | uint8_t unknown6[144]; // TODO |
89 | - uint8_t questData[D2S_QUESTS_LENGTH]; | |
92 | + D2QuestData questData; | |
90 | 93 | uint8_t waypointData[D2S_WAYPOINTS_LENGTH]; |
91 | 94 | uint8_t NPCIntroductions[D2S_NPCDATA_LENGTH]; // Not implemented. (Yet) |
92 | 95 | } D2CharHeader; | ... | ... |
d2mercs.c
... | ... | @@ -15,6 +15,6 @@ int _getMercType(int mercID) { |
15 | 15 | } |
16 | 16 | |
17 | 17 | const char* _getMercName(int mercID, int mercNameID) { |
18 | - int offset = getMercType(mercID); | |
18 | + int offset = _getMercType(mercID); | |
19 | 19 | return mercNames[mercNameID + offset]; |
20 | 20 | } |
21 | 21 | \ No newline at end of file | ... | ... |
d2quest.c
0 โ 100644
1 | +#include "d2char.h" | |
2 | +#include "d2quest.h" | |
3 | + | |
4 | +void getQuestData_DenOfEvil(D2QuestData* d, int difficulty, void* dest) { | |
5 | + uint16_t questData = d->quests[difficulty].actData[D2S_ACT1].questCheckpoints[0]; | |
6 | + | |
7 | +} | |
8 | + | |
9 | +void getQuestData_SisterBurialGrounds(D2QuestData* d, int difficulty, void* dest) { | |
10 | + | |
11 | +} | |
12 | + | |
13 | +void getQuestData_SearchForCain(D2QuestData* d, int difficulty, void* dest) { | |
14 | + | |
15 | +} | |
16 | + | |
17 | +void getQuestData_ForgottenTower(D2QuestData* d, int difficulty, void* dest) { | |
18 | + | |
19 | +} | |
20 | + | |
21 | +void getQuestData_ToolsOfTheTrade(D2QuestData* d, int difficulty, void* dest) { | |
22 | + | |
23 | +} | |
24 | + | |
25 | +void getQuestData_SistersToTheSlaughter(D2QuestData* d, int difficulty, void* dest) { | |
26 | + | |
27 | +} | |
28 | + | |
29 | +void getQuestData_RadamentLair(D2QuestData* d, int difficulty, void* dest) { | |
30 | + | |
31 | +} | |
32 | + | |
33 | +void getQuestData_HoradricStaff(D2QuestData* d, int difficulty, void* dest) { | |
34 | + | |
35 | +} | |
36 | + | |
37 | +void getQuestData_TaintedSun(D2QuestData* d, int difficulty, void* dest) { | |
38 | + | |
39 | +} | |
40 | + | |
41 | +void getQuestData_ArcaneSanctuary(D2QuestData* d, int difficulty, void* dest) { | |
42 | + | |
43 | +} | |
44 | + | |
45 | +void getQuestData_Summoner(D2QuestData* d, int difficulty, void* dest) { | |
46 | + | |
47 | +} | |
48 | + | |
49 | +void getQuestData_SevenTombs(D2QuestData* d, int difficulty, void* dest) { | |
50 | + | |
51 | +} | |
52 | + | |
53 | +void getQuestData_GoldenBird(D2QuestData* d, int difficulty, void* dest) { | |
54 | + | |
55 | +} | |
56 | + | |
57 | +void getQuestData_BladeOfTheOldReligion(D2QuestData* d, int difficulty, void* dest) { | |
58 | + | |
59 | +} | |
60 | + | |
61 | +void getQuestData_KhalimWill(D2QuestData* d, int difficulty, void* dest) { | |
62 | + | |
63 | +} | |
64 | + | |
65 | +void getQuestData_LamEsenTome(D2QuestData* d, int difficulty, void* dest) { | |
66 | + | |
67 | +} | |
68 | + | |
69 | +void getQuestData_BlackenedTemple(D2QuestData* d, int difficulty, void* dest) { | |
70 | + | |
71 | +} | |
72 | + | |
73 | +void getQuestData_Guardian(D2QuestData* d, int difficulty, void* dest) { | |
74 | + | |
75 | +} | |
76 | + | |
77 | +void getQuestData_FallenAngel(D2QuestData* d, int difficulty, void* dest) { | |
78 | + | |
79 | +} | |
80 | + | |
81 | +void getQuestData_Hellforge(D2QuestData* d, int difficulty, void* dest) { | |
82 | + | |
83 | +} | |
84 | + | |
85 | +void getQuestData_TerrorEnd(D2QuestData* d, int difficulty, void* dest) { | |
86 | + | |
87 | +} | |
88 | + | |
89 | +void getQuestData_SiegeOnHarrogath(D2QuestData* d, int difficulty, void* dest) { | |
90 | + | |
91 | +} | |
92 | + | |
93 | +void getQuestData_RescueOnMountArreat(D2QuestData* d, int difficulty, void* dest) { | |
94 | + | |
95 | +} | |
96 | + | |
97 | +void getQuestData_PrisonOfIce(D2QuestData* d, int difficulty, void* dest) { | |
98 | + | |
99 | +} | |
100 | + | |
101 | +void getQuestData_BetrayalOfHarrogath(D2QuestData* d, int difficulty, void* dest) { | |
102 | + | |
103 | +} | |
104 | + | |
105 | +void getQuestData_RiteOfPassage(D2QuestData* d, int difficulty, void* dest) { | |
106 | + | |
107 | +} | |
108 | + | |
109 | +void getQuestData_EveOfDestruction(D2QuestData* d, int difficulty, void* dest) { | |
110 | + | |
111 | +} | |
112 | + | |
113 | +void(*questFunc[])(D2QuestData*,int,void*) = { | |
114 | + &getQuestData_DenOfEvil, | |
115 | + &getQuestData_SisterBurialGrounds, | |
116 | + &getQuestData_SearchForCain, | |
117 | + &getQuestData_ForgottenTower, | |
118 | + &getQuestData_ToolsOfTheTrade, | |
119 | + &getQuestData_SistersToTheSlaughter, | |
120 | + &getQuestData_RadamentLair, | |
121 | + &getQuestData_HoradricStaff, | |
122 | + &getQuestData_TaintedSun, | |
123 | + &getQuestData_ArcaneSanctuary, | |
124 | + &getQuestData_Summoner, | |
125 | + &getQuestData_SevenTombs, | |
126 | + &getQuestData_GoldenBird, | |
127 | + &getQuestData_BladeOfTheOldReligion, | |
128 | + &getQuestData_KhalimWill, | |
129 | + &getQuestData_LamEsenTome, | |
130 | + &getQuestData_BlackenedTemple, | |
131 | + &getQuestData_Guardian, | |
132 | + &getQuestData_FallenAngel, | |
133 | + &getQuestData_Hellforge, | |
134 | + &getQuestData_TerrorEnd, | |
135 | + &getQuestData_SiegeOnHarrogath, | |
136 | + &getQuestData_RescueOnMountArreat, | |
137 | + &getQuestData_PrisonOfIce, | |
138 | + &getQuestData_BetrayalOfHarrogath, | |
139 | + &getQuestData_RiteOfPassage, | |
140 | + &getQuestData_EveOfDestruction | |
141 | +}; | |
142 | + | |
143 | +int getQuestStatus(D2QuestData* d, unsigned int quest, unsigned int difficulty, void* dest) { | |
144 | + if(quest >= D2S_QUEST_DEN_OF_EVIL && quest <= D2S_QUEST_EVE_OF_DESTRUCTION) { | |
145 | + questFunc[quest](d,difficulty,dest); | |
146 | + } | |
147 | + return D2S_QUEST_UNKNOWN; | |
148 | +} | |
0 | 149 | \ No newline at end of file | ... | ... |
d2quest.h
0 โ 100644
1 | +#ifndef D2QUEST_H | |
2 | +#define D2QUEST_H | |
3 | + | |
4 | +#include <stdint.h> | |
5 | + | |
6 | +#define D2S_QUESTDATA_HEADER_LENGTH 4 | |
7 | + | |
8 | +enum D2S_QUEST { | |
9 | + D2S_QUEST_UNKNOWN = -1, | |
10 | + D2S_QUEST_DEN_OF_EVIL = 0, | |
11 | + D2S_QUEST_SISTER_BURIAL_GROUNDS, | |
12 | + D2S_QUEST_SEARCH_FOR_CAIN, | |
13 | + D2S_QUEST_FORGOTTEN_TOWER, | |
14 | + D2S_QUEST_TOOLS_OF_THE_TRADE, | |
15 | + D2S_QUEST_SISTERS_TO_THE_SLAUGHTER, | |
16 | + D2S_QUEST_RADAMENT_LAIR, | |
17 | + D2S_QUEST_HORADRIC_STAFF, | |
18 | + D2S_QUEST_TAINTED_SUN, | |
19 | + D2S_QUEST_ARCANE_SANCTUARY, | |
20 | + D2S_QUEST_SUMMONER, | |
21 | + D2S_QUEST_SEVEN_TOMBS, | |
22 | + D2S_QUEST_GOLDEN_BIRD, | |
23 | + D2S_QUEST_BLADE_OF_THE_OLD_RELIGION, | |
24 | + D2S_QUEST_KHALIM_WILL, | |
25 | + D2S_QUEST_LAM_ESEN_TOME, | |
26 | + D2S_QUEST_BLACKENED_TEMPLE, | |
27 | + D2S_QUEST_GUARDIAN, | |
28 | + D2S_QUEST_FALLEN_ANGEL, | |
29 | + D2S_QUEST_HELLFORGE, | |
30 | + D2S_QUEST_TERROR_END, | |
31 | + D2S_QUEST_SIEGE_ON_HARROGATH, | |
32 | + D2S_QUEST_RESCUE_ON_MOUNT_ARREAT, | |
33 | + D2S_QUEST_PRISON_OF_ICE, | |
34 | + D2S_QUEST_BETRAYAL_OF_HARROGATH, | |
35 | + D2S_QUEST_RITE_OF_PASSAGE, | |
36 | + D2S_QUEST_EVE_OF_DESTRUCTION | |
37 | +}; | |
38 | + | |
39 | +typedef struct { | |
40 | + int enteredDen; | |
41 | +} D2S_QUEST_DEN_OF_EVIL_struct; | |
42 | + | |
43 | +typedef struct { | |
44 | + int enteredDen; | |
45 | +} D2S_QUEST_SISTER_BURIAL_GROUNDS_struct; | |
46 | + | |
47 | +typedef struct { | |
48 | + int enteredDen; | |
49 | +} D2S_QUEST_SEARCH_FOR_CAIN_struct; | |
50 | + | |
51 | +typedef struct { | |
52 | + int enteredDen; | |
53 | +} D2S_QUEST_FORGOTTEN_TOWER_struct; | |
54 | + | |
55 | +typedef struct { | |
56 | + int enteredDen; | |
57 | +} D2S_QUEST_TOOLS_OF_THE_TRADE_struct; | |
58 | + | |
59 | +typedef struct { | |
60 | + int enteredDen; | |
61 | +} D2S_QUEST_SISTERS_TO_THE_SLAUGHTER_struct; | |
62 | + | |
63 | +typedef struct { | |
64 | + int enteredDen; | |
65 | +} D2S_QUEST_RADAMENT_LAIR_struct; | |
66 | + | |
67 | +typedef struct { | |
68 | + int enteredDen; | |
69 | +} D2S_QUEST_HORADRIC_STAFF_struct; | |
70 | + | |
71 | +typedef struct { | |
72 | + int enteredDen; | |
73 | +} D2S_QUEST_TAINTED_SUN_struct; | |
74 | + | |
75 | +typedef struct { | |
76 | + int enteredDen; | |
77 | +} D2S_QUEST_ARCANE_SANCTUARY_struct; | |
78 | + | |
79 | +typedef struct { | |
80 | + int enteredDen; | |
81 | +} D2S_QUEST_SUMMONER_struct; | |
82 | + | |
83 | +typedef struct { | |
84 | + int enteredDen; | |
85 | +} D2S_QUEST_SEVEN_TOMBS_struct; | |
86 | + | |
87 | +typedef struct { | |
88 | + int enteredDen; | |
89 | +} D2S_QUEST_GOLDEN_BIRD_struct; | |
90 | + | |
91 | +typedef struct { | |
92 | + int enteredDen; | |
93 | +} D2S_QUEST_BLADE_OF_THE_OLD_RELIGION_struct; | |
94 | + | |
95 | +typedef struct { | |
96 | + int enteredDen; | |
97 | +} D2S_QUEST_KHALIM_WILL_struct; | |
98 | + | |
99 | +typedef struct { | |
100 | + int enteredDen; | |
101 | +} D2S_QUEST_LAM_ESEN_TOME_struct; | |
102 | + | |
103 | +typedef struct { | |
104 | + int enteredDen; | |
105 | +} D2S_QUEST_BLACKENED_TEMPLE_struct; | |
106 | + | |
107 | +typedef struct { | |
108 | + int enteredDen; | |
109 | +} D2S_QUEST_GUARDIAN_struct; | |
110 | + | |
111 | +typedef struct { | |
112 | + int enteredDen; | |
113 | +} D2S_QUEST_FALLEN_ANGEL_struct; | |
114 | + | |
115 | +typedef struct { | |
116 | + int enteredDen; | |
117 | +} D2S_QUEST_HELLFORGE_struct; | |
118 | + | |
119 | +typedef struct { | |
120 | + int enteredDen; | |
121 | +} D2S_QUEST_TERROR_END_struct; | |
122 | + | |
123 | +typedef struct { | |
124 | + int enteredDen; | |
125 | +} D2S_QUEST_SIEGE_ON_HARROGATH_struct; | |
126 | + | |
127 | +typedef struct { | |
128 | + int enteredDen; | |
129 | +} D2S_QUEST_RESCUE_ON_MOUNT_ARREAT_struct; | |
130 | + | |
131 | +typedef struct { | |
132 | + int enteredDen; | |
133 | +} D2S_QUEST_PRISON_OF_ICE_struct; | |
134 | + | |
135 | +typedef struct { | |
136 | + int enteredDen; | |
137 | +} D2S_QUEST_BETRAYAL_OF_HARROGATH_struct; | |
138 | + | |
139 | +typedef struct { | |
140 | + int enteredDen; | |
141 | +} D2S_QUEST_RITE_OF_PASSAGE_struct; | |
142 | + | |
143 | +typedef struct { | |
144 | + int enteredDen; | |
145 | +} D2S_QUEST_EVE_OF_DESTRUCTION_struct; | |
146 | + | |
147 | +typedef struct __attribute__((packed)) { | |
148 | + uint16_t actStarted; | |
149 | + uint16_t questCheckpoints[6]; | |
150 | + uint16_t actEnded; | |
151 | +} D2ActData; | |
152 | + | |
153 | +typedef struct __attribute__((packed)) { | |
154 | + uint16_t actStarted; | |
155 | + uint16_t unknown1[2]; | |
156 | + uint16_t questCheckpoints[6]; | |
157 | + uint16_t unknown2[7]; | |
158 | +} D2XActData; | |
159 | + | |
160 | +typedef struct __attribute__((packed)) { | |
161 | + D2ActData actData[4]; | |
162 | + D2XActData expansionAct; | |
163 | +} D2Quests; | |
164 | + | |
165 | +typedef struct __attribute__((packed)) { | |
166 | + const char* header[D2S_QUESTDATA_HEADER_LENGTH]; | |
167 | + uint32_t unknown1; | |
168 | + uint16_t size; // in bytes | |
169 | + D2Quests quests[3]; // 1 set for each difficulty | |
170 | +} D2QuestData; | |
171 | + | |
172 | +// Returns quest status for the specified quest and act. dest must be a struct of the specified | |
173 | +// quest. Passing anything else may cause the program to crash if it doesn't fit into memory :) | |
174 | +int getQuestStatus(D2QuestData* d, unsigned int quest, unsigned int difficulty, void* dest); | |
175 | + | |
176 | +#endif | |
0 | 177 | \ No newline at end of file | ... | ... |