📄 npc_npcenemy.c
字号:
#include "version.h"
#include <string.h>
#include "char.h"
#include "object.h"
#include "char_base.h"
#include "npcutil.h"
#include "npc_npcenemy.h"
#include "battle.h"
#include "enemy.h"
#include "readmap.h"
#include "encount.h"
#include "lssproto_serv.h"
#include "configfile.h"
#include "anim_tbl.h"
#include "handletime.h"
#include "npc_eventaction.h"
enum {
CHAR_WORK_ENCOUNTTYPE = CHAR_NPCWORKINT1, /* 巨件市它件玄及酷 */
CHAR_WORK_DIEACT = CHAR_NPCWORKINT2, /* 韶氏分凛升丹允月井 */
CHAR_WORK_WARP_FLOOR = CHAR_NPCWORKINT3, /* 伐□皿允月白夫失*/
CHAR_WORK_WARP_X = CHAR_NPCWORKINT4, /* 伐□皿允月X */
CHAR_WORK_WARP_Y = CHAR_NPCWORKINT5, /* 伐□皿允月Y */
CHAR_WORK_ONEBATTLE = CHAR_NPCWORKINT6, /* 域勾仄井爵 仄卅中 */
NPC_TIME_MODE = CHAR_NPCWORKINT7,
CHAR_WORK_BASEIMGBAK = CHAR_NPCWORKINT8, /* 手午及 飓 寞 */
CHAR_WORK_DIETIME = CHAR_NPCWORKINT9, /* 韶氏分凛棉 */
CHAR_WORK_REVIVALTIME = CHAR_NPCWORKINT10, /* 戏五忒月凛棉 */
CHAR_WORK_BATTLETYPE = CHAR_NPCWORKINT11,
};
#define NPC_ENEMY_REVIVALTIMA_DEFAULT 120
static int gymbody[] = {
SPR_001em,SPR_011em,SPR_021em,SPR_031em,SPR_041em,SPR_051em,
SPR_061em,SPR_071em,SPR_081em,SPR_091em,SPR_101em,SPR_111em,
SPR_002em,SPR_012em,SPR_022em,SPR_032em,SPR_042em,SPR_052em,
SPR_062em,SPR_072em,SPR_082em,SPR_092em,SPR_102em,SPR_112em,
SPR_003em,SPR_013em,SPR_023em,SPR_033em,SPR_043em,SPR_053em,
SPR_063em,SPR_073em,SPR_083em,SPR_093em,SPR_103em,SPR_113em,
SPR_004em,SPR_014em,SPR_024em,SPR_034em,SPR_044em,SPR_054em,
SPR_064em,SPR_074em,SPR_084em,SPR_094em,SPR_104em,SPR_114em,
};
#ifdef _NEW_WARPMAN
static BOOL NPC_NPCEnemy_CheckFree( int meindex, int toindex, BOOL *Party);
BOOL NPC_WarpAllMsg(int meindex,int toindex );
BOOL NPCEnemy_CheckFree( int meindex, int talker, char *buf);
BOOL NPCEnemy_BSCheck(int meindex,int talker,char* buf);
BOOL NPCEnemy_FreeIfCheck(int meindex,int talker,char* buf,int kosuu,int flg, int temp);
BOOL NPCEnemy_WarpManReduce(int meindex,int talker,char *buf);
BOOL NPCEnemy_BigSmallLastCheck(int point1,int mypoint,int flg);
BOOL NPCEnemy_CheckTrans(int meindex,int talker,int trans,int flg);
BOOL NPCEnemy_LevelCheck(int meindex,int talker,int level,int flg);
BOOL NPCEnemy_CheckMyPet( int meindex, int talker, int petLv, int flg, int petid);
BOOL NPCEnemy_ItemCheck(int meindex,int talker,int itemNo,int flg);
#endif
#ifdef _NPC_REPLACEMENT
void Check_EnemyWarpMe( int meindex, char *args );
#endif
static int NPC_NPCEnemy_StealItem( char *argstr, int meindex, int charaindex);
BOOL NPC_NPCEnemyInit( int meindex )
{
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
char buf[64];
int tmp, gym;
if( NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)) == NULL ) {
print("Can't GetArgStr !!");
return FALSE;
}
if( NPC_Util_GetStrFromStrWithDelim( argstr, "sktype", buf, sizeof( buf)) != NULL ){
CHAR_setWorkInt( meindex, CHAR_WORK_BATTLETYPE, atoi( buf));
}else{
CHAR_setWorkInt( meindex, CHAR_WORK_BATTLETYPE, 0);
}
if( NPC_Util_GetStrFromStrWithDelim( argstr, "enemyno", buf, sizeof( buf)) == NULL ){
char filename[256];
NPC_Util_CheckAssignArgFile( meindex, filename);
print( "NPCEnemy: nothing parameter [enemyno]:\n%s\n", filename);
return FALSE;
}else {
int i;
for( i = 0; i < NPC_ENEMY_ENEMYNUMBER; i ++ ) {
int curEnemy;
char data[128];
int ret;
ret = getStringFromIndexWithDelim( buf,",", i + 1, data, sizeof(data));
if( ret == FALSE)
break;
curEnemy = ENEMY_getEnemyArrayFromId( atoi( data));
if( !ENEMY_CHECKINDEX( curEnemy) ) {
char filename[256];
NPC_Util_CheckAssignArgFile( meindex, filename);
print( "NPCEnemy: invalid param [enemyno:%d data:%s curEnemy:%d]\nfile:%s\n",i+1, data, curEnemy, filename );
return FALSE;
}
}
}
if( NPC_Util_GetStrFromStrWithDelim( argstr, "steal", buf, sizeof( buf)) != NULL ) {
if( NPC_Util_GetStrFromStrWithDelim( argstr, "item", buf, sizeof( buf)) == NULL ) {
print( "NPCEnemy:有指定steal而没有指定item,很奇怪\n");
return FALSE;
}
}
gym = NPC_Util_GetNumFromStrWithDelim( argstr, "gym");
if( gym > 0 ){
CHAR_setInt( meindex, CHAR_BASEBASEIMAGENUMBER,
gymbody[RAND( 0, arraysizeof( gymbody ) - 1)] );
CHAR_setInt( meindex, CHAR_BASEIMAGENUMBER,
CHAR_getInt( meindex, CHAR_BASEBASEIMAGENUMBER ) );
CHAR_setInt( meindex, CHAR_LV, gym );
}
tmp = NPC_Util_GetNumFromStrWithDelim( argstr, "dieact");
if( tmp != 1 )
tmp = 0;
CHAR_setWorkInt( meindex, CHAR_WORK_DIEACT, tmp);
if( strstr( argstr, "NEWNPCENEMY") != 0 ) {
CHAR_setWorkInt( meindex, CHAR_WORK_WARP_FLOOR, 0 );
CHAR_setWorkInt( meindex, CHAR_WORK_WARP_Y, 0 );
CHAR_setWorkInt( meindex, CHAR_WORK_WARP_X, 0 );
}else {
if( CHAR_getWorkInt( meindex, CHAR_WORK_DIEACT) == 1 ) {
char buff1[256];
if( NPC_Util_GetStrFromStrWithDelim( argstr, "warpfl", buff1, sizeof( buff1) ) == NULL) {
print( "NPCENEMY: nothing warp_floor %s\n", buff1);
return FALSE;
}
tmp = atoi( buff1);
CHAR_setWorkInt( meindex, CHAR_WORK_WARP_FLOOR, tmp);
if( NPC_Util_GetStrFromStrWithDelim( argstr, "warpx", buff1, sizeof( buff1) ) == NULL) {
print( "NPCENEMY: nothing warp_x\n");
return FALSE;
}
tmp = atoi( buff1);
CHAR_setWorkInt( meindex, CHAR_WORK_WARP_X, tmp);
if( NPC_Util_GetStrFromStrWithDelim( argstr, "warpy", buff1, sizeof( buff1) ) == NULL) {
print( "NPCENEMY: nothing warp_y\n");
return FALSE;
}
tmp = atoi( buff1);
CHAR_setWorkInt( meindex, CHAR_WORK_WARP_Y, tmp);
if( MAP_IsValidCoordinate( CHAR_getWorkInt( meindex, CHAR_WORK_WARP_FLOOR),
CHAR_getWorkInt( meindex, CHAR_WORK_WARP_X),
CHAR_getWorkInt( meindex, CHAR_WORK_WARP_Y) ) == FALSE ){
char filename[256];
NPC_Util_CheckAssignArgFile( meindex, filename);
print( "NPCENEMY: %s: .\n %s.\nInvalid fl=%d,x=%d,y=%d\n", filename, argstr,
CHAR_getWorkInt( meindex, CHAR_WORK_WARP_FLOOR),
CHAR_getWorkInt( meindex, CHAR_WORK_WARP_X),
CHAR_getWorkInt( meindex, CHAR_WORK_WARP_Y) );
return FALSE;
}
}
}
//andy_end
tmp = NPC_Util_GetNumFromStrWithDelim( argstr, "entype");
if( tmp != 1 && tmp != 2)
tmp = 0;
CHAR_setWorkInt( meindex, CHAR_WORK_ENCOUNTTYPE, tmp);
tmp = NPC_Util_GetNumFromStrWithDelim( argstr, "onebattle");
if( tmp != 1 )
tmp = 0;
CHAR_setWorkInt( meindex, CHAR_WORK_ONEBATTLE, tmp);
tmp = NPC_Util_GetNumFromStrWithDelim( argstr, "time");
if( tmp == -1 )
tmp = NPC_ENEMY_REVIVALTIMA_DEFAULT;
CHAR_setWorkInt( meindex, CHAR_WORK_REVIVALTIME, tmp);
CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_TYPENPCENEMY );
CHAR_setWorkInt( meindex, CHAR_WORKEVENTTYPE, CHAR_EVENT_ENEMY);
CHAR_setWorkInt( meindex, CHAR_WORK_BASEIMGBAK,
CHAR_getInt( meindex, CHAR_BASEIMAGENUMBER));
return TRUE;
}
void NPC_NPCEnemyTalked( int meindex , int talkerindex , char *szMes ,
int color )
{
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
char buf[256];
if( CHAR_getInt( talkerindex , CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) {
return;
}
if( NPC_Util_GetArgStr( meindex, npcarg, sizeof( npcarg)) == NULL ) {
print("Can't GetArgStr !!");
return;
}
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "NEWTIME", buf, sizeof( buf)) != NULL ){
if( CHAR_getWorkInt( meindex, NPC_TIME_MODE) <= 0 ) {
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "Time_Msg", buf, sizeof( buf) ) != NULL) {
CHAR_talkToCli( talkerindex, meindex, buf, CHAR_COLORYELLOW);
}
return;
}
}
if( !NPC_Util_charIsInFrontOfChar( talkerindex, meindex, 1 ))
return;
if( CHAR_getWorkInt( meindex, CHAR_WORK_ENCOUNTTYPE) >= 1 ) {
NPC_NPCEnemy_Encount( meindex, talkerindex, 1);
}
}
int NPC_NPCEnemy_Encount( int meindex, int charaindex, int mode)
{
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
char buf[512];
BOOL flg = TRUE;
int battlemax = getBattlenum();
int i;
if( CHAR_getInt( meindex, CHAR_BASEIMAGENUMBER) == 0 ) {
return FALSE;
}
if( mode == 0 ) {
if( CHAR_getWorkInt( meindex, CHAR_WORK_ENCOUNTTYPE) == 1 ) {
flg = FALSE;
}
}else if( mode == 1 ) {
if( CHAR_getWorkInt( meindex, CHAR_WORK_ENCOUNTTYPE) == 0 ) {
flg = FALSE;
}
}
NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr));
if( !flg) {
if( NPC_Util_GetStrFromStrWithDelim( argstr, "deniedmsg", buf, sizeof( buf)) != NULL ) {
CHAR_talkToCliAndParty( charaindex, meindex ,buf , CHAR_COLORYELLOW );
}
return FALSE;
}
flg = FALSE;
while( 1 ) {
char buf[1024];
if( NPC_Util_GetStrFromStrWithDelim( argstr, "item", buf, sizeof( buf)) != NULL ) {
char data[128];
BOOL found = FALSE;
for( i = 0; i < CHAR_MAXITEMHAVE; i ++ ) {
int j;
int itemid;
int ret = getStringFromIndexWithDelim( buf,",", i + 1,data, sizeof(data));
if( ret == FALSE)
break;
found = FALSE;
itemid = atoi( data);
for( j = 0; j < CHAR_MAXITEMHAVE; j ++ ) {
int itemindex = CHAR_getItemIndex( charaindex, j);
if( ITEM_CHECKINDEX( itemindex)) {
if( ITEM_getInt( itemindex, ITEM_ID) == itemid ) {
found = TRUE;
break;
}
}
}
if( !found )
break;
}
if( !found )
break;
}
#ifdef _ADD_NOITEM_BATTLE
if(NPC_Util_GetStrFromStrWithDelim(argstr,"noitem",buf,sizeof(buf)) != NULL){
char data[128];
BOOL found = FALSE;
for(i=0;i<CHAR_MAXITEMHAVE;i++){
int j;
int itemid;
int ret = getStringFromIndexWithDelim(buf,",",i + 1,data,sizeof(data));
if(ret == FALSE) break;
found = TRUE;
itemid = atoi(data);
for(j=0;j<CHAR_MAXITEMHAVE;j++){
int itemindex = CHAR_getItemIndex(charaindex,j);
if(ITEM_CHECKINDEX( itemindex)){
if(ITEM_getInt(itemindex,ITEM_ID) == itemid){
found = FALSE;
break;
}
}
}
if(!found) break;
}
if(!found) break;
}
#endif
{
char data[256];
BOOL Evflg=TRUE;
if( NPC_Util_GetStrFromStrWithDelim( argstr, "B_evend", buf, sizeof( buf)) != NULL ) {
int i=1, event=-1;;
while( getStringFromIndexWithDelim( buf,",", i, data, sizeof( data)) ){
i++;
event=atoi( data);
if( NPC_EventCheckFlg( charaindex, event) == FALSE ) {
Evflg = FALSE;
break;
}
}
}
if( Evflg == FALSE )
break;
i=1;
if( NPC_Util_GetStrFromStrWithDelim( argstr, "B_evnow", buf, sizeof( buf)) != NULL ) {
int i=1, event=-1;;
while( getStringFromIndexWithDelim( buf,",", i, data, sizeof( data)) ){
i++;
event=atoi( data);
if( NPC_NowEventCheckFlg( charaindex, event) == FALSE ) {
Evflg = FALSE;
break;
}
}
}
if( Evflg == FALSE )
break;
}
if( CHAR_getWorkInt( meindex, CHAR_WORK_ONEBATTLE ) == 1 ) {
for( i = 0; i < battlemax; i ++ ) {
if( BattleArray[i].use ) {
if( BattleArray[i].createindex == meindex ) {
break;
}
}
}
if( i != battlemax ) {
if( NPC_Util_GetStrFromStrWithDelim( argstr, "alreadymsg", buf, sizeof( buf))
!= NULL )
{
CHAR_talkToCliAndParty( charaindex, meindex ,buf , CHAR_COLORYELLOW );
}
return FALSE;
}
}
flg = TRUE;
break;
}
if( flg ) {
/* 阂及凛反 骰允月 */
if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_CLIENT) {
char config[32];
snprintf( config, sizeof( config), "askbattlemsg1");
/* 爵 互铵引月蟆卞撙 丢永本□斥 */
if( NPC_Util_GetStrFromStrWithDelim( argstr, config, buf, sizeof( buf))
!= NULL )
{
int len = strlen( buf);
char escapebuf[1024];
int fd = getfdFromCharaIndex( charaindex);
char buf2[256];
/* askbattlemsg? 互丐木壬 醒垫卞允月 "\n"戊□玉毛 木月)*/
for( i = 2; i < 7; i ++ ) {
snprintf( config, sizeof( config), "askbattlemsg%d", i);
if( NPC_Util_GetStrFromStrWithDelim( argstr, config, buf2, sizeof( buf2))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -