📄 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; } 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];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -