装备系统
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