85 lines
2.1 KiB
JavaScript
85 lines
2.1 KiB
JavaScript
|
|
/**
|
||
|
|
* M-PALACE · 玩家互动 API
|
||
|
|
* POST /api/palace/interact
|
||
|
|
*
|
||
|
|
* 接收玩家输入 → 人格分析 → 情节推进 → 返回新叙事+选项
|
||
|
|
*/
|
||
|
|
|
||
|
|
const express = require('express');
|
||
|
|
const router = express.Router();
|
||
|
|
const plotEngine = require('../engines/plot-engine');
|
||
|
|
const saveManager = require('../engines/save-manager');
|
||
|
|
|
||
|
|
/**
|
||
|
|
* POST /api/palace/interact
|
||
|
|
* body: {
|
||
|
|
* save_id: "PAL-XXXXXXXX-XXXX",
|
||
|
|
* input: "玩家输入文本" | null,
|
||
|
|
* choice_index: 0|1|2|null,
|
||
|
|
* option_meta: { a_dims, b_dims, c_dims } | null
|
||
|
|
* }
|
||
|
|
*/
|
||
|
|
router.post('/', function (req, res) {
|
||
|
|
try {
|
||
|
|
var body = req.body || {};
|
||
|
|
var saveId = body.save_id;
|
||
|
|
var playerInput = body.input || '';
|
||
|
|
var choiceIndex = body.choice_index != null ? body.choice_index : null;
|
||
|
|
var optionMeta = body.option_meta || null;
|
||
|
|
|
||
|
|
if (!saveId) {
|
||
|
|
return res.status(400).json({
|
||
|
|
error: true,
|
||
|
|
code: 'MISSING_SAVE_ID',
|
||
|
|
message: '缺少存档编号'
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// 读取存档
|
||
|
|
var saveData = saveManager.load(saveId);
|
||
|
|
if (!saveData) {
|
||
|
|
return res.status(404).json({
|
||
|
|
error: true,
|
||
|
|
code: 'SAVE_NOT_FOUND',
|
||
|
|
message: '存档不存在:' + saveId
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
var state = saveData.state;
|
||
|
|
var persona = saveData.persona;
|
||
|
|
var history = saveData.history;
|
||
|
|
|
||
|
|
// 情节推进
|
||
|
|
var result = plotEngine.advance(
|
||
|
|
state, persona, history,
|
||
|
|
playerInput, choiceIndex, optionMeta
|
||
|
|
);
|
||
|
|
|
||
|
|
// 自动存档
|
||
|
|
saveManager.save(result.state, result.persona, result.history, saveId);
|
||
|
|
|
||
|
|
res.json({
|
||
|
|
error: false,
|
||
|
|
save_id: saveId,
|
||
|
|
narrative: {
|
||
|
|
chapter_title: result.narrative.chapter_title,
|
||
|
|
narrative: result.narrative.narrative,
|
||
|
|
choices: result.narrative.choices
|
||
|
|
},
|
||
|
|
four_dimensions: result.four_dimensions,
|
||
|
|
choices_meta: result.choices_meta,
|
||
|
|
event_type: result.event_type,
|
||
|
|
chapter: result.state.chapter,
|
||
|
|
paragraph: result.state.paragraph
|
||
|
|
});
|
||
|
|
} catch (err) {
|
||
|
|
res.status(500).json({
|
||
|
|
error: true,
|
||
|
|
code: 'INTERACT_ERROR',
|
||
|
|
message: '剧情推进失败:' + err.message
|
||
|
|
});
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
module.exports = router;
|