?? item_gen.c
字號:
//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 };#if 0 double oddstable[] = { 0.08, 0.224, 0.315, 0.37, 0.395, 0.405, 0.415, 0.42, 0.425, 0.43, 0.435, 0.44, 0.445, 0.45 }; double oddstable[] = { 0.05, 0.175, 0.247, 0.305, 0.342, 0.361, 0.37, 0.375, 0.379, 0.382, 0.387, 0.39, 0.393, 0.396 };#endif 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 ){#ifdef _MERGE_NEW_8 /*if( alchemist ) { // 使用守護獸精 時無上限 // 改:皆有上限 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; } } } else */ { // 非精 時有上限 if( *( retvals + i) > ITEM_ATOMIND_MAX ){ *( retvals + i) = ITEM_ATOMIND_MAX; } }#else 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; } }#endif } // 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++; }}*/#ifdef _MERGE_NEW_8int PET_ADD_INGRED( int nm, int vl1, int vl2, int vl3, int petindex, int petarray, int petid, int ingnum, int *baseup, int *minadd, int *maxadd, int *fixatom ){ // 家族修正 守護獸時用 int PetLv[] = { 0, 77, 108, 145, 188, 237, 292, 353, 420, 493, 572}; // 家族(個人)修正 非守護獸時用 //int PetLvPersonal[] = { 0, 77, 108, 145, 188, 237, 292, 353, 420, 493, 572}; 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 ); return 1; //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) { int ownerindex = CHAR_getWorkInt(petindex, CHAR_WORKPLAYERINDEX); if (!CHAR_CHECKINDEX(ownerindex)) { print("寵物主人錯誤\n"); return 2; // just return; } if( CHAR_getInt(petindex, CHAR_PETFAMILY) == 1 ) { if( CHAR_getInt( ownerindex, CHAR_FMLEADERFLAG) != FMMEMBER_LEADER) { print("寵物主人錯誤\n"); CHAR_talkToCli( ownerindex, -1, "非族長不能用守護獸加工??!", CHAR_COLORYELLOW); return 2; // just return; } baseup[ingnum] = PetLv[getFmLv(ownerindex)]; } else { // 8.0新增 baseup[ingnum] = PetLv[getFameLv(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/* 矢永玄及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; //}#ifdef _MERGE_NEW_8 // 1st //int PetLv[] = { 0, 145, 188, 237, 292, 353, 420, 493, 572, 657, 748}; int PetLv[] = { 0, 77, 108, 145, 188, 237, 292, 353, 420, 493, 572};#else int PetLv[] = { 0, 33, 52, 77, 108, 145, 188, 237, 292, 353, 420, 493};#endif //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; }#ifdef _MERGE_LOG { int ownerindex = CHAR_getWorkInt(petindex, CHAR_WORKPLAYERINDEX); if( CHAR_getInt(petindex, CHAR_PETFAMILY) == 1 ) { print("\n 使用守護獸 家族聲望:%d 家族等級:%d 家族修正:%d ", CHAR_getWorkInt(ownerindex, CHAR_WORKFMDP), getFmLv(ownerindex), PetLv[getFmLv(ownerindex)]); } else { print("\n 非使用守護獸 個人聲望:%d 個人等級:%d 個人修正:%d ", CHAR_getInt(ownerindex, CHAR_FAME), getFameLv(ownerindex), PetLv[getFameLv(ownerindex)]); } }#endif for( i = 0; i < 5; i ++ ) { int ret;#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#ifdef _MERGE_NEW_8#undef PET_ADD_INGRED ret = PET_ADD_INGRED( E_T_ATOMFIXNAME1, E_T_ATOMBASEADD1, E_T_ATOMFIXMIN1, E_T_ATOMFIXMAX1, petindex, petarray, petid, ingnum, baseup, minadd, maxadd, fixatom ); if( ret == 1 ) continue; else if( ret == 2 ) return; ret = PET_ADD_INGRED( E_T_ATOMFIXNAME2, E_T_ATOMBASEADD2, E_T_ATOMFIXMIN2, E_T_ATOMFIXMAX2, petindex, petarray, petid, ingnum, baseup, minadd, maxadd, fixatom ); if( ret == 1 ) continue; else if( ret == 2 ) return; ret = PET_ADD_INGRED( E_T_ATOMFIXNAME3, E_T_ATOMBASEADD3, E_T_ATOMFIXMIN3, E_T_ATOMFIXMAX3, petindex, petarray, petid, ingnum, baseup, minadd, maxadd, fixatom ); if( ret == 1 ) continue; else if( ret == 2 ) return; ret = PET_ADD_INGRED( E_T_ATOMFIXNAME4, E_T_ATOMBASEADD4, E_T_ATOMFIXMIN4, E_T_ATOMFIXMAX4, petindex, petarray, petid, ingnum, baseup, minadd, maxadd, fixatom ); if( ret == 1 ) continue; else if( ret == 2 ) return; ret = PET_ADD_INGRED( E_T_ATOMFIXNAME5, E_T_ATOMBASEADD5, E_T_ATOMFIXMIN5, E_T_ATOMFIXMAX5, petindex, petarray, petid, ingnum, baseup, minadd, maxadd, fixatom ); if( ret == 1 ) continue; else if( ret == 2 ) return;#else 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);#endif#ifdef _MERGE_LOG print("\n %d.[ me:%s, min%d, b:%d, max:%d]", i, ENEMYTEMP_getChar( petarray, E_T_ATOMFIXNAME1+i), minadd[i], baseup[i], maxadd[i]);#endif } 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; } } }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -