7. 战斗系统设计

在这里插入图片描述

7.1 回合制战斗流程

AI 叙事 敌人/NPC 战斗系统 玩家 AI 叙事 敌人/NPC 战斗系统 玩家 alt [逃跑] [攻击] alt [敌人存活] loop [每个回合] alt [玩家HP≤0] [敌人HP≤0] attack 猛虎 初始化 Battle 记录 战斗开始提示 轮到你了 (HP: X/Y) 攻击/技能/逃跑/使用物品 逃跑概率判定 逃跑成功/失败 calcDamage(attacker, defender) 扣减 HP 生成战斗叙事 calcDamage(enemy, player) 扣减 HP 生成战斗叙事 turn++ 战斗失败 战斗胜利 + 奖励

7.2 5种战斗技能

技能 代码 消耗 效果 冷却
猛虎一击 skill_01 MP 20 ATK × 2.0 2回合
飞燕回旋 skill_02 MP 15 ATK × 1.0 + 闪避+15% 3回合
铁壁防御 skill_03 MP 25 防御+50%,持续2回合 4回合
奔雷斩 skill_04 MP 30 ATK × 1.8 + 降敌防10% 3回合
回天术 skill_05 MP 35 恢复 30% + INT×0.5 HP 5回合

8. AI 集成设计

8.1 AI 调用架构

成功

失败

aiChatCompletion()

getLlmConfig()
自定义模型已配置?

customChatCompletion()
OpenAI 兼容 API

z-ai-web-dev-sdk
内置模型

config.url + /v1/chat/completions
model: config.modelId
max_tokens: 1024
temperature: 0.8
timeout: 30s

返回 content

ZAI.chat.completions.create()
thinking: disabled

8.2 AI 应用场景

场景 调用时机 Prompt 设计
场景叙事 look/探索/移动 系统prompt + location描述 + 天气时间
NPC对话 talk_npc NPC性格标签 + backStory + 对话历史
战斗叙事 attack/技能 战斗状态 + 伤害数值 + 文学风格
自由文本 任何未识别指令 全上下文 + 玩家状态 + 开放回答
事件叙事 随机事件触发 事件模板 + 玩家属性
奇遇叙事 encounter 奇遇类型 + 随机元素

9. 技能子系统架构

9.1 43个技能子系统总览

特殊技能 11个

🔨 篆刻

🎵 奏乐

🦁 舞狮

⚗️ 炼金

🐍 弄蛇

🎲 骨牌

🫗 悬壶

🛡️ 走镖

🦅 驯鹰

👹 伏魔

⛰️ 阵法

身法技能 8个

🧘 气功

🌊 劈波

💧 水上漂

⛸️ 滑冰

🐴 骑术

🪢 走索

🎪 高跷

🎪 秋千

智艺技能 8个

💡 猜谜

🔭 观星

🏺 鉴宝

🔮 算卦

🎨 水墨画

🪞 铜镜

♟️ 仙棋

🔑 开锁

武艺技能 8个

⚔️ 演武

🏹 狩猎

🤼 摔跤

🏋️ 扛鼎

🤜 擒拿

🎯 飞镖

💣 炮术

🔨 锻造

生活技能 8个

🎣 垂钓

🍳 烹饪

🏗️ 建屋

🏺 制陶

❄️ 堆雪

🍬 糖人

🎋 扎纸

🗿 塑像

9.2 技能子系统通用模板

每个技能子系统遵循统一的 TypeScript 定义模板:

// 系统定义
export const {PREFIX}_SystemDef = {
  type: '{prefix}',
  name: '技能名称',
  description: '描述',
  emoji: '🎣'
};

// 等级物品 (10级)
export const {PREFIX}_ITEMS = [
  { id: '{prefix}_1', name: '入门物品', level: 1, ... },
  // ... up to level 10
];

// 排名称号 (10级)
export const {PREFIX}_RANK_TITLES = [
  '学徒', '..., '天下第一仙'
];

// 冷却时间
export const SKILL_COOLDOWNS = { '{prefix}': 24 };

// 等级存储
export const player{PREFIX}Level = new Map<string, number>();
export const player{PREFIX}Uses = new Map<string, number>();
export const player{PREFIX}Cooldowns = new Map<string, number>();

9.3 技能系统处理流程

成功

失败

玩家输入技能名
如: 垂钓 / 锻造 / 观星

parseCommand() 匹配
SKILL_SYSTEM_NAMES 映射

type: 'dy' / 'za' / 'xg'

route.ts action handler
switch/case 分发

检查冷却时间
Date.now() - lastUse < cooldown?

返回: 冷却中, 剩余X秒

获取当前技能等级
skillSystemLevels[playerId][systemId]

执行成功率公式
successRate = baseRate + stats + rank*2 - diff*6
钳制到 5-95%

Math.random() < successRate?

计算奖励
exp + copper + 属性加成
+ 技能使用次数+1

返回失败消息
'运气不佳,再接再厉'

使用次数 % 4 == 0?

等级+1
rank_titles[level]

返回结果 + 新等级


10. 任务系统设计

10.1 任务类型层次

Quest 任务系统

主线任务
推进剧情进度

支线任务
NPC委托

随机任务
探索触发

每日任务
阵营日常

任务链
多分支长线

初入江湖 Lv1

景阳冈打虎 Lv3

智取生辰纲 Lv5

林冲上山 Lv3

孙二娘的委托 Lv2

阮氏三雄的考验 Lv2

武松比武 Lv5

梁山阵营日常

朝廷阵营日常

江湖阵营日常

梁山聚义线

招安线

江湖游侠线

10.2 任务生命周期

满足触发条件

玩家接取

开始执行

完成步骤

所有步骤完成

玩家放弃

领取奖励

可重新接取

Available

Accepted

InProgress

Completed

Abandoned


11. 世界地图与移动设计

11.1 地图连接拓扑图

🏯 忠义堂
hasShop

🏛️ 聚义厅

⚔️ 演武场

⚓ 水寨

⛰️ 后山

🛤️ 山道

🛕 大相国寺

🎭 瓦舍
hasShop

🏙️ 汴梁大街

🐅 景阳冈
高危

🛖 十字坡
中危

🌲 野猪林
高危

🍷 快活林
中危

🏰 沧州城
shop+healer

🏘️ 孟州城
shop+healer

🏯 江州城
shop+healer

🏛️ 大名府
shop

11.2 移动验证逻辑

// 方向映射表
const dirMap = {
  '北': 'north', 'north': 'north',
  '南': 'south', 'south': 'south',
  '东': 'east',  'east':  'east',
  '西': 'west',  'west':  'west',
  '上': 'up',    'up':    'up',
  '下': 'down',  'down':  'down',
};

// 移动验证
async function canMove(currentLocCode, direction) {
  const loc = await db.location.findUnique({ where: { code: currentLocCode } });
  const field = dirMap[direction];
  const targetCode = loc[field]; // 从Location记录读取方向字段
  return targetCode 
    ? { success: true, targetCode }
    : { success: false, message: '此方向没有通路。' };
}

12. 数据流与状态管理

12.1 双层数据存储

内存层 JavaScript Maps

持久层 SQLite

Player 表

Item 表

PlayerItem 表

Location 表

Npc 表

Quest 表

PlayerQuest 表

Battle 表

DialogueLog 表

pendingEvents
待处理事件

playerTalents
天赋

skillSystemLevels
技能等级

bountyBoard
悬赏板

playerPets
宠物

guildData
帮派

pvpRating
PVP积分

playerRelations
NPC关系

... +40 more Maps

12.2 前端响应处理

data.mailResult

data.petResult

data.guildResult

data.battleResult

data.eventChoices

data.skillResult

...

API 响应 JSON

JSON.parse()

setPlayer(data.player)

setScene(data.scene)

setMessages([...prev, newMsg])

条件数据判断

setMailData → 显示邮件面板

setPetData → 显示宠物面板

setGuildData → 显示帮派面板

setBattleResult → 战斗横幅

setPendingChoices → 选项按钮

setLastSkillResult → 技能结果

... 30+ 条件分支


13. 部署架构

13.1 项目构建流程

构建步骤

开发
next dev -p 3000

构建
next build

.next/standalone/
独立部署包

生产启动
bun .next/standalone/server.js

TypeScript 编译

Tailwind CSS 处理

静态资源优化

Prisma Client 生成

13.2 运行环境

组件 技术 版本
运行时 Bun / Node.js Bun 1.3+
Web 服务器 Caddy
数据库 SQLite (文件) db/custom.db
AI 模型 OpenAI 兼容 API 可配置
反向代理 Caddyfile 端口转发

13.3 项目文件结构

project/
├── src/
│   ├── app/
│   │   ├── api/game/
│   │   │   ├── action/route.ts       ← 核心 (~23,440行)
│   │   │   ├── achievements/route.ts
│   │   │   ├── create/route.ts
│   │   │   ├── map/route.ts
│   │   │   └── stats/route.ts
│   │   ├── globals.css               ← 主题 + 20+ 动画
│   │   ├── layout.tsx
│   │   └── page.tsx                  ← 主页面 (~6,000行)
│   ├── components/ui/                ← shadcn/ui 组件库
│   ├── hooks/                        ← use-mobile, use-toast
│   └── lib/
│       ├── ai.ts                     ← AI 接口层 (112行)
│       ├── db.ts                     ← Prisma 客户端
│       ├── game/engine.ts            ← 游戏引擎 (~9,082行)
│       ├── model-config.ts
│       ├── seed.ts                   ← 种子数据
│       └── utils.ts
├── prisma/
│   └── schema.prisma                 ← 数据模型 (222行)
├── db/
│   └── custom.db                     ← SQLite 数据库
├── public/                           ← 静态资源
├── agent-ctx/                        ← 开发日志
├── package.json
├── Caddyfile
├── next.config.ts
├── tailwind.config.ts
└── tsconfig.json

附录 A: 系统规模统计

维度 数量
总代码行数 ~62,000+
数据库表 9 张
API 端点 7 个
指令类型 190+ 种
技能子系统 43 个(双字母前缀)
全局游戏系统 70+ 个
NPC 13 位水浒好汉
地点 17 个
物品 19 种基础物品 + 数百种子系统物品
任务 7 个基础 + 动态生成
成就 16 个
天赋 12 个
前端 useState 60+ 个
CSS 动画 20+ 个 @keyframes
前端面板/Overlay 30+ 个

附录 B: 关键设计决策

  1. 自然语言优先:所有命令支持中文自然语言输入,降低学习门槛
  2. AI 双重回退:自定义 LLM → 内置 SDK,保证服务可用性
  3. JSON 字段存储:复杂嵌套数据(技能等级、宠物、帮派)使用 JSON 序列化存储,保持 schema 简洁
  4. 内存+数据库双层:高频读写数据(冷却时间、临时事件)使用内存 Map,低频持久数据使用 SQLite
  5. 指令解析器前置:在 API 层优先进行规则匹配,未匹配的才交给 AI 自由处理,平衡准确性和灵活性
  6. 组件即页面:整个游戏为一个 page.tsx 组件,通过状态切换控制界面,避免路由跳转开销
  7. 子系统模板化:技能子系统遵循统一的 TypeScript 定义模板,便于批量扩展

本文档基于对项目源代码的完整分析生成,涵盖架构设计、数据模型、核心流程、前端组件等全部设计层面。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