Spaces:
Sleeping
Sleeping
phase 3 구현 중
Browse files
npc_social_network/npc/npc_base.py
CHANGED
@@ -83,6 +83,7 @@ class NPC:
|
|
83 |
# 감정 상태 등 감정 관리자 초기화
|
84 |
self.personality = PersonalityManager(personality)
|
85 |
self.relationships = RelationshipManager(self)
|
|
|
86 |
self.emotion = EmotionManager(EMOTION_DECAY_RATE, self.personality)
|
87 |
# 행동 관리자
|
88 |
self.behavior = BehaviorManager()
|
@@ -457,3 +458,11 @@ class NPC:
|
|
457 |
memory_type="Symbolic",
|
458 |
)
|
459 |
print(f"[{self.name}]의 새로운 깨달음: {symbolic_thought}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
83 |
# 감정 상태 등 감정 관리자 초기화
|
84 |
self.personality = PersonalityManager(personality)
|
85 |
self.relationships = RelationshipManager(self)
|
86 |
+
self.relation = {} # 다른 NPC에 대한 평판 저장
|
87 |
self.emotion = EmotionManager(EMOTION_DECAY_RATE, self.personality)
|
88 |
# 행동 관리자
|
89 |
self.behavior = BehaviorManager()
|
|
|
458 |
memory_type="Symbolic",
|
459 |
)
|
460 |
print(f"[{self.name}]의 새로운 깨달음: {symbolic_thought}")
|
461 |
+
|
462 |
+
def update_reputation(self, target_name: str, score_change: int):
|
463 |
+
"""특정 대상에 대한 평판 점수를 변경"""
|
464 |
+
if self.name == target_name: return # 자기 자신에 대한 평판x (자기 자신의 평판에 대한 내용도 성격 형성에 중요할 수 있지 않나?)
|
465 |
+
|
466 |
+
current_score = self.reputation.get(target_name, 0)
|
467 |
+
self.reputation[target_name] = current_score + score_change
|
468 |
+
print(f"[{self.name}]의 {target_name}에 대한 평판: {self.reputation[target_name]} ({score_change:+.0f})")
|
npc_social_network/simulation_core.py
CHANGED
@@ -1,8 +1,9 @@
|
|
1 |
-
# npc_social_network/simulation_core.py
|
2 |
# 시뮬레이션의 '상태 저장소' & '엔진'
|
3 |
|
4 |
import threading
|
5 |
import time
|
|
|
6 |
from .npc.npc_manager import NPCManager
|
7 |
from .scenarios.scenario_setup import setup_initial_scenario
|
8 |
from .manager.simulation_manager import save_simulation, load_simulation
|
@@ -68,3 +69,39 @@ def initialize_simulation():
|
|
68 |
# 백그라운드 스레드에서 시뮬레이션 루프 시작
|
69 |
simulation_thread = threading.Thread(target=simulation_loop, daemon=True)
|
70 |
simulation_thread.start()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# portfolio/npc_social_network/simulation_core.py
|
2 |
# 시뮬레이션의 '상태 저장소' & '엔진'
|
3 |
|
4 |
import threading
|
5 |
import time
|
6 |
+
import random
|
7 |
from .npc.npc_manager import NPCManager
|
8 |
from .scenarios.scenario_setup import setup_initial_scenario
|
9 |
from .manager.simulation_manager import save_simulation, load_simulation
|
|
|
69 |
# 백그라운드 스레드에서 시뮬레이션 루프 시작
|
70 |
simulation_thread = threading.Thread(target=simulation_loop, daemon=True)
|
71 |
simulation_thread.start()
|
72 |
+
|
73 |
+
def process_interaction_and_witness(npc1, npc2):
|
74 |
+
"""두 NPC의 상호작용과 이를 목격하는 제3자를 처리합니다."""
|
75 |
+
global npc_manager, event_log
|
76 |
+
|
77 |
+
# 1. 두 NPC 간의 상호작용 (기존 로직)
|
78 |
+
# ... (예: npc1이 npc2에게 말을 거는 로직) ...
|
79 |
+
# dialogue = npc1.generate_dialogue(f"{npc2.name}에게 인사를 건다.", "오후", target_npc=npc2)
|
80 |
+
# interaction_content = f"{npc1.name} -> {npc2.name}: {dialogue}"
|
81 |
+
# interaction_emotion = npc1.emotion.get_dominant_emotion()
|
82 |
+
|
83 |
+
# --- [핵심 로직 시작] ---
|
84 |
+
|
85 |
+
# 2. 목격자 선정 (두 NPC를 제외한 나머지 중 랜덤 선택)
|
86 |
+
potential_witnesses = [npc for npc in npc_manager.all() if npc not in [npc1, npc2]]
|
87 |
+
if not potential_witnesses:
|
88 |
+
return
|
89 |
+
|
90 |
+
witness = random.choice(potential_witnesses)
|
91 |
+
|
92 |
+
# 3. 목격한 이벤트에 대한 '소문' 내용 생성
|
93 |
+
# (LLM을 사용해 더 자연스러운 소문을 생성할 수도 있습니다)
|
94 |
+
gossip_content = f"'{npc1.name}'와(과) '{npc2.name}'이(가) 서로 이야기하는 것을 봤다."
|
95 |
+
# 만약 상호작용에 강한 감정이 있었다면 소문에 포함
|
96 |
+
# if interaction_emotion in ["anger", "sadness", "joy"]:
|
97 |
+
# gossip_content += f" 분위기가 매우 {interaction_emotion}해 보였다."
|
98 |
+
|
99 |
+
# 4. 목격자가 '소문'을 기억하도록 함
|
100 |
+
# 중요도: 직접 겪은 일보다 낮게 설정
|
101 |
+
witness.remember(
|
102 |
+
content=gossip_content,
|
103 |
+
importance=4,
|
104 |
+
emotion="curiosity", # 소문을 들었을 때의 감정
|
105 |
+
memory_type="Gossip" # 이것이 소문임을 명시
|
106 |
+
)
|
107 |
+
add_log(f"[목격] {witness.name}이(가) {npc1.name}와(과) {npc2.name}의 상호작용을 목격했습니다.")
|