#!/usr/bin/env python3 # -*- coding: utf-8 -*- """Hacking-Skill-Check-System: d20 + Hacking vs. Firewall, mit Trace-Marken.""" import random from doom_matrix.engine.ui import Colors, slow_print, menu HACK_EFFECTS = [ ("freeze", "Gegner einfrieren (verliert naechsten Zug)"), ("jam", "Waffe des Gegners blockieren (-50% Schaden fuer 2 Runden)"), ("leak", "HP-Leak (sofortiger Schaden ueber Zeit)"), ("turn", "Gegner gegen Verbuendete aufhetzen (falls mehrere anwesend)"), ] def attempt_hack(player, firewall, rng=None): """Fuehrt einen Skill-Check durch. Gibt (erfolg, roll_text) zurueck.""" rng = rng or random roll = rng.randint(1, 20) total = roll + player.hacking success = total >= firewall slow_print(f"\n{Colors.GREEN}[HACK-CHECK] Wurf: {roll} + Hacking {player.hacking} = {total} " f"vs. Firewall {firewall}{Colors.END}") if success: player.hacks += 1 else: player.trace_marks += 1 slow_print(f"{Colors.RED}Trace-Marke registriert! ({player.trace_marks}/3){Colors.END}") return success def choose_hack_effect(): print(f"\n{Colors.GREEN}Waehle deinen Hack-Effekt:{Colors.END}") options = [(str(i + 1), label) for i, (_, label) in enumerate(HACK_EFFECTS)] choice = menu(options, "Effekt") try: idx = int(choice) - 1 if 0 <= idx < len(HACK_EFFECTS): return HACK_EFFECTS[idx][0] except ValueError: pass return HACK_EFFECTS[0][0] def apply_hack_effect(effect, enemy, player, rng=None): rng = rng or random if effect == "freeze": enemy.frozen = True slow_print(f"{Colors.GREEN}{enemy.name} friert ein — System-Deadlock im naechsten Zug!{Colors.END}") elif effect == "jam": enemy.jammed = 2 slow_print(f"{Colors.GREEN}Die Waffe von {enemy.name} blockiert. Schaden -50% fuer 2 Runden.{Colors.END}") elif effect == "leak": leak_dmg = rng.randint(10, 20) enemy.apply_damage(leak_dmg) slow_print(f"{Colors.RED}HP-Leak! {enemy.name} verliert {leak_dmg} HP ueber einen Pufferueberlauf.{Colors.END}") elif effect == "turn": slow_print(f"{Colors.GREEN}{enemy.name} wird kurzzeitig gegen die eigene Seite aufgehetzt.{Colors.END}") enemy.turned = True def trace_triggered(player): """Wird True, wenn 3 Trace-Marken erreicht sind -- spawnt Verstaerkung.""" if player.trace_marks >= 3: player.trace_marks = 0 return True return False