humanda5
Complete: Personality λ³€ν™” 섀계 고도화
3eb99bc
// portfolio/npc_social_network/static/js/npc_chat.js
async function sendMessage() {
const userMessage = document.getElementById("message").value;
const npc = document.getElementById("npc").value;
const responseBox = document.getElementById("chatBox");
if (userMessage.trim() == "") return;
// UI에 μœ μ € λ©”μ‹œμ§€ μΆ”κ°€
responseBox.innerHTML += `<div class = "chat-message"><span class="user">You:</span> ${userMessage}</div>`;
document.getElementById("message").value = "";
// μ„œλ²„μ— λ©”μ‹œμ§€ 전솑
const response = await fetch('/npc_social_network/chat', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ message: userMessage, npc: npc })
});
const data = await response.json();
// NPC 응닡 좜λ ₯
responseBox.innerHTML += `<div class="chat-message"><span class="npc">${npc}:</span> ${data.npc_reply}</div>`;
// 감정 summary ν‘œμ‹œ (μ±„νŒ…μ°½μ— 좜λ ₯)
responseBox.innerHTML += `<div class="chat-message"><span class="npc">[감정 μƒνƒœ]:</span> ${data.memory_summary}</div>`;
// 관계 μƒνƒœ μ—…λ°μ΄νŠΈ (상단 #relationStatus에 ν‘œμ‹œ)
document.getElementById("relationStatus").innerText = `관계 점수: ${data.relationship_with_player}`;
// Personality μƒνƒœ μ—…λ°μ΄νŠΈ
const personalityStatusElem = document.getElementById("personalityStatus");
personalityStatusElem.innerHTML = ""; // μ΄ˆκΈ°ν™”
for (const [key, value] of Object.entries(data.personality)) {
const li = document.createElement("li");
li.textContent = `${key}: ${value.toFixed(2)}`;
personalityStatusElem.appendChild(li);
}
// 슀크둀 ν•˜λ‹¨ κ³ μ •
responseBox.scrollTop = responseBox.scrollHeight;
}
// NPC 정보 λ‘œλ“œ (NPC 선택 λ³€κ²½ μ‹œ 관계 점수 μ—…λ°μ΄νŠΈμš©)
async function loadNPCInfo() {
const npc = document.getElementById("npc").value;
const response = await fetch(`/npc_social_network/npc_info?npc=${encodeURIComponent(npc)}`);
const data = await response.json();
// 관계 μƒνƒœ μ—…λ°μ΄νŠΈ
document.getElementById("relationStatus").innerText = `관계 점수: ${data.relationship_with_player}`;
// Personality μƒνƒœ μ—…λ°μ΄νŠΈ
const personalityStatusElem = document.getElementById("personalityStatus");
personalityStatusElem.innerHTML = ""; // μ΄ˆκΈ°ν™”
for (const [key, value] of Object.entries(data.personality)) {
const li = document.createElement("li");
li.textContent = `${key}: ${value.toFixed(2)}`;
personalityStatusElem.appendChild(li);
}
}
// λ²„νŠΌ 클릭 μ‹œ NPC μƒν˜Έμž‘μš© μˆ˜λ™ μ‹€ν–‰
async function triggerNPCInteractions() {
const response = await fetch('/npc_social_network/trigger_npc_interactions', {
method: 'POST'
});
const data = await response.json();
console.log(data.status); // μ½˜μ†” ν™•μΈμš©
}
// NPC κΈ°μ–΅ λ‘œλ“œ
async function loadNPCMemory() {
const npc = document.getElementById("npc").value;
const response = await fetch(`/npc_social_network/npc_memory?npc=${encodeURIComponent(npc)}`);
const data = await response.json();
const memoryListElem = document.getElementById("memoryList");
memoryListElem.innerHTML = ""; // μ΄ˆκΈ°ν™”
if (data.memory_list.length === 0) {
memoryListElem.innerHTML = "<li>(κΈ°μ–΅μ—†μŒ)</li>";
return;
}
data.memory_list.forEach(memory => {
const li = document.createElement("li");
li.textContent = memory;
memoryListElem.appendChild(li);
});
}