convert.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define RETCODE "\r\n"
  4. #define MAX_INVENTORY 100
  5. #define MAX_CART 100
  6. #define MAX_SKILL 350
  7. #define GLOBAL_REG_NUM 16
  8. struct item {
  9. int id;
  10. short nameid;
  11. short amount;
  12. short equip;
  13. char identify;
  14. char refine;
  15. char attribute;
  16. short card[4];
  17. };
  18. struct point{
  19. char map[16];
  20. short x,y;
  21. };
  22. struct skill {
  23. unsigned short id,lv,flag;
  24. };
  25. struct global_reg {
  26. char str[16];
  27. int value;
  28. };
  29. struct mmo_charstatus {
  30. int char_id;
  31. int account_id;
  32. int base_exp,job_exp,zeny;
  33. short class;
  34. short status_point,skill_point;
  35. short hp,max_hp,sp,max_sp;
  36. short option,karma,manner;
  37. short hair,hair_color,clothes_color;
  38. int party_id,guild_id,pet_id;
  39. short weapon,shield;
  40. short head_top,head_mid,head_bottom;
  41. char name[24];
  42. unsigned char base_level,job_level;
  43. unsigned char str,agi,vit,int_,dex,luk,char_num,sex;
  44. struct point last_point,save_point,memo_point[3];
  45. struct item inventory[MAX_INVENTORY],cart[MAX_CART];
  46. struct skill skill[MAX_SKILL];
  47. int global_reg_num;
  48. struct global_reg global_reg[GLOBAL_REG_NUM];
  49. };
  50. int mmo_char_tostr(char *str,struct mmo_charstatus *p)
  51. {
  52. int i;
  53. 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"
  54. "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
  55. "\t%s,%d,%d\t%s,%d,%d",
  56. p->char_id,p->account_id,p->char_num,p->name, //
  57. p->class,p->base_level,p->job_level,
  58. p->base_exp,p->job_exp,p->zeny,
  59. p->hp,p->max_hp,p->sp,p->max_sp,
  60. p->str,p->agi,p->vit,p->int_,p->dex,p->luk,
  61. p->status_point,p->skill_point,
  62. p->option,p->karma,p->manner, //
  63. p->party_id,p->guild_id,p->pet_id,
  64. p->hair,p->hair_color,p->clothes_color,
  65. p->weapon,p->shield,p->head_top,p->head_mid,p->head_bottom,
  66. p->last_point.map,p->last_point.x,p->last_point.y, //
  67. p->save_point.map,p->save_point.x,p->save_point.y
  68. );
  69. strcat(str,"\t");
  70. for(i=0;i<3;i++)
  71. if(p->memo_point[i].map[0]){
  72. sprintf(str+strlen(str),"%s,%d,%d",p->memo_point[i].map,p->memo_point[i].x,p->memo_point[i].y);
  73. }
  74. strcat(str,"\t");
  75. for(i=0;i<MAX_INVENTORY;i++)
  76. if(p->inventory[i].nameid){
  77. sprintf(str+strlen(str),"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ",
  78. p->inventory[i].id,p->inventory[i].nameid,p->inventory[i].amount,p->inventory[i].equip,
  79. p->inventory[i].identify,p->inventory[i].refine,p->inventory[i].attribute,
  80. p->inventory[i].card[0],p->inventory[i].card[1],p->inventory[i].card[2],p->inventory[i].card[3]);
  81. }
  82. strcat(str,"\t");
  83. for(i=0;i<MAX_CART;i++)
  84. if(p->cart[i].nameid){
  85. sprintf(str+strlen(str),"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ",
  86. p->cart[i].id,p->cart[i].nameid,p->cart[i].amount,p->cart[i].equip,
  87. p->cart[i].identify,p->cart[i].refine,p->cart[i].attribute,
  88. p->cart[i].card[0],p->cart[i].card[1],p->cart[i].card[2],p->cart[i].card[3]);
  89. }
  90. strcat(str,"\t");
  91. for(i=0;i<MAX_SKILL;i++)
  92. if(p->skill[i].id){
  93. sprintf(str+strlen(str),"%d,%d ",p->skill[i].id,p->skill[i].lv);
  94. }
  95. strcat(str,"\t");
  96. for(i=0;i<p->global_reg_num;i++)
  97. sprintf(str+strlen(str),"%s,%d ",p->global_reg[i].str,p->global_reg[i].value);
  98. strcat(str,"\t");
  99. return 0;
  100. }
  101. int mmo_char_fromstr(char *str,struct mmo_charstatus *p)
  102. {
  103. int tmp_int[256];
  104. int set,next,len,i;
  105. 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"
  106. "\t%d,%d,%d\t%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
  107. "\t%[^,],%d,%d\t%[^,],%d,%d%n",
  108. &tmp_int[0],&tmp_int[1],&tmp_int[2],p->name, //
  109. &tmp_int[3],&tmp_int[4],&tmp_int[5],
  110. &tmp_int[6],&tmp_int[7],&tmp_int[8],
  111. &tmp_int[9],&tmp_int[10],&tmp_int[11],&tmp_int[12],
  112. &tmp_int[13],&tmp_int[14],&tmp_int[15],&tmp_int[16],&tmp_int[17],&tmp_int[18],
  113. &tmp_int[19],&tmp_int[20],
  114. &tmp_int[21],&tmp_int[22],&tmp_int[23], //
  115. &tmp_int[24],&tmp_int[25],
  116. &tmp_int[26],&tmp_int[27],&tmp_int[28],
  117. &tmp_int[29],&tmp_int[30],&tmp_int[31],&tmp_int[32],&tmp_int[33],
  118. p->last_point.map,&tmp_int[34],&tmp_int[35], //
  119. p->save_point.map,&tmp_int[36],&tmp_int[37],&next
  120. );
  121. p->char_id=tmp_int[0];
  122. p->account_id=tmp_int[1];
  123. p->char_num=tmp_int[2];
  124. p->class=tmp_int[3];
  125. p->base_level=tmp_int[4];
  126. p->job_level=tmp_int[5];
  127. p->base_exp=tmp_int[6];
  128. p->job_exp=tmp_int[7];
  129. p->zeny=tmp_int[8];
  130. p->hp=tmp_int[9];
  131. p->max_hp=tmp_int[10];
  132. p->sp=tmp_int[11];
  133. p->max_sp=tmp_int[12];
  134. p->str=tmp_int[13];
  135. p->agi=tmp_int[14];
  136. p->vit=tmp_int[15];
  137. p->int_=tmp_int[16];
  138. p->dex=tmp_int[17];
  139. p->luk=tmp_int[18];
  140. p->status_point=tmp_int[19];
  141. p->skill_point=tmp_int[20];
  142. p->option=tmp_int[21];
  143. p->karma=tmp_int[22];
  144. p->manner=tmp_int[23];
  145. p->party_id=tmp_int[24];
  146. p->guild_id=tmp_int[25];
  147. p->pet_id=0;
  148. p->hair=tmp_int[26];
  149. p->hair_color=tmp_int[27];
  150. p->clothes_color=tmp_int[28];
  151. p->weapon=tmp_int[29];
  152. p->shield=tmp_int[30];
  153. p->head_top=tmp_int[31];
  154. p->head_mid=tmp_int[32];
  155. p->head_bottom=tmp_int[33];
  156. p->last_point.x=tmp_int[34];
  157. p->last_point.y=tmp_int[35];
  158. p->save_point.x=tmp_int[36];
  159. p->save_point.y=tmp_int[37];
  160. if(set!=41)
  161. return 0;
  162. if(str[next]=='\n' || str[next]=='\r')
  163. return 1; // 新規データ
  164. next++;
  165. for(i=0;str[next] && str[next]!='\t';i++){
  166. set=sscanf(str+next,"%[^,],%d,%d%n",p->memo_point[i].map,&tmp_int[0],&tmp_int[1],&len);
  167. if(set!=3)
  168. return 0;
  169. p->memo_point[i].x=tmp_int[0];
  170. p->memo_point[i].y=tmp_int[1];
  171. next+=len;
  172. if(str[next]==' ')
  173. next++;
  174. }
  175. next++;
  176. for(i=0;str[next] && str[next]!='\t';i++){
  177. set=sscanf(str+next,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
  178. &tmp_int[0],&tmp_int[1],&tmp_int[2],&tmp_int[3],
  179. &tmp_int[4],&tmp_int[5],&tmp_int[6],
  180. &tmp_int[7],&tmp_int[8],&tmp_int[9],&tmp_int[10],&len);
  181. if(set!=11)
  182. return 0;
  183. p->inventory[i].id=tmp_int[0];
  184. p->inventory[i].nameid=tmp_int[1];
  185. p->inventory[i].amount=tmp_int[2];
  186. p->inventory[i].equip=tmp_int[3];
  187. p->inventory[i].identify=tmp_int[4];
  188. p->inventory[i].refine=tmp_int[5];
  189. p->inventory[i].attribute=tmp_int[6];
  190. p->inventory[i].card[0]=tmp_int[7];
  191. p->inventory[i].card[1]=tmp_int[8];
  192. p->inventory[i].card[2]=tmp_int[9];
  193. p->inventory[i].card[3]=tmp_int[10];
  194. next+=len;
  195. if(str[next]==' ')
  196. next++;
  197. }
  198. next++;
  199. for(i=0;str[next] && str[next]!='\t';i++){
  200. set=sscanf(str+next,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
  201. &tmp_int[0],&tmp_int[1],&tmp_int[2],&tmp_int[3],
  202. &tmp_int[4],&tmp_int[5],&tmp_int[6],
  203. &tmp_int[7],&tmp_int[8],&tmp_int[9],&tmp_int[10],&len);
  204. if(set!=11)
  205. return 0;
  206. p->cart[i].id=tmp_int[0];
  207. p->cart[i].nameid=tmp_int[1];
  208. p->cart[i].amount=tmp_int[2];
  209. p->cart[i].equip=tmp_int[3];
  210. p->cart[i].identify=tmp_int[4];
  211. p->cart[i].refine=tmp_int[5];
  212. p->cart[i].attribute=tmp_int[6];
  213. p->cart[i].card[0]=tmp_int[7];
  214. p->cart[i].card[1]=tmp_int[8];
  215. p->cart[i].card[2]=tmp_int[9];
  216. p->cart[i].card[3]=tmp_int[10];
  217. next+=len;
  218. if(str[next]==' ')
  219. next++;
  220. }
  221. next++;
  222. for(i=0;str[next] && str[next]!='\t';i++){
  223. set=sscanf(str+next,"%d,%d%n",
  224. &tmp_int[0],&tmp_int[1],&len);
  225. if(set!=2)
  226. return 0;
  227. p->skill[tmp_int[0]].id=tmp_int[0];
  228. p->skill[tmp_int[0]].lv=tmp_int[1];
  229. next+=len;
  230. if(str[next]==' ')
  231. next++;
  232. }
  233. next++;
  234. for(i=0;str[next] && str[next]!='\t' && str[next]!='\n' && str[next]!='\r';i++){ //global_reg実装以前のathena.txt互換のため一応'\n'チェック
  235. set=sscanf(str+next,"%[^,],%d%n",
  236. p->global_reg[i].str,&p->global_reg[i].value,&len);
  237. if(set!=2)
  238. return 0;
  239. next+=len;
  240. if(str[next]==' ')
  241. next++;
  242. }
  243. p->global_reg_num=i;
  244. return 1;
  245. }
  246. int mmo_char_convert(char *fname1,char *fname2)
  247. {
  248. char line[65536];
  249. int ret;
  250. struct mmo_charstatus char_dat;
  251. FILE *ifp,*ofp;
  252. ifp=fopen(fname1,"r");
  253. ofp=fopen(fname2,"w");
  254. if(ifp==NULL) {
  255. printf("file not found %s\n",fname1);
  256. return 0;
  257. }
  258. if(ofp==NULL) {
  259. printf("file open error %s\n",fname2);
  260. return 0;
  261. }
  262. while(fgets(line,65535,ifp)){
  263. memset(&char_dat,0,sizeof(struct mmo_charstatus));
  264. ret=mmo_char_fromstr(line,&char_dat);
  265. if(ret){
  266. mmo_char_tostr(line,&char_dat);
  267. fprintf(ofp,"%s" RETCODE,line);
  268. }
  269. }
  270. fcloseall();
  271. return 0;
  272. }
  273. int main(int argc,char *argv[])
  274. {
  275. if(argc < 3) {
  276. printf("Usage: convert <input filename> <output filename>\n");
  277. exit(0);
  278. }
  279. mmo_char_convert(argv[1],argv[2]);
  280. return 0;
  281. }