Commit f3914c1253d2137c82a0bb9b08b6f407f2933dc3

Authored by Imanol-Mikel Barba Sabariego
1 parent 86f65f02

Quests WIP

d2char.h
... ... @@ -58,6 +58,7 @@ enum D2S_ACT {
58 58 D2S_ACT5
59 59 };
60 60  
  61 +// TODO: Add file hex offsets for each field
61 62 typedef struct __attribute__((packed)){
62 63 uint32_t signature;
63 64 uint32_t versionID;
... ... @@ -74,7 +75,7 @@ typedef struct __attribute__((packed)){
74 75 uint32_t unknown3; // TODO
75 76 uint32_t lastPlayed;
76 77 uint32_t unknown4; // TODO
77   - uint8_t hotkeys[D2S_HOTKEYS_LENGTH]; // Not implemented. (Yet)
  78 + uint8_t hotkeys[D2S_HOTKEYS_LENGTH]; // TODO: Not implemented
78 79 uint32_t leftAbility;
79 80 uint32_t rightAbility;
80 81 uint32_t leftAbilityAlt; // Left ability when alternative weapon set (II) is selected
... ... @@ -91,7 +92,7 @@ typedef struct __attribute__((packed)){
91 92 uint8_t unknown6[144]; // TODO
92 93 D2QuestData questData;
93 94 uint8_t waypointData[D2S_WAYPOINTS_LENGTH];
94   - uint8_t NPCIntroductions[D2S_NPCDATA_LENGTH]; // Not implemented. (Yet)
  95 + uint8_t NPCIntroductions[D2S_NPCDATA_LENGTH]; // TODO: Not implemented
95 96 } D2CharHeader;
96 97  
97 98 uint32_t calcChecksum(D2CharHeader* c, void* charData);
... ...
d2quest.c
1 1 #include "d2char.h"
2 2 #include "d2quest.h"
3 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   -
  4 +void getCheckpointDescriptions(unsigned int quest, const char* *descriptions[16]) {
  5 + memcpy(descriptions,(&checkpointDescriptions) + (quest * 16 * sizeof(const char*)), 16 * sizeof(const char*));
  6 +}
  7 +
  8 +uint16_t getQuestStatus(D2QuestData* d, unsigned int quest, unsigned int difficulty) {
  9 + if(quest >= D2S_QUEST_DEN_OF_EVIL && quest <= D2S_QUEST_SISTERS_TO_THE_SLAUGHTER) {
  10 + return d->quests[difficulty].actData[D2S_ACT1].questCheckpoints[quest];
  11 + } else if(quest >= D2S_QUEST_RADAMENT_LAIR && quest <= D2S_QUEST_SEVEN_TOMBS) {
  12 + return d->quests[difficulty].actData[D2S_ACT2].questCheckpoints[quest - D2S_QUEST_RADAMENT_LAIR];
  13 + } else if(quest >= D2S_QUEST_GOLDEN_BIRD && quest <= D2S_QUEST_GUARDIAN) {
  14 + return d->quests[difficulty].actData[D2S_ACT3].questCheckpoints[quest - D2S_QUEST_GOLDEN_BIRD];
  15 + } else if(quest >= D2S_QUEST_FALLEN_ANGEL && quest <= D2S_QUEST_TERROR_END) {
  16 + return d->quests[difficulty].actData[D2S_ACT4].questCheckpoints[quest - D2S_QUEST_FALLEN_ANGEL];
  17 + } else if(quest >= D2S_QUEST_SIEGE_ON_HARROGATH && quest <= D2S_QUEST_EVE_OF_DESTRUCTION) {
  18 + return d->quests[difficulty].expansionAct.questCheckpoints[quest - D2S_QUEST_SIEGE_ON_HARROGATH];
  19 + }
  20 + return D2S_QUEST_UNKNOWN;
75 21 }
76 22  
77   -void getQuestData_FallenAngel(D2QuestData* d, int difficulty, void* dest) {
78   -
  23 +int isQuestStarted(D2QuestData* d, unsigned int quest, unsigned int difficulty) {
  24 + // TODO
  25 + return 0;
79 26 }
80 27  
81   -void getQuestData_Hellforge(D2QuestData* d, int difficulty, void* dest) {
82   -
  28 +int isQuestRewardCollected(D2QuestData* d, unsigned int quest, unsigned int difficulty) {
  29 + // TODO
  30 + return 0;
83 31 }
84 32  
85   -void getQuestData_TerrorEnd(D2QuestData* d, int difficulty, void* dest) {
86   -
  33 +int isQuestCompleted(D2QuestData* d, unsigned int quest, unsigned int difficulty) {
  34 + // TODO
  35 + return 0;
87 36 }
88 37  
89   -void getQuestData_SiegeOnHarrogath(D2QuestData* d, int difficulty, void* dest) {
90   -
91   -}
  38 +void setQuestStarted(D2QuestData* d, unsigned int quest, unsigned int difficulty, int bool) {
  39 + // To reset the quest, just zero out the whole thing
  40 + // To set as started, just set the 2nd bit and clear the rest
92 41  
93   -void getQuestData_RescueOnMountArreat(D2QuestData* d, int difficulty, void* dest) {
94   -
  42 + // TODO
95 43 }
96 44  
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   -}
  45 +void setQuestRewardCollected(D2QuestData* d, unsigned int quest, unsigned int difficulty, int bool) {
  46 + // To reset, just clear bit 0 and set bit 1.
  47 + // Do the inverse to set reward as collected (but why whould you tho???)
104 48  
105   -void getQuestData_RiteOfPassage(D2QuestData* d, int difficulty, void* dest) {
106   -
  49 + // TODO
107 50 }
108 51  
109   -void getQuestData_EveOfDestruction(D2QuestData* d, int difficulty, void* dest) {
  52 +void setQuestCompleted(D2QuestData* d, unsigned int quest, unsigned int difficulty, int bool) {
  53 + // To reset, clear bit 0, bit 12 and bit 13 (13 is kinda optional since it will be cleared by
  54 + // the game when loading the savegame).
  55 + // To set as completed, just set bit 0 and bit 12 and clear bit 1
110 56  
  57 + // TODO
111 58 }
112 59  
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);
  60 +int getSpecialQuestStatus(D2QuestData* d, unsigned int specialQuestState, unsigned int difficulty) {
  61 + int ret = 0;
  62 + switch(specialQuestState) {
  63 + case D2S_SPECIALQUEST_AKARA_RESPEC:
  64 + ret = d->quests[difficulty].akaraRespecData & D2S_QUEST_STATUS_REWARD_AVAILABLE;
  65 + break;
  66 + }
  67 + return ret;
  68 +}
  69 +
  70 +void setSpecialQuestStatus(D2QuestData* d, unsigned int specialQuestState, unsigned int difficulty, int bool) {
  71 + switch(specialQuestState) {
  72 + case D2S_SPECIALQUEST_AKARA_RESPEC:
  73 + if(bool) {
  74 + // This operation only makes sense if the quest is actually completed, otherwise ignore request
  75 + if(isQuestCompleted(d,D2S_QUEST_DEN_OF_EVIL,difficulty)) {
  76 + d->quests[difficulty].akaraRespecData = 0x8001;
  77 + }
  78 + } else {
  79 + // See above comment
  80 + if(isQuestCompleted(d,D2S_QUEST_DEN_OF_EVIL,difficulty)) {
  81 + d->quests[difficulty].akaraRespecData = 0x2002;
  82 + }
  83 + }
  84 + break;
146 85 }
147   - return D2S_QUEST_UNKNOWN;
148 86 }
149 87 \ No newline at end of file
... ...
d2quest.h
... ... @@ -3,6 +3,8 @@
3 3  
4 4 #include <stdint.h>
5 5  
  6 +#include "d2strings.h"
  7 +
6 8 #define D2S_QUESTDATA_HEADER_LENGTH 4
7 9  
8 10 enum D2S_QUEST {
... ... @@ -36,113 +38,452 @@ enum D2S_QUEST {
36 38 D2S_QUEST_EVE_OF_DESTRUCTION
37 39 };
38 40  
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;
  41 +enum D2S_QUEST_STATUS {
  42 + D2S_QUEST_STATUS_COMPLETED = 0x0001,
  43 + D2S_QUEST_STATUS_REWARD_AVAILABLE = 0x0002,
  44 + D2S_QUEST_STATUS_STARTED = 0x0004,
  45 + D2S_QUEST_STATUS_SEEN_FINISH_ANIMATION = 0x1000,
  46 + D2S_QUEST_STATUS_JUST_FINISHED = 0x2000
  47 +};
138 48  
139   -typedef struct {
140   - int enteredDen;
141   -} D2S_QUEST_RITE_OF_PASSAGE_struct;
  49 +enum D2S_SPECIALQUEST {
  50 + D2S_SPECIALQUEST_AKARA_RESPEC
  51 +};
142 52  
143   -typedef struct {
144   - int enteredDen;
145   -} D2S_QUEST_EVE_OF_DESTRUCTION_struct;
  53 +const char* const checkpointDescriptions[] = {
  54 + D2S_QUEST_CHECKPOINT_0,
  55 + D2S_QUEST_CHECKPOINT_1,
  56 + D2S_QUEST_CHECKPOINT_2,
  57 + D2S_QUEST_CHECKPOINT_3,
  58 + D2S_QUEST_CHECKPOINT_4,
  59 + D2S_QUEST_CHECKPOINT_5,
  60 + D2S_QUEST_CHECKPOINT_6,
  61 + D2S_QUEST_CHECKPOINT_7,
  62 + D2S_QUEST_CHECKPOINT_8,
  63 + D2S_QUEST_CHECKPOINT_9,
  64 + D2S_QUEST_CHECKPOINT_10,
  65 + D2S_QUEST_CHECKPOINT_11,
  66 + D2S_QUEST_CHECKPOINT_12,
  67 + D2S_QUEST_CHECKPOINT_13,
  68 + D2S_QUEST_CHECKPOINT_14,
  69 + D2S_QUEST_CHECKPOINT_15,
  70 + D2S_QUEST_CHECKPOINT_16,
  71 + D2S_QUEST_CHECKPOINT_17,
  72 + D2S_QUEST_CHECKPOINT_18,
  73 + D2S_QUEST_CHECKPOINT_19,
  74 + D2S_QUEST_CHECKPOINT_20,
  75 + D2S_QUEST_CHECKPOINT_21,
  76 + D2S_QUEST_CHECKPOINT_22,
  77 + D2S_QUEST_CHECKPOINT_23,
  78 + D2S_QUEST_CHECKPOINT_24,
  79 + D2S_QUEST_CHECKPOINT_25,
  80 + D2S_QUEST_CHECKPOINT_26,
  81 + D2S_QUEST_CHECKPOINT_27,
  82 + D2S_QUEST_CHECKPOINT_28,
  83 + D2S_QUEST_CHECKPOINT_29,
  84 + D2S_QUEST_CHECKPOINT_30,
  85 + D2S_QUEST_CHECKPOINT_31,
  86 + D2S_QUEST_CHECKPOINT_32,
  87 + D2S_QUEST_CHECKPOINT_33,
  88 + D2S_QUEST_CHECKPOINT_34,
  89 + D2S_QUEST_CHECKPOINT_35,
  90 + D2S_QUEST_CHECKPOINT_36,
  91 + D2S_QUEST_CHECKPOINT_37,
  92 + D2S_QUEST_CHECKPOINT_38,
  93 + D2S_QUEST_CHECKPOINT_39,
  94 + D2S_QUEST_CHECKPOINT_40,
  95 + D2S_QUEST_CHECKPOINT_41,
  96 + D2S_QUEST_CHECKPOINT_42,
  97 + D2S_QUEST_CHECKPOINT_43,
  98 + D2S_QUEST_CHECKPOINT_44,
  99 + D2S_QUEST_CHECKPOINT_45,
  100 + D2S_QUEST_CHECKPOINT_46,
  101 + D2S_QUEST_CHECKPOINT_47,
  102 + D2S_QUEST_CHECKPOINT_48,
  103 + D2S_QUEST_CHECKPOINT_49,
  104 + D2S_QUEST_CHECKPOINT_50,
  105 + D2S_QUEST_CHECKPOINT_51,
  106 + D2S_QUEST_CHECKPOINT_52,
  107 + D2S_QUEST_CHECKPOINT_53,
  108 + D2S_QUEST_CHECKPOINT_54,
  109 + D2S_QUEST_CHECKPOINT_55,
  110 + D2S_QUEST_CHECKPOINT_56,
  111 + D2S_QUEST_CHECKPOINT_57,
  112 + D2S_QUEST_CHECKPOINT_58,
  113 + D2S_QUEST_CHECKPOINT_59,
  114 + D2S_QUEST_CHECKPOINT_60,
  115 + D2S_QUEST_CHECKPOINT_61,
  116 + D2S_QUEST_CHECKPOINT_62,
  117 + D2S_QUEST_CHECKPOINT_63,
  118 + D2S_QUEST_CHECKPOINT_64,
  119 + D2S_QUEST_CHECKPOINT_65,
  120 + D2S_QUEST_CHECKPOINT_66,
  121 + D2S_QUEST_CHECKPOINT_67,
  122 + D2S_QUEST_CHECKPOINT_68,
  123 + D2S_QUEST_CHECKPOINT_69,
  124 + D2S_QUEST_CHECKPOINT_70,
  125 + D2S_QUEST_CHECKPOINT_71,
  126 + D2S_QUEST_CHECKPOINT_72,
  127 + D2S_QUEST_CHECKPOINT_73,
  128 + D2S_QUEST_CHECKPOINT_74,
  129 + D2S_QUEST_CHECKPOINT_75,
  130 + D2S_QUEST_CHECKPOINT_76,
  131 + D2S_QUEST_CHECKPOINT_77,
  132 + D2S_QUEST_CHECKPOINT_78,
  133 + D2S_QUEST_CHECKPOINT_79,
  134 + D2S_QUEST_CHECKPOINT_80,
  135 + D2S_QUEST_CHECKPOINT_81,
  136 + D2S_QUEST_CHECKPOINT_82,
  137 + D2S_QUEST_CHECKPOINT_83,
  138 + D2S_QUEST_CHECKPOINT_84,
  139 + D2S_QUEST_CHECKPOINT_85,
  140 + D2S_QUEST_CHECKPOINT_86,
  141 + D2S_QUEST_CHECKPOINT_87,
  142 + D2S_QUEST_CHECKPOINT_88,
  143 + D2S_QUEST_CHECKPOINT_89,
  144 + D2S_QUEST_CHECKPOINT_90,
  145 + D2S_QUEST_CHECKPOINT_91,
  146 + D2S_QUEST_CHECKPOINT_92,
  147 + D2S_QUEST_CHECKPOINT_93,
  148 + D2S_QUEST_CHECKPOINT_94,
  149 + D2S_QUEST_CHECKPOINT_95,
  150 + D2S_QUEST_CHECKPOINT_96,
  151 + D2S_QUEST_CHECKPOINT_97,
  152 + D2S_QUEST_CHECKPOINT_98,
  153 + D2S_QUEST_CHECKPOINT_99,
  154 + D2S_QUEST_CHECKPOINT_100,
  155 + D2S_QUEST_CHECKPOINT_101,
  156 + D2S_QUEST_CHECKPOINT_102,
  157 + D2S_QUEST_CHECKPOINT_103,
  158 + D2S_QUEST_CHECKPOINT_104,
  159 + D2S_QUEST_CHECKPOINT_105,
  160 + D2S_QUEST_CHECKPOINT_106,
  161 + D2S_QUEST_CHECKPOINT_107,
  162 + D2S_QUEST_CHECKPOINT_108,
  163 + D2S_QUEST_CHECKPOINT_109,
  164 + D2S_QUEST_CHECKPOINT_110,
  165 + D2S_QUEST_CHECKPOINT_111,
  166 + D2S_QUEST_CHECKPOINT_112,
  167 + D2S_QUEST_CHECKPOINT_113,
  168 + D2S_QUEST_CHECKPOINT_114,
  169 + D2S_QUEST_CHECKPOINT_115,
  170 + D2S_QUEST_CHECKPOINT_116,
  171 + D2S_QUEST_CHECKPOINT_117,
  172 + D2S_QUEST_CHECKPOINT_118,
  173 + D2S_QUEST_CHECKPOINT_119,
  174 + D2S_QUEST_CHECKPOINT_120,
  175 + D2S_QUEST_CHECKPOINT_121,
  176 + D2S_QUEST_CHECKPOINT_122,
  177 + D2S_QUEST_CHECKPOINT_123,
  178 + D2S_QUEST_CHECKPOINT_124,
  179 + D2S_QUEST_CHECKPOINT_125,
  180 + D2S_QUEST_CHECKPOINT_126,
  181 + D2S_QUEST_CHECKPOINT_127,
  182 + D2S_QUEST_CHECKPOINT_128,
  183 + D2S_QUEST_CHECKPOINT_129,
  184 + D2S_QUEST_CHECKPOINT_130,
  185 + D2S_QUEST_CHECKPOINT_131,
  186 + D2S_QUEST_CHECKPOINT_132,
  187 + D2S_QUEST_CHECKPOINT_133,
  188 + D2S_QUEST_CHECKPOINT_134,
  189 + D2S_QUEST_CHECKPOINT_135,
  190 + D2S_QUEST_CHECKPOINT_136,
  191 + D2S_QUEST_CHECKPOINT_137,
  192 + D2S_QUEST_CHECKPOINT_138,
  193 + D2S_QUEST_CHECKPOINT_139,
  194 + D2S_QUEST_CHECKPOINT_140,
  195 + D2S_QUEST_CHECKPOINT_141,
  196 + D2S_QUEST_CHECKPOINT_142,
  197 + D2S_QUEST_CHECKPOINT_143,
  198 + D2S_QUEST_CHECKPOINT_144,
  199 + D2S_QUEST_CHECKPOINT_145,
  200 + D2S_QUEST_CHECKPOINT_146,
  201 + D2S_QUEST_CHECKPOINT_147,
  202 + D2S_QUEST_CHECKPOINT_148,
  203 + D2S_QUEST_CHECKPOINT_149,
  204 + D2S_QUEST_CHECKPOINT_150,
  205 + D2S_QUEST_CHECKPOINT_151,
  206 + D2S_QUEST_CHECKPOINT_152,
  207 + D2S_QUEST_CHECKPOINT_153,
  208 + D2S_QUEST_CHECKPOINT_154,
  209 + D2S_QUEST_CHECKPOINT_155,
  210 + D2S_QUEST_CHECKPOINT_156,
  211 + D2S_QUEST_CHECKPOINT_157,
  212 + D2S_QUEST_CHECKPOINT_158,
  213 + D2S_QUEST_CHECKPOINT_159,
  214 + D2S_QUEST_CHECKPOINT_160,
  215 + D2S_QUEST_CHECKPOINT_161,
  216 + D2S_QUEST_CHECKPOINT_162,
  217 + D2S_QUEST_CHECKPOINT_163,
  218 + D2S_QUEST_CHECKPOINT_164,
  219 + D2S_QUEST_CHECKPOINT_165,
  220 + D2S_QUEST_CHECKPOINT_166,
  221 + D2S_QUEST_CHECKPOINT_167,
  222 + D2S_QUEST_CHECKPOINT_168,
  223 + D2S_QUEST_CHECKPOINT_169,
  224 + D2S_QUEST_CHECKPOINT_170,
  225 + D2S_QUEST_CHECKPOINT_171,
  226 + D2S_QUEST_CHECKPOINT_172,
  227 + D2S_QUEST_CHECKPOINT_173,
  228 + D2S_QUEST_CHECKPOINT_174,
  229 + D2S_QUEST_CHECKPOINT_175,
  230 + D2S_QUEST_CHECKPOINT_176,
  231 + D2S_QUEST_CHECKPOINT_177,
  232 + D2S_QUEST_CHECKPOINT_178,
  233 + D2S_QUEST_CHECKPOINT_179,
  234 + D2S_QUEST_CHECKPOINT_180,
  235 + D2S_QUEST_CHECKPOINT_181,
  236 + D2S_QUEST_CHECKPOINT_182,
  237 + D2S_QUEST_CHECKPOINT_183,
  238 + D2S_QUEST_CHECKPOINT_184,
  239 + D2S_QUEST_CHECKPOINT_185,
  240 + D2S_QUEST_CHECKPOINT_186,
  241 + D2S_QUEST_CHECKPOINT_187,
  242 + D2S_QUEST_CHECKPOINT_188,
  243 + D2S_QUEST_CHECKPOINT_189,
  244 + D2S_QUEST_CHECKPOINT_190,
  245 + D2S_QUEST_CHECKPOINT_191,
  246 + D2S_QUEST_CHECKPOINT_192,
  247 + D2S_QUEST_CHECKPOINT_193,
  248 + D2S_QUEST_CHECKPOINT_194,
  249 + D2S_QUEST_CHECKPOINT_195,
  250 + D2S_QUEST_CHECKPOINT_196,
  251 + D2S_QUEST_CHECKPOINT_197,
  252 + D2S_QUEST_CHECKPOINT_198,
  253 + D2S_QUEST_CHECKPOINT_199,
  254 + D2S_QUEST_CHECKPOINT_200,
  255 + D2S_QUEST_CHECKPOINT_201,
  256 + D2S_QUEST_CHECKPOINT_202,
  257 + D2S_QUEST_CHECKPOINT_203,
  258 + D2S_QUEST_CHECKPOINT_204,
  259 + D2S_QUEST_CHECKPOINT_205,
  260 + D2S_QUEST_CHECKPOINT_206,
  261 + D2S_QUEST_CHECKPOINT_207,
  262 + D2S_QUEST_CHECKPOINT_208,
  263 + D2S_QUEST_CHECKPOINT_209,
  264 + D2S_QUEST_CHECKPOINT_210,
  265 + D2S_QUEST_CHECKPOINT_211,
  266 + D2S_QUEST_CHECKPOINT_212,
  267 + D2S_QUEST_CHECKPOINT_213,
  268 + D2S_QUEST_CHECKPOINT_214,
  269 + D2S_QUEST_CHECKPOINT_215,
  270 + D2S_QUEST_CHECKPOINT_216,
  271 + D2S_QUEST_CHECKPOINT_217,
  272 + D2S_QUEST_CHECKPOINT_218,
  273 + D2S_QUEST_CHECKPOINT_219,
  274 + D2S_QUEST_CHECKPOINT_220,
  275 + D2S_QUEST_CHECKPOINT_221,
  276 + D2S_QUEST_CHECKPOINT_222,
  277 + D2S_QUEST_CHECKPOINT_223,
  278 + D2S_QUEST_CHECKPOINT_224,
  279 + D2S_QUEST_CHECKPOINT_225,
  280 + D2S_QUEST_CHECKPOINT_226,
  281 + D2S_QUEST_CHECKPOINT_227,
  282 + D2S_QUEST_CHECKPOINT_228,
  283 + D2S_QUEST_CHECKPOINT_229,
  284 + D2S_QUEST_CHECKPOINT_230,
  285 + D2S_QUEST_CHECKPOINT_231,
  286 + D2S_QUEST_CHECKPOINT_232,
  287 + D2S_QUEST_CHECKPOINT_233,
  288 + D2S_QUEST_CHECKPOINT_234,
  289 + D2S_QUEST_CHECKPOINT_235,
  290 + D2S_QUEST_CHECKPOINT_236,
  291 + D2S_QUEST_CHECKPOINT_237,
  292 + D2S_QUEST_CHECKPOINT_238,
  293 + D2S_QUEST_CHECKPOINT_239,
  294 + D2S_QUEST_CHECKPOINT_240,
  295 + D2S_QUEST_CHECKPOINT_241,
  296 + D2S_QUEST_CHECKPOINT_242,
  297 + D2S_QUEST_CHECKPOINT_243,
  298 + D2S_QUEST_CHECKPOINT_244,
  299 + D2S_QUEST_CHECKPOINT_245,
  300 + D2S_QUEST_CHECKPOINT_246,
  301 + D2S_QUEST_CHECKPOINT_247,
  302 + D2S_QUEST_CHECKPOINT_248,
  303 + D2S_QUEST_CHECKPOINT_249,
  304 + D2S_QUEST_CHECKPOINT_250,
  305 + D2S_QUEST_CHECKPOINT_251,
  306 + D2S_QUEST_CHECKPOINT_252,
  307 + D2S_QUEST_CHECKPOINT_253,
  308 + D2S_QUEST_CHECKPOINT_254,
  309 + D2S_QUEST_CHECKPOINT_255,
  310 + D2S_QUEST_CHECKPOINT_256,
  311 + D2S_QUEST_CHECKPOINT_257,
  312 + D2S_QUEST_CHECKPOINT_258,
  313 + D2S_QUEST_CHECKPOINT_259,
  314 + D2S_QUEST_CHECKPOINT_260,
  315 + D2S_QUEST_CHECKPOINT_261,
  316 + D2S_QUEST_CHECKPOINT_262,
  317 + D2S_QUEST_CHECKPOINT_263,
  318 + D2S_QUEST_CHECKPOINT_264,
  319 + D2S_QUEST_CHECKPOINT_265,
  320 + D2S_QUEST_CHECKPOINT_266,
  321 + D2S_QUEST_CHECKPOINT_267,
  322 + D2S_QUEST_CHECKPOINT_268,
  323 + D2S_QUEST_CHECKPOINT_269,
  324 + D2S_QUEST_CHECKPOINT_270,
  325 + D2S_QUEST_CHECKPOINT_271,
  326 + D2S_QUEST_CHECKPOINT_272,
  327 + D2S_QUEST_CHECKPOINT_273,
  328 + D2S_QUEST_CHECKPOINT_274,
  329 + D2S_QUEST_CHECKPOINT_275,
  330 + D2S_QUEST_CHECKPOINT_276,
  331 + D2S_QUEST_CHECKPOINT_277,
  332 + D2S_QUEST_CHECKPOINT_278,
  333 + D2S_QUEST_CHECKPOINT_279,
  334 + D2S_QUEST_CHECKPOINT_280,
  335 + D2S_QUEST_CHECKPOINT_281,
  336 + D2S_QUEST_CHECKPOINT_282,
  337 + D2S_QUEST_CHECKPOINT_283,
  338 + D2S_QUEST_CHECKPOINT_284,
  339 + D2S_QUEST_CHECKPOINT_285,
  340 + D2S_QUEST_CHECKPOINT_286,
  341 + D2S_QUEST_CHECKPOINT_287,
  342 + D2S_QUEST_CHECKPOINT_288,
  343 + D2S_QUEST_CHECKPOINT_289,
  344 + D2S_QUEST_CHECKPOINT_290,
  345 + D2S_QUEST_CHECKPOINT_291,
  346 + D2S_QUEST_CHECKPOINT_292,
  347 + D2S_QUEST_CHECKPOINT_293,
  348 + D2S_QUEST_CHECKPOINT_294,
  349 + D2S_QUEST_CHECKPOINT_295,
  350 + D2S_QUEST_CHECKPOINT_296,
  351 + D2S_QUEST_CHECKPOINT_297,
  352 + D2S_QUEST_CHECKPOINT_298,
  353 + D2S_QUEST_CHECKPOINT_299,
  354 + D2S_QUEST_CHECKPOINT_300,
  355 + D2S_QUEST_CHECKPOINT_301,
  356 + D2S_QUEST_CHECKPOINT_302,
  357 + D2S_QUEST_CHECKPOINT_303,
  358 + D2S_QUEST_CHECKPOINT_304,
  359 + D2S_QUEST_CHECKPOINT_305,
  360 + D2S_QUEST_CHECKPOINT_306,
  361 + D2S_QUEST_CHECKPOINT_307,
  362 + D2S_QUEST_CHECKPOINT_308,
  363 + D2S_QUEST_CHECKPOINT_309,
  364 + D2S_QUEST_CHECKPOINT_310,
  365 + D2S_QUEST_CHECKPOINT_311,
  366 + D2S_QUEST_CHECKPOINT_312,
  367 + D2S_QUEST_CHECKPOINT_313,
  368 + D2S_QUEST_CHECKPOINT_314,
  369 + D2S_QUEST_CHECKPOINT_315,
  370 + D2S_QUEST_CHECKPOINT_316,
  371 + D2S_QUEST_CHECKPOINT_317,
  372 + D2S_QUEST_CHECKPOINT_318,
  373 + D2S_QUEST_CHECKPOINT_319,
  374 + D2S_QUEST_CHECKPOINT_320,
  375 + D2S_QUEST_CHECKPOINT_321,
  376 + D2S_QUEST_CHECKPOINT_322,
  377 + D2S_QUEST_CHECKPOINT_323,
  378 + D2S_QUEST_CHECKPOINT_324,
  379 + D2S_QUEST_CHECKPOINT_325,
  380 + D2S_QUEST_CHECKPOINT_326,
  381 + D2S_QUEST_CHECKPOINT_327,
  382 + D2S_QUEST_CHECKPOINT_328,
  383 + D2S_QUEST_CHECKPOINT_329,
  384 + D2S_QUEST_CHECKPOINT_330,
  385 + D2S_QUEST_CHECKPOINT_331,
  386 + D2S_QUEST_CHECKPOINT_332,
  387 + D2S_QUEST_CHECKPOINT_333,
  388 + D2S_QUEST_CHECKPOINT_334,
  389 + D2S_QUEST_CHECKPOINT_335,
  390 + D2S_QUEST_CHECKPOINT_336,
  391 + D2S_QUEST_CHECKPOINT_337,
  392 + D2S_QUEST_CHECKPOINT_338,
  393 + D2S_QUEST_CHECKPOINT_339,
  394 + D2S_QUEST_CHECKPOINT_340,
  395 + D2S_QUEST_CHECKPOINT_341,
  396 + D2S_QUEST_CHECKPOINT_342,
  397 + D2S_QUEST_CHECKPOINT_343,
  398 + D2S_QUEST_CHECKPOINT_344,
  399 + D2S_QUEST_CHECKPOINT_345,
  400 + D2S_QUEST_CHECKPOINT_346,
  401 + D2S_QUEST_CHECKPOINT_347,
  402 + D2S_QUEST_CHECKPOINT_348,
  403 + D2S_QUEST_CHECKPOINT_349,
  404 + D2S_QUEST_CHECKPOINT_350,
  405 + D2S_QUEST_CHECKPOINT_351,
  406 + D2S_QUEST_CHECKPOINT_352,
  407 + D2S_QUEST_CHECKPOINT_353,
  408 + D2S_QUEST_CHECKPOINT_354,
  409 + D2S_QUEST_CHECKPOINT_355,
  410 + D2S_QUEST_CHECKPOINT_356,
  411 + D2S_QUEST_CHECKPOINT_357,
  412 + D2S_QUEST_CHECKPOINT_358,
  413 + D2S_QUEST_CHECKPOINT_359,
  414 + D2S_QUEST_CHECKPOINT_360,
  415 + D2S_QUEST_CHECKPOINT_361,
  416 + D2S_QUEST_CHECKPOINT_362,
  417 + D2S_QUEST_CHECKPOINT_363,
  418 + D2S_QUEST_CHECKPOINT_364,
  419 + D2S_QUEST_CHECKPOINT_365,
  420 + D2S_QUEST_CHECKPOINT_366,
  421 + D2S_QUEST_CHECKPOINT_367,
  422 + D2S_QUEST_CHECKPOINT_368,
  423 + D2S_QUEST_CHECKPOINT_369,
  424 + D2S_QUEST_CHECKPOINT_370,
  425 + D2S_QUEST_CHECKPOINT_371,
  426 + D2S_QUEST_CHECKPOINT_372,
  427 + D2S_QUEST_CHECKPOINT_373,
  428 + D2S_QUEST_CHECKPOINT_374,
  429 + D2S_QUEST_CHECKPOINT_375,
  430 + D2S_QUEST_CHECKPOINT_376,
  431 + D2S_QUEST_CHECKPOINT_377,
  432 + D2S_QUEST_CHECKPOINT_378,
  433 + D2S_QUEST_CHECKPOINT_379,
  434 + D2S_QUEST_CHECKPOINT_380,
  435 + D2S_QUEST_CHECKPOINT_381,
  436 + D2S_QUEST_CHECKPOINT_382,
  437 + D2S_QUEST_CHECKPOINT_383,
  438 + D2S_QUEST_CHECKPOINT_384,
  439 + D2S_QUEST_CHECKPOINT_385,
  440 + D2S_QUEST_CHECKPOINT_386,
  441 + D2S_QUEST_CHECKPOINT_387,
  442 + D2S_QUEST_CHECKPOINT_388,
  443 + D2S_QUEST_CHECKPOINT_389,
  444 + D2S_QUEST_CHECKPOINT_390,
  445 + D2S_QUEST_CHECKPOINT_391,
  446 + D2S_QUEST_CHECKPOINT_392,
  447 + D2S_QUEST_CHECKPOINT_393,
  448 + D2S_QUEST_CHECKPOINT_394,
  449 + D2S_QUEST_CHECKPOINT_395,
  450 + D2S_QUEST_CHECKPOINT_396,
  451 + D2S_QUEST_CHECKPOINT_397,
  452 + D2S_QUEST_CHECKPOINT_398,
  453 + D2S_QUEST_CHECKPOINT_399,
  454 + D2S_QUEST_CHECKPOINT_400,
  455 + D2S_QUEST_CHECKPOINT_401,
  456 + D2S_QUEST_CHECKPOINT_402,
  457 + D2S_QUEST_CHECKPOINT_403,
  458 + D2S_QUEST_CHECKPOINT_404,
  459 + D2S_QUEST_CHECKPOINT_405,
  460 + D2S_QUEST_CHECKPOINT_406,
  461 + D2S_QUEST_CHECKPOINT_407,
  462 + D2S_QUEST_CHECKPOINT_408,
  463 + D2S_QUEST_CHECKPOINT_409,
  464 + D2S_QUEST_CHECKPOINT_410,
  465 + D2S_QUEST_CHECKPOINT_411,
  466 + D2S_QUEST_CHECKPOINT_412,
  467 + D2S_QUEST_CHECKPOINT_413,
  468 + D2S_QUEST_CHECKPOINT_414,
  469 + D2S_QUEST_CHECKPOINT_415,
  470 + D2S_QUEST_CHECKPOINT_416,
  471 + D2S_QUEST_CHECKPOINT_417,
  472 + D2S_QUEST_CHECKPOINT_418,
  473 + D2S_QUEST_CHECKPOINT_419,
  474 + D2S_QUEST_CHECKPOINT_420,
  475 + D2S_QUEST_CHECKPOINT_421,
  476 + D2S_QUEST_CHECKPOINT_422,
  477 + D2S_QUEST_CHECKPOINT_423,
  478 + D2S_QUEST_CHECKPOINT_424,
  479 + D2S_QUEST_CHECKPOINT_425,
  480 + D2S_QUEST_CHECKPOINT_426,
  481 + D2S_QUEST_CHECKPOINT_427,
  482 + D2S_QUEST_CHECKPOINT_428,
  483 + D2S_QUEST_CHECKPOINT_429,
  484 + D2S_QUEST_CHECKPOINT_430,
  485 + D2S_QUEST_CHECKPOINT_431
  486 +};
146 487  
147 488 typedef struct __attribute__((packed)) {
148 489 uint16_t actStarted;
... ... @@ -154,12 +495,13 @@ typedef struct __attribute__((packed)) {
154 495 uint16_t actStarted;
155 496 uint16_t unknown1[2];
156 497 uint16_t questCheckpoints[6];
157   - uint16_t unknown2[7];
158 498 } D2XActData;
159 499  
160 500 typedef struct __attribute__((packed)) {
161 501 D2ActData actData[4];
162 502 D2XActData expansionAct;
  503 + uint16_t akaraRespecData; // This uint16_t determines if the player has used Akara's respec or not
  504 + uint16_t unknown1[6];
163 505 } D2Quests;
164 506  
165 507 typedef struct __attribute__((packed)) {
... ... @@ -169,8 +511,26 @@ typedef struct __attribute__((packed)) {
169 511 D2Quests quests[3]; // 1 set for each difficulty
170 512 } D2QuestData;
171 513  
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);
  514 +// Populates `descriptions` with static strings from library memory, no need to free.
  515 +// `descriptions` contains one string for each bit field of the quest's uint16_t data.
  516 +// Empty entries (non-existant or unknown checkpoints) will have NULL value. Be careful!
  517 +void getCheckpointDescriptions(unsigned int quest, const char* *descriptions[16]);
  518 +
  519 +// Returns quest status for the specified quest and act.
  520 +uint16_t getQuestStatus(D2QuestData* d, unsigned int quest, unsigned int difficulty);
  521 +
  522 +int isQuestStarted(D2QuestData* d, unsigned int quest, unsigned int difficulty);
  523 +int isQuestRewardCollected(D2QuestData* d, unsigned int quest, unsigned int difficulty);
  524 +int isQuestCompleted(D2QuestData* d, unsigned int quest, unsigned int difficulty);
  525 +
  526 +// Set bool to 1 to set the status or 0 to remove it
  527 +void setQuestStarted(D2QuestData* d, unsigned int quest, unsigned int difficulty, int bool);
  528 +void setQuestRewardCollected(D2QuestData* d, unsigned int quest, unsigned int difficulty, int bool);
  529 +void setQuestCompleted(D2QuestData* d, unsigned int quest, unsigned int difficulty, int bool);
  530 +
  531 +// Some quests have extra fields outside their quest data that govern certain states of the quest
  532 +// So far, I only know of the respec that Akara offers when clearing Den of Evil
  533 +int getSpecialQuestStatus(D2QuestData* d, unsigned int specialQuestState, unsigned int difficulty);
  534 +void setSpecialQuestStatus(D2QuestData* d, unsigned int specialQuestState, unsigned int difficulty, int bool);
175 535  
176 536 #endif
177 537 \ No newline at end of file
... ...
d2strings.h
... ... @@ -565,4 +565,474 @@ const char* D2S_CHARPROGRESS_EXPANSION_TIER3_NAME_HARDCORE = &quot;Guardian&quot;;
565 565 #define D2S_MERC_ID_28 "Barbarian [Hell]"
566 566 #define D2S_MERC_ID_29 "Barbarian [Hell]"
567 567  
  568 +// Quest checkpoints
  569 +// Note: Some quests don't have many checkpoints, but unfortunately lots of checkpoints are
  570 +// missing here. Documentation is pretty much scarce and I'm afraid we won't be able to find
  571 +// much unless we go through the arduous process of saving and exit for each step/combination
  572 +// of steps for each quest and check which bits got modified and why. The existing values have
  573 +// been determined by existing sources online and _other methods_ ;)
  574 +// Den of Evil
  575 +#define D2S_QUEST_CHECKPOINT_0 NULL
  576 +#define D2S_QUEST_CHECKPOINT_1 NULL
  577 +#define D2S_QUEST_CHECKPOINT_2 NULL
  578 +#define D2S_QUEST_CHECKPOINT_3 NULL
  579 +#define D2S_QUEST_CHECKPOINT_4 "Entered the Den of Evil"
  580 +#define D2S_QUEST_CHECKPOINT_5 NULL
  581 +#define D2S_QUEST_CHECKPOINT_6 NULL
  582 +#define D2S_QUEST_CHECKPOINT_7 NULL
  583 +#define D2S_QUEST_CHECKPOINT_8 NULL
  584 +#define D2S_QUEST_CHECKPOINT_9 NULL
  585 +#define D2S_QUEST_CHECKPOINT_10 NULL
  586 +#define D2S_QUEST_CHECKPOINT_11 NULL
  587 +#define D2S_QUEST_CHECKPOINT_12 NULL
  588 +#define D2S_QUEST_CHECKPOINT_13 NULL
  589 +#define D2S_QUEST_CHECKPOINT_14 NULL
  590 +#define D2S_QUEST_CHECKPOINT_15 NULL
  591 +// Sister's Burial Grounds
  592 +#define D2S_QUEST_CHECKPOINT_16 NULL
  593 +#define D2S_QUEST_CHECKPOINT_17 NULL
  594 +#define D2S_QUEST_CHECKPOINT_18 NULL
  595 +#define D2S_QUEST_CHECKPOINT_19 NULL
  596 +#define D2S_QUEST_CHECKPOINT_20 "Entered the Burial Grounds"
  597 +#define D2S_QUEST_CHECKPOINT_21 NULL
  598 +#define D2S_QUEST_CHECKPOINT_22 NULL
  599 +#define D2S_QUEST_CHECKPOINT_23 NULL
  600 +#define D2S_QUEST_CHECKPOINT_24 NULL
  601 +#define D2S_QUEST_CHECKPOINT_25 NULL
  602 +#define D2S_QUEST_CHECKPOINT_26 NULL
  603 +#define D2S_QUEST_CHECKPOINT_27 NULL
  604 +#define D2S_QUEST_CHECKPOINT_28 NULL
  605 +#define D2S_QUEST_CHECKPOINT_29 NULL
  606 +#define D2S_QUEST_CHECKPOINT_30 NULL
  607 +#define D2S_QUEST_CHECKPOINT_31 NULL
  608 +// Tools of the Trade
  609 +#define D2S_QUEST_CHECKPOINT_32 NULL
  610 +#define D2S_QUEST_CHECKPOINT_33 NULL
  611 +#define D2S_QUEST_CHECKPOINT_34 NULL
  612 +#define D2S_QUEST_CHECKPOINT_35 NULL
  613 +#define D2S_QUEST_CHECKPOINT_36 NULL
  614 +#define D2S_QUEST_CHECKPOINT_37 NULL
  615 +#define D2S_QUEST_CHECKPOINT_38 "Picked the Horadric Malus"
  616 +#define D2S_QUEST_CHECKPOINT_39 NULL
  617 +#define D2S_QUEST_CHECKPOINT_40 NULL
  618 +#define D2S_QUEST_CHECKPOINT_41 NULL
  619 +#define D2S_QUEST_CHECKPOINT_42 NULL
  620 +#define D2S_QUEST_CHECKPOINT_43 NULL
  621 +#define D2S_QUEST_CHECKPOINT_44 NULL
  622 +#define D2S_QUEST_CHECKPOINT_45 NULL
  623 +#define D2S_QUEST_CHECKPOINT_46 NULL
  624 +#define D2S_QUEST_CHECKPOINT_47 NULL
  625 +// The Search for Cain
  626 +#define D2S_QUEST_CHECKPOINT_48 NULL
  627 +#define D2S_QUEST_CHECKPOINT_49 NULL
  628 +#define D2S_QUEST_CHECKPOINT_50 NULL
  629 +#define D2S_QUEST_CHECKPOINT_51 NULL
  630 +#define D2S_QUEST_CHECKPOINT_52 "Entered Tristram"
  631 +#define D2S_QUEST_CHECKPOINT_53 NULL
  632 +#define D2S_QUEST_CHECKPOINT_54 NULL
  633 +#define D2S_QUEST_CHECKPOINT_55 NULL
  634 +#define D2S_QUEST_CHECKPOINT_56 NULL
  635 +#define D2S_QUEST_CHECKPOINT_57 NULL
  636 +#define D2S_QUEST_CHECKPOINT_58 "Completed the Secret Cow Level" // Moo!
  637 +#define D2S_QUEST_CHECKPOINT_59 NULL
  638 +#define D2S_QUEST_CHECKPOINT_60 NULL
  639 +#define D2S_QUEST_CHECKPOINT_61 NULL
  640 +#define D2S_QUEST_CHECKPOINT_62 "The Rogues rescued Deckard Cain"
  641 +#define D2S_QUEST_CHECKPOINT_63 NULL
  642 +// The Forgotten Tower
  643 +#define D2S_QUEST_CHECKPOINT_64 NULL
  644 +#define D2S_QUEST_CHECKPOINT_65 NULL
  645 +#define D2S_QUEST_CHECKPOINT_66 "Read the Moldy Tome"
  646 +#define D2S_QUEST_CHECKPOINT_67 NULL
  647 +#define D2S_QUEST_CHECKPOINT_68 NULL
  648 +#define D2S_QUEST_CHECKPOINT_69 NULL
  649 +#define D2S_QUEST_CHECKPOINT_70 "Entered the Forgotten Tower"
  650 +#define D2S_QUEST_CHECKPOINT_71 NULL
  651 +#define D2S_QUEST_CHECKPOINT_72 NULL
  652 +#define D2S_QUEST_CHECKPOINT_73 NULL
  653 +#define D2S_QUEST_CHECKPOINT_74 NULL
  654 +#define D2S_QUEST_CHECKPOINT_75 NULL
  655 +#define D2S_QUEST_CHECKPOINT_76 NULL
  656 +#define D2S_QUEST_CHECKPOINT_77 NULL
  657 +#define D2S_QUEST_CHECKPOINT_78 NULL
  658 +#define D2S_QUEST_CHECKPOINT_79 NULL
  659 +// Sisters to the Slaughter
  660 +#define D2S_QUEST_CHECKPOINT_80 NULL
  661 +#define D2S_QUEST_CHECKPOINT_81 NULL
  662 +#define D2S_QUEST_CHECKPOINT_82 NULL
  663 +#define D2S_QUEST_CHECKPOINT_83 NULL
  664 +#define D2S_QUEST_CHECKPOINT_84 NULL
  665 +#define D2S_QUEST_CHECKPOINT_85 NULL
  666 +#define D2S_QUEST_CHECKPOINT_86 NULL
  667 +#define D2S_QUEST_CHECKPOINT_87 NULL
  668 +#define D2S_QUEST_CHECKPOINT_88 NULL
  669 +#define D2S_QUEST_CHECKPOINT_89 NULL
  670 +#define D2S_QUEST_CHECKPOINT_90 NULL
  671 +#define D2S_QUEST_CHECKPOINT_91 NULL
  672 +#define D2S_QUEST_CHECKPOINT_92 NULL
  673 +#define D2S_QUEST_CHECKPOINT_93 NULL
  674 +#define D2S_QUEST_CHECKPOINT_94 NULL
  675 +#define D2S_QUEST_CHECKPOINT_95 NULL
  676 +// Radament's Lair
  677 +#define D2S_QUEST_CHECKPOINT_96 NULL
  678 +#define D2S_QUEST_CHECKPOINT_97 NULL
  679 +#define D2S_QUEST_CHECKPOINT_98 NULL
  680 +#define D2S_QUEST_CHECKPOINT_99 NULL
  681 +#define D2S_QUEST_CHECKPOINT_100 "Found Radament"
  682 +#define D2S_QUEST_CHECKPOINT_101 NULL
  683 +#define D2S_QUEST_CHECKPOINT_102 NULL
  684 +#define D2S_QUEST_CHECKPOINT_103 NULL
  685 +#define D2S_QUEST_CHECKPOINT_104 NULL
  686 +#define D2S_QUEST_CHECKPOINT_105 NULL
  687 +#define D2S_QUEST_CHECKPOINT_106 NULL
  688 +#define D2S_QUEST_CHECKPOINT_107 NULL
  689 +#define D2S_QUEST_CHECKPOINT_108 NULL
  690 +#define D2S_QUEST_CHECKPOINT_109 NULL
  691 +#define D2S_QUEST_CHECKPOINT_110 NULL
  692 +#define D2S_QUEST_CHECKPOINT_111 NULL
  693 +// The Horadric Staff
  694 +#define D2S_QUEST_CHECKPOINT_112 NULL
  695 +#define D2S_QUEST_CHECKPOINT_113 NULL
  696 +#define D2S_QUEST_CHECKPOINT_114 NULL
  697 +#define D2S_QUEST_CHECKPOINT_115 NULL
  698 +#define D2S_QUEST_CHECKPOINT_116 "Spoke to Cain about the Viper Amulet"
  699 +#define D2S_QUEST_CHECKPOINT_117 "Spoke to Cain about the Staff of Kings"
  700 +#define D2S_QUEST_CHECKPOINT_118 NULL
  701 +#define D2S_QUEST_CHECKPOINT_119 NULL
  702 +#define D2S_QUEST_CHECKPOINT_120 NULL
  703 +#define D2S_QUEST_CHECKPOINT_121 NULL
  704 +#define D2S_QUEST_CHECKPOINT_122 "Spoke to Cain about the Horadric Staff"
  705 +#define D2S_QUEST_CHECKPOINT_123 "You crafted the Horadric Staff"
  706 +#define D2S_QUEST_CHECKPOINT_124 NULL
  707 +#define D2S_QUEST_CHECKPOINT_125 NULL
  708 +#define D2S_QUEST_CHECKPOINT_126 NULL
  709 +#define D2S_QUEST_CHECKPOINT_127 NULL
  710 +// Tainted Sun
  711 +#define D2S_QUEST_CHECKPOINT_128 NULL
  712 +#define D2S_QUEST_CHECKPOINT_129 NULL
  713 +#define D2S_QUEST_CHECKPOINT_130 "The sun is eclipsed"
  714 +#define D2S_QUEST_CHECKPOINT_131 "Spoke to Drognan about the eclipse"
  715 +#define D2S_QUEST_CHECKPOINT_132 NULL
  716 +#define D2S_QUEST_CHECKPOINT_133 NULL
  717 +#define D2S_QUEST_CHECKPOINT_134 NULL
  718 +#define D2S_QUEST_CHECKPOINT_135 NULL
  719 +#define D2S_QUEST_CHECKPOINT_136 NULL
  720 +#define D2S_QUEST_CHECKPOINT_137 NULL
  721 +#define D2S_QUEST_CHECKPOINT_138 NULL
  722 +#define D2S_QUEST_CHECKPOINT_139 NULL
  723 +#define D2S_QUEST_CHECKPOINT_140 NULL
  724 +#define D2S_QUEST_CHECKPOINT_141 NULL
  725 +#define D2S_QUEST_CHECKPOINT_142 NULL
  726 +#define D2S_QUEST_CHECKPOINT_143 NULL
  727 +// Arcane Sanctuary
  728 +#define D2S_QUEST_CHECKPOINT_144 NULL
  729 +#define D2S_QUEST_CHECKPOINT_145 NULL
  730 +#define D2S_QUEST_CHECKPOINT_146 NULL
  731 +#define D2S_QUEST_CHECKPOINT_147 NULL
  732 +#define D2S_QUEST_CHECKPOINT_148 NULL
  733 +#define D2S_QUEST_CHECKPOINT_149 NULL
  734 +#define D2S_QUEST_CHECKPOINT_150 NULL
  735 +#define D2S_QUEST_CHECKPOINT_151 NULL
  736 +#define D2S_QUEST_CHECKPOINT_152 NULL
  737 +#define D2S_QUEST_CHECKPOINT_153 NULL
  738 +#define D2S_QUEST_CHECKPOINT_154 NULL
  739 +#define D2S_QUEST_CHECKPOINT_155 NULL
  740 +#define D2S_QUEST_CHECKPOINT_156 NULL
  741 +#define D2S_QUEST_CHECKPOINT_157 NULL
  742 +#define D2S_QUEST_CHECKPOINT_158 NULL
  743 +#define D2S_QUEST_CHECKPOINT_159 NULL
  744 +// The Summoner
  745 +#define D2S_QUEST_CHECKPOINT_160 NULL
  746 +#define D2S_QUEST_CHECKPOINT_161 NULL
  747 +#define D2S_QUEST_CHECKPOINT_162 NULL
  748 +#define D2S_QUEST_CHECKPOINT_163 NULL
  749 +#define D2S_QUEST_CHECKPOINT_164 NULL
  750 +#define D2S_QUEST_CHECKPOINT_165 NULL
  751 +#define D2S_QUEST_CHECKPOINT_166 NULL
  752 +#define D2S_QUEST_CHECKPOINT_167 NULL
  753 +#define D2S_QUEST_CHECKPOINT_168 NULL
  754 +#define D2S_QUEST_CHECKPOINT_169 NULL
  755 +#define D2S_QUEST_CHECKPOINT_170 NULL
  756 +#define D2S_QUEST_CHECKPOINT_171 NULL
  757 +#define D2S_QUEST_CHECKPOINT_172 NULL
  758 +#define D2S_QUEST_CHECKPOINT_173 NULL
  759 +#define D2S_QUEST_CHECKPOINT_174 NULL
  760 +#define D2S_QUEST_CHECKPOINT_175 NULL
  761 +// The Seven Tombs
  762 +#define D2S_QUEST_CHECKPOINT_176 NULL
  763 +#define D2S_QUEST_CHECKPOINT_177 NULL
  764 +#define D2S_QUEST_CHECKPOINT_178 NULL
  765 +#define D2S_QUEST_CHECKPOINT_179 "Spoke to Tyrael"
  766 +#define D2S_QUEST_CHECKPOINT_180 "Spoke to Jerhyn (after killing Duriel)"
  767 +#define D2S_QUEST_CHECKPOINT_181 "Killed Duriel"
  768 +#define D2S_QUEST_CHECKPOINT_182 "Atma congratulated you"
  769 +#define D2S_QUEST_CHECKPOINT_183 "Warriv congratulated you"
  770 +#define D2S_QUEST_CHECKPOINT_184 "Spoke to Drognan"
  771 +#define D2S_QUEST_CHECKPOINT_185 "Spoke to Lysander"
  772 +#define D2S_QUEST_CHECKPOINT_186 "Spoke to Cain"
  773 +#define D2S_QUEST_CHECKPOINT_187 "Spoke to Fara"
  774 +#define D2S_QUEST_CHECKPOINT_188 NULL
  775 +#define D2S_QUEST_CHECKPOINT_189 NULL
  776 +#define D2S_QUEST_CHECKPOINT_190 NULL
  777 +#define D2S_QUEST_CHECKPOINT_191 NULL
  778 +// Lam Esen's Tome
  779 +#define D2S_QUEST_CHECKPOINT_192 NULL
  780 +#define D2S_QUEST_CHECKPOINT_193 NULL
  781 +#define D2S_QUEST_CHECKPOINT_194 NULL
  782 +#define D2S_QUEST_CHECKPOINT_195 NULL
  783 +#define D2S_QUEST_CHECKPOINT_196 NULL
  784 +#define D2S_QUEST_CHECKPOINT_197 NULL
  785 +#define D2S_QUEST_CHECKPOINT_198 NULL
  786 +#define D2S_QUEST_CHECKPOINT_199 NULL
  787 +#define D2S_QUEST_CHECKPOINT_200 NULL
  788 +#define D2S_QUEST_CHECKPOINT_201 NULL
  789 +#define D2S_QUEST_CHECKPOINT_202 NULL
  790 +#define D2S_QUEST_CHECKPOINT_203 NULL
  791 +#define D2S_QUEST_CHECKPOINT_204 NULL
  792 +#define D2S_QUEST_CHECKPOINT_205 NULL
  793 +#define D2S_QUEST_CHECKPOINT_206 NULL
  794 +#define D2S_QUEST_CHECKPOINT_207 NULL
  795 +// Khalim's Will
  796 +#define D2S_QUEST_CHECKPOINT_208 NULL
  797 +#define D2S_QUEST_CHECKPOINT_209 NULL
  798 +#define D2S_QUEST_CHECKPOINT_210 NULL
  799 +#define D2S_QUEST_CHECKPOINT_211 NULL
  800 +#define D2S_QUEST_CHECKPOINT_212 NULL
  801 +#define D2S_QUEST_CHECKPOINT_213 NULL
  802 +#define D2S_QUEST_CHECKPOINT_214 NULL
  803 +#define D2S_QUEST_CHECKPOINT_215 NULL
  804 +#define D2S_QUEST_CHECKPOINT_216 NULL
  805 +#define D2S_QUEST_CHECKPOINT_217 NULL
  806 +#define D2S_QUEST_CHECKPOINT_218 NULL
  807 +#define D2S_QUEST_CHECKPOINT_219 NULL
  808 +#define D2S_QUEST_CHECKPOINT_220 NULL
  809 +#define D2S_QUEST_CHECKPOINT_221 NULL
  810 +#define D2S_QUEST_CHECKPOINT_222 NULL
  811 +#define D2S_QUEST_CHECKPOINT_223 NULL
  812 +// Blade of the Old Religion
  813 +#define D2S_QUEST_CHECKPOINT_224 NULL
  814 +#define D2S_QUEST_CHECKPOINT_225 NULL
  815 +#define D2S_QUEST_CHECKPOINT_226 "Picked the Gidbinn"
  816 +#define D2S_QUEST_CHECKPOINT_227 "Hratli asked you to find the Gidbinn"
  817 +#define D2S_QUEST_CHECKPOINT_228 NULL
  818 +#define D2S_QUEST_CHECKPOINT_229 NULL
  819 +#define D2S_QUEST_CHECKPOINT_230 NULL
  820 +#define D2S_QUEST_CHECKPOINT_231 NULL
  821 +#define D2S_QUEST_CHECKPOINT_232 NULL
  822 +#define D2S_QUEST_CHECKPOINT_233 NULL
  823 +#define D2S_QUEST_CHECKPOINT_234 NULL
  824 +#define D2S_QUEST_CHECKPOINT_235 NULL
  825 +#define D2S_QUEST_CHECKPOINT_236 NULL
  826 +#define D2S_QUEST_CHECKPOINT_237 NULL
  827 +#define D2S_QUEST_CHECKPOINT_238 NULL
  828 +#define D2S_QUEST_CHECKPOINT_239 NULL
  829 +// The Golden Bird
  830 +#define D2S_QUEST_CHECKPOINT_240 NULL
  831 +#define D2S_QUEST_CHECKPOINT_241 NULL
  832 +#define D2S_QUEST_CHECKPOINT_242 "Spoke to Cain about the Jade Figurine"
  833 +#define D2S_QUEST_CHECKPOINT_243 NULL
  834 +#define D2S_QUEST_CHECKPOINT_244 "Spoke to Cain about the Golden Bird"
  835 +// This is cleared when you drink it, to avoid players from cloning the item and drinking it more than once
  836 +#define D2S_QUEST_CHECKPOINT_245 "Alkor gave you the Potion of Life"
  837 +#define D2S_QUEST_CHECKPOINT_246 "Found the Jade Figurine"
  838 +#define D2S_QUEST_CHECKPOINT_247 NULL
  839 +#define D2S_QUEST_CHECKPOINT_248 NULL
  840 +#define D2S_QUEST_CHECKPOINT_249 NULL
  841 +#define D2S_QUEST_CHECKPOINT_250 NULL
  842 +#define D2S_QUEST_CHECKPOINT_251 NULL
  843 +#define D2S_QUEST_CHECKPOINT_252 NULL
  844 +#define D2S_QUEST_CHECKPOINT_253 NULL
  845 +#define D2S_QUEST_CHECKPOINT_254 NULL
  846 +#define D2S_QUEST_CHECKPOINT_255 NULL
  847 +// The Blackened Temple
  848 +#define D2S_QUEST_CHECKPOINT_256 NULL
  849 +#define D2S_QUEST_CHECKPOINT_257 NULL
  850 +#define D2S_QUEST_CHECKPOINT_258 NULL
  851 +#define D2S_QUEST_CHECKPOINT_259 NULL
  852 +#define D2S_QUEST_CHECKPOINT_260 NULL
  853 +#define D2S_QUEST_CHECKPOINT_261 NULL
  854 +#define D2S_QUEST_CHECKPOINT_262 NULL
  855 +#define D2S_QUEST_CHECKPOINT_263 NULL
  856 +#define D2S_QUEST_CHECKPOINT_264 NULL
  857 +#define D2S_QUEST_CHECKPOINT_265 NULL
  858 +#define D2S_QUEST_CHECKPOINT_266 NULL
  859 +#define D2S_QUEST_CHECKPOINT_267 NULL
  860 +#define D2S_QUEST_CHECKPOINT_268 NULL
  861 +#define D2S_QUEST_CHECKPOINT_269 NULL
  862 +#define D2S_QUEST_CHECKPOINT_270 NULL
  863 +#define D2S_QUEST_CHECKPOINT_271 NULL
  864 +// The Guardian
  865 +#define D2S_QUEST_CHECKPOINT_272 NULL
  866 +#define D2S_QUEST_CHECKPOINT_273 NULL
  867 +#define D2S_QUEST_CHECKPOINT_274 NULL
  868 +#define D2S_QUEST_CHECKPOINT_275 NULL
  869 +#define D2S_QUEST_CHECKPOINT_276 NULL
  870 +#define D2S_QUEST_CHECKPOINT_277 NULL
  871 +#define D2S_QUEST_CHECKPOINT_278 NULL
  872 +#define D2S_QUEST_CHECKPOINT_279 NULL
  873 +#define D2S_QUEST_CHECKPOINT_280 NULL
  874 +#define D2S_QUEST_CHECKPOINT_281 NULL
  875 +#define D2S_QUEST_CHECKPOINT_282 NULL
  876 +#define D2S_QUEST_CHECKPOINT_283 NULL
  877 +#define D2S_QUEST_CHECKPOINT_284 NULL
  878 +#define D2S_QUEST_CHECKPOINT_285 NULL
  879 +#define D2S_QUEST_CHECKPOINT_286 NULL
  880 +#define D2S_QUEST_CHECKPOINT_287 NULL
  881 +// The Fallen Angel
  882 +#define D2S_QUEST_CHECKPOINT_288 NULL
  883 +#define D2S_QUEST_CHECKPOINT_289 NULL
  884 +#define D2S_QUEST_CHECKPOINT_290 NULL
  885 +#define D2S_QUEST_CHECKPOINT_291 NULL
  886 +#define D2S_QUEST_CHECKPOINT_292 NULL
  887 +#define D2S_QUEST_CHECKPOINT_293 NULL
  888 +#define D2S_QUEST_CHECKPOINT_294 NULL
  889 +#define D2S_QUEST_CHECKPOINT_295 NULL
  890 +#define D2S_QUEST_CHECKPOINT_296 NULL
  891 +#define D2S_QUEST_CHECKPOINT_297 NULL
  892 +#define D2S_QUEST_CHECKPOINT_298 NULL
  893 +#define D2S_QUEST_CHECKPOINT_299 NULL
  894 +#define D2S_QUEST_CHECKPOINT_300 NULL
  895 +#define D2S_QUEST_CHECKPOINT_301 NULL
  896 +#define D2S_QUEST_CHECKPOINT_302 NULL
  897 +#define D2S_QUEST_CHECKPOINT_303 NULL
  898 +// Terror's End
  899 +#define D2S_QUEST_CHECKPOINT_304 NULL
  900 +#define D2S_QUEST_CHECKPOINT_305 NULL
  901 +#define D2S_QUEST_CHECKPOINT_306 NULL
  902 +#define D2S_QUEST_CHECKPOINT_307 NULL
  903 +#define D2S_QUEST_CHECKPOINT_308 NULL
  904 +#define D2S_QUEST_CHECKPOINT_309 NULL
  905 +#define D2S_QUEST_CHECKPOINT_310 NULL
  906 +#define D2S_QUEST_CHECKPOINT_311 NULL
  907 +#define D2S_QUEST_CHECKPOINT_312 NULL
  908 +#define D2S_QUEST_CHECKPOINT_313 NULL
  909 +#define D2S_QUEST_CHECKPOINT_314 NULL
  910 +#define D2S_QUEST_CHECKPOINT_315 NULL
  911 +#define D2S_QUEST_CHECKPOINT_316 NULL
  912 +#define D2S_QUEST_CHECKPOINT_317 NULL
  913 +#define D2S_QUEST_CHECKPOINT_318 NULL
  914 +#define D2S_QUEST_CHECKPOINT_319 NULL
  915 +// Hell's Forge
  916 +#define D2S_QUEST_CHECKPOINT_320 NULL
  917 +#define D2S_QUEST_CHECKPOINT_321 NULL
  918 +#define D2S_QUEST_CHECKPOINT_322 NULL
  919 +#define D2S_QUEST_CHECKPOINT_323 NULL
  920 +#define D2S_QUEST_CHECKPOINT_324 NULL
  921 +#define D2S_QUEST_CHECKPOINT_325 NULL
  922 +#define D2S_QUEST_CHECKPOINT_326 NULL
  923 +#define D2S_QUEST_CHECKPOINT_327 NULL
  924 +#define D2S_QUEST_CHECKPOINT_328 NULL
  925 +#define D2S_QUEST_CHECKPOINT_329 NULL
  926 +#define D2S_QUEST_CHECKPOINT_330 NULL
  927 +#define D2S_QUEST_CHECKPOINT_331 NULL
  928 +#define D2S_QUEST_CHECKPOINT_332 NULL
  929 +#define D2S_QUEST_CHECKPOINT_333 NULL
  930 +#define D2S_QUEST_CHECKPOINT_334 NULL
  931 +#define D2S_QUEST_CHECKPOINT_335 NULL
  932 +// Siege on Harrogath
  933 +#define D2S_QUEST_CHECKPOINT_336 NULL
  934 +#define D2S_QUEST_CHECKPOINT_337 NULL
  935 +#define D2S_QUEST_CHECKPOINT_338 NULL
  936 +// Apparently, this one is cleared after you kill him AND speak to Larzuk, at which point, bit 5 is set
  937 +#define D2S_QUEST_CHECKPOINT_339 "Found Shenk the Overseer"
  938 +#define D2S_QUEST_CHECKPOINT_340 NULL
  939 +#define D2S_QUEST_CHECKPOINT_341 "Larzuk offers to socket an item"
  940 +#define D2S_QUEST_CHECKPOINT_342 NULL
  941 +#define D2S_QUEST_CHECKPOINT_343 NULL
  942 +#define D2S_QUEST_CHECKPOINT_344 NULL
  943 +#define D2S_QUEST_CHECKPOINT_345 NULL
  944 +#define D2S_QUEST_CHECKPOINT_346 NULL
  945 +#define D2S_QUEST_CHECKPOINT_347 NULL
  946 +#define D2S_QUEST_CHECKPOINT_348 NULL
  947 +#define D2S_QUEST_CHECKPOINT_349 NULL
  948 +#define D2S_QUEST_CHECKPOINT_350 NULL
  949 +#define D2S_QUEST_CHECKPOINT_351 NULL
  950 +// Rescue on Mount Arreat
  951 +#define D2S_QUEST_CHECKPOINT_352 NULL
  952 +#define D2S_QUEST_CHECKPOINT_353 NULL
  953 +#define D2S_QUEST_CHECKPOINT_354 NULL
  954 +#define D2S_QUEST_CHECKPOINT_355 NULL
  955 +#define D2S_QUEST_CHECKPOINT_356 NULL
  956 +#define D2S_QUEST_CHECKPOINT_357 NULL
  957 +#define D2S_QUEST_CHECKPOINT_358 NULL
  958 +#define D2S_QUEST_CHECKPOINT_359 NULL
  959 +#define D2S_QUEST_CHECKPOINT_360 NULL
  960 +#define D2S_QUEST_CHECKPOINT_361 NULL
  961 +#define D2S_QUEST_CHECKPOINT_362 NULL
  962 +#define D2S_QUEST_CHECKPOINT_363 NULL
  963 +#define D2S_QUEST_CHECKPOINT_364 NULL
  964 +#define D2S_QUEST_CHECKPOINT_365 NULL
  965 +#define D2S_QUEST_CHECKPOINT_366 NULL
  966 +#define D2S_QUEST_CHECKPOINT_367 NULL
  967 +// Prison of Ice
  968 +#define D2S_QUEST_CHECKPOINT_368 NULL
  969 +#define D2S_QUEST_CHECKPOINT_369 NULL
  970 +#define D2S_QUEST_CHECKPOINT_370 NULL
  971 +#define D2S_QUEST_CHECKPOINT_371 NULL
  972 +#define D2S_QUEST_CHECKPOINT_372 NULL
  973 +#define D2S_QUEST_CHECKPOINT_373 NULL
  974 +#define D2S_QUEST_CHECKPOINT_374 NULL
  975 +// This is necessary to correctly calculate the player's resistances, as these are not stored anywhere,
  976 +// but determined from current equipment and this bit
  977 +#define D2S_QUEST_CHECKPOINT_375 "You read the Scroll of Resistance"
  978 +#define D2S_QUEST_CHECKPOINT_376 "Rescued Anya and talked to Malah"
  979 +#define D2S_QUEST_CHECKPOINT_377 NULL
  980 +#define D2S_QUEST_CHECKPOINT_378 NULL
  981 +#define D2S_QUEST_CHECKPOINT_379 NULL
  982 +#define D2S_QUEST_CHECKPOINT_380 NULL
  983 +#define D2S_QUEST_CHECKPOINT_381 NULL
  984 +#define D2S_QUEST_CHECKPOINT_382 NULL
  985 +#define D2S_QUEST_CHECKPOINT_383 NULL
  986 +// Betrayal of Harrogath
  987 +#define D2S_QUEST_CHECKPOINT_384 NULL
  988 +#define D2S_QUEST_CHECKPOINT_385 NULL
  989 +#define D2S_QUEST_CHECKPOINT_386 NULL
  990 +#define D2S_QUEST_CHECKPOINT_387 NULL
  991 +#define D2S_QUEST_CHECKPOINT_388 "Anya offers to personalise an item for you"
  992 +#define D2S_QUEST_CHECKPOINT_389 NULL
  993 +#define D2S_QUEST_CHECKPOINT_390 NULL
  994 +#define D2S_QUEST_CHECKPOINT_391 NULL
  995 +#define D2S_QUEST_CHECKPOINT_392 NULL
  996 +#define D2S_QUEST_CHECKPOINT_393 NULL
  997 +#define D2S_QUEST_CHECKPOINT_394 NULL
  998 +#define D2S_QUEST_CHECKPOINT_395 NULL
  999 +#define D2S_QUEST_CHECKPOINT_396 NULL
  1000 +#define D2S_QUEST_CHECKPOINT_397 NULL
  1001 +#define D2S_QUEST_CHECKPOINT_398 NULL
  1002 +#define D2S_QUEST_CHECKPOINT_399 NULL
  1003 +// Rite of Passage
  1004 +#define D2S_QUEST_CHECKPOINT_400 NULL
  1005 +#define D2S_QUEST_CHECKPOINT_401 NULL
  1006 +#define D2S_QUEST_CHECKPOINT_402 NULL
  1007 +#define D2S_QUEST_CHECKPOINT_403 NULL
  1008 +#define D2S_QUEST_CHECKPOINT_404 NULL
  1009 +#define D2S_QUEST_CHECKPOINT_405 NULL
  1010 +#define D2S_QUEST_CHECKPOINT_406 NULL
  1011 +#define D2S_QUEST_CHECKPOINT_407 NULL
  1012 +#define D2S_QUEST_CHECKPOINT_408 NULL
  1013 +#define D2S_QUEST_CHECKPOINT_409 NULL
  1014 +#define D2S_QUEST_CHECKPOINT_410 NULL
  1015 +#define D2S_QUEST_CHECKPOINT_411 NULL
  1016 +#define D2S_QUEST_CHECKPOINT_412 NULL
  1017 +#define D2S_QUEST_CHECKPOINT_413 NULL
  1018 +#define D2S_QUEST_CHECKPOINT_414 NULL
  1019 +#define D2S_QUEST_CHECKPOINT_415 NULL
  1020 +// Eve of Destruction
  1021 +#define D2S_QUEST_CHECKPOINT_416 NULL
  1022 +#define D2S_QUEST_CHECKPOINT_417 NULL
  1023 +#define D2S_QUEST_CHECKPOINT_418 NULL
  1024 +#define D2S_QUEST_CHECKPOINT_419 NULL
  1025 +#define D2S_QUEST_CHECKPOINT_420 "Larzuk congratulated you"
  1026 +#define D2S_QUEST_CHECKPOINT_421 "Cain congratulated you"
  1027 +#define D2S_QUEST_CHECKPOINT_422 "Malah congratulated you"
  1028 +#define D2S_QUEST_CHECKPOINT_423 "Spoke to Tyrael"
  1029 +#define D2S_QUEST_CHECKPOINT_424 "Spoke to Qual-Kehk"
  1030 +#define D2S_QUEST_CHECKPOINT_425 "Spoke to Anya"
  1031 +#define D2S_QUEST_CHECKPOINT_426 NULL
  1032 +#define D2S_QUEST_CHECKPOINT_427 NULL
  1033 +#define D2S_QUEST_CHECKPOINT_428 NULL
  1034 +#define D2S_QUEST_CHECKPOINT_429 NULL
  1035 +#define D2S_QUEST_CHECKPOINT_430 NULL
  1036 +#define D2S_QUEST_CHECKPOINT_431 NULL
  1037 +
568 1038 #endif
569 1039 \ No newline at end of file
... ...