装备系统
This commit is contained in:
@@ -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,
|
||||
}
|
||||
Reference in New Issue
Block a user