?? npc_simpleshop.c
字號:
#include "version.h"
#include <ctype.h>
#include "object.h"
#include "char_base.h"
#include "char.h"
#include "item.h"
#include "util.h"
#include "handletime.h"
#include "anim_tbl.h"
#include "npc_door.h"
#include "lssproto_serv.h"
#include "npcutil.h"
#include "npccreate.h"
#include "log.h"
/*
* 賞讀卅饕及伙□民件[by nakamura
*
* NPCARGUMENT卞俜 仄兇失奶 丞毛 蜃卞赭 仄化中月云饕[
* SIMPLESHOP_MAXINFINITITEM潘 蜃卞戲岳允月仇午互匹五月[
* 蜃戲岳失奶 丞午 元潘 及失奶 丞毛 勻兇日 勻兇支勾互
* 壑釵井日壅 允月[
* 引兇}皿伊奶乩□井日手及毛 中午月仇午互匹五月互}丐月襖蟾
* (NPC_SIMPLESHOPMAXBUYPRICE)方曰嫖中嗯毛障 歹卅仁化反中仃
* 卅中 潸反匹五卅中[ 中午勻兇失奶 丞反公及樺匹卅仁卅月[
* 引兇}失奶 丞及澀爛匹cost互澀爛今木化中卅中手及手 中午木卅中[
* 2諦動曉及皿伊奶乩□互饕卞五兇午五反} 及菸毛穸燮允月[公丹允月
* 仇午卞方曰饕互捩菁卞簿井毛鍬澎仄化中月仇午毛 什[
*
* 正奶皿 “SimpleShop
* 健丹奶矛件玄: init, talked, specialtalked
*
*
*/
static void NPC_SimpleShopOpenShopWindow( int meindex, int cliindex,
char *npcarg );
static void NPC_SimpleShopGetEscapedItemString( int shopindex,
int cliindex, char *str );
static BOOL NPC_SimpleShopProcessBuyMsg( char *msg, int shop, int cli );
static BOOL NPC_SimpleShopProcessSellMsg( char *msg, int shop, int cli );
static BOOL NPC_LimitBuyInShopProcessSellMsg(char *msg,int shop,int cli);
static BOOL NPC_SimpleShopFillItem( int meindex, char *npcarg );
static int NPC_SimpleShopGetItemNum( int meindex );
static void NPC_SimpleShopNormalWindow( int meindex,
int playerindex, char *str );
static int NPC_ShopWindowIndexToItemTableIndex( int charindex,
int shopwindowindex );
static BOOL NPC_SimpleShopOpenShopOrNot( char *msg, char *openshopstr );
//static void NPC_SimpleShopSetLeakLevel( int meindex );
#define NPC_SIMPLESHOPMAXBUYPRICE 9999
#define SIMPLESHOPTALKBUFSIZE 256
#define SIMPLESHOP_FATALERRSTR "好痛!對不起,最近狀況不太佳。。。"
#define SIMPLESHOP_MAXINFINITITEM 40
enum{
OPENSHOPTOKEN=1,
MSGTOKEN,
MAINTOKEN,
BUYTOKEN,
OKBUYTOKEN,
SELLTOKEN,
OKSELLTOKEN,
POORTOKEN,
ITEMFULLTOKEN,
ANOTHERPLAYERTOKEN,
RAREITEMTOKEN,
THANKYOUTOKEN,
ITEMLISTTOKEN,
BUYINITEMLISTTOKEN,
};
void NPC_SimpleShopTalked( int meindex, int talker, char *msg, int color )
{
#define SHOPRANGE 3
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE], token[NPC_UTIL_GETARGSTR_LINEMAX];
if( CHAR_getInt( talker,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER ){
return;
}
if( NPC_Util_charIsInFrontOfChar( talker, meindex, SHOPRANGE )
&& ! CHAR_getFlg( talker,CHAR_ISDIE ) ){
NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg));
getStringFromIndexWithDelim( npcarg,"|", OPENSHOPTOKEN,token, sizeof(token));
if( NPC_SimpleShopOpenShopOrNot( msg, token )
&& NPC_Util_isFaceToFace( meindex, talker, SHOPRANGE ) ){
CHAR_setWorkInt( meindex, CHAR_WORKSHOPCLIENTINDEX, talker );
NPC_SimpleShopOpenShopWindow( meindex, talker, npcarg );
}else{
int tokennum;
int i;
char tmp[NPC_UTIL_GETARGSTR_LINEMAX];
getStringFromIndexWithDelim( npcarg,"|", MSGTOKEN,token, sizeof(token));
tokennum = 1;
for( i=0;token[i]!='\0';i++ ){
if( token[i] == ',' ) tokennum++;
}
getStringFromIndexWithDelim( token,",", rand()%tokennum+1,tmp, sizeof(tmp));
CHAR_talkToCli( talker, meindex, tmp, CHAR_COLORWHITE );
}
}
}
void NPC_SimpleShopSpecialTalked( int meindex, int talker, char *msg, int color )
{
if( CHAR_getInt(talker,CHAR_WHICHTYPE) == CHAR_TYPEPLAYER
&& NPC_Util_isFaceToFace( meindex, talker, SHOPRANGE ) ){
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE], token[NPC_UTIL_GETARGSTR_LINEMAX];
NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg));
switch( tolower(msg[0]) ){
case 's':
{
int ret;
if( CHAR_getWorkInt(meindex,CHAR_WORKSHOPCLIENTINDEX)!= talker ){
getStringFromIndexWithDelim( npcarg,"|",ANOTHERPLAYERTOKEN,
token, sizeof(token));
NPC_SimpleShopNormalWindow( meindex, talker, token );
return;
}
ret = getStringFromIndexWithDelim( msg, "|", 3, token, sizeof(token));
if( ret == FALSE ){
token[0] = 'e';
token[1] = '\0';
}
switch( tolower(token[0])){
case 'b':
if( (ret=NPC_SimpleShopProcessBuyMsg(msg,meindex,talker))
<0){
switch( ret ){
case -2:
getStringFromIndexWithDelim( npcarg,"|",POORTOKEN,
token,sizeof(token));
NPC_SimpleShopNormalWindow( meindex,talker,token);
break;
case -3:
getStringFromIndexWithDelim( npcarg,"|",
ITEMFULLTOKEN,
token,sizeof(token));
NPC_SimpleShopNormalWindow(meindex,talker,token);
break;
case -1:
default:
NPC_SimpleShopNormalWindow(meindex, talker,
SIMPLESHOP_FATALERRSTR
);
break;
}
}else{
NPC_SimpleShopFillItem( meindex, npcarg );
getStringFromIndexWithDelim(npcarg,"|",THANKYOUTOKEN,
token, sizeof(token));
NPC_SimpleShopNormalWindow(meindex,talker,token);
}
break;
case 's':
if( CHAR_getWorkInt(meindex,CHAR_WORKSHOPCLIENTINDEX) != talker ){
getStringFromIndexWithDelim( npcarg,"|",
ANOTHERPLAYERTOKEN,
token, sizeof(token));
NPC_SimpleShopNormalWindow( meindex, talker, token );
return;
}
if((ret=NPC_SimpleShopProcessSellMsg(msg,meindex,talker)) <0 ){
switch(ret){
case -2:
getStringFromIndexWithDelim( npcarg,"|",
RAREITEMTOKEN,
token, sizeof(token) );
NPC_SimpleShopNormalWindow( meindex,talker,token);
break;
case -1:
default:
NPC_SimpleShopNormalWindow(meindex, talker,
SIMPLESHOP_FATALERRSTR );
break;
}
}else{
getStringFromIndexWithDelim(npcarg,"|",THANKYOUTOKEN,
token, sizeof(token));
NPC_SimpleShopNormalWindow(meindex,talker,token);
}
break;
case 'e':
default:
CHAR_setWorkInt( meindex, CHAR_WORKSHOPCLIENTINDEX, -1 );
break;
}
break;
}
case 'i':
if( CHAR_getWorkInt(meindex,CHAR_WORKSHOPCLIENTINDEX)
== talker ){
NPC_SimpleShopOpenShopWindow( meindex, talker, npcarg );
}
break;
default:
break;
}
}
}
void NPC_LimitBuyInShopSpecialTalked( int meindex, int talker, char *msg, int color )
{
if( CHAR_getInt(talker,CHAR_WHICHTYPE) == CHAR_TYPEPLAYER
&& NPC_Util_isFaceToFace( meindex, talker, SHOPRANGE ) ){
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE], token[NPC_UTIL_GETARGSTR_LINEMAX];
NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg));
switch( tolower(msg[0]) ){
case 's':
{
int ret;
if( CHAR_getWorkInt(meindex,CHAR_WORKSHOPCLIENTINDEX) != talker ){
getStringFromIndexWithDelim( npcarg,"|",
ANOTHERPLAYERTOKEN,
token, sizeof(token));
NPC_SimpleShopNormalWindow( meindex, talker, token );
return;
}
ret = getStringFromIndexWithDelim( msg, "|", 3, token, sizeof( token));
if( ret == FALSE ){
token[0] = 'e';
token[1] = '\0';
}
switch( tolower(token[0])){
case 'b':
if( ( ret = NPC_SimpleShopProcessBuyMsg( msg, meindex, talker)) < 0){
switch( ret ){
case -2:
getStringFromIndexWithDelim( npcarg,"|",POORTOKEN,
token,sizeof(token));
NPC_SimpleShopNormalWindow( meindex,talker,token);
break;
case -3:
getStringFromIndexWithDelim( npcarg,"|",
ITEMFULLTOKEN,
token,sizeof(token));
NPC_SimpleShopNormalWindow(meindex,talker,token);
break;
case -1:
default:
NPC_SimpleShopNormalWindow(meindex, talker,
SIMPLESHOP_FATALERRSTR
);
break;
}
}else{
NPC_SimpleShopFillItem( meindex, npcarg );
getStringFromIndexWithDelim(npcarg,"|",THANKYOUTOKEN,
token, sizeof(token));
NPC_SimpleShopNormalWindow(meindex,talker,token);
}
break;
case 's':
if( CHAR_getWorkInt(meindex,CHAR_WORKSHOPCLIENTINDEX) != talker ){
getStringFromIndexWithDelim( npcarg,"|",
ANOTHERPLAYERTOKEN,
token, sizeof(token));
NPC_SimpleShopNormalWindow( meindex, talker, token );
return;
}
if((ret=NPC_LimitBuyInShopProcessSellMsg(
msg,meindex,talker))<0){
switch(ret){
case -2:
getStringFromIndexWithDelim( npcarg,"|",
RAREITEMTOKEN,
token,sizeof(token));
NPC_SimpleShopNormalWindow( meindex,talker,token);
break;
case -1:
default:
NPC_SimpleShopNormalWindow(meindex, talker, SIMPLESHOP_FATALERRSTR
);
break;
}
}else{
getStringFromIndexWithDelim(npcarg,"|",THANKYOUTOKEN, token, sizeof(token));
NPC_SimpleShopNormalWindow(meindex,talker,token);
}
break;
case 'e':
default:
CHAR_setWorkInt( meindex, CHAR_WORKSHOPCLIENTINDEX, -1 );
break;
}
break;
}
case 'i':
if( CHAR_getWorkInt(meindex,CHAR_WORKSHOPCLIENTINDEX)
== talker ){
NPC_SimpleShopOpenShopWindow( meindex, talker, npcarg );
}
break;
default:
break;
}
}
}
/*
* 饕互用□穴伙它奶件玉它毛請允[它奶件玉它及廿兇氏毛瓷允午}
* 賡卞饕卞 仄井仃兇午五午 元橇謫卞手升月[
* int meindex : 饕及index
* int playerindex : 它奶件玉它毛請允皿伊奶乩□及index
* char *str :
*/
static void NPC_SimpleShopNormalWindow( int meindex, int playerindex,
char *str )
{
int fd;
int objindex;
char tmp[512], *name;
objindex = CHAR_getWorkInt(meindex,CHAR_WORKOBJINDEX);
name = CHAR_getChar( meindex, CHAR_NAME );
snprintf(tmp,sizeof(tmp),"W|%d|N|%s|123|%s", objindex, name, str );
fd = getfdFromCharaIndex(playerindex);
if( fd == -1 ) return;
lssproto_TK_send(fd,-1,tmp,CHAR_COLORWHITE );
}
/*
* 饕它奶件玉它及奶件犯弁旦井日}失奶 丞 □皮伙及奶件犯弁旦卞 晶
* 婁醒
* int charindex:平乓仿及奶件犯弁旦
* int shopwindowindex:饕它奶件玉它及奶件犯弁旦[0井日反元引月[
* 忒曰襖
* 失奶 丞 □皮伙及奶件犯弁旦[巨仿□反-1[
*/
static int NPC_ShopWindowIndexToItemTableIndex( int charindex,
int shopwindowindex )
{
int i, counter;
counter = 0;
for( i=CHAR_STARTITEMARRAY;i<CHAR_MAXITEMHAVE;i++ ){
if( ITEM_CHECKINDEX( CHAR_getItemIndex(charindex,i) ) ){
if( shopwindowindex == counter ) return i;
counter++;
}
}
return -1;
}
static BOOL NPC_SimpleShopProcessBuyMsg(char *msg, int shopindex,
int playerindex )
{
int shopwindowindex, itemtableindex,itemind;
int price, tmpgold;
char buf[64];
if(!CHAR_CHECKINDEX(shopindex)||!CHAR_CHECKINDEX(playerindex))
return -1;
if( !getStringFromIndexWithDelim( msg,"|",4,buf,sizeof(buf) )){
return -1;
}
shopwindowindex = atoi(buf);
itemtableindex=NPC_ShopWindowIndexToItemTableIndex( shopindex, shopwindowindex );
itemind = CHAR_getItemIndex(shopindex,itemtableindex );
if( ! ITEM_CHECKINDEX(itemind) ) return -1;
price = ITEM_getInt( itemind, ITEM_COST )
* NPC_Util_buyRate(playerindex);
tmpgold = CHAR_getInt(playerindex,CHAR_GOLD);
if( tmpgold < price ){
return -2;
}
if( ! NPC_Util_moveItemToChar(playerindex,itemind,TRUE ) ){
return -3;
}
CHAR_AddGold( playerindex, price );
CHAR_sendStatusString( playerindex , "P");
return 1;
}
static BOOL NPC_SimpleShopProcessSellMsg(char *msg, int shopindex,
int playerindex )
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -