239 lines
7.1 KiB
C
239 lines
7.1 KiB
C
![]() |
#include "version.h"
|
|||
|
#include <string.h>
|
|||
|
#include <math.h>
|
|||
|
#include "char.h"
|
|||
|
#include "object.h"
|
|||
|
#include "char_base.h"
|
|||
|
#include "npcutil.h"
|
|||
|
#include "lssproto_serv.h"
|
|||
|
#include "enemy.h"
|
|||
|
#include "log.h"
|
|||
|
#include "battle.h"
|
|||
|
#include "readmap.h"
|
|||
|
#include "handletime.h"
|
|||
|
#include "npc_eventaction.h"
|
|||
|
|
|||
|
#ifdef _MARKET_TRADE
|
|||
|
#include "npc_mtradenpcman.h"
|
|||
|
#include "item_trade.h"
|
|||
|
|
|||
|
#define MAPTRADE_CHECK 3000
|
|||
|
#define MAPTRADE_CHECKMASTER 100
|
|||
|
#define MAPTRADE_CHECKSELL 200
|
|||
|
|
|||
|
enum {
|
|||
|
MAPTRADE_START = 1,
|
|||
|
MAPTRADE_MAN,
|
|||
|
MAPTRADE_END,
|
|||
|
};
|
|||
|
enum {
|
|||
|
NPC_WORK_INDEX = CHAR_NPCWORKINT1,
|
|||
|
NPC_WORK_WORKTYPE = CHAR_NPCWORKINT2,
|
|||
|
NPC_WORK_CURRENTTIME = CHAR_NPCWORKINT3,
|
|||
|
NPC_WORK_SELLINDEX = CHAR_NPCWORKINT4,
|
|||
|
/*
|
|||
|
NPC_WORK_ROUTETOY = CHAR_NPCWORKINT2,
|
|||
|
NPC_WORK_ROUTEPOINT = CHAR_NPCWORKINT3,
|
|||
|
NPC_WORK_ROUNDTRIP = CHAR_NPCWORKINT4,
|
|||
|
NPC_WORK_MODE = CHAR_NPCWORKINT5,
|
|||
|
NPC_WORK_CURRENTROUTE = CHAR_NPCWORKINT6,
|
|||
|
NPC_WORK_ROUTEMAX = CHAR_NPCWORKINT7,
|
|||
|
NPC_WORK_WAITTIME = CHAR_NPCWORKINT8,
|
|||
|
NPC_WORK_CURRENTTIME = CHAR_NPCWORKINT9,
|
|||
|
NPC_WORK_SEFLG = CHAR_NPCWORKINT10,
|
|||
|
*/
|
|||
|
};
|
|||
|
|
|||
|
static void NPC_MapTrade_selectWindow( int meindex, int toindex, int num,int select);
|
|||
|
|
|||
|
BOOL MapTradeManInit( int meindex )
|
|||
|
{
|
|||
|
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
|
|||
|
|
|||
|
if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg)) == NULL) {
|
|||
|
print("MapTradeManInit: GetArgStrErr");
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_MAPTRADEMAN );
|
|||
|
CHAR_setInt( meindex, CHAR_LOOPINTERVAL, MAPTRADE_CHECK);
|
|||
|
|
|||
|
CHAR_setWorkInt( meindex, NPC_WORK_SELLINDEX, 0 );
|
|||
|
CHAR_setWorkInt( meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec);
|
|||
|
CHAR_setWorkInt( meindex, NPC_WORK_INDEX, TRADE_getMaxNumInt());
|
|||
|
InitMapTradeData( -1, 0); //<2F><>ʼ̯λ<CCAF><CEBB><EFBFBD><EFBFBD>
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
void MapTradeManLoop( int meindex)
|
|||
|
{
|
|||
|
int masterindex=-1, i;
|
|||
|
int maxNum = TRADE_getMaxNumInt();
|
|||
|
int nums=0;
|
|||
|
|
|||
|
if( CHAR_getWorkInt( meindex, NPC_WORK_CURRENTTIME) > NowTime.tv_sec)
|
|||
|
return;
|
|||
|
else
|
|||
|
CHAR_setWorkInt( meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec+MAPTRADE_CHECKMASTER);
|
|||
|
|
|||
|
for( i=0; i<maxNum; i++) {
|
|||
|
masterindex = TRADE_getMasterInt( i);
|
|||
|
if( masterindex == -1 ) continue;
|
|||
|
if( !CHAR_CHECKINDEX( masterindex) ||
|
|||
|
CHAR_getInt( masterindex, CHAR_FLOOR) != TRADEMAP ||
|
|||
|
CHAR_getWorkInt( masterindex, CHAR_MAPTRADETYPE) != (i+TRADESTARTNUM) ) {
|
|||
|
TRADE_setMasterInt( i, -1);
|
|||
|
TRADE_setTimeInt( i, 0);
|
|||
|
MAPTRADE_setSellIndex( i, -1);
|
|||
|
MAPTRADE_setCharSellName( i, "NULL");
|
|||
|
MAPTRADE_CLEANGOLD( TRADEMAP, i);
|
|||
|
}else {
|
|||
|
//showString( int meindex, char *showstr, 0);
|
|||
|
nums++;
|
|||
|
}
|
|||
|
}//MAPTRADE_getSellIndex
|
|||
|
{
|
|||
|
char buf1[256], *buf2;
|
|||
|
i = CHAR_getWorkInt( meindex, NPC_WORK_SELLINDEX);
|
|||
|
CHAR_setWorkInt( meindex, NPC_WORK_SELLINDEX, (i+1)%maxNum);
|
|||
|
masterindex = TRADE_getMasterInt( i);
|
|||
|
if( !CHAR_CHECKINDEX( masterindex))
|
|||
|
return;
|
|||
|
buf2 = MAPTRADE_getCharSellName( i);
|
|||
|
if( buf2 == NULL || !strcmp( buf2, "NULL"))
|
|||
|
return;
|
|||
|
sprintf( buf1, "%d<>ŷ<EFBFBD><C5B7><EFBFBD>%s", i+TRADESTARTNUM, buf2);
|
|||
|
showString( meindex, buf1, 0);
|
|||
|
}
|
|||
|
/*
|
|||
|
i = CHAR_getWorkInt( meindex, NPC_WORK_SELLINDEX);
|
|||
|
masterindex = TRADE_getMasterInt( i);
|
|||
|
if( !CHAR_CHECKINDEX( masterindex))
|
|||
|
return;
|
|||
|
{
|
|||
|
char *Goodname;
|
|||
|
int sellindex=-1, objindex;
|
|||
|
sellindex = MAPTRADE_getSellIndex( i);
|
|||
|
objindex = CHAR_getWorkInt( sellindex, CHAR_WORKOBJINDEX);
|
|||
|
if (OBJECT_getType( objindex) == OBJTYPE_CHARA) {
|
|||
|
if( CHAR_getInt( sellindex, CHAR_WHICHTYPE) == CHAR_TYPEPET ) {
|
|||
|
CHAR_getChar(
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
*/
|
|||
|
}
|
|||
|
|
|||
|
void MapTradeManTalked( int meindex , int talkerindex , char *msg , int color )
|
|||
|
{
|
|||
|
if( CHAR_getInt( talkerindex , CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER )
|
|||
|
return;
|
|||
|
if(NPC_Util_isFaceToFace( meindex ,talkerindex , 2) == FALSE) {
|
|||
|
if(NPC_Util_isFaceToChara( talkerindex, meindex, 1) == FALSE) return;
|
|||
|
}
|
|||
|
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, MAPTRADE_START);
|
|||
|
NPC_MapTrade_selectWindow( meindex, talkerindex, MAPTRADE_START, -1);
|
|||
|
}
|
|||
|
|
|||
|
void NPC_MapTrade_selectWindow( int meindex, int toindex, int num,int select)
|
|||
|
{
|
|||
|
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
|
|||
|
char token[256];
|
|||
|
char message[][256]={ "STARTMSG", "YESMSG", "NOMSG", "ENDMSG", "NOTHING"};
|
|||
|
int Msg_Type=4;
|
|||
|
int fd = getfdFromCharaIndex( toindex );
|
|||
|
int buttontype = 0, windowtype = 0, windowno = 0;
|
|||
|
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
|
|||
|
|
|||
|
if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg)) == NULL) {
|
|||
|
print("MapTradeManInit: GetArgStrErr");
|
|||
|
return;
|
|||
|
}
|
|||
|
memset( token, 0, sizeof( token));
|
|||
|
switch( num) {
|
|||
|
case MAPTRADE_START: //1
|
|||
|
Msg_Type = 0;
|
|||
|
CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, MAPTRADE_MAN);
|
|||
|
buttontype = WINDOW_BUTTONTYPE_YESNO;
|
|||
|
windowno = MAPTRADE_MAN;
|
|||
|
break;
|
|||
|
case MAPTRADE_MAN:
|
|||
|
Msg_Type = 3;
|
|||
|
if( select == WINDOW_BUTTONTYPE_YES ) {
|
|||
|
int num;
|
|||
|
Msg_Type = 2;
|
|||
|
if( CHAR_getWorkInt( toindex, CHAR_MAPTRADETYPE) > 0 ) {
|
|||
|
sprintf(token , "<EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%d<><64>̯λ<CCAF><CEBB>ѽ<EFBFBD><D1BD>",
|
|||
|
CHAR_getWorkInt( toindex, CHAR_MAPTRADETYPE));
|
|||
|
}else if( (num = TRADE_AddMasrerTrade( toindex)) != -1 ) {
|
|||
|
CHAR_setWorkInt( toindex, CHAR_MAPTRADETYPE, num);
|
|||
|
sprintf(token , "<EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD>%d<><64>̯λ<CCAF><CEBB>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˡ<EFBFBD>\nһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>뿪<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̯λ<EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>黹<EFBFBD>ˡ<EFBFBD>", num);
|
|||
|
//CHAR_talkToCli( i, -1, buff, CHAR_COLORYELLOW);
|
|||
|
Msg_Type = 1;
|
|||
|
}
|
|||
|
}
|
|||
|
CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, MAPTRADE_END);
|
|||
|
buttontype = WINDOW_BUTTONTYPE_YES;
|
|||
|
windowno = MAPTRADE_END;
|
|||
|
break;
|
|||
|
case MAPTRADE_END:
|
|||
|
Msg_Type = 3;
|
|||
|
buttontype = WINDOW_BUTTONTYPE_YES;
|
|||
|
windowno = MAPTRADE_END;
|
|||
|
break;
|
|||
|
}
|
|||
|
if( !strcmp( token, "\0")) {
|
|||
|
if( NPC_Util_GetStrFromStrWithDelim( npcarg, message[Msg_Type], token, sizeof( token)) == NULL )
|
|||
|
return;
|
|||
|
}
|
|||
|
//<2F><>ѶϢ<D1B6><CFA2> CLI
|
|||
|
lssproto_WN_send( fd, windowtype, buttontype, windowno,
|
|||
|
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), token );
|
|||
|
}
|
|||
|
|
|||
|
void MapTradeManWindowTalked( int meindex, int talkerindex, int seqno, int select, char *data)
|
|||
|
{
|
|||
|
|
|||
|
if(NPC_Util_isFaceToFace( meindex ,talkerindex , 2) == FALSE) {
|
|||
|
if(NPC_Util_isFaceToChara( talkerindex, meindex, 1) == FALSE) return;
|
|||
|
}
|
|||
|
|
|||
|
if( select != WINDOW_BUTTONTYPE_YES ) {
|
|||
|
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
switch( seqno) {
|
|||
|
case MAPTRADE_MAN:
|
|||
|
if( CHAR_getWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT) != MAPTRADE_MAN ) {
|
|||
|
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0);
|
|||
|
return;
|
|||
|
}
|
|||
|
if( CHAR_getInt( talkerindex, CHAR_MAPTRADETYPE) > 0 ) {
|
|||
|
char buf1[256];
|
|||
|
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0);
|
|||
|
|
|||
|
sprintf( buf1, "<EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><EFBFBD><EFBFBD>%d<><64>̯λ<CCAF><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѽ<EFBFBD><D1BD>", CHAR_getInt( talkerindex, CHAR_MAPTRADETYPE));
|
|||
|
CHAR_talkToCli( talkerindex, -1, buf1, CHAR_COLORYELLOW);
|
|||
|
return;
|
|||
|
}
|
|||
|
NPC_MapTrade_selectWindow( meindex, talkerindex, MAPTRADE_MAN, select);
|
|||
|
break;
|
|||
|
case MAPTRADE_END:
|
|||
|
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0);
|
|||
|
return;
|
|||
|
break;
|
|||
|
}
|
|||
|
return;
|
|||
|
}
|
|||
|
/*
|
|||
|
while( getStringFromIndexWithDelim(buf1, ",", k, buf2, sizeof(buf2)) != FALSE ) {
|
|||
|
Re_Pet[k-1] = atoi( buf2);
|
|||
|
if( Re_Pet[k-1] < 0 )
|
|||
|
return FALSE;
|
|||
|
k++;
|
|||
|
if( (k-1) >= arraysizeof( Re_Pet) )
|
|||
|
break;
|
|||
|
}
|
|||
|
*/
|
|||
|
#endif
|