📄 npcutil.c
字号:
*
* “
* [File:enemykill.create]
* enemy=enemykill|range:4
*
* call:
* range = NPC_Util_GetNumFromArg( index, "range");
*----------------------------------------------------------------------*/
int NPC_Util_GetNumFromArg( int meindex, char* in)
{
BOOL rc;
int i;
char outstr[sizeof( STRING32)];
int out = -1;
char *a = CHAR_getChar( meindex, CHAR_NPCARGUMENT);
for( i = 1; ; i++ ) {
/* 犯伉立正ㄠ勾内勾 戈 */
rc = getStringFromIndexWithDelim( a, "|", i, outstr, sizeof(outstr));
if( rc == FALSE) break;
if( strstr( outstr, in) != NULL ) {
out = textToInt( outstr);
break;
}
}
return out;
}
/*
* 失奶 丞及 index 午平乓仿 index 及孔凶勾及树 井日}
* 平乓仿互公及失奶 丞毛 匀化月井升丹井仄日屯化 匀化凶日升及
* 匏 卞 匀化月井毛忒允[ 失奶 丞楮 及NPC迕[CHAR_卞啖垫
* 匹五月井手仄木氏楮醒瓜伉
* by ringo
*
* int charindex : 覆擂平乓仿及 index
* int itemindex : 失奶 丞及index
*
* 忒曰袄
*
* >=0 : 升及匏 卞 匀化中月及井[ 躲卅袄[
* -1 : 手仄仁反 匀化卅中[
* -2 : 巨仿□[
*/
int NPC_Util_SearchItemInChar( int charindex , int itemindex)
{
int i;
if( !CHAR_CHECKINDEX(charindex) ) return -2;
if( !ITEM_CHECKINDEX(itemindex) ) return -2;
for(i=0;i<=CHAR_MAXITEMHAVE;i++){
int ii = CHAR_getItemIndex( charindex , i );
if( ii == itemindex ){
return i;
}
}
return -1;
}
/*------------------------------------------------------------------------
* 平乓仿井日心凶职及平乓仿及 轾毛菲户月
*
* int NPC_Util_GetDirCharToChar( int fromindex, int toindex, int mode)
*
* int fromindex 仇及平乓仿index井日
* int toindex 仇及平乓仿index卞覆仄化及 轾互菲户日木月
* int mode 潸 允月 轾
* 0:toindex卞轾井匀化
* 1:toindex及 覆 轾
* 2:toindex卞覆仄化惘ㄨㄟ蘸 轾
* 3:toindex卞覆仄化尔ㄨㄟ蘸 轾
*
* 忒曰袄 岳 “dir 轾毛忒允
* 撩 “-1
------------------------------------------------------------------------*/
int NPC_Util_GetDirCharToChar( int fromindex, int toindex, int mode)
{
int ret = -1;
if( CHAR_getInt( fromindex, CHAR_FLOOR)
== CHAR_getInt( toindex, CHAR_FLOOR))
{
POINT start,end;
int dir;
start.x = CHAR_getInt( fromindex, CHAR_X);
start.y = CHAR_getInt( fromindex, CHAR_Y);
end.x = CHAR_getInt( toindex, CHAR_X);
end.y = CHAR_getInt( toindex, CHAR_Y);
dir = NPC_Util_getDirFromTwoPoint( &start,&end );
if( mode == 1 ) dir = (dir > 3)? dir -4 : dir +4;
else if( mode == 2) dir = (dir + 2) % 8;
else if( mode == 3) dir = (dir < 1)? dir +6 : dir -2;
ret = dir;
}
return( ret);
}
/*------------------------------------------------------------------------
* 平乓仿卞覆仄化]丐月 轾卞啖 允月[
*
* int NPC_Util_WalkCharToChar( int fromindex, int toindex, int mode)
*
* int fromindex 汹仁平乓仿index
* int toindex 汹仁 及平乓仿index
* int mode 汹仁 轾
* 0:toindex卞轾井匀化
* 1:toindex及 覆 轾
* 2:toindex卞覆仄化惘ㄨㄟ蘸 轾
* 3:toindex卞覆仄化尔ㄨㄟ蘸 轾
* BOOL suberi NPC_Util_SuberiWalk毛哔 允月井"TRUE:允月 FALSE:仄卅中
*
* 忒曰袄 岳 汹中凶 “dir 汹中凶 轾毛忒允
* 撩 “-1
------------------------------------------------------------------------*/
int NPC_Util_WalkCharToChar( int fromindex, int toindex, int mode, int suberi)
{
int ret = -1;
int dir;
if( CHAR_getInt( fromindex, CHAR_FLOOR)
!= CHAR_getInt( toindex, CHAR_FLOOR))
{
return( -1);
}
dir = NPC_Util_GetDirCharToChar( fromindex, toindex, mode );
if( dir != -1) {
if( suberi) {
dir = NPC_Util_SuberiWalk( fromindex, dir );
}
}
if( dir >= 0 ) {
ret = CHAR_walk(fromindex,dir,0);
if( ret == CHAR_WALKSUCCESSED ) ret = dir;
else ret = -1;
}
return( ret);
}
/*------------------------------------------------------------------------
* NPC毛壅 今六月[
*
* void NPC_Util_NPCDelete( int srcindex)
*
* int srcindex 壅允index
*
------------------------------------------------------------------------*/
void NPC_Util_NPCDelete( int srcindex)
{
//int objindex;
//objindex = CHAR_getWorkInt(srcindex,CHAR_WORKOBJINDEX);
/* createnum 互 及凛]戏引木凶凛棉毛本永玄允月
* 卅兮仇仇匹仇氏卅仪毛仄化中月井午中丹午
* create白央奶伙及time袄互戏引木化井日公木分仃坌烦匀化中月午]
* 濮覆卞允什卞戏引木化仁月午中丹酷 毛卅氏午井仄方丹午允月啃
*/
if( CHAR_getInt( srcindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ) return;
if( NPC_createCheckMaxEnemynum( CHAR_getInt(srcindex,CHAR_NPCCREATEINDEX )))
NPC_createInitTime( CHAR_getInt(srcindex,CHAR_NPCCREATEINDEX ));
NPC_createDecreaseEnemynum( CHAR_getInt(srcindex,
CHAR_NPCCREATEINDEX ) );
CHAR_CharaDelete( srcindex );
}
char *NPC_Util_CheckAssignArgFile( int index, char *filename)
{
BOOL rc;
int i;
char *cret = NULL;
char outstr[64];
char outstr2[64];
char *a = CHAR_getChar( index , CHAR_NPCARGUMENT );
if( a == NULL ) {
print( "%s : %d err\n", __FILE__, __LINE__);
return cret;
}
for( i = 1; ; i++ ) {
/* 犯伉立正ㄠ勾内勾 戈 */
rc = getStringFromIndexWithDelim( a, "|", i, outstr, sizeof(outstr));
if( rc == FALSE) break;
if( strstr( outstr, "file") != NULL ) {
rc = getStringFromIndexWithDelim( outstr, ":", 2,
outstr2, sizeof(outstr2));
if( rc != FALSE ) {
strcpy( filename, outstr2);
cret = filename;
break;
}
}
}
return( cret);
}
static char *NPC_Util_MargeStrFromArgFile( char *filename, char *buf, int len)
{
FILE *fp;
char *cret = NULL;
char line[NPC_UTIL_GETARGSTR_LINEMAX];
char opfile[32];
sprintf( opfile, "%s/", getNpcdir( ) );
strcat( opfile, filename);
*buf = '\0';
fp = fopen( opfile, "r");
if( fp != NULL ) {
while( fgets( line, sizeof( line), fp)) {
if( strlen(buf) != 0 ) {
if( buf[strlen(buf) -1] != '|' ) {
strcatsafe( buf, len, "|");
}
}
chompex( line);
strcatsafe( buf,len, line);
}
fclose( fp);
cret=buf;
}
return( cret);
}
char *NPC_Util_GetArgStr( int index, char *argstr, int len)
{
char filename[128];
char *cret = NULL;
if( NPC_Util_CheckAssignArgFile( index, filename) != NULL ) {
if( NPC_Util_MargeStrFromArgFile( filename, argstr, len) != NULL ) {
cret = argstr;
}
}else {
if( CHAR_getChar( index, CHAR_NPCARGUMENT) != NULL ){
strcpy( argstr, CHAR_getChar( index, CHAR_NPCARGUMENT));
cret = argstr;
}else{
cret = NULL;
}
}
if( cret == NULL ) print("File:%s\n", NPC_Util_CheckAssignArgFile( index, filename));
return( cret);
}
int NPC_Util_GetNumFromStrWithDelim( char *srcstr, char* in)
{
BOOL rc;
int i;
char outstr[32];
int out = -1;
for( i = 1; ; i++ ) {
/* 犯伉立正ㄠ勾内勾 戈 */
rc = getStringFromIndexWithDelim( srcstr, "|", i, outstr, sizeof(outstr));
if( rc == FALSE) break;
if( strstr( outstr, in) != NULL ) {
out = textToInt( outstr);
break;
}
}
return out;
}
char *NPC_Util_GetStrFromStrWithDelim( char *srcstr, char *srhstr,
char *buf, int buflen)
{
BOOL rc;
char *cret = NULL;
int i;
char outstr[1024];
char outstr2[1024];
memset( outstr, 0, sizeof( outstr));
memset( outstr2, 0, sizeof( outstr2));
buf[0] = '\0';
for( i = 1; ; i++ ) {
rc = getStringFromIndexWithDelim( srcstr, "|", i, outstr, sizeof(outstr));
if( rc == FALSE) break;
if( strstr( outstr, srhstr) != NULL) {
rc = getStringFromIndexWithDelim( outstr, ":", 2, outstr2, sizeof(outstr2));
if( rc != FALSE ) {
strcpysafe( buf, buflen, outstr2 );
cret = buf;
break;
}
}
}
return cret;
}
inline double NPC_Util_sellRate( int seller )
{
return (CHAR_getInt( seller, CHAR_MERCHANTLEVEL)&0x0000ffff)*0.01;
}
inline double NPC_Util_buyRate( int buyer )
{
return (CHAR_getInt( buyer, CHAR_MERCHANTLEVEL )>>16)*0.01;
}
BOOL NPC_Util_IsVisiblePlayer( int meindex)
{
int chr_fl,chr_x,chr_y, i, j;
BOOL found = FALSE;
chr_fl = CHAR_getInt( meindex, CHAR_FLOOR);
chr_x = CHAR_getInt( meindex, CHAR_X);
chr_y = CHAR_getInt( meindex, CHAR_Y);
for( i = chr_x-CHAR_DEFAULTSEESIZ/2 ;
i <= chr_x+CHAR_DEFAULTSEESIZ/2 && found == FALSE; i++ ){
for( j = chr_y-CHAR_DEFAULTSEESIZ/2 ;
j <= chr_y+CHAR_DEFAULTSEESIZ/2 && found == FALSE;
j ++ ){
OBJECT object;
for( object = MAP_getTopObj( chr_fl, i,j);
object;
object = NEXT_OBJECT(object) )
{
int objindex = GET_OBJINDEX( object);
if( OBJECT_getType(objindex) == OBJTYPE_CHARA ){
if( CHAR_getInt( OBJECT_getIndex(objindex),
CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER )
{
found = TRUE;
break;
}
}
}
}
}
return( found);
}
BOOL NPC_Util_WordInclude( char *text , char *word )
{
if( strstr( text , word ) == NULL ){
return FALSE;
} else {
return TRUE;
}
}
void NPC_Util_RandomToken(char *in, char *out, int outbufsize )
{
int tokennum;
int i;
tokennum = 1;
for( i=0;in[i]!='\0';i++ ){
if( in[i] == ',' ) tokennum++;
}
getStringFromIndexWithDelim(in,",", rand()%tokennum+1,out,outbufsize );
}
void cutDotsTail( char *s )
{
int l = strlen( s );
int i;
for(i=l-1;i>=0;i--){
if( s[i] == '.' ){
s[i] = 0;
} else {
break;
}
}
}
int NPC_Util_FrontItem( int meindex )
{
int front_x, front_y,objindex,itemindex;
OBJECT obj;
CHAR_getCoordinationDir( CHAR_getInt(meindex,CHAR_DIR)
, CHAR_getInt(meindex,CHAR_X)
, CHAR_getInt(meindex,CHAR_Y)
,1, &front_x, &front_y );
for( obj=MAP_getTopObj(CHAR_getInt(meindex,CHAR_FLOOR),
front_x,front_y );obj;
obj=NEXT_OBJECT(obj) ){
objindex = GET_OBJINDEX(obj);
if( OBJECT_getType(objindex) == OBJTYPE_ITEM ){
itemindex = OBJECT_getIndex(objindex);
if(ITEM_CHECKINDEX(itemindex) ){
return itemindex;
}else{
return -1;
}
}
}
return -1;
}
int NPC_Util_FrontChar( int meindex )
{
int front_x, front_y,objindex,enemyindex;
OBJECT obj;
CHAR_getCoordinationDir( CHAR_getInt(meindex,CHAR_DIR)
, CHAR_getInt(meindex,CHAR_X)
, CHAR_getInt(meindex,CHAR_Y)
,1, &front_x, &front_y );
for( obj=MAP_getTopObj(CHAR_getInt(meindex,CHAR_FLOOR),
front_x,front_y );obj;
obj=NEXT_OBJECT(obj) ){
objindex = GET_OBJINDEX(obj);
if( OBJECT_getType(objindex) == OBJTYPE_CHARA ){
enemyindex = OBJECT_getIndex(objindex);
if(CHAR_CHECKINDEX(enemyindex) ){
return enemyindex;
}
}
}
return -1;
}
static int NPCUtil_enemytbl[NPC_ENEMY_ENEMYNUMBER+1];
int *NPC_Util_getEnemy( int meindex, int charaindex)
{
int i;
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
char buf[64];
int ret;
int bigcnt;
int insert;
NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr));
for( i = 0; i < NPC_ENEMY_ENEMYNUMBER+1; i ++ ) {
NPCUtil_enemytbl[i] = -1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -