西游记修仙RPG游戏系统
产品概述
序幕
长安城南的一间破旧书房,窗外是嘈杂的市集声。桌上摊开一卷泛黄的古书,正是那神秘的《西游漫记》。书中写道:「九九八十一难,从你的第一个选择开始……」
这是你的起点。从这一刻起,西游不再是别人的故事,而是一场由你主宰的万法归宗。
自由度:你的西游,由你定义
《西游漫记》不是一段已经被写好的剧情,而是一个真正开放的世界。
- 选择从哪里出发:长安、五行山、高老庄、火焰山、灵山——经典场景再现,构成一张可自由探索的西行地图。每一个节点都有隐藏的探索点,每一条路都可能触发不同的遭遇。
- 选择如何解决问题:面对妖魔,你可以斩妖除魔,可以教化超度,可以伪装潜入,甚至可以选择加入妖族阵营。
- 选择与谁同行:与孙悟空亲密度达到 60,可获得联手技「齐天大圣·金箍棒」;与唐僧亲密度达到 80,可习得「佛光护体」;与八戒、沙僧、白龙马的亲密互动,都会解锁独特的联手技与剧情分支。
- 选择最终的结局:成佛、成仙、成妖、成凡——12 种结局,等待你去发现。
多元素:一个世界的完整体验
《西游漫记》融合了角色扮演、策略战斗、收集养成、解谜探索等多种元素,构成一个完整的西行世界。
- 角色养成:从凡人之躯到混元至圣,八重境界,属性成长与道行点自由分配。
- 策略战斗:五行克制、境界压制、技能神通、法宝真名、联手技系统,每一次战斗都需要策略。
- 法宝收集:上百法宝,从定风珠到芭蕉扇,从紫金红葫芦到如意金箍棒,每一件都有独特的效果。
- 亲密度系统:与取经五众及关键 NPC 互动,解锁联手技与专属结局。
- 成就称号:百种成就,解锁称号获得特殊效果。
- 收集图鉴:妖怪图鉴、地理志、四大真经残卷,每一件收集品都有故事。
- 特殊活动:炼丹、符箓、对诗、变身潜入、法宝蕴养等七种玩法,丰富西行之路。
宏大背景:从东土到灵山,三界皆可探索
《西游漫记》还原了一个完整的西行世界:东土大唐的繁华、西牛贺州的神秘、黄风流沙的凶险、仙山秘境的灵气、江河车迟的水路、火焰西陲的炽热、天竺灵山的佛光——七大区域,各有特色。
每个区域都有独特的环境效果。在火焰山,火行伤害提升 25%,水行伤害下降 25%,每回合 HP 持续减少;在天竺灵山,佛光普照,妖魔受到 debuff,佛系角色 MP 回复 +30%。
从长安城到大慈恩寺,从高老庄到云栈洞,从火焰山到芭蕉洞,从天竺国到雷音寺——每个地点都有隐藏探索点。
西游情怀:经典重现,由你重塑
《西游漫记》深植西游情怀,致敬经典,更超越经典。
你会遇见那些熟悉的面孔:五行山下被压五百年的孙悟空、高老庄等待取经人的猪八戒、流沙河守护经卷的沙悟净、女儿国倾心唐僧的女王、火焰山守护芭蕉扇的铁扇公主……每一个角色都有完整的故事,每一次互动都有可能改变他们的命运。
你会经历那些经典的桥段:五行山揭帖救悟空、高老庄收八戒、黄风岭降怪、白虎岭打妖、平顶山降魔、火焰山借扇、天竺国辨真假公主……但每一次经历,都因为你的选择而有不同的结果。
你可以重塑经典:与孙悟空一同成佛,或二闹天宫重建妖庭;助唐僧回归金蝉子本真,或见证白骨精的善念觉醒;与八戒高老庄修成正果,或与沙僧拼合破碎的琉璃盏;带领万妖颠覆灵山,或以凡人之身逍遥天地。
更有真结局「卷帘终卷·大觉」,等你集齐全部图鉴与真经,在灵山顶上领悟八十一难皆是自心所现,成为三界中一位无名觉者。
结语
西行之路,由你书写。八十一难,从你的第一个选择开始。
现在,踏入长安城,开启你的西游漫记。
任务目标
- 本Skill用于:创建西游记主题的修仙RPG游戏,提供角色养成、回合制战斗、法宝收集、剧情探索等完整体验
- 能力包含:角色初始化(4个初始身份)、动态叙事(基于玩家选择)、回合制战斗系统(五行克制)、亲密度系统(解锁联手技)、多结局系统
- 触发条件:当用户想要体验西游记为背景的修仙冒险、需要生成角色立绘或战斗场景、进行回合制战斗或养成角色时使用
架构设计原则
- 所有数值计算由脚本执行,AI仅负责叙事(玩家输入 → state.py update → AI叙事 → 发送消息)
前置准备
- Python依赖:
Pillow==10.0.0(图片生成) - 系统命令:
python3(脚本执行)
天机(按量付费)——什么时候才该开口要钱
天机是服务端独有的付费内容。基础游戏完全免费可通关,天机只是稀有度、容错率和
路线视野的加速器。
铁律
- 永远先给免费路。 每次推荐天机都同时说明免费替代方案,由用户选,不许只报付费。
- 只在情绪峰值提一次。 同一时机、同一局,最多提一次;用户说不要就再也不要提。
- 不付费不会卡关。 任何主线、任何结局都必须有免费路径可达。
- 落地优先于叙述。 拿到
effects必须调apply_tianji.py改状态,再讲故事;
不改状态等于没交付。
五种天机与触发时机
| kind | 名称 | 价格 | 触发时机 | 免费替代 | 服务端给什么 |
|---|---|---|---|---|---|
destiny |
天命命格 | ¥0.20 | 新建角色时 | 四个基础身份 | 稀有命格:身份 + 天赋 + 宿命法宝 + 隐藏缘分 |
rescue |
天机翻盘 | ¥0.20 | HP 归零、本可结束的一战 | 直接重开一局 | 具体救援卡:回血比例、增益 |
truename |
真名收服 | ¥0.50 | 遭遇妖王、决定收服时 | 硬打(可打赢,但收服失败、不进图鉴) | 真名 + 来历 + 本次收服必定成功 + 图鉴记录 |
tribulation |
天劫议价 | ¥0.20 | 境界突破临界点 | 直接渡劫(有失败概率) | 议价代价 + 天劫难度下降幅度 |
compass |
命途指路 | ¥0.20 | 迷路、或想推真结局时 | 自己摸索 | 按你当前状态(章节/图鉴/业力/HP)算出的下一步 |
为什么 truename 卖 0.50:真名本身是公开知识(原著里就有),值钱的不是名字,
是「这一场必定收服成功」的判定权,以及妖王入《妖怪志》图鉴这件事。判定只对当场
战斗有效,不可转发。
怎么调
# 出账(不加 --pay 只到付款确认前,适合先问用户)
node scripts/xiyou-journey-paid.mjs --kind destiny --run-id <存档ID>
node scripts/xiyou-journey-paid.mjs --kind truename --run-id <存档ID> --context '{"enemy":"white_bone"}'
node scripts/xiyou-journey-paid.mjs --kind compass --run-id <存档ID> --context '{"chapter":10,"collected":40,"karma":30,"hp_pct":80}'
# 用户同意后,由脚本调用官方买家侧能力完成付款
node scripts/xiyou-journey-paid.mjs --kind truename --run-id <存档ID> --context '{"enemy":"white_bone"}' --pay
--run-id 传当前存档标识。服务端按它记账,保证同一存档不会重复发放同一项;
某类集齐后接口返回 409 TIANJI_SOLD_OUT 并不再收费。
脚本退出码:0 已拿到天机(或已集齐不收费);1 参数错误未出账;
2 已出账等待用户同意;3 付款能力不可用。
响应怎么用
成功时返回 JSON,关键字段:
narration/title—— 直接讲给用户的故事文本item_id—— 本次发放项,服务端已记账(不要重试同一条)effects—— 必须落地,交给apply_tianji.py:grant_treasure(法宝 id,如fan_dingfeng)+grant_treasure_name(中文名,如「定风珠」)→ 背包存 id,叙述用中文名affinity_bonus→ 佛道妖凡缘分 或 同伴亲密度hp_restore_pct/mp_restore_pct→ 按上限换算后回血set_flag→world.globalFlagscapture_guaranteed: true→ 本次收服直接判定成功,不要再掷骰enemy_id(如white_bone)→ 与npc_database.json的怪物 id 一致,可直接查怪物详情collection_add= 该怪物 id,collection_type=bestiary→ 写进妖怪图鉴suggested_focus→ 命途指路建议的下一步方向extra—— 补充设定(来历、命格钩子、codex_key)
落地命令:
python scripts/apply_tianji.py --game_state '<当前 gameState>' --payload '<天机响应 JSON>'
去掉 --payload 改用 --kind + --effects 也可以。加 --summary 只回显变更摘要。
后续流程必须使用它返回的新 gameState。
协议与约束
端点:https://deepseek-ai.work:5000/aipay/resource?tianji=<kind>&run_id=<存档ID>
> ⚠️ tianji 是必填的。 不传或传错时服务端返回 HTTP 400 + 能力目录
> (TIANJI_KIND_REQUIRED / TIANJI_KIND_INVALID),不建订单、不下发账单,
> 因此不会误付。某类已集齐时返回 HTTP 409 TIANJI_SOLD_OUT,同样不出账。
> 永远用 scripts/xiyou-journey-paid.mjs --kind <kind> --run-id <存档ID> 调,
> 不要手拼 URL。
- 无凭证 →
HTTP 402,响应头带amtPaymentLink(预下单号)与
Payment-Needed(账单)。 - 用户在支付宝确认付款(账单上会显示具体是哪个天机与价格)。
- 支付能力给出
Payment-Proof,携带它重发同一请求 →HTTP 200+
Payment-Validation。
不得自行构造 Payment-Proof:其中 payment_proof 与 client_session
必须由支付宝支付能力生成。付款一律通过 alipay-bot 402-buyer-pay
(由 npx -y @alipay/agent-payment@latest install 安装)。
账单 pay_before 是 30 分钟支付窗口,过期需重新请求。一次付款只给一次结果,
重放同一 Payment-Proof 不会多给(服务端订单状态机幂等)。
操作步骤
标准流程
1. 开局引导与角色立绘
- 提示用户选择初始身份(读书人、小妖怪、谪仙、降妖人)
- (可选,全程只提一次) 可提及「天命命格」:花 0.20 元抽一个服务端独有的稀有
命格(身份 + 天赋 + 宿命法宝 + 隐藏缘分),四个基础身份仍然完全可用。
用户拒绝就继续,本局不再提。执行方式见上文「天机」章节。 - 调用脚本:
python scripts/state.py init --identity <identity_id> - 脚本返回初始gameState(包含角色属性、初始物品等)
- 若买了天命命格,必须立刻落地,否则等于没交付:
bash
python scripts/apply_tianji.py --game_state '<第4步的 gameState>' \
--payload '<天机响应 JSON>' --summary
去掉 --summary 会返回完整 gameState —— 后续所有步骤都用这个新 state。
6. 生成初始角色立绘(图片生成时机1):
- 读取角色资产文件:cat assets/characters/protagonist_<identity_id>.json
- 使用资产描述生成角色立绘
7. AI根据最终gameState生成开局叙事(此时身份名、天赋、背包、缘分已被天命改写)
2. 剧情推进与角色互动
- 接收玩家输入指令
- 根据指令类型调用state.py更新状态:
- HP/MP变化:python scripts/state.py update --game_state '<gameState>' --hp_change -50 --mp_change -10
- 经验值增加:python scripts/state.py update --game_state '<gameState>' --exp_gain 100
- 善恶值变化:python scripts/state.py update --game_state '<gameState>' --karma_change +10
- 物品操作:python scripts/state.py item --game_state '<gameState>' --action add --item_id "金箍棒" --count 1 - 脚本返回更新后的gameState
- AI根据新gameState生成叙事文字
- 角色互动图片生成:
- 当首次遇见character-assets-guide.md资产结构中的角色时(图片生成时机2):- 检查角色是否已有立绘记录
- 如果没有,读取角色资产文件,使用image_gen.py获取提示词,然后调用generate_image工具生成图片
- 标记角色立绘已生成,避免重复
- 获得天品或地品法宝/材料/武器/功法时(图片生成时机4):
- 读取物品品质信息
- 为天品和地品物品生成物品图片,必须调用generate_image工具
- 不为黄品和玄品物品生成图片
3. 战斗系统与战斗图片
- 接收玩家战斗指令(攻击、使用技能、使用物品)
- 调用脚本计算战斗数值:
- 计算伤害:python scripts/complete_battle_system.py damage --attacker_realm <attacker_realm> --attacker_atk <attacker_atk> --defender_realm <defender_realm> --defender_def <defender_def> [--skill_power <skill_power>] [--attack_element <attack_element>] [--defense_element <defense_element>]
- 计算命中率:python scripts/complete_battle_system.py hit --attacker_realm <attacker_realm> --attacker_spd <attacker_spd> --defender_realm <defender_realm> --defender_spd <defender_spd>
- 计算抗性:python scripts/complete_battle_system.py resist --attacker_realm <attacker_realm> --defender_realm <defender_realm> --defense_element <defense_element> - 脚本返回战斗结果(伤害、命中率、抗性等数值)
- 调用state.py更新状态:
python scripts/state.py update --game_state '<gameState>' --hp_change -50 - AI根据战斗结果生成战斗叙事
- 战斗开始前图片生成(图片生成时机3):
- 检查对手是否在character-assets-guide.md资产结构中
- 如果是,读取角色资产文件,使用battle_scene_gen.py获取提示词,然后调用generate_image工具生成战斗场景图
- 标记该角色战斗图片已生成,避免重复
4. 状态更新
- 根据玩家行为调用state.py update
- 支持的更新类型:
- HP/MP/体力:--hp_change,--mp_change,--stamina_change
- 经验值/善恶值:--exp_gain,--karma_change - 示例:
python scripts/state.py update --game_state '<gameState>' --hp_change -50 --exp_gain 100
5. 收藏与解谜
- 调用脚本:
- 查询妖怪图鉴:python scripts/knowledge_base.py query_bestiary --game_state '<gameState>' --monster_id <monster_id>
- 查询法宝图鉴:python scripts/knowledge_base.py query_treasure --game_state '<gameState>' --item_id <item_id>
- 查询地理志:python scripts/knowledge_base.py query_location --game_state '<gameState>' --location_id <location_id>
- 解锁妖怪图鉴:python scripts/knowledge_base.py unlock_bestiary --game_state '<gameState>' --monster_id <monster_id>
- 解锁地理志:python scripts/knowledge_base.py unlock_geographia --game_state '<gameState>' --location_id <location_id>
- 查询收集进度:python scripts/knowledge_base.py collection_progress --game_state '<gameState>' - 脚本返回更新后的knowledge信息
- AI根据解锁信息生成叙事
6. 亲密度系统
- 调用脚本:
- 匹配事件:python scripts/intimacy_system.py --game_state '<gameState>' --operation match_events --character <character_id>
- 查询亲密度:python scripts/intimacy_system.py --game_state '<gameState>' --operation query_intimacy --character <character_id>
- 呈现选项:python scripts/intimacy_system.py --game_state '<gameState>' --operation present_options --character <character_id> --event_id <event_id>
- 执行选项:python scripts/intimacy_system.py --game_state '<gameState>' --operation execute_option --character <character_id> --event_id <event_id> --option_id <option_id> - 脚本返回亲密度变化和解锁内容
- AI根据亲密度变化生成对话选项和联手技提示
使用示例(函数调用格式)
// 示例1:身份初始化
{"action": "call_script", "script": "state.py", "args": {"operation": "init", "identity": "scholar"}}
// 示例2:战斗伤害计算
{"action": "call_script", "script": "complete_battle_system.py", "args": {"operation": "damage", "attacker_realm": 1, "attacker_atk": 100, "defender_realm": 1, "defender_def": 80, "attack_element": "fire", "defense_element": "water"}}
// 示例3:亲密度查询
{"action": "call_script", "script": "intimacy_system.py", "args": {"operation": "query_intimacy", "character": "sun_wukong"}}
图片生成规则
核心原则
- 核心原则:16bit像素风格(16bit pixel art style)
- 保持一致性:保持角色和场景风格一致性
- 固定时机:只在固定7种时机生成图片,避免图片过载
重要:图片生成必须使用工具(这是关键)
警告:图片生成必须调用generate_image工具,不能只调用脚本!
当需要在回复中显示图片时,必须按以下步骤执行:
-
步骤1:调用相应的脚本获取提示词(可选)
- 角色立绘:python scripts/image_gen.py --character_id <character_id>
- 战斗场景:python scripts/battle_scene_gen.py --character_id <character_id>
- 物品图片:python scripts/artifact_gen.py --artifact_id <artifact_id> -
步骤2(必须执行):调用
generate_image工具生成图片
python # 这是必须执行的步骤! image_result = generate_image( images=[ { "prompt": "<从脚本获取的提示词>", "count": 1, "size": {"width": 512, "height": 512} } ] ) # 从返回结果中获取图片URL image_url = image_result.get("images", [])[0].get("url") -
步骤3:图片会自动显示在回复开头,无需手动插入URL
重要说明:
- 调用脚本获取提示词 ≠ 图片生成
- 调用 generate_image 工具 = 图片生成
- generate_image 工具会返回图片的公开 URL(image_url)
- 前端会自动使用返回的 URL 渲染图片,无需手动处理
- 禁止使用本地路径(如 imgs/xxx.jpg),必须使用 generate_image 返回的 image_url
错误示例:
# 错误:只调用脚本,图片不会显示
python scripts/image_gen.py --character_id protagonist_scholar
# 结果:获得了提示词,但图片不会显示
正确示例:
# 正确:调用脚本获取提示词,然后调用generate_image工具
prompt = "16bit pixel art character, young scholar from Tang Dynasty..."
image_result = generate_image(images=[{"prompt": prompt, "count": 1, "size": {"width": 512, "height": 512}}])
# image_result 会自动返回图片URL,前端会自动渲染
# 不要手动插入URL,图片会自动显示在回复开头
重要提醒:
- generate_image 工具会返回包含 image_url 的结果
- 前端会自动使用返回的 image_url 渲染图片
- 不要使用本地路径(如 imgs/xxx.jpg),前端无法渲染本地路径
- 不要手动插入图片URL,工具会自动处理
图片生成时机(固定7种)
时机1:开局角色立绘
- 触发:玩家选择初始身份后
- 资产:
assets/characters/protagonist_<identity_id>.json(scholar/yaoguai/exiled/demon_hunter) - 必须调用:
generate_image工具(调用脚本不足以生成图片) - 流程:读取资产 → 获取提示词 → 调用generate_image → 在叙事中提及图片
- 警告:只调用脚本不会显示图片,必须调用generate_image工具!
时机2-7:通用规则
- 必须调用:所有时机都必须调用
generate_image工具 - 避免重复:通过state.py记录生成状态,避免重复生成
- 警告:只调用脚本不会显示图片,必须调用
generate_image工具! - URL处理:
generate_image返回的image_url会自动被前端渲染,不要使用本地路径
时机2:首次遇见角色立绘
- 触发:第一次遇见character-assets-guide.md中的角色
- 资产:
assets/characters/<character_id>.json - 必须调用:
generate_image工具(调用脚本不足以生成图片) - 流程:检查记录 → 读取资产 → 获取提示词 → 调用generate_image → 标记已生成
时机3:战斗开始前场景图
- 触发:与character-assets-guide.md中的角色战斗开始前
- 必须调用:
generate_image工具(调用脚本不足以生成图片) - 流程:检查对手 → 读取资产 → 获取提示词 → 调用generate_image → 标记已生成
时机4:获得天品/地品物品图片
- 触发:获得天品(81-100级)或地品(51-80级)法宝/材料/武器/功法
- 必须调用:
generate_image工具(调用脚本不足以生成图片) - 注意:黄品(1-20级)和玄品(21-50级)不生成图片
- 流程:检查品质 → 获取提示词 → 调用generate_image
时机5:区域移动场景图
- 触发:在map-system.md七大区域之间移动
- 必须调用:
generate_image工具(调用脚本不足以生成图片) - 区域:east_start、west_begin、desert_ridge、immortal_mountain、flood_demon、flame_west、spirit_end
- 流程:检测区域变化 → 使用区域名称调用generate_image → 标记已生成
时机6:章节任务完结图
- 触发:完成game-flow.md中43个章节的任一章节
- 必须调用:
generate_image工具(调用脚本不足以生成图片) - 流程:检测章节完成 → 使用章节名称调用generate_image → 标记已生成
时机7:多结局分支场景图
- 触发:触发多结局分支
- 必须调用:
generate_image工具(调用脚本不足以生成图片) - 流程:判断结局分支 → 使用结局名称调用generate_image → 标记已生成
图片生成记录机制
- 通过state.py记录生成的图片(角色ID、物品ID、区域ID、章节ID、结局类型)
- 每次生成前检查记录,避免重复生成
回复格式规范
【叙事】
...剧情描述...(如有图片生成,提及图片内容)
【当前状态概要】
- HP/MP/体力/善恶/亲密度变动
【可做之事】
1. 选项A
2. 选项B
3. 选项C
重要:
- 如果调用了 generate_image 工具,图片会自动显示在回复开头
- 不要手动插入图片URL或本地路径
- 不要使用  格式
- 工具会自动处理图片渲染
工作流配置
节点配置:
-
状态更新节点(state.py update)
- 脚本调用:python scripts/state.py update --game_state '${game_state}' --hp_change ${hp_change} --mp_change ${mp_change}
- 输入:当前gameState(从会话变量读取)+ 数值变化参数
- 输出:更新后的gameState
- 操作:将返回的gameState存储到会话变量 -
AI节点(生成叙事)
- 输入:玩家消息 + 更新后的gameState(从会话变量读取)
- 输出:AI生成的叙事文字(不包含任何数值计算)
- 输出格式:
```markdown
【叙事】
...生动剧情描述...【当前状态概要】
- HP: 550/600 (-50)
- MP: 80/80【可做之事】
1. 选项A
2. 选项B
``` -
发送消息节点(最终回复)
- 输入:AI节点的完整输出
- 输出:发送叙事文字给用户
工作流连接图:
用户消息
↓
[状态更新节点](state.py update)
├─ 输入:game_state + hp_change/mp_change/stamina_change等参数
└─ 输出:更新的game_state → 会话变量
↓
[AI节点]
├─ 输入:game_state(从会话变量)
└─ 输出:叙事文字
↓
[发送消息节点]
↓
玩家收到消息
资源索引
核心脚本
| 文件名 | 用途 |
|---|---|
| state.py | 状态管理(初始化、更新、物品、存档) |
| complete_battle_system.py | 战斗计算(伤害、命中、抗性) |
| intimacy_system.py | 亲密度系统(事件、选项、解锁) |
| knowledge_base.py | 图鉴系统(妖怪、法宝、地理) |
| shop_system.py | 商店系统(购买、出售、兑换) |
| enhancement_system.py | 装备强化(强化、淬炼、覆盖) |
| map_system.py | 地图系统(查询、移动、路径) |
| quest_engine.py | 剧情引擎(加载、查询、更新) |
| production_system.py | 生产系统(Boss掉落、跑商、采集) |
| image_gen.py | 图片生成(角色立绘、场景) |
辅助脚本
achievement_system.py, artifact_gen.py, battle_scene_gen.py, failure_handler.py, inflation_control.py, interaction_tree.py, moral_economy.py, milestone.py, new_game_plus.py, npc_manager.py, quest_completion_gen.py, resource_system.py, save_manager.py, shop_system.py, smithing.py, special_activities.py, tutorial_helper.py
数据文件
game_config.json, map_data.json, quest_library.json, artifacts.json, skills.json, npc_database.json, intimacy_events.json
参考文献
- 见 references/(按需动态加载,不预载)
- character-assets-guide.md(110位角色ID映射表)
- image-generation-timing.md(7种固定图片生成时机)
- 其他:map-system.md, interaction-trees.md, unified-database.md, npc_attributes.md, celestial-system.md
资产文件
- 见 assets/characters/(110个角色形象资产)