Exemple #1
0
//»¹Ô­ÌúǹÈþ¶Ñµþ
void NPC_reCheckItemPilenum( int meindex, int toindex)
{
	int i, itemindex;
	for( i=0; i<CHAR_MAXITEMHAVE; i++){
		itemindex = CHAR_getItemIndex( toindex , i );
		if( !ITEM_CHECKINDEX( itemindex) ) continue;//ITEM_USEPILENUMS
		if( ITEM_getInt( itemindex, ITEM_ID) != 20284 ) continue;
		if( ITEM_getInt( itemindex, ITEM_CANBEPILE) != 1 ) continue;

		if( ITEM_getInt( itemindex, ITEM_USEPILENUMS) > 1 ){
			int itemID, pilenum=1, newindex;
			itemID = ITEM_getInt( itemindex, ITEM_ID);
			if( !ITEM_CHECKITEMTABLE( itemID) ) continue;
			pilenum = ITEM_getInt( itemindex, ITEM_USEPILENUMS);
			while( pilenum > 1 ){
				int ti = CHAR_findEmptyItemBox( toindex);
				if( ti == -1 ){
					CHAR_sendItemDataOne( toindex, i);
					CHAR_talkToCli( toindex, -1, "µÀ¾ßÀ¸Î»ÒÑÂú¡£", CHAR_COLORYELLOW);
					return;
				}
				newindex = ITEM_makeItemAndRegist( itemID);
				if( !ITEM_CHECKINDEX( newindex) ) break;
				CHAR_setItemIndex( toindex , ti, newindex);
				CHAR_sendItemDataOne( toindex, ti);
				pilenum--;
				ITEM_setInt( itemindex, ITEM_USEPILENUMS, pilenum);
			}
			if( ITEM_getInt( itemindex, ITEM_CANBEPILE) != ITEMTBL_getInt( itemID, ITEM_CANBEPILE) )
				ITEM_setInt( itemindex, ITEM_CANBEPILE, ITEMTBL_getInt( itemID, ITEM_CANBEPILE) );
			CHAR_sendItemDataOne( toindex, i);
		}
	}
	CHAR_talkToCli( toindex, -1, "ÌúǹÈþ´¦ÀíÍê±Ï¡£", CHAR_COLORYELLOW);
}
Exemple #2
0
BOOL CHECK_ITEMEQUIT( int toindex)
{
	int i, itemindex;
	char token[256];

	for (i = CHAR_STARTITEMARRAY; i < CHAR_MAXITEMHAVE; i ++) {
		itemindex = CHAR_getItemIndex( toindex, i);
		if( ITEM_getInt( itemindex, ITEM_ID) == 19646 ){
			CHAR_DelItem( toindex, i);
			itemindex = -1;
			itemindex = ITEM_makeItemAndRegist( 1292);
			if( !ITEM_CHECKINDEX( itemindex) ){
			}else{
				int ret = CHAR_addItemSpecificItemIndex( toindex, itemindex);
				if( ret < 0 || ret >= CHAR_MAXITEMHAVE ) {
					ITEM_endExistItemsOne( itemindex);
					continue;
				}
				sprintf( token,"Äõ½%s", ITEM_getChar( itemindex, ITEM_NAME));
				CHAR_talkToCli( toindex, -1, token, CHAR_COLORYELLOW );
				CHAR_sendItemDataOne( toindex, ret);
				continue;
			}
		}
		if( ITEM_getInt( itemindex, ITEM_ID) == 1292 &&
			ITEM_getInt( itemindex, ITEM_MAXDAMAGECRUSHE) > 0 ){

			ITEM_setInt( itemindex, ITEM_MAXDAMAGECRUSHE, 0);
			ITEM_setInt( itemindex, ITEM_DAMAGECRUSHE, 0);
			sprintf(token,"ÐÞÕý%sË𻵶È", ITEM_getChar( itemindex, ITEM_NAME));
			CHAR_sendItemDataOne( toindex, i);
			CHAR_talkToCli( toindex, -1, token, CHAR_COLORYELLOW);
		}
	}	

	// ¼Ä·Åµê
	for (i = 0; i < CHAR_MAXPOOLITEMHAVE; i++) {
		if( ITEM_getInt( itemindex, ITEM_ID) == 1292 &&
			ITEM_getInt( itemindex, ITEM_MAXDAMAGECRUSHE) > 0 ){

			ITEM_setInt( itemindex, ITEM_MAXDAMAGECRUSHE, 0);
			ITEM_setInt( itemindex, ITEM_DAMAGECRUSHE, 0);
			sprintf(token,"ÐÞÕý¼Ä·ÅµêÖÐ%sË𻵶È", ITEM_getChar( itemindex, ITEM_NAME));
			CHAR_talkToCli( toindex, -1, token, CHAR_COLORYELLOW);
		}
	}

	return TRUE;
}
Exemple #3
0
BOOL PetTalk_AddItem(int meindex, int talker, char *buf)
{
	int itemID,k=1,itemindex=-1;
	int spaceNum=5,i;
	char buff3[256], msgbuf[64], token[256];
	int ret;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
  while( getStringFromIndexWithDelim(buf , "," , k, buff3, sizeof(buff3)) !=FALSE ){
	k++;
		for( i = spaceNum ; i < CHAR_MAXITEMHAVE ; i++ ){
			itemindex=CHAR_getItemIndex( talker , i );
			if( itemindex == -1 )	{
				spaceNum = i+1;
				break;
			}
		}                                                                                                                                                                                                                                                                                                                                      
		if( i == CHAR_MAXITEMHAVE )	{
			snprintf( msgbuf,sizeof( msgbuf), "主人,你的物品栏已经满了!!");
			CHAR_talkToCli( talker, meindex, msgbuf,  CHAR_COLORWHITE);
			return FALSE;
		}
  }
  k=1;
  while( getStringFromIndexWithDelim(buf , "," , k, buff3, sizeof(buff3)) !=FALSE ){
	k++;
        itemID = atoi( buff3);
        if( itemID  )
		itemindex = ITEM_makeItemAndRegist( itemID);
		if(itemindex == -1)
			continue;
		ret = CHAR_addItemSpecificItemIndex( talker, itemindex);
		if( ret < 0 || ret >= CHAR_MAXITEMHAVE ) {
			ITEM_endExistItemsOne( itemindex);
			print ("\n ret error!!");
			return FALSE;
		}
		sprintf( token,"拿到%s",ITEM_getChar( itemindex, ITEM_NAME));
		CHAR_talkToCli( talker, -1,token,CHAR_COLORWHITE);
                                
		CHAR_sendItemDataOne( talker, ret);
		                                                                                                
  }
	return TRUE;	                                                                                                                                                                      
}
Exemple #4
0
BOOL NPC_Util_createItemToChar( int charindex, int itemid , BOOL net)
{
    int emptyitemindexinchara, itemindex;
    emptyitemindexinchara = CHAR_findEmptyItemBox( charindex );

    if( emptyitemindexinchara < 0 )return FALSE;
	itemindex = ITEM_makeItemAndRegist( itemid );
    if( itemindex != -1 ){
        CHAR_setItemIndex( charindex, emptyitemindexinchara, itemindex );
        ITEM_setWorkInt(itemindex, ITEM_WORKOBJINDEX,-1);
        ITEM_setWorkInt(itemindex, ITEM_WORKCHARAINDEX,charindex);

        if(net) {
        	CHAR_sendItemDataOne( charindex, emptyitemindexinchara);
        }
        return TRUE;
    }
    return FALSE;
}
int NPC_PAItemShop_AddItem( int itemID, int ret)
{
	AUCTIONITEMs *works = NULL;
	AUCTIONITEMs *heads = NULL;

	int i, itemindex;
	works = pAuctionItem;
	heads = pAuctionItem;

	itemindex = ITEM_makeItemAndRegist( itemID);
	if( !ITEM_CHECKINDEX( itemindex) )
		return -1;

	i=0;
	while( i <= MAXAUCTIONs ){
		if( works == NULL )	{
			works = LIST_getNew();
			if( works == NULL )
				return -1;
			works->index = itemindex;
			works->use = 1;
			works->ti = ret;
			works->next = NULL;
			if( heads == NULL )	{
				pAuctionItem = works;
			}else	{
				heads->next = works;
			}
			works = pAuctionItem;
			return itemindex;
		}
		i++;
		heads = works;
		works = works->next;
		if( i >= MAXAUCTIONs )
			break;
	}
	return -1;
}
Exemple #6
0
int AngelCreate( int angelindex)
{
	int emptyitem1, emptyitem2;
	int angeltokenindex, herotokenindex;
	char msgbuf[1024]/*, nameinfo[1024]*/;
	int mindex, mission;
	char heroname[64];

	if( !CHAR_CHECKINDEX( angelindex))	return FALSE;

	print(" 天使答应了!! ");

	mindex = checkIfAngel( angelindex);
	if( mindex == -1 || missiontable[mindex].flag == MISSION_TIMEOVER ) {
		//print("\n ANGEL错误!!Table逾时或无资料??:%d ", angelindex );
		CHAR_talkToCli( angelindex, -1, "很抱歉,你太晚回答,已经逾时了。", CHAR_COLORYELLOW);

		sprintf( msgbuf, " 回答逾时或无资料 i:%d 使者:%s %s ", mindex, CHAR_getChar( angelindex, CHAR_CDKEY), CHAR_getChar( angelindex, CHAR_NAME));
		print( msgbuf);
		LogAngel( msgbuf);

		return FALSE;
	}

	if( missiontable[mindex].flag != MISSION_WAIT_ANSWER ) {
		print(" 旗标不符:%d ", missiontable[mindex].flag);
		return FALSE;
	}

	if( CHAR_findEmptyItemBoxNo( angelindex ) < 2 ){
		CHAR_talkToCli( angelindex, -1, "空间栏位不足。至少要有两个空道具栏位。", CHAR_COLORYELLOW);
		return TRUE;
	}

	getStringFromIndexWithDelim( missiontable[mindex].heroinfo, ":", 2, heroname, sizeof(heroname));

	angeltokenindex = ITEM_makeItemAndRegist( ANGELITEM );
	if( angeltokenindex != -1 ){
		/*if( ITEM_getInt( angeltokenindex, ITEM_TYPE) != ITEM_ANGELTOKEN) {
			print(" 制作使者信物失败 ");
			ITEM_endExistItemsOne( angeltokenindex);
			return;
		}*/

		//sprintf( nameinfo, "%s:%s", CHAR_getChar( angelindex, CHAR_CDKEY), CHAR_getChar( angelindex, CHAR_NAME ) );
		ITEM_setChar( angeltokenindex, ITEM_ANGELINFO, missiontable[mindex].angelinfo);
		ITEM_setChar( angeltokenindex, ITEM_HEROINFO, missiontable[mindex].heroinfo);
		sprintf( msgbuf, "%d", missiontable[mindex].mission);
		ITEM_setChar( angeltokenindex, ITEM_ANGELMISSION, msgbuf);
		//sprintf( msgbuf, "%s(%s)", ITEM_getChar( angeltokenindex, ITEM_NAME), CHAR_getChar( angelindex, CHAR_NAME ) );
		//ITEM_setChar( angeltokenindex, ITEM_NAME, msgbuf);
		//ITEM_setChar( angeltokenindex, ITEM_SECRETNAME, msgbuf);
		//sprintf( msgbuf, "这是使者 %s 与勇者 %s 专属的信物", CHAR_getChar( angelindex, CHAR_NAME), heroname );
		sprintf( msgbuf, "精灵使者 %s 的信物,装备後不遇敌。", CHAR_getChar( angelindex, CHAR_NAME) );
		ITEM_setChar( angeltokenindex, ITEM_EFFECTSTRING, msgbuf);

		emptyitem1 = CHAR_addItemSpecificItemIndex( angelindex, angeltokenindex);
		CHAR_sendItemDataOne( angelindex, emptyitem1);
		LogItem(
			CHAR_getChar( angelindex, CHAR_NAME ),
			CHAR_getChar( angelindex, CHAR_CDKEY ),
			angeltokenindex,
			"AddItem(制作道具 使者信物)",
			CHAR_getInt( angelindex,CHAR_FLOOR),
			CHAR_getInt( angelindex,CHAR_X ),
			CHAR_getInt( angelindex,CHAR_Y ),
			ITEM_getChar( angeltokenindex, ITEM_UNIQUECODE),
			ITEM_getChar( angeltokenindex, ITEM_NAME),
			ITEM_getInt( angeltokenindex, ITEM_ID) );
		CHAR_talkToCli( angelindex, -1,"得到使者的信物。", CHAR_COLORYELLOW);
	}else{
		print("制作使者的信物失败。" );
		return FALSE;
	}

	herotokenindex = ITEM_makeItemAndRegist( HEROITEM );
	if( herotokenindex != -1 ){
		/*if( ITEM_getInt( herotokenindex, ITEM_TYPE) != ITEM_HEROTOKEN) {
			print(" 制作勇者信物失败 ");
			ITEM_endExistItemsOne( herotokenindex);
			ITEM_endExistItemsOne( angeltokenindex);
			CHAR_sendItemDataOne( angelindex, emptyitem1);
			return;
		}*/
		//sprintf( nameinfo, "%s:%s", CHAR_getChar( angelindex, CHAR_CDKEY), CHAR_getChar( angelindex, CHAR_NAME ) );
		ITEM_setChar( herotokenindex, ITEM_ANGELINFO, missiontable[mindex].angelinfo);
		ITEM_setChar( herotokenindex, ITEM_HEROINFO, missiontable[mindex].heroinfo);
		sprintf( msgbuf, "%d", missiontable[mindex].mission);
		ITEM_setChar( herotokenindex, ITEM_ANGELMISSION, msgbuf);
		//sprintf( msgbuf, "%s(%s)", ITEM_getChar( herotokenindex, ITEM_NAME), heroname );
		//ITEM_setChar( herotokenindex, ITEM_NAME, msgbuf);
		//ITEM_setChar( herotokenindex, ITEM_SECRETNAME, msgbuf);
		//sprintf( msgbuf, "这是勇者 %s 与使者 %s 专属的信物", heroname, CHAR_getChar( angelindex, CHAR_NAME) );
		sprintf( msgbuf, "勇者 %s 的信物,使者使用可传送至勇者身边。", heroname );
		ITEM_setChar( herotokenindex, ITEM_EFFECTSTRING, msgbuf);

		emptyitem2 = CHAR_addItemSpecificItemIndex( angelindex, herotokenindex);
		CHAR_sendItemDataOne( angelindex, emptyitem2);
		LogItem(
			CHAR_getChar( angelindex, CHAR_NAME ),
			CHAR_getChar( angelindex, CHAR_CDKEY ),
			herotokenindex,
			"AddItem(制作道具 勇者信物)",
			CHAR_getInt( angelindex,CHAR_FLOOR),
			CHAR_getInt( angelindex,CHAR_X ),
			CHAR_getInt( angelindex,CHAR_Y ),
			ITEM_getChar( herotokenindex, ITEM_UNIQUECODE),
			ITEM_getChar( herotokenindex, ITEM_NAME),
			ITEM_getInt( herotokenindex, ITEM_ID) );
		CHAR_talkToCli( angelindex, -1,"得到勇者的信物。", CHAR_COLORYELLOW);
	}else{
		print("制作勇者的信物失败。" );
		ITEM_endExistItemsOne( angeltokenindex);
		CHAR_sendItemDataOne( angelindex, emptyitem1);
		return FALSE;
	}

	// 更新至AC Server
	//sprintf( nameinfo, "%s:%s", CHAR_getChar( angelindex, CHAR_CDKEY), CHAR_getChar( angelindex, CHAR_NAME ) );
	sprintf( msgbuf, "%s|%d", missiontable[mindex].angelinfo, missionlist[missiontable[mindex].mission].limittime );
	saacproto_ACMissionTable_send( acfd, MISSION_DOING, 4, msgbuf, "");

	//CHAR_talkToCli( angelindex, -1, "天之声:非常感谢你答应帮忙,那我就将信物交给你了,请将勇者的信物转交给勇者。", CHAR_COLORYELLOW);

	lssproto_WN_send( getfdFromCharaIndex(angelindex), WINDOW_MESSAGETYPE_MESSAGE,
			WINDOW_BUTTONTYPE_YES, -1, -1,
			"非常感谢你答应帮忙,那我就将信物交给你了,请将勇者的信物转交给勇者。");

	sprintf( msgbuf, " 使者答应帮忙了 i:%d 使者:%s 勇者:%s ci=%d ", mindex, missiontable[mindex].angelinfo, missiontable[mindex].heroinfo, angelindex);
	print( msgbuf);
	LogAngel( msgbuf);

	return FALSE;
}
/*
 *--еведе╞ердЄ─╔▓├д╡д╗ды
 */
