This commit is contained in:
2025-10-05 06:13:39 +02:00
parent e9585f8570
commit 1640101f65
6 changed files with 243 additions and 16 deletions
+7 -1
View File
@@ -105,7 +105,13 @@ class GameState:
if building.owner_id != player_id:
return {"success": False, "error": "You don't own this building"}
building.name = name
# Validate name length (max 20 characters)
name = name.strip()
if len(name) > 20:
return {"success": False, "error": "Name too long (max 20 characters)"}
# Empty name is allowed (removes the label)
building.name = name if name else None
logger.info(f"Player {player_id} renamed building at ({x},{y}) to '{name}'.")
return {"success": True}
+11 -3
View File
@@ -22,10 +22,17 @@ def initialize_components(test_db_path=None):
"""Initialize server components with optional test database"""
global game_state, ws_manager, economy_engine, database
# Initialize database first
database = Database(test_db_path) if test_db_path else Database()
database.init_db()
# Create game state and load data from database
game_state = GameState()
game_state.load_state(database.load_game_state())
# Now create WebSocketManager (it will rebuild nickname mapping from loaded players)
ws_manager = WebSocketManager(game_state)
economy_engine = EconomyEngine(game_state)
database = Database(test_db_path) if test_db_path else Database()
return game_state, ws_manager, economy_engine, database
@@ -84,8 +91,7 @@ async def lifespan(app: FastAPI):
initialize_components()
logger.info("Server starting up...")
database.init_db()
game_state.load_state(database.load_game_state())
# Database and game state are already initialized in initialize_components()
# Start the hybrid economy loop
task = asyncio.create_task(economy_loop())
@@ -175,6 +181,8 @@ async def handle_message(websocket: WebSocket, data: dict):
if result["success"]:
await ws_manager.broadcast({"type": "building_updated", "x": data["x"], "y": data["y"], "name": data["name"]})
database.save_game_state(game_state)
else:
await websocket.send_json({"type": "error", "message": result["error"]})
elif msg_type == "chat":
nickname = await ws_manager.get_nickname(websocket)
+11
View File
@@ -13,6 +13,17 @@ class WebSocketManager:
self.player_nicknames: Dict[str, str] = {}
self.nickname_to_id: Dict[str, str] = {}
self.game_state = game_state
# Rebuild nickname-to-ID mapping from game state
self._rebuild_nickname_mapping()
def _rebuild_nickname_mapping(self):
"""Rebuild the nickname-to-ID mapping from existing players in game state."""
for player_id, player in self.game_state.players.items():
self.nickname_to_id[player.nickname] = player_id
if self.nickname_to_id:
logger.info(f"Rebuilt nickname-to-ID mapping for {len(self.nickname_to_id)} players: {list(self.nickname_to_id.keys())}")
async def connect(self, websocket: WebSocket, nickname: str):
"""Connect a new player, allowing multiple connections per nickname."""