#include "version.h"
#include <unistd.h>
#include <stdio.h>
#include <strings.h>
#include <unistd.h>


#include "configfile.h"
#include "util.h"
#include "net.h"
#include "msignal.h"
#include "buf.h"
#include "object.h"
#include "char.h"
#include "char_data.h"
#include "item.h"
#include "readmap.h"
#include "function.h"
#include "saacproto_cli.h"
#include "lssproto_serv.h"
#include "readnpc.h"
#include "log.h"
#include "handletime.h"
#include "title.h"
#include "encount.h"
#include "enemy.h"
#include "battle.h"
#include "magic_base.h"
#include "pet_skill.h"
#include "item_gen.h"
#include "petmail.h"
#include "npc_quiz.h"
#ifdef _ALLBLUES_LUA
#include "mylua/mylua.h"
#endif
#ifdef _PROFESSION_SKILL			// WON ADD 人物职业技能
#include "profession_skill.h"
#endif

#ifdef _ITEM_QUITPARTY
#include "init.h"
//int itemquitparty_num = 0;
//static DisappearItem *Disappear_Item;
#endif

#define MESSAGEFILE "hoge.txt"

#define OPTIONSTRING "d:f:h"
#define usage() print( "Usage: %s ["OPTIONSTRING"]\n", getProgname() );
extern int yzflg;
void printUsage( void )
{
    usage();
  /*print( "Usage: %s ["OPTIONSTRING"]\n", progname );*/
    print( "          [-d debuglevel]        default value is 0\n" );
    print( "          [-f configfilename]    default value is setup.cf\n"
        );
}

/*
 *
 * 娄醒
 * 忒曰袄
 *      TRUE(1)     恳橘卅戊穴件玉仿奶件娄醒分匀凶日
 *      FALSE(0)    唱橘卅戊穴件玉仿奶件娄醒分匀凶日
 */
BOOL parseCommandLine( int argc , char** argv )
{
    int c;                          /* getopt 匹银丹 */
    extern char* optarg;            /* getopt 匹银丹 */


    while( ( c = getopt( argc, argv ,OPTIONSTRING )) != -1 ){
        switch( c ){
        case 'd':
        {
            int     debuglevel;
            if( !strtolchecknum( optarg, (int*)&debuglevel, 10,
                                 INT)){
                print( "Specify digit number\n" );
                return FALSE;
            }
            setDebuglevel( debuglevel );
            break;
        }
        case 'f':
            setConfigfilename( optarg );
            break;
        case 'h':
            printUsage();
            return FALSE;
            break;

        default:
            printUsage();
            return FALSE;
            break;

        }
    }
    return TRUE;
}


/*
 * 娄醒
 *
 * 漆及赭窒手仄卅中
 */
BOOL parseEnvironment( char** env )
{
    if( getDebuglevel() >= 3 ){
        int index=0;
        while( env[index] != NULL )print( "%s " , env[index++] );
        print( "\n" );
    }
    return TRUE;
}




#define LSGENWORKINGBUFFER  65536*4



#define GOTORETURNFALSEIFFALSE(x) if(!(x))goto RETURNFALSE
/*
 * 赓渝祭伙□民件
 * 娄醒
 *      argc    argv及醒
 *      argv    戊穴件玉仿奶件娄醒
 * 忒曰袄
 */
BOOL init(int argc , char** argv , char** env )
{
#ifdef _ITEM_QUITPARTY
    FILE *f;
	int i;
	char line[256];
#endif
    srand( getpid());
    print( "This Program is compiled at %s %s by gcc %s\n",
           __DATE__ , __TIME__ , __VERSION__ );

    defaultConfig( argv[0] );
    signalset();

    GOTORETURNFALSEIFFALSE(parseCommandLine( argc , argv ));
    GOTORETURNFALSEIFFALSE(parseEnvironment( env ));

    {
        Char    aho;
        debug( sizeof( aho ), d);
        debug( sizeof( aho.data ), d);
        debug( sizeof( aho.string ), d);
        debug( sizeof( aho.flg ),d);
        debug( sizeof( aho.indexOfExistItems ), d);
        debug( sizeof( aho.haveSkill ), d);
        debug( sizeof( aho.indexOfHaveTitle ), d);
        debug( sizeof( aho.addressBook ),d);
        debug( sizeof( aho.workint ),d);
        debug( sizeof( aho.workchar ),d);
    }

    print( "配置文件: %s\n" , getConfigfilename() );
		
    GOTORETURNFALSEIFFALSE(readconfigfile( getConfigfilename() ) );
    
    nice(getrunlevel());
    //ttom start
    {  int iWork = setEncodeKey();
       if( iWork == 0 ){
       // 巨件戊□玉平□毛涩烂
       printf( "----------------------------------------\n" );
       printf( "-------------[编码] 无法设置 %s\n", getConfigfilename() );
       printf( "----------------------------------------\n" );
       exit( 1 );
       }else{
            // 巨件戊□玉平□毛涩烂
               printf( "编码 = %d\n", iWork );
       }
    }
    // AcWBuff毛涩烂
    {   int iWork = setAcWBSize();
        if( iWork == 0 ){
           printf( "----------------------------------------\n" );
           printf( "-------------[AC缓冲] 无法设置 %s\n", getConfigfilename() );
           printf( "----------------------------------------\n" );
           exit( 1 );
           }else{
                   printf( "AC缓冲 = %d\n", iWork );
           }
    }
    //ttom end

    if( getDebuglevel() >= 1 ){
//		print("ServerType: %d\n", getServerType() );
				print("调试等级: %d\n", getDebuglevel() );
				print("运行等级: %d\n", getrunlevel() );
				print("接收缓冲: %d\n", getrecvbuffer()*1024);
				print("发送缓冲: %d\n", getsendbuffer()*1024);
				print("接收缓冲下限: %d\n", getrecvlowatbuffer());
        print("内存单元大小: %d\n", getMemoryunit() );
        print("内存单元数量: %d\n", getMemoryunitnum() );

        print("账号服务器地址: %s\n", getAccountservername() );
        print("账号服务器端口: %d\n", getAccountserverport() );
        print("登陆服务器名称: %s\n",
              getGameservername());
        print("登陆服务器密码: %s\n", getAccountserverpasswd());

        print("等待连接端口: %d\n", getPortnumber() );

        print("服务端序列号: %d\n", getServernumber() );

        print("重复地址使用: %d\n", getReuseaddr() );


        print("最大在线人数: %d\n", getFdnum() );
        print("最大在线宠数: %d\n", getPetcharnum() );
        print("最大其他数目: %d\n", getOtherscharnum() );
        print("最大对象数目: %d\n", getObjnum() );
        print("最大物品数目: %d\n", getItemnum() );
        print("最大战斗数目: %d\n", getBattlenum() );
        print("顶层文件目录: %s\n", getTopdir());
        print("地图文件目录: %s\n", getMapdir());
        print("地图标识文件: %s\n", getMaptilefile());
        print("物品配置文件: %s\n", getItemfile());
        print("不可战斗文件: %s\n", getInvfile());
        print("显示位置文件: %s\n", getAppearfile());
        print("遇敌配置文件: %s\n", getEffectfile());
        print("头衔名称文件: %s\n", getTitleNamefile());
        print("头衔配置文件: %s\n", getTitleConfigfile());
        print("遇敌坐标文件: %s\n", getEncountfile());
        print("遇敌组群文件: %s\n", getGroupfile());
        print("宠物基本文件: %s\n", getEnemyBasefile());
        print("创建宠物文件: %s\n", getEnemyfile());
        print("精灵魔法文件: %s\n", getMagicfile());

#ifdef _ATTACK_MAGIC
        print("攻击魔法文件: %s\n", getAttMagicfileName() );
#endif

        print("宠物技能文件: %s\n", getPetskillfile());

#ifdef _PROFESSION_SKILL			// WON ADD 人物职业技能
        print("职业技能文件: %s\n", getProfession());
#endif

        print("物品成份文件: %s\n", getItematomfile());
        print("猜迷问题文件: %s\n", getQuizfile());
#ifdef _GMRELOAD
				print("G M 配置文件: %s\n", getGMSetfile());
#endif
        print("日志记录文件: %s\n",  getLsgenlogfilename() );
        print("还原资料目录: %s\n", getStoredir());
        print("NPC 配置目录: %s\n", getNpcdir());
        print("日志记载文件: %s\n",  getLogdir());
        print("日志配置文件: %s\n", getLogconffile() );
        print("GM的指命密码: %s\n", getChatMagicPasswd() );
        print("使用GM的权限: %d\n", getChatMagicCDKeyCheck() );

        print("NPC 模板数目: %d\n", getNpctemplatenum() );
        print("NPC 最大数目: %d\n", getNpccreatenum() );

        print("走路时间间隔: %d\n", getWalksendinterval());
        print("清除所有间隔: %d\n", getCAsendinterval_ms());
        print("清除目标间隔: %d\n", getCDsendinterval_ms());
        print("执行一次时间: %d\n", getOnelooptime_ms());
        print("宠物清除时间: %d\n", getPetdeletetime());
        print("道具清除时间: %d\n", getItemdeletetime());
#ifdef _DEL_DROP_GOLD
				print("石器清除时间: %d\n", getGolddeletetime());
#endif
        print("数据保存间隔: %d\n", getCharSavesendinterval());

        print("名片最大数目: %d\n", getAddressbookoffmsgnum());
        print("读取频率协议: %d\n" ,getProtocolreadfrequency());

        print("连接错误上限: %d\n", getAllowerrornum());
#ifdef _GET_BATTLE_EXP
				print("战斗经验倍数: %d倍\n", getBattleexp() );
#endif
#ifdef _NEW_PLAYER_CF
				print("出生人物转数: %d转\n", getNewplayertrans());
				print("出生人物等级: %d级\n", getNewplayerlv());
				print("出生人物金钱: %d S\n", getNewplayergivegold());
				print("出生宠物等级: %d级\n", getNewplayerpetlv());
#ifdef _VIP_SERVER
				print("出生拥有点数: %d点\n", getNewplayergivevip());
#endif
				print("出生能骑等级: %d\n", getRidePetLevel());
#ifdef _NEW_PLAYER_RIDE
				print("出生配套骑宠: %s\n", getPlayerRide());
#endif
				print("出生拥有宠物: NO1:%d NO2:%d NO3:%d NO4:%d NO5:%d\n",getNewplayergivepet(0),
																																	getNewplayergivepet(1),
																																	getNewplayergivepet(2),
																																	getNewplayergivepet(3),
																																	getNewplayergivepet(4));
				print("出生拥有物品: ITEM1:%d ITEM2:%d ITEM3:%d ITEM4:%d ITEM5:%d\n"
							"　　　　　　　ITEM1:%d ITEM2:%d ITEM3:%d ITEM4:%d ITEM5:%d\n"
							"　　　　　　　ITEM1:%d ITEM2:%d ITEM3:%d ITEM4:%d ITEM5:%d\n"
																																	,getNewplayergiveitem(0)
																																	,getNewplayergiveitem(1)
																																	,getNewplayergiveitem(2)
																																	,getNewplayergiveitem(3)
																																	,getNewplayergiveitem(4)
																																	,getNewplayergiveitem(5)
																																	,getNewplayergiveitem(6)
																																	,getNewplayergiveitem(7)
																																	,getNewplayergiveitem(8)
																																	,getNewplayergiveitem(9)
																																	,getNewplayergiveitem(10)
																																	,getNewplayergiveitem(11)
																																	,getNewplayergiveitem(12)
																																	,getNewplayergiveitem(13)
																																	,getNewplayergiveitem(14));
#endif
#ifdef _UNREG_NEMA
		print("禁止人物名称: 名字1:%s 名字2:%s 名字3:%s 名字4:%s 名字5:%s\n",getUnregname(0),
																																	getUnregname(1),
																																	getUnregname(2),
																																	getUnregname(3),
																																	getUnregname(4));
#endif
#ifdef _UNLAW_WARP_FLOOR
		print("禁止传送地图: 地图1:%d 地图2:%d 地图3:%d 地图4:%d 地图5:%d\n"
	          "              地图1:%d 地图2:%d 地图3:%d 地图4:%d 地图5:%d\n",getUnlawwarpfloor(0),
																																					getUnlawwarpfloor(1),
																																					getUnlawwarpfloor(2),
																																					getUnlawwarpfloor(3),
																																					getUnlawwarpfloor(4),
																																					getUnlawwarpfloor(5),
																																					getUnlawwarpfloor(6),
																																					getUnlawwarpfloor(7),
																																					getUnlawwarpfloor(8),
																																					getUnlawwarpfloor(9));
#endif
#ifdef _WATCH_FLOOR
		print("是否全图观战: %s\n",getWatchFloorCF());
		if(strcmp(getWatchFloorCF(),"是"))
			print("允许观战地图: 地图1:%d 地图2:%d 地图3:%d 地图4:%d 地图5:%d\n",getWatchFloor(1),
																																		getWatchFloor(2),
																																		getWatchFloor(3),
																																		getWatchFloor(4),
																																		getWatchFloor(5));
#endif

#ifdef _BATTLE_FLOOR
		print("是否强制战斗: %s\n",getBattleFloorCF());
		if(strcmp(getBattleFloorCF(),"是"))
			print("强制战斗地图: 地图1:%d 地图2:%d 地图3:%d 地图4:%d 地图5:%d\n",getBattleFloor(1),
																																		getBattleFloor(2),
																																		getBattleFloor(3),
																																		getBattleFloor(4),
																																		getBattleFloor(5));
#endif

#ifdef _TRANS_LEVEL_CF
		print("人物等级转数: %d级\n",getChartrans());
		print("宠物等级转数: %d级\n",getPettrans());
#endif

#ifdef _POINT
		print("禁止点数上限: %s\n",getPoint());
		if(strcmp(getPoint(),"是"))
			print("每转点数上限: 0转:%d 1转:%d 2转:%d 3转:%d 4转:%d 5转:%d 6转:%d\n",getTransPoint(0),
																																								getTransPoint(1),
																																								getTransPoint(2),
																																								getTransPoint(3),
																																								getTransPoint(4),
																																								getTransPoint(5),
																																								getTransPoint(6));
#endif
//#ifdef _PET_UP
//		print("宠物能否捡获: %s\n",getPetup());
//#endif
#ifdef _LOOP_ANNOUNCE
		print("循环公告路径: %s\n",getLoopAnnouncePath());
		print("循环时间间隔: %d分钟\n",getLoopAnnounceTime());
#endif
#ifdef _SKILLUPPOINT_CF
		print("每级升级点数: %d\n",getSkup());
#endif

#ifdef _RIDELEVEL
		print("骑宠等级相差: %d级\n",getRideLevel());
#endif
#ifdef _REVLEVEL
		print("还原上限等级: %s级\n",getRevLevel());	
#endif
#ifdef _TRANS_LEVEL_CF
		print("一般等级上限: %d级\n",getYBLevel());	
		print("最高等级上限: %d级\n",getMaxLevel());	
#endif
#ifdef _FIX_CHARLOOPS
	print("恶魔时间倍数: %d倍\n",getCharloops());	
#endif
#ifdef _PLAYER_ANNOUNCE
	if(getPAnnounce()==-1)
		print("喇叭消耗点数: 关闭使用\n");
	else
		print("喇叭消耗点数: %d点\n",getPAnnounce());	
#endif
#ifdef _PLAYER_MOVE
	if(getPMove()==-1)
		print("顺移消耗点数: 关闭使用\n");	
	else
		print("顺移消耗点数: %d点\n",getPMove());	
#endif
#ifdef _BATTLE_GOLD
		print("战斗获得金钱: %d%\n",getBattleGold());	
#endif
#ifdef _ANGEL_TIME
		print("精灵召唤时间: (%d人/在线人数)分\n",getAngelPlayerTime());	
		print("精灵召唤人数: %d人\n",getAngelPlayerMun());	
#endif
#ifdef _RIDEMODE_20
		print("2.0 骑宠模式: %d\n",getRideMode());	
#endif
#ifdef _FM_POINT_PK
		print("庄园互抢模式: %s\n",getFmPointPK());	
#endif
#ifdef _CAX_ESC_REPORT
		print("普通会员签到: ITEM1:%d ITEM2:%d ITEM3:%d ITEM4:%d ITEM5:%d\n"
				,getReportItem(0)
				,getReportItem(1)
				,getReportItem(2)
				,getReportItem(3)
				,getReportItem(4));
		print("VIP 会员签到: ITEM1:%d ITEM2:%d ITEM3:%d ITEM4:%d ITEM5:%d\n"
				,getVipReportItem(0)
				,getVipReportItem(1)
				,getVipReportItem(2)
				,getVipReportItem(3)
				,getVipReportItem(4));
#endif
    }

	{	//andy_add 2003/05/05 check GameServer Name
		char *GameServerName;
		GameServerName = getGameserverID();
		if( GameServerName == NULL || strlen( GameServerName) <= 0 )
			return FALSE;
		print("\n游戏服务器ID: %s\n",  GameServerName );
	}
    print("开始初始化\n" );
 #ifdef _TRANS_7_COLOR
    if(getping())
		{
			print("服务器不可显示网速\n");
			system("echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all");
		}else
		{
			print("服务器可显示网速\n");
			system("echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all");
		}  
#endif   
//#define DEBUG1( arg... ) if( getDebuglevel()>1 ){##arg}
    print( "建立内存空间..." );
    GOTORETURNFALSEIFFALSE(configmem( getMemoryunit(),
                                      getMemoryunitnum() ) );
    GOTORETURNFALSEIFFALSE(memInit());
		print( "完成\n" );
				
		print( "始终化连接空间..." );
    if( !initConnect(getFdnum()) )
        goto MEMEND;
    print( "完成\n" );
    while( 1 ){
        print( "尝试绑定本地端口 %d... " , getPortnumber());
        bindedfd = bindlocalhost( getPortnumber() );
        if( bindedfd == -1 )
            sleep( 10 );
        else
            break;
    }
	print( "完成\n" );

	print( "建立对象..." );
    if( !initObjectArray( getObjnum()) )
        goto CLOSEBIND;
	print( "完成\n" );
	
	print( "建立人物..." );
#ifdef _OFFLINE_SYSTEM
    if(!CHAR_initCharArray( getPlayercharnum(), getPetcharnum(),getOtherscharnum()) )
#else
    if(!CHAR_initCharArray( getFdnum(), getPetcharnum(),getOtherscharnum()) )
#endif
        goto CLOSEBIND;
	print( "完成\n" );
	print( "建立物品...");
    if(!ITEM_readItemConfFile( getItemfile()) )
        goto CLOSEBIND;
    if(!ITEM_initExistItemsArray( getItemnum() ) )
        goto CLOSEBIND;
	print( "完成\n" );

	print( "建立战斗..." );
    if(!BATTLE_initBattleArray( getBattlenum() ) )
        goto CLOSEBIND;
	print( "完成\n" );

	print( "建立功能模块..." );
    if( !initFunctionTable() )
        goto CLOSEBIND;
	print( "完成\n" );
	
//	print("初始化账号安全机制...");
//		if( !cdkeyinit() )
//			goto CLOSEBIND;
//	print( "完成\n" );

	print( "初始化邮件..." );
    if( !PETMAIL_initOffmsgBuffer( getAddressbookoffmsgnum() ))
        goto CLOSEBIND;
	print( "完成\n" );

	print( "读取不可战斗文件..." );
    if( !CHAR_initInvinciblePlace( getInvfile() ) )
        goto CLOSEBIND;
	print( "完成\n" );

	print( "读取显示位置文件..." );
    if( !CHAR_initAppearPosition( getAppearfile() ) )
        goto CLOSEBIND;
	print( "完成\n" );

	print( "读取头衔名称文件..." );
    if( !TITLE_initTitleName( getTitleNamefile() ) )
        goto CLOSEBIND;
	print( "完成\n" );

	print( "读取头衔配置文件..." );
    if( !TITLE_initTitleConfig( getTitleConfigfile() ) )
        goto CLOSEBIND;
	print( "完成\n" );

	print( "读取遇敌坐标文件..." );
    if( !ENCOUNT_initEncount( getEncountfile() ) )
        goto CLOSEBIND;
	print( "完成\n" );

	print( "读取宠物基本文件..." );
    if( !ENEMYTEMP_initEnemy( getEnemyBasefile() ) )
        goto CLOSEBIND;
	print( "完成\n" );

	print( "读取创建宠物文件..." );
    if( !ENEMY_initEnemy( getEnemyfile() ) )
        goto CLOSEBIND;
	print( "完成\n" );

	print( "读取遇敌组群文件..." );
    if( !GROUP_initGroup( getGroupfile() ) )
        goto CLOSEBIND;
	print( "完成\n" );
	print( "读取魔法文件..." );
    if( !MAGIC_initMagic( getMagicfile() ) )
        goto CLOSEBIND;
	print( "完成\n" );

		#ifdef _ATTACK_MAGIC

	print( "读取魔法攻击文件..." );

    if( !ATTMAGIC_initMagic( getAttMagicfileName() ) )
//		if( !ATTMAGIC_initMagic( getMagicfile() ) )
        goto CLOSEBIND;

	print( "魔法攻击文件 -->%s..." , getAttMagicfileName());
	print( "完成\n" );

    #endif
 
	print( "读取宠物技能文件..." );
    if( !PETSKILL_initPetskill( getPetskillfile() ) )
        goto CLOSEBIND;
	print( "完成\n" );

#ifdef _PROFESSION_SKILL			// WON ADD 人物职业技能
	print( "读取职业技能文件..." );
	if( !PROFESSION_initSkill( getProfession() ) ){
		goto CLOSEBIND;
	}
	print( "完成\n" );
#endif

    /* 失奶  丞及笺    毛  戈 */
	print( "读取物品成份文件..." );
    if( !ITEM_initItemAtom( getItematomfile()) )
        goto CLOSEBIND;
	print("完成\n" );

	print( "初始化料理合成物品..." );
    if( !ITEM_initItemIngCache() )
        goto CLOSEBIND;
	print("完成\n" );
    
	print( "初始料理合成随机设定..." );
    if( !ITEM_initRandTable() )
        goto CLOSEBIND;
	print("完成\n" );
  
	print( "读取遇敌配置文件..." );
    if( !CHAR_initEffectSetting( getEffectfile() ) )
        goto CLOSEBIND;
	print( "完成\n" );
	print( "读取猜迷问题文件..." );
    if( !QUIZ_initQuiz( getQuizfile() ) )
        goto CLOSEBIND;
	print( "完成\n" );
#ifdef _GMRELOAD
	print( "读取GM配置文件..." );
	if ( !LoadGMSet( getGMSetfile() ) )
		goto CLOSEBIND;
	print( "完成\n" );
#endif
#ifdef _UNTEXT_TALK
	print("读取禁止关键字文件...");
	if(!LoadUnText())
		goto CLOSEBIND;
	print( "完成\n" );
#endif
#ifdef _USER_EXP_CF
	print( "读取经验配置文件..." );
	if ( !LoadEXP( getEXPfile() ) )
		goto CLOSEBIND;
	print("最高等级: %d...",getMaxLevel());
	print("一般等级: %d...",getYBLevel());
	print( "完成\n" );
#endif

#ifdef _ANGEL_SUMMON
	print("读取精灵召唤任务列表文件...");
	if( !LoadMissionList( ) )
		goto CLOSEBIND;
	print("完成\n");
#endif

#ifdef _JOBDAILY
	print("读取任务日志文件...");
	if(!LoadJobdailyfile())
		print("...失败\n");
	else
		print("完成\n");
#endif

#ifdef _LOOP_ANNOUNCE
	print("读取循环公告文件...");
	if(!loadLoopAnnounce())
		print("...失败\n");
	else
	 print("完成\n");
#endif
#ifdef _RIDE_CF
	print( "读取自定义骑宠文件..." );
	if(!CHAR_Ride_CF_init())
		print("...失败\n");
	print("完成\n");
#endif
#ifdef _FM_LEADER_RIDE
	print( "读取庄园族长专用骑宠文件..." );
	if(!CHAR_FmLeaderRide_init())
		print("...失败\n");
	print("完成\n");
#endif
#ifdef _RE_GM_COMMAND
	print( "自定义GM命令重命名文件..." );
	if(!re_gm_command())
		print("...失败\n");
	print("完成\n");
#endif
#ifdef _NEED_ITEM_ENEMY
	print( "读取抓宠必要物品配置文件..." );
	if(!need_item_eneny_init())
		print("...失败\n");
	print("完成\n");
#endif
	print( "建立地图..." );
    if( !MAP_initReadMap( getMaptilefile() , getMapdir() ))
        goto CLOSEBIND;
	print( "完成\n" );
	print( "读取NPC文件..." );
    if( !NPC_readNPCSettingFiles( getNpcdir(), getNpctemplatenum(),
                                  getNpccreatenum() ) )
        goto CLOSEBIND;
	print( "完成\n" );
	print( "初始化 NPC 服务器... " );
    if( lssproto_InitServer( lsrpcClientWriteFunc, LSGENWORKINGBUFFER ) < 0 )
        goto CLOSEBIND;
	print( "完成\n" );
	print( "尝试连接账号服务器... " );
    acfd = connectHost( getAccountservername(), getAccountserverport());
    if(acfd == -1)
        goto CLOSEBIND;

/*
	{
		int errorcode;
		int errorcodelen;
		int qs;

		errorcodelen = sizeof(errorcode);
		qs = getsockopt( acfd, SOL_SOCKET, SO_RCVBUF , &errorcode, &errorcodelen);
		//andy_log
		print("\n\n GETSOCKOPT SO_RCVBUF: [ %d, %d, %d] \n", qs, errorcode, errorcodelen);
	}
*/

	print( "完成\n" );
    initConnectOne( acfd, NULL , 0 );
    if( !CONNECT_acfdInitRB( acfd)) goto CLOSEAC;
    if( !CONNECT_acfdInitWB( acfd)) goto CLOSEAC;
    CONNECT_setCtype( acfd, AC );
	
	print( "初始化 NPC 客户端 ... " );
    /*  rpc(client)及赓渝祭 */
    if( saacproto_InitClient( lsrpcClientWriteFunc,LSGENWORKINGBUFFER, acfd) < 0)
        goto CLOSEAC;
	print( "完成\n" );

	print( "向账号服务器发送登陆请求... " );
    /*  夫弘奶件邰菲毛请允  */
   	{
			char buff[50];
#ifdef _TEST_SERVER
			sprintf(buff,"ziyunjack8-%s-%d",getAccountserverpasswd(),987);
			saacproto_ACServerLogin_send(acfd, getGameservername(), buff);
#else
			sprintf(buff,"ziyunjack8-%s-%d",getAccountserverpasswd(),789);
			saacproto_ACServerLogin_send(acfd, getGameservername(), buff);
#endif
    }
	print( "完成\n" );
  // if (strcmp(getlocaltime(), TimeLimitLocal)>0)exit(0);
    if( isExistFile( getLsgenlogfilename() ) ){
        lssproto_SetServerLogFiles( getLsgenlogfilename(),
                                    getLsgenlogfilename() );
        saacproto_SetClientLogFiles( getLsgenlogfilename(),
                                     getLsgenlogfilename() );
    }


	print( "初始化已完成\n" );

	print( "开始记始日志\n" );
    {
        char    logconffile[512];
        snprintf( logconffile, sizeof( logconffile), "%s/%s" ,
                  getLogdir(), getLogconffile() );
        if( !initLog( logconffile ) )
            goto CLOSEAC;
    }
#ifdef  _PET_ITEM
	restoreObjects( getStoredir() );
#endif
#ifdef _ITEM_QUITPARTY
	print( "读取队伍解散物品消失文件..." );
    
	//读取档案
    f = fopen( getitemquitparty(), "r" );
	if( f != NULL ){
		while( fgets( line, sizeof( line ), f ) ){
			if( line[0] == '#' )continue;
            if( line[0] == '\n' )continue;
		    chomp( line );
			itemquitparty_num++;
		}
		if( fseek( f, 0, SEEK_SET ) == -1 ){
			print( "物品录找错误\n" );
			fclose(f);
			goto CLOSEAC;
		}
		//配记忆体
		Disappear_Item = allocateMemory( sizeof(struct tagDisappearItem) * itemquitparty_num );
		if( Disappear_Item == NULL ){
			print( "无法分配内存 %d\n", sizeof(struct tagDisappearItem) * itemquitparty_num );
			fclose( f );
			goto CLOSEAC;
		}

		i = 0;
		//将道具编号存入 Disappear_Item.string
		while( fgets( line, sizeof( line ), f ) ){
			if( line[0] == '#' )continue;
			if( line[0] == '\n' )continue; 
			chomp( line );
			sprintf( Disappear_Item[i].string,"%s",line );
			print("\n道具编号:%s", Disappear_Item[i].string );
			i++;
		}
		fclose(f);
	}
#endif

    DEBUG_ADJUSTTIME = 0;
    print( "\n" );
    return TRUE;

CLOSEAC:
    close( acfd );
CLOSEBIND:
    close( bindedfd );
    endConnect();
MEMEND:
    memEnd();
RETURNFALSE:
    return FALSE;
}

