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

📄 item_gen.c

📁 石器时代3.0源代码 2008.08.27最新版 完全可编译开服!
💻 C
📖 第 1 页 / 共 4 页
字号:
}int ITEM_mergeItem( int charaindex, ITEM_Item *items, int num , int money, int petid, int searchtable, int petindex, int alchemist){	int i;        // shan add	int item_type = -1;	int ingnum =0;	struct item_ingindtable ingindtable[MAX_ITEM_ATOMS_SIZE];	int sortedingindtable[MAX_ITEM_ATOMS_SIZE];	int sortedingtable[MAX_ITEM_ATOMS_SIZE];	/* 矢永玄卞方月膜恳迕 */	int pet_fixatom[MAX_ITEM_ATOMS_SIZE];	int  pet_baseup[MAX_ITEM_ATOMS_SIZE];	int pet_minadd[MAX_ITEM_ATOMS_SIZE];	int  pet_maxadd[MAX_ITEM_ATOMS_SIZE];	int pet_fixuse = MAX_ITEM_ATOMS_SIZE;	int fm_fix;	int nowtime;	nowtime = time( NULL);	// 如果合成封包过於频繁...	if( nowtime - CHAR_getWorkInt( charaindex, CHAR_WORKLASTMERGETIME) < 5+(num-2) ) {		CHAR_setWorkInt( charaindex, CHAR_WORKLASTMERGETIME, nowtime);		CHAR_talkToCli( charaindex, -1 ,"合成料理过於频繁,休息一下比较好哟。", CHAR_COLORRED);		//print(" 合成频繁 ");		return items[RAND( 0, (num-1))].data[ITEM_ID];	}	CHAR_setWorkInt( charaindex, CHAR_WORKLASTMERGETIME, nowtime);	for( i = 0; i < arraysizeof( ingindtable); i ++ ) {		int		j;		for( j = 0; j < MAX_ITEM_ATOMS_SIZE; j ++ ) {			ingindtable[i].data[j] = 0.0;		}		ingindtable[i].num = 0;		ingindtable[i].index = -1;	}	for(i=0; i<num ; i++ ){		if( !items[i].data[ITEM_CANMERGEFROM]) continue;				// 如果有食物与道具掺杂则失败		if( item_type == -1 )			item_type = items[i].data[ITEM_TYPE];		else if( item_type == ITEM_DISH/*20*/ ){			if( items[i].data[ITEM_TYPE] != ITEM_DISH/*20*/ )				return -10; 		}		else if( item_type != 20){    			if( items[i].data[ITEM_TYPE] == 20 )				return -10;		}#define ADD_INGRED( nm,vl) if( items[i].string[nm].string[0] ){ int	j; int index = ITEM_getAtomIndexByName( items[i].string[nm].string ); if( index < 0 ){ print( "\nfucking atom:[%s] for item id %d", items[i].string[nm].string, items[i].data[ITEM_ID] ); continue;}for( j = 0; j < ingnum; j ++ ) {if( ingindtable[j].index == index ){break;}}if( j == ingnum ) ingnum++; ingindtable[j].data[ingindtable[j].num] = items[i].data[vl]; ingindtable[j].index = index; ingindtable[j].num++;}		ADD_INGRED( ITEM_INGNAME0, ITEM_INGVALUE0 );		ADD_INGRED( ITEM_INGNAME1, ITEM_INGVALUE1 );		ADD_INGRED( ITEM_INGNAME2, ITEM_INGVALUE2 );		ADD_INGRED( ITEM_INGNAME3, ITEM_INGVALUE3 );		ADD_INGRED( ITEM_INGNAME4, ITEM_INGVALUE4 );	}	ITEM_simplify_atoms( ingindtable, ingnum, sortedingindtable, sortedingtable, petindex, alchemist);	for(i=0;i<MAX_ITEM_ATOMS_SIZE;i++){		pet_fixatom[i] = -1;		pet_baseup[i] = pet_minadd[i] = pet_maxadd[i] = 0;	}	if( petid != -1 ){		ITEM_merge_getPetFix( petid, &pet_fixuse, pet_fixatom,							  pet_baseup, pet_minadd, pet_maxadd, petindex, &fm_fix);	}	#define	ITEM_MERGE_RANGEWIDTH_FORMIN	0.87	#define	ITEM_MERGE_RANGEWIDTH_FORMAX	1.05	for(i=0; i<ingnum; i++ ){		int j;		int tablenum=0;		if( searchtable == 0 ) {			tablenum = ITEM_getTableNum( sortedingtable[i]);		}		if( petid != -1 ){			for( j =0 ;j < pet_fixuse; j++){				if( pet_fixatom[j] == sortedingindtable[i] ){					int fixedmin = pet_minadd[j];					int fixedmax = pet_maxadd[j];					if( fixedmin < 0 ) fixedmin = 0;					if( fixedmax < 0 ) fixedmax = 0;					if( searchtable == 0 ) {//合成						sortedingtable[i] = 						ITEM_randRange( sortedingtable[i] + pet_baseup[j],							(((1/ItemRandTableForItem[tablenum].rate)*ITEM_MERGE_RANGEWIDTH_FORMIN)							* (fixedmin/(double)ITEM_RANDRANGEDOM))*ITEM_RANDRANGEDOM, 							((ItemRandTableForItem[tablenum].rate*ITEM_MERGE_RANGEWIDTH_FORMAX) 							* (fixedmax/(double)ITEM_RANDRANGEDOM))*ITEM_RANDRANGEDOM );					    					}else {//料理						sortedingtable[i] = 							ITEM_randRange( sortedingtable[i] + pet_baseup[j],							ItemRandTable[searchtable].randmin * ((double)fixedmin/ITEM_RANDRANGEDOM), 							ItemRandTable[searchtable].randmax * ((double)fixedmin/ITEM_RANDRANGEDOM)); 					}					break;				}			}			if( j == pet_fixuse ) { //如该素材成分与宠物特性不符				if( searchtable == 0 ) {					sortedingtable[i] = ITEM_randRange( sortedingtable[i],						((1/ItemRandTableForItem[tablenum].rate)*ITEM_MERGE_RANGEWIDTH_FORMIN)						* ITEM_RANDRANGEDOM,						ItemRandTableForItem[tablenum].rate * ITEM_MERGE_RANGEWIDTH_FORMAX 						* ITEM_RANDRANGEDOM);				}				else {					sortedingtable[i] = ITEM_randRange( sortedingtable[i], 						ItemRandTable[searchtable].randmin, 						ItemRandTable[searchtable].randmax); 				}			}		}else {			// shan begin			if( petindex != -1){				if( CHAR_getInt(petindex, CHAR_PETFAMILY) == 1 ){					int ownerindex = CHAR_getWorkInt(petindex, CHAR_WORKPLAYERINDEX);					if (!CHAR_CHECKINDEX(ownerindex)){						print("ownerindex err!\n");						return -1;					}#ifdef _FMVER21					if( CHAR_getInt( ownerindex, CHAR_FMLEADERFLAG) != FMMEMBER_LEADER){#else						if( CHAR_getInt( ownerindex, CHAR_FMLEADERFLAG) != 1){#endif		                							print("\n Pet Ownerindex Error");							return -1;						}						if( searchtable == 0 ){							int ownerindex = CHAR_getWorkInt(petindex, CHAR_WORKPLAYERINDEX);							int familyLevel = getFmLv(ownerindex);							for(i=0;i<ingnum;i++)								if( sortedingtable[i] > ItemRandTableForItem[familyLevel+9].maxnum ){									sortedingtable[i] = RAND(ItemRandTableForItem[familyLevel+9].minnum,																			ItemRandTableForItem[familyLevel+9].maxnum);								}						}else{							sortedingtable[i] = ITEM_randRange( sortedingtable[i], 								ItemRandTable[searchtable].randmin ,								ItemRandTable[searchtable].randmax);						}					}					else{						if( searchtable == 0 ) {							sortedingtable[i] = ITEM_randRange( sortedingtable[i], 								((1/ItemRandTableForItem[tablenum].rate)*ITEM_MERGE_RANGEWIDTH_FORMIN)								* ITEM_RANDRANGEDOM,								ItemRandTableForItem[tablenum].rate * ITEM_MERGE_RANGEWIDTH_FORMAX 								* ITEM_RANDRANGEDOM);							if(sortedingtable[i] > 905) sortedingtable[i] = 905;						}						else {							sortedingtable[i] = ITEM_randRange( sortedingtable[i], 								ItemRandTable[searchtable].randmin , 								ItemRandTable[searchtable].randmax);						}					}				}				// shan end			}		}				if( ingnum == 0 )			return -1;		{			int created;			for( i = 0 ; i < 5; i++ ) {				created = ITEM_merge_with_retry( items, num, sortedingindtable,ingnum, 					sortedingtable, searchtable, petindex);				if( created >= 0 ) {					// shan begin					if( petindex != -1){#ifdef _FMVER21#else						if( CHAR_getInt( CHAR_getWorkInt(petindex, CHAR_WORKPLAYERINDEX), CHAR_FMLEADERFLAG ) > 0 ){#endif		                							int kind_num = 0;							int syndp  = 0;							int fooddp = 0;							char buf[1024];							int ownerindex = CHAR_getWorkInt(petindex, CHAR_WORKPLAYERINDEX);							if (!CHAR_CHECKINDEX(ownerindex)){								print("ownerindex err!\n");								return -1;							}							if( searchtable == 1 ){																if( ITEMTBL_getInt( created, ITEM_INGVALUE0) != 0 ) kind_num++;								if( ITEMTBL_getInt( created, ITEM_INGVALUE1) != 0 ) kind_num++;								if( ITEMTBL_getInt( created, ITEM_INGVALUE2) != 0 ) kind_num++;								if( ITEMTBL_getInt( created, ITEM_INGVALUE3) != 0 ) kind_num++;								if( ITEMTBL_getInt( created, ITEM_INGVALUE4) != 0 ) kind_num++;																fooddp = ITEMTBL_getInt( created, ITEM_INGVALUE0) +									ITEMTBL_getInt( created, ITEM_INGVALUE1) + 									ITEMTBL_getInt( created, ITEM_INGVALUE2) +									ITEMTBL_getInt( created, ITEM_INGVALUE3) +									ITEMTBL_getInt( created, ITEM_INGVALUE4);#ifdef _PERSONAL_FAME	// Arminius: 家族个人声望							fooddp = sqrt(fooddp) * pow(2,kind_num-2) * RAND(0,6) / 200;#else		                             							fooddp = sqrt(fooddp) * pow(2,kind_num-2) * RAND(0,6) / 100;#endif							print("FoodDP: num->%d sumdp->%d", kind_num, fooddp);							sprintf(buf, "%d", fooddp);							#ifdef _PERSONAL_FAME	// Arminius 8.30: 家族个人声望							CHAR_earnFame(ownerindex, fooddp);#endif							#ifdef _FMVER21							if( CHAR_getInt( CHAR_getWorkInt(petindex, CHAR_WORKPLAYERINDEX), CHAR_FMLEADERFLAG ) > 0 && 								CHAR_getInt( CHAR_getWorkInt(petindex, CHAR_WORKPLAYERINDEX), CHAR_FMLEADERFLAG ) != FMMEMBER_APPLY )							{								// CoolFish: 2001/10/03								int fd = getfdFromCharaIndex(ownerindex);								saacproto_ACFixFMData_send(acfd,									CHAR_getChar(ownerindex, CHAR_FMNAME),									CHAR_getInt(ownerindex, CHAR_FMINDEX),									CHAR_getWorkInt(ownerindex, CHAR_WORKFMINDEXI),									FM_FIX_FMDEALFOOD, buf, "",									// CoolFish: 2001/10/03									CHAR_getWorkInt(ownerindex, CHAR_WORKFMCHARINDEX),									CONNECT_getFdid(fd));								// CHAR_getWorkInt(ownerindex, CHAR_WORKFMCHARINDEX), 0);							}#else							saacproto_ACFixFMData_send(acfd,								CHAR_getChar(ownerindex, CHAR_FMNAME),								CHAR_getInt(ownerindex, CHAR_FMINDEX),								CHAR_getWorkInt(ownerindex, CHAR_WORKFMINDEXI),								FM_FIX_FMDEALFOOD, buf, "",								CHAR_getWorkInt(ownerindex, CHAR_WORKFMCHARINDEX), 0);#endif							}else{								syndp = ITEMTBL_getInt( created, ITEM_INGVALUE0) +									ITEMTBL_getInt( created, ITEM_INGVALUE1) +									ITEMTBL_getInt( created, ITEM_INGVALUE2) +									ITEMTBL_getInt( created, ITEM_INGVALUE3) +									ITEMTBL_getInt( created, ITEM_INGVALUE4);							#ifdef _PERSONAL_FAME	// Arminius: 家族个人声望							syndp = syndp / 200;#else							syndp = syndp / 100;#endif							sprintf(buf, "%d", syndp);							#ifdef _PERSONAL_FAME	// Arminius 8.30: 家族个人声望							CHAR_earnFame(ownerindex, syndp);#endif							#ifdef _FMVER21							if( CHAR_getInt( CHAR_getWorkInt(petindex, CHAR_WORKPLAYERINDEX), CHAR_FMLEADERFLAG ) > 0 && 								CHAR_getInt( CHAR_getWorkInt(petindex, CHAR_WORKPLAYERINDEX), CHAR_FMLEADERFLAG ) != FMMEMBER_APPLY )							{								// CoolFish: 2001/10/03								int fd = getfdFromCharaIndex(ownerindex);								saacproto_ACFixFMData_send(acfd,									CHAR_getChar(ownerindex, CHAR_FMNAME),									CHAR_getInt(ownerindex, CHAR_FMINDEX),									CHAR_getWorkInt(ownerindex, CHAR_WORKFMINDEXI),									FM_FIX_FMSYNTHESIZE, buf, "",									// CoolFish: 2001/10/03									CHAR_getWorkInt(ownerindex, CHAR_WORKFMCHARINDEX),									CONNECT_getFdid(fd));							}#else							saacproto_ACFixFMData_send(acfd,								CHAR_getChar(ownerindex, CHAR_FMNAME),								CHAR_getInt(ownerindex, CHAR_FMINDEX),								CHAR_getWorkInt(ownerindex, CHAR_WORKFMINDEXI),								FM_FIX_FMSYNTHESIZE, buf, "",								CHAR_getWorkInt(ownerindex, CHAR_WORKFMCHARINDEX), 0);#endif							}#ifdef _FMVER21#else		                					}#endif		            				}				return created;			}		}		return items[RAND( 0, (num-1))].data[ITEM_ID];	}	return -3;}int ITEM_canDigest( ITEM_Item *itm ){	/* 1蜊  及笺  及  蟆互涩烂今木化中凶日1}	   公丹匹卅中卅日0 */	if( itm->string[ITEM_INGNAME0].string[0] ) return 1; else return 0;}int ITEM_merge_test(void){	int iid,i,k;	ITEM_Item itm[1];	for( k = 0 ; k < 10 ; k ++ ){		iid = 1;		for( i = 0 ; i < 20 ; i ++ ){			ITEM_makeItem( &itm[0] , iid );            			print( "%d RETURN: %d\n", i,			           // shan 				   iid = ITEM_mergeItem( -1, itm, 1 , 0, -1,0,-1,0) );		}		print( "------\n" );	}	return 0;}int ITEM_mergeItem_merge( int charaindex, int petid, char *data, int petindex, int alchemist){	BOOL	result = FALSE;	int		i;	int		ret;	int		cnt = 0;	int		itemindexs[CHAR_MAXITEMHAVE - CHAR_STARTITEMARRAY];	int		haveitemindexs[CHAR_MAXITEMHAVE - CHAR_STARTITEMARRAY];	// Nuke +2 1026: Avoid merge cheat	int             itemflag[CHAR_MAXITEMHAVE - CHAR_STARTITEMARRAY];	int             j,collision=0;		char	buff[64];		ITEM_Item	items[CHAR_MAXITEMHAVE - CHAR_STARTITEMARRAY];	// Nuke +1 1026	memset(itemflag,0,sizeof(itemflag));		{		int emptyindex = CHAR_findEmptyItemBox( charaindex );		if( emptyindex == -1 ){			CHAR_talkToCli( charaindex, -1, "合成时,最少需空一格物品栏位!", CHAR_COLORYELLOW);			return -1;		}	}		for( i = CHAR_STARTITEMARRAY; i < CHAR_MAXITEMHAVE; i ++ ) {		int		haveitemindex;		ret = getStringFromIndexWithDelim( data , "|",			i - CHAR_STARTITEMARRAY+1,			buff,  sizeof( buff ) );		if( ret == FALSE ) break;		haveitemindex = atoi( buff);		if( CHAR_CHECKITEMINDEX( charaindex, haveitemindex) ) {			int itemindex = CHAR_getItemIndex( charaindex, haveitemindex);			if( ITEM_CHECKINDEX( itemindex)) {#ifdef _ITEM_INSLAY				char *code;				if( (code = ITEM_getChar( itemindex, ITEM_TYPECODE)) == "\0" )	{					if( strcmp( code, "\0") )	{						char token[256];						snprintf( token, sizeof( token), "似乎对%s没有兴趣。",							ITEM_getChar( itemindex, ITEM_NAME));						CHAR_talkToCli( charaindex, -1, token, CHAR_COLORYELLOW);						return FALSE;

⌨️ 快捷键说明

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