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

📄 npc_manorsman.c

📁 石器时代2.0完整版源代码.已经加入新功能. 在REDHAT9下GCC3.4编译成功.
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "version.h"#include <time.h>#include "char.h"#include "object.h"#include "lssproto_serv.h"#include "npcutil.h"#include "handletime.h"#include "npc_scheduleman.h"#include "family.h"#include "npc_manorsman.h"#include "saacproto_cli.h"#include "net.h"#include "configfile.h"#include "log.h"/* * 庄园 PK 登记员 * */#define MAX_MANORSMAN 22static int FMPK_ManorsmanList[MAX_MANORSMAN]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 };enum {	NPC_WORK_ID = CHAR_NPCWORKINT1,		// 登记员 ID, 从 0 开始	NPC_WORK_MANORID = CHAR_NPCWORKINT2,	// 庄园编号	NPC_WORK_CHALLENGEWAIT = CHAR_NPCWORKINT3,	// 挑战等待时间	NPC_WORK_PEACEWAIT = CHAR_NPCWORKINT4,	// 休战时间	NPC_WORK_PREVLOOPTIME = CHAR_NPCWORKINT5,	// 前一次处理 Loop 的时间};#define SCHEDULEFILEDIR		"./Schedule/"#ifdef _FIX_FAMILY_PK_LIMIT	   // WON ADD 将可挑战庄园的由前十大改为前二十大#define PK_LIMIT	20	       #endifextern struct FM_POINTLIST  fmpointlist;extern void NPC_talkToFloor(int floor, int index1, int index2, char *data);#ifdef _MANOR_PKRULEextern struct  FMS_DPTOP fmdptop;#endifvoid NPC_ManorLoadPKSchedule(int meindex);	// Load schedule from diskint NPC_getManorsmanListIndex( int ID){	if( ID < 0 || ID >= MAX_MANORSMAN ){		return	FMPK_ManorsmanList[ ID];	}	return -1;}BOOL NPC_ManorSmanInit( int meindex ){  char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];  int meid;  int a;  CHAR_setInt( meindex, CHAR_WHICHTYPE, CHAR_TYPEMANORSCHEDULEMAN );  // 参数  NPC_Util_GetArgStr(meindex, argstr, sizeof(argstr));  meid = NPC_Util_GetNumFromStrWithDelim(argstr, "id" );  if ((meid<0) || (meid>=MAX_SCHEDULEMAN)) {    print("MANORSMAN init error: invalid ID(%d)\n",meid);    meid=0;  }  CHAR_setWorkInt(meindex, NPC_WORK_ID, meid);  a = NPC_Util_GetNumFromStrWithDelim(argstr, "loop" );  if ((a<100) || (a>10000)) a=1000;  CHAR_setInt(meindex, CHAR_LOOPINTERVAL, a);  a = NPC_Util_GetNumFromStrWithDelim(argstr, "manorid" );  if ((a<1) || (a>/*4*/MANORNUM)) {// CoolFish 2002/2/25    print("MANORSMAN init error: invalid manor id(%d).", a);    a=1;  }  CHAR_setWorkInt(meindex, NPC_WORK_MANORID, a);  a = NPC_Util_GetNumFromStrWithDelim(argstr, "challengewait");  if ((a<1) || (a>259200)) {    print("MANORSMAN init error: invalid challengewait(%d).",a);    a=259200;  }  CHAR_setWorkInt(meindex, NPC_WORK_CHALLENGEWAIT, a);  a = NPC_Util_GetNumFromStrWithDelim(argstr, "peacewait");  if ((a<1) || (a>432000)) {    print("MANORSMAN init error: invalid peacewait(%d).",a);    a=604800;  }  CHAR_setWorkInt(meindex, NPC_WORK_PEACEWAIT, a);  NPC_ManorLoadPKSchedule(meindex);  CHAR_setWorkInt(meindex, NPC_WORK_PREVLOOPTIME, NowTime.tv_sec);  if( CHAR_getWorkInt( meindex, NPC_WORK_ID) >= 0 &&	  CHAR_getWorkInt( meindex, NPC_WORK_ID) <MAX_MANORSMAN ){		FMPK_ManorsmanList[ CHAR_getWorkInt( meindex, NPC_WORK_ID)] = meindex;  }  return TRUE;}void NPC_ManorSmanTalked(int meindex, int talkerindex, char *msg, int color){  char buf[4096];  int fd;  int fmpks_pos = CHAR_getWorkInt(meindex, NPC_WORK_ID)*MAX_SCHEDULE;  if (NPC_Util_CharDistance(meindex, talkerindex) > 2) return;  if (!NPC_Util_isFaceToFace(meindex, talkerindex, 2)) return;  fd = getfdFromCharaIndex(talkerindex);  if (fd == -1) return;	if(fmpks[fmpks_pos+1].flag==FMPKS_FLAG_CHALLENGE){		fmpks[fmpks_pos+1].flag=FMPKS_FLAG_NONE;	}  switch (fmpks[fmpks_pos+1].flag) {  case FMPKS_FLAG_NONE:    // 没有约定战斗,此时可以下战书    saacproto_ACFMPointList_send(acfd);#ifdef _MANOR_PKRULE	sprintf(buf, "庄园所有权争夺战的挑战资格\n\n"                 "一、没有拥有庄园的家族\n"	#ifdef _FIX_FAMILY_PK_LIMIT	   // WON ADD 将可挑战庄园的由前十大改为前二十大				 "二、家族排行必需为前二十大家族\n"	#else                 "二、家族排行必需为前十大家族\n"	#endif				 "三、踢馆时间:下午六点至凌晨三点\n\n"                 "请稍待,我将确认你的资格。");#else    sprintf(buf, "庄园所有权争夺战的挑战资格\n\n"                 "一、没有拥有庄园的家族\n"                 "二、家族的声望高於庄园家族的声望\n\n"                 "请稍待,我将确认你的资格。");#endif    lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,	    		WINDOW_BUTTONTYPE_YESNO,    			CHAR_WINDOWTYPE_CHECKMAN_START,    			CHAR_getWorkInt(meindex, CHAR_WORKOBJINDEX),    			buf);    break;  case FMPKS_FLAG_MANOR_PREPARE:    // 目前已经定好战斗,准备中    {      int timeleft=fmpks[fmpks_pos+1].dueltime-NowTime.tv_sec;      int dd,hh,mm;      char buf2[4096];      dd = /*fmpks[fmpks_pos+1].dueltime*/ timeleft / 86400;      hh = /*fmpks[fmpks_pos+1].dueltime*/ timeleft / 3600 - dd*24;      mm = /*fmpks[fmpks_pos+1].dueltime*/ timeleft / 60 - dd*24*60 - hh*60;      memset(buf2,0,sizeof(buf2));      if (dd>0) sprintf(buf, " %d 天", dd); else strcpy(buf, "");      strcat(buf2, buf);      if (hh>0) sprintf(buf, " %d 小时", hh); else strcpy(buf, "");      strcat(buf2, buf);      if (mm>0) sprintf(buf, " %d 分钟", mm); else strcpy(buf, "");      strcat(buf2, buf);      if (strlen(buf2)==0)        sprintf(buf, "庄园所有权争夺战\n『%s VS %s』\n\n"                    "即将开始,请准备入场。",    		fmpks[fmpks_pos+1].guest_name,    		fmpks[fmpks_pos+1].host_name);      else        sprintf(buf, "庄园所有权争夺战\n『%s VS %s』\n\n"                    "预定将在%s後开始。",    		fmpks[fmpks_pos+1].guest_name,    		fmpks[fmpks_pos+1].host_name,    		buf2);      lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,              	    	WINDOW_BUTTONTYPE_OK,    			CHAR_WINDOWTYPE_CHECKMAN_END,    			CHAR_getWorkInt(meindex, CHAR_WORKOBJINDEX),    			buf);    }    break;  case FMPKS_FLAG_MANOR_PEACE:    // 战斗已经结束的和平时期    {      int timeleft=fmpks[fmpks_pos+1].dueltime-NowTime.tv_sec;      int dd,hh,mm;      char buf2[4096];      dd = /*fmpks[fmpks_pos+1].dueltime*/ timeleft / 86400;      hh = /*fmpks[fmpks_pos+1].dueltime*/ timeleft / 3600 - dd*24;      mm = /*fmpks[fmpks_pos+1].dueltime*/ timeleft / 60 - dd*24*60 - hh*60;      strcpy(buf2,"");      if (dd>0) sprintf(buf, " %d 天", dd); else strcpy(buf, "");      strcat(buf2, buf);      if (hh>0) sprintf(buf, " %d 小时", hh); else strcpy(buf, "");      strcat(buf2, buf);      if (mm>0) sprintf(buf, " %d 分钟", mm); else strcpy(buf, "");      strcat(buf2, buf);      if (strlen(buf2)==0)        strcpy(buf, "请稍等,让我准备一下申请踢馆的表格。");      else        sprintf(buf, "现在是休战时期,要踢馆的话\n请%s後再来申请。",buf2);      lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,              	    	WINDOW_BUTTONTYPE_OK,    			CHAR_WINDOWTYPE_CHECKMAN_END,    			CHAR_getWorkInt(meindex, CHAR_WORKOBJINDEX), buf);    }    break;  case FMPKS_FLAG_MANOR_BATTLEBEGIN:    // 目前正在进行踢馆    sprintf(buf, "庄园所有权争夺战\n『%s VS %s』\n\n"                 "开~打~罗~\n还没进场的人赶快进场吧。",    		fmpks[fmpks_pos+1].guest_name,    		fmpks[fmpks_pos+1].host_name);    lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,              	    	WINDOW_BUTTONTYPE_OK,    			CHAR_WINDOWTYPE_CHECKMAN_END,    			CHAR_getWorkInt(meindex, CHAR_WORKOBJINDEX),    			buf);    break;  case FMPKS_FLAG_MANOR_OTHERPLANET:    // 在别的星球进行战斗    sprintf(buf, "庄园所有权争夺战\n『%s VS %s』\n\n"    		 "决斗地点在 %s 。",              fmpks[fmpks_pos+1].guest_name,              fmpks[fmpks_pos+1].host_name,              fmpks[fmpks_pos+2].host_name);    lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,              	    	WINDOW_BUTTONTYPE_OK,    			CHAR_WINDOWTYPE_CHECKMAN_END,    			CHAR_getWorkInt(meindex, CHAR_WORKOBJINDEX),    			buf);    break;  }}void NPC_ManorSmanWindowTalked(int meindex, int talkerindex, int seqno, int select, char *data){  int fd, fmpks_pos, manorid, tkfmindex, tkfmdp;  char buf[4096],token[256];  int hadfmindex;#ifndef _ACFMPK_LIST  char hadfmname[256];#endif  int hadfmpopular;    if (NPC_Util_CharDistance(meindex,talkerindex) > 2) return;  if (!NPC_Util_isFaceToFace(meindex, talkerindex, 2)) return;  fd = getfdFromCharaIndex(talkerindex);  if (fd == -1) return;  fmpks_pos = CHAR_getWorkInt(meindex, NPC_WORK_ID)*MAX_SCHEDULE;  manorid = CHAR_getWorkInt(meindex, NPC_WORK_MANORID);  tkfmindex = CHAR_getWorkInt(talkerindex, CHAR_WORKFMINDEXI);  tkfmdp = CHAR_getWorkInt(talkerindex, CHAR_WORKFMDP);  getStringFromIndexWithDelim(fmpointlist.pointlistarray[manorid-1], "|", 5, token, sizeof(token));  hadfmindex = atoi(token);  getStringFromIndexWithDelim(fmpointlist.pointlistarray[manorid-1], "|", 7, token, sizeof(token));  hadfmpopular = atoi(token);    switch (seqno){  case CHAR_WINDOWTYPE_CHECKMAN_START:    if (select==WINDOW_BUTTONTYPE_YES){#ifdef _FMVER21      		  if ((CHAR_getInt(talkerindex,CHAR_FMLEADERFLAG)==FMMEMBER_LEADER) &&#else      if ((CHAR_getInt(talkerindex,CHAR_FMLEADERFLAG)==1) &&#endif      				(CHAR_getWorkInt(talkerindex, CHAR_WORKFMSETUPFLAG)==1)){        if (hadfmindex != -1) {          if (hadfmindex-1 != tkfmindex){            int check=0,i;#ifdef _FM_POINT_PK						if(strcmp(getFmPointPK(),"是")){		          // Arminius 2.25 fix: fmpks 中第 1~"MANORNUM" 组一定要给 manorsman	            for (i=0; i<=/*3*/MANORNUM-1; i++) {	// 9个庄园	              getStringFromIndexWithDelim(fmpointlist.pointlistarray[i], "|", 5, token, sizeof(token));	              if (tkfmindex==atoi(token)-1) check=1;	            }	          }#else   					// Arminius 2.25 fix: fmpks 中第 1~"MANORNUM" 组一定要给 manorsman            for (i=0; i<MANORNUM; i++) {	// 9个庄园              getStringFromIndexWithDelim(fmpointlist.pointlistarray[i], "|", 5, token, sizeof(token));              if (tkfmindex==atoi(token)-1) check=1;            }#endif            for (i=1; i<=/*4*/MANORNUM; i++) {	// 是否已经挑战其他庄园              if ((fmpks[i*MAX_SCHEDULE+1].guest_index==tkfmindex) &&								(strcmp(fmpks[i*MAX_SCHEDULE+1].guest_name,								CHAR_getChar(talkerindex, CHAR_FMNAME))==0)								) {                check=2;              }            }            if (check==0){							int won1;#ifdef _MANOR_PKRULE		    // WON ADD 2002/01/22	//-----------------------------------------						int i;						char won2[256];						won1 = 0;	#ifdef _FIX_FAMILY_PK_LIMIT	   // WON ADD 将可挑战庄园的由前十大改为前二十大								for(i=0; i< PK_LIMIT; i++){	#else						for(i=0; i<10; i++){	#endif							if( getStringFromIndexWithDelim( fmdptop.topmemo[i], "|", 3, won2, sizeof(won2)) == FALSE )	{								print("err Get fmdptop.topmemo[%d] if FALSE !!\n", i);								break;							}							if( strcmp(CHAR_getChar(talkerindex, CHAR_FMNAME) ,won2) == 0 ){								won1= 1;								break;							}	//-----------------------------------------						}							if(won1 == 1){				// WON END							sprintf(buf,"庄园挑战会有一天的准备期\n"													"你可以随时询问我以得知剩下的时间\n"													"挑战结束後不论胜负将会有二天的休战期\n"													"休战期间不能挑战\n\n"													"你确定要挑战这个庄园吗?");#else              if(tkfmdp >= hadfmpopular){								sprintf(buf,"庄园挑战会有一天的准备期\n"                            "你可以随时询问我以得知剩下的时间\n"												    "挑战结束後不论胜负将会有五天的休战期\n"														"休战期间不能挑战\n\n"														"你确定要挑战这个庄园吗?");#endif                lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,              	    							WINDOW_BUTTONTYPE_YESNO,    															CHAR_WINDOWTYPE_CHECKMAN_MAIN,    															CHAR_getWorkInt(meindex, CHAR_WORKOBJINDEX),    															buf);    					}

⌨️ 快捷键说明

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