⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 d2charfile.c

📁 打魔兽战网的都知道他是什么
💻 C
📖 第 1 页 / 共 2 页
字号:
	    }	}	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;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -