485 lines
15 KiB
JavaScript
485 lines
15 KiB
JavaScript
/// <reference path="../runtime.d.ts" />
|
||
|
||
"use strict";
|
||
|
||
function items() {
|
||
this._init();
|
||
}
|
||
|
||
////// 初始化 //////
|
||
items.prototype._init = function () {
|
||
this.items = items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a;
|
||
for (var itemId in this.items) {
|
||
this.items[itemId].id = itemId;
|
||
}
|
||
}
|
||
|
||
////// 获得所有道具 //////
|
||
items.prototype.getItems = function () {
|
||
var items = core.clone(this.items);
|
||
var equipInfo = core.getFlag('equipInfo');
|
||
if (equipInfo) {
|
||
for (var id in equipInfo) {
|
||
items[id].equip = core.clone(equipInfo[id]);
|
||
}
|
||
}
|
||
return items;
|
||
}
|
||
|
||
///// 根据道具id,返回属性名:属性值的键值对
|
||
items.prototype.getItemEffectValue = function (itemId, ratio) {
|
||
let effectObj = {};
|
||
const itemEffectEvent = core.material.items[itemId].itemEffectEvent;
|
||
if (!itemEffectEvent) return effectObj;
|
||
const value = itemEffectEvent.value;
|
||
if (!ratio && ratio !== 0) {
|
||
ratio = core.status.thisMap.ratio;
|
||
if (!ratio && ratio !== 0) {
|
||
ratio = 1;
|
||
}
|
||
}
|
||
for (let statusName in value) {
|
||
let statusValue, needRatio;
|
||
const effect = value[statusName];
|
||
if (statusName.endsWith(':o')) {
|
||
needRatio = true;
|
||
statusName = statusName.slice(0, -2);
|
||
}
|
||
if (core.status.hero.hasOwnProperty(statusName)) {
|
||
for (var i = 0; i < itemNum; ++i) {
|
||
try {
|
||
statusValue = eval(effect);
|
||
}
|
||
catch (e) {
|
||
console.error(e);
|
||
}
|
||
if (needRatio) statusValue *= ratio;
|
||
effectObj[statusName] = statusValue;
|
||
}
|
||
}
|
||
}
|
||
return effectObj;
|
||
}
|
||
|
||
|
||
////// “即捡即用类”道具的使用效果 //////
|
||
items.prototype.getItemEffect = function (itemId, itemNum) {
|
||
const itemCls = core.material.items[itemId].cls;
|
||
// 消耗品
|
||
if (itemCls === 'items') {
|
||
const curr_hp = core.status.hero.hp;
|
||
const effectObj = this.getItemEffectValue(itemId);
|
||
for (let statusName in effectObj) {
|
||
if (effectObj.hasOwnProperty(statusName)) core.addStatus(statusName, effectObj[statusName]);
|
||
}
|
||
|
||
const itemEffect = core.material.items[itemId].itemEffect;
|
||
if (itemEffect) {
|
||
try {
|
||
for (var i = 0; i < itemNum; ++i)
|
||
eval(itemEffect);
|
||
}
|
||
catch (e) {
|
||
console.error(e);
|
||
}
|
||
}
|
||
core.status.hero.statistics.hp += core.status.hero.hp - curr_hp;
|
||
|
||
var useItemEvent = core.material.items[itemId].useItemEvent;
|
||
if (useItemEvent) {
|
||
try {
|
||
core.insertAction(useItemEvent);
|
||
}
|
||
catch (e) {
|
||
console.error(e);
|
||
}
|
||
}
|
||
core.updateStatusBar(false, true);
|
||
}
|
||
else {
|
||
core.addItem(itemId, itemNum);
|
||
}
|
||
}
|
||
|
||
////// 获取“即捡即用类”道具会增加哪些属性 //////
|
||
items.prototype.getItemEffectType = function (itemId) {
|
||
if (!core.material.items.hasOwnProperty(itemId)) return [];
|
||
const itemEffectEvent = core.material.items[itemId].itemEffectEvent;
|
||
if (!itemEffectEvent) return [];
|
||
return Object.keys(itemEffectEvent.value).map((statusName) => statusName.endsWith(':o') ? statusName.slice(0, -2) : statusName);
|
||
}
|
||
|
||
////// “即捡即用类”道具的文字提示 //////s
|
||
items.prototype.getItemEffectTip = function (itemId) {
|
||
var itemCls = core.material.items[itemId].cls;
|
||
// 消耗品
|
||
if (itemCls === 'items') {
|
||
var itemEffectTip = core.material.items[itemId].itemEffectTip;
|
||
if (itemEffectTip) {
|
||
try {
|
||
return core.replaceText(itemEffectTip) || "";
|
||
} catch (e) {
|
||
console.error(e);
|
||
return "";
|
||
}
|
||
}
|
||
}
|
||
return "";
|
||
}
|
||
|
||
////// 使用道具 //////
|
||
items.prototype.useItem = function (itemId, noRoute, callback) {
|
||
if (!this.canUseItem(itemId)) {
|
||
if (callback) callback();
|
||
return;
|
||
}
|
||
// 执行道具效果
|
||
this._useItemEffect(itemId);
|
||
// 执行完毕
|
||
this._afterUseItem(itemId);
|
||
// 记录路线
|
||
if (!noRoute) core.status.route.push("item:" + itemId);
|
||
if (callback) callback();
|
||
}
|
||
|
||
items.prototype._useItemEffect = function (itemId) {
|
||
var useItemEffect = core.material.items[itemId].useItemEffect;
|
||
if (useItemEffect) {
|
||
try {
|
||
eval(useItemEffect);
|
||
}
|
||
catch (e) {
|
||
console.error(e);
|
||
}
|
||
}
|
||
var useItemEvent = core.material.items[itemId].useItemEvent;
|
||
if (useItemEvent) {
|
||
try {
|
||
core.insertAction(useItemEvent);
|
||
}
|
||
catch (e) {
|
||
console.error(e);
|
||
}
|
||
}
|
||
}
|
||
|
||
items.prototype._afterUseItem = function (itemId) {
|
||
// 道具使用完毕:删除
|
||
var itemCls = core.material.items[itemId].cls;
|
||
if (itemCls == 'tools')
|
||
core.status.hero.items[itemCls][itemId]--;
|
||
if (core.status.hero.items[itemCls][itemId] <= 0)
|
||
delete core.status.hero.items[itemCls][itemId];
|
||
core.updateStatusBar(false, true);
|
||
}
|
||
|
||
////// 当前能否使用道具 //////
|
||
items.prototype.canUseItem = function (itemId) {
|
||
// 没有道具
|
||
if (!core.hasItem(itemId)) return false;
|
||
|
||
var canUseItemEffect = core.material.items[itemId].canUseItemEffect;
|
||
if (canUseItemEffect) {
|
||
try {
|
||
return eval(canUseItemEffect);
|
||
}
|
||
catch (e) {
|
||
console.error(e);
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
|
||
////// 获得某个物品的个数 //////
|
||
items.prototype.itemCount = function (itemId) {
|
||
if (!core.material.items[itemId] || !core.isPlaying()) return 0;
|
||
var itemCls = core.material.items[itemId].cls;
|
||
if (itemCls == "items") return 0;
|
||
return core.status.hero.items[itemCls][itemId] || 0;
|
||
}
|
||
|
||
////// 是否存在某个物品 //////
|
||
items.prototype.hasItem = function (itemId) {
|
||
return this.itemCount(itemId) > 0;
|
||
}
|
||
|
||
////// 是否装备某件装备 //////
|
||
items.prototype.hasEquip = function (itemId) {
|
||
if (!(core.material.items[itemId] || {}).equip || !core.isPlaying()) return null;
|
||
|
||
for (var i in core.status.hero.equipment)
|
||
if (core.status.hero.equipment[i] == itemId)
|
||
return true;
|
||
return false
|
||
}
|
||
|
||
////// 获得某个装备类型的当前装备 //////
|
||
items.prototype.getEquip = function (equipType) {
|
||
return core.status.hero.equipment[equipType] || null;
|
||
}
|
||
|
||
////// 设置某个物品的个数 //////
|
||
items.prototype.setItem = function (itemId, itemNum) {
|
||
itemNum = itemNum || 0;
|
||
var itemCls = core.material.items[itemId].cls;
|
||
if (itemCls == 'items') return;
|
||
|
||
core.status.hero.items[itemCls][itemId] = itemNum;
|
||
if (core.status.hero.items[itemCls][itemId] <= 0) {
|
||
delete core.status.hero.items[itemCls][itemId];
|
||
}
|
||
core.updateStatusBar();
|
||
}
|
||
|
||
////// 增加某个物品的个数 //////
|
||
items.prototype.addItem = function (itemId, itemNum) {
|
||
if (itemNum == null) itemNum = 1;
|
||
var itemData = core.material.items[itemId];
|
||
var itemCls = itemData.cls;
|
||
if (itemCls == 'items') return;
|
||
if (core.status.hero.items[itemCls][itemId] == null) {
|
||
core.status.hero.items[itemCls][itemId] = 0;
|
||
}
|
||
core.status.hero.items[itemCls][itemId] += itemNum;
|
||
if (core.status.hero.items[itemCls][itemId] <= 0) {
|
||
delete core.status.hero.items[itemCls][itemId];
|
||
}
|
||
// 永久道具只能有一个
|
||
if (itemCls == 'constants' && core.status.hero.items[itemCls][itemId] > 1)
|
||
core.status.hero.items[itemCls][itemId] = 1;
|
||
core.updateStatusBar();
|
||
}
|
||
|
||
////// 删除某个物品 //////
|
||
items.prototype.removeItem = function (itemId, itemNum) {
|
||
if (itemNum == null) itemNum = 1;
|
||
if (!core.hasItem(itemId)) return false;
|
||
var itemCls = core.material.items[itemId].cls;
|
||
core.status.hero.items[itemCls][itemId] -= itemNum;
|
||
if (core.status.hero.items[itemCls][itemId] <= 0) {
|
||
delete core.status.hero.items[itemCls][itemId];
|
||
}
|
||
core.updateStatusBar();
|
||
return true;
|
||
}
|
||
|
||
// ---------- 装备相关 ------------ //
|
||
|
||
items.prototype.getEquipTypeByName = function (name) {
|
||
var names = core.status.globalAttribute.equipName;
|
||
var types = [];
|
||
for (var i = 0; i < names.length; ++i) {
|
||
if (names[i] === name) {
|
||
types.push(i);
|
||
if (!core.status.hero.equipment[i]) return i;
|
||
}
|
||
}
|
||
return types.length == 1 ? types[0] : -1;
|
||
}
|
||
|
||
items.prototype.getEquipTypeById = function (equipId) {
|
||
var type = core.material.items[equipId].equip.type;
|
||
if (typeof type == 'string')
|
||
type = this.getEquipTypeByName(type);
|
||
return type;
|
||
}
|
||
|
||
// 当前能否撞上某装备
|
||
items.prototype.canEquip = function (equipId, hint) {
|
||
// 装备是否合法
|
||
var equip = core.material.items[equipId] || {};
|
||
if (!equip.equip) {
|
||
if (hint) {
|
||
core.playSound('操作失败');
|
||
core.drawTip("不合法的装备!");
|
||
}
|
||
return false;
|
||
}
|
||
|
||
// 是否拥有该装备
|
||
if (!core.hasItem(equipId) && !core.hasEquip(equipId)) {
|
||
if (hint) {
|
||
core.playSound('操作失败');
|
||
core.drawTip("你当前没有" + equip.name + ",无法换装");
|
||
}
|
||
return false;
|
||
}
|
||
|
||
// 可装备条件
|
||
var canUseItemEffect = core.material.items[equipId].canUseItemEffect;
|
||
if (canUseItemEffect) {
|
||
try {
|
||
if (!eval(canUseItemEffect)) {
|
||
if (hint) {
|
||
core.playSound('操作失败');
|
||
core.drawTip("当前不可换上" + equip.name);
|
||
}
|
||
return false;
|
||
}
|
||
}
|
||
catch (e) {
|
||
console.error(e);
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
////// 换上 //////
|
||
items.prototype.loadEquip = function (equipId, callback) {
|
||
if (!this.canEquip(equipId, true)) {
|
||
if (callback) callback();
|
||
return;
|
||
}
|
||
|
||
var loadEquip = core.material.items[equipId] || {};
|
||
var type = this.getEquipTypeById(equipId);
|
||
if (type < 0) {
|
||
core.playSound('操作失败');
|
||
core.drawTip("当前没有" + loadEquip.equip.type + "的空位!");
|
||
if (callback) callback();
|
||
return;
|
||
}
|
||
|
||
this._realLoadEquip(type, equipId, core.status.hero.equipment[type], callback);
|
||
}
|
||
|
||
////// 卸下 //////
|
||
items.prototype.unloadEquip = function (equipType, callback) {
|
||
var unloadEquipId = core.status.hero.equipment[equipType];
|
||
if (!unloadEquipId) {
|
||
if (callback) callback();
|
||
return;
|
||
}
|
||
|
||
this._realLoadEquip(equipType, null, unloadEquipId, callback);
|
||
}
|
||
|
||
items.prototype.compareEquipment = function (compareEquipId, beComparedEquipId) {
|
||
var result = { "value": {}, "percentage": {} };
|
||
var first = core.material.items[compareEquipId], second = core.material.items[beComparedEquipId];
|
||
for (var one in result) {
|
||
for (var name in core.status.hero) {
|
||
if (typeof core.status.hero[name] == 'number') {
|
||
var ans = 0;
|
||
if (first) ans += ((first.equip || {})[one] || {})[name] || 0;
|
||
if (second) ans -= ((second.equip || {})[one] || {})[name] || 0;
|
||
if (ans != 0) result[one][name] = ans;
|
||
}
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
////// 实际换装的效果 //////
|
||
items.prototype._loadEquipEffect = function (equipId, unloadEquipId) {
|
||
// 比较能力值
|
||
var result = core.compareEquipment(equipId, unloadEquipId);
|
||
|
||
for (var name in result.percentage)
|
||
core.addBuff(name, result.percentage[name] / 100);
|
||
|
||
for (var name in result.value)
|
||
core.status.hero[name] += result.value[name];
|
||
}
|
||
|
||
items.prototype._realLoadEquip = function (type, loadId, unloadId, callback) {
|
||
var loadEquip = core.material.items[loadId] || {}, unloadEquip = core.material.items[unloadId] || {};
|
||
|
||
// --- 音效
|
||
this._realLoadEquip_playSound();
|
||
|
||
// --- 实际换装
|
||
this._loadEquipEffect(loadId, unloadId);
|
||
|
||
// --- 加减
|
||
if (loadId) core.removeItem(loadId);
|
||
if (unloadId) core.addItem(unloadId);
|
||
core.status.hero.equipment[type] = loadId || null;
|
||
|
||
// --- 提示
|
||
if (loadId) core.drawTip("已装备上" + loadEquip.name, loadId);
|
||
else if (unloadId) core.drawTip("已卸下" + unloadEquip.name, unloadId);
|
||
|
||
if (callback) callback();
|
||
}
|
||
|
||
items.prototype._realLoadEquip_playSound = function () {
|
||
if (core.hasFlag("__quickLoadEquip__")) return;
|
||
core.stopSound();
|
||
core.playSound('穿脱装备');
|
||
}
|
||
|
||
////// 保存装备 //////
|
||
items.prototype.quickSaveEquip = function (index) {
|
||
var saveEquips = core.getFlag("saveEquips", []);
|
||
saveEquips[index] = core.clone(core.status.hero.equipment);
|
||
core.setFlag("saveEquips", saveEquips);
|
||
core.status.route.push("saveEquip:" + index);
|
||
core.drawTip("已保存" + index + "号套装");
|
||
}
|
||
|
||
////// 读取装备 //////
|
||
items.prototype.quickLoadEquip = function (index) {
|
||
var current = core.getFlag("saveEquips", [])[index];
|
||
if (!current) {
|
||
core.playSound('操作失败');
|
||
core.drawTip(index + "号套装不存在");
|
||
return;
|
||
}
|
||
// 检查所有的装备
|
||
var equipSize = core.status.globalAttribute.equipName.length;
|
||
for (var i = 0; i < equipSize; i++) {
|
||
var v = current[i];
|
||
if (v && !this.canEquip(v, true))
|
||
return;
|
||
}
|
||
core.status.route.push("loadEquip:" + index);
|
||
core.setFlag("__quickLoadEquip__", true);
|
||
// 快速换装
|
||
var toEquip = [];
|
||
for (var i = 0; i < equipSize; i++) {
|
||
var now = core.status.hero.equipment[i];
|
||
// --- 只考虑diff的装备
|
||
var to = current[i];
|
||
if (now != to) {
|
||
toEquip.push(to || null);
|
||
if (now) {
|
||
this.unloadEquip(i);
|
||
}
|
||
}
|
||
}
|
||
for (var i in toEquip) {
|
||
var to = toEquip[i];
|
||
if (to) {
|
||
this.loadEquip(to);
|
||
}
|
||
}
|
||
core.removeFlag("__quickLoadEquip__");
|
||
this._realLoadEquip_playSound();
|
||
|
||
core.drawTip("成功换上" + index + "号套装");
|
||
}
|
||
|
||
////// 设置装备属性 //////
|
||
items.prototype.setEquip = function (equipId, valueType, name, value, operator, prefix) {
|
||
var equip = core.material.items[equipId];
|
||
if (!equip || equip.cls != 'equips') return;
|
||
var equipInfo = equip.equip || {};
|
||
if (!equipInfo[valueType]) equipInfo[valueType] = {};
|
||
var toEquipInfo = core.clone(equipInfo);
|
||
toEquipInfo[valueType][name] = core.events._updateValueByOperator(core.calValue(value, prefix), equipInfo[valueType][name], operator);
|
||
// 如果是穿上状态,则还需要直接修改当前数值
|
||
if (core.hasEquip(equipId)) {
|
||
// 设置一个临时装备,然后模拟换装操作
|
||
var tempId = 'temp:' + equipId;
|
||
core.material.items[tempId] = { 'cls': 'equips', 'equip': core.clone(toEquipInfo) };
|
||
this._loadEquipEffect(tempId, equipId);
|
||
delete core.material.items[tempId];
|
||
core.updateStatusBar();
|
||
}
|
||
equip.equip = core.clone(toEquipInfo);
|
||
flags.equipInfo = flags.equipInfo || {};
|
||
flags.equipInfo[equipId] = core.clone(toEquipInfo);
|
||
}
|