www.pudn.com > SaServer_6.0.zip > configfile.c


#define __CONFIGFILE_C__ 
#include "version.h" 
#include  
#include  
#include  
#include  
 
#include "util.h" 
//#include "configfile.h" 
//ttom 
#include "lssproto_util.h" 
#include "configfile.h" 
#include "net.h" 
//ttom end 
#include "npcutil.h" 
// Arminius 7.12 login announce 
#include "char.h" 
#include "char_data.h" 
// CoolFish: add  
#include "lssproto_serv.h" 
 
#ifdef _ANGEL_SUMMON 
extern struct MissionInfo missionlist[MAXMISSION]; 
extern struct MissionTable missiontable[MAXMISSIONTABLE]; 
#endif 
 
/* ɬÀÃëâç  ÔÊÔÂÑáÕ°   */ 
typedef struct tagConfig 
{ 
    /*Ãó·òºë·ÂØ©  (·ß  ¶Á±å·Æ»§Ð×ÖÐØêÉýÒý·ÖòÍ  */ 
  char    progname[8]; 
  char    configfilename[32]; /* config°×ÑëÄÌ»ï   */ 
    unsigned int debuglevel;   /* ·¸ÌïÓÀºëÒÁì»ï */ 
  unsigned int  usememoryunit;    /*¶ªÆ¹Øø¼°½»ÍßÓÀÐþÈÓÄÌÊõ */ 
  unsigned int  usememoryunitnum; /*¶ªÆ¹Øø¼°½»ÍßÓÀÐþÐÑ */ 
  char    asname[32];         /*ʧÊÐËü¼þÐþÈÓ¡õÌï¼°  ó¡*/ 
  unsigned short  acservport; /*ʧÊÐËü¼þÐþÈÓ¡õÌï¼°ºÌ¡õÐþ  */ 
  char    acpasswd[32];       /*ʧÊÐËü¼þÐþÈÓ¡õÌï³ß¼°Óɵ©·¥¡õÓñ*/ 
  char    gsnamefromas[32];   /* 
                                 * ʧÊÐËü¼þÐþÈÓ¡õÌï¾®ÈÕέÒüÔ 
                                 * ±Ø¡õØ©ÈÓ¡õÌïÎçØÆ»¯¼°  ó¡ 
                                 */ 
                                  
    // Arminius 7.24 manor pk 
  char gsid[32];	// game server chinese id 
  unsigned short allowmanorpk;	// is this server allow manor pk 
  unsigned short port;        /* ÈÓ¡õÌï¼°½÷Çа¾ØêºÌ¡õÐþ */ 
	int				servernumber;	/* ±Ø¡õØ©ÈÓ¡õÌï¼°  į */ 
	int				reuseaddr;	/* Address already used... »¥÷±ÒýÈÕØ¦ÖÐÁݼ°Ð×»§±å */ 
  int             do_nodelay;     /* TCP_NODELAY ±åÔÊÔ¾®Éýµ¤¾® */ 
  int             log_write_time; /* ̤Îå³ðÐÄ·òºëëÔÊÔ¾®Éýµ¤¾®£Û */ 
  int             log_io_time;    /* I/Oòå  ¼°ÁÝÃÞ·´¾®Ô¾®Éýµ¤¾®£Û */ 
  int             log_game_time;  /* ±Ø¡õØ©¼°ÖÊ  òå  ¼°ÁÝÃÞë·´¾®Ô */ 
  int             log_netloop_faster; /* netloop_faster ¼°·òºë */ 
	int				saacwritenum;	/* ʧÊÐËü¼þÐþÈÓ¡õÌï³ß¼°ÖÏÚÐ  ±åwriteÔÊÔ¾® */ 
	int				saacreadnum;	/* ʧÊÐËü¼þÐþÈÓ¡õÌï¾®ÈÕ¼°dispatch ëÖϼÔÔÊÔ¾® */ 
  unsigned short fdnum;           /*Éýľ·ÖØêÎìÉúÛÍÆËÒà¼þëâç  ÔÊÔ¾® */ 
  unsigned int   othercharnum;    /*  ¹«¼°Ö°¼°Æ½Åҷ¼°ÐÑ  */ 
  unsigned int objnum;            /* ×󯤳âÄáÛÍÐþ¼°    ÐÑ*/ 
  unsigned int   petcharnum;   	/* ʸÓÀÐþ¼°ÐÑ    */ 
  unsigned int itemnum;           /* ʧÄÌ  Ø©¼°    ÐÑ*/ 
  unsigned int battlenum;         /* ÌïÐþ»ï¼°    */ 
  unsigned int battleexp;         /* ÌïÐþ»ï¼°    */ 
  char    topdir[32];         	/* ÐþÓÀÃó·¸Å«ÒÁÛÍÐþØø  */ 
  char    mapdir[32];         	/* ѨÓÀÃó·¸Å«ÒÁÛÍÐþØø  */ 
  char    maptilefile[32];    	/* ѨÓÀÃóɬÀð×ÑëÄÌ»ï  */ 
  char    battlemapfile[32];    	/* ÌïÐþ»ïѨÓÀÃóɬÀð×ÑëÄÌ»ï  */ 
  char    itemfile[32];       	/* ʧÄÌ  ةɬÀð×ÑëÄÌ»ï  */ 
  char    invfile[32];        	/*   ³ÄɬÀð×ÑëÄÌ»ï  */ 
  char    appearfile[32];     	/* ÇëòØÞË  ɬÀð×ÑëÄÌ»ï  */ 
	char	titlenamefile[32];		/* ±¹Ä¯°×ÑëÄÌ»ï   */ 
	char	titleconfigfile[32];	/* ±¹Ä¯É¬Àð×ÑëÄÌ»ï   */ 
	char	encountfile[32];		/* ¾Þ¼þÊÐËü¼þÐþɬÀð×ÑëÄÌ»ï   */ 
	char	enemybasefile[32];		/* ³ÄÏæ  ɬÀð×ÑëÄÌ»ï   */ 
	char	enemyfile[32];			/* ³ÄɬÀð×ÑëÄÌ»ï   */ 
	char	groupfile[32];			/* ºë»ï¡õÃóɬÀð×ÑëÄÌ»ï   */ 
	char	magicfile[32];			/* ÈÈÖîɬÀð×ÑëÄÌ»ï   */ 
#ifdef _ATTACK_MAGIC 
  char    attmagicfile[32];       // ¹¥»÷ÐÔÖäÊõ 
#endif 
 
	char	petskillfile[32];		/* ʸÓÀÐþ  ÈÈÖîɬÀð×ÑëÄÌ»ï   */ 
  char    itematomfile[32];       /* ʧÄÌ  Ø©¼°¼ã    °×ÑëÄÌ»ï */ 
  char    effectfile[32];     	/* ÉÒÇëɬÀð×ÑëÄÌ»ï  */ 
  char    quizfile[32];     		/* ÛÍÄÌÊõɬÀð×ÑëÄÌ»ï  */ 
  char    lsgenlog[32];       /*ÈÓ¡õÌï¼°lsgen ʧËüÐþÃóÓÀÐþ°×ÑëÄÌ»ï  */ 
  char    storedir[128];       /*µ©Ðþʧ·¸Å«ÒÁÛÍÐþØø    */ 
  char    npcdir[32];         /*NPC¼°É¬Àð×ÑëÄÌ»ïë  ÈÊ·¸Å«ÒÁÛÍÐþØø   */ 
  char    logdir[32];         /* 
                               * ·òºë·¸Å«ÒÁÛÍÐþØø 
                               */ 
  char    logconfname[32];    /* 
                               * ·òºëɬÀð×ÑëÄÌ»ï   
                               */ 
  char	chatmagicpasswd[32];	/* ÃñÅÒÓÀÐþ  Ü·Óɵ©·¥¡õÓñ */ 
#ifdef _STORECHAR 
  char	storechar[32]; 
#endif 
	unsigned int 	chatmagiccdkeycheck;	/* ÃñÅÒÓÀÐþ  Ü·Æ¥CDKEYëÃñÄáÓÀÛÍÔÊÔ¾® */ 
  unsigned int    filesearchnum;     /*°×ÑëÄÌ»ï븹³ñÆ¥ÎåÔ°×ÑëÄ̻PÐÑ*/ 
  unsigned int    npctemplatenum;     /*NPC¼°  ¼þÃóÒÁ¡õÐþ°×ÑëÄ̻PÐÑ*/ 
  unsigned int    npccreatenum;       /*NPC¼°Ï·Ç²°×ÑëÄ̻PÐÑ*/ 
  unsigned int    walksendinterval;   /* ÐÚÈʼ°Ã«ËªÔÂÃÞØÊ */ 
  unsigned int    CAsendinterval_ms;     /* CAë˪ÔÂÃÞØÊ (ms)*/ 
  unsigned int    CDsendinterval_ms;     /* CDë˪ÔÂÃÞØÊ (ms)*/ 
  unsigned int    Onelooptime_ms;     	/* 1»ï¡õÃó±å¾®ØêÔÂÁÝÃÞ */ 
	unsigned int	Petdeletetime;		/* ʸÓÀÐþ»¥ÛÕ  ÔÊÔÂÁÝÃÞ */ 
	unsigned int	Itemdeletetime;		/* ʧÄÌ  Ø©»¥ÛÕ  ÔÊÔÂÁÝÃÞ */ 
    /* ·òºëÄ̼þ  ¼°Æ½Åҷ¼°±¾¡õƤëÔÊÔÂÃÞØÊ */ 
  unsigned int    CharSavesendinterval; 
  unsigned int    addressbookoffmsgnum;  /* 
                                          * ʧÓñÒÁµ©Æ¤ÓÀÛͱå×ó°×·ÂÄ̼þ 
                                          * ¶ªÓÀ±¾¡õ³âë 
                                          * Ö϶ªÓÀ±¾¡õ³âËáÁùÔ¾® 
                                          */ 
  unsigned int    protocolreadfrequency;  /* 
                                           * Ãó·òÐþÎì»ïëÖÏÁ¢Øø     
                                           * ±å  ¸ê¾® 
                                           */ 
  unsigned int    allowerrornum;          /* 
                                           * ¾Þ·Â¡õëÖÏòÛÒýÆ¥¸¤Ôʾ® 
                                           */ 
  unsigned int    loghour;          		/* 
                                           * ·òºëëâçÐåÔÊÔÂÁÝ¶Ô  £¢ÁÝ   
                                           */ 
  unsigned int    battledebugmsg;    		/* 
                                           * ÌïÐþ»ï  ¼°·¸ÌïÓÀºë¶ªÓÀ±¾¡õ³âëÇëÔʾ®£Û¨ßئÈÕÇë½ñئÖÐ 
                                           */ 
  //ttom add this because the second had this                                          
  unsigned int    encodekey;               
  unsigned int    acwbsize;              
  unsigned int    acwritesize; 
  unsigned int    ErrUserDownFlg; 
  //ttom end 
#ifdef _GMRELOAD 
	char	gmsetfile[32];				/* GMÕʺš¢È¨ÏÞÉ趨µµ */ 
#endif 
#ifdef _ITEM_QUITPARTY 
    char itemquitparty[32]; 
#endif 
 
#ifdef _DEL_DROP_GOLD	 
	unsigned int	Golddeletetime; 
#endif 
#ifdef _NEW_PLAYER_CF 
	int	newplayertrans; 
	int	newplayerlv; 
	int	newplayergivepet[5]; 
	int newplayergiveitem[15]; 
	int	newplayerpetlv; 
	int newplayergivegold; 
	int ridepetlevel; 
#ifdef _VIP_SERVER 
	int	newplayerpetvip; 
#endif 
 
#endif 
#ifdef _USER_EXP_CF 
	char	expfile[64]; 
#endif 
#ifdef _UNLAW_WARP_FLOOR 
	int	unlawwarpfloor[10]; 
#endif 
#ifdef _WATCH_FLOOR 
	int	watchfloor[6]; 
#endif 
#ifdef _BATTLE_FLOOR 
	int	battlefloor[6]; 
#endif 
#ifdef _UNREG_NEMA 
	char	unregname[5][16]; 
#endif 
#ifdef _TRANS_LEVEL_CF 
	int chartrans; 
	int pettrans; 
	int yblevel; 
	int maxlevel; 
#endif 
#ifdef _POINT 
int point; 
	int transpoint[8]; 
#endif 
#ifdef _VIP_SERVER 
	int vippoint; 
#endif 
#ifdef _PET_UP 
	int petup; 
#endif 
#ifdef _LOOP_ANNOUNCE 
	char loopannouncepath[32]; 
	int loopannouncetime; 
	char loopannounce[10][1024]; 
	int loopannouncemax; 
#endif 
#ifdef _SKILLUPPOINT_CF 
	int skup; 
#endif 
#ifdef _RIDELEVEL 
	int ridelevel; 
#endif 
#ifdef _REVLEVEL 
	int revlevel; 
#endif 
#ifdef _NEW_PLAYER_RIDE 
	int npride; 
#endif 
#ifdef _FIX_CHARLOOPS 
	int charloops; 
#endif 
#ifdef _PLAYER_ANNOUNCE 
	int pannounce; 
#endif 
#ifdef _PLAYER_MOVE 
	int pmove; 
#endif 
	int recvbuffer; 
	int sendbuffer; 
	int recvlowatbuffer; 
	int runlevel; 
#ifdef _SHOW_VIP_CF 
	int showvip; 
#endif 
#ifdef _PLAYER_NUM 
	int playernum; 
#endif 
#ifdef _BATTLE_GOLD 
	int battlegold; 
#endif 
#ifdef _ANGEL_TIME 
	int angelplayertime; 
	int angelplayermun; 
#endif 
#ifdef _RIDEMODE_20 
	int ridemode; 
#endif 
#ifdef _FM_POINT_PK 
	int fmpointpk; 
#endif 
#ifdef _ENEMY_ACTION 
	int	enemyact; 
#endif 
 
#ifdef _CHECK_PEPEAT 
	int	CheckRepeat; 
#endif 
	int	cpuuse; 
#ifdef _VIP_ALL 
	int	checkvip; 
#endif 
#ifdef _FM_JOINLIMIT 
	int	joinfamilytime; 
#endif 
}Config; 
 
Config config; 
 
/* 
 *  Îì¼þ°×Å«ºë°×ÑëÄÌ»ïë  ¸êÁݱåÒøµ¤ÑáÕ°   
 *  xxxx=yyyy ÐÄÐ×ÖÐØ¦¼°Ã«  ¸ê 
 */ 
 
typedef struct tagReadConf 
{ 
    char    name[32];       /*xxxx±åؤÐ×Ô°À*/ 
 
    /*ÆÝ¼°2¹´·´NULLë  ľÔÂÎçÖÏÊÖÖÊ  ØÆØ¦ÖÐ*/ 
    char  *charvalue;      /*yyyy빫¼°ÒýÒýÒ½  ÔÊÔÂÁݼ°Ò½  ÛÆ*/ 
    size_t  charsize;       /*charvalue¼°ÈÓÄÌÊõ*/ 
 
    /* 
     *     ¿á  ÎçØÆ»¯=¼°  »¥ "ON"·ÖÔÈÐ×ÈÕ intvalue ±å·´1ëҽ  ÔÊÔ 
     * ¹«Ä¾¶¯Â½·´ atoi ¼°çø°í 
     */ 
    void*    value;       /*yyyyë  ¾§ÔÊÔÂÒ½  ÔÊÔÂÁݼ°Ò½  ÛÆ*/ 
    CTYPE    valuetype; 
}ReadConf; 
 
ReadConf readconf[]= 
{ 
    { "debuglevel"      , NULL ,0 , (void*)&config.debuglevel      ,CHAR}, 
 
    { "usememoryunit"   , NULL ,0 , (void*)&config.usememoryunit   ,INT}, 
    { "usememoryunitnum", NULL ,0 , (void*)&config.usememoryunitnum,INT}, 
 
    { "acserv",			config.asname,sizeof(config.asname) ,NULL , 0}, 
    { "acservport",		NULL ,0 , (void*)&config.acservport     ,SHORT}, 
    { "acpasswd",		config.acpasswd,sizeof( config.acpasswd),NULL,0}, 
    { "gameservname",	config.gsnamefromas,sizeof(config.gsnamefromas), 
     NULL,0}, 
 
    // Arminius 7.24 manor pk 
    { "gameservid", config.gsid, sizeof(config.gsid), NULL, 0},  
    { "allowmanorpk", NULL, 0, (void*)&config.allowmanorpk, SHORT}, 
 
    { "port",			NULL ,0 , (void*)&config.port           ,SHORT}, 
    { "servernumber",	NULL ,0 , (void*)&config.servernumber           ,INT}, 
 
    { "reuseaddr",			NULL ,0 , (void*)&config.reuseaddr  ,		INT}, 
    { "nodelay",			NULL , 0 , (void*)&config.do_nodelay ,		INT}, 
    { "log_write_time", 	NULL, 0 , (void*)&config.log_write_time,	INT}, 
    { "log_io_time", 		NULL, 0 , (void*)&config.log_io_time, 		INT}, 
    { "log_game_time",		NULL, 0 , (void*)&config.log_game_time,		INT}, 
    { "log_netloop_faster", NULL,0,(void*)&config.log_netloop_faster,	INT}, 
    { "saacwritenum",		NULL,0,(void*)&config.saacwritenum, 		INT}, 
    { "saacreadnum",		NULL,0,(void*)&config.saacreadnum, 			INT}, 
    { "fdnum",				NULL ,0 , (void*)&config.fdnum,				SHORT}, 
    { "petnum",				NULL ,0 , (void*)&config.petcharnum,		INT}, 
    { "othercharnum",		NULL ,0 , (void*)&config.othercharnum,		INT}, 
 
    { "objnum",			NULL ,0 , (void*)&config.objnum,				INT}, 
    { "itemnum",		NULL ,0 , (void*)&config.itemnum,				INT}, 
    { "battlenum",		NULL ,0 , (void*)&config.battlenum,				INT}, 
    { "battleexp",		NULL ,0 , (void*)&config.battleexp,				INT}, 
    { "topdir"          , config.topdir,sizeof(config.topdir),NULL,0}, 
    { "mapdir"          , config.mapdir,sizeof(config.mapdir),NULL,0}, 
    { "maptilefile"     , config.maptilefile,sizeof(config.maptilefile),NULL,0}, 
    { "battlemapfile"   , config.battlemapfile,sizeof(config.battlemapfile),NULL,0}, 
 
#ifdef _ITEMSET6_TXT 
	{ "itemset6file",	config.itemfile,	sizeof(config.invfile),	NULL,	0}, 
#else 
#ifdef _ITEMSET5_TXT 
	{ "itemset5file",	config.itemfile,	sizeof(config.invfile),	NULL,	0}, 
#else 
#ifdef _ITEMSET4_TXT 
	{ "itemset4file"  , config.itemfile,sizeof(config.invfile),NULL,0}, 
#else 
#ifdef _ITEMSET3_ITEM 
	{ "itemset3file"  , config.itemfile,sizeof(config.invfile),NULL,0}, 
#endif 
#endif 
#endif 
#endif 
  { "invinciblefile"  , config.invfile,sizeof(config.invfile),NULL,0}, 
  { "appearpositionfile"  , config.appearfile,sizeof(config.appearfile),NULL,0}, 
	{ "titlenamefile", config.titlenamefile, sizeof( config.titlenamefile),NULL,0}, 
	{ "titleconfigfile", config.titleconfigfile, sizeof( config.titleconfigfile),NULL,0}, 
	{ "encountfile", config.encountfile, sizeof( config.encountfile),NULL,0}, 
	{ "enemyfile", config.enemyfile, sizeof( config.enemyfile),NULL,0}, 
	{ "enemybasefile", config.enemybasefile, sizeof( config.enemybasefile),NULL,0}, 
	{ "groupfile", config.groupfile, sizeof( config.groupfile),NULL,0}, 
	{ "magicfile", config.magicfile, sizeof( config.magicfile),NULL,0}, 
#ifdef _ATTACK_MAGIC 
	{ "attmagicfile" , config.attmagicfile , sizeof( config.attmagicfile )  , NULL , 0 }, 
#endif 
 
#ifdef _PETSKILL2_TXT 
	{ "petskillfile2", config.petskillfile, sizeof( config.petskillfile),NULL,0}, 
#else 
	{ "petskillfile1", config.petskillfile, sizeof( config.petskillfile),NULL,0}, 
#endif 
 
    { "itematomfile" , config.itematomfile, sizeof( config.itematomfile),NULL,0}, 
    { "effectfile"  , config.effectfile,sizeof(config.effectfile),NULL,0}, 
    { "quizfile"  , config.quizfile,sizeof(config.quizfile),NULL,0}, 
 
    { "lsgenlogfilename", config.lsgenlog,sizeof(config.lsgenlog),NULL,0}, 
#ifdef _GMRELOAD 
	{ "gmsetfile", config.gmsetfile, sizeof( config.gmsetfile),NULL,0}, 
#endif 
 
    { "storedir"        ,config.storedir,sizeof(config.storedir),NULL,0}, 
    { "npcdir"          ,config.npcdir,sizeof(config.npcdir),NULL,0}, 
    { "logdir"          ,config.logdir,sizeof(config.logdir),NULL,0}, 
    { "logconfname"     ,config.logconfname,sizeof(config.logconfname),NULL,0}, 
    { "chatmagicpasswd", config.chatmagicpasswd, sizeof( config.chatmagicpasswd),NULL,0}, 
#ifdef _STORECHAR 
    { "storechar", config.storechar, sizeof( config.storechar),NULL,0}, 
#endif 
    { "chatmagiccdkeycheck",  NULL,0, &config.chatmagiccdkeycheck,INT}, 
    { "filesearchnum",  NULL,0, &config.filesearchnum,INT}, 
    { "npctemplatenum",  NULL,0, &config.npctemplatenum,INT}, 
    { "npccreatenum",    NULL,0, &config.npccreatenum,INT}, 
    { "walkinterval" ,NULL,0,(void*)&config.walksendinterval,INT}, 
    { "CAinterval" ,NULL,0,(void*)&config.CAsendinterval_ms,INT}, 
    { "CDinterval" ,NULL,0,(void*)&config.CDsendinterval_ms,INT}, 
    { "CharSaveinterval" ,NULL,0,(void*)&config.CharSavesendinterval,INT}, 
    { "Onelooptime" ,NULL,0,(void*)&config.Onelooptime_ms,INT}, 
    { "Petdeletetime" ,NULL,0,(void*)&config.Petdeletetime,INT}, 
    { "Itemdeletetime" ,NULL,0,(void*)&config.Itemdeletetime,INT}, 
	 { "addressbookoffmesgnum" ,NULL,0, 
      (void*)&config.addressbookoffmsgnum,INT}, 
 
    { "protocolreadfrequency" ,NULL,0, 
      (void*)&config.protocolreadfrequency,INT}, 
 
    { "allowerrornum" ,NULL,0,(void*)&config.allowerrornum,INT}, 
    { "loghour" ,NULL,0,(void*)&config.loghour,INT}, 
    { "battledebugmsg" ,NULL,0,(void*)&config.battledebugmsg,INT}, 
    //ttom add because the second had 
    { "encodekey" ,NULL,0,(void*)&config.encodekey,INT}, 
    { "acwritesize" ,NULL,0,(void*)&config.acwritesize,INT}, 
    { "acwbsize" ,NULL,0,(void*)&config.acwbsize,INT}, 
    { "erruser_down" ,NULL,0,(void*)&config.ErrUserDownFlg,INT},     
 
#ifdef _ITEM_QUITPARTY 
    { "itemquitparty",	config.itemquitparty, sizeof(config.itemquitparty) ,NULL , 0}, 
#endif 
 
#ifdef _DEL_DROP_GOLD 
	{ "Golddeletetime" ,NULL,0,(void*)&config.Golddeletetime,	INT}, 
#endif 
 
#ifdef _NEW_PLAYER_CF 
	{ "TRANS" ,NULL,0,(void*)&config.newplayertrans,	INT}, 
	{ "LV" ,NULL,0,(void*)&config.newplayerlv,	INT},	 
	{ "PET1" ,NULL,0,(void*)&config.newplayergivepet[1],	INT}, 
	{ "PET2" ,NULL,0,(void*)&config.newplayergivepet[2],	INT},	 
	{ "PET3" ,NULL,0,(void*)&config.newplayergivepet[3],	INT},	 
	{ "PET4" ,NULL,0,(void*)&config.newplayergivepet[4],	INT},	 
	{ "ITEM1" ,NULL,0,(void*)&config.newplayergiveitem[0],	INT}, 
	{ "ITEM2" ,NULL,0,(void*)&config.newplayergiveitem[1],	INT},	 
	{ "ITEM3" ,NULL,0,(void*)&config.newplayergiveitem[2],	INT},	 
	{ "ITEM4" ,NULL,0,(void*)&config.newplayergiveitem[3],	INT},	 
	{ "ITEM5" ,NULL,0,(void*)&config.newplayergiveitem[4],	INT}, 
	{ "ITEM6" ,NULL,0,(void*)&config.newplayergiveitem[5],	INT},	 
	{ "ITEM7" ,NULL,0,(void*)&config.newplayergiveitem[6],	INT},	 
	{ "ITEM8" ,NULL,0,(void*)&config.newplayergiveitem[7],	INT},	 
	{ "ITEM9" ,NULL,0,(void*)&config.newplayergiveitem[8],	INT}, 
	{ "ITEM10" ,NULL,0,(void*)&config.newplayergiveitem[9],	INT},	 
	{ "ITEM11" ,NULL,0,(void*)&config.newplayergiveitem[10],	INT},	 
	{ "ITEM12" ,NULL,0,(void*)&config.newplayergiveitem[11],	INT},	 
	{ "ITEM13" ,NULL,0,(void*)&config.newplayergiveitem[12],	INT},	 
	{ "ITEM14" ,NULL,0,(void*)&config.newplayergiveitem[13],	INT},	 
	{ "ITEM15" ,NULL,0,(void*)&config.newplayergiveitem[14],	INT}, 
	{ "PETLV" ,NULL,0,(void*)&config.newplayerpetlv,	INT},	 
	{ "GOLD" ,NULL,0,(void*)&config.newplayergivegold,	INT}, 
	{ "RIDEPETLEVEL" ,NULL,0,(void*)&config.ridepetlevel,	INT}, 
#ifdef _VIP_SERVER 
	{ "GIVEVIPPOINT" ,NULL,0,(void*)&config.newplayerpetvip,	INT}, 
#endif 
#endif 
 
#ifdef _USER_EXP_CF 
	{ "USEREXP", config.expfile, sizeof( config.expfile),NULL,0}, 
#endif 
 
#ifdef _UNLAW_WARP_FLOOR 
	{ "FLOOR1" ,NULL,0,(void*)&config.unlawwarpfloor[0],	INT}, 
	{ "FLOOR2" ,NULL,0,(void*)&config.unlawwarpfloor[1],	INT},	 
	{ "FLOOR3" ,NULL,0,(void*)&config.unlawwarpfloor[2],	INT},	 
	{ "FLOOR4" ,NULL,0,(void*)&config.unlawwarpfloor[3],	INT},	 
	{ "FLOOR5" ,NULL,0,(void*)&config.unlawwarpfloor[4],	INT}, 
	{ "FLOOR6" ,NULL,0,(void*)&config.unlawwarpfloor[5],	INT}, 
	{ "FLOOR7" ,NULL,0,(void*)&config.unlawwarpfloor[6],	INT},	 
	{ "FLOOR8" ,NULL,0,(void*)&config.unlawwarpfloor[7],	INT},	 
	{ "FLOOR6" ,NULL,0,(void*)&config.unlawwarpfloor[8],	INT},	 
	{ "FLOOR10" ,NULL,0,(void*)&config.unlawwarpfloor[9],	INT}, 
#endif 
 
#ifdef _WATCH_FLOOR 
	{ "WATCHFLOOR" ,NULL,0,(void*)&config.watchfloor[0],	INT}, 
	{ "WATCHFLOOR1" ,NULL,0,(void*)&config.watchfloor[1],	INT}, 
	{ "WATCHFLOOR2" ,NULL,0,(void*)&config.watchfloor[2],	INT},	 
	{ "WATCHFLOOR3" ,NULL,0,(void*)&config.watchfloor[3],	INT},	 
	{ "WATCHFLOOR4" ,NULL,0,(void*)&config.watchfloor[4],	INT},	 
	{ "WATCHFLOOR5" ,NULL,0,(void*)&config.watchfloor[5],	INT}, 
#endif 
 
#ifdef _BATTLE_FLOOR 
	{ "BATTLEFLOOR" ,NULL,0,(void*)&config.battlefloor[0],	INT}, 
	{ "BATTLEFLOOR1" ,NULL,0,(void*)&config.battlefloor[1],	INT}, 
	{ "BATTLEFLOOR2" ,NULL,0,(void*)&config.battlefloor[2],	INT},	 
	{ "BATTLEFLOOR3" ,NULL,0,(void*)&config.battlefloor[3],	INT},	 
	{ "BATTLEFLOOR4" ,NULL,0,(void*)&config.battlefloor[4],	INT},	 
	{ "BATTLEFLOOR5" ,NULL,0,(void*)&config.battlefloor[5],	INT}, 
#endif 
 
#ifdef _UNREG_NEMA 
	{ "NAME1" ,config.unregname[0], sizeof( config.unregname[0]),NULL,0}, 
	{ "NAME2" ,config.unregname[1], sizeof( config.unregname[1]),NULL,0}, 
	{ "NAME3" ,config.unregname[2], sizeof( config.unregname[2]),NULL,0}, 
	{ "NAME4" ,config.unregname[3], sizeof( config.unregname[3]),NULL,0}, 
	{ "NAME5" ,config.unregname[4], sizeof( config.unregname[4]),NULL,0}, 
#endif 
#ifdef _TRANS_LEVEL_CF 
	{ "CHARTRANS" ,NULL,0,(void*)&config.chartrans,	INT}, 
	{ "PETTRANS" ,NULL,0,(void*)&config.pettrans,	INT},	 
	{ "LEVEL" ,NULL,0,(void*)&config.yblevel,	INT},	 
	{ "MAXLEVEL" ,NULL,0,(void*)&config.maxlevel,	INT},	 
#endif 
#ifdef _POINT 
	{ "POINT" ,NULL,0,(void*)&config.point,	INT}, 
	{ "TRANS0" ,NULL,0,(void*)&config.transpoint[0],	INT},	 
	{ "TRANS1" ,NULL,0,(void*)&config.transpoint[1],	INT},	 
	{ "TRANS2" ,NULL,0,(void*)&config.transpoint[2],	INT},	 
	{ "TRANS3" ,NULL,0,(void*)&config.transpoint[3],	INT},	 
	{ "TRANS4" ,NULL,0,(void*)&config.transpoint[4],	INT},	 
	{ "TRANS5" ,NULL,0,(void*)&config.transpoint[5],	INT},	 
	{ "TRANS6" ,NULL,0,(void*)&config.transpoint[6],	INT},	 
	{ "TRANS7" ,NULL,0,(void*)&config.transpoint[7],	INT},	 
#endif 
 
#ifdef _PET_UP 
	{ "PETUP" ,NULL,0,(void*)&config.petup,	INT}, 
#endif 
#ifdef _LOOP_ANNOUNCE 
	{ "ANNOUNCEPATH" ,config.loopannouncepath, sizeof( config.loopannouncepath),NULL,0}, 
	{ "ANNOUNCETIME" ,NULL,0,(void*)&config.loopannouncetime,	INT}, 
#endif 
#ifdef _SKILLUPPOINT_CF 
	{ "SKILLUPPOINT" ,NULL,0,(void*)&config.skup,	INT},	 
#endif 
#ifdef _RIDELEVEL 
	{ "RIDELEVEL" ,NULL,0,(void*)&config.ridelevel,	INT},	 
#endif 
 
#ifdef _REVLEVEL 
	{ "REVLEVEL" ,NULL,0,(void*)&config.revlevel,	INT},	 
#endif 
#ifdef _NEW_PLAYER_RIDE 
	{ "NPRIDE" ,NULL,0,(void*)&config.npride,	INT},	 
#endif 
#ifdef _FIX_CHARLOOPS 
	{ "CHARLOOPS" ,NULL,0,(void*)&config.charloops,	INT},	 
#endif 
#ifdef _PLAYER_ANNOUNCE 
	{ "PANNOUNCE" ,NULL,0,(void*)&config.pannounce,	INT}, 
#endif 
#ifdef _PLAYER_MOVE 
	{ "PMOVE" ,NULL,0,(void*)&config.pmove,	INT}, 
#endif 
 
	{ "recvbuffer" ,NULL,0,(void*)&config.recvbuffer,	INT}, 
	{ "sendbuffer" ,NULL,0,(void*)&config.sendbuffer,	INT}, 
	{ "recvlowatbuffer" ,NULL,0,(void*)&config.recvlowatbuffer,	INT}, 
	{ "runlevel" ,NULL,0,(void*)&config.runlevel,	INT}, 
	 
#ifdef _SHOW_VIP_CF 
	{ "SHOWVIP" ,NULL,0,(void*)&config.showvip,	INT}, 
#endif 
 
#ifdef _PLAYER_NUM 
	{ "PLAYERNUM" ,NULL,0,(void*)&config.playernum,	INT}, 
#endif 
 
#ifdef _BATTLE_GOLD 
	{ "BATTLEGOLD" ,NULL,0,(void*)&config.battlegold,	INT}, 
#endif 
#ifdef _ANGEL_TIME 
	{ "ANGELPLAYERTIME" ,NULL,0,(void*)&config.angelplayertime,	INT}, 
	{ "ANGELPLAYERMUN" ,NULL,0,(void*)&config.angelplayermun,	INT}, 
#endif 
#ifdef _RIDEMODE_20 
	{ "RIDEMODE" ,NULL,0,(void*)&config.ridemode,	INT}, 
#endif 
#ifdef _FM_POINT_PK 
	{ "FMPOINTPK" ,NULL,0,(void*)&config.fmpointpk,	INT}, 
#endif 
#ifdef _ENEMY_ACTION 
	{ "ENEMYACTION" ,NULL,0,(void*)&config.enemyact,	INT}, 
#endif 
 
#ifdef _CHECK_PEPEAT 
	{ "CHECKPEPEAT" ,NULL,0,(void*)&config.CheckRepeat,	INT}, 
#endif 
	{ "CPUUSE" ,NULL,0,(void*)&config.cpuuse,	INT}, 
#ifdef _VIP_ALL 
	{ "QQ" ,NULL,0,(void*)&config.checkvip,	INT}, 
#endif 
#ifdef _FM_JOINLIMIT 
	{ "JOINFAMILYTIME" ,NULL,0,(void*)&config.joinfamilytime,	INT}, 
#endif 
}; 
 
