chuyiwen_gmsv/item/item.c
2017-01-14 00:37:03 +09:00

2403 lines
68 KiB
C

#include "version.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <errno.h>
#include "common.h"
#include "char.h"
#include "char_data.h"
#include "battle.h"
#include "item.h"
#include "buf.h"
#include "function.h"
#include "magic_base.h"
#ifdef _PROFESSION_SKILL // WON ADD 人物职业技能
#include "profession_skill.h"
#endif
#ifdef _ALLBLUES_LUA_1_2
ITEM_LuaFunc ITEM_luaFunc;
#endif
static int ITEM_tblen = 0;
static ITEM_exists* ITEM_item;
static int ITEM_itemnum;
static int ITEM_UseItemnum=0;
static char* ITEM_checkString( char* string );
static int ITEM_getRandomValue( char* string,int* randomwidth, int num );
static int ITEM_isstring1or0( char* string,int* randomwidth, int num );
#ifdef _SIMPLIFY_ITEMSTRING
typedef struct ITEM_tag_intDataSetting
{
char* dumpchar;
int defaults;
int table;
}ITEM_intDataSetting;
typedef struct ITEM_tag_charDataSetting
{
char* dumpchar;
char* defaults;
int table;
}ITEM_charDataSetting;
static ITEM_intDataSetting ITEM_setintdata[]={
{"id", 0, ITEM_ID },
{"bi", 0, ITEM_BASEIMAGENUMBER },
{"cs", 0, ITEM_COST },
{"ep", ITEM_OTHER, ITEM_TYPE },
{"ft", 0, ITEM_ABLEUSEFIELD },
{"tg", 0, ITEM_TARGET },
{"lv", 0, ITEM_LEVEL },
#ifdef _ITEM_MAXUSERNUM
{"dib", -1, ITEM_DAMAGEBREAK },
#endif
#ifdef _ITEMSET4_TXT
{"upin", 1, ITEM_USEPILENUMS },
{"canpile", 0, ITEM_CANBEPILE },
{"nestr", 0, ITEM_NEEDSTR },
{"nedex", 0, ITEM_NEEDDEX },
{"netra", 0, ITEM_NEEDTRANS },
{"neprof", 0, ITEM_NEEDPROFESSION },
#endif
#ifdef _TAKE_ITEMDAMAGE
{"dmce", 0, ITEM_DAMAGECRUSHE },
{"mdmce", 0, ITEM_MAXDAMAGECRUSHE },
#endif
#ifdef _ADD_DEAMGEDEFC
{"otdmag", 0, ITEM_OTHERDAMAGE },
{"otdefc", 0, ITEM_OTHERDEFC },
#endif
#ifdef _SUIT_ITEM
{"nsuit", 0, ITEM_SUITCODE },
#endif
{"ann", 0, ITEM_ATTACKNUM_MIN },
{"anx", 0, ITEM_ATTACKNUM_MAX },
{"ma", 0, ITEM_MODIFYATTACK },
{"md", 0, ITEM_MODIFYDEFENCE },
{"mh", 0, ITEM_MODIFYQUICK}, //ITEM_MODIFYHP }, ITEM_MODIFYQUICK
{"mm", 0, ITEM_MODIFYHP}, //ITEM_MODIFYMP }, ITEM_MODIFYHP
{"mq", 0, ITEM_MODIFYMP}, //ITEM_MODIFYQUICK }, ITEM_MODIFYMP
{"ml", 0, ITEM_MODIFYLUCK },
{"mc", 0, ITEM_MODIFYCHARM },
{"mv", 0, ITEM_MODIFYAVOID },
{"mat", 0, ITEM_MODIFYATTRIB },
{"mav", 0, ITEM_MODIFYATTRIBVALUE },
{"mid", -1, ITEM_MAGICID },
{"mpr", 0, ITEM_MAGICPROB },
{"mu", 0, ITEM_MAGICUSEMP },
#ifdef _ITEMSET5_TXT
{"arr", 0, ITEM_MODIFYARRANGE },
{"seqce", 0, ITEM_MODIFYSEQUENCE },
{"iapi", 0, ITEM_ATTACHPILE },
{"hirt", 0, ITEM_HITRIGHT },
#endif
#ifdef _ITEMSET6_TXT
{"neguard", 0, ITEM_NEGLECTGUARD},
#endif
{"mrf", 0, ITEM_MERGEFLG},
{"itime", 0, ITEM_TIME},
#ifdef _ITEM_COLOER
{"coloer", 0, ITEM_COLOER }, /* ITEM_COLOER */
#endif
};
static ITEM_charDataSetting ITEM_setchardata[]={
{"na", "", ITEM_NAME }, /* ITEM_NAME */
{"sn", "", ITEM_SECRETNAME }, /* ITEM_SCRETNAME */
{"en", "", ITEM_EFFECTSTRING }, /* ITEM_EFFECTSTRING */
{"ar", "", ITEM_ARGUMENT }, /* ITEM_ARGUMENT */
#ifdef _ITEM_INSLAY
{"acode", "", ITEM_TYPECODE }, /*ITEM_TYPECODE,*/
{"inlaycode", "", ITEM_INLAYCODE}, /*ITEM_INLAYCODE,*/
#endif
{"cdk", "", ITEM_CDKEY }, /* ITEM_CDKEY */
#ifdef _ITEM_FORUSERNAMES
{"forname", "", ITEM_FORUSERNAME }, //ITEM_FORUSERNAME,
{"forcdkey", "", ITEM_FORUSERCDKEY }, //ITEM_FORUSERCDKEY
#endif
#ifdef _ANGEL_SUMMON
{"mindex", "", ITEM_ANGELMISSION},
{"angel", "", ITEM_ANGELINFO},
{"hero", "", ITEM_HEROINFO},
#endif
#ifdef _UNIQUE_P_I
{"ucode", "", ITEM_UNIQUECODE}, /* ITEM_UNIQUECODE */
#endif
};
static ITEM_charDataSetting ITEM_setmemdata={
"", "", -1 /* ITEM_MEMO */
};
#else
typedef struct ITEM_tag_intDataSetting
{
char* dumpchar;
int defaults;
}ITEM_intDataSetting;
typedef struct ITEM_tag_charDataSetting
{
char* dumpchar;
char* defaults;
}ITEM_charDataSetting;
static ITEM_intDataSetting ITEM_setintdata[ITEM_DATAINTNUM]={
{"id", 0}, /* ITEM_ID */
{"bi", 0}, /* ITEM_ITEMBASEIMAGENUMBER */
{"cs", 0}, /* ITEM_COST */
{"ep", ITEM_OTHER}, /* ITEM_TYPE */
{"ft", 0}, /* ITEM_ABLEUSEFIELD */
{"tg", 0}, /* ITEM_TARGET */
{"lv", 0}, /* ITEM_LEVEL */
#ifdef _ITEM_MAXUSERNUM
{"dib", -1}, /*ITEM_DAMAGEBREAK*/
#endif
#ifdef _ITEMSET4_TXT
{"upin", 1}, //ITEM_USEPILENUMS,
{"canpile", 0}, //ITEM_CANBEPILE
{"nestr", 0}, //ITEM_NEEDSTR,
{"nedex", 0}, //ITEM_NEEDDEX,
{"netra", 0}, //ITEM_NEEDTRANS,
{"neprof", 0}, //ITEM_NEEDPROFESSION,
#endif
#ifdef _TAKE_ITEMDAMAGE
{"dmce", 0}, /*ITEM_DAMAGECRUSHE*/
{"mdmce",0}, //ITEM_MAXDAMAGECRUSHE
#endif
#ifdef _ADD_DEAMGEDEFC
{"otdmag", 0}, //ITEM_OTHERDAMAGE,
{"otdefc", 0}, //ITEM_OTHERDEFC,
#endif
#ifdef _SUIT_ITEM
{"nsuit", 0}, //ITEM_SUITCODE,
#endif
{"ann", 0}, /* ITEM_ATTACKNUM_MIN */
{"anx", 0}, /* ITEM_ATTACKNUM_MAX */
{"ma", 0}, /* ITEM_MODIFYATTACK */
{"md", 0}, /* ITEM_MODIFYDEFENCE */
{"mh", 0}, /* ITEM_MODIFYHP */
{"mm", 0}, /* ITEM_MODIFYMP */
{"mq", 0}, /* ITEM_MODIFYQUICK */
{"ml", 0}, /* ITEM_MODIFYLUCK */
{"mc", 0}, /* ITEM_MODIFYCHARM */
{"mv", 0}, /* ITEM_MODIFYAVOID */
{"mat", 0}, /* ITEM_MODIFYATTRIB */
{"mav", 0}, /* ITEM_MODIFYATTRIBVALUE */
{"mid", -1}, /* ITEM_MAGICID */
{"mpr", 0}, /* ITEM_MAGICPROB */
{"mu", 0}, /* ITEM_MAGICUSEMP */
#ifdef _ITEMSET5_TXT
{"arr", 0}, /*ITEM_MODIFYARRANGE*/
{"seqce", 0}, //ITEM_MODIFYSEQUENCE,
{"iapi", 0}, //ITEM_ATTACHPILE
{"hirt", 0}, //ITEM_HITRIGHT //额外命中
#endif
#ifdef _ITEMSET6_TXT
{"neguard", 0}, //ITEM_NEGLECTGUARD
// {"bemerge", 0}, //ITEM_BEMERGE
#endif
{"mpo", 0}, /* ITEM_POISON */
{"mpa", 0}, /* ITEM_PARALYSIS */
{"msl", 0}, /* ITEM_SLEEP */
{"mst", 0}, /* ITEM_STONE */
{"mdr", 0}, /* ITEM_DRUNK */
{"mco", 0}, /* ITEM_CONFUSION */
{"mcr", 0}, /* ITEM_CRITICAL */
{"ua", -1}, /* ITEM_USEACTION */
{"drlo",FALSE}, /* ITEM_DROPATLOGOUT */
{"valo",FALSE}, /* ITEM_VANISHATLOGOUT */
{"ioed",TRUE}, /* ITEM_ISOVERED */
{"cpm", TRUE}, /* ITEM_CANPETMAIL */
{"cmf", TRUE}, /* ITEM_CANMERGEFROM */
{"cmt", TRUE}, /* ITEM_CANMERGETO */
{"ingv0",0}, /* ITEM_INGVALUE0 */
{"ingv1",0},
{"ingv2",0},
{"ingv3",0},
{"ingv4",0},
{"ipt", 0}, /* ITEM_PUTTIME */
{"ll", 0}, /* ITEM_LEAKLEVEL */
{"mrf", 0}, /* ITEM_MERGEFLG */
{"clv", 0}, /* ITEM_CRUSHLEVEL */
{"v1", 0}, /* ITEM_VAR1 */
{"v2", 0}, /* ITEM_VAR2 */
{"v3", 0}, /* ITEM_VAR3 */
{"v4", 0}, /* ITEM_VAR4 */
{"itime", 0},
};
static ITEM_charDataSetting ITEM_setchardata[ITEM_DATACHARNUM]={
{"na", ""}, /* ITEM_NAME */
{"sn", ""}, /* ITEM_SCRETNAME */
{"en", ""}, /* ITEM_EFFECTSTRING */
{"ar", ""}, /* ITEM_ARGUMENT */
#ifdef _ITEM_INSLAY
{"acode", ""}, /*ITEM_TYPECODE,*/
{"inlaycode", ""}, /*ITEM_INLAYCODE,*/
#endif
{"cdk", ""}, /* ITEM_CDKEY */
#ifdef _ITEM_FORUSERNAMES
{"forname", ""}, //ITEM_FORUSERNAME,
{"forcdkey", ""}, //ITEM_FORUSERCDKEY
#endif
// CoolFish: 2001/10/11
#ifdef _UNIQUE_P_I
{"ucode", ""}, /* ITEM_UNIQUECODE */
#endif
{"ingn0", ""}, /* ITEM_INGNAME0 */
{"ingn1", ""},
{"ingn2", ""},
{"ingn3", ""},
{"ingn4", ""},
{"inif", ""}, /* ITEM_PREOVERFUNC */
{"preof", ""}, /* ITEM_PREOVERFUNC */
{"posof", ""}, /* ITEM_POSTOVERFUNC */
{"wf", "ITEM_DeleteTimeWatched"}, /* ITEM_WATCHFUNC */
{"usef", ""}, /* ITEM_USEFUNC */
{"atchf", ""}, /* ITEM_ATTACH */
{"dtchf", ""}, /* ITEM_DETACH */
{"attaf", ""}, /* ITEM_ATTACKFUNC */
{"pickupf", ""}, /* ITEM_PICKUPFUNC */
#ifdef _Item_ReLifeAct
{"relifes", ""}, /*ITEM_DIERELIFEFUNC*/
#endif
#ifdef _PICKUP_ITEM_OTHER
{"fromcd", ""},
#endif
};
static ITEM_charDataSetting ITEM_setmemdata={
"", "" /* ITEM_MEMO */
};
#endif
typedef enum
{
ITEM_INTENTRY=0,
ITEM_CHARENTRY=1,
ITEM_INTFUNC=2,
ITEM_CHARFUNC=3,
}ITEM_DATATYPECATEGORY;
static struct ITEM_itemconfentry
{
char* entryname;
ITEM_DATATYPECATEGORY type;
int index;
void* func;
}ITEM_itemconfentries[]={
{"name", ITEM_CHARFUNC, ITEM_NAME, ITEM_checkString},
{"secretname", ITEM_CHARFUNC, ITEM_SECRETNAME, ITEM_checkString},
{"effectstring",ITEM_CHARFUNC, ITEM_EFFECTSTRING, ITEM_checkString},
{"argument", ITEM_CHARENTRY, ITEM_ARGUMENT, NULL},
#ifdef _ITEM_INSLAY
{"acode", ITEM_CHARENTRY, ITEM_TYPECODE, NULL},
{"inlaycode", ITEM_CHARENTRY, ITEM_INLAYCODE, NULL},
#endif
{"initfunc", ITEM_CHARENTRY, ITEM_INITFUNC, NULL},
{"preoverfunc", ITEM_CHARENTRY, ITEM_PREOVERFUNC, NULL},
{"postoverfunc",ITEM_CHARENTRY, ITEM_POSTOVERFUNC, NULL},
{"watchfunc", ITEM_CHARENTRY, ITEM_WATCHFUNC, NULL},
{"usefunc", ITEM_CHARENTRY, ITEM_USEFUNC, NULL},
{"attachfunc", ITEM_CHARENTRY, ITEM_ATTACHFUNC, NULL},
{"detachfunc", ITEM_CHARENTRY, ITEM_DETACHFUNC, NULL},
{"dropfunc", ITEM_CHARENTRY, ITEM_DROPFUNC, NULL},
{"pickupfunc", ITEM_CHARENTRY, ITEM_PICKUPFUNC, NULL},
#ifdef _Item_ReLifeAct
{"relifefunc", ITEM_CHARENTRY, ITEM_DIERELIFEFUNC, NULL},
#endif
{"id", ITEM_INTENTRY, ITEM_ID, NULL},
{"imagenumber", ITEM_INTENTRY, ITEM_BASEIMAGENUMBER, NULL},
{"cost", ITEM_INTENTRY, ITEM_COST, NULL},
{"type", ITEM_INTENTRY, ITEM_TYPE, NULL},
{"fieldtype", ITEM_INTENTRY, ITEM_ABLEUSEFIELD, NULL},
{"target", ITEM_INTENTRY, ITEM_TARGET, NULL},
{"level", ITEM_INTENTRY, ITEM_LEVEL, NULL},
#ifdef _ITEM_MAXUSERNUM
{"dambreak", ITEM_INTENTRY, ITEM_DAMAGEBREAK, NULL},
#endif
#ifdef _ITEMSET4_TXT
{"upinums", ITEM_INTENTRY, ITEM_USEPILENUMS, NULL},
{"campile", ITEM_INTENTRY, ITEM_CANBEPILE, NULL},
{"nestr", ITEM_INTENTRY, ITEM_NEEDSTR, NULL},
{"nedex", ITEM_INTENTRY, ITEM_NEEDDEX, NULL},
{"netra", ITEM_INTENTRY, ITEM_NEEDTRANS, NULL},
{"neprof", ITEM_INTENTRY, ITEM_NEEDPROFESSION, NULL},
#endif
#ifdef _TAKE_ITEMDAMAGE
{"damcrushe", ITEM_INTENTRY, ITEM_DAMAGECRUSHE, NULL},
{"maxdmce", ITEM_INTENTRY, ITEM_MAXDAMAGECRUSHE, NULL},
#endif
#ifdef _ADD_DEAMGEDEFC
{"otdmags", ITEM_INTENTRY, ITEM_OTHERDAMAGE, NULL},
{"otdefcs", ITEM_INTENTRY, ITEM_OTHERDEFC, NULL},
#endif
#ifdef _SUIT_ITEM
{"nsuit", ITEM_INTENTRY, ITEM_SUITCODE, NULL}, //ITEM_SUITCODE,
#endif
{"attacknum_min",ITEM_INTENTRY, ITEM_ATTACKNUM_MIN, NULL},
{"attacknum_max",ITEM_INTENTRY, ITEM_ATTACKNUM_MAX, NULL},
{"attack", ITEM_INTFUNC, ITEM_MODIFYATTACK, ITEM_getRandomValue},
{"defence", ITEM_INTFUNC, ITEM_MODIFYDEFENCE, ITEM_getRandomValue},
{"quick", ITEM_INTFUNC, ITEM_MODIFYQUICK, ITEM_getRandomValue},
{"hp", ITEM_INTFUNC, ITEM_MODIFYHP, ITEM_getRandomValue},
{"mp", ITEM_INTFUNC, ITEM_MODIFYMP, ITEM_getRandomValue},
{"luck", ITEM_INTFUNC, ITEM_MODIFYLUCK, ITEM_getRandomValue},
{"charm", ITEM_INTFUNC, ITEM_MODIFYCHARM, ITEM_getRandomValue},
{"avoid", ITEM_INTFUNC, ITEM_MODIFYAVOID, ITEM_getRandomValue},
{"attrib", ITEM_INTENTRY, ITEM_MODIFYATTRIB, NULL},
{"attribvalue", ITEM_INTENTRY, ITEM_MODIFYATTRIBVALUE,NULL},
{"magicid", ITEM_INTENTRY, ITEM_MAGICID, NULL},
{"magicprob", ITEM_INTENTRY, ITEM_MAGICPROB, NULL},
{"magicusemp", ITEM_INTENTRY, ITEM_MAGICUSEMP, NULL},
#ifdef _ITEMSET5_TXT
{"arr", ITEM_INTENTRY, ITEM_MODIFYARRANGE, NULL},
{"seqce", ITEM_INTENTRY, ITEM_MODIFYSEQUENCE, NULL},
{"iapi", ITEM_INTENTRY, ITEM_ATTACHPILE, NULL},
{"hirt", ITEM_INTENTRY, ITEM_HITRIGHT, NULL},
#endif
#ifdef _ITEMSET6_TXT
{"neguard", ITEM_INTENTRY, ITEM_NEGLECTGUARD, NULL},
// {"bemerge", ITEM_INTENTRY, ITEM_BEMERGE, NULL},
#endif
#ifdef _PETITEM__AMOI_E
{"petfix0", ITEM_INTENTRY, ITEM_PETFIX0, NULL},
{"petfix1", ITEM_INTENTRY, ITEM_PETFIX1, NULL},
{"petfix2", ITEM_INTENTRY, ITEM_PETFIX2, NULL},
{"petfix3", ITEM_INTENTRY, ITEM_PETFIX3, NULL},
{"petfix4", ITEM_INTENTRY, ITEM_PETFIX4, NULL},
{"petfix5", ITEM_INTENTRY, ITEM_PETFIX5, NULL},
{"petfix6", ITEM_INTENTRY, ITEM_PETFIX6, NULL},
{"petfix7", ITEM_INTENTRY, ITEM_PETFIX7, NULL},
{"petequitallow", ITEM_CHARENTRY, ITEM_PETEQUITALLOW, NULL},
{"petequitforbit", ITEM_CHARENTRY, ITEM_PETEQUITFORBIT, NULL},
#endif
{"poison", ITEM_INTFUNC, ITEM_POISON, ITEM_getRandomValue},
{"paralysis", ITEM_INTFUNC, ITEM_PARALYSIS, ITEM_getRandomValue},
{"sleep", ITEM_INTFUNC, ITEM_SLEEP, ITEM_getRandomValue},
{"stone", ITEM_INTFUNC, ITEM_STONE, ITEM_getRandomValue},
{"drunk", ITEM_INTFUNC, ITEM_DRUNK, ITEM_getRandomValue},
{"confusion", ITEM_INTFUNC, ITEM_CONFUSION, ITEM_getRandomValue},
{"critical", ITEM_INTFUNC, ITEM_CRITICAL, ITEM_getRandomValue},
{"useaction", ITEM_INTENTRY, ITEM_USEACTION, NULL},
{"dropatlogout",ITEM_INTFUNC, ITEM_DROPATLOGOUT, ITEM_isstring1or0},
{"vanishatdrop",ITEM_INTFUNC, ITEM_VANISHATDROP, ITEM_isstring1or0},
{"isovered", ITEM_INTFUNC, ITEM_ISOVERED, ITEM_isstring1or0},
{"canpetmail", ITEM_INTFUNC, ITEM_CANPETMAIL, ITEM_isstring1or0},
{"canmergefrom",ITEM_INTFUNC, ITEM_CANMERGEFROM, ITEM_isstring1or0},
{"canmergeto", ITEM_INTFUNC, ITEM_CANMERGETO, ITEM_isstring1or0},
{"ingname0", ITEM_CHARENTRY, ITEM_INGNAME0, NULL},
{"ingvalue0", ITEM_INTENTRY, ITEM_INGVALUE0, NULL},
{"ingname1", ITEM_CHARENTRY, ITEM_INGNAME1, NULL},
{"ingvalue1", ITEM_INTENTRY, ITEM_INGVALUE1, NULL},
{"ingname2", ITEM_CHARENTRY, ITEM_INGNAME2, NULL},
{"ingvalue2", ITEM_INTENTRY, ITEM_INGVALUE2, NULL},
{"ingname3", ITEM_CHARENTRY, ITEM_INGNAME3, NULL},
{"ingvalue3", ITEM_INTENTRY, ITEM_INGVALUE3, NULL},
{"ingname4", ITEM_CHARENTRY, ITEM_INGNAME4, NULL},
{"ingvalue4", ITEM_INTENTRY, ITEM_INGVALUE4, NULL},
#ifdef _PETITEM__AMOI_E
{"shopitem", ITEM_INTENTRY, ITEM_TYPEOFITEM, NULL},
#endif
};
#ifdef _ITEMTBL_STAIC
ITEM_table ITEM_tbl[24000];
#else
ITEM_table* ITEM_tbl=NULL;
#endif
static INLINE BOOL ITEM_CHECKARRAYINDEX(int index)
{
if( ITEM_itemnum<=(index) || (index)<0 )return FALSE;
return TRUE;
}
INLINE BOOL _ITEM_CHECKINDEX( char *file, int line, int index)
{
if( !ITEM_CHECKARRAYINDEX(index) ) {
if( index != -1 ) {
print( "err %s:%d \n", file, line);
}
return FALSE;
}
if( ITEM_item[index].use == FALSE ) {
return FALSE;
}
return TRUE;
}
static INLINE int ITEM_CHECKINTDATAINDEX(int index)
{
if( ITEM_DATAINTNUM <= index || index < 0 )return FALSE;
return TRUE;
}
static INLINE int ITEM_CHECKCHARDATAINDEX(int index)
{
if( ITEM_DATACHARNUM<=index || index<0 )return FALSE;
return TRUE;
}
BOOL ITEM_initExistItemsArray( int num )
{
int i;
BOOL ITEM_checksetdata( void );
if( ITEM_checksetdata() == FALSE )return FALSE;
ITEM_itemnum = num;
ITEM_item = allocateMemory( sizeof( ITEM_exists ) * num );
if( ITEM_item == NULL ) return FALSE;
#ifdef _ALLBLUES_LUA_1_2
memset( &ITEM_luaFunc, 0 , sizeof( ITEM_LuaFunc ));
#endif
for( i = 0 ; i < num ; i ++ ){
memset( &ITEM_item[i], 0 , sizeof( ITEM_exists ));
ITEM_item[i].use = FALSE;
}
print("第二次分配 %4.2f MB 空间...", sizeof( ITEM_exists ) * num /1024.0/1024.0);
return TRUE;
}
BOOL ITEM_endExistItemsArray( void )
{
freeMemory( ITEM_item );
return TRUE;
}
int _ITEM_initExistItemsOne( char *file, int line, ITEM_Item* itm )
{
int i;
int itemID=-1;
static int Sindex=1;
itemID = itm->data[ITEM_ID];
if( ITEM_CHECKITEMTABLE(itm->data[ITEM_ID] ) == FALSE){
print("CHAR itemData err Item_id:%d=%s%d!!\n", itm->data[ITEM_ID], file, line);
return -1;
}
for( i = 0 ; i < ITEM_itemnum ; i ++ ) {
Sindex++;
if( Sindex >= ITEM_itemnum ) Sindex = 1;
if( Sindex < 1 ) Sindex = 1;
if( !ITEM_item[Sindex].use){
int charaindex;
charaindex = ITEM_item[Sindex].itm.workint[ITEM_WORKCHARAINDEX];
if( CHAR_CHECKINDEX( charaindex) &&
CHAR_getInt( charaindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ) {
int j;
for( j = 0; j < CHAR_MAXITEMHAVE; j ++ ) {
if( CHAR_getItemIndex( charaindex, j) == Sindex) {
print( "item.c: error! chara have this item charaindex[%d] "
"itemindex[%d] Name(%s)POS(%d)NAME(%s)\n",
charaindex, Sindex,
CHAR_getUseName( charaindex ), j,
ITEM_item[Sindex].itm.string[ITEM_NAME].string );
print( "from %s:%d\n", file, line);
ITEM_item[Sindex].use = TRUE;
break;
}
}
if( j != CHAR_MAXITEMHAVE ) continue;
}
memcpy( &ITEM_item[Sindex].itm , itm , sizeof( ITEM_Item ) );
ITEM_item[Sindex].use = TRUE;
{
BOOL (*initfunc)(ITEM_Item*)=NULL;
initfunc = (BOOL(*)(ITEM_Item*)) getFunctionPointerFromName( itm->string[ITEM_INITFUNC].string );
if( initfunc ){
if( initfunc( &ITEM_item[Sindex].itm ) == FALSE ){
ITEM_item[Sindex].use = FALSE;
fprint( "Error:Can't init item\n" );
return -1;
}
}
}
ITEM_UseItemnum++;
ITEM_constructFunctable( Sindex);
return Sindex;
}
}
fprint( "物品已满\n" );
return -1;
}
void _ITEM_endExistItemsOne( int index , char *file, int line)
{
int i,j;
int hitcnt = 0;
int playernum = CHAR_getPlayerMaxNum();
if( !ITEM_CHECKINDEX(index)) return;
for( i = 0; i < playernum; i ++ ) {
if( CHAR_CHECKINDEX( i)) {
for( j = 0; j < CHAR_MAXITEMHAVE; j ++ ) {
if( CHAR_getItemIndex( i, j) == index) {
print( "warning !! player have this item:%d call from [%s:%d](%s)(%s)\n",
index, file,line, CHAR_getUseName(i),ITEM_item[index].itm.string[ITEM_NAME].string );
hitcnt ++;
if( hitcnt > 1 ) {
print( "ITEM_INDEX(%d) duplicate!!\n", index);
}
}
}
}
}
if( hitcnt < 1 ){
ITEM_item[index].use = FALSE;
ITEM_item[index].itm.workint[ITEM_WORKCHARAINDEX] = -1;
ITEM_UseItemnum--;
}
}
INLINE int ITEM_getIntStrict( int index ,ITEM_DATAINT element,int* error)
{
if(!ITEM_CHECKINDEX(index))return *error=FALSE;
if(!ITEM_CHECKINTDATAINDEX(element))return *error=FALSE;
return ITEM_item[index].itm.data[element];
}
INLINE int _ITEM_getInt( char *file, int line, int index ,ITEM_DATAINT element)
{
if(!ITEM_CHECKINDEX(index)){
return -1;
}
if(!ITEM_CHECKINTDATAINDEX(element)) {
return -1;
}
return ITEM_item[index].itm.data[element];
}
INLINE int ITEM_setIntStrict( int index ,ITEM_DATAINT element,int data,
int* error)
{
int buf;
if(!ITEM_CHECKINDEX(index))
return *error=FALSE;
if(!ITEM_CHECKINTDATAINDEX(element))
return *error=FALSE;
buf = ITEM_item[index].itm.data[element];
ITEM_item[index].itm.data[element] = data;
return buf;
}
INLINE int _ITEM_setInt( char *file, int line, int index ,ITEM_DATAINT element, int data)
{
int buf;
if( !ITEM_CHECKINDEX( index) ){
return -1;
}
if( !ITEM_CHECKINTDATAINDEX( element) ){
return -1;
}
buf = ITEM_item[ index].itm.data[ element];
ITEM_item[ index].itm.data[ element] = data;
return buf;
}
INLINE char* ITEM_getChar( int index ,ITEM_DATACHAR element )
{
if(!ITEM_CHECKINDEX(index))return "\0";
if(!ITEM_CHECKCHARDATAINDEX(element))return "\0";
return ITEM_item[index].itm.string[element].string;
}
INLINE BOOL ITEM_setChar( int index ,ITEM_DATACHAR element , char* new)
{
if(!ITEM_CHECKINDEX(index))return FALSE;
if(!ITEM_CHECKCHARDATAINDEX(element))return FALSE;
strcpysafe( ITEM_item[index].itm.string[element].string,
sizeof( ITEM_item[index].itm.string[element].string ),
new );
return TRUE;
}
INLINE int ITEM_getWorkInt( int index ,ITEM_WORKDATAINT element)
{
if( !ITEM_CHECKINDEX(index) ) return -1;
if( element >= ITEM_WORKDATAINTNUM || element < 0 ) return -1;
return ITEM_item[index].itm.workint[element];
}
INLINE int ITEM_setWorkInt( int index ,ITEM_WORKDATAINT element, int data)
{
int buf;
if( !ITEM_CHECKINDEX( index) ) return -1;
if( element >= ITEM_WORKDATAINTNUM || element < 0 ) return -1;
buf = ITEM_item[index].itm.workint[element];
ITEM_item[index].itm.workint[element] = data;
return buf;
}
INLINE int ITEM_getITEM_itemnum( void )
{
return ITEM_itemnum;
}
INLINE int ITEM_getITEM_UseItemnum( void )
{
return ITEM_UseItemnum;
}
INLINE BOOL ITEM_getITEM_use( int index )
{
if( !ITEM_CHECKINDEX(index))return FALSE;
return ITEM_item[index].use;
}
void ITEM_constructFunctable( int itemindex )
{
int i;
if( !ITEM_CHECKINDEX(itemindex))return;
for( i=ITEM_FIRSTFUNCTION; i < ITEM_LASTFUNCTION ; i++ ) {
ITEM_item[itemindex].itm.functable[i-ITEM_FIRSTFUNCTION]
= getFunctionPointerFromName( ITEM_getChar( itemindex,i ) );
#ifdef _ALLBLUES_LUA_1_2
if(ITEM_item[itemindex].itm.functable[i-ITEM_FIRSTFUNCTION] == NULL){
ITEM_setLUAFunction(itemindex, i, ITEM_getChar( itemindex,i ));
}
#endif
}
}
void* ITEM_getFunctionPointer( int itemindex, int functype )
{
if( !ITEM_CHECKINDEX(itemindex) )return NULL;
if( functype < ITEM_FIRSTFUNCTION || functype >= ITEM_LASTFUNCTION ){
print( "类型错误:%d\n", functype);
return NULL;
}
return ITEM_item[itemindex].itm.
functable[functype-ITEM_FIRSTFUNCTION];
}
#ifdef _ALLBLUES_LUA_1_2
INLINE BOOL ITEM_setLUAFunction( int itemindex, int functype, const char *luafuncname)
{
if( !ITEM_CHECKINDEX(itemindex) )return FALSE;
if( functype < ITEM_FIRSTFUNCTION || functype >= ITEM_LASTFUNCTION ){
print( "类型错误1:%d\n", functype);
return FALSE;
}
ITEM_LuaFunc *luaFunc = &ITEM_luaFunc;
while(luaFunc->next != NULL){
if(strcmp(luaFunc->luafuncname, luafuncname) == 0){
ITEM_item[itemindex].itm.lua[functype-ITEM_FIRSTFUNCTION] = luaFunc->lua;
ITEM_item[itemindex].itm.luafunctable[functype-ITEM_FIRSTFUNCTION] = allocateMemory( strlen(luaFunc->luafunctable) );
memset(ITEM_item[itemindex].itm.luafunctable[functype-ITEM_FIRSTFUNCTION], 0, strlen(luaFunc->luafunctable));
strcpy(ITEM_item[itemindex].itm.luafunctable[functype-ITEM_FIRSTFUNCTION], luaFunc->luafunctable);
return TRUE;
}
luaFunc = luaFunc->next;
}
ITEM_item[itemindex].itm.lua[functype-ITEM_FIRSTFUNCTION] = NULL;
ITEM_item[itemindex].itm.luafunctable[functype-ITEM_FIRSTFUNCTION] = NULL;
return FALSE;
}
BOOL ITEM_addLUAListFunction( lua_State *L, const char *luafuncname, const char *luafunctable )
{
ITEM_LuaFunc *luaFunc = &ITEM_luaFunc;
while(luaFunc->next != NULL){
luaFunc = luaFunc->next;
}
luaFunc->next = allocateMemory( sizeof(ITEM_LuaFunc) );
memset( luaFunc->next, 0 , sizeof(ITEM_luaFunc) );
if(luaFunc->next == NULL)return FALSE;
luaFunc->lua = L;
strcpysafe( luaFunc->luafuncname, 128, luafuncname );
strcpysafe( luaFunc->luafunctable, 128, luafunctable );
return TRUE;
}
INLINE lua_State *ITEM_getLUAFunction( int itemindex, int functype)
{
if( !ITEM_CHECKINDEX(itemindex) )return NULL;
if( functype < ITEM_FIRSTFUNCTION || functype >= ITEM_LASTFUNCTION ){
print( "类型错误2:%d\n", functype);
return NULL;
}
if(ITEM_item[itemindex].itm.lua[functype-ITEM_FIRSTFUNCTION] == NULL){
return NULL;
}
lua_getglobal( ITEM_item[itemindex].itm.lua[functype-ITEM_FIRSTFUNCTION], ITEM_item[itemindex].itm.luafunctable[functype-ITEM_FIRSTFUNCTION]);
return ITEM_item[itemindex].itm.lua[functype-ITEM_FIRSTFUNCTION];
}
#endif
int ITEM_getItemMaxIdNum( void)
{
return ITEM_tblen;
}
BOOL ITEM_checksetdata( void )
{
int i;
char* strings[ITEM_DATAINTNUM + ITEM_DATACHARNUM + 1];
#ifdef _SIMPLIFY_ITEMSTRING
int num=0;
for(i = 0; i < arraysizeof( ITEM_setintdata) ; i ++ )
strings[ num++ ] = ITEM_setintdata[i].dumpchar;
for( i = 0 ; i < arraysizeof( ITEM_setchardata) ; i ++ )
strings[ num++ ] = ITEM_setchardata[i].dumpchar;
strings[ITEM_DATAINTNUM+ITEM_DATACHARNUM] = ITEM_setmemdata.dumpchar;
if( ! checkStringsUnique( strings, num,1 ) ){
fprint( "ITEM_set????data is overlapped.\nIt is not allowed\n");
return FALSE;
}
#else
for(i = 0; i < ITEM_DATAINTNUM ; i ++ )
strings[i] = ITEM_setintdata[i].dumpchar;
for( i = 0 ; i < ITEM_DATACHARNUM ; i ++ )
strings[ITEM_DATAINTNUM+i] = ITEM_setchardata[i].dumpchar;
strings[ITEM_DATAINTNUM+ITEM_DATACHARNUM] = ITEM_setmemdata.dumpchar;
if( ! checkStringsUnique( strings, arraysizeof( strings ),1 ) ){
fprint( "ITEM_set????data is overlapped.\nIt is not allowed\n");
return FALSE;
}
#endif
return TRUE;
}
static char ITEM_dataString[STRINGBUFSIZ];
char* ITEM_makeStringFromItemIndex( int index, int mode )
{
if( 0 <= index && index < ITEM_itemnum && ITEM_item[index].use == TRUE)
;
else
return "\0";
return ITEM_makeStringFromItemData( &ITEM_item[index].itm, mode );
}
#ifdef _SIMPLIFY_ITEMSTRING2
BOOL CHECK_HaveBeSave( int itemID, int oneNum, int type )
{
if( ITEM_ID == type ) return TRUE;
if( ITEMTBL_getInt( itemID, type) == oneNum ) return FALSE;
return TRUE;
}
#endif
char* ITEM_makeStringFromItemData( ITEM_Item* one, int mode )
{
int i;
char delim1 = '\0';
char delim2 = '\0';
int strlength=0;
#ifdef _SIMPLIFY_ITEMSTRING2
int itemID = one->data[ ITEM_ID];
if( !ITEM_CHECKITEMTABLE( itemID) ) return "\0";
#endif
if( mode == 0 ) {
delim1 = '='; delim2 = '|';
}else {
delim1 = ':'; delim2 = ',';
}
#ifdef _SIMPLIFY_ITEMSTRING
for(i = 0; i < arraysizeof( ITEM_setintdata) ; i ++ ){
char linedata[128];
#ifdef _SIMPLIFY_ITEMSTRING2
if( !CHECK_HaveBeSave( itemID, one->data[ ITEM_setintdata[i].table], ITEM_setintdata[i].table) ) continue;
#endif
snprintf( linedata , sizeof(linedata),
"%s%c%d%c", ITEM_setintdata[i].dumpchar, delim1,
one->data[ ITEM_setintdata[i].table], delim2 );
strcpysafe( &ITEM_dataString[strlength], sizeof( ITEM_dataString ) - strlength, linedata );
strlength += strlen( linedata );
}
for( i = 0 ; i < arraysizeof( ITEM_setchardata) ; i ++ ){
char linedata[128];
char escapebuffer[128];
if( strlen( one->string[ ITEM_setchardata[i].table].string) == 0 ) continue;
snprintf( linedata , sizeof(linedata),
"%s%c%s%c", ITEM_setchardata[i].dumpchar,delim1,
makeEscapeString( one->string[ITEM_setchardata[i].table].string, escapebuffer,
sizeof(escapebuffer)), delim2);
strcpysafe( &ITEM_dataString[strlength], sizeof( ITEM_dataString ) - strlength, linedata );
strlength += strlen( linedata );
}
#else
for( i = 0 ; i < ITEM_DATAINTNUM ; i ++ ) {
char linedata[128];
snprintf( linedata , sizeof(linedata),
"%s%c%d%c", ITEM_setintdata[i].dumpchar, delim1, one->data[i], delim2 );
strcpysafe( &ITEM_dataString[strlength], sizeof( ITEM_dataString ) - strlength, linedata );
strlength += strlen( linedata );
}
for( i = 0 ; i < ITEM_DATACHARNUM ; i ++ ){
char linedata[128];
char escapebuffer[128];
if( strlen( one->string[i].string) != 0 ) {
snprintf( linedata , sizeof(linedata),
"%s%c%s%c", ITEM_setchardata[i].dumpchar,delim1,
makeEscapeString(one->string[i].string,escapebuffer,
sizeof(escapebuffer)), delim2);
strcpysafe( &ITEM_dataString[strlength], sizeof( ITEM_dataString ) - strlength, linedata );
strlength += strlen( linedata );
}
}
#endif
dchop( ITEM_dataString, (mode == 0 ) ? "|" : ",");
return ITEM_dataString;
}
BOOL ITEM_makeExistItemsFromStringToArg( char* src , ITEM_Item* item, int mode )
{
int readindex=1;
char delim1[2];
char delim2[2];
if( mode == 0 ) {
strcpy( delim1, "=");
strcpy( delim2, "|");
}
else {
strcpy( delim1, ":");
strcpy( delim2, ",");
}
#ifdef _SIMPLIFY_ITEMSTRING
{
int itemID=-1;
while( 1 ){
char linebuf[512];
char firstToken[256];
char secondToken[256];
if( getStringFromIndexWithDelim( src ,delim2 , readindex, linebuf, sizeof( linebuf)) == FALSE ) break;
readindex++;
if( getStringFromIndexWithDelim( linebuf, delim1, 1, firstToken, sizeof( firstToken )) == FALSE )return FALSE;
if( strcmp( firstToken, "id" ) ) continue;
strcpysafe( secondToken , sizeof( secondToken ), linebuf + strlen( firstToken) + strlen( delim1) );
itemID = atoi( secondToken);
if( !ITEM_CHECKITEMTABLE( itemID) ) return FALSE;
ITEM_getDefaultItemData( itemID, item);
break;
}
readindex =1;
}
#else
ITEM_getDefaultItemSetting(item);
#endif
while( 1 ){
BOOL ret;
char linebuf[512];
char firstToken[256];
char secondToken[256];
int i;
ret = getStringFromIndexWithDelim( src ,delim2 , readindex,linebuf, sizeof(linebuf) );
if( ret == FALSE )
break;
ret = getStringFromIndexWithDelim( linebuf, delim1, 1, firstToken, sizeof( firstToken ) );
if( ret == FALSE ) return FALSE;
strcpysafe( secondToken , sizeof( secondToken ),
linebuf + strlen(firstToken) + strlen(delim1) );
#ifdef _SIMPLIFY_ITEMSTRING
for(i = 0; i < arraysizeof( ITEM_setintdata) ; i ++ ){
if( strcmp( firstToken , ITEM_setintdata[i].dumpchar) ) continue;
item->data[ITEM_setintdata[i].table] = atoi( secondToken );
goto NEXT;
}
for(i = 0; i < arraysizeof( ITEM_setchardata) ; i ++ ){
if( strcmp(firstToken ,ITEM_setchardata[i].dumpchar ) ) continue;
strcpysafe( item->string[ ITEM_setchardata[i].table].string,
sizeof(item->string[ITEM_setchardata[i].table].string),
makeStringFromEscaped(secondToken));
goto NEXT;
}
#else
for( i = 0 ; i < ITEM_DATAINTNUM ; i ++ ){
if( strcmp(firstToken ,ITEM_setintdata[i].dumpchar) == 0 ){
item->data[i] = atoi( secondToken );
goto NEXT;
}
}
for( i = 0 ; i < ITEM_DATACHARNUM ; i ++ ){
if( strcmp(firstToken ,ITEM_setchardata[i].dumpchar ) == 0 ){
strcpysafe( item->string[i].string,
sizeof(item->string[i].string),
makeStringFromEscaped(secondToken));
goto NEXT;
}
}
#endif
fprint( "??? : %s[%s]\n" , src , firstToken );
NEXT:
readindex++;
}
return TRUE;
}
void ITEM_getDefaultItemSetting(ITEM_Item* itm)
{
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_ITEMSTRING
void 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" );
}
#endif
static 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 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;
}
}
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 = maxid + 1;
#ifdef _ITEMTBL_STAIC
for( i = 0 ; i < 24000 ; i ++ ) {
ITEM_tbl[i].use = FALSE;
}
#else
if( ITEM_tbl != NULL )
freeMemory( ITEM_tbl);
ITEM_tbl = allocateMemory( sizeof(ITEM_table) * ITEM_tblen );
if( ITEM_tbl == NULL ){
fprint( "无法分配内存 %d\n" , sizeof(ITEM_table)*ITEM_tblen );
fclose( f );
return FALSE;
}
print("第一次分配 %4.2f MB 空间...", sizeof(ITEM_table) * ITEM_tblen /1024.0/1024.0);
for( i = 0 ; i < ITEM_tblen ; i ++ ) {
ITEM_tbl[i].use = FALSE;
}
#endif
linenum = 0;
while( fgets( line, sizeof( line ), f ) ){
linenum ++;
if( line[0] == '#' )continue; /* comment */
if( line[0] == '\n' )continue; /* none */
chomp( line );
replaceString( line, '\t' , ' ' );
{
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_tblen ){
print( "ITEM_tbl full:%d err !!\n" , itemid );
}else if( ITEM_tbl[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[itemid].itm, &itm, sizeof(ITEM_Item));
ITEM_tbl[itemid].use = TRUE;
for( i=0 ; i< ITEM_DATAINTNUM ; i++ ){
ITEM_tbl[itemid].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:
#ifdef _PROFESSION_SKILL // WON ADD 人物职业技能
{
int i=0;
// 勇士职业技能二刀流
for( i=0; i<CHAR_SKILLMAXHAVE; i++ ){
char *skill_name="\0";
// 技能ID
int skillid = CHAR_getCharSkill( charaindex, i);
int Pskillid = PROFESSION_SKILL_getskillArray( skillid);
if( Pskillid <= 0 ) continue;
// 技能名称
skill_name = PROFESSION_SKILL_getChar( Pskillid, PROFESSION_SKILL_FUNCNAME);
if( skill_name == "\0" ) continue;
// 二刀流
if( (strcmp( skill_name , "PROFESSION_DUAL_WEAPON" )) == 0 ){
int get_item = BATTLE_GetWepon( charaindex );
if( get_item != ITEM_BOW ){
int right_hand = CHAR_getItemIndex( charaindex, CHAR_ARM );
int left_hand = CHAR_getItemIndex( charaindex, CHAR_EQSHIELD );
if( right_hand < 0 ) return CHAR_ARM;
else{
if( left_hand < 0 ) return CHAR_EQSHIELD;
else return CHAR_ARM;
}
}
}
}
}
#endif
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:
#ifdef _ITEM_EQUITSPACE
if( CHAR_getItemIndex( charaindex, CHAR_EQSHIELD ) > 0 ) return -1;
#endif
return CHAR_ARM;
break;
#ifdef _ITEM_EQUITSPACE
case ITEM_WBELT:
return CHAR_EQBELT;
break;
case ITEM_WSHIELD:
if( BATTLE_GetWepon( charaindex ) != ITEM_BOW )
return CHAR_EQSHIELD;
break;
case ITEM_WSHOES:
return CHAR_EQSHOES;
break;
#endif
#ifdef _EQUIT_NEWGLOVE
case ITEM_WGLOVE:
return CHAR_EQGLOVE;
break;
#endif
default:
break;
}
return -1;
}
#define ITEMSTRINGBUFSIZ 512
static 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) );
/*if( leaklevel >= 2 )
{
static struct Showparamint{
char* name;
int intindex;
}showparamint[]={
{ "ATK" , ITEM_MODIFYATTACK },
{ "DEF" , ITEM_MODIFYDEFENCE },
{ "HP" , ITEM_MODIFYHP },
{ "MP" , ITEM_MODIFYMP },
{ "QUICK" , ITEM_MODIFYQUICK },
{ "LUCK" , ITEM_MODIFYLUCK },
{ "CHARM" , ITEM_MODIFYCHARM },
};
int i;
int stringlen=0;
paramshow[0] = '\0';
for( i = 0 ; i < arraysizeof( showparamint ); i ++ ){
int value;
char sign;
char tmpbuf[128];
value = ITEM_getInt(itemindex,showparamint[i].intindex);
#ifdef _PROFESSION_SKILL // WON ADD 人物职业技能
#endif
if( value == 0 )continue;
else if( value > 0 ) sign = '+';
else sign = '-';
snprintf( tmpbuf,sizeof( tmpbuf ), "%s%c%d ",
showparamint[i].name,sign,ABS(value) );
strcpysafe( paramshow + stringlen ,
sizeof(paramshow) - stringlen, tmpbuf );
stringlen +=strlen(tmpbuf);
if( stringlen >= arraysizeof( paramshow ))
break;
}
dchop( paramshow , " " );
}
else*/
paramshow[0] = '\0';
}
/*else{
if(strlen(ITEM_getChar(itemindex,ITEM_SECRETNAME)) > 0){
makeEscapeString(ITEM_getChar(itemindex,ITEM_SECRETNAME),escapename,sizeof(escapename));
}
else makeEscapeString( ITEM_getChar(itemindex,ITEM_NAME),escapename,sizeof(escapename));
paramshow[0] = '\0';
}*/
makeEscapeString( ITEM_getChar( itemindex, ITEM_EFFECTSTRING),
escapeeffectstring,
sizeof(escapeeffectstring));
int itemtime = ITEM_getInt(itemindex,ITEM_TIME);
if(itemtime>0){
time_t timep;
struct tm *p;
timep = itemtime;
p=localtime(&timep);
int year=1900+p->tm_year;
int mon=1+p->tm_mon;
int date=p->tm_mday;
int hour=p->tm_hour;
int min=p->tm_min;
int sec=p->tm_sec;
char monbuf[5],datebuf[5],hourbuf[5],minbuf[5],secbuf[5];
if(mon<10) sprintf(monbuf,"0%d",mon);
else sprintf(monbuf,"%d",mon);
if(date<10) sprintf(datebuf,"0%d",date);
else sprintf(datebuf,"%d",date);
if(hour<10) sprintf(hourbuf,"0%d",hour);
else sprintf(hourbuf,"%d",hour);
if(min<10) sprintf(minbuf,"0%d",min);
else sprintf(minbuf,"%d",min);
if(sec<10) sprintf(secbuf,"0%d",sec);
else sprintf(secbuf,"%d",sec);
char tmbuf[256];
strcpy(tmbuf,escapeeffectstring);
sprintf(escapeeffectstring,"有效期:%d.%s.%s %s:%s:%s %s",year,monbuf,datebuf,hourbuf,minbuf,secbuf,tmbuf);
}
#ifdef _ITEM_COLOER
itemcolor = ITEM_getInt( itemindex, ITEM_COLOER);
#else
itemcolor = CHAR_COLORWHITE;
#endif
if( strlen( ITEM_getChar( itemindex, ITEM_CDKEY)) != 0 ) {
itemcolor = CHAR_COLORGREEN;
}else {
if( ITEM_getInt( itemindex, ITEM_MERGEFLG) ) {
itemcolor = CHAR_COLORYELLOW;
}
}
#ifdef _DROPITEM_COLOR
if(ITEM_getInt( itemindex, ITEM_VANISHATDROP) == 1 ){
itemcolor = CHAR_COLORGREEN2;
}
#endif
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
#ifdef _ALCHEMIST
char INGNAME0[16];
char INGNAME1[16];
strcpy( INGNAME0, ITEM_getChar( itemindex, ITEM_INGNAME0) );
strcpy( INGNAME1, ITEM_getChar( itemindex, ITEM_INGNAME1) );
if( (INGNAME0[0] != '\0' && INGNAME1[0] != '\0') || (INGNAME0[0] == '\0') ) {
strcpy( INGNAME0, "" );
}
#endif
if( haveitemindex == -1 ) {
#ifdef _ADD_SHOW_ITEMDAMAGE // WON ADD 显示物品耐久度
char buff1[256];
int crushe = ITEM_getInt( itemindex, ITEM_DAMAGECRUSHE);
int maxcrushe = ITEM_getInt( itemindex, ITEM_MAXDAMAGECRUSHE);
if(crushe < 1) crushe = 1;
if(maxcrushe < 1){
sprintf(buff1, "不会损坏"); //不会损坏
}else{
maxcrushe = maxcrushe/1000;
crushe = crushe/1000;
if( maxcrushe <= 0 ) maxcrushe = 1;
snprintf(buff1, sizeof(buff1), "%d%%", (int)((crushe*100)/maxcrushe) );
}
snprintf(ITEM_itemStatusStringBuffer,
sizeof( ITEM_itemStatusStringBuffer),
#ifdef _ITEM_PILENUMS
#ifdef _PET_ITEM
"%s|%s|%d|%s|%d|%d|%d|%d|%d|%s|%d|%s|%d|",
#else
#ifdef _ALCHEMIST
"%s|%s|%d|%s|%d|%d|%d|%d|%d|%s|%d|%s",
#else
"%s|%s|%d|%s|%d|%d|%d|%d|%d|%s|%d",
#endif
#endif
#else
"%s|%s|%d|%s|%d|%d|%d|%d|%d|%s",
#endif
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,
buff1
#ifdef _ITEM_PILENUMS
,ITEM_getInt( itemindex, ITEM_USEPILENUMS)
#ifdef _ALCHEMIST
,INGNAME0 //,ITEM_getInt( itemindex, ITEM_ALCHEMIST)
#ifdef _PET_ITEM
, ITEM_getInt( itemindex, ITEM_TYPE)
#endif
#endif
#endif
);
#else
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
);
#endif
}else {
#ifdef _ADD_SHOW_ITEMDAMAGE // WON ADD 显示物品耐久度
char buff1[256];
int crushe = ITEM_getInt( itemindex, ITEM_DAMAGECRUSHE);
int maxcrushe = ITEM_getInt( itemindex, ITEM_MAXDAMAGECRUSHE);
if(crushe < 1) crushe = 1;
if(maxcrushe < 1){
sprintf(buff1, "不会损坏"); //不会损坏
}else{
maxcrushe = maxcrushe/1000;
crushe = crushe/1000;
if( maxcrushe <= 0 ) maxcrushe = 1;
snprintf(buff1, sizeof(buff1), "%d%%", (int)((crushe*100)/maxcrushe) );
}
snprintf(ITEM_itemStatusStringBuffer, sizeof( ITEM_itemStatusStringBuffer),
#ifdef _ITEM_PILENUMS
#ifdef _PET_ITEM
"%s|%s|%d|%s|%d|%d|%d|%d|%d|%s|%d|%s|%d|",
#else
#ifdef _ALCHEMIST
"%s|%s|%d|%s|%d|%d|%d|%d|%d|%s|%d|%s",
#else
"%s|%s|%d|%s|%d|%d|%d|%d|%d|%s|%d",
#endif
#endif
#else
"%s|%s|%d|%s|%d|%d|%d|%d|%d|%s",
#endif
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,
buff1
#ifdef _ITEM_PILENUMS
,ITEM_getInt( itemindex, ITEM_USEPILENUMS)
#ifdef _ALCHEMIST
,INGNAME0 //,ITEM_getInt( itemindex, ITEM_ALCHEMIST)
#ifdef _PET_ITEM
, ITEM_getInt( itemindex, ITEM_TYPE)
#endif
#endif
#endif
);
#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
);
#endif
}
return ITEM_itemStatusStringBuffer;
}
char* ITEM_makeItemFalseString( void )
{
#ifdef _ADD_SHOW_ITEMDAMAGE // WON ADD 显示物品耐久度
strcpysafe( ITEM_itemStatusStringBuffer,
sizeof( ITEM_itemStatusStringBuffer),
#ifdef _ITEM_PILENUMS
#ifdef _ALCHEMIST
#ifdef _PET_ITEM
"|||||||||||||"
#else
"|||||||||||"
#endif
#else
"||||||||||"
#endif
#else
"|||||||||"
#endif
);
#else
strcpysafe( ITEM_itemStatusStringBuffer,
sizeof( ITEM_itemStatusStringBuffer),
"||||||||" );
#endif
return ITEM_itemStatusStringBuffer;
}
char* ITEM_makeItemFalseStringWithNum( int haveitemindex )
{
#ifdef _ADD_SHOW_ITEMDAMAGE // WON ADD 显示物品耐久度
snprintf( ITEM_itemStatusStringBuffer, sizeof( ITEM_itemStatusStringBuffer),
#ifdef _ITEM_PILENUMS
#ifdef _ALCHEMIST
"%d||||||||||||",
#else
"%d|||||||||||",
#endif
#else
"%d||||||||||",
#endif
haveitemindex );
#else
snprintf( ITEM_itemStatusStringBuffer, sizeof( ITEM_itemStatusStringBuffer),
"%d|||||||||", haveitemindex);
#endif
return ITEM_itemStatusStringBuffer;
}
BOOL ITEM_makeItem( ITEM_Item* itm, int number )
{
int i;
if( ITEM_CHECKITEMTABLE(number) == FALSE ){
print(" Can't makeItem for itemid:%d!!\n", number);
return FALSE;
}
memcpy( itm, &ITEM_tbl[number].itm , sizeof( ITEM_Item ) ); //new
for( i=0 ; i<ITEM_DATAINTNUM ; i++ ){
int randomvalue;
randomvalue = RAND(0,ITEM_tbl[number].randomdata[i]); //new
itm->data[i] = ITEM_tbl[number].itm.data[i] + randomvalue; //new
}
itm->data[ITEM_LEAKLEVEL] = 1;
return TRUE;
}
int ITEM_makeItemAndRegist( int number )
{
ITEM_Item itm;
memset( &itm, 0, sizeof( itm));
if( ITEM_makeItem( &itm, number ) == FALSE )
return -1;
return ITEM_initExistItemsOne( &itm );
}
#define EQUIP_FIX_MAX 10000000
void ITEM_equipEffect( int index )
{
int i;
int attribaccum[4] = { 0,0,0,0};
#ifdef _ANGEL_SUMMON
int angelmode, angelequip =0;
#endif
static struct itmeffectstruct{
int itemdataintindex;
int charmodifyparamindex;
int accumulation;
int min;
int max;
int type;
}itemEffect[]={
{ ITEM_MODIFYATTACK, CHAR_WORKATTACKPOWER, 0, 0, EQUIP_FIX_MAX, 0},
{ ITEM_MODIFYDEFENCE, CHAR_WORKDEFENCEPOWER, -100, 0, EQUIP_FIX_MAX, 0},
{ ITEM_MODIFYQUICK, CHAR_WORKQUICK, -100, 0, EQUIP_FIX_MAX, 0},
{ ITEM_MODIFYHP, CHAR_WORKMAXHP, 0, 0, EQUIP_FIX_MAX, 0},
{ ITEM_MODIFYMP, CHAR_WORKMAXMP, 0, 0, 1000, 0}, // MP 反100引匹
{ ITEM_MODIFYLUCK, CHAR_WORKFIXLUCK, 0, 1, 5, 0},
{ ITEM_MODIFYCHARM, CHAR_WORKFIXCHARM, 0, 0, 100, 0},
{ ITEM_MODIFYAVOID, CHAR_WORKFIXAVOID, 0, 0, EQUIP_FIX_MAX, 0},
{ ITEM_POISON, CHAR_WORKMODPOISON, 0, -100, 100, 0},
{ ITEM_PARALYSIS, CHAR_WORKMODPARALYSIS, 0, -100, 100, 0},
{ ITEM_SLEEP, CHAR_WORKMODSLEEP, 0, -100, 100, 0},
{ ITEM_STONE, CHAR_WORKMODSTONE, 0, -100, 100, 0},
{ ITEM_DRUNK, CHAR_WORKMODDRUNK, 0, -100, 100, 0},
{ ITEM_CONFUSION, CHAR_WORKMODCONFUSION, 0, -100, 100, 0},
{ ITEM_CRITICAL, CHAR_WORKMODCRITICAL, 0, -100, 100, 0},
#ifdef _ADD_DEAMGEDEFC
{ ITEM_OTHERDAMAGE, CHAR_WORKOTHERDMAGE, 0, -100, 100, 0},
{ ITEM_OTHERDEFC, CHAR_WORKOTHERDEFC, 0, -100, 100, 0},
#endif
#ifdef _ITEMSET5_TXT
{ ITEM_MODIFYARRANGE, CHAR_WORKFIXARRANGE, 0, 0, 1000, 0},
{ ITEM_MODIFYSEQUENCE, CHAR_WORKFIXSEQUENCE, 0, 0, 100, 1},
{ ITEM_ATTACHPILE, CHAR_WORKATTACHPILE, 0, 0, 10, 1},
{ ITEM_HITRIGHT, CHAR_WORKHITRIGHT, 0, 0, 40, 1},
#endif
#ifdef _ITEMSET6_TXT
{ ITEM_NEGLECTGUARD, CHAR_WORKNEGLECTGUARD, 0, 0, 30, 1},
#endif
};
for( i = 0 ; i < arraysizeof( itemEffect ); i ++ )
itemEffect[i].accumulation = 0;
if( !CHAR_CHECKINDEX(index) )return;
#ifdef _ANGEL_SUMMON
angelmode = CHAR_getWorkInt( index, CHAR_WORKANGELMODE);
#endif
for( i = 0 ; i < CHAR_EQUIPPLACENUM ; i ++ ){
#ifdef _ALLBLUES_LUA_1_9
if( CHAR_getInt( index, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ){
if(EquipEffectFunction(index, i) == FALSE){
continue;
}
}
#endif
int id = CHAR_getItemIndex(index,i);
if( ITEM_CHECKINDEX(id) ){
int j;
int attrib = 0;
#ifdef _PROFESSION_SKILL // WON ADD 人物职业技能
if( i == CHAR_ARM
#ifdef _WAN_FIX
&& CHAR_getWorkInt(index,CHAR_WORKBATTLEINDEX)==-1
#endif
){
#ifdef _WAN_FIX
if(CHAR_getWorkInt(index,CHAR_WORKBATTLEPROTYPE)==1)
CHAR_setWorkInt(index,CHAR_WORKBATTLEPROTYPE,0);
else
#endif
CHAR_sendStatusString( index , "S");
}
#endif
for( j=0; j < arraysizeof( itemEffect ); j ++ ) {
#ifdef _PROFESSION_SKILL // WON ADD 人物职业技能
if( i == CHAR_EQSHIELD && CHAR_getInt( index, CHAR_WHICHTYPE) != CHAR_TYPEPET){
int item_type = ITEM_FIST;
item_type = ITEM_getInt( id, ITEM_TYPE );
// 当左手装备武器的时候
if( item_type != ITEM_WSHIELD ){
int k;
// 勇士职业技能二刀流
for( k=0; k<CHAR_SKILLMAXHAVE; k++ ){
char *skill_name="\0";
// 技能ID
int skillid = CHAR_getCharSkill( index, k);
int Pskillid = PROFESSION_SKILL_getskillArray( skillid);
if( Pskillid <= 0 ) continue;
// 技能名称
skill_name = PROFESSION_SKILL_getChar( Pskillid, PROFESSION_SKILL_FUNCNAME);
if( skill_name == "\0" ) continue;
// 二刀流
if( (strcmp( skill_name , "PROFESSION_DUAL_WEAPON" )) == 0 ){
int skill=k, skill_level=0, rate=0, value=0;
CHAR_HaveSkill* hskill;
// 人物技能等级
hskill = CHAR_getCharHaveSkill( index, skill );
skill_level = SKILL_getInt( &hskill->skill, SKILL_LEVEL);
skill_level = PROFESSION_CHANGE_SKILL_LEVEL_A( skill_level );
rate = (skill_level * 3 + 20);
value = ITEM_getInt( id, itemEffect[j].itemdataintindex ) * rate / 100;
itemEffect[j].accumulation += value;
}
}
}else
itemEffect[j].accumulation += ITEM_getInt( id, itemEffect[j].itemdataintindex );
}else
#endif
itemEffect[j].accumulation += ITEM_getInt( id, itemEffect[j].itemdataintindex );
}
attrib = ITEM_getInt( id, ITEM_MODIFYATTRIB);
if( attrib > 0 && attrib < 5) {
attribaccum[attrib - 1] += ITEM_getInt( id, ITEM_MODIFYATTRIBVALUE);
}
#ifdef _ANGEL_SUMMON
//if( !strcmp( ITEM_getChar( id, ITEM_USEFUNC), "ITEM_AngelToken") ) {
if( ITEM_getInt( id, ITEM_ID) == ANGELITEM ) {
//print(" 使者信物装备中 ");
angelequip = TRUE;
}
#endif
}
}
#ifdef _WAN_FIX
if(CHAR_getWorkInt(index,CHAR_WORKBATTLEPROTYPE)==1 && CHAR_getWorkInt(index,CHAR_WORKBATTLEINDEX)==-1)
CHAR_setWorkInt(index,CHAR_WORKBATTLEPROTYPE,0);
#endif
#ifdef _ANGEL_SUMMON
if( angelmode == TRUE && angelequip == FALSE ) {
CHAR_setWorkInt( index, CHAR_WORKANGELMODE, FALSE);
CHAR_sendAngelMark( CHAR_getWorkInt( index, CHAR_WORKOBJINDEX), 0);
print(" 卸下使者信物 ");
}
if( angelmode == FALSE && angelequip == TRUE ) {
CHAR_setWorkInt( index, CHAR_WORKANGELMODE, TRUE);
CHAR_sendAngelMark( CHAR_getWorkInt( index, CHAR_WORKOBJINDEX), 1);
CHAR_talkToCli( index, -1, "你受到了精灵保护,不会被敌人攻击。", CHAR_COLORYELLOW );
print(" 装备使者信物 ");
}
#endif
#ifdef _FIX_MAXCHARMP
for(i = 3 ; i < arraysizeof( itemEffect ) ; i ++ ){
#else
for(i = 5 ; i < arraysizeof( itemEffect ) ; i ++ ){
#endif
int work=0;
if( itemEffect[i].type == 1 ){
work = itemEffect[i].accumulation;
}else{
work = CHAR_getWorkInt(index,itemEffect[i].charmodifyparamindex) + itemEffect[i].accumulation;
work = min( itemEffect[i].max, work );
work = max( itemEffect[i].min, work );
}
CHAR_setWorkInt( index, itemEffect[i].charmodifyparamindex, work );
}
for( i = 0; i < 4; i ++ ) {
CHAR_setWorkInt( index, CHAR_WORKFIXEARTHAT + i,
CHAR_getWorkInt( index, CHAR_WORKFIXEARTHAT + i) +
attribaccum[i]);
}
for( i = 0; i < 4; i ++ ) {
int j;
for( j = 0; j < 4; j ++ ) {
if( i != j ) {
CHAR_setWorkInt( index, CHAR_WORKFIXEARTHAT + j,
CHAR_getWorkInt(index, CHAR_WORKFIXEARTHAT + j) - attribaccum[i]);
}
}
}
for( i = 0; i < 4; i ++ ) {
if( CHAR_getWorkInt( index, CHAR_WORKFIXEARTHAT + i) > CHAR_MAXATTRIB) {
CHAR_setWorkInt( index, CHAR_WORKFIXEARTHAT + i, CHAR_MAXATTRIB);
}
}
{
int work;
work = CHAR_getWorkInt(index,CHAR_WORKFIXSTR)+ itemEffect[0].accumulation;
CHAR_setWorkInt( index, CHAR_WORKFIXSTR, max( 0, work ) );
work = CHAR_getWorkInt(index,CHAR_WORKFIXTOUGH) + itemEffect[1].accumulation;
CHAR_setWorkInt( index, CHAR_WORKFIXTOUGH, max( -100, work ) );
work = CHAR_getWorkInt( index, CHAR_WORKFIXDEX) + itemEffect[2].accumulation;
CHAR_setWorkInt( index, CHAR_WORKFIXDEX, max( -100, work ) );
}
}
void Other_DefcharWorkInt( int index)
{
#ifdef _SUIT_ITEM
int mfix,mtgh,mdex,mods,maxhp;
mfix = CHAR_getWorkInt( index, CHAR_WORKFIXSTR);
mtgh = CHAR_getWorkInt( index, CHAR_WORKFIXTOUGH);
mdex = CHAR_getWorkInt( index, CHAR_WORKFIXDEX);
maxhp = CHAR_getWorkInt( index, CHAR_WORKMAXHP);
mods = CHAR_getWorkInt( index, CHAR_WORKSUITMODSTR);
mfix = mfix+((mfix*mods)/100);
CHAR_setWorkInt( index, CHAR_WORKFIXSTR, mfix+CHAR_getWorkInt( index, CHAR_WORKSUITSTR));
CHAR_setWorkInt( index, CHAR_WORKFIXTOUGH, mtgh+CHAR_getWorkInt( index, CHAR_WORKSUITTGH));
CHAR_setWorkInt( index, CHAR_WORKFIXDEX, mdex+CHAR_getWorkInt( index, CHAR_WORKSUITDEX));
CHAR_setWorkInt( index, CHAR_WORKMAXHP, maxhp+ CHAR_getWorkInt( index, CHAR_WORKSUITVIT));
#ifdef _SUIT_ADDPART3
if( mfix > 0 )
CHAR_setWorkInt( index, CHAR_WORKFIXSTR, CHAR_getWorkInt( index, CHAR_WORKFIXSTR)+mfix*CHAR_getWorkInt( index, CHAR_WORKSUITSTR_P)/100.0);
if( mtgh > 0 )
CHAR_setWorkInt( index, CHAR_WORKFIXTOUGH, CHAR_getWorkInt( index, CHAR_WORKFIXTOUGH)+mtgh*CHAR_getWorkInt( index, CHAR_WORKSUITTGH_P)/100.0);
if( mdex > 0)
CHAR_setWorkInt( index, CHAR_WORKFIXDEX, CHAR_getWorkInt( index, CHAR_WORKFIXDEX)+mdex*CHAR_getWorkInt( index, CHAR_WORKSUITDEX_P)/100.0);
#endif
#endif//_SUIT_ITEM
#ifdef _MAGIC_RESIST_EQUIT // WON ADD 职业抗性装备
/*{
int f_res = -1, i_res = -1, t_res = -1;
f_res = CHAR_getWorkInt( index, CHAR_WORK_F_RESIST );
i_res = CHAR_getWorkInt( index, CHAR_WORK_I_RESIST );
t_res = CHAR_getWorkInt( index, CHAR_WORK_T_RESIST );
CHAR_setWorkInt( index, CHAR_WORK_F_RESIST, f_res+CHAR_getWorkInt( index, CHAR_WORK_F_SUIT ) );
CHAR_setWorkInt( index, CHAR_WORK_I_RESIST, i_res+CHAR_getWorkInt( index, CHAR_WORK_I_SUIT ) );
CHAR_setWorkInt( index, CHAR_WORK_T_RESIST, t_res+CHAR_getWorkInt( index, CHAR_WORK_T_SUIT ) );
}*/
#endif
#ifdef _PETSKILL_SETDUCK
//profession fix
//使用回避招式时,会将防值减去30%然後设定成回避值,奇怪的设定,也造成原本设定的回避值跟没设一样,因此我(Change)先把整段拿掉
/*if( CHAR_getWorkInt( index, CHAR_MYSKILLDUCK) > 0 ){
int mtgh = CHAR_getWorkInt( index, CHAR_WORKFIXTOUGH);
mtgh -= (mtgh*30)/100;
if( mtgh < 0 ) mtgh=0;
CHAR_setWorkInt( index, CHAR_MYSKILLDUCKPOWER, mtgh);
}*/
#endif
#ifdef _MAGICPET_SKILL
if( CHAR_getWorkInt( index, CHAR_MYSKILLSTR) > 0 ){
int mpower, mdef;
mpower = CHAR_getWorkInt( index, CHAR_WORKFIXSTR);
mdef = CHAR_getWorkInt( index, CHAR_MYSKILLSTRPOWER);
mpower += (mtgh*mdef)/100;
if( mtgh < 0 ) mtgh=0;
CHAR_setWorkInt( index, CHAR_WORKFIXSTR, mpower);
}
if( CHAR_getWorkInt( index, CHAR_MYSKILLTGH) > 0 ){
int mpower, mdef;
mpower = CHAR_getWorkInt( index, CHAR_WORKFIXTOUGH);
mdef = CHAR_getWorkInt( index, CHAR_MYSKILLTGHPOWER);
mpower += (mtgh*mdef)/100;
if( mtgh < 0 ) mtgh=0;
CHAR_setWorkInt( index, CHAR_WORKFIXTOUGH, mpower);
}
if( CHAR_getWorkInt( index, CHAR_MYSKILLDEX) > 0 ){
int mpower, mdef;
mpower = CHAR_getWorkInt( index, CHAR_WORKFIXDEX);
mdef = CHAR_getWorkInt( index, CHAR_MYSKILLDEXPOWER);
mpower += (mtgh*mdef)/100;
if( mtgh < 0 ) mtgh=0;
CHAR_setWorkInt( index, CHAR_WORKFIXDEX, mpower);
}
#endif
#ifdef _PROFESSION_SKILL // WON ADD 人物职业技能
if( CHAR_getWorkInt( index, CHAR_MYSKILLHIT) > 0 ){
int mpower, mdef;
mpower = CHAR_getWorkInt( index, CHAR_MYSKILLHIT);
mdef = CHAR_getWorkInt( index, CHAR_WORKHITRIGHT);
mpower += (mtgh*mdef)/100;
if( mtgh < 0 ) mtgh=0;
CHAR_setWorkInt( index, CHAR_MYSKILLHIT, mpower);
}
if( CHAR_getWorkInt( index, CHAR_WORK_WEAPON) > 0 ){ // 武器专精
int mpower, mdef;
mpower = CHAR_getWorkInt( index, CHAR_WORKFIXSTR);
mdef = CHAR_getWorkInt( index, CHAR_WORKMOD_WEAPON);
mpower = mpower * ( 100 + mdef ) /100;
if( mtgh < 0 ) mtgh=0;
CHAR_setWorkInt( index, CHAR_WORKFIXSTR, mpower);
}
#endif
#ifdef _VARY_WOLF
if(CHAR_getInt( index, CHAR_BASEIMAGENUMBER)==101428){
int Rands=0, power;
Rands = CHAR_getWorkInt( index, CHAR_SKILLSTRPOWER);
power = CHAR_getWorkInt( index, CHAR_WORKFIXSTR);
power = power + (power*Rands)/100;
CHAR_setWorkInt( index, CHAR_WORKFIXSTR, power);
Rands = CHAR_getWorkInt( index, CHAR_SKILLDEXPOWER);
power = CHAR_getWorkInt( index, CHAR_WORKFIXDEX);
power = power + (power*Rands)/100;
CHAR_setWorkInt( index, CHAR_WORKFIXDEX, power);
}
#endif
#ifdef _PROFESSION_ADDSKILL
if( CHAR_getWorkInt( index, CHAR_WORKFEAR ) > 0 ){
CHAR_setWorkInt( index, CHAR_WORKFIXSTR, CHAR_getWorkInt( index, CHAR_WORKFIXSTR ) - mfix*0.1 );
CHAR_setWorkInt( index, CHAR_WORKFIXTOUGH, CHAR_getWorkInt( index, CHAR_WORKFIXTOUGH ) - mtgh*0.1 );
CHAR_setWorkInt( index, CHAR_WORKFIXDEX, CHAR_getWorkInt( index, CHAR_WORKFIXDEX ) - mdex*0.2 );
}
#endif
#ifdef _MAGIC_WEAKEN
if(CHAR_getWorkInt(index,CHAR_WORKWEAKEN)>0){
CHAR_setWorkInt( index, CHAR_WORKFIXSTR, CHAR_getWorkInt( index, CHAR_WORKFIXSTR)*0.8);
CHAR_setWorkInt( index, CHAR_WORKFIXTOUGH, CHAR_getWorkInt( index, CHAR_WORKFIXTOUGH)*0.8);
CHAR_setWorkInt( index, CHAR_WORKFIXDEX, CHAR_getWorkInt( index, CHAR_WORKFIXDEX)*0.8);
CHAR_setWorkInt( index, CHAR_WORKWEAKEN, CHAR_getWorkInt( index, CHAR_WORKWEAKEN)-1);
}
#endif
#ifdef _MAGIC_BARRIER// vincent 精灵:魔障
if( CHAR_getWorkInt( index, CHAR_WORKBARRIER) > 0){
CHAR_setWorkInt( index, CHAR_WORKBARRIER, CHAR_getWorkInt( index, CHAR_WORKBARRIER) - 1);
}
#endif
CHAR_setWorkInt(index, CHAR_WORKATTACKPOWER, CHAR_getWorkInt( index, CHAR_WORKFIXSTR ) );
CHAR_setWorkInt(index, CHAR_WORKDEFENCEPOWER, CHAR_getWorkInt( index, CHAR_WORKFIXTOUGH ) );
CHAR_setWorkInt(index, CHAR_WORKQUICK, CHAR_getWorkInt( index, CHAR_WORKFIXDEX ) );
}
char* ITEM_getAppropriateName(int itemindex)
{
int nameindex;
if( !ITEM_CHECKINDEX(itemindex ) )return "\0";
if( ITEM_getInt(itemindex,ITEM_LEAKLEVEL) <= 0 )
nameindex = ITEM_NAME;
else
nameindex = ITEM_SECRETNAME;
return ITEM_getChar(itemindex,nameindex);
}
char* ITEM_getEffectString( int itemindex )
{
if( !ITEM_CHECKINDEX(itemindex))return "\0";
return ITEM_item[itemindex].itm.string[ITEM_EFFECTSTRING].string;
}
char *ITEM_getItemInfoFromNumber( int itemid )
{
return ITEMTBL_getChar( itemid, ITEM_EFFECTSTRING);
}
INLINE char* _ITEM_getNameFromNumber( char *file, int line, int itemid )
{
if( ITEM_CHECKITEMTABLE(itemid) == FALSE ){
print("Can't Get ItemTable for:%d! - %s:%d\n",itemid, file, line);
return "\0";
}
return ITEMTBL_getChar( itemid, ITEM_NAME);
}
int ITEM_getcostFromITEMtabl( int itemid )
{
return ITEMTBL_getInt( itemid, ITEM_COST);
}
int ITEM_getlevelFromITEMtabl( int itemid )
{
return ITEMTBL_getInt( itemid, ITEM_LEVEL);
}
int ITEM_getgraNoFromITEMtabl( int itemid )
{
return ITEMTBL_getInt( itemid, ITEM_BASEIMAGENUMBER);
}
int ITEM_getcanpetmailFromITEMtabl( int itemid )
{
return ITEMTBL_getInt( itemid, ITEM_CANPETMAIL);
}
int ITEM_getvanishatdropFromITEMtabl( int itemid )
{
return ITEMTBL_getInt( itemid, ITEM_VANISHATDROP);
}
int ITEM_getdropatlogoutFromITEMtabl( int itemid )
{
return ITEMTBL_getInt( itemid, ITEM_DROPATLOGOUT);
}
int ITEM_getmergeItemFromFromITEMtabl( int itemid )
{
return ITEMTBL_getInt( itemid, ITEM_CANMERGEFROM);
}
BOOL ITEM_canuseMagic( int itemindex)
{
if( !ITEM_CHECKINDEX(itemindex))return FALSE;
if( MAGIC_getMagicArray( ITEM_item[itemindex].itm.data[ITEM_MAGICID]) != -1 ) {
return TRUE;
}
return FALSE;
}
INLINE ITEM_Item *ITEM_getItemPointer( int index )
{
if(!ITEM_CHECKINDEX(index))return NULL;
return &ITEM_item[index].itm;
}
int ITEM_isTargetValid( int charaindex, int itemindex, int toindex)
{
int itemtarget;
int Myside;
itemtarget = ITEM_getInt( itemindex, ITEM_TARGET );
Myside = CHAR_getWorkInt( charaindex, CHAR_WORKBATTLESIDE );
if ((toindex >= 0x0) && (toindex <= 0x13)) return 0;
if (toindex == 0x14) {//20 右下全 0
if (itemtarget == ITEM_TARGET_ALLMYSIDE){
if( Myside == 0 )return 0;
}else if(itemtarget == ITEM_TARGET_ALLOTHERSIDE ){
if( Myside == 1 )return 0;
}
}else if (toindex == 0x15) {//21 左上全 1
if (itemtarget == ITEM_TARGET_ALLMYSIDE){
if( Myside == 1 )return 0;
}else if( itemtarget == ITEM_TARGET_ALLOTHERSIDE ){
if( Myside == 0 )return 0;
}
}else if (toindex == 0x16) {
if (itemtarget == ITEM_TARGET_ALL)
return 0;
}
return -1;
}
// Nuke end
#ifdef _ITEM_CHECKWARES
BOOL CHAR_CheckInItemForWares( int charaindex, int flg)
{
int itemindex, i;
char token[256];
for( i=0; i<24; i++) {
itemindex = CHAR_getItemIndex( charaindex, i);
if( !ITEM_CHECKINDEX( itemindex) ) continue;
if( ITEM_getInt( itemindex, ITEM_TYPE) == ITEM_WARES ) {
if( flg == 0 ){
return FALSE;
}
sprintf(token,"交出%s",ITEM_getChar( itemindex, ITEM_NAME));
CHAR_talkToCli( charaindex, -1, token, CHAR_COLORYELLOW);
CHAR_setItemIndex( charaindex, i ,-1);
ITEM_endExistItemsOne( itemindex);
CHAR_sendItemDataOne( charaindex, i);
}
}
return TRUE;
}
#endif
int ITEMTBL_getInt( int ItemID, ITEM_DATAINT datatype)
{
if( datatype >= ITEM_DATAINTNUM || datatype < 0 ) return -1;
if( ITEM_CHECKITEMTABLE(ItemID) == FALSE )return -1;
return ITEM_tbl[ItemID].itm.data[datatype]; //new
}
char *ITEMTBL_getChar( int ItemID, ITEM_DATACHAR datatype)
{
if( datatype >= ITEM_DATACHARNUM || datatype < 0 ) return "\0";
if( ITEM_CHECKITEMTABLE(ItemID) == FALSE )return "\0";
return ITEM_tbl[ItemID].itm.string[datatype].string; //new
}
INLINE BOOL ITEM_CHECKITEMTABLE( int number )
{
if( number < 0 || number >= ITEM_tblen ){
//andy_log
print("ITEM_CHECKITEMTABLE() number:%d ITEM_tblen:%d !!\n", number, ITEM_tblen );
return FALSE;
}
return ITEM_tbl[number].use; //new
}
int ITEM_getItemDamageCrusheED( int itemindex)
{
int crushe = ITEM_getInt( itemindex, ITEM_DAMAGECRUSHE);
int maxcrushe = ITEM_getInt( itemindex, ITEM_MAXDAMAGECRUSHE);
if(maxcrushe < 1)return -1;
if( maxcrushe > 1000000) maxcrushe = 1000000;
if( crushe > 1000000) crushe = 1000000;
return ((int) (crushe*100)/maxcrushe);
}
void ITEM_RsetEquit( int charaindex)
{
int i, itemindex, ti=-1;
for( i=0; i<CHAR_STARTITEMARRAY; i++){
itemindex = CHAR_getItemIndex( charaindex , i );
if( !ITEM_CHECKINDEX( itemindex)) continue;
if( i == ITEM_getEquipPlace( charaindex, itemindex ) ) continue;
if( (ti = CHAR_findEmptyItemBox( charaindex )) == -1 ) return;
CHAR_setItemIndex( charaindex , i, -1);
CHAR_setItemIndex( charaindex , ti, itemindex);
}
}
void ITEM_reChangeItemToPile( int itemindex)
{
int itemID;
if( !ITEM_CHECKINDEX(itemindex) ) return;
if( ITEM_getInt( itemindex, ITEM_USEPILENUMS) <= 0 )
ITEM_setInt( itemindex, ITEM_USEPILENUMS, 1);
itemID = ITEM_getInt( itemindex, ITEM_ID);
if( !ITEM_CHECKITEMTABLE( itemID) ) return;
if( itemID == 20284 ) return;//铁枪三另外处理
if( ITEM_getInt( itemindex, ITEM_CANBEPILE) != ITEMTBL_getInt( itemID, ITEM_CANBEPILE) )
ITEM_setInt( itemindex, ITEM_CANBEPILE, ITEMTBL_getInt( itemID, ITEM_CANBEPILE) );
}
void ITEM_reChangeItemName( int itemindex)
{//ITEM_NAME
/*
int itemID;
char *IDNAME;
char *NAME;
if( !ITEM_CHECKINDEX(itemindex) ) return;
itemID = ITEM_getInt( itemindex, ITEM_ID);
if( !ITEM_CHECKITEMTABLE( itemID) ) return;
IDNAME = ITEMTBL_getChar( itemID, ITEM_NAME);
NAME = ITEM_getChar( itemindex, ITEM_NAME);
if( IDNAME==NULL || NAME==NULL ) return;
if( !strcmp( IDNAME, NAME) ) return;
ITEM_setChar( itemindex, ITEM_NAME, IDNAME);
*/
}
#ifdef _PET_ITEM
char* ITEM_petmakeItemStatusString( int petindex, int itemid )
{
char escapeeffectstring[256];
char buff1[256];
int itemcolor = 0;
int itemindex = CHAR_getItemIndex( petindex, itemid );
if( !ITEM_CHECKINDEX(itemindex) ) return "\0";
makeEscapeString( ITEM_getChar( itemindex, ITEM_EFFECTSTRING),
escapeeffectstring,
sizeof(escapeeffectstring));
#ifdef _ITEM_COLOER
itemcolor = ITEM_getInt( itemindex, ITEM_COLOER);
#else
itemcolor = CHAR_COLORWHITE;
#endif
if( strlen( ITEM_getChar( itemindex, ITEM_CDKEY)) != 0 ) {
itemcolor = CHAR_COLORGREEN;
}else {
if( ITEM_getInt( itemindex, ITEM_MERGEFLG) ) {
itemcolor = CHAR_COLORYELLOW;
}
}
int crushe = ITEM_getInt( itemindex, ITEM_DAMAGECRUSHE);
int maxcrushe = ITEM_getInt( itemindex, ITEM_MAXDAMAGECRUSHE);
if(maxcrushe < 1){
sprintf(buff1, "不会损坏"); //不会损坏
}else{
maxcrushe = maxcrushe/1000;
crushe = crushe/1000;
if( maxcrushe <= 0 ) maxcrushe = 1;
snprintf(buff1, sizeof(buff1), "%d%%", (int)((crushe*100)/maxcrushe) );
}
snprintf(ITEM_itemStatusStringBuffer,
sizeof( ITEM_itemStatusStringBuffer),
"%d|%s|%s|%s|%d|%d|",
itemid,
ITEM_getChar( itemindex, ITEM_NAME),
escapeeffectstring,
buff1,
itemcolor,
ITEM_getInt( itemindex, ITEM_BASEIMAGENUMBER) );
return ITEM_itemStatusStringBuffer;
}
#endif