added new obstacle, fixed a few bugs, added emp-limit
All checks were successful
Build, Publish Docker Image, and Deploy to Kubernetes / build_and_push (push) Successful in 5s
Build, Publish Docker Image, and Deploy to Kubernetes / deploy_to_k8s (push) Successful in 22s

This commit is contained in:
MatyasZsombor 2025-06-15 21:04:18 +02:00
parent d974f9d671
commit fc8bb30ab2

View File

@ -19,6 +19,7 @@
:- dynamic(combat_turn/1). :- dynamic(combat_turn/1).
:- dynamic(konami_sequence/1). :- dynamic(konami_sequence/1).
:- dynamic(konami_position/1). :- dynamic(konami_position/1).
:- dynamic(emp_used_in_combat/1).
% ========== INITIALIZATION ========== % ========== INITIALIZATION ==========
init_game :- init_game :-
@ -33,6 +34,7 @@ init_game :-
retractall(enemy_hacked(_)), retractall(enemy_hacked(_)),
retractall(hack_attempted(_)), retractall(hack_attempted(_)),
retractall(crow_weakened(_)), retractall(crow_weakened(_)),
retractall(emp_used_in_combat(_)),
% Initialize random number generator % Initialize random number generator
randomize, randomize,
@ -88,7 +90,7 @@ init_obstacles :-
% Obstacle between donauufer and poestlingberg % Obstacle between donauufer and poestlingberg
assertz(obstacle(donauufer, poestlingberg, drone_swarm)), assertz(obstacle(donauufer, poestlingberg, drone_swarm)),
assertz(obstacle(poestlingberg, donauufer, drone_swarm)). assertz(obstacle(poestlingberg, donauufer, drone_swarm)),
% Obstacle to aviary_hq % Obstacle to aviary_hq
assertz(obstacle(poestlingberg, aviary_hq, security_system)), assertz(obstacle(poestlingberg, aviary_hq, security_system)),
@ -99,20 +101,22 @@ item(laptop, 'Laptop', 'Dein vertrauter Laptop mit Hacking-Software.').
item(emp_granate, 'EMP-Granate', 'Eine elektromagnetische Impulsgranate gegen elektrische Systeme.'). item(emp_granate, 'EMP-Granate', 'Eine elektromagnetische Impulsgranate gegen elektrische Systeme.').
item(parkour_handschuhe, 'Parkour-Handschuhe', 'Verbessern deinen Grip beim Klettern.'). item(parkour_handschuhe, 'Parkour-Handschuhe', 'Verbessern deinen Grip beim Klettern.').
item(kampfdrohne, 'Kampfdrohne', 'Deine selbstgebaute Verteidigungsdrohne.'). item(kampfdrohne, 'Kampfdrohne', 'Deine selbstgebaute Verteidigungsdrohne.').
item(emp_generator, 'EMP-Generator', 'Ein mächtiger EMP-Generator gegen die Krähe.'). item(emp_generator, 'EMP-Generator', 'Ein mächtiger EMP-Generator gegen das Sischerheitssytem des Aviary HQs.').
item(coil, 'Elektro-Spule', 'Eine hochwertige Induktionsspule.'). item(spule, 'Elektro-Spule', 'Eine hochwertige Induktionsspule.').
item(battery, 'Hochleistungsbatterie', 'Eine spezielle Batterie für EMP-Geräte.'). item(batterie, 'Hochleistungsbatterie', 'Eine spezielle Batterie für EMP-Geräte.').
item(capacitor, 'Kondensator', 'Ein Hochspannungskondensator.'). item(kondensator, 'Kondensator', 'Ein Hochspannungskondensator.').
item(heilspray, 'Heilspray', 'Regeneriert 30 Gesundheitspunkte.'). item(heilspray, 'Heilspray', 'Regeneriert 30 Gesundheitspunkte.').
item(drohnen_motor, 'Drohnen-Motor', 'Ein kleiner Motor für Drohnen-Antrieb.'). item(drohnen_motor, 'Drohnen-Motor', 'Ein kleiner Motor für Drohnen-Antrieb.').
item(steuerungsmodul, 'Steuerungsmodul', 'Elektronisches Modul zur Drohnen-Steuerung.'). item(steuerungsmodul, 'Steuerungsmodul', 'Elektronisches Modul zur Drohnen-Steuerung.').
item(master_key, 'Master-Schlüssel', 'Ein geheimnisvoller Schlüssel mit Aviary-Logo. Gewährt vollständigen Systemzugriff.'). item(master_schluessel, 'Master-Schlüssel', 'Ein geheimnisvoller Schlüssel mit Aviary-Logo. Gewährt vollständigen Systemzugriff.').
% Initial item locations % Initial item locations
init_items :- init_items :-
retractall(item_location(_, _)), retractall(item_location(_, _)),
retractall(player_inventory(_)), retractall(player_inventory(_)),
assertz(player_inventory(laptop)), assertz(player_inventory(laptop)),
assertz(item_location(emp_granate, htl_werkstatt)),
assertz(item_location(emp_granate, htl_werkstatt)),
assertz(item_location(parkour_handschuhe, altstadt)), assertz(item_location(parkour_handschuhe, altstadt)),
assertz(item_location(heilspray, htl_labor)). assertz(item_location(heilspray, htl_labor)).
@ -144,7 +148,7 @@ start_game :-
init_items, init_items,
init_npcs, init_npcs,
init_enemies, init_enemies,
clear_screen, %clear_screen,
write('=== SKYNET: WINGS OF DECEPTION ==='), nl, write('=== SKYNET: WINGS OF DECEPTION ==='), nl,
write('Ein Text-Adventure von Jonas Hinterdorfer und Zsombor Matyas'), nl, nl, write('Ein Text-Adventure von Jonas Hinterdorfer und Zsombor Matyas'), nl, nl,
intro_story, intro_story,
@ -156,7 +160,7 @@ intro_story :-
write('Ihre Augen glühten rot und ihre Bewegungen waren unnatürlich präzise...'), nl, write('Ihre Augen glühten rot und ihre Bewegungen waren unnatürlich präzise...'), nl,
write('Jetzt sitzt du im Cybersicherheitslabor und analysierst die Aufnahmen.'), nl, nl, write('Jetzt sitzt du im Cybersicherheitslabor und analysierst die Aufnahmen.'), nl, nl,
write('Für alle verfügbare Befehle schreibe \'hilfe.\''), nl, write('Für alle verfügbare Befehle schreibe \'hilfe.\''), nl,
write('Bsp: \'verwende(laptop).\''), nl. write('Bsp: \'verwende(laptop).\''), nl, nl.
game_loop :- game_loop :-
(in_combat(Enemy) -> combat_loop(Enemy) ; normal_loop). (in_combat(Enemy) -> combat_loop(Enemy) ; normal_loop).
@ -164,26 +168,27 @@ game_loop :-
normal_loop :- normal_loop :-
player_location(Loc), player_location(Loc),
location(Loc, Name, _), location(Loc, Name, _),
nl,
write('Du befindest dich in: '), write(Name), nl, write('Du befindest dich in: '), write(Name), nl,
write('> '), write('> '),
read_line(Command), read_line(Command),
process_command(Command), process_command(Command),
nl,
check_game_state, check_game_state,
!, !,
game_loop. game_loop.
combat_loop(Enemy) :- combat_loop(Enemy) :-
enemy(Enemy, DisplayName, Health, _), enemy(Enemy, DisplayName, Health, _),
nl,
write('=== KAMPF GEGEN '), write(DisplayName), write(' ==='), nl, write('=== KAMPF GEGEN '), write(DisplayName), write(' ==='), nl,
write('Feind Gesundheit: '), write(Health), nl, write('Feind Gesundheit: '), write(Health), nl,
player_health(PlayerHealth), player_health(PlayerHealth),
write('Deine Gesundheit: '), write(PlayerHealth), nl, write('Deine Gesundheit: '), write(PlayerHealth), nl,
write('Verfügbare Aktionen: angriff, verwende(item)'), nl, write('Verfügbare Aktionen: angriff, verwende(item)'), nl, nl,
write('> '), write('> '),
read_line(Command), read_line(Command),
process_combat_command(Command, Enemy), process_combat_command(Command, Enemy),
check_combat_state, check_game_state,
!, !,
game_loop. game_loop.
@ -223,14 +228,14 @@ check_konami_input(Input) :-
true)) ; true)) ;
(retract(konami_position(_)), (retract(konami_position(_)),
assertz(konami_position(0)), assertz(konami_position(0)),
write('Ungültige Richtung.'), nl)). write('Invalide Code, Hinweis: Contra.'), nl)).
unlock_konami_code :- unlock_konami_code :-
game_state(konami_unlocked, false), game_state(konami_unlocked, false),
write('*** KONAMI CODE AKTIVIERT! ***'), nl, write('*** KONAMI CODE AKTIVIERT! ***'), nl,
write('Ein geheimnisvoller Master-Schlüssel materialisiert sich in deinem Inventar!'), nl, write('Ein geheimnisvoller Master-Schlüssel materialisiert sich in deinem Inventar!'), nl,
write('Dieses Artefakt gewährt dir vollständigen Zugriff auf alle Systeme...'), nl, write('Dieses Artefakt gewährt dir vollständigen Zugriff auf alle Systeme...'), nl,
assertz(player_inventory(master_key)), assertz(player_inventory(master_schluessel)),
retract(game_state(konami_unlocked, false)), retract(game_state(konami_unlocked, false)),
assertz(game_state(konami_unlocked, true)), assertz(game_state(konami_unlocked, true)),
retract(konami_position(_)), retract(konami_position(_)),
@ -312,9 +317,9 @@ process_command([cheat, heal]) :-
write('Gesundheit wiederhergestellt!'), nl. write('Gesundheit wiederhergestellt!'), nl.
process_command([cheat, items]) :- process_command([cheat, items]) :-
assertz(player_inventory(coil)), assertz(player_inventory(spule)),
assertz(player_inventory(battery)), assertz(player_inventory(batterie)),
assertz(player_inventory(capacitor)), assertz(player_inventory(kondensator)),
assertz(player_inventory(emp_granate)), assertz(player_inventory(emp_granate)),
assertz(player_inventory(emp_granate)), assertz(player_inventory(emp_granate)),
assertz(player_inventory(parkour_handschuhe)), assertz(player_inventory(parkour_handschuhe)),
@ -328,15 +333,15 @@ process_command([cheat, teleport, LOC]) :-
assertz(player_location(LOC)). assertz(player_location(LOC)).
process_command([cheat, generator_components]) :- process_command([cheat, generator_components]) :-
assertz(player_inventory(coil)), assertz(player_inventory(spule)),
assertz(player_inventory(battery)), assertz(player_inventory(batterie)),
assertz(player_inventory(capacitor)), assertz(player_inventory(kondensator)),
write('EMP-Generator Komponenten erhalten!'), nl. write('EMP-Generator Komponenten erhalten!'), nl.
process_command([cheat, generator_components]) :- process_command([cheat, generator_components]) :-
assertz(player_inventory(coil)), assertz(player_inventory(spule)),
assertz(player_inventory(battery)), assertz(player_inventory(batterie)),
assertz(player_inventory(capacitor)), assertz(player_inventory(kondensator)),
write('EMP-Generator Komponenten erhalten!'), nl. write('EMP-Generator Komponenten erhalten!'), nl.
process_command(_) :- process_command(_) :-
@ -540,8 +545,14 @@ combat_use_item(ItemName, Enemy) :-
combat_use_item(_, _) :- combat_use_item(_, _) :-
write('Du hast diesen Gegenstand nicht!'), nl. write('Du hast diesen Gegenstand nicht!'), nl.
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) :- execute_combat_item_use(emp_granate, Enemy) :-
enemy(Enemy, DisplayName, Health, Desc), enemy(Enemy, DisplayName, Health, Desc),
assertz(emp_used_in_combat(Enemy)),
(Enemy = die_kraehe -> (Enemy = die_kraehe ->
(write('Du schwächst die Krähe mit der EMP-Granate!'), nl, (write('Du schwächst die Krähe mit der EMP-Granate!'), nl,
retract(game_state(crow_weakened, false)), retract(game_state(crow_weakened, false)),
@ -555,8 +566,8 @@ execute_combat_item_use(emp_granate, Enemy) :-
(NewHealth =< 0 -> (NewHealth =< 0 ->
(write(DisplayName), write(' wurde besiegt!'), nl, (write(DisplayName), write(' wurde besiegt!'), nl,
defeat_enemy(Enemy)) ; defeat_enemy(Enemy)) ;
assertz(enemy(Enemy, DisplayName, NewHealth, Desc)), (assertz(enemy(Enemy, DisplayName, NewHealth, Desc)),
enemy_turn(Enemy)))). enemy_turn(Enemy))))).
execute_combat_item_use(kampfdrohne, Enemy) :- execute_combat_item_use(kampfdrohne, Enemy) :-
enemy(Enemy, DisplayName, Health, Desc), enemy(Enemy, DisplayName, Health, Desc),
@ -574,7 +585,12 @@ execute_combat_item_use(heilspray, _) :-
execute_item_use(heilspray). execute_item_use(heilspray).
execute_combat_item_use(Item, _) :- execute_combat_item_use(Item, _) :-
write(Item), write('kannst nicht in Kampf verwenden.'), nl. \+ 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_turn(Enemy) :- enemy_turn(Enemy) :-
enemy(Enemy, DisplayName, _, _), enemy(Enemy, DisplayName, _, _),
@ -584,36 +600,22 @@ enemy_turn(Enemy) :-
normal_enemy_attack(_, DisplayName) :- normal_enemy_attack(_, DisplayName) :-
get_random_enemy_damage(Damage), get_random_enemy_damage(Damage),
player_health(Health), damage_player(Damage),
NewHealth is Health - Damage,
write(DisplayName), write(' greift an und verursacht '), write(DisplayName), write(' greift an und verursacht '),
write(Damage), write(' Schaden!'), nl, write(Damage), write(' Schaden!'), nl.
retract(player_health(Health)),
assertz(player_health(NewHealth)).
crow_mind_control :- crow_mind_control :-
write('Die Krähe übernimmt die Kontrolle über deinen Verstand!'), nl, write('Die Krähe übernimmt die Kontrolle über deinen Verstand!'), nl,
write('Du schlägst dich selbst!'), nl, write('Du schlägst dich selbst!'), nl,
player_health(Health), damage_player(20),
Damage = 20, write('Du verursachst dir '), write(20), write(' Schaden!'), nl.
NewHealth is Health - Damage,
write('Du verursachst dir '), write(Damage), write(' Schaden!'), nl,
retract(player_health(Health)),
assertz(player_health(NewHealth)).
check_combat_state :-
player_health(Health),
Health =< 0,
end_game(defeat).
check_combat_state :-
player_health(Health),
Health > 0.
defeat_enemy(EnemyName) :- defeat_enemy(EnemyName) :-
retract(enemy_location(EnemyName, _)), retract(enemy_location(EnemyName, _)),
retract(in_combat(EnemyName)), retract(in_combat(EnemyName)),
handle_enemy_defeat(EnemyName). handle_enemy_defeat(EnemyName),
retractall(emp_used_in_combat(EnemyName)),
nl.
handle_enemy_defeat(tauben_schwarm) :- handle_enemy_defeat(tauben_schwarm) :-
write('Die Tauben explodieren! Du findest ein Heilspray und einen Drohnen-Motor in den Trümmern.'), nl, write('Die Tauben explodieren! Du findest ein Heilspray und einen Drohnen-Motor in den Trümmern.'), nl,
@ -639,13 +641,13 @@ handle_enemy_defeat(die_kraehe) :-
% ========== CRAFTING SYSTEM ========== % ========== CRAFTING SYSTEM ==========
craft_item(emp_generator) :- craft_item(emp_generator) :-
player_location(htl_werkstatt), player_location(htl_werkstatt),
player_inventory(coil), player_inventory(spule),
player_inventory(battery), player_inventory(batterie),
player_inventory(capacitor), player_inventory(kondensator),
write('Du baust aus Spule, Batterie und Kondensator einen EMP-Generator!'), nl, write('Du baust aus Spule, Batterie und Kondensator einen EMP-Generator!'), nl,
retract(player_inventory(coil)), retract(player_inventory(spule)),
retract(player_inventory(battery)), retract(player_inventory(batterie)),
retract(player_inventory(capacitor)), retract(player_inventory(kondensator)),
assertz(player_inventory(emp_generator)), assertz(player_inventory(emp_generator)),
retract(game_state(emp_built, false)), retract(game_state(emp_built, false)),
assertz(game_state(emp_built, true)), assertz(game_state(emp_built, true)),
@ -704,7 +706,7 @@ hacking_minigame(altstadt) :-
read(Answer), read(Answer),
(Answer = 1111 -> (Answer = 1111 ->
(write('Korrekt! Du findest eine Elektro-Spule in der Box!'), nl, (write('Korrekt! Du findest eine Elektro-Spule in der Box!'), nl,
assertz(player_inventory(coil)), assertz(player_inventory(spule)),
assertz(box_unlocked(altstadt_box))) ; assertz(box_unlocked(altstadt_box))) ;
(write('Falsch! Versuch es nochmal.'), nl, (write('Falsch! Versuch es nochmal.'), nl,
fail)). fail)).
@ -724,7 +726,7 @@ hacking_minigame(donauufer) :-
read(Answer), read(Answer),
(Answer = 2 -> (Answer = 2 ->
(write('Korrekt! Du findest eine Hochleistungsbatterie in der Box!'), nl, (write('Korrekt! Du findest eine Hochleistungsbatterie in der Box!'), nl,
assertz(player_inventory(battery)), assertz(player_inventory(batterie)),
assertz(box_unlocked(donauufer_box))) ; assertz(box_unlocked(donauufer_box))) ;
(write('Falsch! Versuch es nochmal.'), nl, (write('Falsch! Versuch es nochmal.'), nl,
fail)). fail)).
@ -746,7 +748,7 @@ hacking_minigame(poestlingberg) :-
read(Answer), read(Answer),
(Answer = 2 -> (Answer = 2 ->
(write('Korrekt! Du findest einen Kondensator in der Box!'), nl, (write('Korrekt! Du findest einen Kondensator in der Box!'), nl,
assertz(player_inventory(capacitor)), assertz(player_inventory(kondensator)),
assertz(box_unlocked(poestlingberg_box))) ; assertz(box_unlocked(poestlingberg_box))) ;
(write('Falsch! Versuch es nochmal.'), nl, (write('Falsch! Versuch es nochmal.'), nl,
fail)). fail)).
@ -817,10 +819,7 @@ parkour_minigame_altstadt :-
write('Du findest eine verschlossene Box auf dem Dach.'), nl, write('Du findest eine verschlossene Box auf dem Dach.'), nl,
write('Verwende "hack(box)" um sie zu öffnen.'), nl) ; write('Verwende "hack(box)" um sie zu öffnen.'), nl) ;
(write('Falsche Sequenz! Du rutschst ab und verlierst 10 Gesundheit.'), nl, (write('Falsche Sequenz! Du rutschst ab und verlierst 10 Gesundheit.'), nl,
player_health(Health), damage_player(10))).
NewHealth is Health - 10,
retract(player_health(Health)),
assertz(player_health(NewHealth)))).
climbing_minigame_donauufer :- climbing_minigame_donauufer :-
write('Balance-Challenge: Halte das Gleichgewicht!'), nl, write('Balance-Challenge: Halte das Gleichgewicht!'), nl,
@ -843,10 +842,7 @@ balance_challenge(0, Success) :-
balance_challenge(0, Success) :- balance_challenge(0, Success) :-
Success < 4, Success < 4,
write('Du verlierst das Gleichgewicht und fällst! 15 Schaden!'), nl, write('Du verlierst das Gleichgewicht und fällst! 15 Schaden!'), nl,
player_health(Health), damage_player(15),
NewHealth is Health - 15,
retract(player_health(Health)),
assertz(player_health(NewHealth)),
!. !.
balance_challenge(Remaining, Success) :- balance_challenge(Remaining, Success) :-
@ -972,9 +968,9 @@ show_status :-
(game_state(emp_built, true) -> (game_state(emp_built, true) ->
write('EMP-Generator: ✓ Gebaut'), nl ; write('EMP-Generator: ✓ Gebaut'), nl ;
(write('EMP-Generator Komponenten:'), nl, (write('EMP-Generator Komponenten:'), nl,
(player_inventory(coil) -> write(' Elektro-Spule: ✓') ; write(' Elektro-Spule: ✗')), nl, (player_inventory(spule) -> write(' Elektro-Spule: ✓') ; write(' Elektro-Spule: ✗')), nl,
(player_inventory(battery) -> write(' Batterie: ✓') ; write(' Batterie: ✗')), nl, (player_inventory(batterie) -> write(' Batterie: ✓') ; write(' Batterie: ✗')), nl,
(player_inventory(capacitor) -> write(' Kondensator: ✓') ; write(' Kondensator: ✗')), nl)), (player_inventory(kondensator) -> write(' Kondensator: ✓') ; write(' Kondensator: ✗')), nl)),
write('=============='), nl. write('=============='), nl.
% ========== GAME ENDINGS ========== % ========== GAME ENDINGS ==========
@ -1005,7 +1001,7 @@ handle_final_choice(2) :-
end_game(dark_ruler). end_game(dark_ruler).
handle_final_choice(3) :- handle_final_choice(3) :-
player_inventory(master_key), player_inventory(master_schluessel),
write('Du verwendest den Master-Schlüssel für vollständigen Systemzugriff...'), nl, write('Du verwendest den Master-Schlüssel für vollständigen Systemzugriff...'), nl,
write('Mit diesem legendären Artefakt hackst du dich mühelos durch alle Sicherheitsebenen!'), nl, write('Mit diesem legendären Artefakt hackst du dich mühelos durch alle Sicherheitsebenen!'), nl,
write('Du übernimmst nicht nur die Kontrolle - du wirst zum Meister des Systems!'), nl, write('Du übernimmst nicht nur die Kontrolle - du wirst zum Meister des Systems!'), nl,
@ -1085,6 +1081,12 @@ get_random_damage(Damage) :-
get_random_enemy_damage(Damage) :- get_random_enemy_damage(Damage) :-
random(8, 16, Damage). % Random enemy damage between 8-15 random(8, 16, Damage). % Random enemy damage between 8-15
damage_player(Damage) :-
player_health(Health),
NewHealth is Health - Damage,
retract(player_health(Health)),
assertz(player_health(NewHealth)).
random_member(Element, List) :- random_member(Element, List) :-
length(List, Length), length(List, Length),
Length > 0, Length > 0,