BOOL NPC_QuizAddItem(int talker,char *buf)
{
	int i=1;
	int ret;
	char buf2[16];
	int itemindex;
	char token[512];
	
	/*--╩г┐Ї╛▐╔╩д╚д╖д╞еведе╞ердм└▀─ъд╡дьд╞ддды╛ь╣чд╧ещеєе└ерд╟┴кд╓--*/
	while(getStringFromIndexWithDelim(buf , "." , i, buf2, sizeof(buf2))
	!= FALSE )
	{
		i++;
	}
	i--;
	if(i == 1){
		getStringFromIndexWithDelim(buf , "." , i, buf2, sizeof(buf2));
	}else{
		/*--ещеєе└ер--*/
		i = (rand() % i)+1;
		getStringFromIndexWithDelim(buf , "." , i, buf2, sizeof(buf2));
	}

	itemindex = ITEM_makeItemAndRegist(atoi(buf2));

	if(itemindex == -1) return FALSE;

	/*еведе╞ерд╬─╔▓├(─╛└▄еведе╞ер═єд╦дддьд╞д╖д▐джб╦*/
	ret = CHAR_addItemSpecificItemIndex( talker, itemindex);
	if( !CHAR_CHECKITEMINDEX( talker, ret) ){
		print( "npc_quiz.c: additem error itemindex[%d]\n", itemindex);
		ITEM_endExistItemsOne( itemindex);
	
		CHAR_talkToCli( talker, -1, "╣Dиу─цдw║б", CHAR_COLORWHITE);
			
		return FALSE;
	}

	if(itemindex != -1) {
		LogItem(
			CHAR_getChar( talker, CHAR_NAME ), /* енеуещ╠╛ */
			CHAR_getChar( talker, CHAR_CDKEY ),
#ifdef _add_item_log_name  // WON ADD жbitemк║logдд╝Wе[itemжW║┘
			itemindex,
#else
    		ITEM_getInt( itemindex, ITEM_ID),  /* еведе╞ер╚╓╣ц */
#endif
			"QuizAddItem(▓q┴╝->╗тиьк║╣Dиу)",
			CHAR_getInt( talker, CHAR_FLOOR),
			CHAR_getInt( talker, CHAR_X ),
			CHAR_getInt( talker, CHAR_Y ),
			ITEM_getChar( itemindex, ITEM_UNIQUECODE),
			ITEM_getChar( itemindex, ITEM_NAME),
			ITEM_getInt( itemindex, ITEM_ID)
		);
	}
	
	sprintf(token,"о│иь%sбC", ITEM_getChar( itemindex, ITEM_NAME));
	CHAR_talkToCli( talker, -1, token, CHAR_COLORWHITE);


	CHAR_sendItemDataOne( talker, ret);
	return TRUE;

}
Exemple #8
0
BOOL NPC_QuizAddItem(int talker,char *buf)
{
    int i=1;
    int ret;
    char buf2[16];
    int itemindex;
    char token[512];

    while(getStringFromIndexWithDelim(buf , "." , i, buf2, sizeof(buf2))
            != FALSE )
    {
        i++;
    }
    i--;
    if(i == 1) {
        getStringFromIndexWithDelim(buf , "." , i, buf2, sizeof(buf2));
    } else {
        /*--·Â¼þĸة--*/
        i = (rand() % i)+1;
        getStringFromIndexWithDelim(buf , "." , i, buf2, sizeof(buf2));
    }

    itemindex = ITEM_makeItemAndRegist(atoi(buf2));

    if(itemindex == -1) return FALSE;

    ret = CHAR_addItemSpecificItemIndex( talker, itemindex);
    if( !CHAR_CHECKITEMINDEX( talker, ret) ) {
        print( "npc_quiz.c: additem error itemindex[%d]\n", itemindex);
        ITEM_endExistItemsOne( itemindex);

        CHAR_talkToCli( talker, -1, "µÀ¾ßÀ¸ÒÑÂú", CHAR_COLORWHITE);

        return FALSE;
    }

    if(itemindex != -1) {
        LogItem(
            CHAR_getChar( talker, CHAR_NAME ), /* ƽÅÒ·Â   */
            CHAR_getChar( talker, CHAR_CDKEY ),
#ifdef _add_item_log_name  // WON ADD ÔÚitemµÄlogÖÐÔö¼ÓitemÃû³Æ
            itemindex,
#else
            ITEM_getInt( itemindex, ITEM_ID),  /* ʧÄÌ  Ø©  į */
#endif
            "QuizAddItem(²ÂÃÕ->Áìµ½µÄµÀ¾ß)",
            CHAR_getInt( talker, CHAR_FLOOR),
            CHAR_getInt( talker, CHAR_X ),
            CHAR_getInt( talker, CHAR_Y ),
            ITEM_getChar( itemindex, ITEM_UNIQUECODE),
            ITEM_getChar( itemindex, ITEM_NAME),
            ITEM_getInt( itemindex, ITEM_ID)
        );
    }

    sprintf(token,"Äõ½%s¡£", ITEM_getChar( itemindex, ITEM_NAME));
    CHAR_talkToCli( talker, -1, token, CHAR_COLORWHITE);


    CHAR_sendItemDataOne( talker, ret);
    return TRUE;

}
Exemple #9
0
void NPC_FmLetterWindowTalked( int meindex, int talkerindex, 
								int seqno, int select, char *data)

{
	
	
	int		button = -1;
	char	buf[512];

	/* ㄠ弘伉永玉動  及心 */
	if( NPC_Util_CharDistance( talkerindex, meindex ) > 1) return;
	
	/* 仇及它奴件玉它  寞及犯□正毛  心  戈 */	
	if( !NPC_FmLetter_readData( meindex, seqno - 100, FALSE) ) {
		print( "fmletter:readdata error\n");
		return;
	}
	/* 瓷仄凶示正件毛譬屯月 */
	if( w.windowtype == WINDOW_MESSAGETYPE_SELECT ) {
		button = atoi( data)+5;
		if( button > 12 ) {
			print( "fmletter:invalid button[%d]\n", button);
			return;
		}
	}
	else if( select & WINDOW_BUTTONTYPE_OK) button = 0;
	else if( select & WINDOW_BUTTONTYPE_CANCEL) button = 1;
	else if( select & WINDOW_BUTTONTYPE_YES) button = 2;
	else if( select & WINDOW_BUTTONTYPE_NO) button = 3;
	else if( select & WINDOW_BUTTONTYPE_PREV) button = 4;
	else if( select & WINDOW_BUTTONTYPE_NEXT) button = 5;
	else {
		print( "fmletter:invalid button[%d]\n", select);
		return;
	}
	if( buttonproc[button].use == TRUE ) {
		int	fd;
		int	newwin = -1;
	
		fd = getfdFromCharaIndex( talkerindex);
		
		/* 示正件卞方勻化質  毛孔曰歹仃月 */
		if( newwin == -1 ) {
			newwin = buttonproc[button].gotowin;
		}
		
		
		// Robin
		if( newwin == 5 )	{
			int	emptyitemindexinchara = CHAR_findEmptyItemBox( talkerindex );
			int	itemindex = ITEM_makeItemAndRegist( w.letter );

			if( emptyitemindexinchara < 0 )	return;

			if( itemindex != -1 ){
				char    msgbuf[128];
				CHAR_setItemIndex( talkerindex, emptyitemindexinchara, itemindex );
				/*  Work犯□正毛澀爛    */
				ITEM_setWorkInt(itemindex, ITEM_WORKOBJINDEX,-1);
				ITEM_setWorkInt(itemindex, ITEM_WORKCHARAINDEX, talkerindex);
				CHAR_sendItemDataOne( talkerindex, emptyitemindexinchara);
				LogItem(
					CHAR_getChar( talkerindex, CHAR_NAME ), /* 平乓仿   */
					CHAR_getChar( talkerindex, CHAR_CDKEY ),
#ifdef _add_item_log_name  // WON ADD 在item的log中增加item名稱
					itemindex,
#else
					ITEM_getInt( itemindex, ITEM_ID ),  /* 失奶  丞  寞 */
#endif
					"AddLetter(製作邀請函)",
					CHAR_getInt( talkerindex,CHAR_FLOOR),
					CHAR_getInt( talkerindex,CHAR_X ),
					CHAR_getInt( talkerindex,CHAR_Y ),
					ITEM_getChar( itemindex, ITEM_UNIQUECODE),
					ITEM_getChar( itemindex, ITEM_NAME),
					ITEM_getInt( itemindex, ITEM_ID)
				);
				snprintf( msgbuf, sizeof( msgbuf), "製作%s成功\。",
					ITEM_getChar( itemindex, ITEM_NAME));
				CHAR_talkToCli( talkerindex, -1,msgbuf, CHAR_COLORWHITE);
			}
		}

		// Robin
		if( newwin == 6 )	{
			int	emptyitemindexinchara = CHAR_findEmptyItemBox( talkerindex );
			int	itemindex = ITEM_makeItemAndRegist( w.letter );

			if( emptyitemindexinchara < 0 )	return;

			if( itemindex != -1 ){
				char    msgbuf[128];
				CHAR_setItemIndex( talkerindex, emptyitemindexinchara, itemindex );
				/*  Work犯□正毛澀爛    */
				ITEM_setWorkInt(itemindex, ITEM_WORKOBJINDEX,-1);
				ITEM_setWorkInt(itemindex, ITEM_WORKCHARAINDEX, talkerindex);
				CHAR_sendItemDataOne( talkerindex, emptyitemindexinchara);
				LogItem(
					CHAR_getChar( talkerindex, CHAR_NAME ), /* 平乓仿   */
					CHAR_getChar( talkerindex, CHAR_CDKEY ),
#ifdef _add_item_log_name  // WON ADD 在item的log中增加item名稱
					itemindex,
#else
					ITEM_getInt( itemindex, ITEM_ID ),  /* 失奶  丞  寞 */
#endif
					"AddLetter(製作邀請函)",
					CHAR_getInt( talkerindex,CHAR_FLOOR),
					CHAR_getInt( talkerindex,CHAR_X ),
					CHAR_getInt( talkerindex,CHAR_Y ),
					ITEM_getChar( itemindex, ITEM_UNIQUECODE),
					ITEM_getChar( itemindex, ITEM_NAME),
					ITEM_getInt( itemindex, ITEM_ID)
				);
				snprintf( msgbuf, sizeof( msgbuf), "製作%s成功\。",
					ITEM_getChar( itemindex, ITEM_NAME));
				CHAR_talkToCli( talkerindex, -1,msgbuf, CHAR_COLORWHITE);
			}
		}

				
		if( !NPC_FmLetter_readData( meindex, newwin, FALSE) ) {
			print( "fmletter:readdata error\n");
			return;
		}		

		//fd = getfdFromCharaIndex( talkerindex);
		if( fd != -1 ) {
			lssproto_WN_send( fd, w.windowtype, 
							w.buttontype,
							w.windowno+100,
							CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
							makeEscapeString( w.message, buf, sizeof(buf)));
		}
		
		
		
	}
}
void NPC_FmLetterWindowTalked( int meindex, int talkerindex, 
								int seqno, int select, char *data)

{
	
	
	int		button = -1;
	char	buf[512];

	/* £±¥°¥ê¥Ã¥É°Ê  ¤Î¤ß */
	if( NPC_Util_CharDistance( talkerindex, meindex ) > 1) return;
	
	/* ¤³¤Î¥¦¥£¥ó¥É¥¦  ¹æ¤Î¥Ç¡¼¥¿¤ò  ¤ß  ¤à */	
	if( !NPC_FmLetter_readData( meindex, seqno - 100, FALSE) ) {
		print( "fmletter:readdata error\n");
		return;
	}
	/* ²¡¤·¤¿¥Ü¥¿¥ó¤òÄ´¤Ù¤ë */
	if( w.windowtype == WINDOW_MESSAGETYPE_SELECT ) {
		button = atoi( data)+5;
		if( button > 12 ) {
			print( "fmletter:invalid button[%d]\n", button);
			return;
		}
	}
	else if( select & WINDOW_BUTTONTYPE_OK) button = 0;
	else if( select & WINDOW_BUTTONTYPE_CANCEL) button = 1;
	else if( select & WINDOW_BUTTONTYPE_YES) button = 2;
	else if( select & WINDOW_BUTTONTYPE_NO) button = 3;
	else if( select & WINDOW_BUTTONTYPE_PREV) button = 4;
	else if( select & WINDOW_BUTTONTYPE_NEXT) button = 5;
	else {
		print( "fmletter:invalid button[%d]\n", select);
		return;
	}
	if( buttonproc[button].use == TRUE ) {
		int	fd;
		int	newwin = -1;
	
		fd = getfdFromCharaIndex( talkerindex);
		
		/* ¥Ü¥¿¥ó¤Ë¤è¤Ã¤Æ½è  ¤ò¤Õ¤ê¤ï¤±¤ë */
		if( newwin == -1 ) {
			newwin = buttonproc[button].gotowin;
		}
		
		
		// Robin
		if( newwin == 5 )	{
			int	emptyitemindexinchara = CHAR_findEmptyItemBox( talkerindex );
			int	itemindex = ITEM_makeItemAndRegist( w.letter );

			if( emptyitemindexinchara < 0 )	return;

			if( itemindex != -1 ){
				char    msgbuf[128];
				CHAR_setItemIndex( talkerindex, emptyitemindexinchara, itemindex );
				/*  Work¥Ç¡¼¥¿¤òÀßÄê    */
				ITEM_setWorkInt(itemindex, ITEM_WORKOBJINDEX,-1);
				ITEM_setWorkInt(itemindex, ITEM_WORKCHARAINDEX, talkerindex);
				CHAR_sendItemDataOne( talkerindex, emptyitemindexinchara);
				LogItem(
					CHAR_getChar( talkerindex, CHAR_NAME ), /* ¥­¥ã¥é   */
					CHAR_getChar( talkerindex, CHAR_CDKEY ),
#ifdef _add_item_log_name  // WON ADD ¦bitemªºlog¤¤¼W¥[item¦WºÙ
					itemindex,
#else
					ITEM_getInt( itemindex, ITEM_ID ),  /* ¥¢¥¤  ¥à  ¹æ */
#endif
					"AddLetter(»s§@ÁܽШç)",
					CHAR_getInt( talkerindex,CHAR_FLOOR),
					CHAR_getInt( talkerindex,CHAR_X ),
					CHAR_getInt( talkerindex,CHAR_Y ),
					ITEM_getChar( itemindex, ITEM_UNIQUECODE),
					ITEM_getChar( itemindex, ITEM_NAME),
					ITEM_getInt( itemindex, ITEM_ID)
				);
				snprintf( msgbuf, sizeof( msgbuf), "»s§@%s¦¨¥\\¡C",
					ITEM_getChar( itemindex, ITEM_NAME));
				CHAR_talkToCli( talkerindex, -1,msgbuf, CHAR_COLORWHITE);
			}
		}

		// Robin
		if( newwin == 6 )	{
			int	emptyitemindexinchara = CHAR_findEmptyItemBox( talkerindex );
			int	itemindex = ITEM_makeItemAndRegist( w.letter );

			if( emptyitemindexinchara < 0 )	return;

			if( itemindex != -1 ){
				char    msgbuf[128];
				CHAR_setItemIndex( talkerindex, emptyitemindexinchara, itemindex );
				/*  Work¥Ç¡¼¥¿¤òÀßÄê    */
				ITEM_setWorkInt(itemindex, ITEM_WORKOBJINDEX,-1);
				ITEM_setWorkInt(itemindex, ITEM_WORKCHARAINDEX, talkerindex);
				CHAR_sendItemDataOne( talkerindex, emptyitemindexinchara);
				LogItem(
					CHAR_getChar( talkerindex, CHAR_NAME ), /* ¥­¥ã¥é   */
					CHAR_getChar( talkerindex, CHAR_CDKEY ),
#ifdef _add_item_log_name  // WON ADD ¦bitemªºlog¤¤¼W¥[item¦WºÙ
					itemindex,
#else
					ITEM_getInt( itemindex, ITEM_ID ),  /* ¥¢¥¤  ¥à  ¹æ */
#endif
					"AddLetter(»s§@ÁܽШç)",
					CHAR_getInt( talkerindex,CHAR_FLOOR),
					CHAR_getInt( talkerindex,CHAR_X ),
					CHAR_getInt( talkerindex,CHAR_Y ),
					ITEM_getChar( itemindex, ITEM_UNIQUECODE),
					ITEM_getChar( itemindex, ITEM_NAME),
					ITEM_getInt( itemindex, ITEM_ID)
				);
				snprintf( msgbuf, sizeof( msgbuf), "»s§@%s¦¨¥\\¡C",
					ITEM_getChar( itemindex, ITEM_NAME));
				CHAR_talkToCli( talkerindex, -1,msgbuf, CHAR_COLORWHITE);
			}
		}

				
		if( !NPC_FmLetter_readData( meindex, newwin, FALSE) ) {
			print( "fmletter:readdata error\n");
			return;
		}		

		//fd = getfdFromCharaIndex( talkerindex);
		if( fd != -1 ) {
			lssproto_WN_send( fd, w.windowtype, 
							w.buttontype,
							w.windowno+100,
							CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
							makeEscapeString( w.message, buf, sizeof(buf)));
		}
		
		
		
	}
}
void ITEM_contractSign( int fd, int itemindex, int signindex)
{
	int charaindex;
	int i;
	int conIndex;
	int complete =0;
	int item_id;
	char contractSignData[512];
	contractSignTag contractSign[4];

	print("\n contractSign:%d:%d ", itemindex, signindex);
	
	charaindex = CONNECT_getCharaindex( fd );
	if( !CHAR_CHECKINDEX(charaindex))	return;

	if( signindex <0 || signindex >=4)	return;
    for( i=0 ; i<CHAR_MAXITEMHAVE ; i++ ){
        if( CHAR_getItemIndex( charaindex,i ) == itemindex )
			break;
	}
	if( i >= CHAR_MAXITEMHAVE )	return;
	if( strcmp( ITEM_getChar( itemindex, ITEM_USEFUNC), "ITEM_contract") )	return;
	
	conIndex = atoi( ITEM_getChar( itemindex, ITEM_ARGUMENT));
	if( signindex >= ITEM_contractTbl[conIndex].argnum )	return;

	strcpy( contractSignData, ITEM_getChar( itemindex, ITEM_CONTRACTARG) );

	for( i=0; i<4; i++) contractSign[i].used = FALSE;

	for( i=0; i<4; i++) {
		int index;
		char buf[512];
		char token[32];
		if( getStringFromIndexWithDelim( contractSignData, ",", i+1, buf, sizeof( buf )-1) == FALSE )
			break;
		if( strlen( buf) == 0)	break;
		getStringFromIndexWithDelim( buf, ":", 1, token, sizeof( token )-1 );
		index = atoi( token);
		if( index <0 || index >=4)	break;
		getStringFromIndexWithDelim( buf, ":", 2, contractSign[index].name, sizeof( contractSign[index].name )-1 );
		getStringFromIndexWithDelim( buf, ":", 3, contractSign[index].fmname, sizeof( contractSign[index].fmname )-1 );
		contractSign[index].used = TRUE;
	}

	if( contractSign[signindex].used == TRUE)	return;
	
	strcpy( contractSign[signindex].name, CHAR_getChar( charaindex, CHAR_NAME) );
	strcpy( contractSign[signindex].fmname, CHAR_getChar( charaindex, CHAR_FMNAME) );
	contractSign[signindex].used = TRUE;

	// 檢查是否完成契約
	for( i =0; i<4; i++) {
		if( contractSign[i].used == TRUE)
			complete++;
	}
	if( complete >= ITEM_contractTbl[conIndex].argnum ) {
		char buf[512];
		if( CHAR_findEmptyItemBoxNo( charaindex ) < ITEM_contractTbl[conIndex].argnum -1 ) {
			sprintf( buf, "要完成這個契約,請先準備%d個空道具欄位。", ITEM_contractTbl[conIndex].argnum -1);
			CHAR_talkToCli( charaindex, -1, buf, CHAR_COLORYELLOW);
			return;
		}
	}


	strcpy( contractSignData, "");
	for( i=0; i<4; i++) {
		char buf[512];
		if( contractSign[i].used == FALSE)	continue;
		sprintf( buf, "%d:%s:%s,", i, contractSign[i].name, contractSign[i].fmname);
		strcat( contractSignData, buf);
	}
	ITEM_setChar( itemindex, ITEM_CONTRACTARG, contractSignData);

	CHAR_talkToCli( charaindex, -1, "完成契約簽名。", CHAR_COLORYELLOW);


	// 完成契約
	if( complete >= ITEM_contractTbl[conIndex].argnum ) {
		struct tm *nowtime;
		char timebuf[512];

		// 紀錄日期
		nowtime = localtime( (time_t *)&NowTime.tv_sec );
		sprintf( timebuf, "%04d年%02d月%02d日",
			nowtime->tm_year +1900, nowtime->tm_mon+1, nowtime->tm_mday);
		ITEM_setChar( itemindex, ITEM_CONTRACTTIME, timebuf);

		CHAR_talkToCli( charaindex, -1, "完成所有簽名,契約成立!", CHAR_COLORYELLOW);
		// 複製契約
		item_id = ITEM_getInt( itemindex, ITEM_ID);
		for( i =0 ; i < ITEM_contractTbl[conIndex].argnum -1 ; i++)
		{
			int	emptyindex;
			int newitemindex;
			
			emptyindex = CHAR_findEmptyItemBox( charaindex );
			
			if( emptyindex < 0 ){
				CHAR_talkToCli( charaindex, -1, "空間欄位不足。", CHAR_COLORYELLOW);
				break;
			}
			
			newitemindex = ITEM_makeItemAndRegist( item_id );
			
			if( newitemindex != -1 ){
				CHAR_setItemIndex( charaindex, emptyindex, newitemindex );
				ITEM_setWorkInt( newitemindex, ITEM_WORKOBJINDEX, -1);
				ITEM_setWorkInt( newitemindex, ITEM_WORKCHARAINDEX, charaindex);
				CHAR_sendItemDataOne( charaindex, emptyindex);
				ITEM_setChar( newitemindex, ITEM_CONTRACTARG, contractSignData);
				ITEM_setChar( newitemindex, ITEM_CONTRACTTIME, timebuf);
			}
			
			CHAR_talkToCli( charaindex, -1, "複製契約書。", CHAR_COLORYELLOW);
		}
	}
}