📄 npc_manorsman.c
字号:
#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 + -