Files
game/addons/yt_world/models/npc_behavior.py
T
李鹏宇 106d49f6de feat(game): 游戏前后端整合与素材预置备份
后端(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 与动物九宫格素材
2026-08-11 10:02:19 +08:00

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)