📄 npc_sellsthman.c
字号:
#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_sellsthman.h"
#include "pet_skill.h"
#ifdef _NPC_SELLSTH
enum {
NPC_WORK_CURRENTTIME = CHAR_NPCWORKINT1,
NPC_WORK_PAGE = CHAR_NPCWORKINT2,
NPC_WORK_NUM = CHAR_NPCWORKINT3,
NPC_WORK_CALLPAGE = CHAR_NPCWORKINT4,
NPC_WORK_CALLNUM = CHAR_NPCWORKINT5,
/*
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,
*/
};
#define SELLSTHMESS_LOOP 2000
enum{
WINDOW_TALK=0,
WINDOW_START=10,
WINDOW_MENU,
WINDOW_LOOK,
WINDOW_CALL,
WINDOW_FIND,
WINDOW_SELLON,
WINDOW_SELLHANDLE,
WINDOW_BUYMESS,
WINDOW_BUYHANDLE,
WINDOW_HELP,
WINDOW_END,
NPC_WINDOW_TALK=300,
NPC_WINDOW_START,
NPC_WINDOW_MENU,
NPC_WINDOW_LOOK,
NPC_WINDOW_FIND,
NPC_WINDOW_NEXT,
NPC_WINDOW_SELLON,
NPC_WINDOW_SELLHANDLE,
NPC_WINDOW_BUYMESS,
NPC_WINDOW_BUYHANDLE,
NPC_WINDOW_HELP,
NPC_WINDOW_END,
};
#define MAX_LISTPAGE 20
#define MAX_LISTNUM 12
struct _tagNSellSthList{
int use;
int fd;
int sellindex;
int selltype;
int uindex;
int Iindex;
char headmess[256];
char sellmess[256];
}NSellSthList[MAX_LISTPAGE][MAX_LISTNUM];
static int StructBeInit=0;
static void NPC_SellsthMan_selectWindow( int meindex, int toindex, int num,int select, char *data);
BOOL NPC_getSellSth_ListString( int page, int num, char *ListString, int slen );
BOOL NPC_setSellSth_ListString( int meindex, int toindex, int *page, int *num, char *data );
BOOL NPC_getSellSth_ViewString( int page, int num, char *ListString, int slen );
int NPC_getSellSth_FreeTiCount( void);
void NPC_SellrePutList( int defpage, int ti)
{
int i;
if( NSellSthList[defpage][ti].use != 0 ) return;
for( i=(ti+1); i<MAX_LISTNUM-1; i++){
if( NSellSthList[defpage][i].use != 0 ) continue;
NSellSthList[defpage][i].sellindex = NSellSthList[defpage][i+1].sellindex;
NSellSthList[defpage][i].fd = NSellSthList[defpage][i+1].fd;
NSellSthList[defpage][i].Iindex = NSellSthList[defpage][i+1].Iindex;
NSellSthList[defpage][i].uindex = NSellSthList[defpage][i+1].uindex;
NSellSthList[defpage][i].selltype = NSellSthList[defpage][i+1].selltype;
sprintf( NSellSthList[defpage][i].headmess, "%s", NSellSthList[defpage][i+1].headmess);
sprintf( NSellSthList[defpage][i].sellmess, "%s", NSellSthList[defpage][i+1].sellmess);
NSellSthList[defpage][i].use = 1;
NSellSthList[defpage][i+1].use = 0;
}
}
BOOL NPC_SellsthManInit( int meindex )
{
char npcarg[ NPC_UTIL_GETARGSTR_BUFSIZE];
if( NPC_Util_GetArgStr( meindex, npcarg, sizeof( npcarg) )==NULL){
print("SellsthMan: GetArgStrErr!!");
return FALSE;
}
CHAR_setInt( meindex, CHAR_WHICHTYPE, CHAR_SELLSTHMAN);
CHAR_setInt( meindex, CHAR_LOOPINTERVAL, SELLSTHMESS_LOOP);
CHAR_setWorkInt( meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec);
if( StructBeInit == 0 ){
int i, j;
for( i=0; i<MAX_LISTPAGE; i++){
for( j=0; j<MAX_LISTNUM; j++ )
NSellSthList[i][j].use = 0;
}
}
CHAR_setWorkInt( meindex, NPC_WORK_CALLPAGE, 0);
CHAR_setWorkInt( meindex, NPC_WORK_CALLNUM, 0);
CHAR_setWorkInt( meindex, NPC_WORK_PAGE, 0);
CHAR_setWorkInt( meindex, NPC_WORK_NUM, 0);
return TRUE;
}
void NPC_SellsthManTalked( 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;
}
/*
if( CHAR_getWorkInt ( talkerindex , CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE){
CHAR_talkToCli( talkerindex, meindex, "!",CHAR_COLORYELLOW);
return;
}
*/
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0);
NPC_SellsthMan_selectWindow( meindex, talkerindex, WINDOW_START, 0, NULL);
}
void NPC_SellsthMan_selectWindow( int meindex, int toindex, int num,int select, char *data)
{
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
char token[4096];
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;
}
print( "ANDY SellsthMan_selectWindow( %d, %d, %d, %d)\n", meindex, toindex, num, select);
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 WINDOW_START:
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "START_MSG", token, sizeof( token) ) == NULL) {
print("SellSthMan err Can't Get START_MSG string\n");
return;
}
buttontype = WINDOW_BUTTONTYPE_OKCANCEL;
windowno = NPC_WINDOW_START;
break;
case WINDOW_MENU:
{
int k=1;
char buf[512], buf1[256];
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "MENU_SELECT", buf, sizeof( buf) ) == NULL) {
print("SellSthMan err Can't Get MENU_SELECT string\n");
return;
}
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "MENU_HEAD", buf1, sizeof( buf1) ) == NULL) {
print("SellSthMan err Can't Get MENU_HEAD string\n");
return;
}
sprintf( token, "%s:\n", buf1);
while( getStringFromIndexWithDelim( buf, ",", k, buf1, sizeof( buf1)) != FALSE ){
k++;
strcat( token, buf1);
strcat( token, "\n");
}
windowtype = WINDOW_MESSAGETYPE_SELECT;
buttontype = WINDOW_BUTTONTYPE_CANCEL;
windowno = NPC_WINDOW_MENU;
}
break;
case WINDOW_LOOK://看详细道具或宠物内容
{
int num;
int page = CHAR_getWorkInt( toindex, CHAR_WORKSHOPRELEVANT);
num = atoi( data);
if( num <0 || num >= MAX_LISTNUM ) return;
if( NPC_getSellSth_ViewString( page, num, token, sizeof( token)) == FALSE ){
return;
}
windowtype = WINDOWS_MESSAGETYPE_SELLSTHVIEW;
windowno = NPC_WINDOW_NEXT;
}
break;
case WINDOW_CALL:
{
int num;
int page = CHAR_getWorkInt( toindex, CHAR_WORKSHOPRELEVANT);
num = atoi( data);
if( num <0 || num >= MAX_LISTNUM ) return;
if( NSellSthList[page][num].use == 0 )return;
if( !CHAR_CHECKINDEX( NSellSthList[page][num].sellindex) ||
NSellSthList[page][num].fd != getfdFromCharaIndex( NSellSthList[page][num].sellindex) )
return;
sprintf( token, "%s欲购买你拍卖(%d页,%d项)的物品,\n%s正在%s。", CHAR_getChar( toindex, CHAR_NAME),
page, num, CHAR_getChar( toindex, CHAR_NAME), MAP_getFloorName( CHAR_getInt( toindex, CHAR_FLOOR)) );
if( CHAR_getWorkInt( NSellSthList[page][num].sellindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE ){
CHAR_talkToCli( NSellSthList[page][num].sellindex, meindex, token, CHAR_COLORYELLOW);
}else{
int callfd = getfdFromCharaIndex( NSellSthList[page][num].sellindex);
buttontype = WINDOW_BUTTONTYPE_OK;
windowno = NPC_WINDOW_END;
lssproto_WN_send( callfd, windowtype, buttontype, windowno,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), token);
}
return;
}
break;
case WINDOW_FIND:
{
int page, num;
page = select >> 16;
num = select & 0x0000ffff;
page = (page<0||page>=MAX_LISTPAGE)?0:page;
num = (num<0||num>=MAX_LISTNUM)?0:num;
if( NPC_getSellSth_ListString( page, num, token, sizeof( token) ) == FALSE ) return;
windowtype = WINDOWS_MESSAGETYPE_SELLSTHMENU;
windowno = NPC_WINDOW_NEXT;
}
break;
case WINDOW_SELLON:
if( CHAR_getWorkInt( toindex, CHAR_WORKSELLSTHNUM) >= 3 ){
CHAR_talkToCli( toindex, meindex, "最多只能登记叁次。", CHAR_COLORRED);
return;
}else if( CHAR_getInt( toindex, CHAR_GOLD) < 100 ){
CHAR_talkToCli( toindex, meindex, "需付100石币才能登记。", CHAR_COLORRED);
return;
}
if( NPC_getSellSth_FreeTiCount() < 1 ){
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "FULL_MSG", token, sizeof( token) ) == NULL) {
print("SellSthMan err Can't Get FULL_MSG string\n");
return;
}
buttontype = WINDOW_BUTTONTYPE_OK;
windowno = NPC_WINDOW_END;
}else{
windowtype = WINDOWS_MESSAGETYPE_SELLSTHSELL;
windowno = NPC_WINDOW_SELLON;
}
break;
case WINDOW_SELLHANDLE:
{
int page, num;
if( NPC_setSellSth_ListString( meindex, toindex, &page, &num, data ) == FALSE ) {
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "ERROR_MSG", token, sizeof( token) ) == NULL) {
print("SellSthMan err Can't Get ERROR_MSG string\n");
return;
}
}else if( NPC_Util_GetStrFromStrWithDelim( npcarg, "OK_MSG", token, sizeof( token) ) == NULL) {
print("SellSthMan err Can't Get OK_MSG string\n");
return;
}
{
int sellnum = CHAR_getWorkInt( toindex, CHAR_WORKSELLSTHNUM);
CHAR_setWorkInt( toindex, CHAR_WORKSELLSTHNUM, sellnum+1);
CHAR_DelGold( toindex, 100);
}
buttontype = WINDOW_BUTTONTYPE_OK;
windowno = NPC_WINDOW_END;
}
break;
case WINDOW_BUYMESS:
break;
case WINDOW_BUYHANDLE:
break;
case WINDOW_HELP:
break;
case WINDOW_END:
break;
}
lssproto_WN_send( fd, windowtype, buttontype, windowno,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), token);
}
void NPC_SellsthManWindowTalked( 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_CANCEL || select == WINDOW_BUTTONTYPE_NO)
return;
switch( seqno) {
case NPC_WINDOW_START:
NPC_SellsthMan_selectWindow( meindex, talkerindex, WINDOW_MENU, select, NULL);
break;
case NPC_WINDOW_MENU:
switch( atoi( data)) {
case 1://查看
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0);
NPC_SellsthMan_selectWindow( meindex, talkerindex, WINDOW_FIND, 0, NULL);
break;
case 2://登记
NPC_SellsthMan_selectWindow( meindex, talkerindex, WINDOW_SELLON, select, NULL);
break;
}
break;
case NPC_WINDOW_LOOK:
break;
case NPC_WINDOW_FIND://包含买
break;
case NPC_WINDOW_NEXT:
{
int ti;
int page = CHAR_getWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT);
if( select == WINDOW_BUTTONTYPE_PREV ){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -