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

📄 char_data.c.bak

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 BAK
📖 第 1 页 / 共 4 页
字号:
#endif
			int ownerindex = CHAR_getWorkInt(petindex, CHAR_WORKPLAYERINDEX);
#ifdef _FMVER21
#else
			if (CHAR_getInt(ownerindex, CHAR_FMINDEX) < 0)	return	 0;
			if (CHAR_getInt(ownerindex, CHAR_FMLEADERFLAG) <= 0 )    return  0;
			if (strcmp(CHAR_getChar(ownerindex, CHAR_FMNAME), "") == 0)	return	0;
#endif	   	    
			if (CHAR_CHECKINDEX(ownerindex)){
				exp1 = CHAR_GetLevelExp( petindex, level, 1);
				exp2 = CHAR_GetLevelExp( petindex,level - 1, 1);
				 
#ifdef _PERSONAL_FAME	// Arminius 8.30: 家族个人声望
				feedpoint = (exp1 - exp2) / 20000;	// 减半
#else
				feedpoint = (exp1 - exp2) / 10000;
#endif
				sprintf(tmpbuf, "%d", feedpoint);
				if (feedpoint > 0){
					// CoolFish: 2001/10/03
					int fd = getfdFromCharaIndex(ownerindex);
#ifdef _PERSONAL_FAME	// Arminius 8.30: 家族个人声望
					CHAR_earnFame(ownerindex, feedpoint);
#endif
#ifdef _NEW_MANOR_LAW
					sprintf(tmpbuf1, "%d", CHAR_getInt(ownerindex,CHAR_FAME));
#endif
#ifdef _FMVER21
					if (CHAR_getInt(ownerindex, CHAR_FMLEADERFLAG) > 0
						 && CHAR_getInt(ownerindex, CHAR_FMLEADERFLAG) != FMMEMBER_APPLY){
						saacproto_ACFixFMData_send(acfd,
							 CHAR_getChar(ownerindex, CHAR_FMNAME),
							 CHAR_getInt(ownerindex, CHAR_FMINDEX),
							 CHAR_getWorkInt(ownerindex, CHAR_WORKFMINDEXI),
							 FM_FIX_FMFEED, tmpbuf,
#ifndef _NEW_MANOR_LAW
							 "",
#else
							 tmpbuf1,
#endif
							 // CoolFish: 2001/10/03
							 CHAR_getWorkInt(ownerindex, CHAR_WORKFMCHARINDEX),
							 CONNECT_getFdid(fd));
						 // CHAR_getWorkInt(ownerindex, CHAR_WORKFMCHARINDEX), 0);
#ifdef _NEW_MANOR_LAW
						{
							int i;
							for(i=0;i<FAMILY_MAXHOME;i++){
								// 任何一个庄园有在挑战排程,气势值一改变就向AC要最新气势资料
								if(fmpointlist.fm_inwar[i]){
									saacproto_ACShowTopFMList_send(acfd, FM_TOP_MOMENTUM);
									break;
								}
							}
						}
#endif
					}
#ifdef _NEW_MANOR_LAW
					// 未审核通过时只更新成员气势值
					else if(CHAR_getInt(ownerindex, CHAR_FMLEADERFLAG) == FMMEMBER_APPLY){
						sprintf(tmpbuf,"%d",CHAR_getInt(ownerindex,CHAR_FAME));
						saacproto_ACFixFMData_send(acfd,
							CHAR_getChar(ownerindex,CHAR_FMNAME),
							CHAR_getInt(ownerindex,CHAR_FMINDEX),
							CHAR_getWorkInt(ownerindex,CHAR_WORKFMINDEXI),
							FM_FIX_FAME,tmpbuf,"",
							CHAR_getWorkInt(ownerindex,CHAR_WORKFMCHARINDEX),
							CONNECT_getFdid(fd));
					}
#endif
#else
					saacproto_ACFixFMData_send(acfd,
						CHAR_getChar(ownerindex, CHAR_FMNAME),
						CHAR_getInt(ownerindex, CHAR_FMINDEX),
						CHAR_getWorkInt(ownerindex, CHAR_WORKFMINDEXI),
						FM_FIX_FMFEED, tmpbuf, "",
						CHAR_getWorkInt(ownerindex, CHAR_WORKFMCHARINDEX), 0);
#endif
#ifdef _TEACHER_SYSTEM
					iGetFame = feedpoint/20; // 导师获得学生所得声望的 5% (1/20)
					// 检查所得的声望有没有大於0
					if(iGetFame > 0){
						// 检查有没有导师
						if(strlen(CHAR_getChar(ownerindex,CHAR_TEACHER_ID)) > 0 && strlen(CHAR_getChar(ownerindex,CHAR_TEACHER_NAME)) > 0){
							int iPlayernum = CHAR_getPlayerMaxNum(),i;
							char szMsg[128];
							
							// 检查导师在不在线上
							for(i=0;i<iPlayernum;i++){
								if(CHAR_getCharUse(i) == FALSE) continue;
								if(strcmp(CHAR_getChar(ownerindex,CHAR_TEACHER_ID),CHAR_getChar(i,CHAR_CDKEY)) == 0 &&
									strcmp(CHAR_getChar(ownerindex,CHAR_TEACHER_NAME),CHAR_getChar(i,CHAR_NAME)) == 0){
									float fGetFame = (float)iGetFame/100;
									// 导师在线上
									CHAR_setWorkInt(i,CHAR_WORK_GET_TEACHER_FAME,CHAR_getWorkInt(i,CHAR_WORK_GET_TEACHER_FAME) + iGetFame);
									sprintf(szMsg,"获得学生 %s %.2f 点声望",CHAR_getChar(ownerindex,CHAR_NAME),fGetFame);
									CHAR_talkToCli(i,-1,szMsg,CHAR_COLORYELLOW);
									break;
								}
							}
						}
					}
#endif
				}
			}
		}
	}
	
	return 0;
}
#ifdef _NPC_FUSION
int PETFUSION_FusionPetSub( int charaindex, int Subindex1, int Subindex2, int *work, int *skill)
{
	int i;
	int base[4]={0,0,0,0};
	int petskill[7]={-1,-1,-1,-1,-1,-1,-1};
	if( !CHAR_CHECKINDEX( Subindex1)) return 0;
	if( EVOLUTION_getPetFusionCode( CHAR_getInt( Subindex1, CHAR_PETID) ) < 0 ){
		return 0;
	}

	if( CHAR_getInt( Subindex1, CHAR_FUSIONBEIT) == 1 ||
		CHAR_getInt( Subindex1, CHAR_FUSIONRAISE) > 0 )return 0;//检查是否为融合宠
	for( i=0; i<4; i++)	{
		work[i] = 0;
	}
	if( PET_getBaseAndSkill( charaindex, Subindex1, base, petskill, 0) == FALSE )
		return 0;
	if( CHAR_getInt( Subindex1, CHAR_LV) < 80 ){//等级销弱
		for( i=0; i<4; i++)	{
			base[i] = base[i]*0.8;
		}
	}
	for( i=0; i<4; i++)	{
		work[i] = base[i];
	}
	for( i=0; i<7; i++)	{
		skill[i] = petskill[i];
	}
	if( !CHAR_CHECKINDEX( Subindex2)) return 1;
	if( EVOLUTION_getPetFusionCode( CHAR_getInt( Subindex2, CHAR_PETID) ) < 0 ){
		return 0;
	}

	if( CHAR_getInt( Subindex2, CHAR_FUSIONBEIT) == 1 ||
		CHAR_getInt( Subindex2, CHAR_FUSIONRAISE) > 0 )return 0;//检查是否为融合宠

	if( PET_getBaseAndSkill( charaindex, Subindex2, base, NULL, 0) == FALSE )
		return 0;
	if( CHAR_getInt( Subindex2, CHAR_LV) < 80 ){//等级销弱
		for( i=0; i<4; i++)	{
			base[i] = base[i]*0.8;
		}
	}
	for( i=0; i<4; i++)	{
		work[i] += base[i];
	}
	return 2;
}

BOOL PETFUSION_FusionPetMain( int charaindex, int Mainindex, int *work, int *skill)
{
	int i;
	int base[4]={0,0,0,0};
	int petskill[7]={-1,-1,-1,-1,-1,-1,-1};
	if( !CHAR_CHECKINDEX( Mainindex)) return FALSE;
	if( EVOLUTION_getPetFusionCode( CHAR_getInt( Mainindex, CHAR_PETID) ) < 0 ){
		return 0;
	}
	if( CHAR_getInt( Mainindex, CHAR_FUSIONBEIT) == 1 ||
		CHAR_getInt( Mainindex, CHAR_FUSIONRAISE) > 0 )return FALSE;//检查是否为融合宠

	if( PET_getBaseAndSkill( charaindex, Mainindex, base, petskill, 0) == FALSE )
		return -1;
	if( CHAR_getInt( Mainindex, CHAR_LV) < 80 ){//等级销弱
		for( i=0; i<4; i++)	{
			base[i] = base[i]*0.8;
		}
	}
	for( i=0; i<4; i++)	{
		work[i] += base[i]*0.6;
	}
	for( i=0; i<7; i++)	{
		skill[i] = petskill[i];
	}

	return TRUE;
}

BOOL PETFUSION_DelPet( int toindex, int Mainindex, int Subindex1, int Subindex2, int flg)
{
	int i, j, cnt=0;
	int petindex[3];


	petindex[0] = Mainindex;
	petindex[1] = Subindex1;
	petindex[2] = Subindex2;

	for( i=0; i<3; i++)	{
		if( !CHAR_CHECKINDEX( petindex[i] ) ) continue;
		for( j=0; j<CHAR_MAXPETHAVE; j++)	{
			int pindex = CHAR_getCharPet( toindex, j);
			if( !CHAR_CHECKINDEX( pindex) ) continue;
			if( pindex == petindex[i] )
				break;
		}
		if( j >= CHAR_MAXPETHAVE){

		}else	{
			char szPet[256];
			char msgbuf[256];
			CHAR_setCharPet( toindex, j, -1);
			snprintf( szPet, sizeof( szPet ), "K%d", j);
			CHAR_sendStatusString( toindex, szPet );

			snprintf( msgbuf,sizeof( msgbuf), "交出%s。", CHAR_getChar( petindex[i], CHAR_NAME));
			CHAR_talkToCli( toindex, -1, msgbuf,  CHAR_COLORYELLOW);
				LogPet(			
					CHAR_getChar( toindex, CHAR_NAME ),
					CHAR_getChar( toindex, CHAR_CDKEY ),
					CHAR_getChar( petindex[i], CHAR_NAME),
					CHAR_getInt( petindex[i], CHAR_LV),
					"TenseiDel",
					CHAR_getInt( toindex,CHAR_FLOOR),
					CHAR_getInt( toindex,CHAR_X ),
					CHAR_getInt( toindex,CHAR_Y ),
					CHAR_getChar( petindex[i], CHAR_UNIQUECODE)   // shan 2001/12/14
				);
		}
		CHAR_endCharOneArray( petindex[i] );
		cnt++;
	}
	if( cnt >= flg )
		return TRUE;
	return FALSE;
}

int PETFUSION_Evolution( int charaindex, int petindex)
{
	char buf[256], buf1[256];
	int newindex=-1;
	CHAR_setInt( petindex, CHAR_FUSIONTIMELIMIT, -1);

	sprintf( buf, "蛋〈%s〉孵化成", CHAR_getChar( petindex, CHAR_NAME));
	newindex = EVOLUTION_createPetFromEnemyIndex( charaindex, petindex, 0);
	if( !CHAR_CHECKINDEX( newindex) ){
		CHAR_talkToCli( charaindex, -1, "宠物孵化发生错误。", CHAR_COLORYELLOW);
		return -1;
	}
	sprintf( buf1, "〈%s〉。", CHAR_getChar( newindex, CHAR_NAME));
	strcat( buf, buf1);
	CHAR_talkToCli( charaindex, -1, buf, CHAR_COLORYELLOW);

	LogPetFeed(
		CHAR_getChar( charaindex, CHAR_NAME),
		CHAR_getChar( charaindex, CHAR_CDKEY),
		CHAR_getChar( petindex, CHAR_NAME),
		petindex,
		CHAR_getInt( petindex, CHAR_LV),
		buf, // Key
		CHAR_getInt( charaindex, CHAR_FLOOR),
		CHAR_getInt( charaindex, CHAR_X),
		CHAR_getInt( charaindex, CHAR_Y),
		CHAR_getChar( petindex, CHAR_UNIQUECODE) );

	return newindex;
}
#endif

#ifdef _PET_TRANS
int PETTRANS_getPetBase( int petindex, int *work, int *petrank)
{
	int i, total=-1;
	if( !CHAR_CHECKINDEX( petindex) ){
		total = 0;
		*petrank = 1;
		for( i=0; i<4; i++)	{
			work[i] = 50;
			total += work[i];
		}
	}else{
		int LevelUpPoint = CHAR_getInt( petindex, CHAR_ALLOCPOINT );
		*petrank = CHAR_getInt( petindex, CHAR_PETRANK );
		work[0] = (float)(( LevelUpPoint >> 24 ) & 0xFF);
		work[1] = (float)(( LevelUpPoint >> 16 ) & 0xFF);
		work[2] = (float)(( LevelUpPoint >> 8 ) & 0xFF);
		work[3] = (float)(( LevelUpPoint >> 0 ) & 0xFF);
		total = ( work[0] + work[1] + work[2] + work[3] );
		if( total > 150 )	total = 150;
		if( total < 0 )		total = 0;
	}
	return total;
}

#ifdef _PET_2TRANS
int NPC_PetTransManGetAns( int total1, int total2, int LV, int rank, int tran )
#else
int NPC_PetTransManGetAns( int total1, int total2, int LV, int rank )
#endif
{
	int ans=0 , TransLV = 100;
	float total = 0.00;
	int Fx=1;

	if( LV > 130 ) LV = 130;
	total = ( (float)total1/100 ); // 玛蕾最高 total1=200
	total = total*total*total*total*total; 
	if( total < 1 ) total = 0;
	else total= total*1.3; // 所以total最大=41.6 最小=0

	Fx = (int)((5-rank)*1.2)+5; // rank=0~6 所以 Fx最大=11(rank=0)最小=4(rank=6)
	ans = (int)total + total2 + ((LV-TransLV)/Fx); //42+150+30/11=194

#ifdef _PET_2TRANS
	if( tran == 0 ){
		if( ans > 150 )	
			ans = 150;
	}
	else{
		if( ans > 200 )	
			ans = 200;
	}
#else
	if( ans > 150 )	{
		ans = 150;
	}
#endif
	print("\n ans = %d", ans);
	return ans;
}

int PETTRANS_PetTransManStatus( int toindex, int petindex1, int petindex2)
{
	int petrank=0,i;
	int total1,total2,total,petLV,ans;
	int petID,enemynum,ret=-1;
	int work[4]={0,0,0,0};
	int base[4]={0,0,0,0};

#define RAND(x,y)   ((x-1)+1+ (int)( (double)(y-(x-1))*rand()/(RAND_MAX+1.0)) )
	total1 = PETTRANS_getPetBase( petindex1, work, &petrank);
	total2 = PETTRANS_getPetBase( petindex2, base, &petrank);
	petLV	= CHAR_getInt( petindex2, CHAR_LV);
#ifdef _PET_2TRANS
	ans = NPC_PetTransManGetAns( total1, total2, petLV, petrank, CHAR_getInt( petindex2, CHAR_TRANSMIGRATION ) );
#else
	ans = NPC_PetTransManGetAns( total1, total2, petLV, petrank );
#endif
	total = total1 + (total2*4);
	total2 = 0;
	for( i=0; i<4; i++)	{
		work[i] = work[i]*4;
		total2 += work[i];
	}
	total = total1 + total2;
	for( i=0; i<4; i++)	{
		base[i] = (ans * (base[i]+work[i])) /total;
	}
	enemynum = ENEMY_getEnemyNum();
	petID = CHAR_getInt( petindex2, CHAR_PETID);
	for( i=0; i<enemynum; i++)	{
		if( ENEMY_getInt(i, ENEMY_TEMPNO) == petID )
			break;
	}
	if( i == enemynum )
		return -1;

	ret = GetNewPet( toindex, petindex2, i, base);
	if( ret < 0 )
		return -1;
	return ret;
}
#endif

#ifdef _CHIKULA_STONE
void CHAR_AutoChikulaStone( int charaindex, int Dflg)
{
	int Myhp, i, dnums;
	if( !CHAR_CHECKINDEX( charaindex) ) return;
	if( CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE ) return;
	switch( Dflg ){
	case 1:	//HP
		Myhp = CHAR_getInt( charaindex, CHAR_HP);
		dnums = CHAR_getWorkInt( charaindex, CHAR_WORKCHIKULAHP);
		Myhp += dnums;
		if( Myhp > CHAR_getWorkInt( charaindex, CHAR_WORKMAXHP) ){
			Myhp = CHAR_getWorkInt( charaindex, CHAR_WORKMAXHP);
		}
		CHAR_setInt( charaindex, CHAR_HP, Myhp);
		CHAR_complianceParameter( charaindex );
		CHAR_send_P_StatusString( charaindex, CHAR_P_STRING_HP);
		for( i=0; i<CHAR_MAXPETHAVE; i++)	{
			int petindex = CHAR_getCharPet( charaindex, i);
			if( !CHAR_CHECKINDEX( petindex) ) continue;
			Myhp = CHAR_getInt( petindex, CHAR_HP);
			Myhp += dnums;
			if( Myhp > CHAR_getWorkInt( petindex, CHAR_WORKMAXHP) ){
				Myhp = CHAR_getWorkInt( petindex, CHAR_WORKMAXHP);
			}
			CHAR_setInt( petindex, CHAR_HP, Myhp);
			CHAR_send_K_StatusString( charaindex, i, CHAR_K_STRING_HP|CHAR_K_STRING_AI);
		}
		break;
	case 2://MP
		Myhp = CHAR_getInt( charaindex, CHAR_MP);
		dnums = CHAR_getWorkInt( charaindex, CHAR_WORKCHIKULAMP);
		Myhp += dnums;
		if( Myhp > CHAR_getWorkInt( charaindex, CHAR_WORKMAXMP) ){
			Myhp = CHAR_getWorkInt( charaindex, CHAR_WORKMAXMP);
		}
		CHAR_setInt( charaindex, CHAR_MP, Myhp);
		CHAR_complianceParameter( charaindex );
		CHAR_send_P_StatusString( charaindex, CHAR_P_STRING_MP);
		break;
	}
}
#endif

#ifdef _STATUS_WATERWORD //水世界状态
void CHAR_CheckWaterStatus( int charaindex)
{
	if( !CHAR_CHECKINDEX( charaindex) ) return;
	if( CHAR_getWorkInt( charaindex, CHAR_WORKSTATUSWATER) == -1 ){
		return;
	}
	if( CHAR_getWorkInt( charaindex, CHAR_WORKSTATUSWATER) > 0 ){
		CHAR_setWorkInt( charaindex, CHAR_WORKSTATUSWATER,
		CHAR_getWorkInt( charaindex, CHAR_WORKSTATUSWATER) -1 );

		if( CHAR_getWorkInt( charaindex, CHAR_WORKSTATUSWATER) != 0 &&
			CHAR_getWorkInt( charaindex, CHAR_WORKSTATUSWATER)%10 == 0 ){
			char buf1[256];
			sprintf( buf1, "水中呼吸时间剩馀%d分。",
				CHAR_getWorkInt( charaindex, CHAR_WORKSTATUSWATER));
			CHAR_talkToCli( charaindex, -1, buf1, CHAR_COLORYELLOW);
		}
	}

	if( CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE ){
		return;
	}
	if( CHAR_getWorkInt( charaindex, CHAR_WORKMAPFLOORTYPE) == 1 &&
		CHAR_getWorkInt( charaindex, CHAR_WORKSTATUSWATER) <= 0 ){//水世界
		char token[256];
		int defhp=0;
		int maxhp = CHAR_getWorkInt( charaindex, CHAR_WORKMAXHP);
		int myhp = CHAR_getInt( charaindex, CHAR_HP);
		defhp = (maxhp*0.033);
		if( defhp <= 0 ) defhp = 1;
		myhp = myhp - defhp;
		sprintf( token, "因无法呼吸,扣%d HP。", defhp);
		CHAR_talkToCli( charaindex, -1, token, CHAR_COLORYELLOW);

		if( myhp <= 0 ){
			myhp = 1;
			if(CHAR_getInt(charaindex,CHAR_FLOOR) == 151 || CHAR_getInt(charaindex,CHAR_FLOOR) == 160
				|| CHAR_getInt(charaindex,CHAR_FLOOR) == 161 ) CHAR_warpToSpecificPoint(charaindex,702,213,27);
			else CHAR_warpToSpecificPoint( charaindex, 200,102,1021);
		}
		CHAR_setInt( charaindex, CHAR_HP, myhp);
		CHAR_send_P_StatusString( charaindex, CHAR_P_STRING_HP);
	}

}
#endif

int CHAR_findSurplusPetBox( int charaindex )
{
	int i, remnants=0;
	for( i=0; i<CHAR_MAXPETHAVE; i++){
    	int petindex = CHAR_getCharPet( charaindex, i);
		if( !CHAR_CHECKINDEX( petindex) ) remnants++;
	}

	return remnants;

}

⌨️ 快捷键说明

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