📄 npcutil.c
字号:
&& CHAR_getInt(index1,CHAR_Y) == CHAR_getInt(index2,CHAR_Y) ){
return FALSE;
}
for( i=1;i<=distance;i++ ){
int walked_x, walked_y;
CHAR_getCoordinationDir( CHAR_getInt(index1,CHAR_DIR)
, CHAR_getInt(index1,CHAR_X)
, CHAR_getInt(index1,CHAR_Y)
,i, &walked_x, &walked_y );
if( CHAR_getInt(index2,CHAR_X) == walked_x
&& CHAR_getInt(index2,CHAR_Y) == walked_y ){
return TRUE;
}
}
return FALSE;
}
void NPC_Util_AnnounceFloor( int floorid , char *msg )
{
int i;
int playernum = CHAR_getPlayerMaxNum();
for(i=0;i<playernum;i++){
if( CHAR_getCharUse(i) &&
CHAR_getInt( i , CHAR_WHICHTYPE) == CHAR_TYPEPLAYER &&
CHAR_getInt( i , CHAR_FLOOR ) == floorid ){
CHAR_talkToCli( i , -1 , msg , CHAR_COLORWHITE );
}
}
}
BOOL NPC_Util_moveItemToChar( int charindex, int itemindex, BOOL net )
{
int emptyindex, oind ,cind;
emptyindex = CHAR_findEmptyItemBox( charindex );
if( emptyindex < 0 )
return FALSE;
if( !ITEM_CHECKINDEX( itemindex ) )return FALSE;
oind = ITEM_getWorkInt( itemindex , ITEM_WORKOBJINDEX );
cind = ITEM_getWorkInt( itemindex , ITEM_WORKCHARAINDEX );
if( oind >= 0 ){
CHAR_ObjectDelete( oind );
CHAR_setItemIndex( charindex, emptyindex, itemindex );
ITEM_setWorkInt( itemindex, ITEM_WORKOBJINDEX, -1 );
ITEM_setWorkInt( itemindex, ITEM_WORKCHARAINDEX, charindex );
if( net ) CHAR_sendItemDataOne( charindex, emptyindex);
return TRUE;
}else if( cind >= 0 ){
int itemgrp[2];
int itemindexinchara;
if( cind == charindex )return FALSE;
itemindexinchara = NPC_Util_SearchItemInChar( cind , itemindex);
if( itemindexinchara == -1 )return FALSE;
CHAR_setItemIndex( cind , itemindexinchara , -1 );
CHAR_complianceParameter(cind);
itemgrp[0] = itemindexinchara;
CHAR_setItemIndex( charindex , emptyindex , itemindex );
itemgrp[1] = emptyindex;
if( net ) CHAR_sendItemData( charindex, itemgrp, arraysizeof(itemgrp));
ITEM_setWorkInt( itemindex, ITEM_WORKOBJINDEX, -1 );
ITEM_setWorkInt( itemindex, ITEM_WORKCHARAINDEX, charindex );
return TRUE;
}
return FALSE;
}
BOOL NPC_Util_moveItemToMap( int itemindex , int fl , int x , int y,
BOOL net )
{
int oind,cind;
if( !ITEM_CHECKINDEX( itemindex ) ) return FALSE;
oind = ITEM_getWorkInt( itemindex , ITEM_WORKOBJINDEX );
cind = ITEM_getWorkInt( itemindex , ITEM_WORKCHARAINDEX );
if( oind >= 0 ){
return MAP_objmove( oind , OBJECT_getFloor(oind),
OBJECT_getX(oind),
OBJECT_getY(oind),
fl,x,y);
} else if( cind >= 0 ){
int itemindexinchara = NPC_Util_SearchItemInChar(cind,itemindex);
if( itemindexinchara == -1 ) return FALSE;
CHAR_setItemIndex( cind , itemindexinchara , -1 );
CHAR_complianceParameter(cind);
if( net ) CHAR_sendItemDataOne( cind, itemindexinchara);
if( CHAR_DropItemAbsolute( itemindex, fl,x,y,TRUE) < 0 ){
return FALSE;
} else {
return TRUE;
}
}
return FALSE;
}
int NPC_Util_GiveAllItemToChar( int give , int take )
{
int i ;
int count=0;
for(i=0;i<CHAR_MAXITEMHAVE;i++){
int itemindex = CHAR_getItemIndex( give , i );
BOOL aho = NPC_Util_moveItemToChar( take , itemindex,FALSE );
if( aho ){
count++;
}
}
if( count ){
CHAR_sendStatusString( give,"I");
CHAR_sendStatusString( take,"I");
}
return count;
}
BOOL NPC_Util_createItemToChar( int charindex, int itemid , BOOL net)
{
int emptyitemindexinchara, itemindex;
emptyitemindexinchara = CHAR_findEmptyItemBox( charindex );
if( emptyitemindexinchara < 0 )return FALSE;
itemindex = ITEM_makeItemAndRegist( itemid );
if( itemindex != -1 ){
CHAR_setItemIndex( charindex, emptyitemindexinchara, itemindex );
ITEM_setWorkInt(itemindex, ITEM_WORKOBJINDEX,-1);
ITEM_setWorkInt(itemindex, ITEM_WORKCHARAINDEX,charindex);
if(net) {
CHAR_sendItemDataOne( charindex, emptyitemindexinchara);
}
return TRUE;
}
return FALSE;
}
int NPC_Util_CharDistance( int index1, int index2 )
{
int dx, dy;
if( CHAR_getInt(index1,CHAR_FLOOR)!= CHAR_getInt(index2,CHAR_FLOOR) ){
return 0x7fffffff;
}
dx =ABS( CHAR_getInt(index1,CHAR_X)- CHAR_getInt(index2,CHAR_X) );
dy =ABS( CHAR_getInt(index1,CHAR_Y)- CHAR_getInt(index2,CHAR_Y) );
return max( dx, dy );
}
static int SearchNearLine(
int xStart,
int yStart,
int floor,
int xPlus,
int yPlus,
int Count,
int type
){
OBJECT object;
int i, x = xStart, y = yStart;
for( i = 0; i < Count; i ++ ){
for( object=MAP_getTopObj( floor, x,y ); object ;
object = NEXT_OBJECT(object) )
{
int objindex = GET_OBJINDEX(object), iWork;
if( OBJECT_getType(objindex) != OBJTYPE_CHARA )continue;
iWork = OBJECT_getIndex(objindex);
if( CHAR_getInt(iWork,CHAR_HP) < 0 )continue;
if( CHAR_getInt( iWork,CHAR_WHICHTYPE ) == type ){
return iWork;
}
}
x += xPlus; y += yPlus;
}
return -1;
}
static int SearchNearAround(
int x, /* 腹绸 艘及 甄 */
int y, /* 腹绸 艘及 甄 */
int floor, /* 腹绸 艘及白夫失 */
int Part, /* 腹绸钒铵允月 赓及仿奶件 */
int Level, /* 艘方曰 木化中月覃 */
int type /* 腹绸允月 CHAR 正奶皿 */
){
int i, iTarget = -1;
for( i = 0; i < 4; i ++ ){
if( Part == 0 ){ /* 晓及仿奶件毛腹绸 */
iTarget = SearchNearLine( x-Level+1, y-Level,
floor, 1, 0, Level*2, type );
if( iTarget >= 0 )break;
}else
if( Part == 1 ){ /* 惘及仿奶件毛腹绸 */
iTarget = SearchNearLine( x+Level, y-Level+1,
floor, 0, 1, Level*2, type );
if( iTarget >= 0 )break;
}else
if( Part == 2 ){ /* 票及仿奶件毛腹绸 */
iTarget = SearchNearLine( x+Level-1, y+Level,
floor, -1, 0, Level*2, type );
if( iTarget >= 0 ) break;
}else
if( Part == 3 ){ /* 尔及仿奶件毛腹绸 */
iTarget = SearchNearLine( x-Level, y+Level-1,
floor, 0, -1, Level*2, type );
if( iTarget >= 0 ) break;
}
Part ++; Part &= 3; /* 戚及由□玄毛腹绸 */
}
return iTarget;
}
int NPC_Util_SearchNear( int meindex, int maxlen, int type )
{
#if 1
/* MAP 井日及伉件弁匹腹绸允月方丹卞 凳 */
int floor, x, y, i,iTarget = -1;
/* 蜇箕及愤坌及树 毛娄五请允 */
if( !CHAR_CHECKINDEX( meindex ) )return -1;
floor = CHAR_getInt( meindex, CHAR_FLOOR );
x = CHAR_getInt( meindex, CHAR_X );
y = CHAR_getInt( meindex, CHAR_Y );
/* 区 匹譬屯月 */
for( i = 0; i < maxlen; i ++ ){
iTarget = SearchNearAround( x, y, floor, RAND( 0,3 ), i+1, type );
if( iTarget >= 0 )break;
}
return iTarget;
#else
/* 仇切日反衙中支曰 */
int floor, x, y, i,iTarget = -1, iLen, iMin = 655360, tX, tY;
/* 醒必永玄*/
if( !CHAR_CHECKINDEX( meindex ) )return -1;
floor = CHAR_getInt( meindex, CHAR_FLOOR );
x = CHAR_getInt( meindex, CHAR_X );
y = CHAR_getInt( meindex, CHAR_Y );
/* 腹绸 */
for( i = 0 ; i<objnum ; i++ ){
/*平乓仿弁正□及凛*/
if( obj[i].type != OBJTYPE_CHARA ) continue;
/* 潘 毛苇月*/
if( CHAR_getInt( obj[i].index,CHAR_WHICHTYPE)
!= type ) continue;
/* 元白夫失及凛*/
if( floor != obj[i].floor ) continue;
/* CHAR_TYPEENEMY 及凛反index互愤坌及桦宁互丐月及匹民尼永弁允月 */
if( obj[i].index == meindex ) continue;
/* 及覃 毛煌遥*/
tX = ABS( x-CHAR_getInt(obj[i].index,CHAR_X) );
tY = ABS( y-CHAR_getInt(obj[i].index,CHAR_Y) );
if( tX > maxlen )continue; /* 木允亢*/
if( tY > maxlen )continue; /* 卅日戚尺*/
/* 称井中覃 毛煌遥*/
iLen = tX*tX+tY*tY;
/* 域 嗤井匀凶桦宁反筏 凳蕙*/
if( iMin > iLen ){
iMin = iLen;
iTarget = obj[i].index; /* 奶件犯永弁旦毛瓒 */
}
}
return iTarget;
#endif
}
/*------------------------------------------------------------
* 域 嗤中皿伊奶乩□及腹绸
------------------------------------------------------------*/
int NPC_Util_SearchNearPlayer( int meindex, int maxlen )
{
return( NPC_Util_SearchNear( meindex, maxlen, CHAR_TYPEPLAYER));
}
/*------------------------------------------------------------
* 域 嗤中衬及腹绸-
-----------------------------------------------------------*/
int NPC_Util_SearchNearEnemy( int meindex, int maxlen )
{
return( NPC_Util_SearchNear( meindex, maxlen, CHAR_TYPEENEMY));
}
/*******************************************************
标户啖 允月蟆卞窒井卞少勾井匀化中月井升丹井譬屯月
int NPC_Util_SuberiWalk(
int index, CHAR 及奶件犯永弁旦
int dir 汹仁轾五
);
曰袄 0 7“汹仃月 轾
-1 “穴永皿卞娄匀井井匀化巨仿□
-2 “平乓仿弁正卞娄匀井井匀化巨仿□
-3 “ 卞娄匀井井匀化巨仿□
标户啖 允月桦宁引内冲}产卞啖 匹五月井譬屯月[
啖 匹五木壬标户毛民尼永弁允月[ 仄井啖 匹五卅仃木壬
公切日及 轾毛忒允[
公仇卞窒井丐匀凶日 穴永皿动陆 ㄠ毛忒允
*******************************************************/
int NPC_Util_OtherCharCheck( int ff, int fx, int fy)
{
#if 1
/* 腹绸 挚毛 井日及伉件弁卞 凳 */
OBJECT object;
for( object=MAP_getTopObj(ff,fx,fy); object ;
object = NEXT_OBJECT(object) )
{
int objindex = GET_OBJINDEX(object);
/* 元甄 卞平乓仿弁正互丐月井 */
if( OBJECT_getType(objindex) == OBJTYPE_CHARA ){
return 1;
}
}
return 0;
#else
/* 仇切日反蛙挚及支曰 */
int i;
for( i = 0 ; i < objnum ; i ++){
/* 甄 互 元井"*/
if( obj[i].x == fx && obj[i].y == fy && obj[i].floor == ff ){
/* 平乓仿弁正井"*/
if( obj[i].type != OBJTYPE_NOUSE ){
return 1;
}
}
}
return 0;
#endif
}
/* 汹仃卅中桦宁反唤匀化心月*/
int NPC_Util_SuberiWalk(
int index,
int dir
)
{
int i, OkFlg = 0, x = 0, y = 0, fl = 0;
int aDirList[3],dir2;
int tX, tY;
x = CHAR_getInt(index,CHAR_X);
y = CHAR_getInt(index,CHAR_Y);
fl = CHAR_getInt(index,CHAR_FLOOR);
/* 标户 轾井"*/
switch( dir ){
case 1: aDirList[0] = 0; aDirList[1] = 2; aDirList[2] = 1;
break;
case 3: aDirList[0] = 2; aDirList[1] = 4; aDirList[2] = 3;
break;
case 5: aDirList[0] = 4; aDirList[1] = 6; aDirList[2] = 5;
break;
case 7: aDirList[0] = 6; aDirList[1] = 0; aDirList[2] = 7;
break;
default:
tX = x+CHAR_getDX(dir);
tY = y+CHAR_getDY(dir);
/* 褡户凶*/
if( MAP_walkAble( index,fl,tX,tY ) == 0 ){
dir = -1;/* 穴永皿卞娄匀井井匀凶*/
}
// }else
// if( NPC_Util_OtherCharCheck( fl,tX, tY ) ){
// dir = -2;/* 平乓仿卞娄匀井井匀凶*/
// }
/* 引匀允什分!! 公及引引汹仁*/
/* CHAR_walk( index, dir, 0 );*/
return dir;
}
/* 引匀允什卅日 烂卅仄*/
for( i = 0; i < 3; i ++ ){
dir2 = aDirList[i];
tX = x+CHAR_getDX(dir2);
tY = y+CHAR_getDY(dir2);
if( MAP_walkAble( index,fl,tX,tY ) == 0 ){
aDirList[i] = -1; /* 垫仃卅中桦宁反公及 轾坫诮*/
// }else if( NPC_Util_OtherCharCheck( fl,tX, tY ) ){
// aDirList[i] = -2; /* 垫仃卅中桦宁反公及 轾坫诮*/
}else{
/* 垫仃凶!!*/
OkFlg ++;
}
}
/* ㄢ勾蝈 第 卅桦宁反} 赓及骚曰 仁*/
if( aDirList[0] >= 0 && aDirList[1] >= 0 && aDirList[2] >= 0 ){
}else
/* 仇切日卞 仃月井"*/
if( aDirList[0] >= 0 ){
dir = aDirList[0];
}else
/* 公木午手仇切日井"*/
if( aDirList[1] >= 0 ){
dir = aDirList[1];
}else{
dir = aDirList[0]+aDirList[1];
}
/* 啖 */
/* CHAR_walk( index, dir, 0 );*/
return dir;
}
/*-----------------------------------------------------------------------
* NPC及create凛及娄醒及 井日隙烂今木凶 侬 毛腹绸仄]
* 公及 及醒袄毛潸 允月[左皿扑亦件匹醒袄毛隙烂今六化支曰凶中午五卞忐厍
*
* 镗啦“犯伉立正反"|"卞蜃烂仄化引允[
* 娄醒卞 元 侬 互ㄡ勾岈氏分桦宁]
* 燮及 互穸燮今木引允[
* ----------------------------------
* IN : int meindex : 平乓仿index
* : char* in : 腹绸允月 侬
* OUT:
* RETURN:
* 潸 请 卅井匀凶凛 :-1
* 潸 请 凶凛 :醒袄
* ----------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -