?? npc_door.c
字號:
#include "version.h"
#include "object.h"
#include "char_base.h"
#include "char.h"
#include "util.h"
#include "handletime.h"
#include "anim_tbl.h"
#include "npc_door.h"
#include "npcutil.h"
#include "readmap.h"
#include "npc_roomadminnew.h"
#include <string.h>
#include <ctype.h>
static int NPC_Door_isOpen( int meindex );
/*
* 玉失毛 蜇允月兇戶及NPC卞 邰卅楮醒及爛聒[
* 正奶皿 “ Door
*
* NPCARGUMENT及襖反}
*
* og|cg|idname|swcount|closetime_sec|soonflg0/1|passflg0/1/2
*
* passflg 反}1分勻兇日天允歹□升勾五匹丐月啦 卞卅月[2分勻兇日
* 濮覆夫日井卅中[ 0分勻兇日由旦伐□玉匹卅中[
*
* 毛隙爛允月[ 引月引匹及凜棉反犯白巧伙玄匹反1凜棉[
* 澀爛毛踏仁午五卞反 颶 寞互褐邰卅躲絆毛手勾井日鏜啦互 邰匹丐月[
*
* 憤坌及引歹曰卞C毛霜耨允月楮醒互丐月井日}1墊info, 颶 寞
* 毛 凳仄化井日公及楮醒毛方屯壬弁仿奶失件玄及 卞 憎今木化中月
* 橇謫互 蕙卞卅月[
*/
#define NPC_DOOR_OPENMSG "玉失互}夫日中兇!"
#define NPC_DOOR_CLOSEMSG "玉失毛}仄戶兇!"
#define NPC_DOOR_CANTOPENMSG "井亢互丐歹卅中及匹}玉失毛夫日仁仇午互\
匹五卅中!"
#define ROPEGRAPHIC 9259 /* 薔 卞丐月騷木卅中夫□皿 */
enum{
NPC_DOOR_FLG_SOONCLOSE = 1,
NPC_DOOR_FLG_WATCHCLOSE = 2
};
/*
* 玉失日仄中澀爛毛允月卞反}仇仇匹
* maxhp , maxmp , level , str , tough 毛0卞允月午方中[
*
*/
BOOL NPC_DoorInit( int meindex )
{
char arg[NPC_UTIL_GETARGSTR_BUFSIZE];
char settingdir[1024];
char buf[256];
NPC_Util_GetArgStr( meindex, arg, sizeof( arg));
CHAR_setWorkInt( meindex, CHAR_WORKEVENTTYPE,CHAR_EVENT_NPC);
getStringFromIndexWithDelim(arg, "|" , 1 , buf,sizeof(buf) );
CHAR_setWorkInt( meindex , CHAR_WORKDOOROPENG , atoi( buf ));
getStringFromIndexWithDelim(arg, "|" , 2 , buf,sizeof(buf) );
CHAR_setWorkInt( meindex , CHAR_WORKDOORCLOSEG , atoi( buf ));
getStringFromIndexWithDelim(arg, "|" , 3 , buf,sizeof(buf) );
CHAR_setWorkChar( meindex , CHAR_WORKDOORNAME , buf );
strcpysafe( settingdir,sizeof( settingdir) , buf );
getStringFromIndexWithDelim(arg, "|" , 4 , buf,sizeof(buf) );
CHAR_setWorkInt( meindex , CHAR_WORKDOORSWITCHCOUNT , atoi( buf ));
getStringFromIndexWithDelim(arg, "|" , 5 , buf,sizeof(buf) );
CHAR_setWorkInt( meindex , CHAR_WORKDOORCLOSETIME , atoi( buf ));
CHAR_setInt( meindex , CHAR_MERCHANTLEVEL , atoi( buf ));
getStringFromIndexWithDelim(arg, "|" , 6 , buf,sizeof(buf) );
CHAR_setWorkInt( meindex , CHAR_WORKDOORSOONFLG , atoi( buf ));
getStringFromIndexWithDelim(arg, "|" , 7 , buf,sizeof(buf) );
CHAR_setWorkInt( meindex , CHAR_WORKDOORPASSFLG , atoi( buf ));
CHAR_setWorkInt( meindex , CHAR_WORKDOORORIGINALGRAPHIC,
CHAR_getInt( meindex,CHAR_BASEIMAGENUMBER ));
CHAR_setInt( meindex, CHAR_LV, 0 );
if( getStringFromIndexWithDelim( arg , "|" , 8 , buf ,sizeof( buf ))){
if( strncmp( buf , "title" ,5 ) == 0 ){
print( "This is a title door:'%s'\n" , buf );
CHAR_setWorkInt( meindex , CHAR_WORKDOORPASSFLG ,0 );
CHAR_setWorkChar( meindex , CHAR_WORKDOORTITLE , buf );
CHAR_setInt( meindex, CHAR_LV, 1 );
} else if( isdigit( buf[0] )){
if( getStringFromIndexWithDelim(arg, "|" , 8 , buf,sizeof(buf) ))
CHAR_setWorkChar( meindex, CHAR_WORKDOORGOLDLIMIT, buf);
if( getStringFromIndexWithDelim(arg, "|" , 10 , buf,sizeof(buf) ))
CHAR_setWorkChar( meindex, CHAR_WORKDOORWEEK, buf);
if( getStringFromIndexWithDelim(arg, "|" , 11 , buf,sizeof(buf) ))
CHAR_setWorkChar( meindex, CHAR_WORKDOORHOUR, buf);
if( getStringFromIndexWithDelim(arg, "|" , 12 , buf,sizeof(buf) ))
CHAR_setWorkChar( meindex, CHAR_WORKDOORMINUTE, buf);
}
}
CHAR_setInt( meindex , CHAR_HP , 0 );
CHAR_setInt( meindex , CHAR_MP , 0 );
CHAR_setInt( meindex , CHAR_MAXMP , 0 );
CHAR_setInt( meindex , CHAR_STR , 0 );
CHAR_setInt( meindex , CHAR_TOUGH, 0 );
{
int g = CHAR_getWorkInt( meindex , CHAR_WORKDOOROPENG );
if( g >= 11900 && g <= 11915 ){
CHAR_setWorkInt( meindex , CHAR_WORKDOORKEYITEMID , 15 );
} else if( g >= 11916 && g <= 11931 ){
CHAR_setWorkInt( meindex , CHAR_WORKDOORKEYITEMID , 16 );
} else {
CHAR_setWorkInt( meindex , CHAR_WORKDOORKEYITEMID , -1 );
}
if(CHAR_getWorkInt( meindex , CHAR_WORKDOORPASSFLG )==2){
CHAR_setWorkInt( meindex , CHAR_WORKDOORKEYITEMID , -2 );
}
if( CHAR_getInt( meindex , CHAR_BASEIMAGENUMBER ) ==
ROPEGRAPHIC ){
CHAR_setWorkInt( meindex , CHAR_WORKDOORKEYITEMID,-2 );
}
}
{
int closeg = CHAR_getWorkInt( meindex , CHAR_WORKDOORCLOSEG );
int dir = -1;
switch( closeg ){
case 11900: dir = 6; break; /* 霽及玉失 夫分曰仄兇 */
case 11902: dir = 0; break; /* 夫分曰丹尹 */
case 11904: dir = 2; break; /* 心亢丹尹 */
case 11906: dir = 4; break; /* 心亢仄兇 */
case 11908: dir = 6; break; /* 贏中霽及玉失 夫分曰仄兇 */
case 11910: dir = 0; break; /* 夫分曰丹尹 */
case 11912: dir = 2; break; /* 心亢丹尹 */
case 11914: dir = 4; break; /* 心亢仄兇 */
case 11916: dir = 6; break; /* 嗡及玉失 夫分曰仄兇 */
case 11918: dir = 0; break; /* 夫分曰丹尹 */
case 11920: dir = 2; break; /* 心亢丹尹 */
case 11922: dir = 4; break; /* 心亢仄兇 */
case 11924: dir = 6; break; /* 贏中嗡及玉失 夫分曰仄兇 */
case 11926: dir = 0; break; /* 夫分曰丹尹 */
case 11928: dir = 2; break; /* 心亢丹尹 */
case 11930: dir = 4; break; /* 心亢仄兇 */
case 11958: dir = 2; break; /* 贏中 及玉失 心亢丹尹 */
case 11960: dir = 4; break; /* 心亢仄兇 */
case 11962: dir = 6; break; /* 夫分曰仄兇 */
case 11964: dir = 0; break; /* 夫分曰丹尹 */
case 11966: dir = 2; break; /* 及玉失 心亢丹尹 */
case 11968: dir = 4; break; /* 心亢仄兇 */
case 11970: dir = 6; break; /* 夫分曰仄兇 */
case 11972: dir = 0; break; /* 夫分曰丹尹 */
case 11978: dir = 2; break; /* 贏中嗯及玉失 心亢丹尹 */
case 11980: dir = 4; break; /* 心亢仄兇 */
case 11982: dir = 6; break; /* 夫分曰仄兇 */
case 11984: dir = 0; break; /* 夫分曰丹尹 */
case 11986: dir = 2; break; /* 嗯及玉失 心亢丹尹 */
case 11988: dir = 4; break; /* 心亢仄兇 */
case 11990: dir = 6; break; /* 夫分曰仄兇 */
case 11992: dir = 0; break; /* 夫分曰丹尹 */
default: break;
}
if( dir >= 0 )CHAR_setInt(meindex,CHAR_DIR,dir);
}
CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_TYPEDOOR );
CHAR_setFlg( meindex , CHAR_ISATTACKED , 0 );
CHAR_setInt( meindex , CHAR_WORKDOORSWITCHCURRENT , 0 );
CHAR_setWorkInt( meindex, CHAR_WORKDOOREXPIRETIME, 0xffffffff);
if( CHAR_getWorkInt( meindex , CHAR_WORKDOORPASSFLG ) == 1){
NPC_ROOMINFO roominfo;
if( NPC_RoomAdminNew_ReadFile( CHAR_getWorkChar( meindex, CHAR_WORKDOORNAME), &roominfo) == TRUE ){
NPC_DoorSetPasswd( meindex, roominfo.passwd);
CHAR_setWorkInt( meindex, CHAR_WORKDOOREXPIRETIME, roominfo.expire);
}else {
NPC_DoorSetPasswd( meindex, "8hda8iauia90494jasd9asodfasdf89" );
if( getStringFromIndexWithDelim(arg, "|" , 13 , buf,sizeof(buf) ))
if( strlen( buf) != 0 )
NPC_DoorSetPasswd( meindex, buf );
}
}
CHAR_setInt( meindex, CHAR_BASEIMAGENUMBER , CHAR_getWorkInt(meindex, CHAR_WORKDOORCLOSEG));
NPC_DoorRefreshOverFlg( meindex );
CHAR_setWorkInt( meindex, CHAR_WORKEVENTTYPE, CHAR_EVENT_NPC);
return TRUE;
}
void NPC_DoorAddSwitchCounter( int meindex , int i , int doindex )
{
if( i != 0 && CHAR_getWorkInt( meindex, CHAR_WORKDOORSWITCHCOUNT)
!= 0 ){
CHAR_setWorkInt( meindex, CHAR_WORKDOORSWITCHCURRENT ,
CHAR_getWorkInt(meindex,
CHAR_WORKDOORSWITCHCURRENT)
+ i );
if( CHAR_getWorkInt( meindex, CHAR_WORKDOORSWITCHCURRENT ) ==
CHAR_getWorkInt( meindex, CHAR_WORKDOORSWITCHCOUNT) ){
NPC_DoorOpen( meindex , doindex );
} else {
NPC_DoorClose( meindex , doindex );
}
}
}
void NPC_DoorSetSwitchCounter( int meindex, int i , int doindex )
{
if( !CHAR_CHECKINDEX(meindex))return;
CHAR_setWorkInt( meindex , CHAR_WORKDOORSWITCHCURRENT , i );
NPC_DoorAddSwitchCounter( meindex, 0 , doindex );
}
static int NPC_DoorSamePos( int meindex ){
int iWork;
OBJECT object;
int floor = CHAR_getInt( meindex, CHAR_FLOOR );
int x = CHAR_getInt( meindex, CHAR_X );
int y = CHAR_getInt( meindex, CHAR_Y );
for( object=MAP_getTopObj( floor, x,y ); object ; object = NEXT_OBJECT(object) ){
int objindex = GET_OBJINDEX(object);
if( OBJECT_getType(objindex) != OBJTYPE_CHARA )continue;
iWork = OBJECT_getIndex(objindex);
if( CHAR_getInt(iWork,CHAR_HP) < 0 )continue;
if( CHAR_getInt( iWork,CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ){
return iWork;
}
}
return -1;
}
void NPC_DoorWatch( int myobjindex, int moveobjindex, CHAR_ACTION act,
int x, int y, int dir, int* opt, int optlen )
{
unsigned long closetime;
int meindex, moveindex;
if( OBJECT_getType( moveobjindex) != OBJTYPE_CHARA ) {
return;
}
meindex = OBJECT_getIndex(myobjindex);
moveindex = OBJECT_getIndex(moveobjindex);
if( NPC_Door_isOpen( meindex ) == 0 )return;
if( CHAR_getInt( moveindex , CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ){
return;
}
if( CHAR_getWorkInt( meindex , CHAR_WORKDOORSOONFLG )){
if( CHAR_getInt( meindex , CHAR_TALKCOUNT ) > 0 ){
if( NPC_DoorSamePos( meindex ) == -1 ){
NPC_DoorClose(meindex , -1 );
CHAR_setInt( meindex , CHAR_TALKCOUNT, 0 );
}
}
}else
if( CHAR_getInt( meindex, CHAR_MERCHANTLEVEL ) >= 0 ){
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -