feat: Eigenes Loot-Log Panel
- Separates loot_log für Loot, Ausrüstung, Verkäufe - Neues Panel 'Loot-Log' zwischen Ausrüstung und Quest - max 30 Einträge, in Save/Load integriert
This commit is contained in:
+13
-4
@@ -29,12 +29,19 @@ class GameEngine:
|
|||||||
self.quest_target = random.randint(3, 8)
|
self.quest_target = random.randint(3, 8)
|
||||||
self.log = []
|
self.log = []
|
||||||
self.max_log = 30
|
self.max_log = 30
|
||||||
|
self.loot_log = []
|
||||||
|
self.max_loot_log = 30
|
||||||
|
|
||||||
def _add_log(self, msg: str):
|
def _add_log(self, msg: str):
|
||||||
self.log.insert(0, msg)
|
self.log.insert(0, msg)
|
||||||
if len(self.log) > self.max_log:
|
if len(self.log) > self.max_log:
|
||||||
self.log = self.log[:self.max_log]
|
self.log = self.log[:self.max_log]
|
||||||
|
|
||||||
|
def _add_loot_log(self, msg: str):
|
||||||
|
self.loot_log.insert(0, msg)
|
||||||
|
if len(self.loot_log) > self.max_loot_log:
|
||||||
|
self.loot_log = self.loot_log[:self.max_loot_log]
|
||||||
|
|
||||||
def _spawn_monster(self) -> Monster:
|
def _spawn_monster(self) -> Monster:
|
||||||
name = self.cache.get_monster(self.character.level, self.current_location)
|
name = self.cache.get_monster(self.character.level, self.current_location)
|
||||||
level = max(1, self.character.level + random.randint(-1, 1))
|
level = max(1, self.character.level + random.randint(-1, 1))
|
||||||
@@ -153,7 +160,7 @@ class GameEngine:
|
|||||||
# Loot drop
|
# Loot drop
|
||||||
if random.randint(1, 100) <= 70: # 70% drop chance
|
if random.randint(1, 100) <= 70: # 70% drop chance
|
||||||
item = self._generate_loot(monster)
|
item = self._generate_loot(monster)
|
||||||
self._add_log(f"[magenta]📦 Loot: {item}[/]")
|
self._add_loot_log(f"[magenta]📦 {item}[/]")
|
||||||
events.append(("loot", f"[magenta]📦 {item}[/]", item))
|
events.append(("loot", f"[magenta]📦 {item}[/]", item))
|
||||||
self._auto_equip(item)
|
self._auto_equip(item)
|
||||||
else:
|
else:
|
||||||
@@ -191,7 +198,7 @@ class GameEngine:
|
|||||||
if current:
|
if current:
|
||||||
self.character.inventory.append(current)
|
self.character.inventory.append(current)
|
||||||
self.character.equipped[slot] = item
|
self.character.equipped[slot] = item
|
||||||
self._add_log(f"[cyan]🎽 Ausgerüstet: {item}[/]")
|
self._add_loot_log(f"[cyan]🎽 Ausgerüstet: {item}[/]")
|
||||||
else:
|
else:
|
||||||
self.character.inventory.append(item)
|
self.character.inventory.append(item)
|
||||||
else:
|
else:
|
||||||
@@ -202,7 +209,7 @@ class GameEngine:
|
|||||||
self.character.gold += item.value
|
self.character.gold += item.value
|
||||||
if item in self.character.inventory:
|
if item in self.character.inventory:
|
||||||
self.character.inventory.remove(item)
|
self.character.inventory.remove(item)
|
||||||
self._add_log(f"[dim]💰 Verkauft: {item.name} (+{item.value} Gold)[/]")
|
self._add_loot_log(f"[dim]💰 Verkauft: {item.name} (+{item.value}G)[/]")
|
||||||
|
|
||||||
def _sell_junk(self):
|
def _sell_junk(self):
|
||||||
"""Verkauft alle Schrott-Items."""
|
"""Verkauft alle Schrott-Items."""
|
||||||
@@ -215,7 +222,7 @@ class GameEngine:
|
|||||||
total_gold += item.value
|
total_gold += item.value
|
||||||
sold += 1
|
sold += 1
|
||||||
if sold > 0:
|
if sold > 0:
|
||||||
self._add_log(f"[dim]💰 {sold} Schrott verkauft (+{total_gold} Gold)[/]")
|
self._add_loot_log(f"[dim]💰 {sold} Schrott verkauft (+{total_gold}G)[/]")
|
||||||
|
|
||||||
def get_state(self) -> dict:
|
def get_state(self) -> dict:
|
||||||
return {
|
return {
|
||||||
@@ -225,6 +232,7 @@ class GameEngine:
|
|||||||
"quest_progress": self.quest_progress,
|
"quest_progress": self.quest_progress,
|
||||||
"quest_target": self.quest_target,
|
"quest_target": self.quest_target,
|
||||||
"log": self.log,
|
"log": self.log,
|
||||||
|
"loot_log": self.loot_log,
|
||||||
}
|
}
|
||||||
|
|
||||||
def save(self, path: str):
|
def save(self, path: str):
|
||||||
@@ -244,4 +252,5 @@ class GameEngine:
|
|||||||
engine.quest_progress = d.get("quest_progress", 0)
|
engine.quest_progress = d.get("quest_progress", 0)
|
||||||
engine.quest_target = d.get("quest_target", 5)
|
engine.quest_target = d.get("quest_target", 5)
|
||||||
engine.log = d.get("log", [])
|
engine.log = d.get("log", [])
|
||||||
|
engine.loot_log = d.get("loot_log", [])
|
||||||
return engine
|
return engine
|
||||||
@@ -141,6 +141,14 @@ def render_game(engine: GameEngine) -> Panel:
|
|||||||
log_text.append(t)
|
log_text.append(t)
|
||||||
log_text.append("\n")
|
log_text.append("\n")
|
||||||
|
|
||||||
|
# === Loot Log Panel ===
|
||||||
|
loot_text = Text()
|
||||||
|
for entry in engine.loot_log:
|
||||||
|
if isinstance(entry, str):
|
||||||
|
t = Text.from_markup(entry)
|
||||||
|
loot_text.append(t)
|
||||||
|
loot_text.append("\n")
|
||||||
|
|
||||||
# === Location ===
|
# === Location ===
|
||||||
loc_text = f"🌍 {engine.current_location}"
|
loc_text = f"🌍 {engine.current_location}"
|
||||||
|
|
||||||
@@ -164,6 +172,7 @@ def render_game(engine: GameEngine) -> Panel:
|
|||||||
|
|
||||||
layout["right"].split_column(
|
layout["right"].split_column(
|
||||||
Layout(Panel(equip_table), name="equip"),
|
Layout(Panel(equip_table), name="equip"),
|
||||||
|
Layout(Panel(loot_text, title="[bold]Loot-Log[/]"), name="loot"),
|
||||||
Layout(Panel(quest_text, title="[bold]Aktuelle Quest[/]"), name="quest"),
|
Layout(Panel(quest_text, title="[bold]Aktuelle Quest[/]"), name="quest"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user