85 lines
2.1 KiB
JavaScript
Raw Normal View History

/**
* 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;