From 5afef6e14c6c0b91638c9d987e657a6d886398c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= Date: Thu, 24 Sep 2026 16:52:10 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E6=8F=90=E4=BA=A4=20migrations:=200.9?= =?UTF-8?q?=20grain=20=E6=95=B0=E6=8D=AE=E8=BF=81=E7=A7=BB=20/=200.10=20fa?= =?UTF-8?q?rmland=20=E7=9B=B4=E7=AB=8B=E4=BF=AE=E5=A4=8D=20/=200.4=20spec?= =?UTF-8?q?=20=E5=90=8C=E6=AD=A5=EF=BC=88=E6=AD=A4=E5=89=8D=E6=BC=8F?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=AF=BC=E8=87=B4=E7=BA=BF=E4=B8=8A=E7=BC=BA?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E8=84=9A=E6=9C=AC=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0.10/post-01_farmland_upright.py | 18 ++++++++++ .../migrations/0.4/post-01_sync_specs.py | 14 ++++++++ .../migrations/0.9/post-01_food_to_grain.py | 34 +++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 addons/yt_world/migrations/0.10/post-01_farmland_upright.py create mode 100644 addons/yt_world/migrations/0.4/post-01_sync_specs.py create mode 100644 addons/yt_world/migrations/0.9/post-01_food_to_grain.py diff --git a/addons/yt_world/migrations/0.10/post-01_farmland_upright.py b/addons/yt_world/migrations/0.10/post-01_farmland_upright.py new file mode 100644 index 0000000..549cbe4 --- /dev/null +++ b/addons/yt_world/migrations/0.10/post-01_farmland_upright.py @@ -0,0 +1,18 @@ +# 0.10 迁移:农田改为竖直站立立绘(flat=0),不再当作平面贴地设施。 +# +# 背景:早期建库时 bi_farmland 被归进「设施(平面俯视,压成菱形贴地)」组,flat=1。 +# 而农田立绘是 3/4 直立麦田(与农舍/风车同款),flat=1 会把整张图压扁铺在地面菱形上, +# 视觉上麦子"躺倒",与建筑立体感不一致。本次把 flat 改回 0,让农田竖直站立。 +# +# 注:yt_world_build_item.xml 是 noupdate=1,改 XML 只影响新装库;存量库的 flat 字段 +# 必须由本迁移刷。前端的 MICRO_BUILD_EXTRA 兜底 flat:false 已就位,但登录后目录覆盖 +# 用的是后端字段,所以后端 DB 必须同步修正才能真正生效。 + +def migrate(cr, version): + import odoo + from odoo import api + + env = api.Environment(cr, odoo.SUPERUSER_ID, {}) + items = env['yt.world.build.item'].sudo().search([('code', '=', 'farmland')]) + if items: + items.write({'flat': False}) diff --git a/addons/yt_world/migrations/0.4/post-01_sync_specs.py b/addons/yt_world/migrations/0.4/post-01_sync_specs.py new file mode 100644 index 0000000..91bb0d5 --- /dev/null +++ b/addons/yt_world/migrations/0.4/post-01_sync_specs.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +"""升级到 0.4:建筑产出规格迁移到代码单一真源(BUILD_SPECS)。 + +此前产出写在 noupdate 的 XML 记录里,模块升级时 Odoo 不会重放已存在记录的字段, +导致改了产出必须手动补写 DB。本次把单一真源移到 build_spec.py, +本迁移在每次跨越 0.3→0.4 的升级时执行一次:把代码规格刷进 item 字段, +并对所有世界做全量对账(速率 tick + 即时属性 instant)。 + +以后调任何建筑产出:改 build_spec.BUILD_SPECS + 升一次级(如需再次 sync 则 bump 版本)即可。 +运行时结算/算速率/前端目录均已直接读 BUILD_SPECS,即使不跑本迁移游戏也正确。 +""" +def migrate(cr, version): + from odoo.addons.yt_world import sync_specs_from_code + sync_specs_from_code(cr, None) diff --git a/addons/yt_world/migrations/0.9/post-01_food_to_grain.py b/addons/yt_world/migrations/0.9/post-01_food_to_grain.py new file mode 100644 index 0000000..8e826a7 --- /dev/null +++ b/addons/yt_world/migrations/0.9/post-01_food_to_grain.py @@ -0,0 +1,34 @@ +# 0.9 迁移:农田产出由笼统 food 改为具体 grain(谷物) +# +# 背景:farmland 原本 stat_yield_tick = {'food': 3},与牧场(肉/奶)、风车(面粉)、 +# 水井(水) 这些具体品类不一致,food 是个模糊桶。本次把 farmland 产出改为 grain。 +# 其余 food 来源(village / 宏观农场 / windmill_produce / grocery 任务奖励)按需求保留不动, +# 因此迁移后 grain 与 food 两个资源并存:grain 由农田喂,food 由其余来源喂。 +# +# 存量处理:把玩家 yt.world.stock 里已有的 resource_code='food' 行改名为 'grain', +# 余额不丢;若同世界已存在 grain 行则合并金额后删除 food 行(规避唯一约束)。 +# 改名后再调用 sync_specs_from_code 把 BUILD_SPECS 的新 grain 规格刷进 build.item, +# 并对所有世界重算速率与即时属性(grain 行拿到正确 rate_per_min,food 不会复活)。 + +def migrate(cr, version): + import odoo + from odoo import api + + env = api.Environment(cr, odoo.SUPERUSER_ID, {}) + Stock = env['yt.world.stock'].sudo() + + foods = Stock.search([('resource_code', '=', 'food')]) + for f in foods: + grain = Stock.search( + [('world_id', '=', f.world_id.id), ('resource_code', '=', 'grain')], + limit=1, + ) + if grain: + grain.amount = (grain.amount or 0.0) + (f.amount or 0.0) + f.unlink() + else: + f.write({'resource_code': 'grain'}) + + # 同步建筑规格进库 + 全量对账(速率/即时),与 0.4 迁移同款做法 + from odoo.addons.yt_world import sync_specs_from_code + sync_specs_from_code(cr, None)