diff options
Diffstat (limited to 'src/tool')
-rw-r--r-- | src/tool/Makefile | 10 | ||||
-rw-r--r-- | src/tool/adduser.c | 99 | ||||
-rw-r--r-- | src/tool/convert.c | 299 |
3 files changed, 408 insertions, 0 deletions
diff --git a/src/tool/Makefile b/src/tool/Makefile new file mode 100644 index 000000000..d8614c300 --- /dev/null +++ b/src/tool/Makefile @@ -0,0 +1,10 @@ +all: adduser convert
+
+adduser:
+ $(CC) -o ../../tools/$@ adduser.c
+
+convert:
+ $(CC) -o ../../tools/$@ convert.c
+
+clean:
+ rm -rf ../../tools/adduser ../../tools/convert
diff --git a/src/tool/adduser.c b/src/tool/adduser.c new file mode 100644 index 000000000..2c8e1524b --- /dev/null +++ b/src/tool/adduser.c @@ -0,0 +1,99 @@ +// (c) eAthena Dev Team - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+/*
+ This program adds an user to account.txt
+ Don't usr it When login-sever is working.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+char *account_txt = "../save/account.txt";
+
+//-----------------------------------------------------
+// Function to suppress control characters in a string.
+//-----------------------------------------------------
+int remove_control_chars(unsigned char *str) {
+ int i;
+ int change = 0;
+
+ for(i = 0; str[i]; i++) {
+ if (str[i] < 32) {
+ str[i] = '_';
+ change = 1;
+ }
+ }
+
+ return change;
+}
+
+int main(int argc, char *argv[]) {
+
+ char username[24];
+ char password[24];
+ char sex[2];
+
+ int next_id, id;
+ char line[1024];
+
+ // Check to see if account.txt exists.
+ printf("Checking if '%s' file exists...\n", account_txt);
+ FILE *FPaccin = fopen(account_txt, "r");
+ if (FPaccin == NULL) {
+ printf("'%s' file not found!\n", account_txt);
+ printf("Run the setup wizard please.\n");
+ exit(0);
+ }
+
+ next_id = 2000000;
+ while(fgets(line, sizeof(line)-1, FPaccin)) {
+ if (line[0] == '/' && line[1] == '/') { continue; }
+ if (sscanf(line, "%d\t%%newid%%\n", &id) == 1) {
+ if (next_id < id) {
+ next_id = id;
+ }
+ } else {
+ sscanf(line,"%i%[^ ]", &id);
+ if (next_id <= id) {
+ next_id = id +1;
+ }
+ }
+ }
+ close(FPaccin);
+ printf("File exists.\n");
+
+ printf("Don't create an account if the login-server is online!!!\n");
+ printf("If the login-server is online, press ctrl+C now to stop this software.\n");
+ printf("\n");
+
+ strcpy(username, "");
+ while (strlen(username) < 4 || strlen(username) > 23) {
+ printf("Enter an username (4-23 characters): ");
+ scanf("%s", &username);
+ username[23] = 0;
+ remove_control_chars(username);
+ }
+
+ strcpy(password, "");
+ while (strlen(password) < 4 || strlen(password) > 23) {
+ printf("Enter a password (4-23 characters): ");
+ scanf("%s", &password);
+ password[23] = 0;
+ remove_control_chars(password);
+ }
+
+ strcpy(sex, "");
+ while (strcmp(sex, "F") != 0 && strcmp(sex, "M") != 0) {
+ printf("Enter a gender (M for male, F for female): ");
+ scanf("%s", &sex);
+ }
+
+ FILE *FPaccout = fopen(account_txt, "r+");
+ fseek(FPaccout, 0, SEEK_END);
+ fprintf(FPaccout, "%i %s %s - %s -\r\n", next_id, username, password, sex);
+ close(FPaccout);
+
+ printf("Account added.\n");
+}
diff --git a/src/tool/convert.c b/src/tool/convert.c new file mode 100644 index 000000000..2e81bfedd --- /dev/null +++ b/src/tool/convert.c @@ -0,0 +1,299 @@ +// (c) eAthena Dev Team - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#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;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" RETCODE,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;
+}
|