// Arminius 7.12 login announce 
char announcetext[8192]; 
void AnnounceToPlayer(int charaindex) 
{ 
  char *ptr,*qtr; 
   
  ptr=announcetext; 
  while ((qtr=strstr(ptr,"\n"))!=NULL) { 
    qtr[0]='\0'; 
//    printf("ptr=%s\n",ptr); 
    CHAR_talkToCli(charaindex, -1, ptr, CHAR_COLORYELLOW); 
    qtr[0]='\n'; 
    ptr=qtr+1; 
  } 
  CHAR_talkToCli(charaindex, -1, ptr, CHAR_COLORYELLOW); 
   
} 
 
// Robin 0720 
void AnnounceToPlayerWN(int fd) 
{ 
	char buf[8192]; 
	lssproto_WN_send( fd , WINDOW_MESSAGETYPE_LOGINMESSAGE, 
		WINDOW_BUTTONTYPE_OK, 
		-1, -1, 
		makeEscapeString( announcetext, buf, sizeof(buf)) 
		); 
} 
 
 
void LoadAnnounce(void) 
{ 
    FILE *f; 
 
    memset(announcetext, 0, sizeof(announcetext)); 
    if ((f=fopen("./announce.txt","r"))!=NULL) { 
      fread(announcetext, sizeof(announcetext), 1, f); 
      announcetext[sizeof(announcetext)-1]='\0'; 
      fclose(f); 
    } 
} 
#ifdef _PET_TALKPRO 
PTALK pettalktext[PETTALK_MAXID]; 
 
void LoadPetTalk(void) 
{ 
	FILE *fp; 
	char fn[256]; 
	char line[ 4096]; 
	char talkmem[4096]; 
	int maxid=0; 
	char buf1[256], buf2[256], buf3[256]; 
	int talkNO=-1, mark=-1, i; 
	int len = sizeof( talkmem); 
	 
	memset(talkmem, 0, sizeof(talkmem)); 
	sprintf(fn, "%s/pettalk/pettalk.menu", getNpcdir()); 
 
	for( i=0;i= PETTALK_MAXID ) 
			break; 
	} 
	print("×î´óID=%d...", maxid); 
	{ 
		int haveid=0; 
		for( i=0;i= 0 )	{ 
				haveid++; 
			} 
		} 
		print("ÔØÈë×ÜÊý=%d", haveid); 
	} 
 
} 
 
#else 
char pettalktext[4096]; 
void LoadPetTalk(void) 
{ 
  FILE *fp; 
  char fn[256]; 
  char	line[ 4096]; 
  int len = sizeof( pettalktext); 
   
  memset(pettalktext, 0, sizeof(pettalktext)); 
  sprintf(fn, "%s/pettalk/pettalk.mem", getNpcdir()); 
   
  fp = fopen( fn, "r"); 
    if( fp != NULL ) { 
		print("\n\n ¶ÁÈ¡ pettalk.mem"); 
		while( fgets( line, sizeof( line), fp)) { 
			if( strlen( pettalktext) != 0 ) { 
				if( pettalktext[strlen( pettalktext) -1] != '|' ) { 
					strcatsafe( pettalktext, len, "|");		 
				} 
			} 
			chompex( line); 
			strcatsafe( pettalktext,len,  line); 
		} 
		fclose( fp); 
		print("\n %s", pettalktext); 
    }else	{ 
		print("\n ²»ÄÜÕÒµ½ pettalk.mem"); 
	} 
} 
#endif 
 
#ifdef _GAMBLE_BANK 
GAMBLEBANK_ITEMS GB_ITEMS[GAMBLEBANK_ITEMSMAX]; 
 
void Load_GambleBankItems( void) 
{ 
 
	FILE *fp; 
	char filename[256]; 
	char buf1[256]; 
	char name[128]; 
	int num,ID,type; 
	int i=0; 
	sprintf(filename, "./data/gambleitems.txt" ); 
	print("\n¼ÓÔØ¶Ä²©ÎïÆ·Îļþ %s ...", filename); 
	fp = fopen( filename, "r"); 
    if( fp != NULL ) { 
		while( fgets( buf1, sizeof( buf1), fp) != NULL )	{ 
			if( strstr( buf1, "#") != 0 ) continue; 
			sscanf( buf1,"%s %d %d %d", name, &ID, &num , &type); 
			strcpy( GB_ITEMS[i].name, name); 
			GB_ITEMS[i].Gnum = num; 
			GB_ITEMS[i].ItemId = ID; 
			GB_ITEMS[i].type = type; 
			i++; 
		} 
		print("×î´óID: %d ", i); 
		fclose( fp); 
    }else	{ 
		print("´íÎó ÕÒ²»µ½Îļþ %s", filename); 
	} 
 
} 
#endif 
 
 
#ifdef _CFREE_petskill 
PETSKILL_CODES Code_skill[PETSKILL_CODE]; 
void Load_PetSkillCodes( void) 
{ 
	FILE *fp; 
	char filename[256]; 
	char buf1[256]; 
	char name[128]; 
	char type[256]; 
	int num,ID; 
	int i=0; 
	sprintf(filename, "./data/skillcode.txt" ); 
	print("\n¼ÓÔØ³èÎï¼¼ÄܱàÂëÎļþ:%s...", filename); 
	fp = fopen( filename, "r"); 
    if( fp != NULL ) { 
		while( fgets( buf1, sizeof( buf1), fp) != NULL )	{ 
			sscanf( buf1,"%s %d %d %s", name, &num, &ID, type); 
			strcpy( Code_skill[i].name, name); 
			Code_skill[i].TempNo = num; 
			Code_skill[i].PetId = ID; 
			strcpy( Code_skill[i].Code, type); 
			//print("\n %s|%d|%d|%s|", Code_skill[i].name, Code_skill[i].TempNo,  
			//	Code_skill[i].PetId, Code_skill[i].Code); 
			i++; 
			if( i >= PETSKILL_CODE ) break; 
		} 
		fclose( fp); 
    }else	{ 
		print("´ò²»µ½Îļþ %s", filename); 
	} 
	print("Íê³É\n"); 
} 
#endif 
 
#ifdef _GMRELOAD 
BOOL LoadGMSet( char* filename ) 
{ 
	FILE* fp; 
	int i = 0, gm_num = 0; 
	fp = fopen(filename, "r"); 
	if (fp == NULL) 
	{ 
		print("ÎÞ·¨´ò¿ªÎļþ\n"); 
		return FALSE; 
	} 
	for (i = 0; i < GMMAXNUM; i++) 
	{ 
		strcpy(gminfo[i].cdkey, ""); 
		gminfo[i].level = 0; 
	} 
	while(1){ 
		char	line[64], cdkey[64], level[64]; 
		if (fgets(line, sizeof(line), fp) == NULL)	break; 
		chop(line); 
		//change ʹgmset.txt¿ÉÒÔÔö¼Ó×¢½â******* 
		if( line[0] == '#' ) 
			continue; 
		for( i=0; i GMMAXNUM)	break; 
		easyGetTokenFromString(line, 1, cdkey, sizeof(cdkey)); 
		if (strcmp(cdkey, "") == 0)	break; 
		strncpy(gminfo[gm_num].cdkey, cdkey, sizeof(gminfo[gm_num].cdkey)); 
		easyGetTokenFromString(line, 2, level, sizeof(level)); 
		if (strcmp(level, "") == 0)	break; 
		gminfo[gm_num].level = atoi(level); 
//		print("\ncdkey:%s, level:%d", gminfo[gm_num].cdkey, gminfo[gm_num].level); 
	} 
	fclose(fp); 
	return TRUE; 
} 
#endif 
 
/*------------------------------------------------------------ 
 * Ãó·òºë·ÂØ©  ë  Ô 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  cahr* 
 ------------------------------------------------------------*/ 
char* getProgname( void ) 
{ 
    return config.progname; 
} 
/*------------------------------------------------------------ 
 * configfilename ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
char* getConfigfilename( void ) 
{ 
    return config.configfilename; 
} 
/*------------------------------------------------------------ 
 * configfilename ëɬÀÃÔÊÔÂ£Û 
 * ¦ÐÑ 
 *  newv    char*   Þ¥ØÆÖаÀ 
 * ߯Ի°À 
 *  Ø¦ØÆ 
 ------------------------------------------------------------*/ 
void setConfigfilename( char* newv ) 
{ 
    strcpysafe( config.configfilename, sizeof( config.configfilename ), 
                newv ); 
} 
 
/*------------------------------------------------------------ 
 * ·¸ÌïÓÀºëÒÁì»ïë  Ô 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
unsigned int getDebuglevel( void ) 
{ 
    return config.debuglevel; 
} 
/*------------------------------------------------------------ 
 * ·¸ÌïÓÀºëÒÁì»ïëɬÀÃÔÊÔ 
 * ¦ÐÑ 
 *  newv    int     Þ¥ØÆÖаÀ 
 * ߯Ի°À 
 *  unsigned int    éɼ°°À 
 ------------------------------------------------------------*/ 
unsigned int setDebuglevel( unsigned int newv ) 
{ 
    int old; 
    old = config.debuglevel; 
    config.debuglevel = newv; 
    return old; 
} 
/*------------------------------------------------------------ 
 * memoryunit ë  Ô 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
unsigned int getMemoryunit( void ) 
{ 
    return config.usememoryunit; 
} 
/*------------------------------------------------------------ 
 * memoryunitnum ë  Ô 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
unsigned int getMemoryunitnum( void ) 
{ 
    return config.usememoryunitnum; 
} 
 
/*------------------------------------------------------------ 
 * ʧÊÐËü¼þÐþÈÓ¡õÌPʧÓñÒÁµ©Ã«  Ô 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
char*   getAccountservername( void ) 
{ 
    return config.asname; 
} 
/*------------------------------------------------------------ 
 * ʧÊÐËü¼þÐþÈÓ¡õÌï¼°ºÌ¡õÐþë  Ô 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned short 
 ------------------------------------------------------------*/ 
unsigned short   getAccountserverport( void ) 
{ 
    return config.acservport; 
} 
/*------------------------------------------------------------ 
 * ʧÊÐËü¼þÐþÈÓ¡õÌï³ß¼°Óɵ©·¥¡õÓñë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned short 
 ------------------------------------------------------------*/ 
char*   getAccountserverpasswd( void ) 
{ 
    return config.acpasswd; 
} 
/*------------------------------------------------------------ 
 * ʧÊÐËü¼þÐþÈÓ¡õÌï¾®ÈÕέÒüÔ±ءõØ©ÈÓ¡õÌïÎçØÆ»¯¼°  ó¡Ã«  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned short 
 ------------------------------------------------------------*/ 
char*   getGameservername( void ) 
{ 
    return config.gsnamefromas; 
} 
 
// Arminius 7.24 manor pk 
char* getGameserverID( void ) 
{ 
    if (config.gsid[strlen(config.gsid)-1]=='\n') 
      config.gsid[strlen(config.gsid)-1]='\0'; 
       
    return config.gsid; 
} 
 
unsigned short getAllowManorPK( void ) 
{ 
    return config.allowmanorpk; 
} 
 
unsigned short getPortnumber( void ) 
{ 
    return config.port; 
} 
/*------------------------------------------------------------ 
 * ±Ø¡õØ©ÈÓ¡õÌï¼°  į   įë  Ô 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned short 
 ------------------------------------------------------------*/ 
int getServernumber( void ) 
{ 
    return config.servernumber; 
} 
/*------------------------------------------------------------ 
 * reuseaddr ¼°°Àë  Ô 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned short 
 ------------------------------------------------------------*/ 
int getReuseaddr( void ) 
{ 
    return config.reuseaddr; 
} 
 
int getNodelay( void ) 
{ 
    return config.do_nodelay; 
} 
int getLogWriteTime(void) 
{ 
    return config.log_write_time; 
} 
int getLogIOTime( void) 
{ 
    return config.log_io_time; 
} 
int getLogGameTime(void) 
{ 
    return config.log_game_time; 
} 
int getLogNetloopFaster(void) 
{ 
    return config.log_netloop_faster; 
} 
 
/*------------------------------------------------------------ 
 * saacwritenum ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *   int 
 ------------------------------------------------------------*/ 
int getSaacwritenum( void ) 
{ 
    return config.saacwritenum; 
} 
/*------------------------------------------------------------ 
 * saacwritenum ëɬÀÃÔÊÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *   int 
 ------------------------------------------------------------*/ 
void setSaacwritenum( int num ) 
{ 
    config.saacwritenum = num; 
} 
/*------------------------------------------------------------ 
 * saacreadnum ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *   int 
 ------------------------------------------------------------*/ 
int getSaacreadnum( void ) 
{ 
    return config.saacreadnum; 
} 
/*------------------------------------------------------------ 
 * saacreadnum ëɬÀÃÔÊÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *   int 
 ------------------------------------------------------------*/ 
void setSaacreadnum( int num ) 
{ 
    config.saacreadnum = num; 
} 
/*------------------------------------------------------------ 
 * fdnum ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
unsigned int getFdnum( void ) 
{ 
    return config.fdnum; 
} 
/*------------------------------------------------------------ 
 * petcharanum ë  Ô 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
unsigned int getPetcharnum( void ) 
{ 
    return config.petcharnum; 
} 
 
 
/*------------------------------------------------------------ 
 * othercharnum ë  Ô 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
unsigned int getOtherscharnum( void ) 
{ 
    return config.othercharnum; 
} 
 
/*------------------------------------------------------------ 
 * objnum ë  Ô 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
unsigned int getObjnum( void ) 
{ 
    return config.objnum; 
} 
 
/*------------------------------------------------------------ 
 * itemnum ë  Ô 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
unsigned int getItemnum( void ) 
{ 
    return config.itemnum; 
} 
 
 
/*------------------------------------------------------------ 
 * battlenum ë  Ô 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
unsigned int getBattlenum( void ) 
{ 
    return config.battlenum; 
} 
 
#ifdef _GET_BATTLE_EXP 
unsigned int getBattleexp( void ) 
{ 
    return config.battleexp; 
} 
#endif 
/*------------------------------------------------------------ 
 * topdir ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
char* getTopdir( void ) 
{ 
    return config.topdir; 
} 
/*------------------------------------------------------------ 
 * mapdir ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
char* getMapdir( void ) 
{ 
    return config.mapdir; 
} 
/*------------------------------------------------------------ 
 * maptilefile ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
char* getMaptilefile( void ) 
{ 
    return config.maptilefile; 
} 
/*------------------------------------------------------------ 
 * battlemapfile ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
char* getBattleMapfile( void ) 
{ 
    return config.battlemapfile; 
} 
/*------------------------------------------------------------ 
 * itemfile ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
char* getItemfile( void ) 
{ 
    return config.itemfile; 
} 
/*------------------------------------------------------------ 
 * invfile ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
char* getInvfile( void ) 
{ 
    return config.invfile; 
} 
/*------------------------------------------------------------ 
 * appearfile ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
char* getAppearfile( void ) 
{ 
    return config.appearfile; 
} 
/*------------------------------------------------------------ 
 * effectfile ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
char* getEffectfile( void ) 
{ 
    return config.effectfile; 
} 
/*------------------------------------------------------------ 
 * titlenamefile ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
char* getTitleNamefile( void ) 
{ 
    return config.titlenamefile; 
} 
/*------------------------------------------------------------ 
 * titleconfigfile ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
char* getTitleConfigfile( void ) 
{ 
    return config.titleconfigfile; 
} 
/*------------------------------------------------------------ 
 * encountfile ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
char* getEncountfile( void ) 
{ 
    return config.encountfile; 
} 
/*------------------------------------------------------------ 
 * enemyfile ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
char* getEnemyfile( void ) 
{ 
    return config.enemyfile; 
} 
/*------------------------------------------------------------ 
 * enemybasefile ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
char* getEnemyBasefile( void ) 
{ 
    return config.enemybasefile; 
} 
/*------------------------------------------------------------ 
 * groupfile ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
char* getGroupfile( void ) 
{ 
    return config.groupfile; 
} 
/*------------------------------------------------------------ 
 * magicfile ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
char* getMagicfile( void ) 
{ 
    return config.magicfile; 
} 
 
#ifdef _ATTACK_MAGIC 
 
/*------------------------------------------------------------ 
 * È¡µÃ¹¥»÷ÐÔµÄÖäÊõ 
 * ²ÎÊý 
 * None 
 * ·µ»ØÖµ 
 * char* 
 ------------------------------------------------------------*/ 
char* getAttMagicfileName( void ) 
{ 
    return config.attmagicfile; 
} 
 
#endif 
 
 
char* getPetskillfile( void ) 
{ 
    return config.petskillfile; 
} 
 
 
#ifdef _ITEM_QUITPARTY 
char* getitemquitparty( void ) 
{ 
    return config.itemquitparty; 
} 
#endif 
 
char *getItematomfile( void ) 
{ 
    return config.itematomfile; 
} 
 
 
char* getQuizfile( void ) 
{ 
    return config.quizfile; 
} 
 
/*------------------------------------------------------------ 
 * lsgenlogfile ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
char* getLsgenlogfilename( void ) 
{ 
    return config.lsgenlog; 
} 
 
#ifdef _GMRELOAD 
char* getGMSetfile( void ) 
{ 
    return config.gmsetfile; 
} 
#endif 
 
/*------------------------------------------------------------ 
 * storedir ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
char* getStoredir( void ) 
{ 
    return config.storedir; 
} 
#ifdef _STORECHAR 
/*------------------------------------------------------------ 
 ------------------------------------------------------------*/ 
char* getStorechar( void ) 
{ 
    return config.storechar; 
} 
#endif 
 
/*------------------------------------------------------------ 
 * NPC åü°·¸Å«ÒÁÛÍÐþØøÃ«  »¯ÈÊÔÂèúÐÑ 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
char* getNpcdir( void ) 
{ 
    return config.npcdir; 
} 
/*------------------------------------------------------------ 
 * ·òºë·¸Å«ÒÁÛÍÐþØøÃ«  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
char* getLogdir( void ) 
{ 
    return config.logdir; 
} 
 
/*------------------------------------------------------------ 
 * ·òºëɬÀð×ÑëÄÌ»ï  Ã«  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
char* getLogconffile( void ) 
{ 
    return config.logconfname; 
} 
/*------------------------------------------------------------ 
 * ÃñÅÒÓÀÐþ  Ü·Óɵ©·¥¡õÓñ ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
char* getChatMagicPasswd( void ) 
{ 
    return config.chatmagicpasswd; 
} 
/*------------------------------------------------------------ 
 * ·¸ÌïÓÀºëÃñÅÒÓÀÐþ  Ü·Æ¥¼°CDKEYÃñÄáÓÀÛÍëÔÊÔ¾®Éýµ¤¾®Ã«  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  char* 
 ------------------------------------------------------------*/ 
unsigned getChatMagicCDKeyCheck( void ) 
{ 
    return config.chatmagiccdkeycheck; 
} 
 
/*------------------------------------------------------------ 
 * filesearchnumë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
unsigned int getFilesearchnum( void ) 
{ 
    return config.filesearchnum; 
} 
/*------------------------------------------------------------ 
 * npctemplatenumë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
unsigned int getNpctemplatenum( void ) 
{ 
    return config.npctemplatenum; 
} 
/*------------------------------------------------------------ 
 * npccreatenumë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
unsigned int getNpccreatenum( void ) 
{ 
    return config.npccreatenum; 
} 
 
/*------------------------------------------------------------ 
 * walksendintervalë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
unsigned int getWalksendinterval( void ) 
{ 
    return config.walksendinterval; 
} 
/*------------------------------------------------------------ 
 * walksendintervalë±¾ÓÀÐþÔÊÔÂ£Û 
 * ¦ÐÑ 
 *  unsigned int 	interval	ÁÝÃÞ  Á¢Øø     
 * ߯Ի°À 
 *  void 
 ------------------------------------------------------------*/ 
void setWalksendinterval( unsigned int interval ) 
{ 
    config.walksendinterval = interval; 
} 
/*------------------------------------------------------------ 
 * CAsendintervalë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
unsigned int getCAsendinterval_ms( void ) 
{ 
    return config.CAsendinterval_ms; 
} 
/*------------------------------------------------------------ 
 * CAsendintervalë±¾ÓÀÐþÔÊÔÂ£Û 
 * ¦ÐÑ 
 *  unsigned int interval 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
void setCAsendinterval_ms( unsigned int interval_ms ) 
{ 
    config.CAsendinterval_ms = interval_ms; 
} 
/*------------------------------------------------------------ 
 * CDsendintervalë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
unsigned int getCDsendinterval_ms( void ) 
{ 
    return config.CDsendinterval_ms; 
} 
/*------------------------------------------------------------ 
 * CDsendintervalë±¾ÓÀÐþÔÊÔÂ£Û 
 * ¦ÐÑ 
 *  interval		unsigned int 
 * ߯Ի°À 
 * void 
 ------------------------------------------------------------*/ 
void setCDsendinterval_ms( unsigned int interval_ms ) 
{ 
	config.CDsendinterval_ms = interval_ms; 
} 
/*------------------------------------------------------------ 
 * Onelooptimeë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
unsigned int getOnelooptime_ms( void ) 
{ 
    return config.Onelooptime_ms; 
} 
/*------------------------------------------------------------ 
 * Onelooptimeë±¾ÓÀÐþÔÊÔÂ£Û 
 * ¦ÐÑ 
 *  interval		unsigned int 
 * ߯Ի°À 
 * void 
 ------------------------------------------------------------*/ 
void setOnelooptime_ms( unsigned int interval_ms ) 
{ 
	config.Onelooptime_ms = interval_ms; 
} 
/*------------------------------------------------------------ 
 * Petdeletetimeë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
unsigned int getPetdeletetime( void ) 
{ 
    return config.Petdeletetime; 
} 
/*------------------------------------------------------------ 
 * Petdeletetimeë±¾ÓÀÐþÔÊÔÂ£Û 
 * ¦ÐÑ 
 *  interval		unsigned int 
 * ߯Ի°À 
 * void 
 ------------------------------------------------------------*/ 
void setPetdeletetime( unsigned int interval ) 
{ 
	config.Petdeletetime = interval; 
} 
/*------------------------------------------------------------ 
 * Itemdeletetimeë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
unsigned int getItemdeletetime( void ) 
{ 
    return config.Itemdeletetime; 
} 
/*------------------------------------------------------------ 
 * Itemdeletetimeë±¾ÓÀÐþÔÊÔÂ£Û 
 * ¦ÐÑ 
 *  interval		unsigned int 
 * ߯Ի°À 
 * void 
 ------------------------------------------------------------*/ 
void setItemdeletetime( unsigned int interval ) 
{ 
	config.Itemdeletetime = interval; 
} 
 
/*------------------------------------------------------------ 
 * CharSavesendintervalë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
unsigned int getCharSavesendinterval( void ) 
{ 
    return config.CharSavesendinterval; 
} 
/*------------------------------------------------------------ 
 * CharSavesendintervalë±¾ÓÀÐþÔÊÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
void setCharSavesendinterval( unsigned int interval) 
{ 
	config.CharSavesendinterval = interval; 
} 
 
/*------------------------------------------------------------ 
 * Addressbookoffmsgnum ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
unsigned int getAddressbookoffmsgnum( void ) 
{ 
    return config.addressbookoffmsgnum; 
} 
/*------------------------------------------------------------ 
 * Protocolreadfrequency ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
unsigned int getProtocolreadfrequency( void ) 
{ 
    return config.protocolreadfrequency; 
} 
 
/*------------------------------------------------------------ 
 * Allowerrornum ë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
unsigned int getAllowerrornum( void ) 
{ 
    return config.allowerrornum; 
} 
 
/*------------------------------------------------------------ 
 * ·òºëëäú  ÔÊÔÂÁݶÔë  ÔÂ£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 
 ------------------------------------------------------------*/ 
unsigned int getLogHour( void ) 
{ 
    return config.loghour; 
} 
 
/*------------------------------------------------------------ 
 * ÌïÐþ»ï  ¼°·¸ÌïÓÀºë¶ªÓÀ±¾¡õ³âëÇëÔʾ®£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 1ئÈÕÇëÔÊ 
 ------------------------------------------------------------*/ 
unsigned int getBattleDebugMsg( void ) 
{ 
    return config.battledebugmsg; 
} 
/*------------------------------------------------------------ 
 * ÌïÐþ»ï  ¼°·¸ÌïÓÀºë¶ªÓÀ±¾¡õ³âëÇëÔʾ®£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int 1ئÈÕÇëÔÊ 
 ------------------------------------------------------------*/ 
void setBattleDebugMsg( unsigned int num ) 
{ 
    config.battledebugmsg = num; 
} 
 
 
 
/* 
 * Config¼°·¸°×ÇÉ»ïÐþ°Àë裻§ÔÂèúÐÑ 
 * ¦ÐÑ 
 *  argv0   char*   ÎìѨ¼þÓñ·ÂÄ̼þ¦ÐѼ°  âÙ 
 */ 
void  defaultConfig( char* argv0 ) 
{ 
    char* program;                  /* program  ë·Æ»§Ô¼°±åÒøµ¤ */ 
 
    /* ·¸°×ÇÉ»ïÐþ°Àë  ľÔ */ 
 
    /*Ãó·òºë·ÂØ©  */ 
    program = rindex(argv0, '/'); 
    if (program == NULL) 
        program = argv0; 
    else 
        program++;   /* "/"¼°ÆÝ¾®Èձ娯Ð×Öм°Æ¥++ÔÊÔÂ*/ 
    strcpysafe( config.progname , sizeof( config.progname ) ,program ); 
 
    /*ɬÀð×ÑëÄÌ»ï  */ 
    strcpysafe( config.configfilename, 
                sizeof( config.configfilename ),"setup.cf" ); 
 
} 
 
/* 
 * ɬÀð×ÑëÄÌ»ï  Ã«  ÊÏ·Ö  Æ¥¼°ÖÊ  ëµæµ¤£Û 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  Ø¦ØÆ 
 */ 
void lastConfig( void ) 
{ 
    char    entry[256]; 
    /*  ѨÓÀÃó·¸Å«ÒÁÛÍÐþØø¼°É¬Àà    */ 
    snprintf(entry, sizeof(entry), "%s/%s", config.topdir, config.mapdir); 
    strcpysafe(config.mapdir, sizeof(config.mapdir), entry); 
 
    /*  ѨÓÀÃóɬÀð×ÑëÄÌ»ï  ¼°É¬Àà    */ 
    snprintf(entry,sizeof(entry),"%s/%s", 
             config.topdir,config.maptilefile); 
    strcpysafe(config.maptilefile, sizeof(config.maptilefile), entry); 
 
    /*  ÌïÐþ»ïѨÓÀÃóɬÀð×ÑëÄÌ»ï  ¼°É¬Àà    */ 
    snprintf(entry,sizeof(entry),"%s/%s", 
             config.topdir,config.battlemapfile); 
    strcpysafe(config.battlemapfile, sizeof(config.battlemapfile), entry); 
 
    /*  ʧÄÌ  ةɬÀð×ÑëÄÌ»ï  ¼°É¬Àà    */ 
    snprintf(entry,sizeof(entry), "%s/%s", config.topdir,config.itemfile); 
    strcpysafe(config.itemfile, sizeof(config.itemfile), entry); 
 
    /*    ³ÄɬÀð×ÑëÄÌ»ï  ¼°É¬Àà    */ 
    snprintf(entry,sizeof(entry), "%s/%s", config.topdir,config.invfile); 
    strcpysafe(config.invfile, sizeof(config.invfile), entry); 
 
    /*  ÇëòØÞË  ɬÀð×ÑëÄÌ»ï  ¼°É¬Àà    */ 
    snprintf(entry,sizeof(entry), "%s/%s", config.topdir,config.appearfile); 
    strcpysafe(config.appearfile, sizeof(config.appearfile), entry); 
 
    /*  ÉÒÇëɬÀð×ÑëÄÌ»ï  ¼°É¬Àà    */ 
    snprintf(entry,sizeof(entry), "%s/%s", config.topdir,config.effectfile); 
    strcpysafe(config.effectfile, sizeof(config.effectfile), entry); 
 
    /*  ÛÍÄÌÊõɬÀð×ÑëÄÌ»ï  ¼°É¬Àà    */ 
    snprintf(entry,sizeof(entry), "%s/%s", config.topdir,config.quizfile); 
    strcpysafe(config.quizfile, sizeof(config.quizfile), entry); 
 
    /*  ±¹Ä¯  °×ÑëÄÌ»ï  ¼°É¬Àà    */ 
    snprintf(entry,sizeof(entry), "%s/%s", config.topdir,config.titlenamefile); 
    strcpysafe(config.titlenamefile, sizeof(config.titlenamefile), entry); 
 
    /*  lsgen ʧËüÐþÃóÓÀÐþ°×ÑëÄÌ»ï      */ 
    snprintf(entry,sizeof(entry),"%s/%s", config.topdir,config.lsgenlog); 
    strcpysafe(config.lsgenlog, sizeof(config.lsgenlog), entry); 
 
    /*  µ©Ðþʧ·¸Å«ÒÁÛÍÐþØø¼°É¬Àà    */ 
/* 
    snprintf(entry,sizeof(entry), "%s/%s",config.topdir,config.storedir); 
    strcpysafe(config.storedir, sizeof(config.storedir), entry); 
*/ 
    /*  NPCɬÀÃÐþÓÀÃó·¸Å«ÒÁÛÍÐþØø¼°É¬Àà    */ 
    snprintf(entry,sizeof(entry), "%s/%s",config.topdir,config.npcdir); 
    strcpysafe(config.npcdir, sizeof(config.npcdir), entry); 
 
#ifdef _STORECHAR 
    /*   */ 
    snprintf(entry,sizeof(entry), "%s/%s",config.topdir,config.storechar); 
    strcpysafe(config.storechar, sizeof(config.storechar), entry); 
#endif 
 
} 
 
 
/* 
 * ºÌÄ̼þÕý¡õÎçØÍ婨¦µáÊ÷  ë  ÔÈ»¯Ò½  ëÔÊÔÂèúÐÑ 
 * ¦ÐÑ 
 *  to      void*   °Àëҽ  ÔÊÔºÌÄ̼þÕý 
 *  type    CTYPE   to¼°µáë裻§Ô 
 *  value   double  to±åÒ½  ÔÊÔ°À 
 * ߯Ի°À 
 *  Ø¦ØÆ 
 */ 
void substitutePointerFromType( void* to , CTYPE type ,double value) 
{ 
    switch( type  ){ 
    case CHAR: 
        *(char*)to = (char)value; 
        break; 
    case SHORT: 
        *(short*)to = (short)value; 
        break; 
    case INT: 
        *(int*)to = (int)value; 
        break; 
    case DOUBLE: 
        *(double*)to = (double)value; 
        break; 
    } 
} 
 
 
/*------------------------------------------------------------ 
 * ɬÀð×ÑëÄÌ»ïë  ¸ê 
 * ¦ÐÑ 
 *      filename            °×ÑëÄÌ»ï   
 * ߯Ի°À 
 *      TRUE(1)     ÔÀ   
 *      FALSE(0)    Áà      -> °×ÑëÄ̻P×ó¡õÃó¼þ±åÁà  ØÆÐ× 
 ------------------------------------------------------------*/ 
BOOL readconfigfile( char* filename ) 
{ 
    FILE* f=NULL; 
    char linebuf[256];                  /* Óòµæ  ÐÄ  ¸êÌïÓÀ°×Ñë */ 
    int linenum=0;                      /* µæÐÑëÐÑÒüÔ */ 
    char    realopenfilename[256];      /*    ¶Ë±åopen ÔÊÔ°×ÑëÄÌ»ï  */ 
 
    char    hostname[128]; 
 
    /*  ʯµ©Ðþ  ë·Æ»§Ô    */ 
    if( gethostname( hostname, sizeof(hostname) ) != -1 ){ 
        char*   initdot; 
        initdot = index( hostname, '.' ); 
        if( initdot != NULL ) 
            *initdot = '\0'; 
        snprintf( realopenfilename, sizeof(realopenfilename), 
                  "%s.%s" , filename, hostname); 
 
        /* °×ÑëÄ̻P×ó¡õÃó¼þ */ 
        f=fopen( realopenfilename, "r" ); 
        if( f == NULL ) 
            print( "Can't open %s.  use %s instead\n", realopenfilename, 
                   filename ); 
    } 
    if( f == NULL ){ 
        f=fopen( filename , "r" );          /* °×ÑëÄ̻P×ó¡õÃó¼þ */ 
        if( f == NULL ){ 
            print( "Can't open %s\n", filename ); 
            return FALSE; 
        } 
    } 
 
    /* ÓòµæÎð¹´  ÐÄ  ¸ê */ 
    while( fgets( linebuf , sizeof( linebuf ), f ) ){ 
        char firstToken[256];       /*1    ¼°  Ù¯  */ 
        int i;                      /*»ï¡õÃó  ÐÑ*/ 
        int ret;                    /*ØøÕý¡õ¼þÎì¡õÓñ*/ 
 
        linenum ++; 
 
        deleteWhiteSpace(linebuf);          /* remove whitespace    */ 
 
        if( linebuf[0] == '#' )continue;        /* comment */ 
        if( linebuf[0] == '\n' )continue;       /* none    */ 
 
        chomp( linebuf );                    /* remove tail newline  */ 
 
        /* delim "=" Æ¥  âÙ(1)¼°Ðþ¡õÛͼþë  ÔÂ*/ 
        ret = getStringFromIndexWithDelim( linebuf , "=",  1, firstToken, 
                                           sizeof(firstToken) ); 
        if( ret == FALSE ){ 
            print( "Find error at %s in line %d. Ignore\n", 
                     filename , linenum); 
            continue; 
        } 
 
        /* readconf ¼°ÈÓÄÌÊõÆ¥»ï¡õÃó */ 
        for( i = 0 ; i < arraysizeof( readconf ) ; i ++ ){ 
            if( strcmp( readconf[i].name ,firstToken ) == 0 ){ 
                /* match */ 
                char secondToken[256];      /*2    ¼°  Ù¯  */ 
                /* delim "=" Æ¥2    ¼°Ðþ¡õÛͼþë  ÔÂ*/ 
                ret = getStringFromIndexWithDelim( linebuf , "=" , 2 
                                                   , secondToken , 
                                                   sizeof(secondToken) ); 
 
                /* NULL  Ù¯¾®Éýµ¤¾®Ã«Æ©ÍÍÔ */ 
                if( ret == FALSE ){ 
                    print( "Find error at %s in line %d. Ignore", 
                           filename , linenum); 
                    break; 
                } 
 
 
                /*NULL·ÖÔÈÐ×ÈÕÒ½  ØÆØ¦ÖÐ*/ 
                if( readconf[i].charvalue != NULL ) 
                    strcpysafe( readconf[i].charvalue 
                                ,readconf[i].charsize, secondToken); 
 
                /*NULL·ÖÔÈÐ×ÈÕÒ½  ØÆØ¦ÖÐ*/ 
                if( readconf[i].value != NULL ) { 
                    if( strcmp( "ON" ,secondToken ) == 0 ) { 
                        /*ON·ÖÔÈÐ×ÈÕ1ë  ľÔÂ*/ 
                        substitutePointerFromType( readconf[i].value, 
                                                   readconf[i].valuetype, 
                                                   1.0); 
 
                    }else if( strcmp( "OFF" ,secondToken ) == 0 ) { 
                        /*OFF·ÖÔÈÐ×ÈÕ1ë  ľÔÂ*/ 
                        substitutePointerFromType( readconf[i].value, 
                                                   readconf[i].valuetype, 
                                                   1.0); 
                    }else { 
                        strtolchecknum(secondToken, 
                                       (int*)readconf[i].value, 
                                       10, readconf[i].valuetype); 
					} 
				} 
                break; 
            } 
        } 
    } 
    fclose( f ); 
    lastConfig(); 
    return TRUE; 
} 
//ttom add this becaus the second had this function  
/*------------------------------------------------------------ 
 * ¾Þ¼þÎì¡õÓñƽ¡õëɬÀÃÔÊÔ 
 * ¦ÐÑ 
 *  Ø¦ØÆ 
 * ߯Ի°À 
 *  unsigned int ƽ¡õë߯ÔÊ 
------------------------------------------------------------*/ 
unsigned int setEncodeKey( void ) 
{ 
   JENCODE_KEY = config.encodekey; 
   return JENCODE_KEY; 
} 
/*------------------------------------------------------------ 
* ʧÊÐËü¼þÐþÈÓ¡õÌï¡õ±å̤Îå  ¸êÌïÓÀ°×Ñë¼°ÈÓÄÌÊõëɬÀÃÔÊÔ 
* ¦ÐÑ 
*  Ø¦ØÆ 
* ߯Ի°À 
*  unsigned int ƽ¡õë߯ÔÊ 
------------------------------------------------------------*/ 
unsigned int setAcWBSize( void ) 
{ 
    AC_WBSIZE = config.acwbsize; 
    return AC_WBSIZE; 
} 
unsigned int getAcwriteSize( void ) 
{ 
    return config.acwritesize; 
} 
unsigned int getErrUserDownFlg( void ) 
{ 
    return config.ErrUserDownFlg; 
} 
     
 
#ifdef _DEL_DROP_GOLD 
unsigned int getGolddeletetime( void ) 
{ 
    if( config.Golddeletetime > 0 ) 
		return config.Golddeletetime; 
	else 
		return config.Itemdeletetime; 
} 
void setIGolddeletetime( unsigned int interval ) 
{ 
	config.Golddeletetime = interval; 
} 
#endif 
 
#ifdef _NEW_PLAYER_CF 
int getNewplayertrans( void ) 
{ 
  if(config.newplayertrans > 7) 
		return 7; 
	else if(config.newplayertrans >= 0) 
		return config.newplayertrans; 
	else 
		return 0; 
} 
int getNewplayerlv( void ) 
{ 
  if(config.newplayerlv > 160) 
		return 160; 
	else if(config.newplayerlv >0) 
		return config.newplayerlv; 
	else 
		return 0; 
} 
int getNewplayerpetlv( void ) 
{ 
  if(config.newplayerpetlv > 160) 
		return 160; 
	else if(config.newplayerpetlv > 0) 
		return config.newplayerpetlv; 
	else 
		return 0; 
} 
 
int getNewplayergivepet( unsigned int index ) 
{ 
  if(config.newplayergivepet[index] > 0 ) 
		return config.newplayergivepet[index]; 
	else 
		return -1; 
} 
 
int getNewplayergiveitem( unsigned int index ) 
{ 
  if(config.newplayergiveitem[index] > 0 ) 
		return config.newplayergiveitem[index]; 
	else 
		return -1; 
} 
 
void setNewplayergivepet( unsigned int index ,unsigned int interval) 
{ 
	config.newplayergivepet[index] = interval; 
} 
 
int getNewplayergivegold( void ) 
{ 
  if(config.newplayergivegold > 1000000) 
		return 1000000; 
	else if(config.newplayergivegold < 0) 
		return 0; 
	else 
		return config.newplayergivegold; 
} 
int getRidePetLevel( void ) 
{ 
  if(config.ridepetlevel > 0 ) 
		return config.ridepetlevel; 
	else 
		return -1; 
} 
#ifdef _VIP_SERVER 
int getNewplayergivevip( void ) 
{ 
	return config.newplayerpetvip < 0?0:config.newplayerpetvip; 
} 
#endif 
#endif 
 
#ifdef _UNLAW_WARP_FLOOR 
int getUnlawwarpfloor( unsigned int index ) 
{ 
  if(config.unlawwarpfloor[index] > 0 ) 
		return config.unlawwarpfloor[index]; 
	else 
		return -1; 
} 
#endif 
 
#ifdef _WATCH_FLOOR 
int getWatchFloor( unsigned int index ) 
{ 
  if(config.watchfloor[index] > 0 ) 
		return config.watchfloor[index]; 
	else 
		return -1; 
} 
char* getWatchFloorCF( void ) 
{ 
	return (config.watchfloor[0]>0)? "ÊÇ":"·ñ"; 
} 
#endif 
 
#ifdef _BATTLE_FLOOR 
int getBattleFloor( unsigned int index ) 
{ 
  if(config.battlefloor[index] > 0 ) 
		return config.battlefloor[index]; 
	else 
		return -1; 
} 
char* getBattleFloorCF( void ) 
{ 
	return (config.battlefloor[0]>0)? "ÊÇ":"·ñ"; 
} 
#endif 
 
#ifdef _USER_EXP_CF 
 
char* getEXPfile( void ) 
{ 
    return config.expfile; 
} 
#endif 
 
#ifdef _UNREG_NEMA 
char* getUnregname( int index ) 
{ 
    return config.unregname[index]; 
} 
#endif 
 
#ifdef _TRANS_LEVEL_CF 
int getChartrans( void ) 
{ 
		if(config.chartrans>6) 
			config.chartrans=6; 
    return config.chartrans; 
} 
int getPettrans( void ) 
{ 
		if(config.pettrans>2) 
			return 2; 
		else if(config.pettrans<-1) 
			return -1; 
    return config.pettrans; 
} 
int getYBLevel( void ) 
{ 
		if(config.yblevel>config.maxlevel) 
			config.yblevel=config.maxlevel; 
    return config.yblevel; 
} 
int getMaxLevel( void ) 
{ 
    return config.maxlevel; 
} 
#endif 
 
#ifdef _POINT 
char* getPoint( void ) 
{ 
		return (config.point>0)? "ÊÇ":"·ñ"; 
} 
int getTransPoint( int index ) 
{ 
		return config.transpoint[index]; 
} 
#endif 
 
#ifdef _PET_UP 
char* getPetup( void ) 
{ 
		return (config.petup>0)? "ÊÇ":"·ñ"; 
} 
#endif 
#ifdef _LOOP_ANNOUNCE 
char* getLoopAnnouncePath( void ) 
{ 
		return config.loopannouncepath; 
} 
int loadLoopAnnounce( void ) 
{ 
	FILE* fp; 
	int i = 0; 
	config.loopannouncemax=0; 
	fp = fopen(config.loopannouncepath, "r"); 
	if (fp == NULL) 
	{ 
		print("ÎÞ·¨´ò¿ªÎļþ\n"); 
		return FALSE; 
	} 
	while(1){ 
		char	line[1024]; 
		if (fgets(line, sizeof(line), fp) == NULL)	break; 
		chop(line); 
 
		if( line[0] == '#' ) 
			continue; 
		for( i=0; i<10; i++ ){ 
            if( line[i] == '#' ){ 
			    line[i] = '\0'; 
		        break; 
			} 
		} 
		//************************************* 
		strcpy(config.loopannounce[config.loopannouncemax],line); 
		config.loopannouncemax++; 
	} 
	fclose(fp); 
	return TRUE; 
} 
int getLoopAnnounceTime( void ) 
{ 
    return (config.loopannouncetime<0)?-1:config.loopannouncetime; 
} 
int getLoopAnnounceMax( void ) 
{ 
    return (config.loopannouncemax>0)?config.loopannouncemax:0; 
} 
char* getLoopAnnounce( int index ) 
{ 
    return config.loopannounce[index]; 
} 
#endif 
 
#ifdef _SKILLUPPOINT_CF 
int getSkup( void ) 
{ 
    return (config.skup>0)?config.skup:0; 
} 
#endif 
#ifdef _RIDELEVEL 
int getRideLevel( void ) 
{ 
    return config.ridelevel; 
} 
#endif 
#ifdef _REVLEVEL 
char* getRevLevel( void ) 
{ 
		return (config.revlevel>0)?"ÊÇ":"·ñ"; 
} 
#endif 
#ifdef _NEW_PLAYER_RIDE 
char* getPlayerRide( void ) 
{ 
		if(config.npride>2) 
			return "ÅäÌ×ËÍ»¢¼ÓÀ×"; 
		else if(config.npride==2) 
			return "ÅäÌ×ËÍÀ×"; 
		else if(config.npride==1) 
			return "ÅäÌ×ËÍ»¢"; 
		else 
			return "²»ËÍÅäÌׯï³è"; 
} 
#endif 
 
#ifdef _FIX_CHARLOOPS 
int getCharloops( void ) 
{ 
    return config.charloops-1; 
} 
#endif 
 
#ifdef _PLAYER_ANNOUNCE 
int getPAnnounce( void ) 
{ 
    return (config.pannounce>-1)?config.pannounce:-1; 
} 
#endif 
#ifdef _PLAYER_MOVE 
int getPMove( void ) 
{ 
    return (config.pmove>-1)?config.pmove:-1; 
} 
#endif 
 
int getrecvbuffer( void ) 
{ 
		if(config.recvbuffer<0) 
	    return 0; 
	  else if(config.recvbuffer>128) 
	    return 128; 
	  else 
	  	return config.recvbuffer; 
} 
 
int getsendbuffer( void ) 
{ 
		if(config.sendbuffer<0) 
	    return 0; 
	  else if(config.sendbuffer>128) 
	    return 128; 
	  else 
	  	return config.sendbuffer; 
} 
 
int getrecvlowatbuffer( void ) 
{ 
		if(config.recvlowatbuffer<0) 
	    return 0; 
	  else if(config.recvlowatbuffer>1024) 
	    return 1024; 
	  else 
	  	return config.recvlowatbuffer; 
} 
 
int getrunlevel( void ) 
{ 
		if(config.runlevel<-20) 
	    return -20; 
	  else if(config.runlevel>19) 
	    return 19; 
	  else 
	  	return config.runlevel; 
 
} 
 
#ifdef _SHOW_VIP_CF 
int getShowVip( void ) 
{ 
		if(config.showvip>2) 
			return 2; 
		else if(config.showvip<0) 
			return 0; 
		else 
			return config.showvip; 
} 
#endif 
 
#ifdef _PLAYER_NUM 
int getPlayerNum( void ) 
{ 
		return config.playernum; 
} 
void setPlayerNum( int num ) 
{ 
		config.playernum=num; 
} 
#endif 
 
#ifdef _BATTLE_GOLD 
int getBattleGold( void ) 
{ 
		if(config.battlegold<0) 
	    return 0; 
	  else if(config.battlegold>100) 
	    return 100; 
	  else 
	  	return config.battlegold; 
 
} 
#endif 
 
#ifdef _ANGEL_TIME 
int getAngelPlayerTime( void ) 
{ 
		return (config.angelplayertime>1)?config.angelplayertime:1; 
} 
int getAngelPlayerMun( void ) 
{ 
		return (config.angelplayermun>2)?config.angelplayermun:2; 
} 
#endif 
 
#ifdef _RIDEMODE_20 
int getRideMode( void ) 
{ 
		if(config.ridemode<0) 
			config.ridemode=0; 
		return config.ridemode; 
} 
#endif 
#ifdef _FM_POINT_PK 
char *getFmPointPK( void ) 
{ 
		return (config.fmpointpk>0)?"ÊÇ":"·ñ"; 
} 
#endif 
#ifdef _ENEMY_ACTION 
int getEnemyAction( void ) 
{ 
		if(config.enemyact>100) 
			return 100; 
		else if(config.enemyact<1) 
			return 1; 
		else 
			return config.enemyact; 
} 
#endif 
 
int getCpuUse( void ) 
{ 
	return config.cpuuse; 
} 
#ifdef _CHECK_PEPEAT 
int getCheckRepeat( void ) 
{ 
		return (config.CheckRepeat>0)?1:0; 
} 
#endif 
 
#ifdef _VIP_ALL 
int getCheckVip( void ) 
{ 
		return config.checkvip; 
} 
#endif 
 
#ifdef _FM_JOINLIMIT 
int getJoinFamilyTime( void ) 
{ 
		return config.joinfamilytime; 
} 
#endif