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

📄 item_gen.c

📁 石器时代2.0完整版源代码.已经加入新功能. 在REDHAT9下GCC3.4编译成功.
💻 C
📖 第 1 页 / 共 4 页
字号:
static int cmprutine( double *p1, double *p2){	if( *p1 < *p2 ) return -1;	if( *p1 > *p2 ) return 1;	return 0;}/* * 嫖中及卞丐歹六月 * 忒曰袄反    互中仁勾卞卅匀凶井[ * 宁歹六月蟆卞]末□玄仄化岈屯化] * table卞梯匀凶    坌]箫仄化中仁[ */static void ITEM_simplify_atoms( struct item_ingindtable *inds, int num,								int *retinds, int *retvals, int petindex, int alchemist){	//int newinds[MAX_ITEM_ATOMS_SIZE];	//int newvals[MAX_ITEM_ATOMS_SIZE];	int i;	double oddstable[] = {		0.1,		0.25,		0.35,		0.4,		0.42,		0.44,		0.46,		0.47,		0.48,		0.49,		0.5,		0.51,		0.52,		0.53	};	for( i = 0; i < num; i ++ ) {		int datacnt = (inds + i)->num;		if( datacnt > 1 ) {			int j;			qsort( (inds + i)->data, datacnt, 					sizeof( double ), (FUNC)cmprutine);			for( j = 1; j < datacnt; j ++ ) {				int tablenum;				double rate;				tablenum = ITEM_getTableNum( (inds + i)->data[j-1]);				rate = ItemRandTableForItem[tablenum].rate / ItemRandTableForItem[0].rate;				(inds + i)->data[j] += (inds + i)->data[j-1] * oddstable[j-1] * rate;			}		}		*(retinds + i) = ( inds + i)->index;		*(retvals + i) = (int)( inds + i)->data[ datacnt-1];		// shan add begin		if( petindex != -1 ){			if (CHAR_getInt(petindex, CHAR_PETFAMILY) == 1){				if( *( retvals + i) > ITEM_ATOMIND_FM_MAX ){					*( retvals + i) = ITEM_ATOMIND_FM_MAX;				}			}else{				if( *( retvals + i) > ITEM_ATOMIND_MAX ){ 					*( retvals + i) = ITEM_ATOMIND_MAX;				}			}		}		// shan end	}}/*PET_ADD_INGRED( nm,vl1,vl2,vl3){	if( strlen( ENEMYTEMP_getChar( petarray, nm)) != 0 )	{		fixatom[ingnum] =ITEM_getAtomIndexByName( ENEMYTEMP_getChar( petarray, nm) );		if( fixatom[ingnum] < 0 )		{			print( "\nfucking atom:[%s] for pet id %d", ENEMYTEMP_getChar( petarray, nm), petid );			continue;		}				baseup[ingnum] = ENEMYTEMP_getInt( petarray, vl1);		minadd[ingnum] = ENEMYTEMP_getInt( petarray, vl2);		maxadd[ingnum] = ENEMYTEMP_getInt( petarray, vl3);				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;				}				if( CHAR_getInt( ownerindex, CHAR_FMLEADERFLAG) != FMMEMBER_LEADER)				{					print("\n Pet Ownerindex Error");					return;				}				baseup[ingnum] = PetLv[getFmLv(ownerindex)];			}		}				if( minadd[ingnum] > maxadd[ingnum] )		{			int tmp = minadd[ingnum];			minadd[ingnum] = maxadd[ingnum];maxadd[ingnum] = tmp;		}				if( CHAR_getInt(petid, CHAR_PETFAMILY) == 1 )		{			if( minadd[ingnum]<0 )				minadd[ingnum] = ITEM_FM_RANDRANGEDOM;			if( maxadd[ingnum]<0 )				maxadd[ingnum] = ITEM_FM_RANDRANGEDOM;		}		else		{			if( minadd[ingnum]<0 )				minadd[ingnum] = ITEM_RANDRANGEDOM;			if( maxadd[ingnum]<0 )				maxadd[ingnum] = ITEM_RANDRANGEDOM;		}		ingnum++;	}}*//*  矢永玄及ID井日}刭醒及膜恳涩烂毛潸曰分允[  int *fixuse : 袄瑛绊娄醒[    及    醒毛午曰}烂聒醒毛中木化井尹允  int *fixatom : 升及豳笺卞覆允月膜恳卅及井  int *baseup : 湘  袄卞凶中允月笛遥  int *minadd : 井仃遥及  凝卞凶中允月笛遥  int *maxadd : 井仃遥及    卞凶中允月笛遥   */static voidITEM_merge_getPetFix( int petid, int *fixuse, int *fixatom,					  int *baseup,					  int *minadd,					  int *maxadd,					  int petindex,					  int *fm_fix){	int		i;	int		ingnum = 0;	int		petarray;// shan begin	#define FamilyLv 11        //int             PetLv[FamilyLv];        //for(i=0; i<FamilyLv; i++){        //    if(i==0) PetLv[i] = 0;        //    else PetLv[i] = 3*pow(i,2)+10*i+20;        //}	int	PetLv[] = { 0, 33, 52, 77, 108, 145, 188, 237, 292, 353, 420, 493};	//int PetLv[] = { 0, 33, 52, 77, 108, 145, 188, 1100, 1300, 1500, 1700 };// shan end		if( petid < 0 ){		*fixuse = 0;		return;	}	petarray = ENEMYTEMP_getEnemyTempArrayFromTempNo( petid);	if( petarray == -1 ) {		print( "宠物队列错误 [%s][%d]\n", __FILE__, __LINE__);		return;	}	for( i = 0; i < 5; i ++ ) {#ifdef _FMVER21//#define PET_ADD_INGRED( nm,vl1,vl2,vl3)	if( strlen( ENEMYTEMP_getChar( petarray, nm)) != 0 ) { fixatom[ingnum] =ITEM_getAtomIndexByName( ENEMYTEMP_getChar( petarray, nm) ); if( fixatom[ingnum] < 0 ){	print( "\nfucking atom:[%s] for pet id %d", ENEMYTEMP_getChar( petarray, nm), petid ); continue;} baseup[ingnum] = ENEMYTEMP_getInt( petarray, vl1); minadd[ingnum] = ENEMYTEMP_getInt( petarray, vl2); maxadd[ingnum] = ENEMYTEMP_getInt( petarray, vl3); 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;}if( CHAR_getInt( ownerindex, CHAR_FMLEADERFLAG) != FMMEMBER_LEADER){print("\n Pet Ownerindex Error");return;}baseup[ingnum] = PetLv[getFmLv(ownerindex)];}}if( minadd[ingnum] > maxadd[ingnum] ) {	int tmp = minadd[ingnum];minadd[ingnum] = maxadd[ingnum];maxadd[ingnum] = tmp;}if( CHAR_getInt(petid, CHAR_PETFAMILY) == 1 ){if( minadd[ingnum]<0 ) minadd[ingnum] = ITEM_FM_RANDRANGEDOM;if( maxadd[ingnum]<0 ) maxadd[ingnum] = ITEM_FM_RANDRANGEDOM;}else{if( minadd[ingnum]<0 ) minadd[ingnum] = ITEM_RANDRANGEDOM;if( maxadd[ingnum]<0 ) maxadd[ingnum] = ITEM_RANDRANGEDOM;}ingnum++;}#define PET_ADD_INGRED( nm,vl1,vl2,vl3)	if( strlen( ENEMYTEMP_getChar( petarray, nm)) != 0 ) { fixatom[ingnum] =ITEM_getAtomIndexByName( ENEMYTEMP_getChar( petarray, nm) ); if( fixatom[ingnum] < 0 ){	print( "\nfucking atom:[%s] for pet id %d", ENEMYTEMP_getChar( petarray, nm), petid ); continue;} baseup[ingnum] = ENEMYTEMP_getInt( petarray, vl1); minadd[ingnum] = ITEM_RANDRANGEDOM_BASE + ENEMYTEMP_getInt( petarray, vl2); maxadd[ingnum] = ITEM_RANDRANGEDOM_BASE + ENEMYTEMP_getInt( petarray, vl3); 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;}if( CHAR_getInt( ownerindex, CHAR_FMLEADERFLAG) != FMMEMBER_LEADER){print("\n Pet Ownerindex Error");return;}baseup[ingnum] = PetLv[getFmLv(ownerindex)];}}if( minadd[ingnum] > maxadd[ingnum] ) {	int tmp = minadd[ingnum];minadd[ingnum] = maxadd[ingnum];maxadd[ingnum] = tmp;}if( CHAR_getInt(petid, CHAR_PETFAMILY) == 1 ){if( minadd[ingnum]<0 ) minadd[ingnum] = ITEM_FM_RANDRANGEDOM;if( maxadd[ingnum]<0 ) maxadd[ingnum] = ITEM_FM_RANDRANGEDOM;}else{if( minadd[ingnum]<0 ) minadd[ingnum] = ITEM_RANDRANGEDOM;if( maxadd[ingnum]<0 ) maxadd[ingnum] = ITEM_RANDRANGEDOM;}ingnum++;}#else#define PET_ADD_INGRED( nm,vl1,vl2,vl3) if( strlen( ENEMYTEMP_getChar( petarray, nm)) != 0 ) { fixatom[ingnum] =ITEM_getAtomIndexByName( ENEMYTEMP_getChar( petarray, nm) ); if( fixatom[ingnum] < 0 ){ print( "\nfucking atom:[%s] for pet id %d", ENEMYTEMP_getChar( petarray, nm), petid ); continue;} baseup[ingnum] = ENEMYTEMP_getInt( petarray, vl1); minadd[ingnum] = ENEMYTEMP_getInt( petarray, vl2);	maxadd[ingnum] = ENEMYTEMP_getInt( petarray, vl3); 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;}if( CHAR_getInt( ownerindex, CHAR_FMLEADERFLAG) != 1){print("\n Pet Ownerindex Error");return;}baseup[ingnum] = PetLv[getFmLv(ownerindex)];}}if( minadd[ingnum] > maxadd[ingnum] ) {int tmp = minadd[ingnum];minadd[ingnum] = maxadd[ingnum];maxadd[ingnum] = tmp;}if( CHAR_getInt(petid, CHAR_PETFAMILY) == 1 ){if( minadd[ingnum]<0 ) minadd[ingnum] = ITEM_FM_RANDRANGEDOM;if( maxadd[ingnum]<0 ) maxadd[ingnum] = ITEM_FM_RANDRANGEDOM;}else{if( minadd[ingnum]<0 ) minadd[ingnum] = ITEM_RANDRANGEDOM;if( maxadd[ingnum]<0 ) maxadd[ingnum] = ITEM_RANDRANGEDOM;}ingnum++;}#endif		PET_ADD_INGRED( E_T_ATOMFIXNAME1, E_T_ATOMBASEADD1, E_T_ATOMFIXMIN1, E_T_ATOMFIXMAX1);		PET_ADD_INGRED( E_T_ATOMFIXNAME2, E_T_ATOMBASEADD2, E_T_ATOMFIXMIN2, E_T_ATOMFIXMAX2);		PET_ADD_INGRED( E_T_ATOMFIXNAME3, E_T_ATOMBASEADD3, E_T_ATOMFIXMIN3, E_T_ATOMFIXMAX3);		PET_ADD_INGRED( E_T_ATOMFIXNAME4, E_T_ATOMBASEADD4, E_T_ATOMFIXMIN4, E_T_ATOMFIXMAX4);		PET_ADD_INGRED( E_T_ATOMFIXNAME5, E_T_ATOMBASEADD5, E_T_ATOMFIXMIN5, E_T_ATOMFIXMAX5);	}		if( CHAR_getInt(petindex, CHAR_PETFAMILY) == 1 ) { 		int ownerindex = CHAR_getWorkInt(petindex, CHAR_WORKPLAYERINDEX);		if( CHAR_CHECKINDEX(ownerindex) ) { 			*fm_fix = PetLv[getFmLv(ownerindex)];		}	}	*fixuse = ingnum;	return;}/*  * 公及    互]宁岳葭失奶  丞卞丐匀凶日FALSE毛忒允 */static BOOL ITEM_merge_checkitem( ITEM_Item *items, int itemsnum, int id){	int loop;	for( loop = 0; loop < itemsnum; loop ++ ) {		if( items[loop].data[ITEM_ID] == id ) break;	}	if( loop == itemsnum ) return TRUE;	return FALSE;}static int ITEM_merge_with_retry( ITEM_Item *items,int itemsnum, 								int *ingindtable, int ingnum,							  int *ingtable, int searchtable, int petindex ){	int ideal;	int	idel_num[5][5] = {	{ 0},							{ 250,0 },							{ 400,150,0},							{ 700,260,70,0},							{ 740,500,200,40,0}	};	int	endflg[5];	BOOL	first = TRUE;	int		extractcnt = 0;#define MAXMATCH 2048	int matchid[MAXMATCH];	int		i,j,k;	if( ingnum > 5 ) ideal = 5;		else			 ideal = ingnum;	memset( endflg, 0, sizeof( endflg));	while( 1 ) {		int		r = RAND( 0, 999);		int		extractnum;		int		match = 0;		if( extractcnt >= ideal ) break;		// 计算合成道具的必须材料数		for( extractnum = 0; extractnum < ideal; extractnum ++ ) {			if( r >= idel_num[ideal-1][extractnum] ) {				break;			}		}		if( endflg[extractnum] == TRUE ) continue;		endflg[extractnum] = TRUE;		extractcnt++;		extractnum = ideal - ( extractnum );		if( first ) {			for( i = 0; i < icache_num; i++ ){ //  搜寻全部ITEM				if( icache[i].use && icache[i].canmergeto) { // 如果是可合成的ITEM					icache[i].hitnum = 0;					for( j = 0; j < icache[i].inguse; j ++ ) { // 这个ITEM的材料数						for( k = 0; k < ingnum ; k ++){ // 合成的材料数							if( icache[i].ingind[j] == ingindtable[k] ) { // 材料符合								if( searchtable == 0 ) { // 道具合成的话									int tablenum = ITEM_getTableNum( ingtable[k]); // 材料等级									// shan begin									if( petindex != -1){										if( CHAR_getInt(petindex, CHAR_PETFAMILY) == 1 ){ // 如果是守护兽的话											int ownerindex = CHAR_getWorkInt(petindex, CHAR_WORKPLAYERINDEX);											int familyLevel = getFmLv(ownerindex);											if (!CHAR_CHECKINDEX(ownerindex)){												print("主人索引错误!\n");												return -1;											}#ifdef _FMVER21									         											if( CHAR_getInt( ownerindex, CHAR_FMLEADERFLAG) != FMMEMBER_LEADER){#else											if( CHAR_getInt( ownerindex, CHAR_FMLEADERFLAG) != 1){#endif									         												print("\n 宠物主人索引错误");												return -1;											}											// 需符合上下限  											if( icache[i].ingval[j] <= ingtable[k]*ItemRandTableForItem[tablenum].rate &&												icache[i].ingval[j] >= ingtable[k]*(1/ItemRandTableForItem[tablenum].rate) &&												icache[i].ingval[j] <= ItemRandTableForItem[familyLevel+9].maxnum) {												icache[i].hitnum++;												break;											}										}else{ // 非守护兽的话											float toplimit = ingtable[k]*ItemRandTableForItem[tablenum].rate;											if( toplimit > 1000) toplimit = 1000;											// 需符合上下限  											if( icache[i].ingval[j] <= toplimit &&												icache[i].ingval[j] >= ingtable[k]*(1/ItemRandTableForItem[tablenum].rate)){												icache[i].hitnum++;												break;											}										}									}									// shan end								}else { // 食物合成的话									// shan begin									if( CHAR_getInt(petindex, CHAR_PETFAMILY) == 1 ){										int ownerindex = CHAR_getWorkInt(petindex, CHAR_WORKPLAYERINDEX);										int familyLevel = getFmLv(ownerindex);										if (!CHAR_CHECKINDEX(ownerindex)){											print("主人索引错误!\n");											return -1;										}#ifdef _FMVER21										if( CHAR_getInt( ownerindex, CHAR_FMLEADERFLAG) != FMMEMBER_LEADER){#else										if( CHAR_getInt( ownerindex, CHAR_FMLEADERFLAG) != 1){#endif											print("\n 宠物主人索引错误");											return -1;										}										if( ingtable[k] > ItemRandTableForItem[familyLevel+9].maxnum / 											ItemSearchTable[searchtable].searchmax ){											ingtable[k] = ItemRandTableForItem[familyLevel+9].maxnum /												ItemSearchTable[searchtable].searchmax;										}									}else{										if( ingtable[k] > ItemRandTableForItem[9].maxnum /											ItemSearchTable[searchtable].searchmax ){											ingtable[k] = ItemRandTableForItem[9].maxnum /												ItemSearchTable[searchtable].searchmax;										}									}								  									// shan end																		if( icache[i].ingval[j] <= ingtable[k]*ItemSearchTable[searchtable].searchmax &&										icache[i].ingval[j] >= ingtable[k]*ItemSearchTable[searchtable].searchmin){										icache[i].hitnum++;										break;									}								}							}						}					}					// 符合的材料数必须相同					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;						}					}				}			}		}		if( match > 0 ) {			return matchid[ random() % match ];		}else {					}	}	return -1;	

⌨️ 快捷键说明

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