Fixed SD RPG
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
import { sessionId } from './state.js';
|
||||
|
||||
function fmtJson(raw, fallback) {
|
||||
try {
|
||||
return JSON.stringify(JSON.parse(raw || fallback), null, 2);
|
||||
} catch {
|
||||
return raw || fallback;
|
||||
}
|
||||
}
|
||||
|
||||
function parseStats(raw) {
|
||||
try {
|
||||
return { lust: 0, stamina: 10, tension: 0, ...JSON.parse(raw || '{}') };
|
||||
} catch {
|
||||
return { lust: 0, stamina: 10, tension: 0 };
|
||||
}
|
||||
}
|
||||
|
||||
export async function openContextEditor() {
|
||||
if (!sessionId) return;
|
||||
const res = await fetch(`/chat/system/${sessionId}`);
|
||||
if (!res.ok) return;
|
||||
const blob = await res.json();
|
||||
|
||||
document.getElementById('ctxStatusQuo').value = blob.status_quo || '';
|
||||
document.getElementById('ctxGlobalPlot').value = blob.global_plot || '';
|
||||
document.getElementById('ctxOutfit').value = fmtJson(blob.outfit_json, '[]');
|
||||
document.getElementById('ctxScene').value = fmtJson(blob.scene_json, '{}');
|
||||
document.getElementById('ctxFacts').value = fmtJson(blob.facts_json, '[]');
|
||||
document.getElementById('ctxPlotArc').value = fmtJson(blob.plot_arc_json, '{}');
|
||||
document.getElementById('ctxAffinity').value = String(blob.affinity ?? 0);
|
||||
|
||||
const stats = parseStats(blob.narrative_stats_json);
|
||||
document.getElementById('ctxLust').value = String(stats.lust ?? 0);
|
||||
document.getElementById('ctxStamina').value = String(stats.stamina ?? 10);
|
||||
document.getElementById('ctxTension').value = String(stats.tension ?? 0);
|
||||
|
||||
const st = document.getElementById('contextEditorStatus');
|
||||
if (st) {
|
||||
st.textContent = '';
|
||||
st.style.color = '';
|
||||
}
|
||||
document.getElementById('contextEditorModal')?.classList.add('open');
|
||||
}
|
||||
|
||||
export function initContextEditor() {
|
||||
document.getElementById('contextEditorOpen')?.addEventListener('click', () => {
|
||||
openContextEditor();
|
||||
});
|
||||
document.getElementById('contextEditorCancel')?.addEventListener('click', () => {
|
||||
document.getElementById('contextEditorModal')?.classList.remove('open');
|
||||
});
|
||||
document.getElementById('contextEditorSave')?.addEventListener('click', async () => {
|
||||
if (!sessionId) return;
|
||||
const statusEl = document.getElementById('contextEditorStatus');
|
||||
const body = {
|
||||
status_quo: document.getElementById('ctxStatusQuo')?.value ?? '',
|
||||
global_plot: document.getElementById('ctxGlobalPlot')?.value ?? '',
|
||||
outfit_json: document.getElementById('ctxOutfit')?.value ?? '[]',
|
||||
scene_json: document.getElementById('ctxScene')?.value ?? '{}',
|
||||
facts_json: document.getElementById('ctxFacts')?.value ?? '[]',
|
||||
plot_arc_json: document.getElementById('ctxPlotArc')?.value ?? '{}',
|
||||
affinity: Number(document.getElementById('ctxAffinity')?.value ?? 0),
|
||||
lust: Number(document.getElementById('ctxLust')?.value ?? 0),
|
||||
stamina: Number(document.getElementById('ctxStamina')?.value ?? 10),
|
||||
tension: Number(document.getElementById('ctxTension')?.value ?? 0),
|
||||
};
|
||||
try {
|
||||
const res = await fetch(`/sessions/${sessionId}/context`, {
|
||||
method: 'PATCH',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(body),
|
||||
});
|
||||
if (!res.ok) {
|
||||
const err = await res.json().catch(() => ({}));
|
||||
if (statusEl) {
|
||||
statusEl.textContent = err.detail || res.statusText;
|
||||
statusEl.style.color = '#e74c3c';
|
||||
}
|
||||
return;
|
||||
}
|
||||
const data = await res.json();
|
||||
if (data.outfit_json) {
|
||||
document.getElementById('ctxOutfit').value = fmtJson(data.outfit_json, '[]');
|
||||
}
|
||||
const { renderSystemBlob, applySessionUi } = await import('./sessions.js');
|
||||
const { updateAffinityDisplay, updateStatsDisplay } = await import('./chat.js');
|
||||
const blobRes = await fetch(`/chat/system/${sessionId}`);
|
||||
if (blobRes.ok) renderSystemBlob(await blobRes.json());
|
||||
const sessRes = await fetch(`/sessions/${sessionId}`);
|
||||
if (sessRes.ok) applySessionUi(await sessRes.json());
|
||||
if (data.affinity !== undefined) updateAffinityDisplay(data.affinity);
|
||||
if (data.narrative_stats) updateStatsDisplay(data.narrative_stats);
|
||||
if (statusEl) {
|
||||
statusEl.textContent = 'Сохранено (outfit: цвета добавлены автоматически, если не указаны)';
|
||||
statusEl.style.color = '#2ecc71';
|
||||
}
|
||||
} catch {
|
||||
if (statusEl) {
|
||||
statusEl.textContent = 'Ошибка сети';
|
||||
statusEl.style.color = '#e74c3c';
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user