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

📄 npc_fmwarpman.c

📁 石器时代2.0完整版源代码.已经加入新功能. 在REDHAT9下GCC3.4编译成功.
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "version.h"#include <time.h>#include "char.h"#include "object.h"#include "char_base.h"#include "npcutil.h"#include "lssproto_serv.h"#include "saacproto_cli.h"#include "npc_fmwarpman.h"#include "npc_scheduleman.h"#include "readmap.h"#include "log.h"#include "battle.h"#include "handletime.h"#include "family.h"#include "errno.h"#include "configfile.h"#ifdef _FM_POINT_PKextern struct  FM_POINTLIST fmpointlist;                   // 家族据点#endif#define FMWARPMAN_INIT_LOOPTIME		600	// 0.1秒#define FMWARPMAN_FREE_LOOPTIME		9000	// 1.5秒#define FMWARPMAN_BUSY_LOOPTIME		3000	// 0.5秒#define FMWARPMAN_WAIT_LOOPTIME		18000	// 3秒#define FMWARPMAN_CLEANPLACE		59//#define FMWARPMAN_CLEANPLACE		9#define	TRUE	1#define FALSE	0// CoolFish Rem 2002/2/25// #define MANOR	4enum {	NPC_WORK_MODEFLAG =  CHAR_NPCWORKINT1,	NPC_WORK_CURRENTTIME = CHAR_NPCWORKINT2,	NPC_WORK_WARPFLOOR = CHAR_NPCWORKINT3,	NPC_WORK_FMNUMI = CHAR_NPCWORKINT4,	NPC_WORK_FMNUMII = CHAR_NPCWORKINT5,	NPC_WORK_ID = CHAR_NPCWORKINT6,	NPC_WORK_TIMEFLAG = CHAR_NPCWORKINT9,	NPC_WORK_TALKFLAG = CHAR_NPCWORKINT10,	NPC_WORK_CleanTime = CHAR_NPCWORKINT11,};enum {	NPC_STATEINIT,	NPC_STATEFREE,	NPC_STATEBUSY,	NPC_STATEWAIT,};enum {	NPC_WORK_WINFMNAME = CHAR_NPCWORKCHAR1,};void NPC_ERR_FMDiSP(int meindex, int talker, int errNO);static void NPC_FMWarpMan_selectWindow(int meindex, int toindex, int num, int select);void NPC_FMBATTLESET(int floor, int index1, int index2, int flag);void NPC_WarpFamily(int floor, int index1, int index2, int fl, int x, int y);void NPC_BattleOut(int fmindex, int fmindex1);void NPC_CleanPK(int floor, int meindex);int NPC_FMFloorUse(int floor);void NPC_talkToFloor(int floor, int index1, int index2, char *data);void CheckLeavePK(int npcindex, int floor, int index1, int index2);void CHECK_FMPknumInFloor( int meindex){	int fmnum1 = 0, fmnum2 = 0;	int fmpks_pos;	fmpks_pos = CHAR_getWorkInt(meindex, NPC_WORK_ID) * MAX_SCHEDULE;	// Nuke 20040920: Bug fix 庄园人数满时要检查总人数	//print("<<%d %d>>",fmpks_pos,MAX_SCHEDULEMAN);	//if( fmpks_pos < 0 || fmpks_pos >= MAX_SCHEDULEMAN ) return;	if( fmpks_pos < 0 || fmpks_pos >= MAX_SCHEDULEMAN * MAX_SCHEDULE ) return;	NPC_GetPKFMNum(CHAR_getWorkInt(meindex, NPC_WORK_WARPFLOOR),		         		fmpks[fmpks_pos].host_index,		         		fmpks[fmpks_pos].guest_index,		         		&fmnum1, &fmnum2 );	CHAR_setWorkInt( meindex, NPC_WORK_FMNUMI , fmnum1);	CHAR_setWorkInt( meindex, NPC_WORK_FMNUMII, fmnum2);}extern int familyMemberIndex[FAMILY_MAXNUM][FAMILY_MAXMEMBER];BOOL NPC_FMWarpManInit( int meindex ){	char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];	char buff2[256];	char buf[1024];	int fl, x, y, meid;	// shan	int fl1, x1, y1;	if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){		print("FMWarpMan:GetArgStrErr");		return FALSE;	}	if(NPC_Util_GetStrFromStrWithDelim( npcarg, "WARP1", buf, sizeof( buf))==NULL){	        print("FMWarpman Err is %s",npcarg);		print("FMWarpman Err");		return FALSE;	}	getStringFromIndexWithDelim(buf,",",1,buff2,sizeof(buff2));	fl=atoi(buff2);	CHAR_setWorkInt(meindex, NPC_WORK_WARPFLOOR, fl);	getStringFromIndexWithDelim(buf,",",2,buff2,sizeof(buff2));	x=atoi(buff2);	getStringFromIndexWithDelim(buf,",",3,buff2,sizeof(buff2));	y=atoi(buff2);	if( MAP_IsValidCoordinate( fl,x,y )== FALSE ){		print( "FMWarp NPC:Invalid warpman ERR" );		return FALSE;	}    // shan begin	if(NPC_Util_GetStrFromStrWithDelim( npcarg, "WARP2", buf, sizeof( buf))==NULL){	        print("FMWarpman Err is %s",npcarg);		print("FMWarpman Err");		return FALSE;	}	getStringFromIndexWithDelim(buf,",",1,buff2,sizeof(buff2));	fl1=atoi(buff2);	CHAR_setWorkInt(meindex, NPC_WORK_WARPFLOOR, fl);	getStringFromIndexWithDelim(buf,",",2,buff2,sizeof(buff2));	x1=atoi(buff2);	getStringFromIndexWithDelim(buf,",",3,buff2,sizeof(buff2));	y1=atoi(buff2);	if( MAP_IsValidCoordinate( fl1,x1,y1 )== FALSE ){		print( "FMWarp NPC:Invalid warpman ERR" );		return FALSE;	}	// shan end		meid = NPC_Util_GetNumFromStrWithDelim(npcarg, "ID");	if ((meid < 0) || (meid >= MAX_SCHEDULEMAN))	{		print("FMWARP NPC: Init error invalid ID:%d\n", meid);		return FALSE;	}	/*--正奶皿涩烂--*/	CHAR_setInt(meindex, CHAR_LOOPINTERVAL, FMWARPMAN_INIT_LOOPTIME);   	CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_TYPEWARPMAN );	CHAR_setWorkInt(meindex, NPC_WORK_MODEFLAG, NPC_STATEINIT);	CHAR_setWorkInt(meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec);	CHAR_setWorkInt(meindex, NPC_WORK_TIMEFLAG, 0);	CHAR_setWorkInt(meindex, NPC_WORK_TALKFLAG, -1);	CHAR_setWorkInt(meindex, NPC_WORK_ID, meid);	CHAR_setWorkInt(meindex, NPC_WORK_FMNUMI, 0);	CHAR_setWorkInt(meindex, NPC_WORK_FMNUMII, 0);	CHAR_setWorkInt( meindex, NPC_WORK_CleanTime, 6*10);	    return TRUE;}void NPC_FMWarpManTalked(int meindex, int talkerindex, char *szMes, int color){	char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];		CHAR_setWorkInt( talkerindex, CHAR_WORKWARPCHECK, FALSE );	    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("GetArgStrErr");		return ;	}	if(CHAR_getWorkInt(talkerindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE){		NPC_ERR_FMDiSP( meindex, talkerindex, 1);	}	CHAR_setWorkInt( talkerindex , CHAR_WORKSHOPRELEVANTTRD , 0 );	NPC_FMWarpMan_selectWindow( meindex, talkerindex, 0, -1);}void NPC_FMWarpManLoop(int meindex){	struct tm tm1;	struct tm *tm2;	int fmpks_pos = CHAR_getWorkInt(meindex, NPC_WORK_ID) * MAX_SCHEDULE;	int floor = CHAR_getWorkInt(meindex, NPC_WORK_WARPFLOOR);	// WON ADD 修正snprintf会导致当机的bug	if( (tm2=localtime((time_t *)&NowTime.tv_sec) ) == NULL ){		print("\n won ==> time err !! ");		return;	}	memcpy(&tm1, localtime((time_t *)&NowTime.tv_sec), sizeof(tm1));	if (tm1.tm_min == 0)   	CHAR_setWorkInt(meindex, NPC_WORK_TIMEFLAG, tm1.tm_min);	if (CHAR_getWorkInt(meindex, NPC_WORK_MODEFLAG) == NPC_STATEINIT)	{		if (tm1.tm_sec == 0)		{			CHAR_setWorkInt(meindex, NPC_WORK_MODEFLAG, NPC_STATEFREE);			CHAR_setInt(meindex, CHAR_LOOPINTERVAL, FMWARPMAN_FREE_LOOPTIME);		}	}	if (CHAR_getWorkInt(meindex, NPC_WORK_MODEFLAG) == NPC_STATEFREE)	{		// 取得目前系统时间,若目前时间 >= 准备时间则设定BUSY状态				if (tm1.tm_min > CHAR_getWorkInt(meindex, NPC_WORK_TALKFLAG)			&& tm1.tm_min == 0)		{			// 通知成员进场			if (fmpks[fmpks_pos].flag == FMPKS_FLAG_SCHEDULED)				NPC_talkToFloor(CHAR_getInt(meindex, CHAR_FLOOR),				fmpks[fmpks_pos].host_index,				fmpks[fmpks_pos].guest_index, "可以准备进场了!");			CHAR_setWorkInt(meindex, NPC_WORK_TALKFLAG, tm1.tm_min);		}		if ((fmpks[fmpks_pos].prepare_time > 0) && (fmpks[fmpks_pos].flag == FMPKS_FLAG_SCHEDULED))		{			int clock = 0;						NPC_FMBATTLESET(floor, fmpks[fmpks_pos].host_index,				fmpks[fmpks_pos].guest_index, -1);			if (tm1.tm_hour - (fmpks[fmpks_pos].dueltime / 100) < 0)				clock = (fmpks[fmpks_pos].dueltime % 100) + fmpks[fmpks_pos].prepare_time - 60;			else				clock = fmpks[fmpks_pos].dueltime - (tm1.tm_hour * 100) + fmpks[fmpks_pos].prepare_time;						if ((tm1.tm_min >= clock) && (fmpks[fmpks_pos].prepare_time > 0))			{								NPC_talkToFloor(floor, fmpks[fmpks_pos].host_index,					fmpks[fmpks_pos].guest_index, "开战罗~!!");				CHAR_setWorkInt(meindex, NPC_WORK_MODEFLAG, NPC_STATEBUSY);				CHAR_setInt(meindex, CHAR_LOOPINTERVAL, FMWARPMAN_BUSY_LOOPTIME);				NPC_FMBATTLESET(floor, fmpks[fmpks_pos].host_index,					fmpks[fmpks_pos].guest_index, 1);				//				print("\n won ==> set fmwaperman state busy !!");			}			else if (tm1.tm_min > CHAR_getWorkInt(meindex, NPC_WORK_TIMEFLAG))			{				char buf[256];				int clock = 0;				CHAR_setWorkInt(meindex, NPC_WORK_TIMEFLAG, tm1.tm_min);				clock = ((fmpks[fmpks_pos].dueltime % 100) + fmpks[fmpks_pos].prepare_time) - tm1.tm_min;				if (clock >= 60)	clock = clock - 60;				sprintf(buf, "距离对战时间还剩下:%4d分钟", clock);				NPC_talkToFloor(floor, fmpks[fmpks_pos].host_index,					fmpks[fmpks_pos].guest_index, buf);			}		}	}else if (CHAR_getWorkInt(meindex, NPC_WORK_MODEFLAG) == NPC_STATEBUSY){		// 检查场内人数、判断胜负		int num1 = 0, num2 = 0;		int winflag = 0;		int floor = CHAR_getWorkInt(meindex, NPC_WORK_WARPFLOOR);		int meid = CHAR_getWorkInt(meindex, NPC_WORK_ID);		//		print("\n won ==> check_winner : npc_meid(%d)", meid );				NPC_GetPKFMNum(floor, fmpks[fmpks_pos].host_index,			fmpks[fmpks_pos].guest_index, &num1, &num2);		NPC_FMBATTLESET(floor, fmpks[fmpks_pos].host_index,			fmpks[fmpks_pos].guest_index, 1);		CheckLeavePK(meindex, floor, fmpks[fmpks_pos].host_index,			fmpks[fmpks_pos].guest_index);				if (meid > MANORNUM){			if (tm1.tm_min == FMWARPMAN_CLEANPLACE){				// 判断胜负、WARP离场、设定NPC状态				NPC_BattleOut(fmpks[fmpks_pos].host_index, fmpks[fmpks_pos].guest_index);				NPC_FMBATTLESET(floor, fmpks[fmpks_pos].host_index,					fmpks[fmpks_pos].guest_index, -1);				if (fmpks[fmpks_pos].win == 0){// 生存战					if (num1 > num2)						winflag = 1;					else if(num1 < num2)						winflag = 2;					else						winflag = 3;				}else if (fmpks[fmpks_pos].win == 1){ // 打飞战					if ((CHAR_getWorkInt(meindex, NPC_WORK_FMNUMI) - num1) < (CHAR_getWorkInt(meindex, NPC_WORK_FMNUMII) - num2))						winflag = 1;					else if ((CHAR_getWorkInt(meindex, NPC_WORK_FMNUMI) - num1) > (CHAR_getWorkInt(meindex, NPC_WORK_FMNUMII) - num2))						winflag = 2;					else						winflag = 3;				}			}		}		if ((num1 == 0) && (num2 != 0)){			winflag = 2;		}else if ((num2 == 0) && (num1 != 0)){			winflag = 1;		}else if ((num1 == 0) && (num2 == 0)){			winflag = 3;		}      		if (winflag > 0 && winflag < 3){#ifdef _MANOR_PKRULE      			if(meid > MANORNUM){#endif				// 流浪家族pk 过声望				if (winflag == 1){	 		 					saacproto_ACFixFMPK_send(acfd,						fmpks[fmpks_pos].host_name,						fmpks[fmpks_pos].host_index + 1,						fmpks[fmpks_pos].host_index,						fmpks[fmpks_pos].guest_name,						fmpks[fmpks_pos].guest_index + 1,						fmpks[fmpks_pos].guest_index);				} else {			 					saacproto_ACFixFMPK_send(acfd,						fmpks[fmpks_pos].guest_name,						fmpks[fmpks_pos].guest_index + 1,						fmpks[fmpks_pos].guest_index,						fmpks[fmpks_pos].host_name,						fmpks[fmpks_pos].host_index + 1,						fmpks[fmpks_pos].host_index);				}  #ifdef _MANOR_PKRULE      			}#endif						{				if (meid > 0 && meid <= MANORNUM){// CoolFish 2002/2/25 Change MANOR -> MANORNUM					fmpks[fmpks_pos + 1].flag = FMPKS_FLAG_MANOR_BATTLEEND;					if (winflag == 1){						char token[256];						sprintf( token, " (%d:%d) %d/%d/%d",							tm1.tm_hour, tm1.tm_min,							tm1.tm_year+1900, tm1.tm_mon+1, tm1.tm_mday);						saacproto_ACFixFMPoint_send(acfd, 							fmpks[fmpks_pos].host_name,							fmpks[fmpks_pos].host_index + 1,							fmpks[fmpks_pos].host_index,							fmpks[fmpks_pos].guest_name,							fmpks[fmpks_pos].guest_index + 1,							fmpks[fmpks_pos].guest_index, meid);						//Syu 增加庄园战胜负Log						Logfmpk(							fmpks[fmpks_pos].host_name,							fmpks[fmpks_pos].host_index,							num1,							fmpks[fmpks_pos].guest_name,							fmpks[fmpks_pos].guest_index,							num2, token, "", "", 2);					} 					else if (winflag == 2){							char token[256];						sprintf( token, " (%d:%d) %d/%d/%d",							tm1.tm_hour, tm1.tm_min,							tm1.tm_year+1900, tm1.tm_mon+1, tm1.tm_mday);#ifdef _FM_POINT_PK						int fmid;

⌨️ 快捷键说明

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