chuyiwen_gmsv/magic/magic_base.c

510 lines
13 KiB
C
Raw Normal View History

2016-12-24 08:45:52 +08:00
#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_MAGIC
AttMagic *ATTMAGIC_magic;
int ATTMAGIC_magicnum;
#endif
typedef struct tagMagic_MagicFunctionTable
{
char *functionname; /* <09><><EFBFBD><EFBFBD>ɬ<EFBFBD>ð<EFBFBD><C3B0><EFBFBD><EFBFBD>̻<EFBFBD><CCBB><EFBFBD>̤<EFBFBD><CCA4><EFBFBD><EFBFBD><EFBFBD>Ѽ<EFBFBD> <20><> */
MAGIC_CALLFUNC func; /* <20>˱<EFBFBD><CBB1><EFBFBD>̫<EFBFBD><CCAB><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
int hash; /* hash */
}MAGIC_MagicFunctionTable;
/* <20><><EFBFBD><EFBFBD>ë ֧<><D6A7><EFBFBD><EFBFBD><EFBFBD>ճ<EFBFBD><D5B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
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 <20><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>
{ "MAGIC_Weaken", MAGIC_Weaken, 0},
#endif
#ifdef _MAGIC_DEEPPOISON // vincent <20><><EFBFBD><EFBFBD>:<3A>
{ "MAGIC_StatusChange2", MAGIC_StatusChange2,0},
#endif
#ifdef _MAGIC_BARRIER // vincent <20><><EFBFBD><EFBFBD><><C4A7>
{ "MAGIC_Barrier", MAGIC_Barrier, 0},
#endif
#ifdef _MAGIC_NOCAST // vincent <20><><EFBFBD><EFBFBD>:<3A><>Ĭ
{ "MAGIC_Nocast", MAGIC_Nocast, 0},
#endif
#ifdef _MAGIC_TOCALL // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{ "MAGIC_ToCallDragon", MAGIC_ToCallDragon, 0},
#endif
};
/*----------------------------------------------------------------------*/
/* <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>ʧ<EFBFBD>ͱ<EFBFBD><CDB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/*----------------------------------------------------------------------*/
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 "\0";
if( !MAGIC_CHECKCHARDATAINDEX( element)) return "\0";
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;
}
/*----------------------------------------------------------------------
* ܷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ë<EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>
*---------------------------------------------------------------------*/
int MAGIC_getMagicNum( void)
{
return MAGIC_magicnum;
}
/*----------------------------------------------------------------------
* ܷ<EFBFBD><EFBFBD>ɬ<EFBFBD>ð<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̻<EFBFBD>ë <EFBFBD><EFBFBD>
*---------------------------------------------------------------------*/
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( "<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>\n");
return FALSE;
}
MAGIC_magicnum=0;
/* <20><><EFBFBD><EFBFBD> <20><>ئ<EFBFBD><EFBFBD>ϵ<EFBFBD>ؤ<EFBFBD>¾<EFBFBD><C2BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʃ<EFBFBD><C6A9><EFBFBD><EFBFBD> */
while( fgets( line, sizeof( line ), f ) ){
linenum ++;
if( line[0] == '#' )continue; /* comment */
if( line[0] == '\n' )continue; /* none */
chomp( line );
#ifdef _MAGIC_OPTIMUM // Robin ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>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("<EFBFBD><EFBFBD>Чħ<EFBFBD><EFBFBD>:%d <20><><EFBFBD><EFBFBD>ħ<EFBFBD><C4A7>:%d ...", MAGIC_magicnum, max_magicid);
MAGIC_magicnum = max_magicid +1;
#endif
if( fseek( f, 0, SEEK_SET ) == -1 ){
fprint( "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n" );
fclose(f);
return FALSE;
}
MAGIC_magic = allocateMemory( sizeof(struct tagMagic)
* MAGIC_magicnum );
if( MAGIC_magic == NULL ){
fprint( "<EFBFBD>޷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD> %d\n" ,
sizeof(struct tagMagic)*MAGIC_magicnum);
fclose( f );
return FALSE;
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
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,"");
}
}
/* <20><><EFBFBD><EFBFBD> <20><> <20><> */
linenum = 0;
while( fgets( line, sizeof( line ), f ) ){
linenum ++;
if( line[0] == '#' )continue; /* comment */
if( line[0] == '\n' )continue; /* none */
chomp( line );
/* <20><>ë<EFBFBD><C3AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/* <20><><EFBFBD><EFBFBD> tab ë " " <20><> <20><EFBFBD><E5BEA7><EFBFBD><EFBFBD> */
replaceString( line, '\t' , ' ' );
/* <20><> <20><><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD>ë<EFBFBD><C3AB><EFBFBD>£<EFBFBD>*/
{
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 ++ ) {
/* ٯ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD>ëέ<C3AB><CEAD> */
ret = getStringFromIndexWithDelim( line,",",
i + 1,
token,sizeof(token));
if( ret==FALSE ){
fprint("<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:%s <20><>%d<><64>\n",filename,linenum);
break;
}
MAGIC_setChar( magic_readlen, i, token);
}
/* 4<><34> <20><><EFBFBD>Ϸ<EFBFBD><CFB7>Ѱ<EFBFBD><D1B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
#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("<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:%s <20><>%d<><64>\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
/* <20>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>سƶ<D8B3><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD> */
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( "<EFBFBD><EFBFBD>Чħ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %d...", MAGIC_magicnum );
/* hash <20><><EFBFBD><EFBFBD> */
for( i = 0; i < arraysizeof( MAGIC_functbl); i ++ ) {
MAGIC_functbl[i].hash = hashpjw( MAGIC_functbl[i].functionname);
}
return TRUE;
}
/*------------------------------------------------------------------------
* Magic<EFBFBD><EFBFBD>ɬ<EFBFBD>ð<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̻<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
*-----------------------------------------------------------------------*/
BOOL MAGIC_reinitMagic( void )
{
freeMemory( MAGIC_magic);
return( MAGIC_initMagic( getMagicfile()));
}
#ifdef _ATTACK_MAGIC
/*------------------------------------------------------------------------
* AttMagic<EFBFBD>ij<EFBFBD>ʼ<EFBFBD><EFBFBD>
*-----------------------------------------------------------------------*/
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( "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ʧ<EFBFBD><EFBFBD>\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( "<EFBFBD>޷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD> %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( "<EFBFBD><EFBFBD>Ч<EFBFBD>Ĺ<EFBFBD><EFBFBD><EFBFBD>ħ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> %d\n" , ATTMAGIC_magicnum );
return TRUE;
}
/*------------------------------------------------------------------------
* AttMagic<EFBFBD><EFBFBD><EFBFBD>ٶȳ<EFBFBD>ʼ<EFBFBD><EFBFBD>
*-----------------------------------------------------------------------*/
BOOL ATTMAGIC_reinitMagic( void )
{
freeMemory( ATTMAGIC_magic );
ATTMAGIC_magicnum = 0;
return ATTMAGIC_initMagic( getAttMagicfileName() );
// return ATTMAGIC_initMagic( getMagicfile() );
}
#endif
/*------------------------------------------------------------------------
* MAGIC_ID<EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD>ٯë<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* ߯Ի<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> : <EFBFBD><EFBFBD>ٯ
* <EFBFBD><EFBFBD> : -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;
}
/*------------------------------------------------------------
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>պ<EFBFBD><EFBFBD>̼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ë߯<EFBFBD><EFBFBD>
* ¦<EFBFBD><EFBFBD>
* name char* <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
* ߯Ի<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ѳ߼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ئ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>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)
/*
<EFBFBD><EFBFBD> Nuke <EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>
ܷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ë<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>
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