📄 item_gen.c
字号:
}int 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; }#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 ); } ITEM_simplify_atoms( ingindtable, ingnum, sortedingindtable, sortedingtable, petindex, alchemist); 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; if( searchtable == 0 ) {//合成 sortedingtable[i] = 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 ); }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 ) { //如该素材成分与宠物特性不符 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); } 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 } } 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[1024]; 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);#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 }else{ 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); #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 }#ifdef _FMVER21#else }#endif } return created; } } return items[RAND( 0, (num-1))].data[ITEM_ID]; } return -3;}int ITEM_canDigest( ITEM_Item *itm ){ /* 1蜊 及笺 及 蟆互涩烂今木化中凶日1} 公丹匹卅中卅日0 */ if( itm->string[ITEM_INGNAME0].string[0] ) return 1; else return 0;}int ITEM_merge_test(void){ int iid,i,k; ITEM_Item itm[1]; for( k = 0 ; k < 10 ; k ++ ){ iid = 1; for( i = 0 ; i < 20 ; i ++ ){ ITEM_makeItem( &itm[0] , iid ); print( "%d RETURN: %d\n", i, // shan iid = ITEM_mergeItem( -1, itm, 1 , 0, -1,0,-1,0) ); } print( "------\n" ); } return 0;}int ITEM_mergeItem_merge( int charaindex, int petid, char *data, int petindex, int alchemist){ BOOL result = FALSE; int i; int ret; int cnt = 0; int itemindexs[CHAR_MAXITEMHAVE - CHAR_STARTITEMARRAY]; int haveitemindexs[CHAR_MAXITEMHAVE - CHAR_STARTITEMARRAY]; // Nuke +2 1026: Avoid merge cheat int itemflag[CHAR_MAXITEMHAVE - CHAR_STARTITEMARRAY]; int j,collision=0; char buff[64]; ITEM_Item items[CHAR_MAXITEMHAVE - CHAR_STARTITEMARRAY]; // Nuke +1 1026 memset(itemflag,0,sizeof(itemflag)); { int emptyindex = CHAR_findEmptyItemBox( charaindex ); if( emptyindex == -1 ){ CHAR_talkToCli( charaindex, -1, "合成时,最少需空一格物品栏位!", CHAR_COLORYELLOW); return -1; } } for( i = CHAR_STARTITEMARRAY; i < CHAR_MAXITEMHAVE; i ++ ) { int haveitemindex; ret = getStringFromIndexWithDelim( data , "|", i - CHAR_STARTITEMARRAY+1, buff, sizeof( buff ) ); if( ret == FALSE ) break; haveitemindex = atoi( buff); if( CHAR_CHECKITEMINDEX( charaindex, haveitemindex) ) { int itemindex = CHAR_getItemIndex( charaindex, haveitemindex); if( ITEM_CHECKINDEX( itemindex)) {#ifdef _ITEM_INSLAY char *code; if( (code = ITEM_getChar( itemindex, ITEM_TYPECODE)) == "\0" ) { if( strcmp( code, "\0") ) { char token[256]; snprintf( token, sizeof( token), "似乎对%s没有兴趣。", ITEM_getChar( itemindex, ITEM_NAME)); CHAR_talkToCli( charaindex, -1, token, CHAR_COLORYELLOW); return FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -