chuyiwen_gmsv/npc/npc_npcenemy.c

1564 lines
47 KiB
C
Raw Normal View History

2016-12-24 08:45:52 +08:00
#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"
extern char hanzibuf[5000][8];
enum {
CHAR_WORK_ENCOUNTTYPE = CHAR_NPCWORKINT1, /* <20>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
CHAR_WORK_DIEACT = CHAR_NPCWORKINT2, /* <20><><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¾<EFBFBD> */
CHAR_WORK_WARP_FLOOR = CHAR_NPCWORKINT3, /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>°׷<C2B0>ʧ*/
CHAR_WORK_WARP_X = CHAR_NPCWORKINT4, /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X */
CHAR_WORK_WARP_Y = CHAR_NPCWORKINT5, /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Y */
CHAR_WORK_ONEBATTLE = CHAR_NPCWORKINT6, /* <20><><EFBFBD><EFBFBD><EFBFBD>ƾ<EFBFBD><C6BE><EFBFBD> <20><>ئ<EFBFBD><D8A6> */
NPC_TIME_MODE = CHAR_NPCWORKINT7,
CHAR_WORK_BASEIMGBAK = CHAR_NPCWORKINT8, /* <20><><EFBFBD><20><> į */
CHAR_WORK_DIETIME = CHAR_NPCWORKINT9, /* <20><><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD> */
CHAR_WORK_REVIVALTIME = CHAR_NPCWORKINT10, /* Ϸ<><CFB7>߯<EFBFBD><DFAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
CHAR_WORK_BATTLETYPE = CHAR_NPCWORKINT11,
#ifdef _WARNPC_CTRL
CHAR_WORK_BATTLEINGTIME = CHAR_NPCWORKINT12,
#endif
};
#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;
#ifdef _NPCENEMY_1
char token1[128];
#endif
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:<3A><>ָ<EFBFBD><D6B8>steal<61><6C>û<EFBFBD><C3BB>ָ<EFBFBD><D6B8>item<65><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\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 ) {
if(strstr(npcarg,"STARTRAND")!=NULL){
time_t timep;
struct tm *p;
time(&timep);
p=localtime(&timep);
timep = mktime(p);
char *randtypetime = CHAR_getChar(talkerindex,CHAR_RANDTYPE);
char tempbuff[64];
int randtype = 0;
int randtime = 0;
int randwrong = 0;
if(strlen(randtypetime)>2){
if(getStringFromIndexWithDelim(randtypetime,"-", 3, tempbuff, sizeof(tempbuff)) != FALSE){
if(getStringFromIndexWithDelim(randtypetime,"-", 1, tempbuff, sizeof(tempbuff))== FALSE)
return;
randwrong = atoi(tempbuff);
if(getStringFromIndexWithDelim(randtypetime,"-", 2, tempbuff, sizeof(tempbuff))== FALSE)
return;
randtype = atoi(tempbuff);
if(getStringFromIndexWithDelim(randtypetime,"-", 3, tempbuff, sizeof(tempbuff))== FALSE)
return;
randtime = atoi(tempbuff);
#ifdef _MM_NO_JIAOBEN
if(timep - randtime < getEditBaseTime()*randwrong){
char errbuf[256];
sprintf(errbuf,"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%d<><64><EFBFBD>ſ<EFBFBD><C5BF>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>˲<EFBFBD><CBB2><EFBFBD><EFBFBD><EFBFBD>",getEditBaseTime()*randwrong-(timep - randtime));
CHAR_talkToCli(talkerindex, -1, errbuf, CHAR_COLORRED);
return;
}
#endif
}
}
// if(timep-CHAR_getWorkInt(talkerindex,CHAR_WORKRANDEDITBASETIME)>=getEditBaseTime())
// CHAR_setWorkInt(talkerindex,CHAR_WORKRANDEDITBASETIME,timep);
// else{
// char errbuf[256];
// sprintf(errbuf,"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%d<><64><EFBFBD>ſ<EFBFBD><C5BF>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>˲<EFBFBD><CBB2><EFBFBD><EFBFBD><EFBFBD>",getEditBaseTime()-(timep-CHAR_getWorkInt(talkerindex,CHAR_WORKRANDEDITBASETIME)));
// CHAR_talkToCli(talkerindex, -1, errbuf, CHAR_COLORRED);
// return;
// }
char jiabuf[][5]={"<EFBFBD><EFBFBD>","<EFBFBD><EFBFBD>","<EFBFBD><EFBFBD>","<EFBFBD><EFBFBD>","<EFBFBD><EFBFBD>","ʮ","<EFBFBD><EFBFBD>"};
char jianbuf[][5]={"<EFBFBD><EFBFBD>","һ","-","<EFBFBD><EFBFBD>","-","<EFBFBD><EFBFBD>","<EFBFBD><EFBFBD>"};
char chengbuf[][5]={"<EFBFBD><EFBFBD>","*","x","X","<EFBFBD><EFBFBD>","<EFBFBD><EFBFBD>","<EFBFBD><EFBFBD>"};
char numbuf[][5]={"<EFBFBD><EFBFBD>","<EFBFBD><EFBFBD>","<EFBFBD><EFBFBD>","<EFBFBD><EFBFBD>","<EFBFBD><EFBFBD>","<EFBFBD><EFBFBD>","<EFBFBD><EFBFBD>","<EFBFBD><EFBFBD>","<EFBFBD><EFBFBD>","<EFBFBD><EFBFBD>"};
char arg[255];
int i,j,k,l,m;
char buf[256];
i = RAND(30,70);
j = RAND(1,29);
l = RAND(1,7);
m = RAND(1,3);
char *typebuf;
// if(randtype == 0){
// randtype = RAND(1,10);
// if(randtype<=5){
// randtype = RAND(1,10);
// if(randtype<=3) randtype=1;
// else randtype=2;
// }else{
// randtype = RAND(1,10);
// if(randtype<=3) randtype=3;
// else randtype=4;
// }
// }
randtype = 4;
{
// sprintf(arg,"%s",sasql_rand_buf());
// if(strcmp(arg,"err")==0) return;
char tempbuf[64];
char randquestion[64];
char randrightanswer[64];
char randwronganswer1[64];
char randwronganswer2[64];
char randwronganswer3[64];
char randwronganswer4[64];
// if(getStringFromIndexWithDelim(arg,"|", 1, tempbuf, sizeof(tempbuf)) == FALSE)
// return;
// strcpy(randquestion,tempbuf);
// if(getStringFromIndexWithDelim(arg,"|", 2, tempbuf, sizeof(tempbuf)) == FALSE)
// return;
// strcpy(randrightanswer,tempbuf);
// if(getStringFromIndexWithDelim(arg,"|", 3, tempbuf, sizeof(tempbuf)) == FALSE)
// return;
// strcpy(randwronganswer1,tempbuf);
// if(getStringFromIndexWithDelim(arg,"|", 4, tempbuf, sizeof(tempbuf)) == FALSE)
// return;
// strcpy(randwronganswer2,tempbuf);
// if(getStringFromIndexWithDelim(arg,"|", 5, tempbuf, sizeof(tempbuf)) == FALSE)
// return;
// strcpy(randwronganswer3,tempbuf);
// if(getStringFromIndexWithDelim(arg,"|", 6, tempbuf, sizeof(tempbuf)) == FALSE)
// return;
// strcpy(randwronganswer4,tempbuf);
memset(tempbuf, 0, sizeof(tempbuf));
memset(randquestion, 0, sizeof(randquestion));
memset(randrightanswer, 0, sizeof(randrightanswer));
memset(randwronganswer1, 0, sizeof(randwronganswer1));
memset(randwronganswer2, 0, sizeof(randwronganswer2));
memset(randwronganswer3, 0, sizeof(randwronganswer3));
memset(randwronganswer4, 0, sizeof(randwronganswer4));
if(RAND(1,100)<=75){
char randtmpbuf[4][10];
sprintf(randtmpbuf[0],"%s",hanzibuf[RAND(1,5000)-1]);
sprintf(randtmpbuf[1],"%s",hanzibuf[RAND(1,5000)-1]);
sprintf(randtmpbuf[2],"%s",hanzibuf[RAND(1,5000)-1]);
sprintf(randtmpbuf[3],"%s",hanzibuf[RAND(1,5000)-1]);
sprintf(randquestion,"%s",str_hanzi_ganrao(randtmpbuf[0],randtmpbuf[1],randtmpbuf[2],randtmpbuf[3],0,0,0,0,0,0));
strcat(randquestion,"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD>");
int newrand1 = RAND(1,100)-1;
int newrand2 = RAND(1,100)-1;
int newrand3 = RAND(1,100)-1;
int newrand4 = RAND(1,100)-1;
int newrand5 = RAND(1,100)-1;
sprintf(randrightanswer,"%s",str_hanzi_ganrao(randtmpbuf[0],randtmpbuf[1],randtmpbuf[2],randtmpbuf[3],1,newrand1,newrand2,newrand3,newrand4,newrand5));
sprintf(randwronganswer1,"%s",str_hanzi_ganrao(randtmpbuf[0],randtmpbuf[1],randtmpbuf[3],randtmpbuf[2],1,newrand1,newrand2,newrand3,newrand4,newrand5));
sprintf(randwronganswer2,"%s",str_hanzi_ganrao(randtmpbuf[3],randtmpbuf[1],randtmpbuf[2],randtmpbuf[0],1,newrand1,newrand2,newrand3,newrand4,newrand5));
sprintf(randwronganswer3,"%s",str_hanzi_ganrao(randtmpbuf[1],randtmpbuf[0],randtmpbuf[2],randtmpbuf[3],1,newrand1,newrand2,newrand3,newrand4,newrand5));
sprintf(randwronganswer4,"%s",str_hanzi_ganrao(randtmpbuf[2],randtmpbuf[3],randtmpbuf[0],randtmpbuf[1],1,newrand1,newrand2,newrand3,newrand4,newrand5));
}else{
int tii;
char timubuf[36][5] = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9"};
for(tii=0;tii<5;tii++){
if(tii==0)
strcpy(tempbuf,timubuf[RAND(1,36)-1]);
else{
int timunum = 0;
while(1){
timunum = RAND(1,36)-1;
if(strstr(tempbuf,timubuf[timunum])==NULL)
break;
}
strcat(tempbuf,timubuf[timunum]);
}
}
sprintf(randwronganswer1,"[%c%c%c%c%c]",tempbuf[0],tempbuf[2],tempbuf[1],tempbuf[3],tempbuf[4]);
sprintf(randwronganswer2,"[%c%c%c%c%c]",tempbuf[0],tempbuf[1],tempbuf[4],tempbuf[2],tempbuf[3]);
sprintf(randwronganswer3,"[%c%c%c%c%c]",tempbuf[4],tempbuf[1],tempbuf[2],tempbuf[0],tempbuf[3]);
sprintf(randwronganswer4,"[%c%c%c%c%c]",tempbuf[1],tempbuf[0],tempbuf[2],tempbuf[3],tempbuf[4]);
sprintf(randquestion,"[%s]<5D><><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3><EFBFBD>ͬӢ<CDAC>ģ<EFBFBD>",tempbuf);
sprintf(randrightanswer,"[%s]",tempbuf);
char* randstr = NULL;
randstr = str_ganrao(randquestion);
strcpy(randquestion,randstr);
randstr = str_ganraoan(randrightanswer);
strcpy(randrightanswer,randstr);
randstr = str_ganraoan(randwronganswer1);
strcpy(randwronganswer1,randstr);
randstr = str_ganraoan(randwronganswer2);
strcpy(randwronganswer2,randstr);
randstr = str_ganraoan(randwronganswer3);
strcpy(randwronganswer3,randstr);
randstr = str_ganraoan(randwronganswer4);
strcpy(randwronganswer4,randstr);
}
int n;
int randnum1;
m=1;
char tempret[5][64];
randnum1 = RAND(1,5);
int rightnum,wrongnum1,wrongnum2,wrongnum3,wrongnum4;
rightnum = RAND(getRandMin(),getRandMax());
wrongnum1 = RAND(getRandMin(),getRandMax());
wrongnum2 = RAND(getRandMin(),getRandMax());
wrongnum3 = RAND(getRandMin(),getRandMax());
wrongnum4 = RAND(getRandMin(),getRandMax());
//char *tempbuff2 = "ABCDE";
int qianhounum = RAND(1,100);
for(n=1;n<=5;n++){
if(n==randnum1){
if(qianhounum<=50)
sprintf(tempret[n-1],"ѡ<EFBFBD><EFBFBD>( %d %s )",rightnum,randrightanswer);
else
sprintf(tempret[n-1],"ѡ<EFBFBD><EFBFBD>( %s %d )",randrightanswer,rightnum);
}else{
if(m==1){
if(qianhounum<=50)
sprintf(tempret[n-1],"ѡ<EFBFBD><EFBFBD>( %d %s )",wrongnum1,randwronganswer1);
else
sprintf(tempret[n-1],"ѡ<EFBFBD><EFBFBD>( %s %d )",randwronganswer1,wrongnum1);
m = 2;
}else if(m==2){
if(qianhounum<=50)
sprintf(tempret[n-1],"ѡ<EFBFBD><EFBFBD>( %d %s )",wrongnum2,randwronganswer2);
else
sprintf(tempret[n-1],"ѡ<EFBFBD><EFBFBD>( %s %d )",randwronganswer2,wrongnum2);
m = 3;
}else if(m==3){
if(qianhounum<=50)
sprintf(tempret[n-1],"ѡ<EFBFBD><EFBFBD>( %d %s )",wrongnum3,randwronganswer3);
else
sprintf(tempret[n-1],"ѡ<EFBFBD><EFBFBD>( %s %d )",randwronganswer3,wrongnum3);
m = 4;
}else if(m==4){
if(qianhounum<=50)
sprintf(tempret[n-1],"ѡ<EFBFBD><EFBFBD>( %d %s )",wrongnum4,randwronganswer4);
else
sprintf(tempret[n-1],"ѡ<EFBFBD><EFBFBD>( %s %d )",randwronganswer4,wrongnum4);
m = 5;
}
}
}
int windowtype = 0;
int selecttype = RAND(1,100);
if(selecttype<=30){
sprintf(buf,"%d|%d",rightnum,meindex);
windowtype = WINDOW_MESSAGETYPE_MESSAGEANDLINEINPUT;
}else{
sprintf(buf,"%d|%d",randnum1,meindex);
windowtype = WINDOW_MESSAGETYPE_SELECT;
}
CHAR_setWorkChar(talkerindex, CHAR_WORKRANDMSG, buf);
int fd = getfdFromCharaIndex( talkerindex );
sprintf(buf,"%s\n%s\n%s\n%s\n%s\n%s\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD>ߵ<EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>",randquestion,tempret[0],tempret[1],tempret[2],tempret[3],tempret[4]);
lssproto_WN_send( fd, windowtype,
WINDOW_BUTTONTYPE_OK,
CHAR_WINDOWTYPE_NPCENEMY_RAND_MSG,
-1,
buf);
CHAR_setWorkInt(talkerindex,CHAR_WORKLUANPCINT,0);
}
if(randwrong<=0){
sprintf(tempbuff,"1-%d-%d",randtype,timep);
}else{
sprintf(tempbuff,"%d-%d-%d",randwrong*3,randtype,timep);
}
CHAR_setChar(talkerindex,CHAR_RANDTYPE,tempbuff);
return;
}
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;
}
}
#ifdef _NPCENEMY_1
if( NPC_Util_GetStrFromStrWithDelim( argstr, "partynum", buf, sizeof( buf))!= NULL ) {
if( CHAR_getWorkInt( charaindex, (atoi(buf)-1) + CHAR_WORKPARTYINDEX1) == -1 ) {
char partymsg[256];
sprintf(partymsg,"<EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%d<><64>,<2C>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",atoi(buf));
CHAR_talkToCliAndParty( charaindex, meindex ,partymsg, CHAR_COLORYELLOW );
return FALSE;
}
}
#endif
flg = TRUE;
break;
}
if( flg ) {
/* <20>Ҽ<EFBFBD><D2BC>ݷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_CLIENT) {
char config[32];
snprintf( config, sizeof( config), "askbattlemsg1");
/* <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߤ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
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? <20><>ؤľ<D8A4><C4BE> <20>ѵ<EFBFBD><D1B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "\n"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ë ľ<><C4BE>)*/
for( i = 2; i < 7; i ++ ) {
snprintf( config, sizeof( config), "askbattlemsg%d", i);
if( NPC_Util_GetStrFromStrWithDelim( argstr, config, buf2, sizeof( buf2))!= NULL )
{
strcpysafe( &buf[len], sizeof( buf)-len, "\n" );
len++;
strcpysafe( &buf[len], sizeof( buf)-len, buf2 );
len += strlen( buf2);
if( len >= sizeof( buf) ) {
print( "buffer over\n");
return FALSE;
}
}
else {
strcpysafe( &buf[len], sizeof( buf)-len, "\n" );
len++;
if( len >= sizeof( buf) ) {
print( "buffer over\n");
return FALSE;
}
}
}
if( fd != -1 ) {
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,
WINDOW_BUTTONTYPE_YESNO,
CHAR_WINDOWTYPE_NPCENEMY_START,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
makeEscapeString( buf, escapebuf,sizeof(escapebuf)));
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
return FALSE;
}else {
/* <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
flg = NPC_NPCEnemy_BattleIn( meindex, charaindex);
}
}
}
if( !flg) {
if( NPC_Util_GetStrFromStrWithDelim( argstr, "deniedmsg", buf, sizeof( buf))!= NULL )
{
CHAR_talkToCliAndParty( charaindex, meindex ,buf , CHAR_COLORYELLOW );
}
}
return flg;
}
int NPC_NPCEnemy_Dying( int battleindex, int meindex )
{
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
char buf[64];
int i,toindex=-1;
int tmp=-1;
if( !CHAR_CHECKINDEX( meindex)) {
return FALSE;
}
NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr));
#ifdef _NEW_WARPMAN
if( strstr( argstr, "NEWNPCENEMY") ) {
}else {
#endif
/* Ӭ <20><><EFBFBD><EFBFBD>̫ */
if( NPC_Util_GetStrFromStrWithDelim( argstr, "endmsg", buf, sizeof( buf)) != NULL ) {
for( i = 0; i < 5; i ++ ) {
/* <20><> <20><EFBFBD><E5B8A8><EFBFBD>ƻ<EFBFBD><C6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5B6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
int toindex = BattleArray[battleindex].Side[0].Entry[i].charaindex;
if( CHAR_CHECKINDEX( toindex) ) {
CHAR_talkToCli( toindex, meindex ,buf , CHAR_COLORYELLOW );
}
}
}
#ifdef _NEW_WARPMAN
}
#endif
if( NPC_Util_GetStrFromStrWithDelim( argstr, "steal", buf, sizeof( buf)) != NULL ) {
print("\n steal TRUE !!");
if( atoi( buf) == 1 ) {
int charaindex = BattleArray[battleindex].Side[0].Entry[0].charaindex;
NPC_NPCEnemy_StealItem( argstr, meindex, charaindex);
}
}
#ifdef _ALLDOMAN // (<28><><EFBFBD>ɿ<EFBFBD>) Syu ADD <20><><EFBFBD>а<EFBFBD>NPC
if( NPC_Util_GetStrFromStrWithDelim( argstr, "herobattlefield", buf, sizeof( buf)) != NULL ) {
int charaindex = BattleArray[battleindex].Side[0].Entry[0].charaindex;
CHAR_setWorkInt ( charaindex , CHAR_WORKHEROFLOOR , atoi ( buf ) ) ;
// Syu ADD
if ( atoi ( buf ) > CHAR_getInt ( charaindex , CHAR_HEROFLOOR ) )
CHAR_setInt ( charaindex , CHAR_HEROFLOOR , atoi( buf ) ) ;
}
#endif
tmp = NPC_Util_GetNumFromStrWithDelim( argstr, "dieact");
if( tmp != 1 )
tmp = 0;
CHAR_setWorkInt( meindex, CHAR_WORK_DIEACT, tmp);
if( CHAR_getWorkInt( meindex, CHAR_WORK_DIEACT) == 0 ) {
Char *ch;
CHAR_setInt( meindex, CHAR_BASEIMAGENUMBER, 0);
print("bbi---->bi10");
CHAR_sendCToArroundCharacter( CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX));
CHAR_setWorkInt( meindex, CHAR_WORKEVENTTYPE, CHAR_EVENT_ALTERRATIVE);
MAP_sendAroundMapdata( CHAR_getInt( meindex, CHAR_FLOOR),
CHAR_getInt( meindex, CHAR_X),
CHAR_getInt( meindex, CHAR_Y));
ch = CHAR_getCharPointer( meindex);
if( ch != NULL ) {
strcpysafe( ch->charfunctable[CHAR_LOOPFUNC].string,
sizeof( ch->charfunctable[CHAR_LOOPFUNC]),
"NPCEnemyLoop");
CHAR_constructFunctable( meindex);
CHAR_setInt( meindex, CHAR_LOOPINTERVAL, 5000);
CHAR_setWorkInt( meindex, CHAR_WORK_DIETIME, NowTime.tv_sec);
#ifdef _NPCENEMY_1
char token1[512];
if( NPC_Util_GetStrFromStrWithDelim( argstr, "winmsg", token1, sizeof( token1)) != NULL ) {
int i;
int playernum = CHAR_getPlayerMaxNum();
for( i = 0 ; i < playernum ; i++) {
if( CHAR_getCharUse(i) != FALSE ) {
CHAR_talkToCli( i, -1, token1, CHAR_COLORRED);
}
}
}
if( NPC_Util_GetStrFromStrWithDelim( argstr, "GetRandItem", buf, sizeof( buf))!= NULL ){
int j=1, rand_cnt=1;
char buf2[256];
while( getStringFromIndexWithDelim( buf , "," , j, buf2, sizeof( buf2)) != FALSE ){
j++;
rand_cnt++;
}
for( i = 0; i < 5; i ++ ) {
int toindex = BattleArray[battleindex].Side[0].Entry[i].charaindex;
if( CHAR_CHECKINDEX( toindex) ) {
NPC_ActionTreasureRandItemGet( meindex, toindex, rand_cnt, buf);
}
}
}
#endif
}else {
print( "NPCENEMY:err\n");
}
}else {
for( i = 0; i < 5; i ++ ) {
toindex = BattleArray[battleindex].Side[0].Entry[i].charaindex;
if( CHAR_CHECKINDEX( toindex) ) {
#ifdef _NEW_WARPMAN
if( strstr( argstr, "NEWNPCENEMY") ) {
BOOL Party=TRUE;
if( NPC_NPCEnemy_CheckFree( meindex, toindex , &Party) == FALSE ) {
continue;
}
if( Party == TRUE ) {
}else {
if( CHAR_getWorkInt( toindex, CHAR_WORKPARTYMODE ) == CHAR_PARTY_LEADER ) {
if( NPC_WarpAllMsg( meindex, toindex ) == TRUE ) {
return TRUE;
}
}
continue;
}
}
CHAR_DischargeParty( toindex, 0); // <20><><EFBFBD><EFBFBD>
CHAR_warpToSpecificPoint( toindex,
CHAR_getWorkInt( meindex, CHAR_WORK_WARP_FLOOR),
CHAR_getWorkInt( meindex, CHAR_WORK_WARP_X),
CHAR_getWorkInt( meindex, CHAR_WORK_WARP_Y)
);
#else
CHAR_warpToSpecificPoint( toindex,
CHAR_getWorkInt( meindex, CHAR_WORK_WARP_FLOOR),
CHAR_getWorkInt( meindex, CHAR_WORK_WARP_X),
CHAR_getWorkInt( meindex, CHAR_WORK_WARP_Y)
);
#endif
#ifdef _NPC_REPLACEMENT
Check_EnemyWarpMe( meindex, argstr);
#endif
}
}
}
return TRUE;
}
void NPC_NPCEnemyLoop( int meindex )
{
if( NowTime.tv_sec > CHAR_getWorkInt( meindex, CHAR_WORK_DIETIME) +
CHAR_getWorkInt( meindex, CHAR_WORK_REVIVALTIME)){
Char *ch;
CHAR_setInt( meindex, CHAR_BASEIMAGENUMBER, CHAR_getWorkInt( meindex, CHAR_WORK_BASEIMGBAK));
print("bbi---->bi11");
CHAR_sendCToArroundCharacter( CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX));
CHAR_setWorkInt( meindex, CHAR_WORKEVENTTYPE, CHAR_EVENT_ENEMY);
#ifdef _NPCENEMY_1
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr));
char token1[1024];
if( NPC_Util_GetStrFromStrWithDelim( argstr, "npcwarp", token1, sizeof( token1)) != NULL ) {
char token[32];
char token2[32];
char buf2[32];
int floor,x,y,x1,x2,y1,y2;
int ret;
int cnt;
int dcnt = 1;
/*--<2D>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󼰴<EFBFBD> --*/
//cnt = CHAR_getWorkInt(meindex,CHAR_NPCWORKINT4);
while(getStringFromIndexWithDelim(token1,",", dcnt,buf2,sizeof(buf2) )
!=FALSE ){
dcnt++;
}
cnt = RAND(1,dcnt);
//printf("\ndcnt=%d,cnt=%d\n",dcnt,cnt);
if(getStringFromIndexWithDelim(token1,",", cnt,buf2,sizeof(buf2)) !=FALSE )
{
cnt++;
ret=getStringFromIndexWithDelim(buf2,".", 1,token,sizeof(token));
if( ret == FALSE ) {
floor = CHAR_getInt(meindex,CHAR_FLOOR);
}
floor = atoi( token );
ret=getStringFromIndexWithDelim(buf2,".", 2,token,sizeof(token));
if( ret == FALSE ){
x = CHAR_getInt(meindex,CHAR_X);
}else{
ret=getStringFromIndexWithDelim(token,"-", 1,token2,sizeof(token2));
if( ret == FALSE ){
x = atoi( token );
}else{
x1=atoi(token2);
ret=getStringFromIndexWithDelim(token,"-", 2,token2,sizeof(token2));
if( ret == FALSE ){
x2=x1;
}else{
x2=atoi(token2);
}
x = RAND(x1,x2);
}
}
//x = atoi( token );
ret=getStringFromIndexWithDelim(buf2,".", 3,token,sizeof(token));
if( ret == FALSE ) {
y = CHAR_getInt(meindex,CHAR_Y);
}else{
ret=getStringFromIndexWithDelim(token,"-", 1,token2,sizeof(token2));
if( ret == FALSE ){
y = atoi( token );
}else{
y1=atoi(token2);
ret=getStringFromIndexWithDelim(token,"-", 2,token2,sizeof(token2));
if( ret == FALSE ){
y2=y1;
}else{
y2=atoi(token2);
}
y = RAND(y1,y2);
}
}
//y = atoi( token );
//CHAR_setInt(meindex,CHAR_NPCWORKINT4, cnt);
//CHAR_warpToSpecificPoint(meindex, floor, x, y);
//CHAR_setInt(meindex,CHAR_FLOOR,floor);
//CHAR_setInt(meindex,CHAR_X,x);
//CHAR_setInt(meindex,CHAR_Y,y);
CHAR_warpToSpecificPoint(meindex,floor,x,y);
}
}
if( NPC_Util_GetStrFromStrWithDelim( argstr, "allmsg", token1, sizeof( token1)) != NULL ) {
int i;
int playernum = CHAR_getPlayerMaxNum();
for( i = 0 ; i < playernum ; i++) {
if( CHAR_getCharUse(i) != FALSE ) {
CHAR_talkToCli( i, -1, token1, CHAR_COLORRED);
}
}
}
#endif
MAP_sendAroundMapdata( CHAR_getInt( meindex, CHAR_FLOOR),
CHAR_getInt( meindex, CHAR_X),
CHAR_getInt( meindex, CHAR_Y));
ch = CHAR_getCharPointer( meindex);
if( ch != NULL ) {
strcpysafe( ch->charfunctable[CHAR_LOOPFUNC].string,
sizeof( ch->charfunctable[CHAR_LOOPFUNC]), "");
CHAR_constructFunctable( meindex);
// CHAR_setInt( meindex, CHAR_LOOPINTERVAL, 0);
}
}
}
BOOL NPC_NPCEnemy_BattleIn( int meindex, int charaindex)
{
int gym;
int ret;
char buf[256];
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
memset( argstr, 0, sizeof( argstr));
NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr));
gym = NPC_Util_GetNumFromStrWithDelim( argstr, "gym");
#ifdef _EMENY_CHANCEMAN
{
int masterindex=-1;
masterindex = NPC_EmenyChanceCheck( meindex, charaindex, argstr);
if( CHAR_CHECKINDEX( masterindex)){
charaindex = masterindex;
}else {
return TRUE;
}
}
#endif
#ifdef _WARNPC_CTRL
int sameip = NPC_Util_GetNumFromStrWithDelim( argstr, "sameip");
if(sameip == -1)
sameip = 0;
CHAR_setWorkInt( charaindex, CHAR_WORKNPCBATTLESAMEIP, sameip);
if(CHAR_getWorkInt(charaindex,CHAR_WORKNPCBATTLESAMEIP)>0){
int partyi;
unsigned ip=CONNECT_get_userip(getfdFromCharaIndex(charaindex));
unsigned teseip = ip;
unsigned toip;
int a, b, c, d,ipcnt=1;
char ipstr[32];
a=(teseip % 0x100); teseip=teseip / 0x100;
b=(teseip % 0x100); teseip=teseip / 0x100;
c=(teseip % 0x100); teseip=teseip / 0x100;
d=(teseip % 0x100);
sprintf(ipstr,"%d.%d.%d.%d",a,b,c,d);
if(strcmp(ipstr,getNoAttIp(0))==0 || strcmp(ipstr,getNoAttIp(1))==0 || strcmp(ipstr,getNoAttIp(2))==0 || strcmp(ipstr,getNoAttIp(3))==0 || strcmp(ipstr,getNoAttIp(4))==0){
}
else{
if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_NONE ) {
}else{
for( partyi = 0; partyi < CHAR_PARTYMAX; partyi ++ ) {
int index = CHAR_getWorkInt( charaindex, partyi + CHAR_WORKPARTYINDEX1);
if( CHAR_CHECKINDEX(index)) {
toip = CONNECT_get_userip(getfdFromCharaIndex(index));
if(ip==toip){
ipcnt++;
if(ipcnt>sameip){
CHAR_talkToCli( charaindex, -1, "ͬIP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ޣ<EFBFBD><EFBFBD>޷<EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><EFBFBD>", CHAR_COLORYELLOW);
return FALSE;
}
}
}
}
}
}
}
#endif
if( gym > 0 ){
ret = BATTLE_CreateVsEnemy( charaindex, 2, meindex);
}else{
ret = BATTLE_CreateVsEnemy( charaindex, 1, meindex);
}
if( ret == 0 ) {
#ifdef _WARNPC_CTRL
int tmp = NPC_Util_GetNumFromStrWithDelim( argstr, "noquckwar");
if( tmp == -1 )
tmp = 0;
CHAR_setWorkInt( meindex, CHAR_WORK_BATTLEINGTIME, tmp);
if(CHAR_getWorkInt(meindex,CHAR_WORK_BATTLEINGTIME)>0){
CHAR_setWorkInt(charaindex,CHAR_WORKNPCENEMYBATTLETIME,1);
CHAR_setWorkInt(charaindex,CHAR_WORKNPCENEMYTIME,CHAR_getWorkInt(meindex,CHAR_WORK_BATTLEINGTIME));
if(CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE){
int i;
for( i = 1; i < CHAR_PARTYMAX; i ++ ) {
if( CHAR_getWorkInt( charaindex, i + CHAR_WORKPARTYINDEX1) > -1 ) {
CHAR_setWorkInt(CHAR_getWorkInt( charaindex, i + CHAR_WORKPARTYINDEX1),CHAR_WORKNPCENEMYBATTLETIME,1);
CHAR_setWorkInt(CHAR_getWorkInt( charaindex, i + CHAR_WORKPARTYINDEX1),CHAR_WORKNPCENEMYTIME,CHAR_getWorkInt(meindex,CHAR_WORK_BATTLEINGTIME));
}
}
}
}
#endif
BattleArray[CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEINDEX)].WinFunc = NPC_NPCEnemy_Dying;
if( NPC_Util_GetStrFromStrWithDelim( argstr, "startmsg", buf, sizeof( buf)) != NULL ){
CHAR_talkToCliAndParty( charaindex, meindex ,buf , CHAR_COLORYELLOW );
}
if( NPC_Util_GetStrFromStrWithDelim( argstr, "steal", buf, sizeof( buf))!= NULL ){
if( atoi( buf) == 0 ) {
NPC_NPCEnemy_StealItem( argstr, meindex, charaindex);
}
}
#ifdef _NPCENEMY_1
if( NPC_Util_GetStrFromStrWithDelim( argstr, "help", buf, sizeof( buf)) != NULL ){
CHAR_setWorkInt(charaindex,CHAR_WORKBATTLEHELP,1);
BattleArray[CHAR_getWorkInt( charaindex,
CHAR_WORKBATTLEINDEX)].Side[
CHAR_getWorkInt( charaindex,
CHAR_WORKBATTLESIDE)].flg |= BSIDE_FLG_HELP_OK;
int i;
for( i = 0; i < 5; i ++ ) {
int toindex = BattleArray[CHAR_getWorkInt(
charaindex, CHAR_WORKBATTLEINDEX)].Side[
CHAR_getWorkInt( charaindex,
CHAR_WORKBATTLESIDE)].Entry[i].charaindex;
if( CHAR_CHECKINDEX( toindex)) {
int tofd = getfdFromCharaIndex( toindex );
if( tofd != -1 ) {
CHAR_setWorkInt(toindex,CHAR_WORKBATTLEHELP,1);
lssproto_HL_send( tofd, TRUE);
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˪<EFBFBD><CBAA> */
CHAR_sendBattleEffect( toindex, ON);
}
}
char floorname[32];
int floorx,floory;
getStringFromIndexWithDelim( MAP_getfloorShowstring(CHAR_getInt(meindex,CHAR_FLOOR)),"|", 1,floorname, sizeof(floorname));
floorx = CHAR_getInt(meindex,CHAR_X);
floory = CHAR_getInt(meindex,CHAR_Y);
int playernum = CHAR_getPlayerMaxNum();
char token1[256];
sprintf(token1,"<EFBFBD><EFBFBD>ʿ<EFBFBD>ǣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%s<><73>%d,%d<><64><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԯ<EFBFBD><D4AE>",floorname,floorx,floory);
for( i = 0 ; i < playernum ; i++) {
if( CHAR_getCharUse(i) != FALSE ) {
CHAR_talkToCli( i, -1, token1, CHAR_COLORRED);
}
}
}
#endif
}
return ( ret == 0 ) ?TRUE:FALSE ;
}
void NPC_NPCEnemyWindowTalked( int meindex, int talkerindex, int seqno, int select, char *data)
{
if( seqno == CHAR_WINDOWTYPE_NPCENEMY_START) {
if( select == WINDOW_BUTTONTYPE_YES) {
NPC_NPCEnemy_BattleIn( meindex, talkerindex);
}
}
}
static int NPC_NPCEnemy_StealItem( char *argstr, int meindex, int charaindex)
{
char itembuf[1024];
if( NPC_Util_GetStrFromStrWithDelim( argstr, "item", itembuf, sizeof( itembuf))!= NULL )
{
char data[128];
int delitemgroup[CHAR_MAXITEMHAVE];
int found = 0;
int i;
for( i = 0; i < CHAR_MAXITEMHAVE; i ++ ) {
int j;
int itemid;
int ret = getStringFromIndexWithDelim( itembuf,",", i + 1,data, sizeof(data));
if( ret == FALSE) {
break;
}
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 ){
CHAR_setItemIndex( charaindex, j, -1);
ITEM_endExistItemsOne( itemindex);
delitemgroup[found] = j;
found ++;
break;
}
}
}
if( !found ) break;
}
CHAR_sendItemData( charaindex, delitemgroup, found);
}
else {
print( "NPCENEMY:<3A><><EFBFBD><EFBFBD>\n");
return FALSE;
}
return TRUE;
}
#ifdef _NEW_WARPMAN
static BOOL NPC_NPCEnemy_CheckFree( int meindex, int toindex, BOOL *Party)
{
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
char buf1[1024],buf2[256],buf3[256],buf4[256];
char token[256];
char temp1[16];
int talkNo = 1;
int point=1;
int i=0,type=0;
struct tagWarpPoint {
int floor;
int x;
int y;
}AllWarPoint[]={
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
};
if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL) {
print("GetArgStrErr");
return FALSE;
}
if( (strstr( npcarg,"NEWNPCENEMY") == NULL) && (strstr( npcarg,"OVER") == NULL) ) {
return FALSE;
}else {
}
while( getStringFromIndexWithDelim( npcarg,"OVER",talkNo,buf1,sizeof( buf1)) != FALSE ) {
talkNo++;
sprintf(temp1,"NEWEVENT");
if( strstr( buf1, temp1) != NULL) {
if( NPC_Util_GetStrFromStrWithDelim( buf1, "FREE", buf2, sizeof( buf2) ) == FALSE ) {
continue;
}
if( NPC_ActionPassCheck( meindex, toindex, buf2) == FALSE ) {
continue;
}
if( NPC_Util_GetStrFromStrWithDelim( buf1, "endmsg", token, sizeof( token)) != NULL ) {
CHAR_talkToCli( toindex, meindex ,token , CHAR_COLORYELLOW );
}
#ifdef _ALLDOMAN // (<28><><EFBFBD>ɿ<EFBFBD>) Syu ADD <20><><EFBFBD>а<EFBFBD>NPC
if( NPC_Util_GetStrFromStrWithDelim( buf1, "herobattlefield", token, sizeof( token)) != NULL ) {
CHAR_setWorkInt ( toindex , CHAR_WORKHEROFLOOR , atoi ( token ) ) ;
if ( atoi ( token ) > CHAR_getInt ( toindex , CHAR_HEROFLOOR ) )
CHAR_setInt ( toindex , CHAR_HEROFLOOR , atoi( token ) ) ;
}
#endif
if( NPC_Util_GetStrFromStrWithDelim( buf1, "WARP", buf2, sizeof( buf2) ) == FALSE ){
continue;
}else {//RAND arraysizeof AllWarPoint
while( getStringFromIndexWithDelim( buf2, ";", point, buf3,sizeof( buf3)) != FALSE ) {
point++;
getStringFromIndexWithDelim( buf3, ",", 1, buf4, sizeof( buf4));
AllWarPoint[i].floor = atoi( buf4);
getStringFromIndexWithDelim( buf3, ",", 2, buf4, sizeof( buf4));
AllWarPoint[i].x = atoi( buf4);
getStringFromIndexWithDelim( buf3, ",", 3, buf4, sizeof( buf4));
AllWarPoint[i].y = atoi( buf4);
i++;
if( i >= arraysizeof( AllWarPoint) )
break;
}
type = RAND( 0, i-1);
if( AllWarPoint[type].floor <= 0 || type > arraysizeof( AllWarPoint)-1) {
type = 0;
}
CHAR_setWorkInt( meindex, CHAR_WORK_WARP_FLOOR, AllWarPoint[type].floor );
CHAR_setWorkInt( meindex, CHAR_WORK_WARP_X, AllWarPoint[type].x );
CHAR_setWorkInt( meindex, CHAR_WORK_WARP_Y, AllWarPoint[type].y );
}
if( NPC_Util_GetStrFromStrWithDelim( buf1, "CHECKPARTY", buf4, sizeof( buf4)) != NULL ) {
if( strstr( buf4, "FALSE") != NULL ) {
*Party = FALSE;
}
}
if( *Party == TRUE ) {
Action_RunDoEventAction( meindex, toindex, buf1);
}
return TRUE;
}
}
return FALSE;
}
BOOL NPCEnemy_CheckFree( int meindex, int talker, char *buf)
{
char buff2[256];
char buff3[128];
int i=1,j=1;
int loop=0;
while( getStringFromIndexWithDelim(buf,",",i,buff2,sizeof(buff2)) !=FALSE ) {
i++;
if(strstr(buff2,"&")!=NULL){
j=1;
loop=0;
while( getStringFromIndexWithDelim(buff2,"&",j,buff3,sizeof(buff3)) !=FALSE ) {
j++;
if(NPCEnemy_BSCheck(meindex,talker,buff3)==FALSE) {
loop=1;
break;
}
}
if(loop==0) {
CHAR_setWorkInt( talker, CHAR_WORKWARPCHECK, TRUE );
return TRUE;
}
}else{
if( NPCEnemy_BSCheck( meindex, talker, buff2) == TRUE ){
CHAR_setWorkInt( talker, CHAR_WORKWARPCHECK, TRUE );
return TRUE;
}
}
}
CHAR_setWorkInt( talker, CHAR_WORKWARPCHECK, FALSE );
return FALSE;
}
BOOL NPCEnemy_BSCheck(int meindex,int talker,char* buf)
{
char buff2[128];
int kosuu,temp=-1,flg=0;
char buff1[128],buff3[128];
if(strstr( buf, "-") != NULL) {
//buff3Ϊץ<CEAA><D7A5><EFBFBD><EFBFBD>ID
getStringFromIndexWithDelim( buf, "-", 2, buff3, sizeof(buff3));
temp = atoi( buff3);
getStringFromIndexWithDelim( buf, "-", 1, buff1, sizeof(buff1));
strcpy( buf, buff1);
}
if(strstr( buf, "<") != NULL){
getStringFromIndexWithDelim( buf, "<", 2, buff2, sizeof(buff2));
kosuu = atoi( buff2);
getStringFromIndexWithDelim( buf, "<", 1, buff2, sizeof(buff2));
if(NPCEnemy_FreeIfCheck( meindex, talker, buff2, kosuu, 1, temp)==TRUE){
return TRUE;
}
}else if(strstr( buf, ">") != NULL){
getStringFromIndexWithDelim( buf, ">", 2, buff2, sizeof(buff2));
kosuu = atoi(buff2);
getStringFromIndexWithDelim( buf, ">" ,1, buff2, sizeof(buff2));
if(NPCEnemy_FreeIfCheck( meindex, talker, buff2, kosuu, 2, temp)==TRUE){
return TRUE;
}
}else if(strstr( buf, "!" ) != NULL){
getStringFromIndexWithDelim( buf, "!=", 2, buff2, sizeof(buff2));
kosuu = atoi( buff2);
getStringFromIndexWithDelim( buf, "!=", 1, buff2, sizeof(buff2));
if(NPCEnemy_FreeIfCheck( meindex, talker, buff2, kosuu, 0, temp) == TRUE){
return FALSE;
}else{
return TRUE;
}
}else if(strstr( buf, "=") != NULL){
getStringFromIndexWithDelim( buf, "=", 2, buff2, sizeof(buff2));
kosuu = atoi( buff2);
getStringFromIndexWithDelim( buf, "=", 1, buff2, sizeof(buff2));
if( strstr( buf, "PET")) {
flg = 3;
}
if(strstr( buf, "*") != NULL){
if( NPCEnemy_WarpManReduce( meindex, talker, buf)==TRUE){
return TRUE;
}
}else if(NPCEnemy_FreeIfCheck( meindex, talker, buff2, kosuu, flg, temp)==TRUE){
return TRUE;
}
}
return FALSE;
}
BOOL NPCEnemy_FreeIfCheck(int meindex,int talker,char* buf,int kosuu,int flg, int temp)
{
if(strcmp(buf,"LV")==0){
if(NPCEnemy_LevelCheck(meindex,talker,kosuu,flg)==TRUE){
return TRUE;
}
}
if( strcmp(buf,"TRANS") == 0 ) {
if( NPCEnemy_CheckTrans( meindex, talker, kosuu, flg) == TRUE )
return TRUE;
}
if( strcmp( buf, "PET") == 0 ) {
if( temp > 0 ) {
if( NPCEnemy_CheckMyPet( meindex, talker, kosuu, flg, temp) == TRUE )
return TRUE;
}else
return FALSE;
}
if(strcmp(buf,"ITEM")==0){
if(NPCEnemy_ItemCheck(meindex,talker,kosuu,flg)==TRUE){
return TRUE;
}
}
if(strcmp(buf,"ENDEV")==0){
if(NPC_EventCheckFlg( talker, kosuu)==TRUE){
return TRUE;
}
}
if(strcmp(buf,"NOWEV")==0){
if(NPC_NowEventCheckFlg( talker, kosuu)==TRUE){
return TRUE;
}
}
return FALSE;
}
BOOL NPCEnemy_WarpManReduce(int meindex,int talker,char *buf)
{
char buf2[512];
char buf3[256];
int id=0;
int i;
int itemindex;
int itemno;
int kosuu;
int cnt=0;
getStringFromIndexWithDelim(buf,"=",2,buf2,sizeof(buf2));
getStringFromIndexWithDelim(buf2,"*",1,buf3,sizeof(buf3));
itemno = atoi(buf3);
getStringFromIndexWithDelim(buf2,"*",2,buf3,sizeof(buf3));
kosuu = atoi(buf3);
for( i=0 ; i < CHAR_MAXITEMHAVE;i++ ){
itemindex=CHAR_getItemIndex( talker , i );
if( ITEM_CHECKINDEX(itemindex) ){
id=ITEM_getInt(itemindex ,ITEM_ID );
if(itemno==id){
cnt++;
if(cnt==kosuu){
return TRUE;
}
}
}
}
return FALSE;
}
BOOL NPCEnemy_BigSmallLastCheck(int point1,int mypoint,int flg)
{
if(flg==0){
if(point1==mypoint) {
return TRUE;
}
}else if(flg==1){
if(mypoint < point1) {
return TRUE;
}
}else if(flg==2){
if(mypoint > point1) {
return TRUE;
}
}
return FALSE;
}
BOOL NPCEnemy_LevelCheck(int meindex,int talker,int level,int flg)
{
int mylevel;
mylevel=CHAR_getInt(talker,CHAR_LV);
if(NPCEnemy_BigSmallLastCheck(level,mylevel,flg)==TRUE) {
return TRUE;
}
return FALSE;
}
BOOL NPCEnemy_CheckTrans(int meindex,int talker,int trans,int flg)
{
int myTrans;
myTrans=CHAR_getInt(talker, CHAR_TRANSMIGRATION);
if( NPCEnemy_BigSmallLastCheck( trans, myTrans, flg ) == TRUE ) {
return TRUE;
}
return FALSE;
}
BOOL NPCEnemy_CheckMyPet( int meindex, int talker, int petLv, int flg, int petid)
{
int petsel,petindex=-1;
for(petsel=0 ; petsel < CHAR_MAXPETHAVE ; petsel++) {
petindex = CHAR_getCharPet( talker, petsel);
if( petindex == -1 )
continue;
if(CHAR_getInt( petindex, CHAR_PETID) != petid )
continue;
break;
}
if( petsel == CHAR_MAXPETHAVE ) {
return FALSE;
}else { //<2F>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
switch( flg) {
case 0:
if( CHAR_getInt( petindex, CHAR_LV) != petLv )
return TRUE;
break;
case 1:
if( CHAR_getInt( petindex, CHAR_LV) < petLv )
return TRUE;
break;
case 2:
if( CHAR_getInt( petindex, CHAR_LV) > petLv )
return TRUE;
break;
case 3:
if( CHAR_getInt( petindex, CHAR_LV) == petLv )
return TRUE;
break;
}
return FALSE;
}
return FALSE;
}
BOOL NPCEnemy_ItemCheck(int meindex,int talker,int itemNo,int flg)
{
int i;
int itemindex=-1;
int id;
for( i=0;i<CHAR_MAXITEMHAVE;i++ ){
itemindex = CHAR_getItemIndex( talker , i );
if( ITEM_CHECKINDEX( itemindex) ) {
id=ITEM_getInt(itemindex ,ITEM_ID );
if( NPCEnemy_BigSmallLastCheck(itemNo,id,flg) == TRUE )
return TRUE;
}
}
return FALSE;
}
BOOL NPC_WarpAllMsg(int meindex,int toindex )
{
int fl,x,y;
int subindex=-1;
int i;
fl = CHAR_getWorkInt( meindex, CHAR_WORK_WARP_FLOOR );
x = CHAR_getWorkInt( meindex, CHAR_WORK_WARP_X );
y = CHAR_getWorkInt( meindex, CHAR_WORK_WARP_Y );
if( CHAR_getWorkInt( toindex, CHAR_WORKPARTYMODE ) != 1 )
return FALSE;
for( i = 0; i < CHAR_PARTYMAX; i ++ ){
subindex = CHAR_getWorkInt( toindex, CHAR_WORKPARTYINDEX1+i );
if( CHAR_CHECKINDEX( subindex ) == FALSE )continue;
if( fl==0 && x==0 && y==0 ) {
}else {
CHAR_warpToSpecificPoint( subindex, fl, x, y );
}
}
return TRUE;
}
#endif
void NPC_NPCEnemyWatch( int meobjindex, int objindex, CHAR_ACTION act,
int x,int y,int dir, int* opt,int optlen )
{
int born, dead;
int meindex, index;
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
if( OBJECT_getType( objindex) != OBJTYPE_CHARA) return;
index = OBJECT_getIndex( objindex);
if( !CHAR_CHECKINDEX( index) ) return;
if( CHAR_getInt( index, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER) return;
meindex = OBJECT_getIndex( meobjindex);
if( !CHAR_CHECKINDEX( meindex) ) return;
if( NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg)) == NULL ){
print("WarpMan:GetArgStrErr");
return;
}
if( !strstr( npcarg,"NEWNPCENEMY") )
return;
if( NPC_getTimeData( meindex, npcarg, &born, &dead, 200) == FALSE )
return;
NPC_TimeDefineDo( meindex, born, dead, NPC_TIME_MODE);
CHAR_sendCToArroundCharacter( CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX ) );
}
#ifdef _NPC_REPLACEMENT
void Check_EnemyWarpMe( int meindex, char *args )
{
char buf1[256];
int objindex,index;
int nfl, nx, ny;
OBJECT obj;
memset( buf1, 0, sizeof( buf1));
if( NPC_Util_GetStrFromStrWithDelim( args, "REPLACEMENT", buf1, sizeof( buf1)) == NULL ) {
return;
}
GetRand_WarpPoint( buf1, &nfl, &nx, &ny );
if( MAP_IsValidCoordinate( nfl, nx, ny ) == FALSE ){
char filename[256];
NPC_Util_CheckAssignArgFile( meindex, filename);
print( "NPCENEMY REPLACEMENT: %s .Invalid POINT( %d, %d, %d)\n", filename, nfl, nx, ny );
return;
}
{
int ofl, ox, oy;
ofl = CHAR_getInt( meindex, CHAR_FLOOR );
ox = CHAR_getInt( meindex, CHAR_X );
oy = CHAR_getInt( meindex, CHAR_Y );
for ( obj=MAP_getTopObj( nfl, nx, ny); obj; obj=NEXT_OBJECT( obj) ) {
objindex = GET_OBJINDEX( obj);
if (OBJECT_getType( objindex) != OBJTYPE_CHARA) continue;
index = OBJECT_getIndex( objindex);
if( CHAR_getInt( index, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER &&
CHAR_getWorkInt( index, CHAR_WORKEVENTTYPE) != CHAR_TYPEPET ) {
CHAR_warpToSpecificPoint( index, ofl, ox, oy);
CHAR_sendCToArroundCharacter( objindex);
break;
}
}
}
objindex = CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX);
CHAR_warpToSpecificPoint( meindex, nfl, nx, ny);
CHAR_sendCToArroundCharacter( objindex);
}
#endif