diff options
Diffstat (limited to 'src/tool/convert.cpp')
-rw-r--r-- | src/tool/convert.cpp | 302 |
1 files changed, 302 insertions, 0 deletions
diff --git a/src/tool/convert.cpp b/src/tool/convert.cpp new file mode 100644 index 0000000..e256fc9 --- /dev/null +++ b/src/tool/convert.cpp @@ -0,0 +1,302 @@ +#include <stdio.h> +#include <stdlib.h> + +#define MAX_INVENTORY 100 +#define MAX_CART 100 +#define MAX_SKILL 350 +#define GLOBAL_REG_NUM 16 + +struct item +{ + int id; + short nameid; + short amount; + short equip; + char identify; + char refine; + char attribute; + short card[4]; +}; +struct point +{ + char map[16]; + short x, y; +}; +struct skill +{ + unsigned short id, lv, flag; +}; +struct global_reg +{ + char str[16]; + int value; +}; + +struct mmo_charstatus +{ + int char_id; + int account_id; + int base_exp, job_exp, zeny; + + short class; + short status_point, skill_point; + short hp, max_hp, sp, max_sp; + short option, karma, manner; + short hair, hair_color, clothes_color; + int party_id, guild_id, pet_id; + + short weapon, shield; + short head_top, head_mid, head_bottom; + + char name[24]; + unsigned char base_level, job_level; + unsigned char str, agi, vit, int_, dex, luk, char_num, sex; + + struct point last_point, save_point, memo_point[3]; + struct item inventory[MAX_INVENTORY], cart[MAX_CART]; + struct skill skill[MAX_SKILL]; + int global_reg_num; + struct global_reg global_reg[GLOBAL_REG_NUM]; +}; + +int mmo_char_tostr (char *str, struct mmo_charstatus *p) +{ + int i; + sprintf (str, "%d\t%d,%d\t%s\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d" "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d" "\t%s,%d,%d\t%s,%d,%d", p->char_id, p->account_id, p->char_num, p->name, // + p->class, p->base_level, p->job_level, p->base_exp, p->job_exp, p->zeny, p->hp, p->max_hp, p->sp, p->max_sp, p->str, p->agi, p->vit, p->int_, p->dex, p->luk, p->status_point, p->skill_point, p->option, p->karma, p->manner, // + p->party_id, p->guild_id, p->pet_id, p->hair, p->hair_color, p->clothes_color, p->weapon, p->shield, p->head_top, p->head_mid, p->head_bottom, p->last_point.map, p->last_point.x, p->last_point.y, // + p->save_point.map, p->save_point.x, p->save_point.y); + strcat (str, "\t"); + for (i = 0; i < 3; i++) + if (p->memo_point[i].map[0]) + { + sprintf (str + strlen (str), "%s,%d,%d", p->memo_point[i].map, + p->memo_point[i].x, p->memo_point[i].y); + } + strcat (str, "\t"); + for (i = 0; i < MAX_INVENTORY; i++) + if (p->inventory[i].nameid) + { + sprintf (str + strlen (str), "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ", + p->inventory[i].id, p->inventory[i].nameid, + p->inventory[i].amount, p->inventory[i].equip, + p->inventory[i].identify, p->inventory[i].refine, + p->inventory[i].attribute, p->inventory[i].card[0], + p->inventory[i].card[1], p->inventory[i].card[2], + p->inventory[i].card[3]); + } + strcat (str, "\t"); + for (i = 0; i < MAX_CART; i++) + if (p->cart[i].nameid) + { + sprintf (str + strlen (str), "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ", + p->cart[i].id, p->cart[i].nameid, p->cart[i].amount, + p->cart[i].equip, p->cart[i].identify, p->cart[i].refine, + p->cart[i].attribute, p->cart[i].card[0], + p->cart[i].card[1], p->cart[i].card[2], + p->cart[i].card[3]); + } + strcat (str, "\t"); + for (i = 0; i < MAX_SKILL; i++) + if (p->skill[i].id) + { + sprintf (str + strlen (str), "%d,%d ", p->skill[i].id, + p->skill[i].lv); + } + strcat (str, "\t"); + for (i = 0; i < p->global_reg_num; i++) + sprintf (str + strlen (str), "%s,%d ", p->global_reg[i].str, + p->global_reg[i].value); + strcat (str, "\t"); + return 0; +} + +int mmo_char_fromstr (char *str, struct mmo_charstatus *p) +{ + int tmp_int[256]; + int set, next, len, i; + + set = sscanf (str, "%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d" "\t%d,%d,%d\t%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d" "\t%[^,],%d,%d\t%[^,],%d,%d%n", &tmp_int[0], &tmp_int[1], &tmp_int[2], p->name, // + &tmp_int[3], &tmp_int[4], &tmp_int[5], &tmp_int[6], &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12], &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18], &tmp_int[19], &tmp_int[20], &tmp_int[21], &tmp_int[22], &tmp_int[23], // + &tmp_int[24], &tmp_int[25], &tmp_int[26], &tmp_int[27], &tmp_int[28], &tmp_int[29], &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], p->last_point.map, &tmp_int[34], &tmp_int[35], // + p->save_point.map, &tmp_int[36], &tmp_int[37], &next); + p->char_id = tmp_int[0]; + p->account_id = tmp_int[1]; + p->char_num = tmp_int[2]; + p->class = tmp_int[3]; + p->base_level = tmp_int[4]; + p->job_level = tmp_int[5]; + p->base_exp = tmp_int[6]; + p->job_exp = tmp_int[7]; + p->zeny = tmp_int[8]; + p->hp = tmp_int[9]; + p->max_hp = tmp_int[10]; + p->sp = tmp_int[11]; + p->max_sp = tmp_int[12]; + p->str = tmp_int[13]; + p->agi = tmp_int[14]; + p->vit = tmp_int[15]; + p->int_ = tmp_int[16]; + p->dex = tmp_int[17]; + p->luk = tmp_int[18]; + p->status_point = tmp_int[19]; + p->skill_point = tmp_int[20]; + p->option = tmp_int[21]; + p->karma = tmp_int[22]; + p->manner = tmp_int[23]; + p->party_id = tmp_int[24]; + p->guild_id = tmp_int[25]; + p->pet_id = 0; + p->hair = tmp_int[26]; + p->hair_color = tmp_int[27]; + p->clothes_color = tmp_int[28]; + p->weapon = tmp_int[29]; + p->shield = tmp_int[30]; + p->head_top = tmp_int[31]; + p->head_mid = tmp_int[32]; + p->head_bottom = tmp_int[33]; + p->last_point.x = tmp_int[34]; + p->last_point.y = tmp_int[35]; + p->save_point.x = tmp_int[36]; + p->save_point.y = tmp_int[37]; + if (set != 41) + return 0; + if (str[next] == '\n' || str[next] == '\r') + return 1; // 新規データ + next++; + for (i = 0; str[next] && str[next] != '\t'; i++) + { + set = + sscanf (str + next, "%[^,],%d,%d%n", p->memo_point[i].map, + &tmp_int[0], &tmp_int[1], &len); + if (set != 3) + return 0; + p->memo_point[i].x = tmp_int[0]; + p->memo_point[i].y = tmp_int[1]; + next += len; + if (str[next] == ' ') + next++; + } + next++; + for (i = 0; str[next] && str[next] != '\t'; i++) + { + set = sscanf (str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", + &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], + &tmp_int[4], &tmp_int[5], &tmp_int[6], + &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], + &len); + if (set != 11) + return 0; + p->inventory[i].id = tmp_int[0]; + p->inventory[i].nameid = tmp_int[1]; + p->inventory[i].amount = tmp_int[2]; + p->inventory[i].equip = tmp_int[3]; + p->inventory[i].identify = tmp_int[4]; + p->inventory[i].refine = tmp_int[5]; + p->inventory[i].attribute = tmp_int[6]; + p->inventory[i].card[0] = tmp_int[7]; + p->inventory[i].card[1] = tmp_int[8]; + p->inventory[i].card[2] = tmp_int[9]; + p->inventory[i].card[3] = tmp_int[10]; + next += len; + if (str[next] == ' ') + next++; + } + next++; + for (i = 0; str[next] && str[next] != '\t'; i++) + { + set = sscanf (str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", + &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], + &tmp_int[4], &tmp_int[5], &tmp_int[6], + &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], + &len); + if (set != 11) + return 0; + p->cart[i].id = tmp_int[0]; + p->cart[i].nameid = tmp_int[1]; + p->cart[i].amount = tmp_int[2]; + p->cart[i].equip = tmp_int[3]; + p->cart[i].identify = tmp_int[4]; + p->cart[i].refine = tmp_int[5]; + p->cart[i].attribute = tmp_int[6]; + p->cart[i].card[0] = tmp_int[7]; + p->cart[i].card[1] = tmp_int[8]; + p->cart[i].card[2] = tmp_int[9]; + p->cart[i].card[3] = tmp_int[10]; + next += len; + if (str[next] == ' ') + next++; + } + next++; + for (i = 0; str[next] && str[next] != '\t'; i++) + { + set = sscanf (str + next, "%d,%d%n", &tmp_int[0], &tmp_int[1], &len); + if (set != 2) + return 0; + p->skill[tmp_int[0]].id = tmp_int[0]; + p->skill[tmp_int[0]].lv = tmp_int[1]; + next += len; + if (str[next] == ' ') + next++; + } + next++; + for (i = 0; + str[next] && str[next] != '\t' && str[next] != '\n' + && str[next] != '\r'; i++) + { //global_reg実装以前のathena.txt互換のため一応'\n'チェック + set = sscanf (str + next, "%[^,],%d%n", + p->global_reg[i].str, &p->global_reg[i].value, &len); + if (set != 2) + return 0; + next += len; + if (str[next] == ' ') + next++; + } + p->global_reg_num = i; + return 1; +} + +int mmo_char_convert (char *fname1, char *fname2) +{ + char line[65536]; + int ret; + struct mmo_charstatus char_dat; + FILE *ifp, *ofp; + + ifp = fopen_ (fname1, "r"); + ofp = fopen_ (fname2, "w"); + if (ifp == NULL) + { + printf ("file not found %s\n", fname1); + return 0; + } + if (ofp == NULL) + { + printf ("file open error %s\n", fname2); + return 0; + } + while (fgets (line, 65535, ifp)) + { + memset (&char_dat, 0, sizeof (struct mmo_charstatus)); + ret = mmo_char_fromstr (line, &char_dat); + if (ret) + { + mmo_char_tostr (line, &char_dat); + fprintf (ofp, "%s\n", line); + } + } + fcloseall (); + return 0; +} + +int main (int argc, char *argv[]) +{ + if (argc < 3) + { + printf ("Usage: convert <input filename> <output filename>\n"); + exit (0); + } + mmo_char_convert (argv[1], argv[2]); + + return 0; +} |