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; }
BOOL NPC_Util_moveItemToChar(int charindex, int itemindex, BOOL net) { int emptyindex, oind, cind; emptyindex = CHAR_findEmptyItemBox(charindex); if (emptyindex < 0) return FALSE; if (!ITEM_CHECKINDEX(itemindex)) return FALSE; oind = ITEM_getWorkInt(itemindex, ITEM_WORKOBJINDEX); cind = ITEM_getWorkInt(itemindex, ITEM_WORKCHARAINDEX); if (oind >= 0) { CHAR_ObjectDelete(oind); CHAR_setItemIndex(charindex, emptyindex, itemindex); ITEM_setWorkInt(itemindex, ITEM_WORKOBJINDEX, -1); ITEM_setWorkInt(itemindex, ITEM_WORKCHARAINDEX, charindex); if (net) CHAR_sendItemDataOne(charindex, emptyindex); return TRUE; } else if (cind >= 0) { int itemgrp[2]; int itemindexinchara; if (cind == charindex) return FALSE; itemindexinchara = NPC_Util_SearchItemInChar(cind, itemindex); if (itemindexinchara == -1) return FALSE; CHAR_setItemIndex(cind, itemindexinchara, -1); CHAR_complianceParameter(cind); itemgrp[0] = itemindexinchara; CHAR_setItemIndex(charindex, emptyindex, itemindex); itemgrp[1] = emptyindex; if (net) CHAR_sendItemData(charindex, itemgrp, arraysizeof(itemgrp)); ITEM_setWorkInt(itemindex, ITEM_WORKOBJINDEX, -1); ITEM_setWorkInt(itemindex, ITEM_WORKCHARAINDEX, charindex); return TRUE; } return FALSE; }
/* * 既存のアイテムをあるキャラに持たせる。 * もちものがいっぱいかどうか、スキルの判定、等は * この関数の中でやる。 * * int charindex:もたせるキャラのキャラindex * int itemindex:もたせるアイテムのアイテムindex * BOOL net: この関数にネットワークやらせる TRUEにする事。 * 返り値:無事持たせれたらTRUE,なんらかの原因で持たせれなかったらFALSE * * by nakamura * * この関数の中で、キャラが持っているものだったら持ちものから外す、 * 地面に置いてあるものだったら置いてなくする、という処理もしてしまう * ようにした。 * by ringo * * some bug fix.( ITEM_setWorkInt etc.) * by taka * * 現在の仕様。 * o itemindex のアイテムが自分の持っているアイテムであったら、 * return FALSE する */ BOOL NPC_Util_moveItemToChar( int charindex, int itemindex,BOOL net ) { int emptyindex, oind ,cind; emptyindex = CHAR_findEmptyItemBox( charindex ); if( emptyindex < 0 ) /* アイテム欄に空きがない */ return FALSE; if( !ITEM_CHECKINDEX( itemindex ) )return FALSE; /* 持たせる空きはある */ /* * 次に地形に落ちているアイテムか、それとも、 * 誰かが持っているアイテムかを調べる */ oind = ITEM_getWorkInt( itemindex , ITEM_WORKOBJINDEX ); cind = ITEM_getWorkInt( itemindex , ITEM_WORKCHARAINDEX ); if( oind >= 0 ){ /* 地形に置かれているものだ。 */ /* 地形から抹消 */ CHAR_ObjectDelete( oind ); /* アイテムを移動 */ CHAR_setItemIndex( charindex, emptyindex, itemindex ); /* アイテムのWork領域を書きかえる */ ITEM_setWorkInt( itemindex, ITEM_WORKOBJINDEX, -1 ); ITEM_setWorkInt( itemindex, ITEM_WORKCHARAINDEX, charindex ); /* charindex がプレイヤーだったらアイテム変更ステータス送信 */ if( net ) CHAR_sendStatusString( charindex, "I"); return TRUE; }else if( cind >= 0 ){ /* キャラクタが持っているものだ。 */ int itemindexinchara; /* 自分が持っている場合には何もしない */ if( cind == charindex )return FALSE; /* もってるものを消す */ itemindexinchara = NPC_Util_SearchItemInChar( cind , itemindex); if( itemindexinchara == -1 )return FALSE; CHAR_setItemIndex( cind , itemindexinchara , -1 ); if( itemindexinchara == CHAR_ARM1 && CHAR_getItemIndex( cind,CHAR_ARM2 )== -2){ CHAR_setItemIndex(cind,CHAR_ARM2,-1); } CHAR_complianceParameter(cind); if( net ) CHAR_sendStatusString( cind,"I"); /* アイテムを持たせる */ CHAR_setItemIndex( charindex , emptyindex , itemindex ); if( net ) CHAR_sendStatusString( charindex,"I"); /* アイテムのWork領域を書きかえる */ ITEM_setWorkInt( itemindex, ITEM_WORKOBJINDEX, -1 ); ITEM_setWorkInt( itemindex, ITEM_WORKCHARAINDEX, charindex ); return TRUE; /* fixed by nakamura(なんもreturnしてなかった) */ } return FALSE; }
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); } } }