⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 char_walk.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "version.h"
#include <stdio.h>
#include <ctype.h>
#include <time.h>
//???
#include "common.h"
#include "handletime.h"
#include "object.h"
#include "char_base.h"
#include "char.h"
#include "char_event.h"
#include "lssproto_serv.h"
#include "readmap.h"
#include "map_deal.h"
#include "npccreate.h"
#include "encount.h"
#include "npcutil.h"
#include "battle.h"
#include "net.h"
#include "configfile.h"
#include "npc_npcenemy.h"

static void CHAR_sendCharaAtWalk( int charaindex, int of, int ox, int oy, int xflg, int yflg );
static void CHAR_sendCDCharaAtWalk( int charaindex, int of, int ox, int oy,	int xflg, int yflg );

static CHAR_WALKRET CHAR_walk_turn( int index, int dir )
{
    int     fx,fy,ff;
    OBJECT  object;

    if(!CHAR_CHECKINDEX( index ))return CHAR_WALKSYSTEMERROR;
    CHAR_setInt(index,CHAR_DIR,dir);
    fx = CHAR_getInt(index,CHAR_X);
    fy = CHAR_getInt(index,CHAR_Y);
    ff = CHAR_getInt(index,CHAR_FLOOR);
    CHAR_sendWatchEvent( CHAR_getWorkInt(index, CHAR_WORKOBJINDEX),
                         CHAR_ACTTURN,NULL,0,FALSE);
	CHAR_setWorkInt( index, CHAR_WORKACTION, CHAR_ACTTURN);
    for( object = MAP_getTopObj(ff,fx,fy) ; object ;
         object = NEXT_OBJECT(object ) ){
        typedef void (*POSTOFUNC)(int,int);
        POSTOFUNC   pfunc=NULL;
        int objindex = GET_OBJINDEX(object);

        switch( OBJECT_getType(objindex)  ){
        case OBJTYPE_CHARA:
            pfunc = (POSTOFUNC)CHAR_getFunctionPointer(
                OBJECT_getIndex(objindex),
                CHAR_POSTOVERFUNC);
            break;
        case OBJTYPE_ITEM:
            pfunc = (POSTOFUNC)ITEM_getFunctionPointer(
                OBJECT_getIndex(objindex),
                ITEM_POSTOVERFUNC);
            break;
        case OBJTYPE_GOLD:
            break;
        default:
            break;
        }
        if( pfunc )pfunc( OBJECT_getIndex(objindex),index );
    }
    return CHAR_WALKSUCCESSED;
}


/*------------------------------------------------------------
 * n 汹 汹中凶map毛霜月
 * 娄醒
 *  index       int     平乓仿及奶件犯永弁旦
 *  fl          int     白夫失ID
 *  ox          int     蟆及橇谪及x
 *  oy          int     蟆及橇谪及y
 *  fx          int     汹中凶  及x
 *  fy          int     汹中凶  及y
 * 忒曰袄
 *  卅仄
 ------------------------------------------------------------*/
static void CHAR_sendMapAtWalk( int index, int fl ,int ox ,int oy,
								int fx, int fy )
{
    /*
     *  蜇箕及袄午}蟆引匹及袄及犒毛苇月
     *  仇丹允月午}伐□皿NPC手棵签分[
     */
    int     vx,vy;
    const int     seesiz = MAP_CHAR_DEFAULTSEESIZ;

    if( !CHAR_CHECKINDEX( index ) )return;

    vx = fx - ox;
    vy = fy - oy;

    if( ABS(vx) >= seesiz/2 ||       /*  犒互  五中  */
        ABS(vy) >= seesiz/2 ){       /*  犒互  五中  */
        return;

    }else{
        RECT    send,get;
        char*   mapdata;
        int oldlux = ox - (int)(seesiz/2);
        int oldluy = oy - (int)(seesiz/2);
        int absx = ABS(vx);
        int absy = ABS(vy);
        /*
         * 夫午勾聂户卞旦正□玄毛潸月及午}vx , vy 井日1夫仁及互禾奶件玄
         * 蟆午井今卅日卅中方丹卞}
         * clipRect 反 w,h 0 毛心午户化中月
         */

        /*  == 0 及凛反霜日卅仁化方中   */
        if( vx != 0 ){
            if( vx > 0 ){
                send.x     = oldlux + seesiz;
                send.width = absx;
            }else if( vx < 0 ){
                send.x     = oldlux - absx;
                send.width = absx;
            }

            if( vy >= 0 ){
                send.y      = oldluy;
                send.height = seesiz + absy;
            }else{
                send.y      = oldluy - absy;
                send.height = seesiz + absy;
            }
{
            int     tilesum, objsum,eventsum;
            mapdata = MAP_getChecksumFromRECT(fl,&send,&get,&tilesum, &objsum,&eventsum );
            if( mapdata != NULL
                && !( get.width == 0 && get.height == 0 ) ){
                int fd = getfdFromCharaIndex( index );
                if( fd !=  -1 )
                    lssproto_MC_send( fd,fl,get.x,get.y,
                                     get.x+get.width,
                                     get.y+get.height,
                                     tilesum,
                                     objsum,
                                     eventsum,
                                     mapdata );
            }
}
        }

        /*  == 0 及凛反霜日卅仁化方中   */
        if( vy != 0 ){
            if( vy > 0 ){
                send.y      = oldluy + seesiz;
                send.height = absy;
            }else{
                send.y      = oldluy - absy;
                send.height = absy;
            }
            if( vx >= 0 ){
                send.x     = oldlux;
                send.width = seesiz + absx;
            }else if( vx < 0 ){
                send.x     = oldlux - absx;
                send.width = seesiz + absx;
            }
{
            int     tilesum, objsum,eventsum;
            mapdata = MAP_getChecksumFromRECT(fl,&send,&get, &tilesum, &objsum,&eventsum);
            if( mapdata != NULL
                && !( get.width == 0 && get.height == 0 ) ){
                int fd = getfdFromCharaIndex( index );
                if( fd !=  -1 )
                    lssproto_MC_send( fd,fl,get.x,get.y,
                                     get.x+get.width,
                                     get.y+get.height,
                                     tilesum,
                                     objsum,
                                     eventsum,
                                     mapdata );

            }
}
        }
    }

}
static CHAR_WALKRET CHAR_walk_move( int charaindex, int dir );
/*------------------------------------------------------------
 * 啖  允月[
 * 娄醒
 *  index       int     平乓仿及奶件犯永弁旦
 *  dir         int       轾
 * 忒曰袄
 *  CHAR_WALKRET
 ------------------------------------------------------------*/
static CHAR_WALKRET CHAR_walk_move( int charaindex, int dir )
{
    int     i;
    int     fx,fy,ff;
    int     ox,oy,of;
    int     objbuf[128];
    int     objbufindex=0;
    int     notover=FALSE;
    int     retvalue=CHAR_WALKSUCCESSED;

    if( !CHAR_CHECKINDEX( charaindex )) return CHAR_WALKSYSTEMERROR;
    ox = CHAR_getInt(charaindex,CHAR_X);
    oy = CHAR_getInt(charaindex,CHAR_Y);
    of = CHAR_getInt(charaindex,CHAR_FLOOR);
    CHAR_getCoordinationDir( dir,ox,oy,1,&fx,&fy);
    ff = of;

    if( CHAR_getInt( charaindex,CHAR_WHICHTYPE ) == CHAR_TYPEENEMY ){
        RECT    walkr;
        POINT   nextp;
        int npccreateindex;
        npccreateindex = CHAR_getInt( charaindex,CHAR_NPCCREATEINDEX );
        if( CHAR_isInvincibleArea( ff,fx,fy)) {
            CHAR_setInt(charaindex,CHAR_DIR,dir);
            retvalue = CHAR_WALKEXTEND;
            goto CHAR_AFTERWALK;
        }
        if( NPC_isBoundarySet( npccreateindex ) &&
            NPC_createGetRECT( npccreateindex,&walkr ) == TRUE )
        {
            nextp.x = fx;
            nextp.y = fy;
            if( PointInRect( &walkr,&nextp ) == FALSE ){
                CHAR_setInt(charaindex,CHAR_DIR,dir);
                retvalue = CHAR_WALKEXTEND;
                goto CHAR_AFTERWALK;
            }
        }else{
            ;
        }
    }


    if( CHAR_getFlg( charaindex, CHAR_ISBIG ) == 1 ){
        static POINT offset[5]={
            { 0,-1},
            {-1, 0},
            { 0, 0},
            { 1, 0},
            { 0, 1},
        };
        int     k;
        for( k=0 ; k<5; k++ ){
            if( !MAP_walkAble( charaindex, ff, fx+offset[k].x,
                               fy+offset[k].y )){
                CHAR_setInt(charaindex,CHAR_DIR,dir);
                retvalue = CHAR_WALK1357;
                goto CHAR_AFTERWALK;
            }
        }

    }else{
        if( CHAR_getDX(dir)*CHAR_getDY(dir) == 0 ){
            if( !MAP_walkAble( charaindex,ff, fx, fy ) ){
                CHAR_setInt(charaindex,CHAR_DIR,dir);
                retvalue = CHAR_WALK1357;
                goto CHAR_AFTERWALK;
            }
        }else{
            int     xflg,yflg;
            if( !MAP_walkAble( charaindex,ff, fx, fy ) ){
                CHAR_setInt(charaindex,CHAR_DIR,dir);
                retvalue = CHAR_WALK1357;
                goto CHAR_AFTERWALK;
            }

            xflg = MAP_walkAble( charaindex,of, ox+CHAR_getDX(dir), oy );
            yflg = MAP_walkAble( charaindex,of, ox, oy+CHAR_getDY(dir) );

            if( !xflg || !yflg ) {
                CHAR_setInt(charaindex,CHAR_DIR,dir);
                retvalue = CHAR_WALK1357;
                goto CHAR_AFTERWALK;
            }
        }
    }
    objbufindex = CHAR_getSameCoordinateObjects( objbuf, arraysizeof( objbuf ), ff,fx,fy );
    for( i = 0 ; i < objbufindex ; i ++ ){
        int     objindex= objbuf[i];
        switch( OBJECT_getType(objindex) ){
        case OBJTYPE_CHARA:
            if( !CHAR_getFlg( OBJECT_getIndex(objindex),CHAR_ISOVERED) )
                notover= TRUE;
            break;
        case OBJTYPE_ITEM:
            if( !ITEM_getInt( OBJECT_getIndex(objindex), ITEM_ISOVERED ) )
                notover= TRUE;
            break;
        case OBJTYPE_GOLD:
            break;
        default:
            break;
        }
    }
    if( notover == TRUE ){
        CHAR_setInt(charaindex,CHAR_DIR,dir);
        retvalue = CHAR_WALKHITOBJECT;
    }else{
        for( i = 0 ; i < objbufindex ; i ++ ){
            typedef void (*PREOFUNC)(int,int);
            PREOFUNC   pfunc=NULL;
            int     objindex=objbuf[i];
            switch( OBJECT_getType(objindex) ){
            case OBJTYPE_CHARA:
                pfunc = (PREOFUNC)CHAR_getFunctionPointer(
                    OBJECT_getIndex(objindex),
                    CHAR_PREOVERFUNC);
                break;
            case OBJTYPE_ITEM:
                pfunc = (PREOFUNC)ITEM_getFunctionPointer(
                    OBJECT_getIndex(objindex),
                    ITEM_PREOVERFUNC);
                break;
            case OBJTYPE_GOLD:
                break;
            default:
                break;
            }
            if( pfunc )pfunc( OBJECT_getIndex(objindex),charaindex );
        }

        CHAR_setInt(charaindex,CHAR_X,fx);
        CHAR_setInt(charaindex,CHAR_Y,fy);
        CHAR_setInt(charaindex,CHAR_FLOOR,ff);
        CHAR_setInt(charaindex,CHAR_DIR,dir);

        {
            int objindex;
            int ox,oy,of;
            objindex = CHAR_getWorkInt( charaindex,CHAR_WORKOBJINDEX );
            of = OBJECT_setFloor(objindex,
                                 CHAR_getInt(charaindex,CHAR_FLOOR));
            ox = OBJECT_setX(objindex,CHAR_getInt(charaindex,CHAR_X));
            oy = OBJECT_setY(objindex,CHAR_getInt(charaindex,CHAR_Y));
            if( !MAP_objmove( objindex, of,ox,oy,ff,fx,fy ) ){
                /*  仇氏卅氏升丹仄方丹手卅中    */
                fprint( "ERROR MAP_OBJMOVE objindex=%d(%s)\n",objindex,
                	CHAR_getUseName( charaindex ) );
            }
        }

        CHAR_setInt(charaindex,CHAR_WALKCOUNT,
                    CHAR_getInt(charaindex,CHAR_WALKCOUNT) + 1 );


        for( i = 0 ; i < objbufindex ; i ++ ){
            typedef void (*POSTOFUNC)(int,int);
            POSTOFUNC   pfunc=NULL;
            int     objindex=objbuf[i];

            switch( OBJECT_getType(objindex) ){
            case OBJTYPE_CHARA:
                pfunc = (POSTOFUNC)CHAR_getFunctionPointer(
                    OBJECT_getIndex(objindex),
                    CHAR_POSTOVERFUNC);
                break;
            case OBJTYPE_ITEM:
                pfunc = (POSTOFUNC)ITEM_getFunctionPointer( OBJECT_getIndex(objindex), ITEM_POSTOVERFUNC);
                break;
            case OBJTYPE_GOLD:
                break;
            default:
                break;
            }
            if( pfunc )pfunc( OBJECT_getIndex(objindex),charaindex );
        }
        objbufindex = CHAR_getSameCoordinateObjects(objbuf, arraysizeof(objbuf), of, ox, oy );
        for( i=0 ;i<objbufindex;i++){
            typedef void (*OFFFUNC)(int,int);
            OFFFUNC   ofunc=NULL;
            int     objindex = objbuf[i];

            switch( OBJECT_getType( objindex ) ){
            case OBJTYPE_CHARA:
                ofunc = (OFFFUNC)CHAR_getFunctionPointer( OBJECT_getIndex(objindex), CHAR_OFFFUNC);
                break;
            case OBJTYPE_ITEM:
                /*    卞窒手仄卅中  */
                break;
            case OBJTYPE_GOLD:
                /*    卞窒手仄卅中  */
                break;
            default:
                break;
            }
            if( ofunc )ofunc( OBJECT_getIndex(objindex), charaindex );

        }
    }
CHAR_AFTERWALK:
    if( retvalue == CHAR_WALK1357 || retvalue == CHAR_WALKHITOBJECT ){
	    {
	        int     opt[2] = { ox, oy};
	        CHAR_sendWatchEvent( CHAR_getWorkInt(charaindex,
	                                             CHAR_WORKOBJINDEX),
	                             CHAR_ACTWALK,opt,2,TRUE );
	    }
        CHAR_setWorkChar( charaindex, CHAR_WORKWALKARRAY, "");
		if( CHAR_getInt( charaindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER) {
		    CHAR_sendWatchEvent( CHAR_getWorkInt(charaindex, CHAR_WORKOBJINDEX),
    		                     CHAR_ACTWARP,NULL,0,TRUE);
		}
    }else if( CHAR_getInt( charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ){

		BOOL	flg = FALSE;
		int		par;
		int		count;
		CHAR_setWorkInt( charaindex, CHAR_WORKACTION, -1 );
		if( CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEMODE ) == BATTLE_CHARMODE_NONE ){
			CHAR_sendCharaAtWalk( charaindex, of,ox,oy,CHAR_getDX(dir), CHAR_getDY(dir));
		}

	    {
	        int     opt[2] = { ox, oy};
	        CHAR_sendWatchEvent( CHAR_getWorkInt(charaindex,
	                                             CHAR_WORKOBJINDEX),
	                             CHAR_ACTWALK,opt,2,TRUE );
	    }
		if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_CLIENT ) {
			CHAR_sendMapAtWalk( charaindex, of,
								ox,oy,
								CHAR_getInt( charaindex, CHAR_X),
								CHAR_getInt( charaindex, CHAR_Y));
		}
		count = CHAR_getWorkInt( charaindex, CHAR_WORK_TOHELOS_COUNT);
		if( count > 0 ) {
			CHAR_setWorkInt( charaindex, CHAR_WORK_TOHELOS_COUNT, count -1);
			if( count -1 == 0 ) {
				CHAR_talkToCli( charaindex, -1, "道具的效力已到。", CHAR_COLORWHITE);
			}
		}
		par = ENCOUNT_getEncountPercentMin( charaindex, of,ox,oy);
		if( par != -1 ) {
			if( CHAR_getWorkInt( charaindex, CHAR_WORKENCOUNTPROBABILITY_MIN) != par ){
				flg = TRUE;
				CHAR_setWorkInt( charaindex, CHAR_WORKENCOUNTPROBABILITY_MIN, par);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -