装备系统

This commit is contained in:
李鹏宇
2026-09-09 16:04:15 +08:00
parent e5eae65a31
commit 7fda1242c8
@@ -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,
}