后端(Odoo addons): - game_base: 迁入 关于 功能(game.page/game.page.item/yusen.asset 模型、page_views/asset_views、6条权限、menu_website_about 左侧应用入口),新增 chat 模块(AI世界聊天: chat.py/chat_api.py/chat_data.xml/chat_views.xml) - yt_world: 合并 game_ai_npc(npc 模型/数据/controller),修复菜单 NotNullViolation - yusen_website: 移除已迁出的 page/asset,背景菜单改挂 game_base.action_game_page - 新增 game_asset_backup 纯数据模块: 备份前端素材到 addons(game_assets/),预置 图鉴(game.codex.entry)9条(过场CG/动物) + 素材管理(yusen.asset)120条(地形/建筑/瓦片/幻灯片/背景/路/UI),按类分 tags 前端(assets + HTML): - 新增 chat.js / game-api.js、chat.html / buildings_default_demo.html - 清理旧 slides/website 冗余文件,更新 GENERATION_RULES.md 与动物九宫格素材
43 lines
1.9 KiB
Python
43 lines
1.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
from odoo import api, fields, models
|
|
|
|
ACTIVITY_LABELS = {
|
|
'sleep':'💤 睡眠', 'wake':'☀ 苏醒', 'eat':'🍽 用餐', 'work':'⚒ 劳作',
|
|
'rest':'🛋 休息', 'social':'💬 社交', 'wander':'🚶 游荡', 'explore':'🔍 探索',
|
|
'study':'📖 研习', 'craft':'🔨 制作', 'trade':'💰 交易', 'train':'⚔ 训练',
|
|
}
|
|
|
|
class GameNpcBehaviorLog(models.Model):
|
|
_name = 'game.npc.behavior.log'
|
|
_description = 'NPC 行为日志'
|
|
_order = 'tick_time desc, id desc'
|
|
_rec_name = 'summary'
|
|
|
|
npc_id = fields.Many2one('game.npc', string='角色', required=True, ondelete='cascade', index=True)
|
|
tick_time = fields.Datetime(string='行为时间', default=fields.Datetime.now, index=True)
|
|
activity = fields.Selection([
|
|
('sleep','睡眠'),('wake','苏醒'),('eat','用餐'),('work','劳作'),
|
|
('rest','休息'),('social','社交'),('wander','游荡'),('explore','探索'),
|
|
('study','研习'),('craft','制作'),('trade','交易'),('train','训练'),
|
|
], string='活动类型', required=True)
|
|
location = fields.Char(string='地点')
|
|
target_npc_id = fields.Many2one('game.npc', string='互动对象')
|
|
summary = fields.Char(string='简述', required=True)
|
|
detail = fields.Text(string='详细描述')
|
|
world_context = fields.Text(string='世界上下文',
|
|
help='Tick 时的世界状态 JSON,供后续 LLM 对话使用')
|
|
|
|
activity_label = fields.Char(string='活动标签', compute='_compute_activity_label')
|
|
|
|
@api.depends('activity')
|
|
def _compute_activity_label(self):
|
|
for r in self:
|
|
r.activity_label = ACTIVITY_LABELS.get(r.activity, r.activity)
|
|
|
|
@api.model_create_multi
|
|
def create(self, vals_list):
|
|
for vals in vals_list:
|
|
if not vals.get('tick_time'):
|
|
vals['tick_time'] = fields.Datetime.now()
|
|
return super().create(vals_list)
|