Modulares Python-Textadventure mit Kampfsystem (Stagger, Bullet Time, Glory Kills, Hacking-Skill-Checks), Hub-Raum-Navigation, prozeduralen Encountern, 3 Charakterklassen, mehreren Enden und Story-Elementen (weißer Hase, Orakel, schwarze-Katze-Deja-vu-Glitch).
73 lines
2.5 KiB
Python
73 lines
2.5 KiB
Python
#!/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
|