⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 npc_gamblebank.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 "configfile.h"
#ifdef _GAMBLE_BANK
#include "npc_gamblebank.h"

static void NPC_GambleBank_selectWindow( int meindex, int toindex, int num, int flg);
int NPC_GambleBank_DoGold( int meindex, int toindex, int Gold, int flg);
BOOL NPC_GambleBank_AddItem( int meindex, int toindex, int itemId, int count);

enum	{
	GAMBLE_START = 0,
	GAMBLE_SELET,
	GAMBLE_MAN_BANK,
	GAMBLE_MAN_CHANG1,
	GAMBLE_MAN_CHANG2,
	GAMBLE_END,
};

enum {
	NPC_WORK_INDEX = CHAR_NPCWORKINT1,
	NPC_WORK_WORKTYPE = CHAR_NPCWORKINT2,	// 0,-1 = NULL 2 = 银行 3 = 换币 4 = BOTH
	NPC_WORK_CURRENTTIME = CHAR_NPCWORKINT3,
	NPC_WORK_PAGE = 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,
*/
};
#define _GAMBLEBANK_U_NOLOCK	//同时对多人

#define GAMBLEBANK_LOOPTIME 80
#define GAMBLEBANK_STANDBY	5000 
#define GAMBLEBANK_DEF		3	//手续费 / 100
#define GAMBLEBANK_GETMAX	1000000
#define GAMBLEBANK_GETMIN	100
#define LIST_PAGE 7
BOOL NPC_GambleBankInit( int meindex )
{
	char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
	char buf1[256];
    CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_GAMBLEBANK );

#ifdef _GAMBLEBANK_U_NOLOCK
	CHAR_setInt( meindex, CHAR_LOOPINTERVAL, GAMBLEBANK_STANDBY);
	CHAR_setWorkInt( meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec);
#endif
	CHAR_setWorkInt( meindex , NPC_WORK_INDEX, -1);

	if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg)) == NULL)	{
		print("GambleBank:GetArgStrErr");
		return FALSE;
	}

	if(NPC_Util_GetStrFromStrWithDelim( npcarg,"GAMBLE_TYPE", buf1,sizeof( buf1) ) == NULL) {
		print("GAMBLE_TYPE err !");
		return FALSE;
	}
	CHAR_setWorkInt( meindex, NPC_WORK_WORKTYPE, atoi( buf1) );

    return TRUE;
}
//CHAR_send_P_StatusString( charaindex, CHAR_P_STRING_GOLD);
void NPC_GambleBankLoop( int meindex)
{
#ifdef _GAMBLEBANK_U_NOLOCK

	int fulltime = GAMBLEBANK_LOOPTIME;
	if( ( CHAR_getWorkInt( meindex, NPC_WORK_CURRENTTIME) + fulltime) >= NowTime.tv_sec )
		return;
	CHAR_setWorkInt( meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec);
	CHAR_setWorkInt( meindex , NPC_WORK_INDEX, -1);
#endif
	return;
}

void NPC_GambleBankTalked( int meindex , int talkerindex , char *szMes ,int color )
{
	char buf1[256];
	char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
	int work_type;

	if( !CHAR_CHECKINDEX( talkerindex) || !CHAR_CHECKINDEX( meindex) )
		return;
	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(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg)) == NULL)	{
		print("GambleBank:GetArgStrErr");
		return;
	}
#ifdef _FIX_GAMBLENUM
	if( CHAR_getInt( talkerindex, CHAR_GAMBLENUM) < 0 )	{
		CHAR_setInt( talkerindex, CHAR_GAMBLENUM, 0);
	}
#endif
	if(NPC_Util_GetStrFromStrWithDelim( npcarg,"GAMBLE_TYPE", buf1,sizeof( buf1) ) == NULL) {
		print("GAMBLE_TYPE err !");
		return;
	}

	CHAR_setWorkInt( meindex, NPC_WORK_WORKTYPE, atoi( buf1) );
	work_type = CHAR_getWorkInt( meindex, NPC_WORK_WORKTYPE);


	if( work_type < 1 || work_type > 4 )	{	// 0 or -1
		strcpy( buf1,"暂时停止服务。");
		CHAR_talkToCli( talkerindex, meindex, buf1,  CHAR_COLORYELLOW);
		CHAR_setWorkInt( meindex , NPC_WORK_INDEX, -1);
		return;
	}
#ifdef _GAMBLEBANK_U_NOLOCK

#else
	if( CHAR_getWorkInt( meindex , NPC_WORK_INDEX) >= 0 )	{
			strcpy( buf1,"我正忙着!");
			CHAR_talkToCli( talkerindex, meindex, buf1,  CHAR_COLORYELLOW);
		return;
	}else	{
		CHAR_setWorkInt( meindex , NPC_WORK_INDEX, talkerindex);
		CHAR_setWorkInt( meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec);
	}
#endif
	CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 1);
	NPC_GambleBank_selectWindow( meindex, talkerindex, GAMBLE_START, 1);
}

static void NPC_GambleBank_selectWindow( int meindex, int toindex, int num, int flg)
{
	char token[256];
	char buf1[256],buf2[256];
	char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
	int buttontype = 0, windowtype = 0, windowno = 0;
	int fd = getfdFromCharaIndex( toindex);
	int i;
	int page=-1;
	//flg <= 0 错误 1 正常 flg = 2 钱不够  3 = 个人存款将满
	//		4 = 个人银行将满 5 = 提领上限 6 = 提领下限
	char Gamble_End[][56] = {
		"error_msg", "end_msg", "money_msg", "full_msg1",
		"full_msg2","getmax_msg","getmin_msg",
	};

	if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){
		print("GambleBank:GetArgStrErr");
		return;
	}

  	windowtype = WINDOW_MESSAGETYPE_MESSAGE;
	switch( num)	{
	case GAMBLE_START:
		if( NPC_Util_GetStrFromStrWithDelim( npcarg,"gamble_start", token, sizeof( token) ) == NULL) {
			print("gamble_start msg err !");
			return;
		}
		buttontype = WINDOW_BUTTONTYPE_YESNO;
		windowno = NPC_GambleBank_START;
	break;
		
	case GAMBLE_SELET:
		i = 1;
		strcpy( token, "\0");
		sprintf( buf2,"%s%d", "gamble_msg0", i);
		while( NPC_Util_GetStrFromStrWithDelim( npcarg, buf2, buf1, sizeof( buf1) ) != NULL )	{
			if( strstr( buf1, "NULL" ) == NULL )	{
				strcat( token , buf1);
				strcat( token, "\n");
			}else	{
				strcat( token, "\n");
			}
			i++;
			sprintf( buf2,"%s%d", "gamble_msg0", i);
		}
	  	windowtype=WINDOW_MESSAGETYPE_SELECT;
	  	windowno = NPC_GambleBank_SELECT; 
		break;
	
	case GAMBLE_MAN_BANK:	//银行
		sprintf( token,"%d", CHAR_getInt( toindex, CHAR_PERSONAGOLD ) );
		windowtype = WINDOW_MESSAGETYPE_BANK;
		windowno = NPC_GambleBank_BANK;
	break;

	case GAMBLE_MAN_CHANG1:	//换物	
		{
			char snum[256];
			page = CHAR_getWorkInt( toindex, CHAR_WORKSHOPRELEVANT);
			strcpy( token, "换物");
			sprintf( token, "你有%d积分,想换哪一个奖品呢?\n", CHAR_getInt( toindex, CHAR_GAMBLENUM));
			for( i=(page*LIST_PAGE);i<(page*LIST_PAGE+LIST_PAGE);i++)	{
				if( i>=arraysizeof( GB_ITEMS))	{
					break;
				}
				if( !strcmp( GB_ITEMS[i].name,"NEXT") )	{
					strcat( token, "               下一页");
					break;
				}
				if( !strcmp( GB_ITEMS[i].name,"END") )	{
					strcat( token, "               取消\n");
					break;
				}

				sprintf( snum,"%s%d\t%s",
								"积分:", GB_ITEMS[i].Gnum,
								GB_ITEMS[i].name);
				snum[36] = 0;
				strcat( token, snum);
				strcat( token,"\n");
				strcpy( snum, "\0");
			}

			windowtype = WINDOW_MESSAGETYPE_SELECT;
			buttontype = WINDOW_BUTTONTYPE_NONE;
	  		windowno = NPC_GambleBank_CHANG1;
		}
	break;
	case GAMBLE_END:
		CHAR_send_P_StatusString( toindex, CHAR_P_STRING_GOLD);
		if( flg < 0  || flg > 6)	{
			flg = 0;
		}
		if( NPC_Util_GetStrFromStrWithDelim( npcarg, Gamble_End[flg], token, sizeof( token) ) == NULL) {
			print("Gamble_End[%d] noe found !", flg);
			return;
		}
		CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, -1);
#ifdef _GAMBLEBANK_U_NOLOCK
#else
		CHAR_setWorkInt( meindex , NPC_WORK_INDEX, -1);
#endif
		windowno = NPC_GambleBank_END;
		buttontype = WINDOW_BUTTONTYPE_OK;
	break;
	}

	lssproto_WN_send( fd, windowtype, 
					buttontype, 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -