Spaces:
Sleeping
Sleeping
테스트 진행 중
Browse files
npc_social_network/maps/villages/town_hall.py
CHANGED
@@ -2,7 +2,8 @@
|
|
2 |
# 메인 실행 파일
|
3 |
import pygame
|
4 |
import sys
|
5 |
-
from npc_social_network.
|
|
|
6 |
from npc_social_network.maps.manager.image_loader import ImageLoader
|
7 |
from npc_social_network.maps.manager.village_map import VillageMap
|
8 |
from npc_social_network.maps.engine.game_engine import GameEngine
|
@@ -27,10 +28,8 @@ def run_town_hall_simulation():
|
|
27 |
npc_manager = load_simulation() # 저장된 상태를 불러오기 시도
|
28 |
|
29 |
if npc_manager is None:
|
30 |
-
# 저장된 파일이 없으면
|
31 |
-
npc_manager =
|
32 |
-
# 여기에 초기 NPC들을 추가하는 로직을 넣습니다.
|
33 |
-
# 예시: npc_manager.add_npc(NPC(name="엘라", ...))
|
34 |
|
35 |
# 로딩
|
36 |
image_loader = ImageLoader(tile_size)
|
|
|
2 |
# 메인 실행 파일
|
3 |
import pygame
|
4 |
import sys
|
5 |
+
from npc_social_network.scenarios.scenario_setup import setup_initial_scenario
|
6 |
+
from ..manager.simulation_manager import save_simulation, load_simulation
|
7 |
from npc_social_network.maps.manager.image_loader import ImageLoader
|
8 |
from npc_social_network.maps.manager.village_map import VillageMap
|
9 |
from npc_social_network.maps.engine.game_engine import GameEngine
|
|
|
28 |
npc_manager = load_simulation() # 저장된 상태를 불러오기 시도
|
29 |
|
30 |
if npc_manager is None:
|
31 |
+
# 저장된 파일이 없으면 새로운 시나리오 시작
|
32 |
+
npc_manager = setup_initial_scenario(image_loader)
|
|
|
|
|
33 |
|
34 |
# 로딩
|
35 |
image_loader = ImageLoader(tile_size)
|
npc_social_network/npc/npc_manager.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
# portfolio/npc_social_network/npc/npc_manager.py
|
2 |
import random
|
3 |
-
from typing import TYPE_CHECKING
|
4 |
|
5 |
if TYPE_CHECKING:
|
6 |
from .npc_base import NPC
|
@@ -11,19 +11,19 @@ class NPCManager:
|
|
11 |
self.npcs: list['NPC'] = []
|
12 |
self.npc_dict: dict[str, 'NPC'] = {}
|
13 |
|
14 |
-
def add_npc(self, npc: NPC):
|
15 |
"""NPC를 매니저에 추가합니다."""
|
16 |
if npc.name not in self.npc_dict:
|
17 |
self.npcs.append(npc)
|
18 |
self.npc_dict[npc.name] = npc
|
19 |
|
20 |
-
def get_npc_by_name(self, name: str):
|
21 |
"""
|
22 |
NPC 이름을 통해서 NPC의 정보를 반환
|
23 |
"""
|
24 |
return self.npc_dict.get(name)
|
25 |
|
26 |
-
def get_random_npc(self, exclude: "NPC"=None) -> "NPC":
|
27 |
"""
|
28 |
특정 NPC를 제외하고 랜덤한 NPC를 선택
|
29 |
- 추후 수정 내용: 상대 NPC가 랜덤이 아니라, 상호작용할 만한 근거가 있어야한다.
|
|
|
1 |
# portfolio/npc_social_network/npc/npc_manager.py
|
2 |
import random
|
3 |
+
from typing import TYPE_CHECKING, List, Optional
|
4 |
|
5 |
if TYPE_CHECKING:
|
6 |
from .npc_base import NPC
|
|
|
11 |
self.npcs: list['NPC'] = []
|
12 |
self.npc_dict: dict[str, 'NPC'] = {}
|
13 |
|
14 |
+
def add_npc(self, npc: 'NPC'):
|
15 |
"""NPC를 매니저에 추가합니다."""
|
16 |
if npc.name not in self.npc_dict:
|
17 |
self.npcs.append(npc)
|
18 |
self.npc_dict[npc.name] = npc
|
19 |
|
20 |
+
def get_npc_by_name(self, name: str) -> Optional['NPC']:
|
21 |
"""
|
22 |
NPC 이름을 통해서 NPC의 정보를 반환
|
23 |
"""
|
24 |
return self.npc_dict.get(name)
|
25 |
|
26 |
+
def get_random_npc(self, exclude: ["NPC"]=None) -> Optional["NPC"]:
|
27 |
"""
|
28 |
특정 NPC를 제외하고 랜덤한 NPC를 선택
|
29 |
- 추후 수정 내용: 상대 NPC가 랜덤이 아니라, 상호작용할 만한 근거가 있어야한다.
|
npc_social_network/scenarios/scenario_setup.py
ADDED
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from ..npc.npc_manager import NPCManager
|
2 |
+
from ..npc.npc_base import NPC
|
3 |
+
from ..npc.npc_memory import Memory
|
4 |
+
|
5 |
+
def setup_initial_scenario(image_loader) -> NPCManager:
|
6 |
+
"""
|
7 |
+
테스트를 위한 초기 NPC 월드를 설정하고 NPCManager를 반환합니다.
|
8 |
+
- 5명의 NPC 생성
|
9 |
+
- 각기 다른 초기 성격 및 기억 부여
|
10 |
+
- NPC 간의 초기 관계 설정
|
11 |
+
"""
|
12 |
+
print("새로운 시나리오를 설정합니다.: '시작의마을'")
|
13 |
+
npc_manager = NPCManager()
|
14 |
+
|
15 |
+
# --- 1. NPC 객체 생성 ---
|
16 |
+
# 엘린: 호기심 많고 감정적인 마법사
|
17 |
+
personality_elin = {"sensitive": 0.8, "stoic": 0.3, "cognitive_bias": 0.7}
|
18 |
+
elin = NPC("엘린", "마법사", [[2,3], [3,3], [4,3], [5,3], [5,4], [5,5]], image_loader.load("npc", "default"), personality=personality_elin)
|
19 |
+
|
20 |
+
# 밥: 무뚝뚝하지만 정직한 대장장이
|
21 |
+
personality_bob = {"sensitive": 0.2, "stoic": 0.8, "cognitive_bias": 0.4}
|
22 |
+
bob = NPC("밥", "대장장이", [[1,1], [1,2], [2,2], [3,2], [3,1]], image_loader.load("npc", "default"), personality=personality_bob)
|
23 |
+
|
24 |
+
# 앨리스: 사교적이고 계산적인 상인
|
25 |
+
personality_alice = {"sensitive": 0.5, "stoic": 0.5, "cognitive_bias": 0.8}
|
26 |
+
alice = NPC("앨리스", "대장장이", [[8,8], [9,8], [9,9], [8,9]], image_loader.load("npc", "default"), personality=personality_alice)
|
27 |
+
|
28 |
+
# 찰리: 성실하고 평화로운 농부
|
29 |
+
personality_charlie = {"sensitive": 0.6, "stoic": 0.6, "cognitive_bias": 0.3}
|
30 |
+
charlie = NPC("찰리", "농부", [[10,3], [11,3], [12,3], [12,4]], image_loader.load("npc", "default"), personality=personality_charlie)
|
31 |
+
|
32 |
+
# 다이애나: 조용하고 관찰력 있는 사서
|
33 |
+
personality_diana = {"sensitive": 0.7, "stoic": 0.7, "cognitive_bias": 0.9}
|
34 |
+
diana = NPC("다이애나", "사서", [[7,7], [7,8], [8,8]], image_loader.load("npc", "default"), personality=personality_diana)
|
35 |
+
|
36 |
+
# --- 2. 초기 기억 주입 ---
|
37 |
+
elin.remember(content="어젯밤 앨리스와 시장 가격 때문에 크게 다퉜다.", importance=8, emotion="anger")
|
38 |
+
alice.remember(content="어젯밤 엘라가 내게 무례하게 소리쳤다.", importance=8, emotion="resentment")
|
39 |
+
bob.remember(content="찰리가 어제 우리 집 지붕을 고쳐주어서 고맙다.", importance=7, emotion="gratitude")
|
40 |
+
charlie.remember(content="밥의 대장간 일을 도와주고 빵을 얻었다. 그는 좋은 친구다.", importance=6, emotion="joy")
|
41 |
+
diana.remember(content="도서관에서 밥이 책을 빌려가며 거칠게 다루어 조금 기분이 상했다.", importance=5, emotion="disgust")
|
42 |
+
|
43 |
+
# --- 3. NPC 매니저에 추가 ---
|
44 |
+
npc_manager.add_npc(elin)
|
45 |
+
npc_manager.add_npc(bob)
|
46 |
+
npc_manager.add_npc(alice)
|
47 |
+
npc_manager.add_npc(charlie)
|
48 |
+
npc_manager.add_npc(diana)
|
49 |
+
|
50 |
+
# --- 4. 초기 관계 설정 ---
|
51 |
+
# 엘라 <-> 앨리스 (나쁜 관계)
|
52 |
+
elin.relationships.update_relationship("앨리스", "anger", strength=5.0)
|
53 |
+
alice.relationships.update_relationship("엘라", "resentment", strength=4.0)
|
54 |
+
|
55 |
+
# 밥 <-> 찰리 (좋은 관계)
|
56 |
+
bob.relationships.update_relationship("찰리", "gratitude", strength=6.0)
|
57 |
+
charlie.relationships.update_relationship("밥", "joy", strength=7.0)
|
58 |
+
|
59 |
+
# 다이애나 -> 밥 (약간 부정적)
|
60 |
+
diana.relationships.update_relationship("밥", "disgust", strength=3.0)
|
61 |
+
|
62 |
+
print("✅ '시작의 마을' 시나리오 설정이 완료되었습니다.")
|
63 |
+
return npc_manager
|