43 lines
1.6 KiB
Python
43 lines
1.6 KiB
Python
# -*- coding: utf-8 -*-
|
||
from odoo import models, fields, api
|
||
|
||
|
||
class GameCurrency(models.Model):
|
||
_name = 'game.currency'
|
||
_description = '游戏货币等级'
|
||
_order = 'level asc'
|
||
|
||
level = fields.Integer(string='等级', required=True)
|
||
name = fields.Char(string='名称', required=True)
|
||
desc = fields.Text(string='描述')
|
||
rate = fields.Integer(
|
||
string='兑换比例',
|
||
default=1,
|
||
help='多少单位本货币可兑换 1 单位下一等级货币。例如 100 墟铢 = 1 灵币,则墟铢的 rate 为 100。'
|
||
)
|
||
|
||
@api.model
|
||
def convert(self, amount, from_level, to_level):
|
||
"""按等级汇率将 amount 从 from_level 换算为 to_level 货币。
|
||
|
||
汇率方向:低等级 → 高等级 为除以 rate,高等级 → 低等级 为乘以 rate。
|
||
最高等级货币(元玺)的 rate 固定为 1,仅作占位。
|
||
"""
|
||
if from_level == to_level:
|
||
return amount
|
||
currencies = self.search_read([], ['level', 'rate'], order='level asc')
|
||
rate_map = {c['level']: c['rate'] or 1 for c in currencies}
|
||
|
||
if from_level < to_level:
|
||
# 低等级 → 高等级:逐级除以兑换比例
|
||
result = amount
|
||
for lv in range(from_level, to_level):
|
||
result = result / rate_map.get(lv, 1)
|
||
return result
|
||
else:
|
||
# 高等级 → 低等级:逐级乘以兑换比例
|
||
result = amount
|
||
for lv in range(to_level, from_level):
|
||
result = result * rate_map.get(lv, 1)
|
||
return result
|