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

📄 enemy.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
📖 第 1 页 / 共 5 页
字号:
/*------------------------------------------------------------------------
 * GROUP_ID 井日GROUP_Group及骄侬毛襞月
 *-----------------------------------------------------------------------*/
int GROUP_getGroupArray( int groupid)
{
	int		i;
	for( i = 0; i < GROUP_groupnum; i ++ ) {
		if( GROUP_getInt( i, GROUP_ID) == groupid) {
			return i;
		}
	}
	return -1;
}
/*------------------------------------------------------------------------
 * 潸  烦董袄毛综岳允月[
 *-----------------------------------------------------------------------*/
static int ENEMY_getExp( int array,int tarray, int level, int rank )
{
	int		ret;
	int		*p;
    int		*tp;
    float		ranknum = 0.0;
	float		alpha;
    struct 	{
    	int		num;
    	float	rank;
    }ranktbl[] = {
    	{ 100, 2.5},
    	{ 95, 2.0},
    	{ 90, 1.5},
    	{ 85, 1.0},
    	{ 80, 0.5},
    	{ 0, 0.0},
    };
    level --;
    if( level < 0 || level >= arraysizeof( enemybaseexptbl)) return 0;

    p  = ENEMY_enemy[array].intdata;
    tp = ENEMYTEMP_enemy[tarray].intdata;

	// 仿件弁井日    毛潸  
	if( rank < 0 || rank > 5 ) rank = 0;
	ranknum = ranktbl[rank].rank;

	alpha = (   *( tp + E_T_CRITICAL) + *( tp + E_T_COUNTER)   + *(tp + E_T_GET)
			  + *( tp + E_T_POISON)   + *( tp + E_T_PARALYSIS) + *(tp + E_T_SLEEP)
			  + *( tp + E_T_STONE)    + *( tp + E_T_DRUNK)     + *(tp + E_T_CONFUSION)
			) / 100.0
			+ *( tp + E_T_RARE);
	/* EXP>湘  EXP≈-  仿件弁≈汐  ←伊矛伙×*/
	//return enemybaseexptbl[*(p+ENEMY_LV)] + (ranknum + alpha)*(*(tp+ENEMY_LV));
	ret = enemybaseexptbl[level] + (ranknum + alpha)*(level+1);
	return ( ret < 1 ) ? 1 : ret;

}


int ENEMY_getRank( int array, int tarray ){
    int     *p;
    int		*tp;
    int		paramsum;
	int		i;
	int		ranknum;

    struct 	{
    	int		num;
    	float	rank;
    }ranktbl[] = {
    	{ 100, 2.5}, //总成长率 >= 100 petrank=0
    	{ 95, 2.0},
    	{ 90, 1.5},
    	{ 85, 1.0},
    	{ 80, 0.5},
    	{ 0, 0.0},
    };

    p  = ENEMY_enemy[array].intdata;
    tp = ENEMYTEMP_enemy[tarray].intdata;
	/* 仿件弁毛煌遥允月 */
	/* 仇及  及酷  反酷  踏毛辅哔及仪[ */
	paramsum  = *( tp + E_T_BASEVITAL) +
		   		*( tp + E_T_BASESTR) +
		   		*( tp + E_T_BASETGH) +
		   		*( tp + E_T_BASEDEX);

	ranknum = 0;	// 犯白巧伙玄反ㄟ
	for( i = 0; i < arraysizeof( ranktbl); i ++ ) {
		if(  paramsum >= ranktbl[i].num ) {
			ranknum = i;
			break;
		}
	}

	return ranknum;

}


//*********************************************************
// 仿件母丞卅  
//*********************************************************
static int EnemyGymSkill[] = {
	PETSKILL_GUARDBREAK, 			// ㄢ“布□玉旰仄(3)
	PETSKILL_CONTINUATIONATTACK1, 	// ㄠㄟ“  粮  猾(10)
	PETSKILL_CONTINUATIONATTACK2, 	// ㄠㄠ“  粮  猾(11)
	PETSKILL_CONTINUATIONATTACK3, 	// ㄠㄡ“  粮  猾(12)
	PETSKILL_CHARGE1,				// ㄢㄟ“民乓□斥ㄠ(30)
	PETSKILL_CHARGE2,				// ㄢㄠ“民乓□斥ㄡ(31)
	PETSKILL_MIGHTY1,				// ㄣㄟ“域猾  诮(40)
	PETSKILL_MIGHTY2,				// ㄣㄠ“域猾  诮(41)
	PETSKILL_POWERBALANCE1,			// ㄤㄟ“    及讽ㄠ(50)
	PETSKILL_POWERBALANCE2,			// ㄤㄠ“    及讽ㄡ(51)
	PETSKILL_POWERBALANCE3,			// ㄤㄡ“    及讽ㄢ(52)
	PETSKILL_POISON_ATTACK1,		// ㄥㄟ“    猾(60)
	PETSKILL_POISON_ATTACK2,		// ㄥㄠ“    猾(61)
	PETSKILL_STONE,					// ㄧㄟ“檗祭  猾(80)
	PETSKILL_CONFUSION_ATTACK,		// ㄨㄟ“渔刭  猾(90)
	PETSKILL_DRUNK_ATTACK,			// ㄠㄟㄟ“听办  猾(100)
	PETSKILL_SLEEP_ATTACK,			// ㄠㄠㄟ“戽曰  猾(110)
	PETSKILL_NOGUARD1,				// ㄠㄤㄟ“用□布□玉ㄠ(150)
	PETSKILL_NOGUARD2,				// ㄠㄤㄠ“用□布□玉ㄡ(151)
	PETSKILL_NOGUARD3,				// ㄠㄤㄡ“用□布□玉ㄢ(152)
#ifdef _PSKILL_FALLGROUND
	PETSKILL_FALLGROUND,			//落马术
#endif
#ifdef _SKILL_DAMAGETOHP
	PETSKILL_DAMAGETOHP,		//嗜血技
#endif
#ifdef _Skill_MPDAMAGE
	PETSKILL_MPDAMAGE,		//MP伤害
#endif

#ifdef _SKILL_WILDVIOLENT_ATT
    PETSKILL_WILDVIOLENTATTACK,   //(540)狂暴攻击  vincent add 2002/05/16
#endif
#ifdef _SKILL_SPEEDY_ATT
    PETSKILL_SPEEDYATTACK,        //(541)疾速攻击  vincent add 2002/05/16
#endif
#ifdef _SKILL_GUARDBREAK2
    PETSKILL_GUARDBREAK2,         //(542)破除防御2 vincent add 2002/05/20
#endif
#ifdef _SKILL_SACRIFICE
    PETSKILL_SACRIFICE,           //(543)救援      vincent add 2002/05/30
#endif
#ifdef _SKILL_WEAKEN  
    PETSKILL_WEAKEN,              //(544)救援      vincent add 2002/07/11
#endif
#ifdef _SKILL_DEEPPOISON  
    PETSKILL_DEEPPOISON,          //(545)救援      vincent add 2002/07/16
#endif
#ifdef _SKILL_BARRIER  
    PETSKILL_BARRIER,             //(546)魔障      vincent add 2002/07/16
#endif
#ifdef _SKILL_NOCAST  
    PETSKILL_NOCAST,              //(547)沉默      vincent add 2002/07/16
#endif
#ifdef _SKILL_ROAR 
    PETSKILL_ROAR,                //(548)大吼      vincent add 2002/07/11
#endif

#ifdef _SKILL_REFRESH
    PETSKILL_REFRESH,           //(550)救援      vincent add 2002/08/08
#endif
#ifdef _VARY_WOLF
	PETSKILL_VARY,
#endif
#ifdef _PETSKILL_SETDUCK
	PETSKILL_SETDUCK,
#endif

#ifdef _MAGICPET_SKILL
	PETSKILL_SETMAGICPET,
#endif
#ifdef _PETSKILL_BECOMEPIG
    PETSKILL_BECOMEPIG,
#endif
#ifdef _PETSKILL_LER
		PETSKILL_BATFLY,
		PETSKILL_DIVIDEATTACK,
#endif
#ifdef _PETSKILL_BATTLE_MODEL
		PETSKILL_BATTLE_MODEL,
#endif
};

static int gymbody[] = {
	SPR_001em,SPR_011em,SPR_021em,SPR_031em,SPR_041em,SPR_051em,
	SPR_061em,SPR_071em,SPR_081em,SPR_091em,SPR_101em,SPR_111em,

	SPR_002em,SPR_012em,SPR_022em,SPR_032em,SPR_042em,SPR_052em,
	SPR_062em,SPR_072em,SPR_082em,SPR_092em,SPR_102em,SPR_112em,

	SPR_003em,SPR_013em,SPR_023em,SPR_033em,SPR_043em,SPR_053em,
	SPR_063em,SPR_073em,SPR_083em,SPR_093em,SPR_103em,SPR_113em,

	SPR_004em,SPR_014em,SPR_024em,SPR_034em,SPR_044em,SPR_054em,
	SPR_064em,SPR_074em,SPR_084em,SPR_094em,SPR_104em,SPR_114em,
};


/*------------------------------------------------------------------------
 * ENEMY{卞仿件母丞卅    毛芨尹月
 *-----------------------------------------------------------------------*/
int ENEMY_RandomChange( int enemyindex, int tempno )
{
	int work, work2, iRet = 0;

	// 仿件母丞平乓仿井升丹井民尼永弁
	if( ( 564 <= tempno && tempno <= 580 )
	||  ( 739 <= tempno && tempno <= 750 )
	||  ( 895 <= tempno && tempno <= 906 )
	){
		//********************************************
		// 皿伊奶乩□及涌
		//********************************************
		iRet = 1;
	}else
	// 仿件母丞平乓仿井升丹井民尼永弁
	if( ( 655 <= tempno && tempno <= 720 )
	||  ( 859 <= tempno && tempno <= 894 )
	||  ( 907 <= tempno && tempno <= 940 )
	){
		//********************************************
		// 矢永玄及涌
		//********************************************
		iRet = 2;
	}else{
		return 0;
	}


	if( iRet == 1 ){
		//********************************************
		//
		// 皿伊奶乩□及涌仄凶衬卅及匹}箪岭手仿件母丞
		//
		//********************************************
		// 铣手仿件母丞
		CHAR_setInt( enemyindex, CHAR_BASEBASEIMAGENUMBER,
			gymbody[RAND( 0, arraysizeof( gymbody ) - 1)] );
		CHAR_setInt( enemyindex, CHAR_BASEIMAGENUMBER,
			CHAR_getInt( enemyindex, CHAR_BASEBASEIMAGENUMBER ) );
		// 箪岭反赝癫
		work = ( RAND( 0, 20 ) - 10 ) * 10;
		work2 = 100 - ABS( work );
		CHAR_setInt( enemyindex, CHAR_EARTHAT, work );
		CHAR_setInt( enemyindex, CHAR_FIREAT,  -work );
		if( RAND( 0, 1 ) ){
			work2 *= -1;
		}
		CHAR_setInt( enemyindex, CHAR_WATERAT, work2 );
		CHAR_setInt( enemyindex, CHAR_WINDAT,  -work2 );

		// 仿件母丞卅  湛毛  凶六月
		if( DoujyouRandomWeponSet( enemyindex ) ){
			//   溃  湛及桦宁反骚橘  猾毛勾仃月
			CHAR_setPetSkill( enemyindex, 0, PETSKILL_NORMALATTACK );
			CHAR_setPetSkill( enemyindex, 1, PETSKILL_NORMALATTACK );
		}else{
			//   溃  湛元扎卅中及匹  勾仃月
			//   毛尥仃月
			CHAR_setPetSkill( enemyindex, 0,
				EnemyGymSkill[RAND( 0, arraysizeof( EnemyGymSkill ) - 1 )] );
			//   毛尥仃月
			CHAR_setPetSkill( enemyindex, 1,
				EnemyGymSkill[RAND( 0, arraysizeof( EnemyGymSkill ) - 1 )] );
		}

	}else
	if( iRet == 2 ){
		//   溃  湛元扎卅中及匹  勾仃月
		//   毛尥仃月
		CHAR_setPetSkill( enemyindex, 0,
			EnemyGymSkill[RAND( 0, arraysizeof( EnemyGymSkill ) - 1 )] );
		//   毛尥仃月
		CHAR_setPetSkill( enemyindex, 1,
			EnemyGymSkill[RAND( 0, arraysizeof( EnemyGymSkill ) - 1 )] );
	}

	return 1;

}


/*------------------------------------------------------------------------
 * ENEMY_enemy井日平乓仿弁正□毛综岳允月[
 *-----------------------------------------------------------------------*/
int ENEMY_createEnemy( int array, int baselevel )
{
    Char    CharNew;
    int newindex;
    int     *p;
    int		tp[E_T_DATAINTNUM];
    int		tarray, i;
	int itemindex,iloop;
	int		level;
	int	enemyrank;

    if( !ENEMY_CHECKINDEX( array)) return -1;

    p = ENEMY_enemy[array].intdata;
    tarray = ENEMYTEMP_getEnemyTempArray( array);
	if( !ENEMYTEMP_CHECKINDEX( tarray)) return -1;
//    tp = ENEMYTEMP_enemy[tarray].intdata;
	// 犯□正戊疋□
	for( i = 0; i < E_T_DATAINTNUM; i ++ ){
	    tp[i] = ENEMYTEMP_enemy[tarray].intdata[i];
	}

    //     赓渝祭
    memset( &CharNew, 0, sizeof( Char ) );

    if( !CHAR_getDefaultChar( &CharNew,31010 ) )return -1;

    /*    飓  寞    */
    CharNew.data[CHAR_BASEBASEIMAGENUMBER]
        = CharNew.data[CHAR_BASEIMAGENUMBER] = *(tp+E_T_IMGNUMBER);
    /*  衬匹丐月午涩烂允月   */
    CharNew.data[CHAR_WHICHTYPE] = CHAR_TYPEENEMY;
    /*     毛壅允 */
    CharNew.data[CHAR_DUELPOINT] = 0;

	/* 伊矛伙毛瑁烂允月[ */
	if( baselevel > 0 ){
		level = baselevel;	// 伊矛伙裔烂
	}else{
		level = RAND( (*(p + ENEMY_LV_MIN)), (*(p+ ENEMY_LV_MAX)));
	}
#define		E_PAR( a)		(*(p + (a)))
#define		ET_PAR( a)		(*(tp + (a)))
/* 由仿丢□正隙醒井日  端及湘  由仿丢□正尺及煌遥挚 */
#if 1
#define		PARAM_CAL( l) 	( ( level -1)*ET_PAR( E_T_LVUPPOINT)+ ET_PAR(E_T_INITNUM)) * ET_PAR( (l))
#else
#define		PARAM_CAL( l) 	( (E_PAR(ENEMY_LV) -1)*ET_PAR( E_T_LVUPPOINT)+ ET_PAR(E_T_INITNUM)) * ET_PAR( (l))
#endif
	/* 燮内湘  喃曰蕊曰禾奶件玄卞+ㄡ毛仿件母丞匹垫丹 */
	tp[E_T_BASEVITAL] += RAND( 0, 4 ) - 2;
	tp[E_T_BASESTR] += RAND( 0, 4 ) - 2;
	tp[E_T_BASETGH] += RAND( 0, 4 ) - 2;
	tp[E_T_BASEDEX] += RAND( 0, 4 ) - 2;
	/* 仇及凛鳔匹喃曰蕊曰禾奶件玄毛忡绣仄化云仁 */
    CharNew.data[CHAR_ALLOCPOINT]
    = ( tp[E_T_BASEVITAL] << 24 )
    + ( tp[E_T_BASESTR] << 16 )
    + ( tp[E_T_BASETGH] << 8 )
    + ( tp[E_T_BASEDEX] << 0 );
	/* 公及  }仿件母丞匹禾奶件玄毛ㄠ勿勾笛遥[仇木毛ㄠㄟ荚楞曰忒允[*/
	for( i = 0; i < 10; i ++ ){
		int work = RAND( 0, 3 );
		if( work == 0 )tp[E_T_BASEVITAL]++;
		if( work == 1 )tp[E_T_BASESTR]++;
		if( work == 2 )tp[E_T_BASETGH]++;
		if( work == 3 )tp[E_T_BASEDEX]++;
	}

    /* 由仿丢□正本永玄 */
    CharNew.data[CHAR_VITAL]    = PARAM_CAL(E_T_BASEVITAL);
    CharNew.data[CHAR_STR]      = PARAM_CAL(E_T_BASESTR);
    CharNew.data[CHAR_TOUGH]    = PARAM_CAL(E_T_BASETGH);
    CharNew.data[CHAR_DEX]      = PARAM_CAL(E_T_BASEDEX);
    CharNew.data[CHAR_FIREAT]   = *(tp+ E_T_FIREAT);
    CharNew.data[CHAR_WATERAT]  = *(tp+ E_T_WATERAT);
    CharNew.data[CHAR_EARTHAT]  = *(tp+ E_T_EARTHAT);
    CharNew.data[CHAR_WINDAT]   = *(tp+ E_T_WINDAT);
    CharNew.data[CHAR_MODAI]    = *(tp+ E_T_MODAI);
    CharNew.data[CHAR_VARIABLEAI]    = 0;
	CharNew.data[CHAR_LV]       = level;
	//CharNew.data[CHAR_LV]       = *(p+ ENEMY_LV);
    CharNew.data[CHAR_SLOT]     = *(tp+ E_T_SLOT);
    CharNew.data[CHAR_POISON]   = *(tp+ E_T_POISON);
    CharNew.data[CHAR_PARALYSIS]= *(tp+ E_T_PARALYSIS);
    CharNew.data[CHAR_SLEEP]	= *(tp+ E_T_SLEEP);
    CharNew.data[CHAR_STONE]	= *(tp+ E_T_STONE);
    CharNew.data[CHAR_DRUNK]	= *(tp+ E_T_DRUNK);
    CharNew.data[CHAR_CONFUSION]= *(tp+ E_T_CONFUSION);
	CharNew.data[CHAR_RARE]		= *(tp+ E_T_RARE);
	CharNew.data[CHAR_PETID]	= *(tp + E_T_TEMPNO);
	CharNew.data[CHAR_CRITIAL]	= *(tp + E_T_CRITICAL);
	CharNew.data[CHAR_COUNTER]	= *(tp + E_T_COUNTER);
	
	for( i = 0; i < CHAR_MAXPETSKILLHAVE; i ++ ) {
		CharNew.unionTable.indexOfPetskill[i] = *(tp + E_T_PETSKILL1 + i);
	}
	enemyrank = ENEMY_getRank( array, tarray );
	CharNew.data[CHAR_PETRANK]	= enemyrank;
#undef	E_PAR
#undef	ET_PAR
#undef	PARAM_CAL
	CharNew.data[CHAR_DUELPOINT] = *( p + ENEMY_DUELPOINT);
	if( *( p + ENEMY_DUELPOINT) <= 0 ) {
		if( *(p + ENEMY_EXP) != -1 ) {
		    CharNew.data[CHAR_EXP]      = *( p+ENEMY_EXP);
		}else {
		    CharNew.data[CHAR_EXP]      = ENEMY_getExp( array,tarray,level, enemyrank);
		}
	}
    strcpysafe( CharNew.string[CHAR_NAME].string,
                sizeof(CharNew.string[CHAR_NAME].string),
                (char *)ENEMYTEMP_enemy[tarray].chardata[E_T_NAME].string );

    newindex = CHAR_initCharOneArray( &CharNew );
    if( newindex < 0 ){
        return -1;
    }
	for( iloop=0; iloop< (ENEMY_ITEMPROB10 - ENEMY_ITEM1+1)/2; iloop++){
		if( *(p+ENEMY_ITEMPROB1+iloop) != 0) {
#ifdef _FIX_ITEMPROB
			if( RAND( 0,999) < *(p+ENEMY_ITEMPROB1+iloop)){
#else
			if( RAND( 0,99) < *(p+ENEMY_ITEMPROB1+iloop)){

⌨️ 快捷键说明

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