BOOL NPC_Util_moveItemToMap( int itemindex , int fl , int x , int y, BOOL net ) { int oind,cind; if( !ITEM_CHECKINDEX( itemindex ) ) return FALSE; oind = ITEM_getWorkInt( itemindex , ITEM_WORKOBJINDEX ); cind = ITEM_getWorkInt( itemindex , ITEM_WORKCHARAINDEX ); if( oind >= 0 ){ return MAP_objmove( oind , OBJECT_getFloor(oind), OBJECT_getX(oind), OBJECT_getY(oind), fl,x,y); } else if( cind >= 0 ){ int itemindexinchara = NPC_Util_SearchItemInChar(cind,itemindex); if( itemindexinchara == -1 ) return FALSE; CHAR_setItemIndex( cind , itemindexinchara , -1 ); CHAR_complianceParameter(cind); if( net ) CHAR_sendItemDataOne( cind, itemindexinchara); if( CHAR_DropItemAbsolute( itemindex, fl,x,y,TRUE) < 0 ){ return FALSE; } else { 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 itemindex : アイテム表への index * int fl,x,y : 位置。 * BOOL net: ネットワークの処理をするかどうか * 返り値は FALSE : 失敗 TRUE : 成功 */ BOOL NPC_Util_moveItemToMap( int itemindex , int fl , int x , int y, BOOL net ) { int oind,cind; if( !ITEM_CHECKINDEX( itemindex ) ) return FALSE; oind = ITEM_getWorkInt( itemindex , ITEM_WORKOBJINDEX ); cind = ITEM_getWorkInt( itemindex , ITEM_WORKCHARAINDEX ); if( oind >= 0 ){ /* 地形におかれている場合は単に位置を変更 */ return MAP_objmove( oind , OBJECT_getFloor(oind), OBJECT_getX(oind), OBJECT_getY(oind), fl,x,y); } else if( cind >= 0 ){ /* キャラがもっている */ int 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"); /* アイテムindexから直接起く */ if( CHAR_DropItemAbsolute( itemindex, fl,x,y,TRUE) < 0 ){ return FALSE; } else { 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; }