chuyiwen_gmsv/npc/npc_itemup.c
chuyiwen bea5ac05b3 sq_gmsv_chuyiwen
sa_sever
2016-12-24 09:45:52 +09:00

281 lines
8.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "version.h"
#include <string.h>
#include "char.h"
#include "object.h"
#include "char_base.h"
#include "npcutil.h"
#include "lssproto_serv.h"
#include "saacproto_cli.h"
#include "readmap.h"
#include "battle.h"
#include "log.h"
#include "enemy.h"
#include "handletime.h"
#include "npc_eventaction.h"
#include "npc_itemup.h"
#ifdef _NPC_ITEMUP
enum {
ITEMUP_START=1,
ITEMUP_SELECT1,
ITEMUP_SELECT2,
ITEMUP_MESSAGE,
ITEMUP_END,
ITEMUP_ERROR,
};
enum {
NPC_WORK_CURRENTTIME = CHAR_NPCWORKINT1,
/*
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_ItemupMan_selectWindow( int meindex, int toindex, int num,int select);
BOOL ItemupMan_GetNeedStr( int meindex, int toindex, char *npcarg, char *token, int num );
BOOL ItemupMan_GetMenuStr( int meindex, int toindex, char *npcarg, char *token);
BOOL ItemupMan_GetItemStr( int meindex, int toindex, char *npcarg, char *token,int num);
BOOL NPC_ItemupManInit( int meindex )
{
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){
print("TRANSER_MAN: GetArgStrErr!!");
return FALSE;
}
CHAR_setInt( meindex, CHAR_WHICHTYPE, CHAR_ITEMCHANGENPC);
//CHAR_setInt( meindex, CHAR_LOOPINTERVAL, NEWNPCMAN_STANDBY);
CHAR_setWorkInt( meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec);
return TRUE;
}
//CHAR_setWorkInt(talkerindex,CHAR_WORKSHOPRELEVANT,1);
void NPC_ItemupManTalked( 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, 0);
NPC_ItemupMan_selectWindow( meindex, talkerindex, ITEMUP_START, -1);
}
void NPC_ItemupManWindowTalked( int meindex, int talkerindex, int seqno, int select, char *data)
{
int flg=-1;
if( select == WINDOW_BUTTONTYPE_NO || select == WINDOW_BUTTONTYPE_CANCEL)
return;
switch( seqno) {
case NPC_ITEMUP_START:
break;
case NPC_ITEMUP_SELECT1:
NPC_ItemupMan_selectWindow( meindex, talkerindex, ITEMUP_SELECT1, flg);
break;
case NPC_ITEMUP_SELECT2:
flg = atoi( data);
NPC_ItemupMan_selectWindow( meindex, talkerindex, ITEMUP_SELECT2, flg);
break;
case NPC_ITEMUP_MESSAGE:
flg = atoi( data);
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, flg);
NPC_ItemupMan_selectWindow( meindex, talkerindex, ITEMUP_MESSAGE, flg);
break;
case NPC_ITEMUP_END:
flg = CHAR_getWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT);
NPC_ItemupMan_selectWindow( meindex, talkerindex, ITEMUP_END , flg);
break;
}
}
static void NPC_ItemupMan_selectWindow( int meindex, int toindex, int num,int select)
{
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
char token[256];
char npcbuf[2048];
int buttontype = 0, windowtype = 0, windowno = 0;
int fd = getfdFromCharaIndex( toindex);
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
if(NPC_Util_isFaceToFace( meindex ,toindex , 2) == FALSE) {
if(NPC_Util_isFaceToChara( toindex, meindex, 1) == FALSE)
return;
}
memset( npcarg, 0, sizeof( npcarg));
if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){
print("TRANSER_MAN: GetArgStrErr!!");
return;
}
memset( token, 0, sizeof( token));
switch( num) {
case ITEMUP_START:
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "START_MSG", token, sizeof( token) ) == NULL) {
print("TranserMan Get START_MSG ERROR !");
return;
}
CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, ITEMUP_START);
buttontype = WINDOW_BUTTONTYPE_YESNO;
windowno = NPC_ITEMUP_SELECT1;
break;
case ITEMUP_SELECT1:
if( ItemupMan_GetMenuStr( meindex, toindex, npcarg, token) == FALSE )
return;
CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, ITEMUP_SELECT1);
windowtype = WINDOW_MESSAGETYPE_SELECT;
buttontype = WINDOW_BUTTONTYPE_CANCEL;
windowno = NPC_ITEMUP_SELECT2;
break;
case ITEMUP_SELECT2:
if( ItemupMan_GetItemStr( meindex, toindex, npcarg, token, select) == FALSE )
return;
CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, ITEMUP_SELECT2);
windowtype = WINDOW_MESSAGETYPE_SELECT;
buttontype = WINDOW_BUTTONTYPE_CANCEL;
windowno = NPC_ITEMUP_MESSAGE;
break;
case ITEMUP_MESSAGE:
if( ItemupMan_GetNeedStr( meindex, toindex, npcarg, token, select ) == FALSE )
return;
buttontype = WINDOW_BUTTONTYPE_YESNO;
windowno = NPC_ITEMUP_END;
break;
case ITEMUP_END:
if(getStringFromIndexWithDelim( npcarg,"]", CHAR_getWorkInt(toindex,CHAR_WORKLISTPAGE), npcbuf, sizeof( npcbuf)) == FALSE){
return;
}
if( ActionNpc_CheckMenuFree( meindex, toindex, npcbuf, select ) == FALSE ){
memset( token, 0, sizeof( token));
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "FAIL_MSG", token, sizeof( token) ) != NULL) {
CHAR_talkToCli( toindex, meindex, token, CHAR_COLORYELLOW);
}
}
return;
break;
case ITEMUP_ERROR:
break;
}
lssproto_WN_send( fd, windowtype, buttontype, windowno,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), token);
}
void NPC_ItemupManLoop( int meindex)
{
}
BOOL ItemupMan_GetItemStr( int meindex, int toindex, char *npcarg, char *token, int num)
{
char buf1[1024], buf2[256], buf3[256],buf0[2048];
char NullName[256] = {"δ֪<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒ"};
BOOL FINDS=FALSE;
int talkNo=1;
int addID;
if( npcarg == NULL ) return FALSE;
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "ItemHead", buf1, sizeof( buf1) ) == NULL){
print("ItemchangeMan Get NeedHead ERROR!\n%s", npcarg);
return FALSE;
}
sprintf( token, "%s\n", buf1);
if(getStringFromIndexWithDelim( npcarg,"]", num, buf0, sizeof( buf0)) == FALSE){
return FALSE;
}
CHAR_setWorkInt( toindex, CHAR_WORKLISTPAGE, num);
while( getStringFromIndexWithDelim( buf0,"}", talkNo, buf1, sizeof( buf1)) != FALSE ) {
char *ItemName;
talkNo++;
if( NPC_Util_GetStrFromStrWithDelim( buf1, "CHANGEITEM", buf2, sizeof( buf2)) != NULL ){
addID = atoi( buf2);
if( (ItemName = ITEM_getNameFromNumber( addID)) == "\0" ){
sprintf( buf3, " %s\n", NullName);
}else{
sprintf( buf3, " %s\n", ItemName);
}
// continue;
}else {
memset( buf3, 0, sizeof( buf3));
if( NPC_Util_GetStrFromStrWithDelim( buf1, "CHANGEMSG", buf3, sizeof( buf3)) == NULL )
continue;
strcat( buf3, "\n");
}
FINDS = TRUE;
strcat( token, buf3);
}
return FINDS;
}
BOOL ItemupMan_GetNeedStr( int meindex, int toindex, char *npcarg, char *token, int num )
{
char buf1[1024], buf2[256], buf3[256],buf0[2048],buf4[256];
char NullName[256] = {"δ֪<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒ"};
int talkNo=1, addID, i=0,itemnum=1;
BOOL FINDS = FALSE;
if( npcarg == NULL ) return FALSE;
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "NeedHead", buf1, sizeof( buf1) ) == NULL){
print("ItemchangeMan Get NeedHead ERROR!\n%s", npcarg);
return FALSE;
}
sprintf( token, "%s\n", buf1);
if(getStringFromIndexWithDelim( npcarg,"]", CHAR_getWorkInt(toindex,CHAR_WORKLISTPAGE), buf0, sizeof( buf0)) == FALSE){
return FALSE;
}
if( getStringFromIndexWithDelim( buf0,"}", num, buf1, sizeof( buf1)) == FALSE ) {
printf("Get NeedMess error !!\n");
return FALSE;
}
if( NPC_Util_GetStrFromStrWithDelim( buf1, "NeedMsg", buf2, sizeof( buf2) ) != NULL){
strcat( token,buf2);
FINDS = TRUE;
}
return FINDS;
}
BOOL ItemupMan_GetMenuStr( int meindex, int toindex, char *npcarg, char *token)
{
char buf1[1024],buf2[256];;
BOOL FINDS=FALSE;
int talkNo=1;
char *MenuName;
if( npcarg == NULL ) return FALSE;
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "MenuHead", buf1, sizeof( buf1) ) == NULL){
print("ItemchangeMan Get MenuHead ERROR!");
return FALSE;
}
sprintf( token, "%s\n", buf1);
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "MenuName", buf1, sizeof( buf1) ) == NULL){
print("ItemchangeMan Get MenuHead ERROR!");
return FALSE;
}
while( getStringFromIndexWithDelim( buf1,",", talkNo, buf2, sizeof( buf2)) != FALSE ) {
talkNo++;
MenuName = buf2;
FINDS=TRUE;
strcat( token, MenuName);
strcat( token, "\n");
}
return FINDS;
}
#endif