mota-js/libs/items.js
2025-03-07 14:55:50 +08:00

483 lines
15 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/// <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)) {
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);
}