mirror of
https://github.com/JonasHinterdorfer/TextAdventure.git
synced 2025-10-26 03:41:10 +00:00
188 lines
6.6 KiB
Prolog
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. |