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

📄 magic_base.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
字号:
#include "version.h"#include <stdio.h>#include <string.h>#include "common.h"#include "buf.h"#include "configfile.h"#include "magic_base.h"#include "magic.h"static Magic	*MAGIC_magic;static int		MAGIC_magicnum;#ifdef __ATTACK_MAGICAttMagic	*ATTMAGIC_magic;int		 ATTMAGIC_magicnum;#endiftypedef struct tagMagic_MagicFunctionTable{	char			*functionname;		/*	热诸涩烂白央奶伙卞踏仁楮醒及  蟆 */	MAGIC_CALLFUNC	func;				/*    端卞裟太请今木月楮醒 */	int				hash;				/*  hash */}MAGIC_MagicFunctionTable;/* 热诸毛  支仄凶日仇仇卞瓒  允月仪 */static MAGIC_MagicFunctionTable MAGIC_functbl[] = {	{ "MAGIC_Recovery", 		MAGIC_Recovery,			0},	{ "MAGIC_OtherRecovery",	MAGIC_OtherRecovery,	0},	{ "MAGIC_FieldAttChange",	MAGIC_FieldAttChange,	0},	{ "MAGIC_StatusChange",		MAGIC_StatusChange,		0},	{ "MAGIC_MagicDef",			MAGIC_MagicDef,			0},	{ "MAGIC_StatusRecovery",	MAGIC_StatusRecovery,	0},	{ "MAGIC_Ressurect",		MAGIC_Ressurect,	0},	{ "MAGIC_AttReverse",		MAGIC_AttReverse,	0},	{ "MAGIC_ResAndDef",		MAGIC_ResAndDef,	0},	#ifdef __ATTACK_MAGIC	{ "MAGIC_AttMagic" , 		MAGIC_AttMagic , 0 },#endif#ifdef _OTHER_MAGICSTAUTS	{ "MAGIC_MagicStatusChange",	MAGIC_MagicStatusChange,	0},#endif#ifdef _ITEM_METAMO	{ "MAGIC_Metamo", 		MAGIC_Metamo,	0},#endif#ifdef _ITEM_ATTSKILLMAGIC	//{ "MAGIC_AttSkill", 		MAGIC_AttSkill,	0},#endif#ifdef _MAGIC_WEAKEN       // vincent  精灵:虚弱	{ "MAGIC_Weaken", 		  MAGIC_Weaken,	      0},#endif#ifdef _MAGIC_DEEPPOISON   // vincent  精灵:剧毒	{ "MAGIC_StatusChange2",  MAGIC_StatusChange2,0},#endif#ifdef _MAGIC_BARRIER      // vincent  精灵:魔障	{ "MAGIC_Barrier", 		  MAGIC_Barrier,	  0},#endif#ifdef _MAGIC_NOCAST       // vincent  精灵:沉默	{ "MAGIC_Nocast", 		  MAGIC_Nocast,	      0},#endif#ifdef _MAGIC_TOCALL	// 奔龙阵	{ "MAGIC_ToCallDragon",	MAGIC_ToCallDragon,		0},#endif};/*----------------------------------------------------------------------*//* 湘  民尼永弁]失弁本旦楮溢 *//*----------------------------------------------------------------------*/INLINE BOOL MAGIC_CHECKINDEX( int index ){    if( MAGIC_magicnum<=index || index<0 )return FALSE;    return TRUE;}/*----------------------------------------------------------------------*/static INLINE BOOL MAGIC_CHECKINTDATAINDEX( int index){	if( MAGIC_DATAINTNUM <= index || index < 0 ) return FALSE;	return TRUE;}/*----------------------------------------------------------------------*/static INLINE BOOL MAGIC_CHECKCHARDATAINDEX( int index){	if( MAGIC_DATACHARNUM <= index || index < 0 ) return FALSE;	return TRUE;}/*----------------------------------------------------------------------*/INLINE int MAGIC_getInt( int index, MAGIC_DATAINT element){	return MAGIC_magic[index].data[element];}/*----------------------------------------------------------------------*/INLINE int MAGIC_setInt( int index, MAGIC_DATAINT element, int data){	int buf;	buf = MAGIC_magic[index].data[element];	MAGIC_magic[index].data[element]=data;	return buf;}/*----------------------------------------------------------------------*/INLINE char* MAGIC_getChar( int index, MAGIC_DATACHAR element){	if( !MAGIC_CHECKINDEX( index)) return NULL;	if( !MAGIC_CHECKCHARDATAINDEX( element)) return NULL;	return MAGIC_magic[index].string[element].string;}/*----------------------------------------------------------------------*/INLINE BOOL MAGIC_setChar( int index ,MAGIC_DATACHAR element, char* new ){    if(!MAGIC_CHECKINDEX(index))return FALSE;    if(!MAGIC_CHECKCHARDATAINDEX(element))return FALSE;    strcpysafe( MAGIC_magic[index].string[element].string,                sizeof(MAGIC_magic[index].string[element].string),                new );    return TRUE;}/*---------------------------------------------------------------------- *   芊及醒毛襞月[ *---------------------------------------------------------------------*/int MAGIC_getMagicNum( void){	return MAGIC_magicnum;}/*---------------------------------------------------------------------- *   芊及涩烂白央奶伙毛  戈 *---------------------------------------------------------------------*/BOOL MAGIC_initMagic( char *filename){    FILE*   f;    char    line[256];    int     linenum=0;    int     magic_readlen=0;	int		i,j;	int		max_magicid =0;	char	token[256];    f = fopen(filename,"r");    if( f == NULL ){        print( "文件打开失败\n");        return FALSE;    }    MAGIC_magicnum=0;    /*  引内  躲卅垫互窒垫丐月井升丹井譬屯月    */    while( fgets( line, sizeof( line ), f ) ){        linenum ++;        if( line[0] == '#' )continue;        /* comment */        if( line[0] == '\n' )continue;       /* none    */        chomp( line );#ifdef _MAGIC_OPTIMUM // Robin 取出最大MAGIC ID		if( getStringFromIndexWithDelim( line, ",", MAGIC_DATACHARNUM+MAGIC_ID+1,				token, sizeof(token)) == FALSE )			continue;		max_magicid = max( atoi( token), max_magicid);#endif        MAGIC_magicnum++;    }#ifdef _MAGIC_OPTIMUM	print("有效魔法:%d 最大魔法:%d ...", MAGIC_magicnum, max_magicid);	MAGIC_magicnum = max_magicid +1;#endif    if( fseek( f, 0, SEEK_SET ) == -1 ){        fprint( "搜索错误\n" );        fclose(f);        return FALSE;    }    MAGIC_magic = allocateMemory( sizeof(struct tagMagic)                                   * MAGIC_magicnum );    if( MAGIC_magic == NULL ){        fprint( "无法分配内存 %d\n" ,                sizeof(struct tagMagic)*MAGIC_magicnum);        fclose( f );        return FALSE;    }	/* 赓渝祭 */    for( i = 0; i < MAGIC_magicnum; i ++ ) {    	for( j = 0; j < MAGIC_DATAINTNUM; j ++ ) {    		MAGIC_setInt( i,j,-1);    	}    	for( j = 0; j < MAGIC_DATACHARNUM; j ++ ) {    		MAGIC_setChar( i,j,"");    	}    }    /*  引凶  心  允    */    linenum = 0;    while( fgets( line, sizeof( line ), f ) ){        linenum ++;        if( line[0] == '#' )continue;        /* comment */        if( line[0] == '\n' )continue;       /* none    */        chomp( line );        /*  垫毛帮溥允月    */        /*  引内 tab 毛 " " 卞  五晶尹月    */        replaceString( line, '\t' , ' ' );        /* 燮  及旦矢□旦毛潸月[*/{        char    buf[256];        for( i = 0; i < strlen( line); i ++) {            if( line[i] != ' ' ) {                break;            }            strcpy( buf, &line[i]);        }        if( i != 0 ) {            strcpy( line, buf);        }}{        char    token[256];        int     ret;#ifdef _MAGIC_OPTIMUM		if( getStringFromIndexWithDelim( line, ",", MAGIC_DATACHARNUM+MAGIC_ID+1,				token, sizeof(token)) == FALSE )			continue;		magic_readlen = atoi( token);#endif		for( i = 0; i < MAGIC_DATACHARNUM; i ++ ) {	        /*    侬  迕玄□弁件毛苇月    */	        ret = getStringFromIndexWithDelim( line,",",	        									i + 1,	        									token,sizeof(token));	        if( ret==FALSE ){	            fprint("文件语法错误:%s 第%d行\n",filename,linenum);	            break;	        }	        MAGIC_setChar( magic_readlen, i, token);		}        /* 4勾  动嫦反醒袄犯□正 */#define	MAGIC_STARTINTNUM		5        for( i = MAGIC_STARTINTNUM; i < MAGIC_DATAINTNUM+MAGIC_STARTINTNUM; i ++ ) {            ret = getStringFromIndexWithDelim( line,",",i,token,                                               sizeof(token));#ifdef __ATTACK_MAGIC                        if( FALSE == ret )            	break;            	            if( 0 != strlen( token ) )            {	            	MAGIC_setInt( magic_readlen , i - MAGIC_STARTINTNUM , atoi( token ) );            }            	                                               #else                                                           if( ret==FALSE ){                fprint("文件语法错误:%s 第%d行\n",filename,linenum);                break;            }            if( strlen( token) != 0 ) {	            MAGIC_setInt( magic_readlen, i - MAGIC_STARTINTNUM, atoi( token));			}				    #endif        }#ifdef __ATTACK_MAGIC                if( i != MAGIC_STARTINTNUM + MAGIC_IDX && i != MAGIC_DATAINTNUM + MAGIC_STARTINTNUM )        	continue;        	#else                if( i < MAGIC_DATAINTNUM+MAGIC_STARTINTNUM )        	 continue;        	 #endif		/* 切斤匀午尕称鼎分仃升仇丹允月[ */		if( MAGIC_getInt( magic_readlen, MAGIC_TARGET_DEADFLG) == 1 ) {			MAGIC_setInt( magic_readlen, MAGIC_TARGET,						MAGIC_getInt( magic_readlen, MAGIC_TARGET)+100);		}        magic_readlen ++;}    }    fclose(f);    MAGIC_magicnum = magic_readlen;    print( "有效魔法数是 %d...", MAGIC_magicnum );	/* hash 及瓒   */	for( i = 0; i < arraysizeof( MAGIC_functbl); i ++ ) {		MAGIC_functbl[i].hash = hashpjw( MAGIC_functbl[i].functionname);	}#if 0    for( i=0; i <MAGIC_magicnum ; i++ ){        for( j = 0; j < MAGIC_DATACHARNUM; j ++ ) {	        print( "%s ", MAGIC_getChar( i, j));		}		print( "\n");        for( j = 0; j < MAGIC_DATAINTNUM; j ++ ) {            print( "%d ", MAGIC_getInt( i, j));        }        print( "\n-------------------------------------------------\n");    }#endif    return TRUE;}/*------------------------------------------------------------------------ * Magic及涩烂白央奶伙  心  仄 *-----------------------------------------------------------------------*/BOOL MAGIC_reinitMagic( void ){	freeMemory( MAGIC_magic);	return( MAGIC_initMagic( getMagicfile()));}#ifdef __ATTACK_MAGIC/*------------------------------------------------------------------------ * AttMagic的初始化 *-----------------------------------------------------------------------*/BOOL ATTMAGIC_initMagic( char *filename ){    FILE *file;	// Open file    if( NULL == ( file = fopen( filename , "r" ) ) )	{ 	    ATTMAGIC_magicnum	= 0;		ATTMAGIC_magic		= NULL;        return TRUE;    }	fseek( file , 0 , SEEK_END );	// Calculate the number of attack magics	ATTMAGIC_magicnum = ftell( file ) / sizeof( struct tagAttMagic );	if( ATTMAGIC_magicnum % 2 )	{		fprint( "打开文件失败\n" );		fclose( file );		return FALSE;	}        fseek( file , 0 , SEEK_SET );        	// Allocate memory to attack magics    ATTMAGIC_magic = allocateMemory( sizeof( struct tagAttMagic ) * ATTMAGIC_magicnum );	if( NULL == ATTMAGIC_magic )	{		fprint( "无法分配内存 %d\n" , sizeof( struct tagAttMagic ) * ATTMAGIC_magicnum );		fclose( file );		return FALSE;    }	// Read attack magics information	memset( ATTMAGIC_magic , 0 , sizeof( struct tagAttMagic ) * ATTMAGIC_magicnum );	fread( ATTMAGIC_magic , 1 , sizeof( struct tagAttMagic ) * ATTMAGIC_magicnum , file );		fclose( file );	ATTMAGIC_magicnum = ATTMAGIC_magicnum / 2;    print( "有效的攻击魔法数 %d\n" , ATTMAGIC_magicnum );	return TRUE;}/*------------------------------------------------------------------------ * AttMagic的再度初始化 *-----------------------------------------------------------------------*/BOOL ATTMAGIC_reinitMagic( void ){   freeMemory( ATTMAGIC_magic );   ATTMAGIC_magicnum = 0;      return ATTMAGIC_initMagic( getAttMagicfileName() );//	    return ATTMAGIC_initMagic( getMagicfile() );}#endif/*------------------------------------------------------------------------ * MAGIC_ID井日骄侬毛襞月楮醒 * 忒曰袄 * 岳  : 骄侬 * 撩  : -1 *-----------------------------------------------------------------------*/int MAGIC_getMagicArray( int magicid){#ifdef _MAGIC_OPTIMUM	if( magicid >= 0 && magicid < MAGIC_magicnum)		return	magicid;#else	int		i;	for( i = 0; i < MAGIC_magicnum; i ++ ) {		if( MAGIC_magic[i].data[MAGIC_ID] == magicid ) {			return i;		}	}#endif	return -1;}/*------------------------------------------------------------ * 热诸及楮醒  井日禾奶件正□毛忒允 * 娄醒 *  name        char*       热诸及  蟆 * 忒曰袄 *  楮醒尺及禾奶件正[卅中桦宁卞反NULL ------------------------------------------------------------*/MAGIC_CALLFUNC MAGIC_getMagicFuncPointer(char* name){    int i;    int hash; //ttom    //ttom 12/18/2000    if(name==NULL) return NULL;    //ttom    //int hash = hashpjw( name );    hash=hashpjw(name);    for( i = 0 ; i< arraysizeof( MAGIC_functbl) ; i++ ) {        if( MAGIC_functbl[i].hash == hash ) {        	if( strcmp( MAGIC_functbl[i].functionname, name ) == 0 )  {	            return MAGIC_functbl[i].func;			}		}	}    return NULL;}// Nuke start (08/23)/*  酱   Nuke 今氏及民尼永弁[    芊及躲绊  区毛民尼永弁允月[  Check the validity of the target of a magic.  Return value:	0: Valid	-1: Invalid*/int MAGIC_isTargetValid( int magicid, int toindex){	int marray;	marray= MAGIC_getMagicArray( magicid);	#ifdef __ATTACK_MAGIC	if( toindex >= 0 && toindex <= 19 )		return 0;	// One side of players	if( 20 == toindex || 21 == toindex )	{		if( MAGIC_TARGET_WHOLEOTHERSIDE == MAGIC_magic[marray].data[MAGIC_TARGET] || MAGIC_TARGET_ALL_ROWS == MAGIC_magic[marray].data[MAGIC_TARGET] ) 			return 0;		else			return -1;	}	// All players	if( 22 == toindex )	{		if( MAGIC_TARGET_ALL == MAGIC_magic[marray].data[MAGIC_TARGET] ) 			return 0;		else			return -1;	}	// One row	if( 23 == toindex || 24 == toindex || 25 == toindex || 26 == toindex )	{		if( MAGIC_TARGET_ONE_ROW == MAGIC_magic[marray].data[MAGIC_TARGET] )			return 0;		else			return -1;	}	#else	// Single player	if ((toindex >= 0x0) && (toindex <= 0x13)) return 0;	// All players	if (toindex == 0x16) {		if (MAGIC_magic[marray].data[MAGIC_TARGET] == MAGIC_TARGET_ALL) 			return 0; else return -1;	}	// One side of players	if ((toindex == 0x14) || (toindex == 0x15)) {		if (MAGIC_magic[marray].data[MAGIC_TARGET] == MAGIC_TARGET_WHOLEOTHERSIDE) 			return 0; else return -1;	}		#endif		// Others: Error	return -1;}// Nuke end

⌨️ 快捷键说明

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