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

📄 item_gen.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
📖 第 1 页 / 共 4 页
字号:
						}					}					// 符合的材料数必须相同					if( icache[i].hitnum == icache[i].inguse &&	icache[i].hitnum == extractnum ){						if( ITEM_merge_checkitem(items,itemsnum,i)) {							matchid[match++] = i;						}					}				}			}			first = FALSE;		}else {			for( i = 0; i < icache_num; i++ ){				if( icache[i].use && icache[i].canmergeto) {					if( icache[i].hitnum == icache[i].inguse &&	icache[i].hitnum == extractnum ){						if( ITEM_merge_checkitem(items,itemsnum,i)) {							matchid[match++] = i;						}					}				}			}		}#ifdef _MERGE_LOG		print("\n 必须符合的材料数(乱数):%d \n", extractnum);		{			int j;			for( j =0; j <ingnum; j++) {				int tablenum = ITEM_getTableNum( ingtable[j]);				print(" [%s 下限:%d 上限:%d]",						item_atoms[ ingindtable[j]].name,						(int)(ingtable[j]*(1/ItemRandTableForItem[tablenum].rate)),						(int)(ingtable[j]*ItemRandTableForItem[tablenum].rate) );			}		}		if( match > 0 ) {			int i;			print("\n matchid[%d]={",match);			for( i=0; i<match; i++)	{				print(" %d,", matchid[i]);							}			print("} ");						}		else {			print("\n 失败重试... ");		}#endif		if( match > 0 ) {			return matchid[ random() % match ];		}else {					}	}	return -1;	}#ifdef _NEW_MANOR_LAWextern  struct  FM_POINTLIST fmpointlist;#endifint 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;		}#ifdef _MERGE_LOG		print( "\nmergeItem:name:[%s] \t0:[%s][%d] 1:[%s][%d] "			"2:[%s][%d] 3:[%s][%d] 4:[%s][%d]",			items[i].string[ITEM_NAME].string,			items[i].string[ITEM_INGNAME0].string,			items[i].data[ITEM_INGVALUE0],			items[i].string[ITEM_INGNAME1].string,			items[i].data[ITEM_INGVALUE1],			items[i].string[ITEM_INGNAME2].string,			items[i].data[ITEM_INGVALUE2],			items[i].string[ITEM_INGNAME3].string,			items[i].data[ITEM_INGVALUE3],			items[i].string[ITEM_INGNAME4].string,			items[i].data[ITEM_INGVALUE4]			);#endif		#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 );	}#ifdef _MERGE_LOG	{		int k,m;		//char mergech[][256] = {"石","木","骨","牙","皮","线","贝壳","壳","材9","材10","材11","材12","材13","材14","材15","材16"};		for( k=0;k<5;k++)	{			print("\n merger(材料): %d.[ %s,", k, /*mergech[ ingindtable[k].index]*/item_atoms[ ingindtable[k].index].name );			for(m=0;m<5;m++)	{				print(" %f,", ingindtable[k].data[m]);			}			print(" ...");		}	}	memset( sortedingtable, 0, sizeof( sortedingtable));	memset( sortedingindtable, 0, sizeof( sortedingindtable));#endif	ITEM_simplify_atoms( ingindtable, ingnum, sortedingindtable, sortedingtable, petindex, alchemist);#ifdef _MERGE_LOG	{		int k;		//char mergech[][256] = {"石","木","骨","牙","皮","线","贝壳","壳","材9","材10","材11","材12","材13","材14","材15","材16"};		print("\n 重复材料混合後...");		for( k=0;k<5;k++)	{			print("\n merger(材料): %d.[ %s, %d]",				k, /*mergech[ sortedingindtable[k]]*/item_atoms[ sortedingindtable[k]].name, sortedingtable[k]);		}	}#endif	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;#ifdef _MERGE_LOG					{						//char mergech[][256] = {"石","木","骨","牙","皮","线","贝壳","壳","材9","材10","材11","材12","材13","材14","材15","材16"};						print("\n merger#(拿手材料): 层级:%d.[i:%d,j:%d] , [ %s, %d]",							tablenum, i, j,							/*mergech[ sortedingindtable[i]]*/item_atoms[ sortedingindtable[i]].name, sortedingtable[i]							);					}#endif					if( searchtable == 0 ) {//合成						sortedingtable[i] = #ifdef _MERGE_NEW_8	// 1st							ITEM_randRange( sortedingtable[i],							(((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						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 );					    #endif					}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 ) { //如该素材成分与宠物特性不符#ifdef _MERGE_LOG				{					//char mergech[][256] = {"石","木","骨","牙","皮","线","贝壳","壳","材9","材10","材11","材12","材13","材14","材15","材16"};					print("\n merger#(不拿手材料): 层级:%d.[i:%d,j:%d] , [ %s, %d] 家族修正=%d",						tablenum, i, j,						/*mergech[ sortedingindtable[i]]*/item_atoms[ sortedingindtable[i]].name, sortedingtable[i], fm_fix						);				}#endif				if( searchtable == 0 ) {#ifdef _MERGE_NEW_8	// 1st					sortedingtable[i] = ITEM_randRange( sortedingtable[i], 						((1/ItemRandTableForItem[tablenum].rate)*ITEM_MERGE_RANGEWIDTH_FORMIN)						* ITEM_RANDRANGEDOM *0.8 + fm_fix,						ItemRandTableForItem[tablenum].rate * ITEM_MERGE_RANGEWIDTH_FORMAX 						* ITEM_RANDRANGEDOM *0.8 + fm_fix );#else					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);#endif				}				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			}		}#ifdef _MERGE_LOG		{			int k;			//char mergech[][256] = {"石","木","骨","牙","皮","线","贝壳","壳","材9","材10","材11","材12","材13","材14","材15","材16"};			for( k=0;k<5;k++)	{				print("\n merger(宠物能力配上)(材料): %d.[ %s, %d]",					k, /*mergech[ sortedingindtable[k]]*/item_atoms[ sortedingindtable[k]].name, sortedingtable[k]);			}		}#endif				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[64];							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);#ifndef _NEW_MANOR_LAW	#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#endif							}else{								int ownerindex = CHAR_getWorkInt(petindex, CHAR_WORKPLAYERINDEX);								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);#ifndef _NEW_MANOR_LAW									#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#endif							}#ifdef _FMVER21#else		                					}#endif		            				}				// shan end			        #ifdef _MERGE_LOG				print( "\nANDY merged: item[%s] atom[%s]:[%d] [%s]:[%d] [%s]:[%d] [%s]:[%d] [%s]:[%d]",					ITEMTBL_getChar( created, ITEM_NAME),					ITEMTBL_getChar( created, ITEM_INGNAME0),					ITEMTBL_getInt( created, ITEM_INGVALUE0),					ITEMTBL_getChar( created, ITEM_INGNAME1),					ITEMTBL_getInt( created, ITEM_INGVALUE1),					ITEMTBL_getChar( created, ITEM_INGNAME2),					ITEMTBL_getInt( created, ITEM_INGVALUE2),					ITEMTBL_getChar( created, ITEM_INGNAME3),					ITEMTBL_getInt( created, ITEM_INGVALUE3),					ITEMTBL_getChar( created, ITEM_INGNAME4),					ITEMTBL_getInt( created, ITEM_INGVALUE4) );#endif					/*					#ifdef _ACTION_BULLSCR					if( CHAR_CHECKINDEX( charaindex) && (CHAR_getInt( charaindex, CHAR_ABULLSTART) == 10) ){					int cTableLevel=0, adScore=0;					char buf1[256];					int Myscore = CHAR_getInt( charaindex, CHAR_ABULLSCORE);					memset( buf1, 0, sizeof( buf1));					cTableLevel = ITEM_getTableNum( ITEMTBL_getInt( created, ITEM_INGVALUE0));					if( cTableLevel >= 15 ) adScore = 4;					else if( cTableLevel >= 6 ) adScore = 1;					else adScore = 0;					if( adScore > 0 ){

⌨️ 快捷键说明

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