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

📄 npc_petracepet.c

📁 石器时代2.0完整版源代码.已经加入新功能. 在REDHAT9下GCC3.4编译成功.
💻 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 "handletime.h" #ifdef _PETRACE#include "npc_petracepet.h"#define PETRACEPET_WAIT_LOOPTIME			30000	// 30秒#define PETRACEPET_SHOWWIN_LOOPTIME			10000	// 10秒static void	NPC_PetRacePet_Walk(int meindex);static int NPC_PetRacePetSetPoint(int meindex, char *argstr);enum{	NPC_WORK_STATE =  CHAR_NPCWORKINT1,	NPC_WORK_MASTER = CHAR_NPCWORKINT2,	NPC_WORK_ROUTEPOINT = CHAR_NPCWORKINT3,	NPC_WORK_ROUTETOX = CHAR_NPCWORKINT4,	NPC_WORK_ROUTETOY = CHAR_NPCWORKINT5,	NPC_WORK_WAITFLAG = CHAR_NPCWORKINT6,	NPC_WORK_FLOOR = CHAR_NPCWORKINT7,	NPC_WORK_X = CHAR_NPCWORKINT8,	NPC_WORK_Y = CHAR_NPCWORKINT9,	NPC_WORK_DIR = CHAR_NPCWORKINT10,	NPC_WORK_STOPX = CHAR_NPCWORKINT11,	NPC_WORK_STOPY = CHAR_NPCWORKINT12,};enum{	NPC_State_Wait,	NPC_State_Run,	NPC_State_ShowWin,};int raceflag=0;BOOL NPC_PetRacePetInit( int meindex ){	char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];	char buf[256];	int showstopx, showstopy;	int routenum = 0, i = 0;		NPC_Util_GetArgStr(meindex, argstr, sizeof(argstr));	for (i = 1; i <= routenum; i++)	{		char routetostring[64];		snprintf(routetostring, sizeof(routetostring), "routeto");		if (NPC_Util_GetStrFromStrWithDelim(argstr, routetostring, buf, sizeof(buf)) == NULL)		{			print("Init_npcracepet: Didn't set route\n");			return FALSE;		}	}	showstopx = NPC_Util_GetNumFromStrWithDelim(argstr, "showstopx");	showstopy = NPC_Util_GetNumFromStrWithDelim(argstr, "showstopy");	if (showstopx < 0 || showstopx > 100 || showstopy < 0 || showstopy > 100)		return FALSE;	CHAR_setInt(meindex, CHAR_WHICHTYPE, CHAR_PETRACEPET);	CHAR_setWorkInt(meindex, NPC_WORK_STATE, NPC_State_Wait);	CHAR_setWorkInt(meindex, NPC_WORK_ROUTEPOINT, 2);	CHAR_setWorkInt(meindex, NPC_WORK_WAITFLAG, 1);	CHAR_setWorkInt(meindex, NPC_WORK_FLOOR, CHAR_getInt(meindex, CHAR_FLOOR));	CHAR_setWorkInt(meindex, NPC_WORK_X, CHAR_getInt(meindex, CHAR_X));	CHAR_setWorkInt(meindex, NPC_WORK_Y, CHAR_getInt(meindex, CHAR_Y));	CHAR_setWorkInt(meindex, NPC_WORK_DIR, CHAR_getInt(meindex, CHAR_DIR));	CHAR_setWorkInt(meindex, NPC_WORK_STOPX, showstopx);	CHAR_setWorkInt(meindex, NPC_WORK_STOPY, showstopy);	CHAR_setInt(meindex, CHAR_LOOPINTERVAL, PETRACEPET_WAIT_LOOPTIME);	NPC_PetRacePetSetPoint(meindex, argstr);	return	TRUE;}void NPC_PetRacePetTalked( int meindex , int talkerindex , char *szMes , int color ){}void NPC_PetRacePetLoop( int meindex){	switch(CHAR_getWorkInt(meindex, NPC_WORK_STATE))	{		case NPC_State_Wait:			{				if (CHAR_getWorkInt(meindex, NPC_WORK_WAITFLAG) == 0)				{					char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];					NPC_Util_GetArgStr(meindex, argstr, sizeof(argstr));					CHAR_setWorkInt(meindex, NPC_WORK_ROUTEPOINT, 2);					NPC_PetRacePetSetPoint(meindex, argstr);					CHAR_setInt(meindex, CHAR_LOOPINTERVAL, PETRACEPET_WAIT_LOOPTIME);					CHAR_setInt(meindex, CHAR_DIR, CHAR_getWorkInt(meindex, NPC_WORK_DIR));					CHAR_warpToSpecificPoint(meindex,						CHAR_getWorkInt(meindex, NPC_WORK_FLOOR),						CHAR_getWorkInt(meindex, NPC_WORK_X),						CHAR_getWorkInt(meindex, NPC_WORK_Y));					CHAR_setWorkInt(meindex, NPC_WORK_WAITFLAG, 1);				}			}			break;		case NPC_State_Run:			{				int interval = 50;				int random = 0;				if (CHAR_getWorkInt(meindex, NPC_WORK_ROUTETOX) <= CHAR_getWorkInt(meindex, NPC_WORK_STOPX)					&& CHAR_getWorkInt(meindex, NPC_WORK_ROUTETOY) >= CHAR_getWorkInt(meindex, NPC_WORK_STOPY))						random = 3;				else					random = RAND(0, 8);				if (random == 0) // 攻击				{					int rands = RAND(0, 3);					interval = 1500;					CHAR_sendAction(meindex, 0, FALSE);					if (rands == TRUE)					{						char tmpbuf[256];						int floor = CHAR_getInt(meindex, CHAR_FLOOR);						int master = CHAR_getWorkInt(meindex, NPC_WORK_MASTER);						int randomi = RAND(1, 9);						if (randomi == 1)							snprintf(tmpbuf, sizeof(tmpbuf), "哦~看来%s好像发威了唷!",								CHAR_getChar(meindex, CHAR_NAME));						else if (randomi == 2)							snprintf(tmpbuf, sizeof(tmpbuf), "%s使出了奋力的一击~",								CHAR_getChar(meindex, CHAR_NAME));						else if (randomi == 3)							snprintf(tmpbuf, sizeof(tmpbuf), "咦...%s发怒了?",								CHAR_getChar(meindex, CHAR_NAME));						if (randomi > 0 && randomi < 4)							CHAR_talkToFloor(floor, master, tmpbuf, CHAR_COLORWHITE);					}				}				else if (random == 1) // 晕倒				{					int rands = RAND(0, 3);					interval = 2500;					CHAR_sendAction(meindex, 2, FALSE);					if (rands == TRUE)					{						char tmpbuf[256];						int floor = CHAR_getInt(meindex, CHAR_FLOOR);						int master = CHAR_getWorkInt(meindex, NPC_WORK_MASTER);						int randomi = RAND(1, 9);						if (randomi == 1)							snprintf(tmpbuf, sizeof(tmpbuf), "%s好像晕倒了呢...",								CHAR_getChar(meindex, CHAR_NAME));						else if (randomi == 2)							snprintf(tmpbuf, sizeof(tmpbuf), "%s受伤了吗?",								CHAR_getChar(meindex, CHAR_NAME));						else if (randomi == 3)							snprintf(tmpbuf, sizeof(tmpbuf), "嘿...%s晕倒後又勇敢的爬起来了!",								CHAR_getChar(meindex, CHAR_NAME));						if (randomi > 0 && randomi < 4)							CHAR_talkToFloor(floor, master, tmpbuf, CHAR_COLORWHITE);					}				}				else if (random == 2) // 站立				{					interval = 500;					CHAR_sendAction(meindex, 3, FALSE);				}				else // 一般					interval = RAND(20, 100);				NPC_PetRacePet_Walk(meindex);				CHAR_setInt(meindex, CHAR_LOOPINTERVAL, interval);			}			break;		case NPC_State_ShowWin:			{				int action = RAND(0, 11);				CHAR_sendAction(meindex, action, FALSE);				CHAR_setInt(meindex, CHAR_LOOPINTERVAL, PETRACEPET_SHOWWIN_LOOPTIME);			}			break;		default:			break;	}}static void NPC_PetRacePet_Walk(int meindex){	POINT start, end;	int dir, i;	start.x = CHAR_getInt(meindex, CHAR_X);	start.y = CHAR_getInt(meindex, CHAR_Y);	end.x = CHAR_getWorkInt(meindex, NPC_WORK_ROUTETOX);	end.y = CHAR_getWorkInt(meindex, NPC_WORK_ROUTETOY);	if (start.x == end.x && start.y == end.y)	{		char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];		NPC_Util_GetArgStr(meindex, argstr, sizeof( argstr));		CHAR_setWorkInt(meindex, NPC_WORK_ROUTEPOINT, 			CHAR_getWorkInt(meindex, NPC_WORK_ROUTEPOINT) + 1);		if (NPC_PetRacePetSetPoint(meindex, argstr) == FALSE)		{			// 到达目的地後,初始状态			char tmpbuf[256];			int masterindex = CHAR_getWorkInt(meindex, NPC_WORK_MASTER);			int petgoal = CHAR_getWorkInt(masterindex, CHAR_NPCWORKINT9);			int floor = CHAR_getInt(masterindex, CHAR_FLOOR);			if (CHAR_getWorkInt(masterindex, CHAR_NPCWORKINT8) == 0)			{				CHAR_warpToSpecificPoint(meindex, 7005,42,44);				CHAR_setWorkInt(masterindex, CHAR_NPCWORKINT8, meindex);				CHAR_sendAction(meindex, 3, FALSE);				snprintf(tmpbuf, sizeof(tmpbuf), "首先到达目的地的是...%s",					CHAR_getChar(meindex, CHAR_NAME));				raceflag++;			}			else			{				if(raceflag == 1)				{					//将宠物送回到指定的坐标					CHAR_warpToSpecificPoint(meindex, 7005,43,47);					snprintf(tmpbuf, sizeof(tmpbuf), "接着到达目的地的是...%s",						CHAR_getChar(meindex, CHAR_NAME));					raceflag++;				}				else				{					//完成最后一个宠物的传送,初始化					CHAR_warpToSpecificPoint(meindex, 7005,45,44);					snprintf(tmpbuf, sizeof(tmpbuf), "最后到达目的地的是...%s",						CHAR_getChar(meindex, CHAR_NAME));					raceflag=0;				}			}			CHAR_setWorkInt(meindex, NPC_WORK_STATE, NPC_State_ShowWin);			CHAR_setInt(meindex, CHAR_LOOPINTERVAL, 500);			CHAR_setWorkInt(meindex, NPC_WORK_WAITFLAG, 0);			CHAR_setWorkInt(masterindex, CHAR_NPCWORKINT9, petgoal + 1);			CHAR_talkToFloor(floor, masterindex, tmpbuf, CHAR_COLORWHITE);			return;		}		else			return;	}	dir = NPC_Util_getDirFromTwoPoint(&start, &end);	end.x = CHAR_getInt(meindex, CHAR_X);	end.y = CHAR_getInt(meindex, CHAR_Y);	for(i = 0; i < 100; i++)	{		if (dir < 0)			dir = RAND(0, 7);		dir = NPC_Util_SuberiWalk(meindex, dir);		if (dir >= 0 && dir <= 7) break;	}	if (dir >= 0 && dir <= 7)	{		int result = 0;		result = CHAR_walk(meindex, dir, 0);	}}static int NPC_PetRacePetSetPoint(int meindex, char *argstr){	// 寻找下一步 x , y	char buf[4096], buf2[256], buf3[256];	int ret;	char routetostring[64];	snprintf(routetostring, sizeof(routetostring), "routeto");	if (NPC_Util_GetStrFromStrWithDelim(argstr, routetostring, buf, sizeof(buf)) == NULL)	{		print("SetPoint_npcracepet: Didn't set route %s\n", routetostring);		return FALSE;	}	ret = getStringFromIndexWithDelim(buf, ";", 		CHAR_getWorkInt(meindex, NPC_WORK_ROUTEPOINT), buf2, sizeof(buf2));	if (ret == FALSE)	return FALSE;	ret = getStringFromIndexWithDelim(buf2, ",", 1, buf3, sizeof(buf3));	if (ret == FALSE)	return FALSE;	CHAR_setWorkInt(meindex, NPC_WORK_ROUTETOX, atoi(buf3));	ret = getStringFromIndexWithDelim(buf2, ",", 2, buf3, sizeof(buf3));	if (ret == FALSE)	return FALSE;	CHAR_setWorkInt(meindex, NPC_WORK_ROUTETOY, atoi(buf3));	return TRUE;}#endif

⌨️ 快捷键说明

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