aboutsummaryrefslogtreecommitdiff
path: root/analyzer/parser/fight_results/fight_results.h
blob: 59d1e451506728a571e975b95a54409f31adf5dc (plain)
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
39
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
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
// parser/fight_results.h
// utilities for parsing the fight results data

#include "parser/parser_defs.h"
#include "utils/tcp.h"

#ifndef FIGHT_RESULTS_H
#define FIGHT_RESULTS_H

// Payload structure:
// FIGHT_RESULTS_START EntityResults (SEPARATOR_ENTITY EntityResults)* FIGHT_RESULTS_END
#define FIGHT_RESULTS_START "3;19;"
#define FIGHT_RESULTS_END "[--];"
#define SEPARATOR_ENTITY "[--]"
#define SEPARATOR_RESULT "&"

// values of field "team" in EntityResults
#define TEAM_FRIEND 1
#define TEAM_ENEMY 2

// EntityResults structure:
// field (SEPARATOR_RESULT field)*
// fields are defined in order in the EntityResults struct
#define ENTITY_FIELD_COUNT 35
// clang-format off
#define ENTITY_FIELD_TYPES { \
    /* team */       INT,    \
    /* name */       STRING, \
    /* exp */        INT,    \
    /* field4 */     FLOAT,  \
    /* gold */       INT,    \
    /* field6 */     FLOAT,  \
    /* field7 */     STRING, \
    /* gear */       STRING, \
    /* field9 */     INT,    \
    /* items */      STRING, \
    /* field11 */    INT,    \
    /* field12 */    INT,    \
    /* field13 */    FLOAT,  \
    /* field14 */    FLOAT,  \
    /* field15 */    FLOAT,  \
    /* level */      INT,    \
    /* field17 */    DOUBLE, \
    /* field18 */    FLOAT,  \
    /* field19 */    INT,    \
    /* field20 */    INT,    \
    /* field21 */    FLOAT,  \
    /* field22 */    FLOAT,  \
    /* field23 */    INT,    \
    /* field24 */    INT,    \
    /* psycho */     INT,    \
    /* drifs */      STRING, \
    /* splinters */  INT,    \
    /* field28 */    INT,    \
    /* field29 */    STRING, \
    /* field30 */    INT,    \
    /* field31 */    INT,    \
    /* field32 */    INT,    \
    /* field33 */    INT,    \
    /* field34 */    STRING, \
    /* saturation */ STRING, \
}
#define ENTITY_FIELD_ADDRESSES(entity_results) {\
    &entity_results.team,       \
    &entity_results.name,       \
    &entity_results.exp,        \
    &entity_results.field4,     \
    &entity_results.gold,       \
    &entity_results.field6,     \
    &entity_results.field7,     \
    &entity_results.gear,       \
    &entity_results.field9,     \
    &entity_results.items,      \
    &entity_results.field11,    \
    &entity_results.field12,    \
    &entity_results.field13,    \
    &entity_results.field14,    \
    &entity_results.field15,    \
    &entity_results.level,      \
    &entity_results.field17,    \
    &entity_results.field18,    \
    &entity_results.field19,    \
    &entity_results.field20,    \
    &entity_results.field21,    \
    &entity_results.field22,    \
    &entity_results.field23,    \
    &entity_results.field24,    \
    &entity_results.psycho,     \
    &entity_results.drifs,      \
    &entity_results.splinters,  \
    &entity_results.field28,    \
    &entity_results.field29,    \
    &entity_results.field30,    \
    &entity_results.field31,    \
    &entity_results.field32,    \
    &entity_results.field33,    \
    &entity_results.field34,    \
    &entity_results.saturation, \
}
// clang-format on
typedef struct {
    int team; // friend or enemy
    char *name;
    int exp;
    float field4;
    int gold;
    float field6;
    char *field7;
    char *gear; // rares, sets, syngs, orbs
    int field9;
    char *items; // regular items
    int field11;
    int field12;
    float field13;
    float field14; // some multiplier most likely exp/gold/psycho/something else idk
    float field15;
    int level;
    double field17;
    float field18;
    int field19;
    int field20;
    float field21;
    float field22;
    int field23;
    int field24;
    int psycho;
    char *drifs;
    int splinters;
    int field28;
    char *field29;
    int field30;
    int field31;
    int field32;
    int field33;
    char *field34;
    char *saturation;
} EntityResults;

// items/gear/drifs fields parsing info
#define INIT_ITEMS_CAPACITY 8
#define SINGLE_ITEM_BUFFER_LEN 128
#define SEPARATOR_ITEMS "[-]"
#define SEPARATOR_DRIFS "???" // TODO: change it to correct one which idk at this moment
#define SEPARATOR_GEARS "???" // TODO: change it to correct one which idk at this moment
// Item struct - for keeping item string and type
typedef enum { NORMAL, DRIF, ORB, SYNG, SET, RARE, EPIC } ItemType;
typedef struct {
    char *data;
    ItemType type;
} Item;

