Files
fc/dev/project/library/imports/09/09c96c86-c5ee-4f98-998b-d2c620992cc7.js
2026-05-24 10:21:26 +08:00

375 lines
9.2 KiB
JavaScript

"use strict";
cc._RF.push(module, '09c96yGxe5PmJmL0sYgmSzH', 'plot.mod');
// Scripts/mod/plot/plot.mod.js
"use strict";
/*******************************************************************************
*
* 剧情管理
*
*
*
* 2023.06.25
******************************************************************************/
var BridgeController = require("bridge.controller");
var PDF = require("plot.define");
var TDefine = require("trace.define");
var TTT = TDefine.TraceType;
var PlotManager = cc.Class({
"extends": BridgeController,
// 初始化配置数据
initConfig: function initConfig() {
this.units = {};
// 插件
nx.plugin.add(this, ["view"]);
// 视图创建
this.vbuild(PDF.ViewPlot);
// 全局支持
nx.bridge.plot = this;
},
// 注册监听事件
registerEvents: function registerEvents() {},
// 注册协议接受事件
registerProtocals: function registerProtocals() {
// 前端准备完毕
this.RegisterProtocal(10371, this.onCommited.bind(this));
this.RegisterProtocal(10372, this.onPlotData.bind(this));
},
// 从服务器初始化数据
reqBaseFromServer: function reqBaseFromServer(_cb) {
// 如果当前正在引导,则不重建
if (this.isDoing()) {
nx.dt.fnInvoke(_cb, true);
return;
}
this.rebuild(function (_ret, _data) {
nx.dt.fnInvoke(_cb, _ret, _data);
// 掉线重新激活
if (nx.bridge.mainui) {
nx.bridge.mainui.tryPlot();
}
});
},
// 系统重建
rebuild: function rebuild(_cb) {
var _this = this;
// 清理
this.records = {};
this.configs = null;
this.vreset();
// 开关
var open = nx.storage.getNumber(PDF.KEY_PLOT_OPEN, 1, true);
this.opened = open == 1;
// 重读配置
var path = cc.path.join("configs/plots", "catalogs");
nx.res.loadJson(path, function (_err, _data) {
if (_err) {
nx.error("$Plot:配置加载失败:", path);
nx.dt.fnInvoke(_cb, false);
return;
}
_this.configs = _data;
_this.records = nx.storage.getObject(PDF.KEY_PLOTS, true);
if (nx.dt.objEmpty(_this.records)) {
_this.records = {
ids: []
};
}
_this.reqBaseData(_cb);
});
},
// 请求剧情信息
reqBaseData: function reqBaseData(_cb) {
this.SendProtocal(10372, {}, _cb);
},
// 剧情信息
onPlotData: function onPlotData(_data) {
if (!this.isGoodData(_data)) {
return;
}
var ids = [];
var group = _data.guide_group || [];
group.forEach(function (t) {
ids.push(t.id);
});
this.records.ids = ids;
},
// 上传剧情完成
reqComplete: function reqComplete(_id, _cb) {
// 已经提交过了
if (this.preCommited) {
nx.warn("$Plot:\u5DF2\u7ECF\u63D0\u524D\u5B8C\u6210\u8FC7\u4E86!");
nx.dt.fnInvoke(_cb, true);
return;
}
this.SendProtocal(10371, {
id: _id + ""
}, _cb);
// 埋点
if (nx.mTrace) {
nx.mTrace.trace(TTT.plotDone, _id);
}
},
// 剧情上传
onCommited: function onCommited(_data) {
if (!this.isGoodData(_data)) {
return;
}
this.preCommited = true;
},
// 引导开关
openPlot: function openPlot(_open) {
this.opened = !!_open;
nx.storage.set(PDF.KEY_PLOT_OPEN, _open ? 1 : 0, true);
},
// 剧情触发
fire: function fire(_id, _cb, _force) {
var _this2 = this;
if (_force === void 0) {
_force = false;
}
// 进行中
var cur = this.vget("id");
if (nx.dt.strNEmpty(cur)) {
nx.error("$Plot:进行中,播放失败:", cur, _id);
nx.dt.fnInvoke(_cb, false, "PlotFailed");
return false;
}
// 获取配置
var info = this.queryCfgs(_id);
if (nx.dt.objEmpty(info)) {
nx.dt.fnInvoke(_cb, false, "PlotFailed");
return false;
}
// 剧情不跳过
if (!this.opened && info.type != "dia") {
nx.warn("$Plot:引导未开启");
nx.dt.fnInvoke(_cb, false, "PlotFailed");
return false;
}
// 条件判断
var ret = nx.bridge.checkConditions(info.conditions);
if (nx.dt.objNEmpty(ret) && !_force) {
// nx.warn( "$Plot:不滿足觸發條件:", _id );
nx.dt.fnInvoke(_cb, false, "PlotNoConds");
return false;
}
// 是否触发过
if (nx.dt.arrMember(this.records.ids, _id)) {
nx.warn("$Plot:劇情重複觸發:", _id);
nx.bridge.vset("DailyPop", 1);
nx.dt.fnInvoke(_cb, false, "PlotRepeat");
return false;
}
// 预先标记引导中
this.vset("id", _id, false);
// 载入剧本
var path = cc.path.join("configs/plots/jsons", info.json);
nx.res.loadJson(path, function (_err, _data) {
if (_err) {
_this2.vset("id", "");
nx.error("$Plot:载入剧本失败:", path);
nx.dt.fnInvoke(_cb, false, "PlotFailed");
return;
}
_this2.cbDone = _cb;
_this2.setCurrent(_id, _data);
});
return true;
},
// 强制触发剧情
fireForce: function fireForce(_id, _cb) {
// 从记录删除
nx.dt.arrDelete(this.records.ids, function (m) {
return m == _id;
});
this.fire(_id, _cb, true);
},
// 设置当前剧情
setCurrent: function setCurrent(_id, _json) {
// 清理
var id = "" + _id;
if (nx.dt.strEmpty(id)) {
this.vreset();
return;
}
// 新设置
this.vset("info", _json);
this.vset("skip", _json.skip);
this.vset("total", _json.steps.length);
this.vset("step", -1);
this.vset("id", id);
this.preCommited = false;
nx.debug("$Plot:开始剧情:", id);
// 埋点
if (nx.mTrace) {
nx.mTrace.trace(TTT.plotStart, id);
}
},
// 下一步
next: function next() {
// 剧情完成
var step = this.vget("step") + 1;
if (step >= this.vget("total")) {
this.done();
return;
}
if (CC_DEBUG) {
var info = this.vget("info");
var data = info ? info.steps[step] : null;
console.log("next:", step, data);
}
// 设置
this.vset("step", step);
// 埋点
if (nx.mTrace) {
nx.mTrace.trace(TTT.plotStep, this.vget("id"), step);
}
},
// 引导中
isDoing: function isDoing() {
var id = this.vget("id");
return nx.dt.strNEmpty(id);
},
// 剧情完成
done: function done() {
var _this3 = this;
var id = this.vget("id");
nx.debug("$Plot:引导完成.", id);
// 关闭
this.vreset();
nx.bridge.vset("CloseSpecial", null);
// 存档
this.records.ids.push(id);
nx.storage.setObject(PDF.KEY_PLOTS, this.records, true);
// 尝试一次弹窗
var tryPops = function tryPops() {
if (nx.bridge.popups) {
nx.bridge.popups.tryPopup();
}
};
// 是否有串联剧情
var self = this;
var next = function next() {
var info = self.queryCfgs(id);
if (!info || nx.dt.strEmpty(info.next)) {
tryPops();
return;
}
self.fire(info.next, function (_ret) {
if (!_ret) {
tryPops();
}
});
};
// 上传
this.reqComplete(id, function () {
nx.dt.fnInvoke(_this3.cbDone, true);
_this3.cbDone = null;
next();
});
},
// 获取当前步骤剧本
stepData: function stepData() {
var info = this.vget("info");
var step = this.vget("step");
if (step == -1) {
return null;
}
var data = info ? info.steps[step] : null;
if (nx.dt.objEmpty(data)) {
nx.error("$Plot:获取当前剧本失败:", this.vget("id"), step);
}
return data;
},
// 是否已经解锁
isUnlocked: function isUnlocked(_id) {
return nx.dt.arrMember(this.records.ids, _id);
},
// ============================================================
// 引导元素
// ============================================================
// 注册引导元素
regUnit: function regUnit(_key, _node, _cb) {
var unit = this.units[_key];
if (unit) {
nx.error("$Plot:重复注册元素:", _key);
return;
}
this.units[_key] = {
node: _node,
// 聚焦节点
cb: _cb // 触发回调
};
nx.debug("$Plot:注册元素:", _key);
},
// 注销引导元素
unregUnit: function unregUnit(_key) {
var unit = this.units[_key];
if (unit) {
nx.debug("$Plot:注销元素:", _key);
delete this.units[_key];
}
},
// 查询引导元素
queryUnit: function queryUnit(_key) {
var unit = this.units[_key];
if (!unit) {
nx.error("$Plot:查询元素失败:", _key);
return null;
}
return this.units[_key];
},
// 查询引导配置
queryCfgs: function queryCfgs(_id) {
var key = nx.frame.vget("hMode") ? "H" + _id : _id;
var info = this.configs[key];
if (nx.dt.objEmpty(info)) {
info = this.configs[_id];
}
if (nx.dt.objEmpty(info)) {
nx.error("$Plot:配置缺失:", _id);
return null;
}
return info;
},
// ============================================================
// 剧情事件
// ============================================================
// 发送
postKey: function postKey(_key) {
nx.debug("$Plot:事件 ", _key);
this.vset("key", _key);
}
});
// 模块导出
module.exports = PlotManager;
cc._RF.pop();