401 lines
12 KiB
JavaScript
401 lines
12 KiB
JavaScript
import GameModel from "../ts/core/GameModel";
|
|
import SKDataUtil from "../ts/gear_2.3.4/util/SKDataUtil";
|
|
|
|
let CPubFunction = require('./PubFunction');
|
|
let EEventType =
|
|
{
|
|
PlayerTalkNpc: 1,
|
|
PlayerKillNpc: 2,
|
|
PlayerGatherNpc: 3,
|
|
PlayerDoAction: 4,
|
|
PlayerArriveArea: 5,
|
|
PlayerGiveNpcItem: 6,
|
|
FailEventPlayerDead: 11,
|
|
FailEventTimeOut: 12,
|
|
};
|
|
|
|
let ETaskKind =
|
|
{
|
|
EStory: 1,
|
|
EDaily: 2,
|
|
EFuBen: 3,
|
|
};
|
|
|
|
let EState =
|
|
{
|
|
ELock: 0,
|
|
EDoing: 1,
|
|
EDone: 2,
|
|
EFaild: 3,
|
|
};
|
|
|
|
|
|
|
|
class CEventBase {
|
|
constructor() {
|
|
this.nEventType = 0;
|
|
this.strTip = '';
|
|
this.vecPrize = [];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------- 對話 ---------------//
|
|
|
|
|
|
|
|
class CEventTalkNpc extends CEventBase {
|
|
constructor() {
|
|
super();
|
|
this.vecCreateNpc = [];
|
|
this.nNpcConfigID = 0;
|
|
this.vecSpeak = [];
|
|
this.bAutoTrigle = 0;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
//--------------------- 採集Npc ---------------//
|
|
|
|
class CGatherNpc extends CEventBase {
|
|
constructor() {
|
|
super();
|
|
this.vecCreateNpc = [];
|
|
this.vecNpc = [];
|
|
}
|
|
}
|
|
|
|
|
|
//--------------------- 在指定區域做動作 ---------------//
|
|
|
|
class CDoActionInArea extends CEventBase {
|
|
constructor() {
|
|
super();
|
|
this.nMap = 0;
|
|
this.nX = 0;
|
|
this.nY = 0;
|
|
this.strAction;
|
|
this.strTalk = '';
|
|
}
|
|
}
|
|
|
|
//--------------------- 到達區域 ---------------//
|
|
|
|
class CArriveArea extends CEventBase {
|
|
constructor() {
|
|
super();
|
|
this.nMap = 0;
|
|
this.nX = 0;
|
|
this.nY = 0;
|
|
}
|
|
}
|
|
|
|
|
|
//--------------------- 給Npc物品 ---------------//
|
|
|
|
class CGiveNpcItem extends CEventBase {
|
|
constructor() {
|
|
super();
|
|
this.nItemID = 0;
|
|
this.nNum = 0;
|
|
this.nFromNpc;
|
|
this.nNpcConfigID;
|
|
}
|
|
}
|
|
|
|
//--------------------- 殺死Npc ---------------//
|
|
|
|
class CKillDynamicNpc extends CEventBase {
|
|
constructor() {
|
|
super();
|
|
this.vecCreateNpc = [];
|
|
this.vecNpc = [];
|
|
this.bAutoTrigle = 0;
|
|
}
|
|
}
|
|
|
|
|
|
//--------------------- 失敗事件:玩家死亡 ---------------//
|
|
|
|
class CFailEventPlayerDead extends CEventBase {
|
|
|
|
constructor() {
|
|
super();
|
|
this.nEventType = EEventType.FailEventPlayerDead;
|
|
this.nDeadCnt = 1;
|
|
}
|
|
}
|
|
|
|
|
|
//--------------------- 失敗事件:超時 ---------------//
|
|
|
|
class CFailEventTimeOut extends CEventBase {
|
|
constructor() {
|
|
super();
|
|
this.nEventType = EEventType.FailEventTimeOut;
|
|
this.nMaxTime = 60;
|
|
}
|
|
}
|
|
|
|
|
|
/**********************************************************************/
|
|
|
|
class CTask {
|
|
constructor() {
|
|
this.nTaskID = 0;
|
|
this.nKind = 0;
|
|
this.nTaskGrop = 0;
|
|
this.nDailyCnt = 0;
|
|
this.strTaskName = '';
|
|
this.vecLimit = [];
|
|
this.vecEvent = []; //事件列表
|
|
this.vecFailEvent = [];
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/*********************************** 任務配置信息 ***********************************/
|
|
|
|
class CConfigTaskMgr {
|
|
constructor() {
|
|
this.mapConfigTask = {};
|
|
// this.InitAllTask();
|
|
}
|
|
|
|
|
|
GetTaskEventCreateNpc(vecString) {
|
|
let vecData = [];
|
|
if(!vecString){
|
|
return vecData;
|
|
}
|
|
if(SKDataUtil.isArray(vecString)){
|
|
for(let item of vecString){
|
|
if(typeof(item)!="string"){
|
|
continue;
|
|
}
|
|
let vecTmp = item.split(",");
|
|
if (vecTmp.length != 4){
|
|
continue;
|
|
}
|
|
vecData.push({ nNpc: vecTmp[0], nMap: vecTmp[1], nX: vecTmp[2], nY: vecTmp[3] });
|
|
}
|
|
}else{
|
|
cc.log(`$警告:${vecString}不是數組!`);
|
|
}
|
|
return vecData;
|
|
}
|
|
|
|
|
|
GetDailyMaxCnt(nGrop) {
|
|
if (nGrop == 2 || nGrop == 3)
|
|
return 20;
|
|
|
|
if (nGrop == 4)
|
|
return 15;
|
|
|
|
if (nGrop == 5)
|
|
return 5;
|
|
|
|
if (nGrop == 6)
|
|
return 120;
|
|
|
|
if (nGrop == 7)
|
|
return 40;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
StringVecorToDataVector(vecString) {
|
|
let vecData = [];
|
|
if(!vecString){
|
|
return vecData;
|
|
}
|
|
if(SKDataUtil.isArray(vecString)){
|
|
for (let item of vecString){
|
|
if(typeof(item) != "string"){
|
|
cc.warn(`$警告:解析錯誤非字符串:${item}`);
|
|
continue;
|
|
}
|
|
let vecTmp = item.split(":");
|
|
if (vecTmp.length < 2){
|
|
cc.warn(`$警告:解析錯誤缺少:號${item}`);
|
|
continue;
|
|
}
|
|
vecData.push({ nKey: vecTmp[0], nValue: vecTmp[1] });
|
|
}
|
|
}else{
|
|
cc.log(`$警告:${vecString}不是數組!`);
|
|
}
|
|
return vecData;
|
|
}
|
|
|
|
AddTask(nKind, stTask) {
|
|
if (this.mapConfigTask.hasOwnProperty(nKind) == false)
|
|
this.mapConfigTask[nKind] = [];
|
|
this.mapConfigTask[nKind].push(stTask);
|
|
}
|
|
|
|
InitAllTask() {
|
|
for (const itTask in GameModel.conf_task) {
|
|
if (itTask == 'datatype')
|
|
continue;
|
|
const stData = GameModel.conf_task[itTask];
|
|
let stTask = new CTask();
|
|
stTask.nTaskID = parseInt(itTask);
|
|
stTask.nKind = stData.nKind;
|
|
stTask.strTaskName = stData.strName;
|
|
stTask.nTaskGrop = CPubFunction.GetDefault(stData.nTaskGrop, 0);
|
|
stTask.nDailyCnt = CPubFunction.GetDefault(stData.nDailyCnt, 0);
|
|
for (let nIndex in stData.vecEvent) {
|
|
if (stData.vecEvent[nIndex].nEventType == EEventType.PlayerTalkNpc) //對話
|
|
{
|
|
let stTalk = new CEventTalkNpc();
|
|
stTalk.nEventType = EEventType.PlayerTalkNpc;
|
|
stTalk.vecPrize = this.StringVecorToDataVector(stData.vecEvent[nIndex].vecPrize);
|
|
stTalk.strTip = stData.vecEvent[nIndex].strTip;
|
|
stTalk.vecCreateNpc = this.GetTaskEventCreateNpc(stData.vecEvent[nIndex].vecCreateNpc);
|
|
stTalk.vecNpc = stData.vecEvent[nIndex].vecNpc.slice(0);
|
|
stTalk.vecSpeak = this.StringVecorToDataVector(stData.vecEvent[nIndex].vecSpeak);
|
|
stTalk.bAutoTrigle = CPubFunction.GetDefault(stData.vecEvent[nIndex].bAutoTrigle, 0);
|
|
stTask.vecEvent.push(stTalk);
|
|
}
|
|
|
|
if (stData.vecEvent[nIndex].nEventType == EEventType.PlayerGatherNpc) {
|
|
let stGather = new CGatherNpc();
|
|
stGather.nEventType = EEventType.PlayerGatherNpc;
|
|
stGather.strTip = stData.vecEvent[nIndex].strTip;
|
|
stGather.vecPrize = this.StringVecorToDataVector(stData.vecEvent[nIndex].vecPrize);
|
|
stGather.vecCreateNpc = this.GetTaskEventCreateNpc(stData.vecEvent[nIndex].vecCreateNpc);
|
|
stGather.vecNpc = stData.vecEvent[nIndex].vecNpc.slice(0);
|
|
stTask.vecEvent.push(stGather);
|
|
}
|
|
|
|
if (stData.vecEvent[nIndex].nEventType == EEventType.PlayerDoAction) {
|
|
let stAction = new CDoActionInArea();
|
|
stAction.nEventType = EEventType.PlayerDoAction;
|
|
stAction.vecPrize = this.StringVecorToDataVector(stData.vecEvent[nIndex].vecPrize);
|
|
stAction.strTip = stData.vecEvent[nIndex].strTip;
|
|
stAction.nMap = stData.vecEvent[nIndex].nMap;
|
|
stAction.nX = stData.vecEvent[nIndex].nX;
|
|
stAction.nY = stData.vecEvent[nIndex].nY;
|
|
stAction.strAction = stData.vecEvent[nIndex].strAction;
|
|
stAction.strTalk = stData.vecEvent[nIndex].strTalk;
|
|
stTask.vecEvent.push(stAction);
|
|
}
|
|
|
|
if (stData.vecEvent[nIndex].nEventType == EEventType.PlayerArriveArea) {
|
|
let stAction = new CArriveArea();
|
|
stAction.nEventType = EEventType.PlayerArriveArea;
|
|
stAction.vecPrize = this.StringVecorToDataVector(stData.vecEvent[nIndex].vecPrize);
|
|
stAction.strTip = stData.vecEvent[nIndex].strTip;
|
|
stAction.nMap = stData.vecEvent[nIndex].nMap;
|
|
stAction.nX = stData.vecEvent[nIndex].nX;
|
|
stAction.nY = stData.vecEvent[nIndex].nY;
|
|
stTask.vecEvent.push(stAction);
|
|
}
|
|
|
|
if (stData.vecEvent[nIndex].nEventType == EEventType.PlayerGiveNpcItem) {
|
|
let stAction = new CGiveNpcItem();
|
|
stAction.nEventType = EEventType.PlayerGiveNpcItem;
|
|
stAction.vecPrize = this.StringVecorToDataVector(stData.vecEvent[nIndex].vecPrize);
|
|
stAction.strTip = stData.vecEvent[nIndex].strTip;
|
|
stAction.nItemID = stData.vecEvent[nIndex].nItemID;
|
|
stAction.nNum = stData.vecEvent[nIndex].nNum;
|
|
stAction.nFromNpc = stData.vecEvent[nIndex].nFromNpc;
|
|
stAction.nNpcConfigID = stData.vecEvent[nIndex].nToNpc;
|
|
stAction.strTip2 = stData.vecEvent[nIndex].strTip2;
|
|
stTask.vecEvent.push(stAction);
|
|
}
|
|
|
|
if (stData.vecEvent[nIndex].nEventType == EEventType.PlayerKillNpc) {
|
|
let stEvent = new CKillDynamicNpc();
|
|
stEvent.nEventType = EEventType.PlayerKillNpc;
|
|
stEvent.vecPrize = this.StringVecorToDataVector(stData.vecEvent[nIndex].vecPrize);
|
|
stEvent.strTip = stData.vecEvent[nIndex].strTip;
|
|
stEvent.vecCreateNpc = this.GetTaskEventCreateNpc(stData.vecEvent[nIndex].vecCreateNpc);
|
|
stEvent.vecNpc = stData.vecEvent[nIndex].vecNpc.slice(0);
|
|
stEvent.bAutoTrigle = stData.vecEvent[nIndex].bAutoTrigle;
|
|
stTask.vecEvent.push(stEvent);
|
|
}
|
|
}
|
|
|
|
for (let nIndex in stData.vecFailEvent) {
|
|
if (stData.vecFailEvent[nIndex].nEventType == EEventType.FailEventPlayerDead) {
|
|
let stEvent = new CFailEventPlayerDead();
|
|
stTask.vecFailEvent.push(stEvent);
|
|
}
|
|
|
|
if (stData.vecFailEvent[nIndex].nEventType == EEventType.FailEventTimeOut) {
|
|
let stEvent = new CFailEventTimeOut();
|
|
stTask.vecFailEvent.push(stEvent);
|
|
}
|
|
}
|
|
stTask.vecLimit = this.StringVecorToDataVector(stData.vecLimit);
|
|
this.AddTask(stTask.nKind, stTask);
|
|
}
|
|
}
|
|
|
|
GetTaskInfo(nTaskID) {
|
|
if (CPubFunction.GetMapLen(this.mapConfigTask) <= 0) {
|
|
this.InitAllTask();
|
|
}
|
|
for (let nKind in this.mapConfigTask) {
|
|
let vecTask = this.mapConfigTask[nKind];
|
|
|
|
for (let nIndex in vecTask) {
|
|
if (vecTask[nIndex].nTaskID == nTaskID)
|
|
return vecTask[nIndex];
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
|
|
GetTaskStepInfo(nTaskID, nStep) {
|
|
let stTaskConfig = this.GetTaskInfo(nTaskID);
|
|
if (null == stTaskConfig)
|
|
return null;
|
|
|
|
if (nStep < 0 || nStep >= stTaskConfig.vecEvent.length)
|
|
return null;
|
|
|
|
return stTaskConfig.vecEvent[nStep];
|
|
}
|
|
|
|
|
|
GetFailEventInfo(nTaskID, nStep) {
|
|
let stTaskConfig = this.GetTaskInfo(nTaskID);
|
|
if (null == stTaskConfig)
|
|
return null;
|
|
|
|
if (nStep < 0 || nStep >= stTaskConfig.vecFailEvent.length)
|
|
return null;
|
|
|
|
return stTaskConfig.vecFailEvent[nStep];
|
|
}
|
|
|
|
|
|
IsTeamTask(nTaskID) {
|
|
|
|
if (nTaskID >= 500)
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
let g_pTaskConfigMgr = null;
|
|
|
|
module.exports = (() => {
|
|
if (g_pTaskConfigMgr == null) {
|
|
g_pTaskConfigMgr = new CConfigTaskMgr();
|
|
}
|
|
return { g_pTaskConfigMgr, CTask, CGatherNpc, CEventTalkNpc, EEventType, ETaskKind, EState };
|
|
})(); |