?? d2charfile.c
字號:
} } xfree(file); eventlog(eventlog_level_info,__FUNCTION__,"character %s(*%s) deleted",charname,account); return 0;}extern int d2char_get_summary(char const * account, char const * charname,t_d2charinfo_summary * charinfo){ t_d2charinfo_file data; ASSERT(account,-1); ASSERT(charname,-1); ASSERT(charinfo,-1); if (d2charinfo_load(account, charname, &data)<0) { eventlog(eventlog_level_error,__FUNCTION__,"error loading character %s(*%s)",charname,account); return -1; } memcpy(charinfo,&data.summary,sizeof(data.summary)); eventlog(eventlog_level_info,__FUNCTION__,"character %s difficulty %d expansion %d hardcore %d dead %d loaded",charname, d2charinfo_get_difficulty(charinfo), d2charinfo_get_expansion(charinfo), d2charinfo_get_hardcore(charinfo),d2charinfo_get_dead(charinfo)); return 0;}extern int d2charinfo_load(char const * account, char const * charname, t_d2charinfo_file * data){ char * file; int size, ladder_time; if (d2char_check_charname(charname)<0) { eventlog(eventlog_level_error,__FUNCTION__,"got bad character name \"%s\"",charname); return -1; } if (d2char_check_acctname(account)<0) { eventlog(eventlog_level_error,__FUNCTION__,"got bad account name \"%s\"",account); return -1; } file=xmalloc(strlen(prefs_get_charinfo_dir())+1+strlen(account)+1+strlen(charname)+1); d2char_get_infofile_name(file,account,charname); size=sizeof(t_d2charinfo_file); if (file_read(file,data,&size)<0) { eventlog(eventlog_level_error,__FUNCTION__,"error loading character file %s",file); xfree(file); return -1; } if (size!=sizeof(t_d2charinfo_file)) { eventlog(eventlog_level_error,__FUNCTION__,"got bad charinfo file %s (length %d)",charname,size); xfree(file); return -1; } d2char_portrait_init(&data->portrait); if (d2charinfo_check(data) < 0) { xfree(file); return -1; } if (!(charstatus_get_ladder(bn_int_get(data->summary.charstatus)))) { bn_byte_set(&data->portrait.ladder, D2CHARINFO_PORTRAIT_PADBYTE); xfree(file); return 0; } ladder_time = prefs_get_ladder_start_time(); if ((ladder_time > 0) && bn_int_get(data->header.create_time) < ladder_time) { char buffer[MAX_SAVEFILE_SIZE]; unsigned int status_offset; unsigned char status; unsigned int charstatus; unsigned int size; unsigned int version; unsigned int checksum; FILE * fp; eventlog(eventlog_level_info,__FUNCTION__,"%s(*%s) was created in old ladder season, set to non-ladder", charname, account); if (!(fp=fopen(file,"wb"))) { eventlog(eventlog_level_error,__FUNCTION__,"charinfo file \"%s\" does not exist for account \"%s\"",file,account); xfree(file); return 0; } xfree(file); charstatus = bn_int_get(data->summary.charstatus); charstatus_set_ladder(charstatus, 0); bn_int_set(&data->summary.charstatus, charstatus); status=bn_byte_get(data->portrait.status); charstatus_set_ladder(status,0); bn_byte_set(&data->portrait.status,status); bn_byte_set(&data->portrait.ladder, D2CHARINFO_PORTRAIT_PADBYTE); if (fwrite(data,1,sizeof(*data),fp)!=sizeof(*data)) { eventlog(eventlog_level_error,__FUNCTION__,"error writing charinfo file for character \"%s\" (fwrite: %s)",charname,pstrerror(errno)); fclose(fp); return 0;} fclose(fp); file=xmalloc(strlen(prefs_get_charsave_dir())+1+strlen(charname)+1); d2char_get_savefile_name(file,charname); if (!(fp=fopen(file,"rb+"))) { eventlog(eventlog_level_error,__FUNCTION__,"could not open charsave file \"%s\" for reading and writing (fopen: %s)",file,pstrerror(errno)); xfree(file); return 0; } xfree(file); size=fread(buffer,1,sizeof(buffer),fp); if (!feof(fp)) { eventlog(eventlog_level_error,__FUNCTION__,"error reading charsave file for character \"%s\" (fread: %s)",charname,pstrerror(errno)); fclose(fp); return 0; } version=bn_int_get(buffer+D2CHARSAVE_VERSION_OFFSET); if (version>=0x5C) { status_offset=D2CHARSAVE_STATUS_OFFSET_109; } else { status_offset=D2CHARSAVE_STATUS_OFFSET; } status=bn_byte_get(buffer+status_offset); charstatus_set_ladder(status,0); /* FIXME: shouldn't abuse bn_*_set()... what's the best way to do this? */ bn_byte_set((bn_byte *)(buffer+status_offset),status); if (version>=0x5C) { checksum=d2charsave_checksum(buffer,size,D2CHARSAVE_CHECKSUM_OFFSET); bn_int_set((bn_int *)(buffer+D2CHARSAVE_CHECKSUM_OFFSET),checksum); } fseek(fp,0,SEEK_SET); if (fwrite(buffer,1,size,fp)!=size) { eventlog(eventlog_level_error,__FUNCTION__,"error writing charsave file for character %s (fwrite: %s)",charname,pstrerror(errno)); fclose(fp); return 0; } fclose(fp); } else { bn_byte_set(&data->portrait.ladder, 1); xfree(file); } return 0;}extern int d2charinfo_check(t_d2charinfo_file * data){ ASSERT(data,-1); if (bn_int_get(data->header.magicword) != D2CHARINFO_MAGICWORD) { eventlog(eventlog_level_error,__FUNCTION__,"info data check failed (header 0x%08X)",bn_int_get(data->header.magicword)); return -1; } if (bn_int_get(data->header.version) != D2CHARINFO_VERSION) { eventlog(eventlog_level_error,__FUNCTION__,"info data check failed (version 0x%08X)",bn_int_get(data->header.version)); return -1; } return 0;}extern int d2char_portrait_init(t_d2charinfo_portrait * portrait){ unsigned int i; unsigned char * p; p=(unsigned char *)portrait; for (i=0; i<sizeof(t_d2charinfo_portrait); i++) { if (!p[i]) p[i]=D2CHARINFO_PORTRAIT_PADBYTE; } p[i-1]='\0'; return 0;}extern int d2char_get_portrait(char const * account,char const * charname, t_d2charinfo_portrait * portrait){ t_d2charinfo_file data; ASSERT(charname,-1); ASSERT(account,-1); ASSERT(portrait,-1); if (d2charinfo_load(account, charname, &data)<0) { eventlog(eventlog_level_error,__FUNCTION__,"error loading character %s(*%s)",charname,account); return -1; } strcpy((char *)portrait,(char *)&data.portrait); return 0;}extern int d2char_check_charname(char const * name){ unsigned int i; unsigned char ch; if (!name) return -1; if (!isalpha((int)name[0])) return -1; for (i=1; i<=MAX_CHARNAME_LEN; i++) { ch=name[i]; if (ch=='\0') break; if (isalpha(ch)) continue; if (ch=='-') continue; if (ch=='_') continue; if (ch=='.') continue; return -1; } if (i >= MIN_NAME_LEN || i<= MAX_CHARNAME_LEN) return 0; return -1;}extern int d2char_check_acctname(char const * name){ unsigned int i; unsigned char ch; if (!name) return -1; if (!isalnum((int)name[0])) return -1; for (i=1; i<=MAX_CHARNAME_LEN; i++) { ch=name[i]; if (ch=='\0') break; if (isalnum(ch)) continue; if (strchr(prefs_get_d2cs_account_allowed_symbols(),ch)) continue; return -1; } if (i >= MIN_NAME_LEN || i<= MAX_ACCTNAME_LEN) return 0; return -1;}extern int d2char_get_savefile_name(char * filename, char const * charname){ char tmpchar[MAX_CHARNAME_LEN]; ASSERT(filename,-1); ASSERT(charname,-1); strncpy(tmpchar,charname,sizeof(tmpchar)); tmpchar[sizeof(tmpchar)-1]='\0'; strtolower(tmpchar); sprintf(filename,"%s/%s",prefs_get_charsave_dir(),tmpchar); return 0;}extern int d2char_get_bak_savefile_name(char * filename, char const * charname){ char tmpchar[MAX_CHARNAME_LEN]; ASSERT(filename,-1); ASSERT(charname,-1); strncpy(tmpchar,charname,sizeof(tmpchar)); tmpchar[sizeof(tmpchar)-1]='\0'; strtolower(tmpchar); sprintf(filename,"%s/%s",prefs_get_bak_charsave_dir(),tmpchar); return 0;}extern int d2char_get_infodir_name(char * filename, char const * account){ char tmpacct[MAX_ACCTNAME_LEN]; ASSERT(filename,-1); ASSERT(account,-1); strncpy(tmpacct,account,sizeof(tmpacct)); tmpacct[sizeof(tmpacct)-1]='\0'; strtolower(tmpacct); sprintf(filename,"%s/%s",prefs_get_charinfo_dir(),tmpacct); return 0;}extern int d2char_get_infofile_name(char * filename, char const * account, char const * charname){ char tmpchar[MAX_CHARNAME_LEN]; char tmpacct[MAX_ACCTNAME_LEN]; ASSERT(filename,-1); ASSERT(account,-1); ASSERT(charname,-1); strncpy(tmpchar,charname,sizeof(tmpchar)); tmpchar[sizeof(tmpchar)-1]='\0'; strtolower(tmpchar); strncpy(tmpacct,account,sizeof(tmpacct)); tmpchar[sizeof(tmpacct)-1]='\0'; strtolower(tmpacct); sprintf(filename,"%s/%s/%s",prefs_get_charinfo_dir(),tmpacct,tmpchar); return 0;}extern int d2char_get_bak_infofile_name(char * filename, char const * account, char const * charname){ char tmpchar[MAX_CHARNAME_LEN]; char tmpacct[MAX_ACCTNAME_LEN]; ASSERT(filename,-1); ASSERT(account,-1); ASSERT(charname,-1); strncpy(tmpchar,charname,sizeof(tmpchar)); tmpchar[sizeof(tmpchar)-1]='\0'; strtolower(tmpchar); strncpy(tmpacct,account,sizeof(tmpacct)); tmpchar[sizeof(tmpacct)-1]='\0'; strtolower(tmpacct); sprintf(filename,"%s/%s/%s",prefs_get_bak_charinfo_dir(),tmpacct,tmpchar); return 0;}extern unsigned int d2charinfo_get_ladder(t_d2charinfo_summary const * charinfo){ ASSERT(charinfo,0); return charstatus_get_ladder(bn_int_get(charinfo->charstatus));}extern unsigned int d2charinfo_get_expansion(t_d2charinfo_summary const * charinfo){ ASSERT(charinfo,0); return charstatus_get_expansion(bn_int_get(charinfo->charstatus));}extern unsigned int d2charinfo_get_level(t_d2charinfo_summary const * charinfo){ ASSERT(charinfo,0); return bn_int_get(charinfo->charlevel);}extern unsigned int d2charinfo_get_class(t_d2charinfo_summary const * charinfo){ ASSERT(charinfo,0); return bn_int_get(charinfo->charclass);}extern unsigned int d2charinfo_get_hardcore(t_d2charinfo_summary const * charinfo){ ASSERT(charinfo,0); return charstatus_get_hardcore(bn_int_get(charinfo->charstatus));}extern unsigned int d2charinfo_get_dead(t_d2charinfo_summary const * charinfo){ ASSERT(charinfo,0); return charstatus_get_dead(bn_int_get(charinfo->charstatus));}extern unsigned int d2charinfo_get_difficulty(t_d2charinfo_summary const * charinfo){ unsigned int difficulty; ASSERT(charinfo,0); if (d2charinfo_get_expansion(charinfo)) { difficulty=charstatus_get_difficulty_expansion(bn_int_get(charinfo->charstatus)); } else { difficulty=charstatus_get_difficulty(bn_int_get(charinfo->charstatus)); } if (difficulty>2) difficulty=2; return difficulty;}/* those functions should move to util.c */extern int file_read(char const * filename, void * data, unsigned int * size){ FILE * fp; unsigned int n; ASSERT(filename,-1); ASSERT(data,-1); ASSERT(size,-1); if (!(fp=fopen(filename,"rb"))) { eventlog(eventlog_level_error,__FUNCTION__,"could not open file \"%s\" for reading (fopen: %s)",filename,pstrerror(errno)); return -1; } fseek(fp,0,SEEK_END); /* FIXME: check return value */ n=ftell(fp); n=min(*size,n); rewind(fp); /* FIXME: check return value */ if (fread(data,1,n,fp)!=n) { eventlog(eventlog_level_error,__FUNCTION__,"error reading file \"%s\" (fread: %s)",filename,pstrerror(errno)); fclose(fp); return -1; } if (fclose(fp)<0) { eventlog(eventlog_level_error,__FUNCTION__,"could not close file \"%s\" after reading (fclose: %s)",filename,pstrerror(errno)); return -1; } *size=n; return 0;}extern int file_write(char const * filename, void * data, unsigned int size){ FILE * fp; ASSERT(filename,-1); ASSERT(data,-1); ASSERT(size,-1); if (!(fp=fopen(filename,"wb"))) { eventlog(eventlog_level_error,__FUNCTION__,"could not open file \"%s\" for writing (fopen: %s)",filename,pstrerror(errno)); return -1; } if (fwrite(data,1,size,fp)!=size) { eventlog(eventlog_level_error,__FUNCTION__,"error writing file \"%s\" (fwrite: %s)",filename,pstrerror(errno)); fclose(fp); return -1; } if (fclose(fp)<0) { eventlog(eventlog_level_error,__FUNCTION__,"could not close file \"%s\" after writing (fclose: %s)",filename,pstrerror(errno)); return -1; } return 0;}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -