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

513 lines
12 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 "common.h"
#include "char_base.h"
#include "npc_janken.h"
#include "npcutil.h"
#include "char.h"
#include "lssproto_serv.h"
#include "buf.h"
#include "function.h"
#include "readmap.h"
#include "object.h"
#include "log.h"
/*
*元扎氏仃氏
*/
static void NPC_Janken_selectWindow( int meindex, int talker, int num);
void NPC_JnakenJudge(int meindex,int talker,int sel);
BOOL NPC_JankenEntryItemCheck(int talker,char *buf);
BOOL NPC_JankenEntryItemDel(int talker,char *buf);
void NPC_WarpPointGet(int meindex,int talker,int *fl,int *x,int *y,int judge);
/*********************************
* 赓渝质
*********************************/
BOOL NPC_JankenInit( int meindex )
{
//正奶皿毛本永玄
CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_TYPEJANKEN );
return TRUE;
}
/*********************************
* 仄井仃日木凶凛及质
*********************************/
void NPC_JankenTalked( int meindex , int talkerindex , char *szMes ,
int color )
{
/* 皿伊奶乩□卞覆仄化分仃 杀允月 */
if( CHAR_getInt( talkerindex , CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) {
return;
}
/* ㄠ弘伉永玉动 及心 */
if( NPC_Util_CharDistance( talkerindex, meindex ) > 1) return;
NPC_Janken_selectWindow(meindex, talkerindex, 0);
}
/******************************
* 公木冗木及质 卞坌仃月
******************************/
static void NPC_Janken_selectWindow( int meindex, int talker, int num)
{
char token[1024];
char buf[32];
int fd = getfdFromCharaIndex( talker);
int buttontype=0;
int windowtype=0;
int windowno=0;
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
/*--它奶件玉它正奶皿丢永本□斥互云云中及匹燮卞涩烂--*/
windowtype=WINDOW_MESSAGETYPE_MESSAGE;
/*--涩烂白央奶伙毛 心 心--*/
if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr))==NULL){
print("NPC_janken Init: GetArgStrErr");
return ;
}
switch( num)
{
case 0:
/*-- 旦正□玄及丢永本□斥互 仃木壬巨仿□ 憎 --*/
if(NPC_Util_GetStrFromStrWithDelim( argstr, "MainMsg", token, sizeof( token)) == NULL)
{
print("Janken:MainMsg:%s", CHAR_getChar( meindex, CHAR_NAME));
return ;
}
/*--蓟 --*/
buttontype = WINDOW_BUTTONTYPE_YESNO;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_JANKEN_START;
break;
case 1:
//失奶 丞及民尼永弁
if(NPC_Util_GetStrFromStrWithDelim( argstr, "EntryItem", buf, sizeof( buf))!= NULL) {
if(NPC_JankenEntryItemCheck(talker,buf) == FALSE)
{
NPC_Janken_selectWindow(meindex, talker, 3);
}
//巨件玄伉迕及失奶 丞毛绰轮
if(NPC_JankenEntryItemDel(talker,buf) == FALSE){
print("元扎氏仃氏ERR:失奶 丞壅仄卞仄匀天中");
}
}
/*--蓟 --*/
sprintf(token," 剪刀石头布!!\n"
"\n\n 《 石头 》"
"\n\n 《 剪刀 》"
"\n\n 《 布 》"
);
buttontype=WINDOW_BUTTONTYPE_NONE;
windowtype=WINDOW_MESSAGETYPE_SELECT;
windowno=CHAR_WINDOWTYPE_JANKEN_MAIN;
break;
case 2:
/*--丐中仇蓟 --*/
//sprintf(token," 丐中仇匹″″\n"
sprintf(token," 平手再来!!\n"
"\n\n 《 石头 》"
"\n\n 《 剪刀 》"
"\n\n 《 布 》"
);
buttontype=WINDOW_BUTTONTYPE_NONE;
windowtype=WINDOW_MESSAGETYPE_SELECT;
windowno=CHAR_WINDOWTYPE_JANKEN_MAIN;
break;
case 3:
/*-- 旦正□玄及丢永本□斥互 仃木壬巨仿□ 憎 --*/
NPC_Util_GetStrFromStrWithDelim( argstr, "NoItem", token, sizeof( token));
buttontype=WINDOW_BUTTONTYPE_OK;
windowtype=WINDOW_MESSAGETYPE_MESSAGE;
windowno=CHAR_WINDOWTYPE_JANKEN_END;
break;
}
// makeEscapeString( token, escapedname, sizeof(escapedname));
/*-仇仇匹霜耨允月--*/
lssproto_WN_send( fd, windowtype,
buttontype,
windowno,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
token);
}
/*********************************
* 它奴件玉它丢永本□斥卞覆允月质
*********************************/
void NPC_JankenWindowTalked( int meindex, int talkerindex,
int seqno, int select, char *data)
{
/* ㄠ弘伉永玉动 及心 */
if( NPC_Util_CharDistance( talkerindex, meindex ) > 1) return;
switch( seqno){
case CHAR_WINDOWTYPE_JANKEN_START:
if(select==WINDOW_BUTTONTYPE_YES){
NPC_Janken_selectWindow(meindex, talkerindex, 1);
}
break;
case CHAR_WINDOWTYPE_JANKEN_MAIN:
if (atoi(data) >= 3){
NPC_JnakenJudge(meindex,talkerindex,atoi(data) );
}
break;
}
}
/*
*斥乓件弗件及 烂
*/
void NPC_JnakenJudge(int meindex,int talker,int sel)
{
int player=-1;
int jankenman;
char j_char[3][8]={" 石头 "," 剪刀 ",""};
char token[1024];
int shouhai = 0;
int fd = getfdFromCharaIndex( talker);
int fl=0,x=0,y=0;
if(sel == 3) player = 0; //弘□
if(sel == 5) player = 1; //民亦平
if(sel == 7) player = 2; //由□
jankenman = rand()%3;
switch(jankenman){
case 0:
if(player == 2){
shouhai = 1;
}else if(player == 1){
shouhai = 2;
}
break;
case 1:
if(player == 0){
shouhai = 1;
}else if(player == 2){
shouhai = 2;
}
break;
case 2:
if(player == 1){
shouhai = 1;
}else if(player == 0){
shouhai = 2;
}
break;
}
if(shouhai == 1){
//Change add 玩家猜胜了给的道具
NPC_JankenItemGet( meindex, talker, "WinItem" );
NPC_WarpPointGet(meindex, talker, &fl, &x, &y, 0);
snprintf( token, sizeof( token ) ,
" ~ 结 果 ~ \n\n"
" %16s %-16s\n"
" [%s] VS [%s]\n\n\n"
" %-16s 胜利",
CHAR_getChar(meindex,CHAR_NAME),CHAR_getChar(talker,CHAR_NAME),
j_char[jankenman],j_char[player],
CHAR_getChar(talker,CHAR_NAME)
);
// CHAR_talkToCli( talker , -1 ,token , CHAR_COLORCYAN );
//伐□皿
CHAR_warpToSpecificPoint(talker, fl, x, y);
// 匀凶午五反>减少=及失弁扑亦件毛允月[
CHAR_sendWatchEvent( CHAR_getWorkInt( talker, CHAR_WORKOBJINDEX), CHAR_ACTPLEASURE,NULL,0,TRUE);
CHAR_setWorkInt( talker, CHAR_WORKACTION, CHAR_ACTPLEASURE);
}else if(shouhai == 2){
//Change add 玩家猜输了给的道具
NPC_JankenItemGet( meindex, talker, "LoseItem" );
NPC_WarpPointGet(meindex, talker, &fl, &x, &y, 1);
snprintf( token, sizeof( token ) ,
" ~ 结 果 ~ \n\n"
" %16s %-16s\n"
" [%s] VS [%s]\n\n\n"
" %-16s 输了",
CHAR_getChar(meindex,CHAR_NAME),CHAR_getChar(talker,CHAR_NAME),
j_char[jankenman],j_char[player],
CHAR_getChar(talker,CHAR_NAME)
);
// CHAR_talkToCli( talker , -1 ,token , CHAR_COLORCYAN );
//伐□皿
CHAR_warpToSpecificPoint(talker, fl, x, y);
// 仃凶午五反> 仄中=失弁扑亦件毛允月
CHAR_sendWatchEvent( CHAR_getWorkInt( talker, CHAR_WORKOBJINDEX), CHAR_ACTSAD,NULL,0,TRUE);
CHAR_setWorkInt( talker, CHAR_WORKACTION, CHAR_ACTSAD);
}else{
//仇仇卞仁月午丐中仇
NPC_Janken_selectWindow( meindex, talker, 2);
return;
}
//霜耨
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,
WINDOW_BUTTONTYPE_OK,
CHAR_WINDOWTYPE_JANKEN_END,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
token);
}
/*
*伐□皿燮毛GET允月
*/
void NPC_WarpPointGet(int meindex,int talker,int *fl,int *x,int *y,int judge)
{
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
char *strbuf[2] = {"WinWarp","LoseWarp"};
char buf[64];
char buf2[32];
/*--涩烂白央奶伙毛 心 心--*/
if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr))==NULL){
print("NPC_janken Init: GetArgStrErr");
return ;
}
/*--伐□皿燮毛潸 --*/
NPC_Util_GetStrFromStrWithDelim( argstr, strbuf[judge], buf, sizeof( buf));
getStringFromIndexWithDelim(buf,",",1,buf2,sizeof(buf2));
*fl=atoi(buf2);
getStringFromIndexWithDelim(buf,",",2,buf2,sizeof(buf2));
*x=atoi(buf2);
getStringFromIndexWithDelim(buf,",",3,buf2,sizeof(buf2));
*y=atoi(buf2);
}
/*
*--失奶 丞及民尼永弁分仃毛垫丹
*/
BOOL NPC_JankenEntryItemCheck(int talker,char *buf)
{
char buf2[512];
char buf3[256];
int id=0;
BOOL flg = FALSE;
int i;
int itemindex;
int itemno;
int kosuu;
int cnt=0;
int k=1;
while(getStringFromIndexWithDelim(buf , "," , k, buf2, sizeof(buf2))
!=FALSE )
{
flg = FALSE;
k++;
if(strstr(buf2,"*") != NULL){
cnt = 0;
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){
flg = TRUE;
break;
}
}
}
}
if(flg == FALSE)
{
return FALSE;
}
}else{
itemno = atoi(buf2);
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){
flg = TRUE;
break;
}
}
}
if(flg == FALSE)
{
return FALSE;
}
}
}
return TRUE;
}
BOOL NPC_JankenEntryItemDel(int talker,char *buf)
{
int i = 1, j = 1,k = 1;
char buff3[128];
char buf2[32];
int itemindex;
while(getStringFromIndexWithDelim(buf , "," , k, buff3, sizeof(buff3)) !=FALSE ){
k++;
if(strstr(buff3, "*") !=NULL){
int itemno;
int kosuu;
int id;
int cnt=0;
getStringFromIndexWithDelim(buff3,"*",1,buf2,sizeof(buf2));
itemno = atoi(buf2);
getStringFromIndexWithDelim(buff3,"*",2,buf2,sizeof(buf2));
kosuu = atoi(buf2);
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++;
LogItem(
CHAR_getChar( talker, CHAR_NAME ), /* 平乓仿 */
CHAR_getChar( talker, CHAR_CDKEY ),
#ifdef _add_item_log_name // WON ADD 在item的log中增加item名称
itemindex,
#else
ITEM_getInt( itemindex, ITEM_ID), /* 失奶 丞 寞 */
#endif
"QuizDelItem(猜谜->交出道具)",
CHAR_getInt( talker, CHAR_FLOOR),
CHAR_getInt( talker, CHAR_X ),
CHAR_getInt( talker, CHAR_Y ),
ITEM_getChar( itemindex, ITEM_UNIQUECODE),
ITEM_getChar( itemindex, ITEM_NAME),
ITEM_getInt( itemindex, ITEM_ID)
);
CHAR_DelItem( talker, i);
if(cnt == kosuu){
break;
}
}
}
}
}else{
/*--蓟氏分 寞及失奶 丞毛蓟请---*/
for( j = 0 ; j < CHAR_MAXITEMHAVE ; j++){
itemindex = CHAR_getItemIndex( talker ,j);
if( ITEM_CHECKINDEX(itemindex) ){
if( atoi( buff3) == ITEM_getInt(itemindex,ITEM_ID)){
LogItem(
CHAR_getChar( talker, CHAR_NAME ), /* 平乓仿 */
CHAR_getChar( talker, CHAR_CDKEY ),
#ifdef _add_item_log_name // WON ADD 在item的log中增加item名称
itemindex,
#else
ITEM_getInt( itemindex, ITEM_ID), /* 失奶 丞 寞 */
#endif
"QuizDelItem(猜谜->交出道具)",
CHAR_getInt( talker,CHAR_FLOOR),
CHAR_getInt( talker,CHAR_X ),
CHAR_getInt( talker,CHAR_Y ),
ITEM_getChar( itemindex, ITEM_UNIQUECODE),
ITEM_getChar( itemindex, ITEM_NAME),
ITEM_getInt( itemindex, ITEM_ID)
);
CHAR_DelItem( talker, j);
}
}
}
}
}
return TRUE;
}
BOOL NPC_JankenItemGet(int meindex,int talker, char *wl)
{
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
char buf[64];
/*--涩烂白央奶伙毛 心 心--*/
if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr))==NULL){
print("NPC_janken ItemGet: GetArgStrErr");
return FALSE;
}
if(NPC_Util_GetStrFromStrWithDelim( argstr, wl, buf, sizeof( buf) ) !=NULL){
NPC_EventAddItem( meindex, talker, buf);
}
}