Files
wsmud/os/char/chara_equip.js
2026-05-26 16:41:20 +08:00

176 lines
5.0 KiB
JavaScript

require("./character.js");
CHARACTER.prototype.set_objects = function () {
if (!arguments.length) return;
if (!this.items) this.items = [];
for (var i = 0; i < arguments.length; i++) {
var item = arguments[i];
var obj = OBJ.CREATE(item[0], item[1]);
if (!obj) continue;
if (item[2] && obj.is_equipment) {
if (!this.equipment) this.equipment = []
this.equipment[obj.eq_type] = obj;
} else {
this.items.push(obj);
}
}
}
CHARACTER.prototype.unequip = function (obj, notsend, recover_time = 0) {
if (!obj || !obj.is_equipment || !this.equipment) return;
if (obj.uneq(this, notsend) == false) {
return false;
}
if (obj != this.equipment[obj.eq_type]) return;
if (!this.items) this.items = [];
this.items.push(obj);
this.equipment[obj.eq_type] = null;
if (obj.eq_type == EQUIP_TYPE.WEAPON) {
this.remove_status('weapon', true);
if (obj.is_shortcut) {
this.send("{type:'addAction',id:'" + obj.id + "',name:'" + obj.name + "'}");
}
}
if (obj.eq_type === EQUIP_TYPE.WEAPON)
this.weapon_changed(false);
this.recount();
if (recover_time > 0 && this.is_player) {
this.set_temp('eq_wea', obj.id, 60000);
}
}
CHARACTER.prototype.equip = function (obj) {
if (!obj || !obj.is_equipment) return;
if (!this.equipment) this.equipment = []
var equiped = this.equipment[obj.eq_type];
if (equiped == obj) {
return;
}
if (equiped) {
equiped.uneq(this);
this.equipment[equiped.eq_type] = null;
this.items.push(equiped);
if (equiped.eq_type == EQUIP_TYPE.WEAPON) {
this.remove_status('weapon', true);
}
if (equiped.on_use) {
equiped.notify_action(this, false);
}
if (equiped.is_shortcut) {
this.send("{type:'addAction',id:'" + equiped.id + "',name:'" + equiped.name + "'}");
}
}
if (obj.eq(this) == false) {
if (equiped) {
if (obj.eq_type === EQUIP_TYPE.WEAPON)
this.weapon_changed(false);
this.recount();
}
return false;
}
this.items.remove(obj);
this.equipment[obj.eq_type] = obj;
if (obj.eq_type === EQUIP_TYPE.WEAPON)
this.weapon_changed(true);
this.recount();
if (obj.is_shortcut) {
this.send("{type:'removeAction',id:'" + obj.id + "'}");
}
if (obj.eq_type == EQUIP_TYPE.WEAPON) {
if (this.fight_type) {
this.release_time = 3000 + Date.now();
this.send('{type:"dispfm",rtime:3000}');
}
if (this.query_temp('jxtm')) {
this.remove_status('force');
}
}
}
const WEAPON_TYPES = {
"sword": true,
"blade": true,
"staff": true,
"club": true,
"whip": true
}
CHARACTER.prototype.weapon_changed = function (iseq) {
this.attack_skill = this.query_used_skill(this.query_weapon_type());
this.on_skillchanged && this.on_skillchanged();
if (!this.auto_skills) return;
for (let item of this.auto_skills) {
if (WEAPON_TYPES[item.type]) {
item.ban_use = !iseq;
}
}
}
CHARACTER.prototype.add_obj = function (obj, count) {
if (!obj) return;
if (typeof obj == "string") {
obj = OBJ.clone_to(obj, this, count);
if (!obj) return;
} else {
obj = this.push_item(obj);
}
return obj;
}
CHARACTER.prototype.remove_obj = function (obj, count) {
if (typeof obj == "string") {
obj = this.find_obj(obj);
}
if (!obj) return;
count = count || obj.count || 1;
this.remove_item(obj, count);
return obj;
}
CHARACTER.prototype.query_weapon = function () {
if (this.equipment) {
return this.equipment[EQUIP_TYPE.WEAPON];
}
}
CHARACTER.prototype.query_weapon_type = function () {
if (this.equipment) {
var eq = this.equipment[EQUIP_TYPE.WEAPON];
if (eq) return eq.weapon_type;
}
return WEAPON_TYPE.NONE;
}
CHARACTER.prototype.weapon_name = function () {
if (this.equipment && this.equipment[EQUIP_TYPE.WEAPON]) {
return this.equipment[EQUIP_TYPE.WEAPON].color_name;
}
return "";
}
CHARACTER.prototype.throwing_name = function () {
if (this.equipment && this.equipment[EQUIP_TYPE.THROWING]) {
return this.equipment[EQUIP_TYPE.THROWING].color_name;
}
return "";
}
CHARACTER.prototype.can_throwing = function () {
if (this.equipment) {
var th = this.equipment[EQUIP_TYPE.THROWING];
if (!th) return false;
return true;
}
return false;
}
CHARACTER.prototype.get_equipment = function (type) {
return this.equipment && this.equipment[type];
}
CHARACTER.prototype.set_drop = function () {
this.drop_list = this.drop_list || [];
for (var i = 0; i < arguments.length; i++) {
this.drop_list.push(arguments[i]);
}
}
CHARACTER.prototype.query_drop = function () {
if (!this.drop_list) return;
return OBJ.create_by_odds(this.drop_list);
}