?? item_gen.c
字號:
} } // 符合的材料數必須相同 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_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_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 + -