1 /*
2  * Copyright (C) 2000,2001	Onlyer	(onlyer@263.net)
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
17  */
18 #ifndef INCLUDED_D2CS_PROTOCOL_H
19 #define INCLUDED_D2CS_PROTOCOL_H
20 
21 #include "common/bn_type.h"
22 
23 typedef struct
24 {
25 	bn_short		size;
26 	bn_byte			type;
27 } t_d2cs_client_header;
28 
29 typedef struct
30 {
31 	t_d2cs_client_header	h;
32 } t_d2cs_client_generic;
33 
34 #define CLIENT_D2CS_LOGINREQ			0x01
35 typedef struct
36 {
37 	t_d2cs_client_header	h;
38 	bn_int			seqno;
39 	bn_int			u1;
40 	bn_int			bncs_addr1;
41 	bn_int			sessionnum;
42 	bn_int			sessionkey;			/* always zero,self define */
43 	bn_int			cdkey_id;
44 	bn_int			u5;
45 	bn_int			clienttag;
46 	bn_int			bnversion;
47 	bn_int			bncs_addr2;
48 	bn_int			u6;	/* zero */
49 	bn_int			secret_hash[5];
50 	/* account name */
51 } t_client_d2cs_loginreq;
52 
53 #define D2CS_CLIENT_LOGINREPLY			0x01
54 typedef struct
55 {
56 	t_d2cs_client_header	h;
57 	bn_int			reply;
58 } t_d2cs_client_loginreply;
59 #define D2CS_CLIENT_LOGINREPLY_SUCCEED			0x00
60 #define D2CS_CLIENT_LOGINREPLY_BADPASS			0x0c
61 
62 #define CLIENT_D2CS_CREATECHARREQ		0x02
63 typedef struct
64 {
65 	t_d2cs_client_header	h;
66 	bn_short		class;		/* character class */
67 	bn_short		u1;		/* always zero */
68 	bn_short		status;		/* same as in .d2s file */
69 	/* character name */
70 } t_client_d2cs_createcharreq;
71 
72 #define D2CS_CLIENT_CREATECHARREPLY		0x02
73 typedef struct
74 {
75 	t_d2cs_client_header	h;
76 	bn_int			reply;
77 } t_d2cs_client_createcharreply;
78 #define D2CS_CLIENT_CREATECHARREPLY_SUCCEED		0x00
79 #define D2CS_CLIENT_CREATECHARREPLY_FAILED		0x01
80 #define D2CS_CLIENT_CREATECHARREPLY_ALREADY_EXIST	0x14
81 #define D2CS_CLIENT_CREATECHARREPLY_NAME_REJECT		0x15
82 
83 
84 #define CLIENT_D2CS_CREATEGAMEREQ		0x03
85 typedef struct
86 {
87 	t_d2cs_client_header	h;
88 	bn_short		seqno;
89 	bn_int			gameflag;		/* just difficulty is set here */
90 	bn_byte			u1;			/* always 1 */
91 	bn_byte			leveldiff;		/* Only allow people of +/- n level to join */
92 	bn_byte			maxchar;		/* Maximum number of chars allowed in game */
93 	/* game name */
94 	/* game pass */
95 	/* game desc */
96 } t_client_d2cs_creategamereq;
97 
98 #define D2CS_CLIENT_CREATEGAMEREPLY		0x03
99 typedef struct
100 {
101 	t_d2cs_client_header	h;
102 	bn_short		seqno;
103 	bn_short		gameid;
104 	bn_short		u1;			/* always zero */
105 	bn_int			reply;
106 } t_d2cs_client_creategamereply;
107 #define D2CS_CLIENT_CREATEGAMEREPLY_SUCCEED		0x00
108 #define D2CS_CLIENT_CREATEGAMEREPLY_FAILED		0x01
109 #define D2CS_CLIENT_CREATEGAMEREPLY_INVALID_NAME	0x1e
110 #define D2CS_CLIENT_CREATEGAMEREPLY_NAME_EXIST		0x1f
111 #define D2CS_CLIENT_CREATEGAMEREPLY_SERVER_DOWN		0x20
112 #define D2CS_CLIENT_CREATEGAMEREPLY_NOT_AVAILABLE	0x32
113 #define D2CS_CLIENT_CREATEGAMEREPLY_U1			0x33
114 
115 #define CLIENT_D2CS_JOINGAMEREQ			0x04
116 typedef struct
117 {
118 	t_d2cs_client_header	h;
119 	bn_short		seqno;
120 	/* game name */
121 	/* game pass */
122 } t_client_d2cs_joingamereq;
123 
124 #define D2CS_CLIENT_JOINGAMEREPLY		0x04
125 typedef struct
126 {
127 	t_d2cs_client_header	h;
128 	bn_short		seqno;
129 	bn_short		gameid;
130 	bn_short		u1;			/* always zero */
131 	bn_int			addr;
132 	bn_int			token;
133 	bn_int			reply;
134 } t_d2cs_client_joingamereply;
135 #define D2CS_CLIENT_JOINGAMEREPLY_SUCCEED		0x00
136 #define D2CS_CLIENT_JOINGAMEREPLY_BAD_PASS		0x29
137 #define D2CS_CLIENT_JOINGAMEREPLY_NOT_EXIST		0x2a
138 #define D2CS_CLIENT_JOINGAMEREPLY_GAME_FULL		0x2b
139 #define D2CS_CLIENT_JOINGAMEREPLY_LEVEL_LIMIT		0x2c
140 #define D2CS_CLIENT_JOINGAMEREPLY_HARDCORE_SOFTCORE	0x71
141 #define D2CS_CLIENT_JOINGAMEREPLY_NORMAL_NIGHTMARE	0x73
142 #define D2CS_CLIENT_JOINGAMEREPLY_NIGHTMARE_HELL	0x74
143 #define D2CS_CLIENT_JOINGAMEREPLY_CLASSIC_EXPANSION	0x78
144 #define D2CS_CLIENT_JOINGAMEREPLY_EXPANSION_CLASSIC	0x79
145 #define D2CS_CLIENT_JOINGAMEREPLY_NORMAL_LADDER		0x7D
146 #define D2CS_CLIENT_JOINGAMEREPLY_FAILED		0x01
147 
148 #define CLIENT_D2CS_GAMELISTREQ				0x05
149 typedef struct
150 {
151 	t_d2cs_client_header	h;
152 	bn_short		seqno;
153 	bn_int			gameflag;		/* only hardcore is set here */
154 	/* bn_byte		u1;			string game name to search? */
155 } t_client_d2cs_gamelistreq;
156 
157 #define D2CS_CLIENT_GAMELISTREPLY		0x05
158 typedef struct
159 {
160 	t_d2cs_client_header	h;
161 	bn_short		seqno;
162 	bn_int			token;
163 	bn_byte			currchar;		/* current number of characters in game */
164 	bn_int			gameflag;		/* 0x04 is always set here */
165 	/* game name */
166 	/* game desc */
167 } t_d2cs_client_gamelistreply;
168 
169 #define CLIENT_D2CS_GAMEINFOREQ			0x06
170 typedef struct
171 {
172 	t_d2cs_client_header	h;
173 	bn_short		seqno;
174 	/* game name */
175 } t_client_d2cs_gameinforeq;
176 
177 #define D2CS_CLIENT_GAMEINFOREPLY		0x06
178 typedef struct
179 {
180 	t_d2cs_client_header	h;
181 	bn_short		seqno;
182 	bn_int			gameflag;
183 	bn_int			etime;
184 	bn_byte			charlevel;
185 	bn_byte			leveldiff;
186 	bn_byte			maxchar;
187 	bn_byte			currchar;
188 	bn_byte			class[16];		/* 16 character class */
189 	bn_byte			level[16];		/* 16 character level */
190 	/* game description */
191 	/* currchar number of character names */
192 } t_d2cs_client_gameinforeply;
193 
194 #define CLIENT_D2CS_CHARLOGINREQ		0x07
195 typedef struct
196 {
197 	t_d2cs_client_header	h;
198 	/* character name */
199 } t_client_d2cs_charloginreq;
200 
201 #define D2CS_CLIENT_CHARLOGINREPLY		0x07
202 typedef struct
203 {
204 	t_d2cs_client_header	h;
205 	bn_int			reply;
206 } t_d2cs_client_charloginreply;
207 #define D2CS_CLIENT_CHARLOGINREPLY_SUCCEED		0x00
208 #define D2CS_CLIENT_CHARLOGINREPLY_FAILED		0x01
209 #define D2CS_CLIENT_CHARLOGINREPLY_NOT_FOUND		0x46
210 #define D2CS_CLIENT_CHARLOGINREPLY_EXPIRED		0x7b
211 
212 #define CLIENT_D2CS_DELETECHARREQ		0x0a
213 typedef struct
214 {
215 	t_d2cs_client_header	h;
216 	bn_short		u1;			/* always zero */
217 	/* character name */
218 } t_client_d2cs_deletecharreq;
219 
220 #define D2CS_CLIENT_DELETECHARREPLY		0x0a
221 typedef struct
222 {
223 	t_d2cs_client_header	h;
224 	bn_short		u1;			/* always zero */
225 	bn_int			reply;
226 } t_d2cs_client_deletecharreply;
227 #define D2CS_CLIENT_DELETECHARREPLY_SUCCEED		0x00
228 #define D2CS_CLIENT_DELETECHARREPLY_FAILED		0x01
229 
230 
231 #define CLIENT_D2CS_LADDERREQ			0x11
232 typedef struct
233 {
234 	t_d2cs_client_header	h;
235 	bn_byte			type;			/* jadder type request */
236 	bn_short		start_pos;		/* list ladder from what position */
237 } t_client_d2cs_ladderreq;
238 
239 #define D2CS_CLIENT_LADDERREPLY			0x11
240 typedef struct
241 {
242 	t_d2cs_client_header	h;
243 	bn_byte			type;			/* ladder type request */
244 	bn_short		total_len;		/* total length of the ladder data */
245 
246 	bn_short		curr_len;		/* length of ladder data in this packet */
247 	bn_short		cont_len;		/* length of ladder data in previous packets */
248 							/* length here include the header but
249 							exclude this packet */
250 } t_d2cs_client_ladderreply;
251 
252 typedef struct
253 {
254 	bn_short		start_pos;		/* start position of ladder */
255 	bn_short		u1;			/* always zero */
256 	bn_int			count1;			/* always 0x10 */
257 } t_d2cs_client_ladderheader;
258 
259 typedef struct
260 {
261 	bn_int			count2;			/* 0x10 for first packet or 0x0 for continue */
262 } t_d2cs_client_ladderinfoheader;
263 
264 typedef struct
265 {
266 	bn_int			explow;
267 	bn_int			exphigh;		/* always zero */
268 	bn_short		status;
269 	bn_byte			level;
270 	bn_byte			u1;			/* always zero */
271 	char			charname[16];
272 } t_d2cs_client_ladderinfo;
273 #define LADDERSTATUS_FLAG_DEAD		0x10
274 #define LADDERSTATUS_FLAG_HARDCORE	0x20
275 #define LADDERSTATUS_FLAG_EXPANSION	0x40
276 #define LADDERSTATUS_FLAG_DIFFICULTY	0x0f00
277 
278 #define CLIENT_D2CS_MOTDREQ			0x12
279 typedef struct
280 {
281 	t_d2cs_client_header	h;
282 } t_client_d2cs_motdreq;
283 
284 #define D2CS_CLIENT_MOTDREPLY			0x12
285 typedef struct
286 {
287 	t_d2cs_client_header	h;
288 	bn_byte			u1;
289 	/* message */
290 } t_d2cs_client_motdreply;
291 
292 #define CLIENT_D2CS_CANCELCREATEGAME		0x13
293 typedef struct
294 {
295 	t_d2cs_client_header	h;
296 } t_client_d2cs_cancelcreategame;
297 
298 #define D2CS_CLIENT_CREATEGAMEWAIT		0x14
299 typedef struct
300 {
301 	t_d2cs_client_header	h;
302 	bn_int			position;
303 } t_d2cs_client_creategamewait;
304 
305 #define D2CS_CLIENT_CHARLADDERREQ		0x16
306 typedef struct
307 {
308 	t_d2cs_client_header	h;
309 	bn_int			hardcore;
310 	bn_int			expansion;
311 	/* character name */
312 } t_client_d2cs_charladderreq;
313 /* use 0x11 LADDER reply for this request */
314 
315 #define CLIENT_D2CS_CHARLISTREQ			0x17
316 typedef struct
317 {
318 	t_d2cs_client_header	h;
319 	bn_short		maxchar;
320 	bn_short		u1;
321 } t_client_d2cs_charlistreq;
322 
323 #define D2CS_CLIENT_CHARLISTREPLY		0x17
324 typedef struct
325 {
326 	t_d2cs_client_header	h;
327 	bn_short		maxchar;
328 	bn_short		currchar;
329 	bn_short		u1;			/* always zero */
330 	bn_short		currchar2;
331 	/* character name */
332 	/* character portrait blocks */
333 	/* each block is 0x22 bytes static length */
334 } t_d2cs_client_charlistreply;
335 
336 #define CLIENT_D2CS_CONVERTCHARREQ		0x18
337 typedef struct
338 {
339 	t_d2cs_client_header	h;
340 	/* character name */
341 } t_client_d2cs_convertcharreq;
342 
343 #define D2CS_CLIENT_CONVERTCHARREPLY		0x18
344 typedef struct
345 {
346 	t_d2cs_client_header	h;
347 	bn_int			reply;
348 } t_d2cs_client_convertcharreply;
349 #define D2CS_CLIENT_CONVERTCHARREPLY_SUCCEED		0x00
350 #define D2CS_CLIENT_CONVERTCHARREPLY_FAILED		0x01
351 
352 #define CLIENT_D2CS_CHARLISTREQ_110		0x19
353 typedef struct
354 {
355 	t_d2cs_client_header	h;
356 	bn_short		maxchar;
357 	bn_short		u1;
358 } t_client_d2cs_charlistreq_110;
359 
360 
361 #define D2CS_CLIENT_CHARLISTREPLY_110		0x19
362 typedef struct
363 {
364 	t_d2cs_client_header	h;
365 	bn_short		maxchar;
366 	bn_short		currchar;
367 	bn_short		u1;			/* always zero */
368 	bn_short		currchar2;
369 } t_d2cs_client_charlistreply_110;
370 
371 typedef struct
372 {
373 	bn_int			expire_time;		/* character expire time (in seconds) */
374 	/* character name */
375 	/* character portrait blocks */
376 	/* each block is 0x22 bytes static length */
377 } t_d2cs_client_chardata;
378 
379 
380 
381 #endif
382