heutekeinkoenig/logik.pl

115 lines
2.8 KiB
Perl
Raw Normal View History

2023-05-22 15:31:21 +02:00
% hier kommt der ganze logik bums hin
% Der aktuelle Spieler wird hiermit gesetzt damit das später
% nicht bei jedem Aufruf angegeben werden muss
:- assert( current_player(1) ). % das muss so weil sonst err
% Aktualisieren des aktuellen Spielers geht hiermit
change_player_to(Player) :-
retract( current_player(_X) ),
assert( current_player(Player) ).
% Ein Spieler ist entweder current_player oder inactive_player
% je nach dem ob dieser gerade am Zug ist oder nicht
inactive_player(Player) :-
current_player(Player1),
2023-05-30 22:53:30 +02:00
player(Player1),
player(Player),
Player1 \= Player.
% Das hier muss an jedem Rundenende ausgeführt werden um den
% aktuellen Spieler zu wechseln
change_player :-
inactive_player(Player),
change_player_to(Player),
!.
2023-05-22 15:31:21 +02:00
% globalen Turncounter
2023-05-22 15:31:21 +02:00
player_turn(Player) :-
% calculate action points
calc_action_points(Player, _Turncounter),
2023-05-22 15:31:21 +02:00
% further logic
2023-05-22 16:45:00 +02:00
% end of turn
2023-05-22 15:31:21 +02:00
% save remaining ap
2023-05-22 15:56:32 +02:00
save_action_points(Player).
2023-05-30 22:53:30 +02:00
% Gibt den Betrag der Zahl zurück
betrag(Num1, Num2) :-
(
Num1 >= 0,
Num2 is Num1
), !
;
(
Num2 is -Num1
).
% Bewegt die Einheit des aktuellen Spielers an position Xold, Yold
% auf position Xnew, Ynew
einheit_move(Xold, Yold, Xnew, Ynew) :-
% Den aktuellen Spieler abfragen
current_player(Player),
% Die Einheitv on der alten Position nehmen
retract( einheit_active(Player, Type, Xold, Yold, Defense) ),
2023-05-22 15:56:32 +02:00
% Die Einheit an die neue Position setzen
assert( einheit_active(Player, Type, Xnew, Ynew, Defense) ),
2023-05-22 16:37:59 +02:00
% Errechnen der verbleibenden Tokens
retract( player_tokens(Player, Tokens) ),
2023-05-30 22:53:30 +02:00
betrag(Xold - Xnew, Xmove),
betrag(Yold - Ynew, Ymove),
TokensNew is Tokens - Xmove - Ymove,
TokensNew >= 0,
assert( player_tokens(Player, TokensNew) ).
% Lässt zwei Einheiten gegeneinander Kämpfen
% Die Einheit des aktuellen Spielers auf Xattack, Yattack
% greift die Einheit des anderen auf Xdefend, Ydefend an
einheit_attack(Xattack, Yattack, Xdefend, Ydefend) :-
current_player(Player),
einheit_active(Player, TypeAttack, Xattack, Yattack, _),
einheit_active(PlayerDefend, TypeDefend, Xdefend, Ydefend, HP),
2023-05-30 22:53:30 +02:00
einheit(TypeAttack, AP, _, _, _),
einheit(TypeDefend, _, _, Mult, _),
HPwithMult is HP * Mult,
(
(% Entweder die Einheit überlebt
2023-05-30 22:53:30 +02:00
einheit_alive(AP, HPwithMult, HPnew),
retract( einheit_active(PlayerDefend, TypeDefend,
Xdefend, Ydefend, HP) ),
assert( einheit_active(PlayerDefend, TypeDefend,
Xdefend, Ydefend, HPnew) )
)
;
(% Oder halt nicht
einheit_delete(Xdefend, Ydefend)
)
),
!.
% Prüft ob eine Einheit den Angriff überlebt und gibt die neue
% Defense/HP aus falls dem so ist
einheit_alive(AP, HP, HPnew) :-
HPnew is HP - AP,
HPnew > 0.
% Entfernt eine Einheit vom Spielfeld an Position X, Y
einheit_delete(X, Y) :-
retract( einheit_active(_, _, X, Y, _) ).