📄 npccreate.c
字号:
#include "version.h"
#define __NPCCREATE__
#include <stdio.h>
#include <string.h>
#include "common.h"
#include "npccreate.h"
#include "npctemplate.h"
#include "util.h"
#include "buf.h"
#include "readmap.h"
#include "char_data.h"
#include "handletime.h"
#include "configfile.h"
INLINE int NPC_CHECKCREATEINDEX(int index)
{
if( NPC_createnum <= index || index < 0 )return FALSE;
return TRUE;
}
INLINE int NPC_CHECKCREATEINTINDEX( int index)
{
if( NPC_CREATEINTNUM <= index || index < 0 )return FALSE;
return TRUE;
}
INLINE int NPC_setCreateInt( int index , NPC_CREATEINT element, int data )
{
int buf;
buf = NPC_create[index].intdata[element];
NPC_create[index].intdata[element] = data;
return buf;
}
INLINE int NPC_getCreateInt( int index , NPC_CREATEINT element )
{
return NPC_create[index].intdata[element];
}
BOOL NPC_initCreateArray( int createnum )
{
NPC_createnum = createnum;
NPC_create = (NPC_Create*)allocateMemory( sizeof( NPC_Create ) * NPC_createnum );
print( "开启大小:%d. 创建数量:%d.\n", sizeof( NPC_Create ), createnum);
if( NPC_create == NULL ){
return FALSE;
}
NPC_create_readindex = 0;
return TRUE;
}
void NPC_setDefaultNPCCreate( NPC_Create* cr )
{
if( cr == NULL )return;
cr->intdata[NPC_CREATEFLOORID]=0;
cr->intdata[NPC_CREATEBORNLEFTUPX]=0;
cr->intdata[NPC_CREATEBORNLEFTUPY]=0;
cr->intdata[NPC_CREATEBORNRIGHTDOWNX]=0;
cr->intdata[NPC_CREATEBORNRIGHTDOWNY]=0;
cr->intdata[NPC_CREATEMOVELEFTUPX]=0;
cr->intdata[NPC_CREATEMOVELEFTUPY]=0;
cr->intdata[NPC_CREATEMOVERIGHTDOWNX]=0;
cr->intdata[NPC_CREATEMOVERIGHTDOWNY]=0;
cr->intdata[NPC_CREATEDIR]=0;
//jeffrey 1231
#ifdef _ADD_ACTION
cr->intdata[NPC_CREATEACTION] = 0;
#endif
cr->intdata[NPC_CREATEBASEIMAGENUMBER]=-1;
cr->intdata[NPC_CREATETIME]=0;
cr->intdata[NPC_CREATEBORNNUM]=0;
cr->intdata[NPC_CREATEENEMYNUM]=0;
cr->intdata[NPC_CREATEBOUNDARY]=1;
cr->intdata[NPC_CREATEIGNOREINVINCIBLE]=0;
cr->intdata[NPC_CREATEDATE]=0;
cr->intdata[NPC_CREATEFAMILY]=0;
cr->chardata[NPC_CREATENAME].string[0]= '\0';
cr->workdata[NPC_CREATEWORKENEMYNUM]=0;
cr->workdata[NPC_CREATEWORKMAKESTARTSEC]=0;
cr->workdata[NPC_CREATEWORKMAKESTARTUSEC]=0;
cr->workdata[NPC_CREATEWORKNEVERMAKE]=0;
{
int i;
for( i=0 ; i<arraysizeof(cr->templateindex) ; i++ ){
cr->templateindex[i] = -1;
cr->arg[i].string[0] = '\0';
}
}
}
BOOL NPC_IsNPCCreateFile( char* filename )
{
FILE* f;
char line1[128];
char* ret;
/* ~匹蔽月白央奶伙反卅仄卞允月 */
if( filename == NULL
|| strlen( filename ) < 1
|| filename[strlen(filename)-1] == '~'
|| filename[0] == '#'
|| strcmptail( filename, ".bak" ) == 0 )return FALSE;
f= fopen( filename , "r" );
if( f == NULL ) goto RETURNFALSE;
ret = fgets( line1, sizeof( line1 ), f );
if( ret == NULL )goto FCLOSERETURNFALSE;
if( strcasecmp( NPC_CREATEFILEMAGIC, line1 ) == 0 ){
fclose(f);
return TRUE;
}
FCLOSERETURNFALSE:
fclose(f);
RETURNFALSE:
return FALSE;
}
static int NPC_readCreateFile( char* filename )
{
FILE* f;
char line[512];
int linenum=0;
int start=OFF;
NPC_Create cr;
int enemyreadindex=0;
typedef struct tagPOINT
{
int x,y;
}POINT;
typedef struct tagREC
{
int w,h;
}REC;
POINT center[2]={{0,0},{0,0}}; /* born 互 0 匹 move 互 1 */
REC wh[2] ={{0,0},{0,0}}; /* born 互 0 匹 move 互 1 */
POINT lu[2] ={{0,0},{0,0}}; /* born 互 0 匹 move 互 1 */
POINT rd[2] ={{0,0},{0,0}}; /* born 互 0 匹 move 互 1 */
int defborn=FALSE; /* born 毛涩烂仄凶井升丹井 */
int defmove=FALSE; /* move 毛涩烂仄凶井升丹井 */
int deflurd[2]={FALSE,FALSE}; /* lu,rd 匹涩烂仄凶井升丹井 */
char* ret;
if( NPC_create_readindex >= NPC_createnum ){
print("创建超过配置缓冲\n" );
print("配置缓冲数目是 %d\n",NPC_createnum);
print("没用文件 %s\n",filename);
return FALSE;
}
NPC_setDefaultNPCCreate( &cr );
f= fopen( filename ,"r");
if( f == NULL )return FALSE;
ret = fgets( line, sizeof( line ), f );
if( ret == NULL )goto FCLOSERETURNFALSE;
if( strcmp( NPC_CREATEFILEMAGIC, line ) != 0 ){
print( "这不是一个create文件.\n" );
goto FCLOSERETURNFALSE;
}
linenum = 1;
while( fgets( line , sizeof( line ) , f ) ){
linenum++;
if( line[0] == '#' )continue; /* comment */
if( line[0] == '\n' )continue; /* none */
chomp( line );
switch( line[0] ){
case '{':
if( start == ON ){
fprint( "Find {. But already START state. %s:%d\n",
filename, linenum);
fprint( "退出\n" );
goto FCLOSERETURNFALSE;
}else{
NPC_setDefaultNPCCreate( &cr );
start = ON;
}
break;
case '}':
if( start == ON ){
int err = FALSE;
if( enemyreadindex == 0 ){
err = TRUE;
print( "这不是遇敌数据 %s:%d\n",
filename,linenum);
}else if( MAP_IsThereSpecificFloorid(
cr.intdata[NPC_CREATEFLOORID]) == FALSE ){
err = TRUE;
print( "地图ID号有毛病 %s:%d-floor:%d\n",
filename,linenum, cr.intdata[NPC_CREATEFLOORID]);
}else if( defborn == FALSE ){
err = TRUE;
print( "这些不是 born 安装 %s:%d\n",
filename,linenum);
}
if( err == FALSE ){
cr.intdata[NPC_CREATEENEMYNUM] = enemyreadindex;
if( deflurd[0] ){
cr.intdata[NPC_CREATEBORNLEFTUPX] =
min(lu[0].x,rd[0].x);
cr.intdata[NPC_CREATEBORNRIGHTDOWNX] =
max(lu[0].x,rd[0].x);
cr.intdata[NPC_CREATEBORNLEFTUPY] =
min(lu[0].y,rd[0].y);
cr.intdata[NPC_CREATEBORNRIGHTDOWNY] =
max(lu[0].y,rd[0].y);
}else{
cr.intdata[NPC_CREATEBORNLEFTUPX] =
center[0].x-wh[0].w/2;
cr.intdata[NPC_CREATEBORNRIGHTDOWNX] =
center[0].x+wh[0].w/2;
cr.intdata[NPC_CREATEBORNLEFTUPY] =
center[0].y-wh[0].h/2;
cr.intdata[NPC_CREATEBORNRIGHTDOWNY] =
center[0].y+wh[0].h/2;
}
/* 99/01/21 扎鼹 [0]-->[1]卞膜恳 */
if( defmove ){
if( deflurd[0] ){
cr.intdata[NPC_CREATEMOVELEFTUPX] =
min(lu[1].x,rd[1].x);
cr.intdata[NPC_CREATEMOVERIGHTDOWNX] =
max(lu[1].x,rd[1].x);
cr.intdata[NPC_CREATEMOVELEFTUPY] =
min(lu[1].y,rd[1].y);
cr.intdata[NPC_CREATEMOVERIGHTDOWNY] =
max(lu[1].y,rd[1].y);
}else{
cr.intdata[NPC_CREATEMOVELEFTUPX] =
center[1].x-wh[1].w/2;
cr.intdata[NPC_CREATEMOVERIGHTDOWNX] =
center[1].x+wh[1].w/2;
cr.intdata[NPC_CREATEMOVELEFTUPY] =
center[1].y-wh[1].h/2;
cr.intdata[NPC_CREATEMOVERIGHTDOWNY] =
center[1].y+wh[1].h/2;
}
}else{
/* born 毛戊疋□允月 */
cr.intdata[NPC_CREATEMOVELEFTUPX] =
cr.intdata[NPC_CREATEBORNLEFTUPX];
cr.intdata[NPC_CREATEMOVERIGHTDOWNX] =
cr.intdata[NPC_CREATEBORNRIGHTDOWNX];
cr.intdata[NPC_CREATEMOVELEFTUPY] =
cr.intdata[NPC_CREATEBORNLEFTUPY];
cr.intdata[NPC_CREATEMOVERIGHTDOWNY] =
cr.intdata[NPC_CREATEBORNRIGHTDOWNY];
}
memcpy( &NPC_create[NPC_create_readindex], &cr,
sizeof( NPC_Create ) );
NPC_create_readindex++;
if( NPC_create_readindex >= NPC_createnum ){
print("创建超过配置缓冲\n" );
print("配置创建文件数目 %d\n",
NPC_createnum);
print("没用文件:%s\n",filename);
goto FCLOSERETURNFALSE;
}
}
/* 赓渝袄卞 仄化云仁 */
NPC_setDefaultNPCCreate( &cr );
enemyreadindex=0;
defborn=FALSE;
defmove=FALSE;
deflurd[0]=FALSE;
deflurd[1]=FALSE;
start = OFF;
}else{
fprint( "未解决 '}' at %s:%d\n",filename,linenum);
goto FCLOSERETURNFALSE;
}
break;
default:
{
char firstToken[256];
char secondToken[256];
int ret;
ret = getStringFromIndexWithDelim( line, "=", 1, firstToken,
sizeof( firstToken ) );
if( ret == FALSE ){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -