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

📄 npc_transmigration.c

📁 石器时代2.0完整版源代码.已经加入新功能. 在REDHAT9下GCC3.4编译成功.
💻 C
📖 第 1 页 / 共 4 页
字号:
	char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];	char s_tensei[128];	char errchar[][56]={"errormy","erroritem","errorpet","failmsg"};	int buttontype = 0, windowtype = 0, windowno = 0, errtype = 0;	int petindex = 0,i=1;	char *petname;	BOOL tenflg = FALSE;	int fd = getfdFromCharaIndex( toindex);	if( fd == -1 ) {		print( "getfd err\n");		return;	}	if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){		print("Tensei:GetArgStrErr");		return;	}	sprintf(s_tensei,"PETTRANS:");	//比对npc谈话	while(getStringFromIndexWithDelim( npcarg,"END",i,buf,sizeof( buf)) != FALSE)	{		i++;  		//如果条件符合则 tenflg 设为TRUE  		if( strstr(buf,s_tensei) != NULL) {			tenflg = TRUE;			break;  		}	}  	if( CHAR_getWorkInt( toindex, CHAR_WORKSHOPRELEVANT) < 0 )		CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 0);  	token[0] = '0';		 	switch(num)	{		case 0:		//对话			if( NPC_Util_GetStrFromStrWithDelim( buf,"mainmsg", token,sizeof( token)) == NULL )	{				print("\n ERROR buf str!!");				return;			}			buttontype = WINDOW_BUTTONTYPE_NEXT;			windowno = CHAR_WINDOWTYPE_PETTRANS_START;			break;				case 1:	//是否让宠物转生							//转生需要物品或宠物检查			errtype = NPC_PetTransManCheck( meindex, toindex, 0);			if( errtype >= 0 )				errtype = 3;				if( errtype >= 0 )	{				if( NPC_Util_GetStrFromStrWithDelim( buf,errchar[ errtype], token,sizeof( token)) == NULL )	{					print("\n ERROR str errchar !!");					return;				}				buttontype = WINDOW_BUTTONTYPE_OK;				windowtype = WINDOW_MESSAGETYPE_MESSAGE;				windowno =  CHAR_WINDOWTYPE_PETTRANS_END;				break;                                                			}			if( NPC_Util_GetStrFromStrWithDelim( buf,"selectmsg", token,sizeof( token)) == NULL )	{				print("\n ERROR selectmsg !!");				return;			}			CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 1);			windowno = CHAR_WINDOWTYPE_PETTRANS_SELECT;			windowtype = WINDOW_MESSAGETYPE_MESSAGE;			buttontype=WINDOW_BUTTONTYPE_YESNO;			break;		case 2:		//选宠			if( NPC_Util_GetStrFromStrWithDelim( buf,"setpetmsg", token,sizeof( token)) == NULL )	{				print("\n ERROR setpetmsg !!");				return;			}			buttontype = WINDOW_BUTTONTYPE_NONE;			windowtype = WINDOW_MESSAGETYPE_PETSELECT;			windowno = CHAR_WINDOWTYPE_PETTRANS_SELPET;			break;		case 3:		//宠物转生	确定/取消			if( NPC_Util_GetStrFromStrWithDelim( buf,"transmsg", buf1,sizeof( buf1)) == NULL ){				print("\n ERROR transmsg !!");				return;			}			strcpy( token,"\0");			petindex = CHAR_getCharPet( toindex, select-1);			petname = CHAR_getUseName( petindex);			sprintf(token,	"\n是[%s]没错吧? \n\n %s",petname,buf1);			windowtype = WINDOW_MESSAGETYPE_MESSAGE;			buttontype = WINDOW_BUTTONTYPE_YESNO;			windowno = CHAR_WINDOWTYPE_PETTRANS_MAIN1;			break;		case 4:	//宠物转生 CHAR_TRANSMIGRATION			//转生条件判断			petindex = CHAR_getCharPet( toindex, select-1);			if( !CHAR_CHECKINDEX( petindex) ) {				return;			}#ifdef _PET_2TRANS			if( CHAR_getInt( toindex, CHAR_RIDEPET ) == select-1 /*&& CHAR_getInt( petindex, CHAR_TRANSMIGRATION ) > 0*/ ){//骑乘中的宠物不能转生				sprintf(token, "\n\n骑乘中的宠物不能转生喔!"); 				}else#endif			if( CHAR_getInt( petindex, CHAR_LV) < 80 )	{				sprintf(token, "\n\n接受转生祝福的宠物必需要等级80以上喔!"); 				CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 0);			}else if( CHAR_getInt( petindex, CHAR_PETID) == 718 #ifdef _PET_2TRANS					  || CHAR_getInt( petindex, CHAR_PETID) == 401 #endif			){				sprintf(token, "\n\n这只宠物不能转生喔!"); 				CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 0);#ifdef _PET_2TRANS			}else if( CHAR_getInt( petindex, CHAR_TRANSMIGRATION ) > 1 )	{#else			}else if( CHAR_getInt( petindex, CHAR_TRANSMIGRATION ) > 0 )	{#endif				sprintf(token, "\n\n这只宠物已经接受过祝福了喔!"); 				CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 0);				//检查宠物是否重复转生			}else	{	//	转生OK				petindex = CHAR_getCharPet( toindex, select-1);				if( NPC_PetTransManStatus( meindex, toindex, petindex) == FALSE )					return;				if( NPC_Util_GetStrFromStrWithDelim( buf,"main1msg", token,sizeof( token)) == NULL )					return;			}			buttontype = WINDOW_BUTTONTYPE_OK;			windowtype = WINDOW_MESSAGETYPE_MESSAGE;			windowno =  CHAR_WINDOWTYPE_PETTRANS_END;	//结束			break;  		case 5:		//宠物转生取消				if( NPC_Util_GetStrFromStrWithDelim( buf,"cancelmsg", token,sizeof( token)) == NULL )				return;			CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 0);			buttontype = WINDOW_BUTTONTYPE_OK;			windowtype = WINDOW_MESSAGETYPE_MESSAGE;			windowno =  CHAR_WINDOWTYPE_PETTRANS_END;	//结束			break;				default:			break;	}	lssproto_WN_send( fd, windowtype, buttontype, windowno, CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), token);}int NPC_PetTransManCheck( int meindex, int toindex, int select){	//char errchar[][56]={"errormy","erroritem","errorpet","failmsg"};	int i;	int petindex = 0;	int PetEvent_no[3]={4,69,70};	//int PetEvent_no[3]={4,4,4};	//宠物转生条件	if( CHAR_getInt( toindex, CHAR_LV ) < 80 )	{	  return 0;	}else	{		//检查任务的FLAG 是否已完成宠转需要的任务	  for(i = 0; i < 3 ;i++)	{		  if( NPC_EventCheckFlg( toindex, PetEvent_no[i] ) == FALSE)	{			return 0;		  }	  }	}	return -1;}BOOL NPC_PetTransManStatus( int meindex, int toindex, int petNo){	int petindex;	int LevelUpPoint = 0,petrank = 0;	int i,j,k,itemindex,itemID,count;	int vital1,str1,tgh1,dex1;	int vital2,str2,tgh2,dex2;	char token[128];	int total1,total2,total,petLV,ans;	int petID,enemynum,ret;	int work[4]={0,0,0,0};	struct PetTransDelItem {		int minItemID;		int maxItemID;	}DelItem[3] = { {19629,19632} , {19672,19687} , {19625,19628} };#define RAND(x,y)   ((x-1)+1+ (int)( (double)(y-(x-1))*rand()/(RAND_MAX+1.0)) )#ifdef _PET_2TRANS	int tran = CHAR_getInt ( petNo, CHAR_TRANSMIGRATION );	int tpetidx1,tpetidx2;	if( tran == 0 ){		tpetidx1 = 718;		tpetidx2 = 401;	}	else{		tpetidx1 = 401;		tpetidx2 = 401;	}#endif	for(i=0 ; i < CHAR_MAXPETHAVE ; i++)	{		petindex = CHAR_getCharPet( toindex, i);		if( petindex == -1  )			continue;		if(#ifdef _PET_2TRANS			CHAR_getInt( petindex, CHAR_PETID) == tpetidx1			|| CHAR_getInt( petindex, CHAR_PETID) == tpetidx2#else			CHAR_getInt( petindex, CHAR_PETID) == 718#endif			){			if( CHAR_getInt( petindex, CHAR_LV) == 79 ){				if( strcmp( CHAR_getChar( petindex, CHAR_OWNERCDKEY), CHAR_getChar( toindex, CHAR_CDKEY) ) ||					strcmp( CHAR_getChar( petindex, CHAR_OWNERCHARANAME), CHAR_getChar( toindex, CHAR_NAME) ))	{					continue;				}				break;			}		}	}	if(i == CHAR_MAXPETHAVE)	{		print("\n 宠物转生发生错误 !!");		return FALSE;	}	LevelUpPoint = CHAR_getInt( petindex, CHAR_ALLOCPOINT );	petrank = CHAR_getInt( petindex, CHAR_PETRANK );	vital1 = (float)(( LevelUpPoint >> 24 ) & 0xFF);	str1 = (float)(( LevelUpPoint >> 16 ) & 0xFF);	tgh1 = (float)(( LevelUpPoint >> 8 ) & 0xFF);	dex1 = (float)(( LevelUpPoint >> 0 ) & 0xFF);	total1 = ( vital1 + str1 + tgh1 + dex1 );	if( total1 > 150 )	total1 = 150;	if( total1 < 0 ) total1 = 0;	LevelUpPoint = CHAR_getInt( petNo, CHAR_ALLOCPOINT );	petrank = CHAR_getInt( petNo, CHAR_PETRANK );	petLV = CHAR_getInt( petNo, CHAR_LV);	vital2 = (float)(( LevelUpPoint >> 24 ) & 0xFF);	str2 = (float)(( LevelUpPoint >> 16 ) & 0xFF);	tgh2 = (float)(( LevelUpPoint >> 8 ) & 0xFF);	dex2 = (float)(( LevelUpPoint >> 0 ) & 0xFF);	total2 = ( vital2 + str2 + tgh2 + dex2 );#ifdef _PET_2TRANS	ans = NPC_PetTransManGetAns( total1, total2, petLV, petrank, CHAR_getInt( petNo, CHAR_TRANSMIGRATION ) );#else	ans = NPC_PetTransManGetAns( total1, total2, petLV, petrank);#endif	total = total1 + (total2*4);	work[0] = ( ans * ( vital1 + (vital2*4) ) ) / total;	work[1] = ( ans * ( str1 + (str2*4) ) ) / total;	work[2] = ( ans * ( tgh1 + (tgh2*4) ) ) / total;	work[3] = ( ans * ( dex1 + (dex2*4) ) ) / total;//取array=========================	enemynum = ENEMY_getEnemyNum();	for(i=0;i<CHAR_MAXPETHAVE;i++)	{		if( CHAR_getCharPet( toindex , i) == petNo)	{			break;		}	}	if( CHAR_MAXPETHAVE == i )	{		return FALSE;	}	petID = CHAR_getInt( petNo, CHAR_PETID);	for(k=0;k<enemynum;k++)	{		if(ENEMY_getInt(k, ENEMY_TEMPNO) == petID )			break;	}	if(k == enemynum)	{		print("\n test *-7 : petID=%d", petID);		return FALSE;	}	{		BOOL FINDs = FALSE;#ifdef _PET_2TRANS		tpetidx1 = CHAR_getInt( petindex, CHAR_PETID);#endif				//删除身上所有玛宠		for(j=0 ; j < CHAR_MAXPETHAVE ; j++){			int pet_index = CHAR_getCharPet( toindex, j);			if( pet_index == -1  )  continue;			if( #ifdef _PET_2TRANS				CHAR_getInt( pet_index, CHAR_PETID) == tpetidx1#else				CHAR_getInt( pet_index, CHAR_PETID) == 718#endif				){				if( NPC_TransmigrationDelPetDel( meindex, toindex, j) == FALSE){					return FALSE;				}else	{					FINDs = TRUE;				}			}		}		if( FINDs == FALSE )			return FALSE;	}	ret = GetNewPet( toindex , petNo, k, work);	if( ret < 0 )		return FALSE;	for(count=0;count<CHAR_MAXPETHAVE;count++)	{		if(CHAR_getCharPet(toindex,count) == ret)	{				CHAR_send_K_StatusString(toindex,count,CHAR_K_STRING_HP|CHAR_K_STRING_AI);		}	}	CHAR_setInt( petNo, CHAR_LIMITLEVEL, -1);	{					LogPetTrans( 				CHAR_getChar( toindex, CHAR_CDKEY ),				CHAR_getChar( petNo, CHAR_UNIQUECODE),				CHAR_getChar( petindex, CHAR_UNIQUECODE),//玛蕾				CHAR_getChar( toindex, CHAR_NAME),				CHAR_getInt( toindex, CHAR_FLOOR),				CHAR_getInt( toindex, CHAR_X), 				CHAR_getInt( toindex, CHAR_Y), 				CHAR_getInt( petNo, CHAR_PETID),				CHAR_getChar( petNo, CHAR_NAME),				petLV, petrank,				vital2, str2, tgh2, dex2, total2,				CHAR_getInt( petindex, CHAR_PETID),				CHAR_getChar( petindex, CHAR_NAME),				vital1, str1, tgh1, dex1, total1,				work[0], work[1], work[2], work[3], ans, CHAR_getInt ( petNo, CHAR_TRANSMIGRATION ) );	}    sprintf(token,"%s 接受了精灵王的祝福!", CHAR_getUseName( ret));	CHAR_talkToCli( toindex, -1,token,CHAR_COLORWHITE);	sprintf( token, "K%d", i );	CHAR_sendStatusString( toindex , token ); //--------------------------------------------------------------------------	//删除物品	itemindex,itemID;	for( i =0 ; i < CHAR_MAXITEMHAVE ; i++ ){		itemindex = CHAR_getItemIndex( toindex , i );		if( ITEM_CHECKINDEX(itemindex) ){			itemID = ITEM_getInt(itemindex ,ITEM_ID );			for( j = 0;j < 3;j++)	{				if( ( itemID >= DelItem[j].minItemID ) && ( itemID <= DelItem[j].maxItemID ) )	{							LogItem(								CHAR_getChar( toindex, CHAR_NAME ),								CHAR_getChar( toindex, CHAR_CDKEY ),#ifdef _add_item_log_name  // WON ADD 在item的log中增加item名称								itemindex,#else								ITEM_getInt( itemindex, ITEM_ID),#endif								"WarpManDelItem",								CHAR_getInt( toindex, CHAR_FLOOR),								CHAR_getInt( toindex, CHAR_X ), 								CHAR_getInt( toindex, CHAR_Y ),								ITEM_getChar( itemindex, ITEM_UNIQUECODE),								ITEM_getChar( itemindex, ITEM_NAME),								ITEM_getInt( itemindex, ITEM_ID)							);					CHAR_DelItem( toindex, i);				}			}//for(j)		}	}	NPC_NowEventSetFlg( toindex, 71 );	return TRUE;}// shan addvoid s_eventsetend( int charaindex, int shiftbit ){	int event_num = 6;	int point;		int array;	int shift;	array = shiftbit / 32;	shift = shiftbit % 32;			if( array>=event_num ){		//print("错误!!所设的任务旗标编号已超过范围(0~%d)。",32*event_num-1);					return;	}	point = CHAR_getInt( charaindex, CHAR_ENDEVENT+array);	point = point | (1<<shift);	CHAR_setInt( charaindex, CHAR_ENDEVENT+array, point);}#endif

⌨️ 快捷键说明

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