// Drif structure:
// field (SEPARATOR_DRIF_FIELDS field)*
// fields are defined in order in the Drif struct
#define DRIF_FIELD_COUNT 18
#define SEPARATOR_DRIF_FIELDS ","
// clang-format off
#define DRIF_FIELD_TYPES { \
    /* field1 */   STRING, \
    /* field2 */   INT,    \
    /* size */     INT,    \
    /* field4 */   STRING, \
    /* field5 */   INT,    \
    /* id */       INT,    \
    /* value1 */   FLOAT,  \
    /* value2 */   FLOAT,  \
    /* field9 */   INT,    \
    /* field10 */  INT,    \
    /* field11 */  STRING, \
    /* size_str */ STRING, \
    /* field13 */  INT,    \
    /* power */    INT,    \
    /* field15 */  INT,    \
    /* field16 */  INT,    \
    /* name */     STRING, \
    /* field18 */  STRING, \
}
#define DRIF_FIELD_ADDRESSES(drif) {\
    &drif.field1,   \
    &drif.field2,   \
    &drif.size,     \
    &drif.field4,   \
    &drif.field5,   \
    &drif.id,       \
    &drif.value1,   \
    &drif.value2,   \
    &drif.field9,   \
    &drif.field10,  \
    &drif.field11,  \
    &drif.size_str, \
    &drif.field13,  \
    &drif.power,    \
    &drif.field15,  \
    &drif.field16,  \
    &drif.name,     \
    &drif.field18,  \
}
// clang-format on
typedef struct {
    char *field1; // just says "drif"
    int field2;
    int size; // 1 - sub, 2 - bi, 3 - magni, 4 - arcy
    char *field4;
    int field5;
    int id;       // id of orb type
    float value1; // value1, value2 (in %) - one is start value, the other is value per lvl (both are the same)
    float value2; // value1, value2 (in %) - one is start value, the other is value per lvl (both are the same)
    int field9;
    int field10;
    char *field11;
    char *size_str; // sub - small, medium - bi, big - magni, ??? - arcy
    int field13;
    int power; // how much space it takes
    int field15;
    int field16;
    char *name; // <size>drif <name>
    char *field18;
} Drif;

// Gear structure:
// field (SEPARATOR_GEAR_FIELDS field)*
// fields are defined in order in the Gear struct
#define GEAR_FIELD_COUNT 19
#define SEPARATOR_GEAR_FIELDS "$"
// values of field "type" in Gear
#define TYPE_SYNG_NORMAL 0
#define TYPE_SET 1
#define TYPE_RARE 2
// clang-format off
#define GEAR_FIELD_TYPES { \
    /* stats */        STRING, \
    /* resistances */  STRING, \
    /* info */         STRING, \
    /* reqs */         STRING, \
    /* field5 */       STRING, \
    /* psycho */       STRING, \
    /* field7 */       STRING, \
    /* field8 */       STRING, \
    /* field9 */       STRING, \
    /* syng_tier */    STRING, \
    /* field11 */      INT,    \
    /* field12 */      INT,    \
    /* field13 */      INT,    \
    /* field14 */      STRING, \
    /* type */         INT,    \
    /* field16 */      INT,    \
    /* orb */          STRING, \
    /* field18 */      STRING, \
    /* field19 */      STRING, \
}
#define GEAR_FIELD_ADDRESSES(gear) {\
    &gear.stats,       \
    &gear.resistances, \
    &gear.info,        \
    &gear.reqs,        \
    &gear.field5,      \
    &gear.psycho,      \
    &gear.field7,      \
    &gear.field8,      \
    &gear.field9,      \
    &gear.syng_tier,   \
    &gear.field11,     \
    &gear.field12,     \
    &gear.field13,     \
    &gear.field14,     \
    &gear.type,        \
    &gear.field16,     \
    &gear.orb,         \
    &gear.field18,     \
    &gear.field19,     \
}
// clang-format on
typedef struct {
    char *stats;       // strength, dexterity, power, knowledge, hp, mana, stamina
    char *resistances; // slashing, crushing, piercing, fire, cold, energy, mental
    char *info;        // GearInfo struct data
    char *reqs;        // requirements (str, dex, pow, know), weight, something else
    char *field5;
    char *psycho; // psycho effects (id,%) for syngs
    char *field7;
    char *field8;
    char *field9;
    char *syng_tier; // lvl 20 - 1, lvl 30 - 2, etc..., null for non-syngs
    int field11;
    int field12;
    int field13;
    char *field14;
    int type;    // 0 - normal item or syng, 1 - set, 2 - rare
    int field16; // 10 for rare, -1 for others ???
    char *orb;   // orb info
    char *field18;
    char *field19;
} Gear;

