diff --git a/addons/yt_world/models/yt_world_equip_instance.py b/addons/yt_world/models/yt_world_equip_instance.py new file mode 100644 index 0000000..c41c313 --- /dev/null +++ b/addons/yt_world/models/yt_world_equip_instance.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +"""装备实例(玩家拥有的具体一件装备)。 + +与图鉴 yt.world.equip.item 的区别: +- item 是「模板」:定义「草鞋」长啥样(name/icon/槽位/基础加成)。 +- instance 是「实物」:A 生物的那只具体草鞋(耐久 80/100、强化 +2、主人是谁)。 + +这样设计是为了给未来的三大系统打地基(与主流 RPG 一致): +- 耐久:durability / max_durability 独立维护,每只装备各自掉耐久。 +- 强化:enhance_level 独立,强化不会污染其他同款装备。 +- 交易:owner_creature_id 改指另一个生物即可转让,顺着 + 生物→世界→账号自动归属到对应玩家。 +""" +from odoo import models, fields, api + + +class YtWorldEquipInstance(models.Model): + _name = 'yt.world.equip.instance' + _description = '装备实例(玩家拥有的具体一件装备)' + _order = 'id desc' + + item_id = fields.Many2one('yt.world.equip.item', string='模板', + required=True, ondelete='cascade', index=True) + owner_creature_id = fields.Many2one('yt.world.creature', string='拥有者生物', + ondelete='cascade', index=True) + # 已装备的部位;空值(False)表示在背包中未装备 + equipped_slot = fields.Selection( + [('weapon', '武器'), ('armor', '护甲'), ('accessory', '饰品'), ('boots', '鞋子')], + string='已装备部位', index=True) + durability = fields.Integer(string='当前耐久', default=100) + max_durability = fields.Integer(string='最大耐久', default=100) + enhance_level = fields.Integer(string='强化等级', default=0) + # 从模板继承的部位,便于按槽位查询(如"列出某生物所有武器") + slot = fields.Selection(related='item_id.slot', string='部位', + store=True, readonly=True) + + equipped = fields.Boolean(string='已装备', compute='_compute_equipped', + store=True, index=True) + + @api.depends('equipped_slot') + def _compute_equipped(self): + for r in self: + r.equipped = bool(r.equipped_slot) + + def to_dict(self): + self.ensure_one() + item = self.item_id + return { + 'id': self.id, + 'item_code': item.code, + 'name': item.name, + 'icon': item.icon, + 'slot': self.slot or item.slot, + 'rarity': item.rarity, + 'stats': item.stats or {}, + 'bonus': item._bonus_text(), + 'durability': self.durability, + 'max_durability': self.max_durability, + 'enhance_level': self.enhance_level, + }