#include #include #define RETCODE "\r\n" #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;iinventory[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;icart[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;iskill[i].id){ sprintf(str+strlen(str),"%d,%d ",p->skill[i].id,p->skill[i].lv); } strcat(str,"\t"); for(i=0;iglobal_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" RETCODE,line); } } fcloseall(); return 0; } int main(int argc,char *argv[]) { if(argc < 3) { printf("Usage: convert \n"); exit(0); } mmo_char_convert(argv[1],argv[2]); return 0; }