// GearInfo structure:
// field (SEPARATOR_GEAR_INFO_FIELDS field)*
// fields are defined in order in the GearInfo struct
#define GEAR_INFO_FIELD_COUNT 23
#define SEPARATOR_GEAR_INFO_FIELDS ","
// clang-format off
#define GEAR_INFO_FIELD_TYPES { \
    /* name */       STRING, \
    /* field2 */     INT,    \
    /* lvl */        INT,    \
    /* price */      INT,    \
    /* field5 */     INT,    \
    /* field6 */     INT,    \
    /* field7 */     INT,    \
    /* rank */       INT,    \
    /* field9 */     INT,    \
    /* field10 */    INT,    \
    /* field11 */    INT,    \
    /* durability */ INT,    \
    /* field13 */    STRING, \
    /* field14 */    INT,    \
    /* field15 */    INT,    \
    /* charges */    FLOAT,  \
    /* field17 */    STRING, \
    /* field18 */    INT,    \
    /* stars */      INT,    \
    /* field20 */    INT,    \
    /* field21 */    INT,    \
    /* field22 */    INT,    \
    /* field23 */    INT,    \
}
#define GEAR_INFO_FIELD_ADDRESSES(gear_info) {\
    &gear_info.name,       \
    &gear_info.field2,     \
    &gear_info.lvl,        \
    &gear_info.price,      \
    &gear_info.field5,     \
    &gear_info.field6,     \
    &gear_info.field7,     \
    &gear_info.rank,       \
    &gear_info.field9,     \
    &gear_info.field10,    \
    &gear_info.field11,    \
    &gear_info.durability, \
    &gear_info.field13,    \
    &gear_info.field14,    \
    &gear_info.field15,    \
    &gear_info.charges,    \
    &gear_info.field17,    \
    &gear_info.field18,    \
    &gear_info.stars,      \
    &gear_info.field20,    \
    &gear_info.field21,    \
    &gear_info.field22,    \
    &gear_info.field23,    \
}
// clang-format on
typedef struct {
    char *name; // item name
    int field2;
    int lvl;   // level requirement
    int price; // gold price value
    int field5;
    int field6;
    int field7;
    int rank; // I-XII
    int field9;
    int field10;
    int field11;
    int durability; // in %
    char *field13;
    int field14;
    int field15;
    float charges; // charge count
    char *field17;
    int field18;
    int stars; // incrustation level: 0 - b1, 1 - b2, ... (-100 for syngs)
    int field20;
    int field21;
    int field22;
    int field23;
} GearInfo;

// Orb structure:
// field (SEPARATOR_ORB_FIELDS field)*
// fields are defined in order in the Orb struct
#define ORB_FIELD_COUNT 9
#define SEPARATOR_ORB_FIELDS ","
// clang-format off
#define ORB_FIELD_TYPES { \
    /* field1 */ STRING, \
    /* field2 */ INT,    \
    /* field3 */ INT,    \
    /* field4 */ STRING, \
    /* field5 */ INT,    \
    /* id */     INT,    \
    /* size */   INT,    \
    /* value */  FLOAT,  \
    /* field9 */ STRING, \
}
#define ORB_FIELD_ADDRESSES(orb) {\
    &orb.field1, \
    &orb.field2, \
    &orb.field3, \
    &orb.field4, \
    &orb.field5, \
    &orb.id,     \
    &orb.size,   \
    &orb.value,  \
    &orb.field9, \
}
// clang-format on
typedef struct {
    char *field1; // just says "orb"
    int field2;
    int field3;
    char *field4;
    int field5;
    int id;      // id of orb type
    int size;    // 1 - sub, 2 - bi, 3 - magni, 4 - arcy
    float value; // value in % you gain from the orb
    char *field9;
} Orb;

// fight results data for friendly
typedef struct {
    char *name;
    int exp;
    int gold;
    Item *items;
    size_t num_items;
    int level;
    int psycho;
    int splinters;
    char *saturation_type;
    int saturation;
} FriendlyResults;

// fight results data for enemy
typedef struct {
    char *name;
    int level;
} EnemyResults;

#define MAX_ENTITIES_PER_SIDE 8

// entire fight resutls
typedef struct {
    size_t num_friendly;
    FriendlyResults friendly_results[MAX_ENTITIES_PER_SIDE];
    size_t num_enemy;
    EnemyResults enemy_results[MAX_ENTITIES_PER_SIDE];
} FightResults;

extern find_function_t find_fight_results;
extern parse_function_t parse_fight_results;

#endif