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

📄 enemy.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
📖 第 1 页 / 共 5 页
字号:
#endif
				itemindex = ITEM_makeItemAndRegist(  *(p+ENEMY_ITEM1+iloop) );
				CHAR_setItemIndex( newindex, CHAR_STARTITEMARRAY +iloop, itemindex);
				ITEM_setWorkInt( itemindex, ITEM_WORKCHARAINDEX, newindex );
		        ITEM_setWorkInt( itemindex, ITEM_WORKOBJINDEX,-1);

			}
		}
	}

	{ int style, wepon = -1;
		style = (*(p + ENEMY_STYLE));
		switch( style ){
		case 1:		wepon = 0;break;	//   
		case 2:		wepon = 100;break;  // 轺徇
		case 3:		wepon = 200;break;	// 键
		case 4:		wepon = 400;break;	// 菰
		case 5:		wepon = 500;break;	// 皮□丢仿件
		case 6:		wepon = 700;break;  // 髑仆檗
		case 7:		wepon = 600;break;	// 髑仆  
		default:break;
		}
		if( wepon >= 0 ){
			itemindex = ITEM_makeItemAndRegist( wepon ) ;
			CHAR_setItemIndex( newindex, CHAR_ARM, itemindex );
			ITEM_setWorkInt( itemindex, ITEM_WORKCHARAINDEX, newindex );
	        ITEM_setWorkInt( itemindex, ITEM_WORKOBJINDEX,-1);
		}
	}

	ENEMY_RandomChange( newindex, *( p+ENEMY_ID) );
    CHAR_complianceParameter( newindex );

	CHAR_setInt( newindex, CHAR_HP, CHAR_getWorkInt( newindex, CHAR_WORKMAXHP));
	CHAR_setWorkInt( newindex, CHAR_WORKTACTICS, *(p+ENEMY_TACTICS));
	CHAR_setWorkChar( newindex, CHAR_WORKBATTLE_TACTICSOPTION,
                		ENEMY_enemy[array].chardata[ENEMY_TACTICSOPTION].string );
#ifdef _BATTLENPC_WARP_PLAYER	
	CHAR_setWorkChar( newindex, CHAR_WORKBATTLE_ACT_CONDITION,
                		ENEMY_enemy[array].chardata[ENEMY_ACT_CONDITION].string );
#endif
	CHAR_setWorkInt( newindex, CHAR_WORK_PETFLG, *(p+ENEMY_PETFLG));
	CHAR_setWorkInt( newindex, CHAR_WORKMODCAPTUREDEFAULT, *(tp + E_T_GET));
#ifdef _ENEMY_FALLGROUND
	{
		int i=0;
		for( i=0;i<arraysizeof( ridePetTable);i++)	{			
			if( CHAR_getInt( newindex, CHAR_BASEBASEIMAGENUMBER) == ridePetTable[i].rideNo )	{
				CHAR_setInt( newindex, CHAR_BASEBASEIMAGENUMBER, ridePetTable[i].charNo );
				CHAR_setInt( newindex, CHAR_BASEIMAGENUMBER, ridePetTable[i].rideNo );
				break;
			}
		}
	}
#endif
#ifdef _PETSKILL_BECOMEFOX //将媚惑术中招时间清除为-1
     CHAR_setWorkInt( newindex, CHAR_WORKFOXROUND, -1 ); 
#endif
    return newindex;

}


#define RANDOMENEMY_TOP		945
#define RANDOMENEMY_END		956

static int RandomHuman945[] = {739,742,745,748};
static int RandomPet946[] = {859,860,861,868,869,870,881,882,883,884};
static int RandomPet964[] = {859,860,861,868,869,870,881,882,883,884};

static int RandomHuman947[] = {740,743,746,749};
static int RandomPet948[] = {864,871,872,873,885,886,889,890,891,892,893,894};
static int RandomPet965[] = {864,871,872,873,885,886,889,890,891,892,893,894};

static int RandomHuman949[] = {741,744,747,750};
static int RandomPet950[] = {862,863,865,866,867,874,875,876,877,878,879,880};
static int RandomPet966[] = {862,863,865,866,867,874,875,876,877,878,879,880};

static int RandomHuman951[] = {895,898,901,904};
static int RandomPet952[] = {912,913,914,915,916,917,918,919,920,928};
static int RandomPet967[] = {912,913,914,915,916,917,918,919,920,928};

static int RandomHuman953[] = {896,899,902,905};
static int RandomPet954[] = {929,930,931,932,933,934,935,936,937,938,939,940};
static int RandomPet968[] = {929,930,931,932,933,934,935,936,937,938,939,940};

static int RandomHuman955[] = {897,900,903,906};
static int RandomPet956[] = {907,908,909,910,911,921,922,923,924,925,926,927};
static int RandomPet969[] = {907,908,909,910,911,921,922,923,924,925,926,927};

typedef struct {
	int num;
	int *pTbl;
	int arraysize;
}RANDOMENEMY;

static RANDOMENEMY RandomEnemyTbl[] = {
	{ 945, RandomHuman945, arraysizeof( RandomHuman945 ) },
	{ 946, RandomPet946,	arraysizeof( RandomPet946 ) },
	{ 947, RandomHuman947, arraysizeof( RandomHuman947 ) },
	{ 948, RandomPet948, arraysizeof( RandomPet948 ) },
	{ 949, RandomHuman949, arraysizeof( RandomHuman949 ) },
	{ 950, RandomPet950, arraysizeof( RandomPet950 ) },
	{ 951, RandomHuman951, arraysizeof( RandomHuman951 ) },
	{ 952, RandomPet952, arraysizeof( RandomPet952 ) },
	{ 953, RandomHuman953, arraysizeof( RandomHuman953 ) },
	{ 954, RandomPet954, arraysizeof( RandomPet954 ) },
	{ 955, RandomHuman955, arraysizeof( RandomHuman955 ) },
	{ 956, RandomPet956, arraysizeof( RandomPet956 ) },

	{ 964, RandomPet964, arraysizeof( RandomPet964 ) },
	{ 965, RandomPet965, arraysizeof( RandomPet965 ) },
	{ 966, RandomPet966, arraysizeof( RandomPet966 ) },
	{ 967, RandomPet967, arraysizeof( RandomPet967 ) },
	{ 968, RandomPet968, arraysizeof( RandomPet968 ) },
	{ 969, RandomPet969, arraysizeof( RandomPet969 ) },
};


/*------------------------------------------------------------
 * 衬    涩烂及摹    寞互  溃卅袄卅日仿件母丞卞涩烂允月
 ------------------------------------------------------------*/
int ENEMY_RandomEnemyArray( int e_array, int *pNew )
{
	int i = 0, randwork, work;
//	RANDOMENEMY *pRandomEnemy;
	*pNew = -1;
	// 仇及  区反仿件母丞
	if(
		( RANDOMENEMY_TOP <= e_array && e_array <= RANDOMENEMY_END )
	||	( 964 <= e_array && e_array <= 969 )
	){
		// 升及母立□井譬屯月
		for( i = 0; i < arraysizeof( RandomEnemyTbl ); i ++ ){
			if( RandomEnemyTbl[i].num == e_array ){
				break;
			}
		}
		//   区毛译尹化中凶日巨仿□匹  仃月
		if( i >= arraysizeof( RandomEnemyTbl ) ) return 0;

		// 仿件母丞涩烂
		randwork = RAND( 0, RandomEnemyTbl[i].arraysize - 1 );
		//     井日蕙仄中  寞毛潸  
		work = RandomEnemyTbl[i].pTbl[randwork];
		*pNew = ENEMY_getEnemyArrayFromId( work );
		return 1;
	}else{
		// 窒仪手卅中
		return 0;
	}
}

int *ENEMY_getEnemy( int charaindex, int x, int y)
{
    int     i;
    int		array;
    int		g_array;
    int		e_array;
    int     found = 0;
    int		work[ENEMY_INDEXTABLEMAXSIZE];
    int		wr[ENEMY_INDEXTABLEMAXSIZE];
    int		createenemynum;
    int		enemyentrymax;
    int		entrymax;
    int		r_max;
    int		groupid;
	int		bigcnt;
	int		loopcounter;
    array = ENCOUNT_getEncountAreaArray( CHAR_getInt( charaindex, CHAR_FLOOR),x,y);
	if( array == -1 ) return NULL;
    enemyentrymax = ENCOUNT_getCreateEnemyMaxNumFromArray( array);
    if( enemyentrymax == -1 ) {
    	return NULL;
    }
    for( i = 0 ; i < ENEMY_INDEXTABLEMAXSIZE; i ++ ) {
        work[i] = -1;
		wr[i] = -1;
        ENEMY_indextable[i] = -1;
    }

	r_max= 0;
	for( i = 0; i < ENCOUNT_GROUPMAXNUM; i ++ ){
		if( ENCOUNT_getGroupIdFromArray( array, i ) != - 1 ) {
			int		itemid;
			groupid = ENCOUNT_getGroupIdFromArray( array, i);
			g_array = GROUP_getGroupArray( groupid);
            itemid = GROUP_getInt( g_array, GROUP_APPEARBYITEMID);
            if( itemid != -1 ) {
            	int		j;
            	for( j = 0; j < CHAR_MAXITEMHAVE; j ++ ) {
            		int itemindex = CHAR_getItemIndex( charaindex, j);
            		if( ITEM_CHECKINDEX( itemindex)) {
            			if( ITEM_getInt( itemindex, ITEM_ID) == itemid){
            				break;
            			}
            		}
            	}
            	if( j == CHAR_MAXITEMHAVE ) continue;
            }
            itemid = GROUP_getInt( g_array, GROUP_NOTAPPEARBYITEMID);
            if( itemid != -1 ) {
            	int		j;
            	for( j = 0; j < CHAR_MAXITEMHAVE; j ++ ) {
            		int itemindex = CHAR_getItemIndex( charaindex, j);
            		if( ITEM_CHECKINDEX( itemindex)) {
            			if( ITEM_getInt( itemindex, ITEM_ID) == itemid){
            				break;
            			}
            		}
            	}
            	if( j != CHAR_MAXITEMHAVE ) continue;
            }

			work[found] = i;
            wr[found] = ENCOUNT_getGroupProbFromArray( array, i);
            r_max += wr[found];
			found ++;
		}
	}
	r_max --;

	if( found <= 0 ) return NULL;
	{
		int	aaa = 0;
		int	r;
		r = RAND( 0, r_max);
		for( i = 0; i < found-1; i ++ ) {
			aaa += wr[i];
			if( wr[i] != 0 && r < aaa ) break;
		}
		r = i;

		groupid = ENCOUNT_getGroupIdFromArray( array, work[r]);
		g_array = GROUP_getGroupArray( groupid);
    }
    for( i = 0 ; i < ENEMY_INDEXTABLEMAXSIZE; i ++ ) {
        work[i] = -1;
		wr[i] = -1;
    }
	createenemynum = 0;
	found = 0;
	r_max = 0;
    for( i = ENEMY_ID1; i < CREATEPROB1; i ++ ) {
		int newarray, enemywork;
		e_array = ENEMY_getEnemyArrayFromIndex( g_array, i - ENEMY_ID1 );

#ifdef _ADD_ENCOUNT           // WON ADD 增加敌遭遇触发修件
		{	
		int char_event_now = -1, char_event_end = -1;
		if(ENCOUNT_table[array].event_now != -1){
			char_event_now = ENCOUNT_table[array].event_now;
		}
		else if(ENCOUNT_table[array].event_end != -1){
			char_event_end = ENCOUNT_table[array].event_end;
		}
		if( (char_event_now > 0) || ( char_event_end > 0 ) ) {
			if( (NPC_NowEventCheckFlg( charaindex, char_event_now) == TRUE ) ||
				(NPC_EventCheckFlg( charaindex, char_event_end) == TRUE )    ){
					
				e_array = ENEMY_getEnemyArrayFromIndex( 
					   GROUP_getGroupArray( ENCOUNT_table[array].enemy_group ),i - ENEMY_ID1 );
			}
		}	
		}
#endif
		enemywork = ENEMY_getInt( e_array, ENEMY_ID );
		if( ENEMY_RandomEnemyArray( enemywork, &newarray ) ){
			e_array = newarray;
		}

		if( e_array != -1 ) {
            work[found] = e_array;
            wr[found] = GROUP_getInt( g_array, i + (CREATEPROB1 - ENEMY_ID1));
            r_max += wr[found];
            found ++;
            createenemynum += ENEMY_getInt( e_array, ENEMY_CREATEMAXNUM);
        }
    }
    r_max --;

	if( found <= 0 ) return NULL;
    enemyentrymax= min( enemyentrymax, createenemynum );
	entrymax = RAND( 1, enemyentrymax);
	bigcnt = 0;
    for( i = 0,loopcounter = 0; i < entrymax && loopcounter < 100; loopcounter ++) {
		int	cnt;
    	int	j,r;
		int	aaa = 0;
		int		et_array;
		int	k,samecount;
		r = RAND( 0, r_max);
		for( j = 0; j < found-1; j ++ ) {
			aaa += wr[j];
			if( wr[j] != 0 && r < aaa ) break;
		}
		r = j;
		cnt = 0;
		for( j = 0; j < ENEMY_INDEXTABLEMAXSIZE && ENEMY_indextable[j] != -1; j ++ ) {
			if( ENEMY_indextable[j] == work[r] ) cnt ++;
		}
		samecount = 0;
		for( k = 0; k < found; k ++ ) {
			if( work[r] == work[k] ) samecount ++;
		}
    	if( cnt >= ENEMY_getInt( work[r], ENEMY_CREATEMAXNUM) * samecount ) {
    		continue;
    	}

		et_array = ENEMYTEMP_getEnemyTempArray( work[r]);
		if( ENEMYTEMP_CHECKINDEX( et_array)) {
			if( ENEMYTEMP_getInt( et_array, E_T_SIZE) == E_T_SIZE_BIG ) {
				if( bigcnt >= 5 ) {
					entrymax --;
					continue;
				}
				if( i > 4 ) {
					int	target_et_array;
					int	flg = FALSE;
					for( j = 0; j < 5; j ++ ) {
						if( !ENEMY_CHECKINDEX( ENEMY_indextable[j])) break;

						target_et_array = ENEMYTEMP_getEnemyTempArray(
														ENEMY_indextable[j]);
						if( !ENEMYTEMP_CHECKINDEX( target_et_array)) break;
						if( ENEMYTEMP_getInt( target_et_array, E_T_SIZE) == E_T_SIZE_NORMAL ){
							flg = TRUE;
							break;
						}
					}
					if( !flg) continue;
					ENEMY_indextable[i] = ENEMY_indextable[j];
					ENEMY_indextable[j] = work[r];
				}
				else {
					ENEMY_indextable[i] = work[r];
				}
				bigcnt ++;
			}else {
				ENEMY_indextable[i] = work[r];
    		}

			i++;
    	}
    }
    return found > 0 ? ENEMY_indextable : NULL;
}
int ENEMY_createPetFromEnemyIndex( int charaindex, int array)
{
    Char    CharNew;
    int newindex;
    int     *p;
    int		tp[E_T_DATAINTNUM];
    int		tarray, i;
    int     havepetelement;
	int		level;
	int		enemyrank;
    if( !ENEMY_CHECKINDEX( array)) return -1;
    havepetelement = CHAR_getCharPetElement( charaindex);
    if( havepetelement < 0 ) 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_TYPEPET;
	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_SLOT]     = *(tp+ E_T_SLOT);

⌨️ 快捷键说明

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