📄 item_gen.c
字号:
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 + -