📄 item.c
字号:
{ int i; memset( itm, 0 , sizeof( ITEM_Item ));#ifdef _SIMPLIFY_ITEMSTRING for(i = 0; i < arraysizeof( ITEM_setintdata) ; i ++ ){ itm->data[ITEM_setintdata[i].table] = ITEM_setintdata[i].defaults; } for(i = 0; i < arraysizeof( ITEM_setchardata) ; i ++ ){ strcpysafe( itm->string[ITEM_setchardata[i].table].string, sizeof( itm->string[ITEM_setchardata[i].table].string), ITEM_setchardata[i].defaults); }#else for(i=0;i<ITEM_DATAINTNUM;i++) itm->data[i] = ITEM_setintdata[i].defaults; for(i=0;i<ITEM_DATACHARNUM;i++) strcpysafe(itm->string[i].string, sizeof(itm->string[i].string), ITEM_setchardata[i].defaults);#endif strcpysafe( itm->string[ITEM_WATCHFUNC].string, sizeof(itm->string[ITEM_WATCHFUNC].string), "ITEM_DeleteTimeWatched" ); for(i=0;i<ITEM_WORKDATAINTNUM;i++){ itm->workint[i] = -1; }}#ifdef _SIMPLIFY_ITEMSTRINGvoid ITEM_getDefaultItemData( int itemID, ITEM_Item* itm){ int i;// memset( itm, 0 , sizeof( ITEM_Item )); for(i=0;i<ITEM_DATAINTNUM;i++){ itm->data[i] = ITEMTBL_getInt( itemID, i); } for(i=0;i<ITEM_DATACHARNUM;i++){ strcpysafe( itm->string[i].string, sizeof( itm->string[i].string), ITEMTBL_getChar( itemID, i) ); } for(i=0;i<ITEM_WORKDATAINTNUM;i++){ itm->workint[i] = -1; } strcpysafe( itm->string[ITEM_WATCHFUNC].string, sizeof( itm->string[ITEM_WATCHFUNC].string), "ITEM_DeleteTimeWatched" );}#endifstatic int ITEM_getRandomValue( char* string,int* randomwidth, int num ){ int minvalue; int maxvalue; char token[64]; int ret;#if 1 *randomwidth = 0; ret = getStringFromIndexWithDelim( string,",",num -1,token, sizeof( token)); if( ret == FALSE ) { return 0; } minvalue = atoi( token); ret = getStringFromIndexWithDelim( string,",",num ,token, sizeof( token)); if( ret == FALSE ) { return minvalue; } maxvalue = atoi( token); *randomwidth = ABS( maxvalue - minvalue); return min( minvalue, maxvalue);#else minvalue = atoi( string ); startmax = index( string,',' ); if( startmax != NULL ){ maxvalue = atoi(startmax+1); *randomwidth = ABS(maxvalue - minvalue); return min(minvalue,maxvalue); } *randomwidth = 0; return minvalue;#endif}static int ITEM_isstring1or0( char* string,int* randomwidth, int num ){ char token[64]; int ret; ret = getStringFromIndexWithDelim( string,",",num -1,token, sizeof( token)); if( ret == FALSE ) { return FALSE; } return isstring1or0( token);}static char* ITEM_checkString( char* string ){#define ITEM_STRINGLEN 64 if( strlen(string) >= ITEM_STRINGLEN ) print( "Over %d:[%s]\n",ITEM_STRINGLEN ,string ); return string;#undef ITEM_STRINGLEN}BOOL ITEM_readItemConfFile( char* filename ){ FILE* f; char line[512]; char token[64]; int linenum=0; int itemnum=0; int i; int maxid=0, itemid; int ret; int intdata[ITEM_DATAINTNUM]; f = fopen(filename,"r"); if( f == NULL ){ print( "不能打开文件\n"); return FALSE; }#ifdef _ITEMSET2_ITEM#define ITEM_ID_TOKEN_INDEX 17#else#ifdef _ITEM_MAXUSERNUM#define ITEM_ID_TOKEN_INDEX 15#endif#endif while( fgets( line, sizeof( line ), f ) ){ linenum ++; if( line[0] == '#' )continue; /* comment */ if( line[0] == '\n' )continue; /* none */ chomp( line ); ret = getStringFromIndexWithDelim( line, ",", ITEM_ID_TOKEN_INDEX, token, sizeof(token)); if( ret == FALSE ){ fprint("文件秩序错误:%s 第:%d行\n",filename,linenum); continue; } itemid = atoi( token); if( itemid > maxid ){ maxid = itemid; } itemnum ++; } if( maxid <=0 ) { print( "最大ID错误\n"); fclose(f); return FALSE; } if( fseek( f, 0, SEEK_SET ) == -1 ){ fprint( "搜索错误\n" ); fclose(f); return FALSE; } print( "物品最大ID %d...", maxid); ITEM_tblen = itemnum + 1; ITEM_idxlen = maxid + 1; if( ITEM_tbl != NULL ) ITEM_endExistItemsArray( ITEM_tbl); ITEM_tbl = allocateMemory( sizeof(ITEM_table) * ITEM_tblen ); if( ITEM_idx != NULL ) ITEM_endExistItemsArray( ITEM_idx); ITEM_idx = allocateMemory( sizeof(ITEM_index) * ITEM_idxlen ); if( ITEM_tbl == NULL ){ fprint( "无法分配内存 %d\n" , sizeof(ITEM_table)*ITEM_tblen ); fclose( f ); return FALSE; } if( ITEM_idx == NULL ){ fprint( "无法分配内存 %d\n" , sizeof(ITEM_index)*ITEM_idxlen ); fclose( f ); return FALSE; } print("ITEM_tbl分配 %4.2f MB 空间...", sizeof(ITEM_table) * ITEM_tblen /1024.0/1024.0); print("ITEM_idx分配 %4.2f MB 空间...", sizeof(ITEM_index) * ITEM_idxlen /1024.0/1024.0); for( i = 0 ; i < ITEM_idxlen ; i ++ ) { ITEM_idx[i].use = FALSE; } linenum = 0; itemnum = 0; while( fgets( line, sizeof( line ), f ) ){ linenum ++; if( line[0] == '#' )continue; /* comment */ if( line[0] == '\n' )continue; /* none */ chomp( line ); replaceString( line, '\t' , ' ' ); itemnum ++;{ char buf[256]; for( i = 0; i < strlen( line); i ++) { if( line[i] != ' ' ) { break; } strcpy( buf, &line[i]); } if( i != 0 ) { strcpy( line, buf); }}{ char token[256]; int ret; int readpos = 1; BOOL dataerror = FALSE; ITEM_Item itm; ITEM_getDefaultItemSetting(&itm); for( i=0 ; i< ITEM_DATAINTNUM ; i++ ) { intdata[i] = 0; } itemid = 0; for( i = 0 ; i < arraysizeof( ITEM_itemconfentries) ; i ++ ){ ret = getStringFromIndexWithDelim( line,",",readpos,token, sizeof(token)); if( ret == FALSE ) {#ifdef _Item_ReLifeAct { char buf[256]; char buf1[256]; sscanf( line,"%s,%s", buf, buf1); print("[ITEM data Error] tbl=%d:%s line:%d[%s]\n", readpos, ITEM_itemconfentries[i].entryname, linenum, line); }#else fprint("Syntax Error tki:%d file:%s line:%d[%s]\n", i , filename,linenum,line);#endif dataerror = TRUE; break; } if( readpos == ITEM_ID_TOKEN_INDEX ) itemid = atoi( token); readpos ++; if( strlen( token ) != 0 ) { switch(ITEM_itemconfentries[i].type){ case ITEM_INTENTRY: itm.data[ITEM_itemconfentries[i].index] = atoi( token ); break; case ITEM_CHARENTRY: strcpysafe( itm.string[ITEM_itemconfentries[i].index].string, sizeof(itm.string[ITEM_itemconfentries[i].index].string), token); break; case ITEM_INTFUNC: { int (*intfunction)(char*,int*, int ); intfunction = ITEM_itemconfentries[i].func; itm.data[ITEM_itemconfentries[i].index] = intfunction(line, &intdata[ITEM_itemconfentries[i].index],readpos); if( intfunction == ITEM_getRandomValue) readpos ++; } break; case ITEM_CHARFUNC: { char* (*charfunction)(char* ); charfunction = ITEM_itemconfentries[i].func; strcpysafe( itm.string[ITEM_itemconfentries[i].index].string, sizeof(itm.string[ITEM_itemconfentries[i].index].string), charfunction( token)); break; } default: break; } } } if( !dataerror) { if( itemid >= ITEM_idxlen ){ print( "ITEM_tbl full:%d err !!\n" , itemid ); }else if( ITEM_idx[itemid].use == TRUE ) { fprint( "Duplicate Itemid %d.ignore\n" , itemid ); }else{ if( itm.string[ITEM_SECRETNAME].string[0] == '\0') { fprint( "ERROR: ID %d item doesn't have secretname\n" ,itemid ); memcpy( &itm.string[ITEM_SECRETNAME].string, &itm.string[ITEM_NAME].string, sizeof(itm.string[ITEM_NAME].string)); }{ int attacknum_min, attacknum_max; attacknum_min = itm.data[ITEM_ATTACKNUM_MIN]; attacknum_max = itm.data[ITEM_ATTACKNUM_MAX]; if( attacknum_min == 0 ) attacknum_min = attacknum_max; itm.data[ITEM_ATTACKNUM_MIN] = min( attacknum_min, attacknum_max); itm.data[ITEM_ATTACKNUM_MAX] = max( attacknum_min, attacknum_max);} memcpy( &ITEM_tbl[itemnum].itm, &itm, sizeof(ITEM_Item)); ITEM_idx[itemid].use = TRUE; ITEM_idx[itemid].index = itemnum; for( i=0 ; i< ITEM_DATAINTNUM ; i++ ){ ITEM_tbl[itemnum].randomdata[i] = intdata[i]; } } }} } fclose(f); return TRUE;}CHAR_EquipPlace ITEM_getEquipPlace( int charaindex, int itmid ){ ITEM_CATEGORY cat; cat = ITEM_getInt( itmid , ITEM_TYPE ); switch( cat ){ case ITEM_FIST: case ITEM_SPEAR: case ITEM_AXE: case ITEM_CLUB:// case ITEM_SHIELD: case ITEM_BOOMERANG: case ITEM_BREAKTHROW: case ITEM_BOUNDTHROW: return CHAR_ARM; break; case ITEM_HELM: return CHAR_HEAD; break; case ITEM_ARMOUR: return CHAR_BODY; break; case ITEM_BRACELET: case ITEM_MUSIC: case ITEM_NECKLACE: case ITEM_RING: case ITEM_BELT: case ITEM_EARRING: case ITEM_NOSERING: case ITEM_AMULET: return CHAR_DECORATION1; break; case ITEM_BOW: return CHAR_ARM; break; default: break; } return -1;}#define ITEMSTRINGBUFSIZ 512static char ITEM_itemStatusStringBuffer[ITEMSTRINGBUFSIZ];char* ITEM_makeItemStatusString( int haveitemindex, int itemindex ){ char escapename[256]; char escapeeffectstring[256]; char paramshow[256]; int leaklevel; int itemcolor = 0; int flg; if( !ITEM_CHECKINDEX(itemindex) ) return "\0"; leaklevel = ITEM_getInt(itemindex,ITEM_LEAKLEVEL); //if( leaklevel >= 1 ) // Nuke debug { makeEscapeString( ITEM_getChar(itemindex, ITEM_SECRETNAME), escapename, sizeof(escapename) ); paramshow[0] = '\0'; } makeEscapeString( ITEM_getChar( itemindex, ITEM_EFFECTSTRING), escapeeffectstring, sizeof(escapeeffectstring)); itemcolor = CHAR_COLORWHITE; if( strlen( ITEM_getChar( itemindex, ITEM_CDKEY)) != 0 ) { itemcolor = CHAR_COLORGREEN; }else { if( ITEM_getInt( itemindex, ITEM_MERGEFLG) ) { itemcolor = CHAR_COLORYELLOW; } } flg = 0; if( ITEM_getInt( itemindex, ITEM_CANPETMAIL)) { flg |= 1 << 0; } if( ITEM_getInt( itemindex, ITEM_CANMERGEFROM)) { flg |= 1 << 1; } if( ITEM_getInt( itemindex, ITEM_TYPE) == ITEM_DISH ) { flg |= 1 << 2; }#ifdef _ITEM_INSLAY if( ITEM_getInt( itemindex, ITEM_TYPE) == ITEM_METAL ) { flg |= 1 << 3; }else if( ITEM_getInt( itemindex, ITEM_TYPE) == ITEM_JEWEL ) { flg |= 1 << 4; }#endif#ifdef _PETSKILL_FIXITEM if( ITEM_getInt( itemindex, ITEM_DAMAGECRUSHE) != ITEM_getInt( itemindex, ITEM_MAXDAMAGECRUSHE) ){ flg |= 1 << 5; }#endif if( haveitemindex == -1 ) { snprintf(ITEM_itemStatusStringBuffer, sizeof( ITEM_itemStatusStringBuffer), "%s|%s|%d|%s|%d|%d|%d|%d|%d", escapename, paramshow, itemcolor, escapeeffectstring , ITEM_getInt( itemindex, ITEM_BASEIMAGENUMBER), ITEM_getInt( itemindex, ITEM_ABLEUSEFIELD), ITEM_getInt( itemindex, ITEM_TARGET), ITEM_getInt( itemindex, ITEM_LEVEL), flg ); }else { snprintf(ITEM_itemStatusStringBuffer, sizeof( ITEM_itemStatusStringBuffer), "%d|%s|%s|%d|%s|%d|%d|%d|%d|%d", haveitemindex, escapename, paramshow, itemcolor, escapeeffectstring , ITEM_getInt( itemindex, ITEM_BASEIMAGENUMBER), ITEM_getInt( itemindex, ITEM_ABLEUSEFIELD), ITEM_getInt( itemindex, ITEM_TARGET), ITEM_getInt( itemindex, ITEM_LEVEL), flg ); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -