mirror of
https://github.com/JonasHinterdorfer/TextAdventure.git
synced 2025-10-26 03:41:10 +00:00
306 lines
12 KiB
Prolog
306 lines
12 KiB
Prolog
% ========== MAIN COMBAT LOOP ==========
|
|
combat_loop(Enemy) :-
|
|
enemy(Enemy, DisplayName, Health, _),
|
|
nl,
|
|
write('=== KAMPF GEGEN '), write(DisplayName), write(' ==='), nl,
|
|
write('Feind Gesundheit: '), write(Health), nl,
|
|
player_health(PlayerHealth),
|
|
write('Deine Gesundheit: '), write(PlayerHealth), nl,
|
|
health_recovery_used(Enemy, RecoveryUsed),
|
|
RemainingRecovery is 2 - RecoveryUsed,
|
|
write('Heilungen übrig: '), write(RemainingRecovery), write('/2'), nl,
|
|
write('Verfügbare Aktionen: angriff, heile, verwende(item)'), nl, nl,
|
|
write('> '),
|
|
read_line(Command),
|
|
process_combat_command(Command, Enemy),
|
|
check_game_state,
|
|
!,
|
|
game_loop.
|
|
|
|
% ========== COMBAT COMMANDS ==========
|
|
process_combat_command([angriff], Enemy) :-
|
|
combat_attack(Enemy).
|
|
|
|
process_combat_command([verwende, Item], Enemy) :-
|
|
combat_use_item(Item, Enemy).
|
|
|
|
process_combat_command([heile], Enemy) :-
|
|
combat_heal(Enemy).
|
|
|
|
process_combat_command(_, _) :-
|
|
write('Ungültige Kampfaktion! Verwende: angriff, heile oder verwende(item)'), nl.
|
|
|
|
% ========== TURN-BASED COMBAT SYSTEM ==========
|
|
start_combat(EnemyName) :-
|
|
player_location(Loc),
|
|
enemy_location(EnemyName, Loc),
|
|
assertz(drone_cooldown(EnemyName, 0)),
|
|
assertz(health_recovery_used(EnemyName, 0)),
|
|
assertz(enemy_hack_attempted(EnemyName, false)),
|
|
write('Du beginnst den Kampf gegen '), enemy(EnemyName, DisplayName, _, _),
|
|
write(DisplayName), write('!'), nl,
|
|
assertz(in_combat(EnemyName)),
|
|
!.
|
|
|
|
start_combat(_) :-
|
|
write('Hier ist kein Feind zum Angreifen.'), nl.
|
|
|
|
combat_attack(Enemy) :-
|
|
get_random_damage(Damage),
|
|
enemy(Enemy, DisplayName, Health, Desc),
|
|
NewHealth is Health - Damage,
|
|
write('Du greifst '), write(DisplayName), write(' an und verursachst '),
|
|
write(Damage), write(' Schaden!'), nl,
|
|
retract(enemy(Enemy, DisplayName, Health, Desc)),
|
|
(NewHealth =< 0 ->
|
|
(write(DisplayName), write(' wurde besiegt!'), nl,
|
|
defeat_enemy(Enemy)) ;
|
|
(assertz(enemy(Enemy, DisplayName, NewHealth, Desc)),
|
|
enemy_turn(Enemy))).
|
|
|
|
combat_use_item(ItemName, Enemy) :-
|
|
player_inventory(ItemName),
|
|
execute_combat_item_use(ItemName, Enemy),
|
|
!.
|
|
|
|
combat_use_item(_, _) :-
|
|
write('Du hast diesen Gegenstand nicht!'), nl.
|
|
|
|
combat_heal(Enemy) :-
|
|
health_recovery_used(Enemy, Used),
|
|
Used >= 2,
|
|
write('Du hast bereits alle Heilungen in diesem Kampf verbraucht!'), nl,
|
|
!.
|
|
|
|
combat_heal(_) :-
|
|
player_health(CurrentHealth),
|
|
CurrentHealth >= 100,
|
|
write('Du hast bereits volle Gesundheit!'), nl,
|
|
!.
|
|
|
|
combat_heal(Enemy) :-
|
|
health_recovery_used(Enemy, Used),
|
|
Used < 2,
|
|
random(19, 31, HealAmount),
|
|
player_health(CurrentHealth),
|
|
NewHealth is min(100, CurrentHealth + HealAmount),
|
|
HealedAmount is NewHealth - CurrentHealth,
|
|
retract(player_health(CurrentHealth)),
|
|
assertz(player_health(NewHealth)),
|
|
NewUsed is Used + 1,
|
|
retract(health_recovery_used(Enemy, Used)),
|
|
assertz(health_recovery_used(Enemy, NewUsed)),
|
|
write('Du heilst dich selbst und gewinnst '), write(HealedAmount),
|
|
write(' Gesundheitspunkte!'), nl,
|
|
RemainingUses is 2 - NewUsed,
|
|
write('Verbleibende Heilungen: '), write(RemainingUses), nl,
|
|
enemy_turn(Enemy).
|
|
|
|
% ========== COMBAT ITEMS ==========
|
|
execute_combat_item_use(emp_granate, Enemy) :-
|
|
emp_used_in_combat(Enemy),
|
|
write('Du hast bereits eine EMP-Granate in diesem Kampf verwendet!'), nl,
|
|
!.
|
|
|
|
execute_combat_item_use(emp_granate, Enemy) :-
|
|
enemy(Enemy, DisplayName, Health, Desc),
|
|
assertz(emp_used_in_combat(Enemy)),
|
|
(Enemy = die_kraehe ->
|
|
(write('Du schwächst die Krähe mit der EMP-Granate!'), nl,
|
|
retract(game_state(crow_weakened, false)),
|
|
assertz(game_state(crow_weakened, true)),
|
|
retract(player_inventory(emp_granate))) ;
|
|
(Damage = 40,
|
|
NewHealth is Health - Damage,
|
|
write('Die EMP-Granate verursacht '), write(Damage), write(' Schaden!'), nl,
|
|
retract(enemy(Enemy, DisplayName, Health, Desc)),
|
|
retract(player_inventory(emp_granate)),
|
|
(NewHealth =< 0 ->
|
|
(write(DisplayName), write(' wurde besiegt!'), nl,
|
|
defeat_enemy(Enemy)) ;
|
|
(assertz(enemy(Enemy, DisplayName, NewHealth, Desc)),
|
|
enemy_turn(Enemy))))).
|
|
|
|
execute_combat_item_use(kampfdrohne, Enemy) :-
|
|
drone_cooldown(Enemy, Cooldown),
|
|
Cooldown > 0,
|
|
write('Deine Kampfdrohne lädt noch auf! Cooldown: '), write(Cooldown), write(' Runden.'), nl,
|
|
!.
|
|
|
|
execute_combat_item_use(kampfdrohne, Enemy) :-
|
|
enemy(Enemy, DisplayName, Health, Desc),
|
|
Damage = 25,
|
|
NewHealth is Health - Damage,
|
|
write('Deine Kampfdrohne greift an und verursacht '), write(Damage), write(' Schaden!'), nl,
|
|
write('Die Drohne muss sich jetzt 2 Runden lang aufladen.'), nl,
|
|
% Set cooldown to 2 turns
|
|
retract(drone_cooldown(Enemy, _)),
|
|
assertz(drone_cooldown(Enemy, 2)),
|
|
retract(enemy(Enemy, DisplayName, Health, Desc)),
|
|
(NewHealth =< 0 ->
|
|
(write(DisplayName), write(' wurde besiegt!'), nl,
|
|
defeat_enemy(Enemy)) ;
|
|
(assertz(enemy(Enemy, DisplayName, NewHealth, Desc)),
|
|
enemy_turn(Enemy))).
|
|
|
|
execute_combat_item_use(laptop, Enemy) :-
|
|
hack_enemy(Enemy).
|
|
|
|
execute_combat_item_use(heilspray, _) :-
|
|
execute_item_use(heilspray).
|
|
|
|
execute_combat_item_use(Item, _) :-
|
|
\+ member(Item, [emp_granate, kampfdrohne, laptop, heilspray]),
|
|
item(Item, DisplayName, _),
|
|
write(DisplayName), write(' kann nicht im Kampf verwendet werden!'), nl.
|
|
|
|
execute_combat_item_use(Item, _) :-
|
|
write(Item), write(' kann nicht im Kampf verwendet werden!'), nl.
|
|
|
|
% ========== ENEMY HACKING SYSTEM ==========
|
|
hack_enemy(Enemy) :-
|
|
enemy_hack_attempted(Enemy, true),
|
|
write('Du hast bereits versucht, diesen Feind zu hacken!'), nl,
|
|
!.
|
|
|
|
hack_enemy(Enemy) :-
|
|
retract(enemy_hack_attempted(Enemy, false)),
|
|
assertz(enemy_hack_attempted(Enemy, true)),
|
|
enemy(Enemy, DisplayName, _, _),
|
|
write('=== FEIND HACKEN ==='), nl,
|
|
write('Du versuchst '), write(DisplayName), write(' zu hacken...'), nl,
|
|
enemy_hacking_minigame(Enemy).
|
|
|
|
% ========== ENEMY HACKING MINI-GAMES ==========
|
|
% Tauben-Schwarm: 1 Frage (Einfach)
|
|
enemy_hacking_minigame(tauben_schwarm) :-
|
|
write('=== SCHWARM-NETZWERK INFILTRATION ==='), nl,
|
|
write('Welches Protokoll verwenden IoT-Geräte hauptsächlich für Machine-to-Machine Kommunikation?'), nl,
|
|
write('1) HTTP'), nl,
|
|
write('2) MQTT'), nl,
|
|
write('3) FTP'), nl,
|
|
write('4) SMTP'), nl,
|
|
write('Deine Wahl (1-4): '),
|
|
read(Answer),
|
|
(Answer = 2 ->
|
|
successful_hack(tauben_schwarm, 25) ;
|
|
failed_hack(tauben_schwarm)).
|
|
|
|
% Storch-Drohne: 2 Fragen (Mittel)
|
|
enemy_hacking_minigame(storch_drohne) :-
|
|
write('=== KAMPFDROHNEN-SYSTEM HACKEN ==='), nl,
|
|
write('Frage 1/2: In welcher Schicht des OSI-Modells arbeiten Router hauptsächlich?'), nl,
|
|
write('1) Layer 2 (Data Link)'), nl,
|
|
write('2) Layer 7 (Application)'), nl,
|
|
write('3) Layer 4 (Transport)'), nl,
|
|
write('4) Layer 3 (Network)'), nl,
|
|
write('Deine Wahl (1-4): '),
|
|
read(Answer1),
|
|
(Answer1 = 4 ->
|
|
(write('Korrekt! Nächste Frage...'), nl,
|
|
write('Frage 2/2: Welcher Angriff nutzt Buffer Overflow aus?'), nl,
|
|
write('1) Return-to-libc'), nl,
|
|
write('2) Man-in-the-Middle'), nl,
|
|
write('3) Cross-Site Scripting'), nl,
|
|
write('4) DNS Spoofing'), nl,
|
|
write('Deine Wahl (1-4): '),
|
|
read(Answer2),
|
|
(Answer2 = 1 ->
|
|
successful_hack(storch_drohne, 35) ;
|
|
failed_hack(storch_drohne))) ;
|
|
failed_hack(storch_drohne)).
|
|
|
|
% Die Krähe: 3 Fragen (Schwer)
|
|
enemy_hacking_minigame(die_kraehe) :-
|
|
write('=== MASTER-KI INFILTRATION ==='), nl,
|
|
write('Frage 1/3: Welche Verschlüsselung ist quantenresistent?'), nl,
|
|
write('1) RSA-2048'), nl,
|
|
write('2) Lattice-based Cryptography'), nl,
|
|
write('3) Elliptic Curve'), nl,
|
|
write('Deine Wahl (1-3): '),
|
|
read(Answer1),
|
|
(Answer1 = 2 ->
|
|
(write('Korrekt! Nächste Frage...'), nl,
|
|
write('Frage 2/3: Was ist ein Zero-Day Exploit?'), nl,
|
|
write('1) Ein Exploit ohne bekannte Patches'), nl,
|
|
write('2) Ein Exploit, der täglich funktioniert'), nl,
|
|
write('3) Ein Exploit, der sofort erkannt wird'), nl,
|
|
write('4) Ein Exploit mit null Schaden'), nl,
|
|
write('Deine Wahl (1-4): '),
|
|
read(Answer2),
|
|
(Answer2 = 1 ->
|
|
(write('Korrekt! Letzte Frage...'), nl,
|
|
write('Frage 3/3: Welche Technik verwendet ROP (Return-Oriented Programming)?'), nl,
|
|
write('1) Heap Spraying'), nl,
|
|
write('2) Code Injection'), nl,
|
|
write('3) Gadget Chaining'), nl,
|
|
write('4) Format String Bugs'), nl,
|
|
write('Deine Wahl (1-4): '),
|
|
read(Answer3),
|
|
(Answer3 = 3 ->
|
|
successful_hack(die_kraehe, 50) ;
|
|
failed_hack(die_kraehe))) ;
|
|
failed_hack(die_kraehe))) ;
|
|
failed_hack(die_kraehe)).
|
|
|
|
% ========== HACK RESULTS ==========
|
|
successful_hack(Enemy, Damage) :-
|
|
enemy(Enemy, DisplayName, Health, Desc),
|
|
write('*** HACK ERFOLGREICH ***'), nl,
|
|
write('Du übernimmst temporär die Kontrolle über '), write(DisplayName), write('!'), nl,
|
|
write('Der Feind greift sich selbst an und erleidet '), write(Damage), write(' Schaden!'), nl,
|
|
NewHealth is Health - Damage,
|
|
retract(enemy(Enemy, DisplayName, Health, Desc)),
|
|
(NewHealth =< 0 ->
|
|
(write(DisplayName), write(' wurde durch den Hack zerstört!'), nl,
|
|
defeat_enemy(Enemy)) ;
|
|
(assertz(enemy(Enemy, DisplayName, NewHealth, Desc)),
|
|
write('Das System erholt sich... Der Feind ist wieder unter eigener Kontrolle.'), nl,
|
|
enemy_turn(Enemy))).
|
|
|
|
failed_hack(Enemy) :-
|
|
enemy(Enemy, DisplayName, _, _),
|
|
write('*** HACK FEHLGESCHLAGEN ***'), nl,
|
|
write('Dein Hack-Versuch wurde von '), write(DisplayName), write(' erkannt!'), nl,
|
|
write('Das System verstärkt seine Verteidigung und greift zurück!'), nl,
|
|
% Enemy gets an extra strong attack for failed hack
|
|
get_random_enemy_damage(BaseDamage),
|
|
ExtraDamage is BaseDamage + 10,
|
|
damage_player(ExtraDamage),
|
|
write(DisplayName), write(' führt einen verstärkten Gegenangriff aus und verursacht '),
|
|
write(ExtraDamage), write(' Schaden!'), nl.
|
|
|
|
% ========== ENEMY-ATTACKS/DEFEAT ==========
|
|
enemy_turn(Enemy) :-
|
|
drone_cooldown(Enemy, Cooldown),
|
|
(Cooldown > 0 ->
|
|
(NewCooldown is Cooldown - 1,
|
|
retract(drone_cooldown(Enemy, Cooldown)),
|
|
assertz(drone_cooldown(Enemy, NewCooldown))) ;
|
|
true),
|
|
enemy(Enemy, DisplayName, _, _),
|
|
(Enemy = die_kraehe, game_state(crow_weakened, false) ->
|
|
crow_mind_control ;
|
|
normal_enemy_attack(Enemy, DisplayName)).
|
|
|
|
normal_enemy_attack(_, DisplayName) :-
|
|
get_random_enemy_damage(Damage),
|
|
damage_player(Damage),
|
|
write(DisplayName), write(' greift an und verursacht '),
|
|
write(Damage), write(' Schaden!'), nl.
|
|
|
|
crow_mind_control :-
|
|
write('Die Krähe übernimmt die Kontrolle über deinen Verstand!'), nl,
|
|
write('Du schlägst dich selbst!'), nl,
|
|
damage_player(20),
|
|
write('Du verursachst dir '), write(20), write(' Schaden!'), nl.
|
|
|
|
defeat_enemy(EnemyName) :-
|
|
retract(enemy_location(EnemyName, _)),
|
|
retract(in_combat(EnemyName)),
|
|
handle_enemy_defeat(EnemyName),
|
|
retractall(emp_used_in_combat(EnemyName)),
|
|
retractall(drone_cooldown(EnemyName, _)),
|
|
retractall(health_recovery_used(EnemyName, _)),
|
|
retractall(enemy_hack_attempted(EnemyName, _)),
|
|
nl. |