TextAdventure/game_assets/combat_system.pl
2025-06-15 23:40:57 +02:00

188 lines
6.6 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)),
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(heilspray, _) :-
execute_item_use(heilspray).
execute_combat_item_use(Item, _) :-
\+ member(Item, [emp_granate, kampfdrohne, 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-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, _)),
nl.