Forum Nasza Grupa Strona Główna Nasza Grupa
Nasza mała lokalna społeczność żyjąca na Politechnice
 
 FAQFAQ   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy     GalerieGalerie   RejestracjaRejestracja 
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

"Symulator Bitew" działa turowy - połownicznie :P

 
Napisz nowy temat   Odpowiedz do tematu    Forum Nasza Grupa Strona Główna -> Programy
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
dyschemist
Zespolony z forum



Dołączył: 21 Gru 2006
Posty: 149
Przeczytał: 0 tematów

Ostrzeżeń: 0/5
Skąd: Z J.J. Portu

PostWysłany: Śro 22:57, 31 Sty 2007    Temat postu: "Symulator Bitew" działa turowy - połownicznie :P

With Ada.Text_Io;
With Ada.Integer_Text_Io;
With Ada.Characters.Handling;
With Ada.Numerics.Float_Random;
With Ada.Calendar;


Use Ada.Text_Io;
Use Ada.Integer_Text_Io;
Use Ada.Characters.Handling;
Use Ada.Numerics.Float_Random;
Use Ada.Calendar;

Procedure Symulator_Bitew Is
------------------------------------------------------------------------------
------------------------!! deklaracje typow !!--------------------------------
------------------------------------------------------------------------------

------------------------------------------------------------------------------
---------------------------typy wpisywane-------------------------------------
------------------------------------------------------------------------------
Type Jednostka Is
Record
--jednostka czyli oddzial;
Rodzaj : Integer Range 1 .. 16;
Liczba : Integer Range 1 .. 100;
Ranga : Integer Range 0 .. 10;
Zabil : Integer Range 0 .. 10000;
End Record;

Type Wojsko Is Array (Positive Range 1 .. 40) Of Jednostka;
Type Armia Is
Record
Dowodca : Integer Range 0 .. 10;
Wojska : Wojsko;
Ilosc : Integer;
End Record;
Type Strona Is Array (Positive Range 1 .. 13) Of Armia;

------------------------------------------------------------------------------
-----------------------------typy transformowane------------------------------
------------------------------------------------------------------------------
Type Oddzial_T Is
Record
Liczba : Integer Range 1 .. 100;
Atak : Integer Range 0 .. 10000;
Obrona : Integer Range 0 .. 10000;
Morale : Integer Range 0 .. 10000;
Zmeczenie : Integer Range 0 .. 10000;
Przydzial : Integer Range 1 .. 13;
Dowodca : Integer Range 0 .. 10;
Ranga : Integer Range 0 .. 10;
Mestwo : Integer Range 0 .. 10;
Zabil : Integer Range 0 .. 10000;
Ucieczka : Boolean;
End Record;

Type Wojsko_T Is Array (Positive Range 1 .. 100) Of Oddzial_T;

Type Wojsko_P Is
Record
Wojsko : Wojsko_T;
Ilosc_Oddz : Integer;
End Record;

Type Szyk Is Array (Positive Range 1 .. 16) Of Wojsko_P;

------------------------------------------------------------------------------
-------------------------------------!! funkcje !!----------------------------
------------------------------------------------------------------------------


Function Max (
X,
Y : Integer)
Return Integer Is
Begin
If X>Y Then
Return X;
Else
Return Y;
End If;
End Max;
------------------------------------------------------------------------------
--------------------------- ucieczka armii -----------------------------------
------------------------------------------------------------------------------
Function Ucieczka (
Strona : Szyk;
Piechota : Boolean;
Lucznicy : Boolean;
Jazda : Boolean;
Katapulty : Boolean;
Statki : Boolean)
Return Boolean Is
Tmp : Integer := 0;
Tmp2 : Integer := 0;

Function Czy_Walczy (
K : Integer;
--funkcja ktora stwierdza czy dany typ jednostek bierze udzial w danym starciu, jesli nie wyklucza go;
Piechota,
Luki,
Jazda,
Katapulty,
Statki : Boolean)
Return Boolean Is
Begin
Case K Is --warunki na typ jednostki
When 1|2|3|6|10 =>
Return Piechota;
When 4|8|9 =>
Return Luki;
When 5|7|11=>
Return Jazda;
When 12 =>
Return Katapulty;
When 13|14|15|16 =>
Return Statki;
When Others =>
Return False;
End Case;
End Czy_Walczy;


Begin
For I In 1..16 Loop
For J In 1..Strona(I).Ilosc_Oddz Loop
If Czy_Walczy(J,Piechota,Lucznicy,Jazda,Katapulty,Statki) Then
If Strona(I).Wojsko(J).Ucieczka Then
Tmp:=Tmp+1;
End If;
Tmp2:=Tmp2+1;
End If;
End Loop;
End Loop;
If Tmp = 0 And Tmp2=0 Then
Return True;
Else
If Float(Tmp)/Float(Tmp2)>0.7 Then
Return True;
Else
Return False;
End If;
End If;
End Ucieczka;
------------------------------------------------------------------------------
--------------------------- czy ktos jeszcze walczy --------------------------
------------------------------------------------------------------------------
Function Czy_Ktos_Jeszcze_Walczy (
Strona : Szyk;
I : Integer)
Return Boolean Is
Logiczna : Boolean := True;
Begin
For J In 1..Strona(I).Ilosc_Oddz Loop
Logiczna := Logiczna And Strona(I).Wojsko(J).Ucieczka;
End Loop;
Return Logiczna;
End Czy_Ktos_Jeszcze_Walczy;
------------------------------------------------------------------------------
--------------------------- wyjatek : Statki kontra piechota -----------------
------------------------------------------------------------------------------

Function Statki_Vs_Piechota (
Bez_Statkow : In Szyk;
Bez_Piechoty : In Szyk)
Return Boolean Is
Logiczna1 : Boolean := False;
Logiczna2 : Boolean := False;
Begin
For I In 1..Bez_Statkow(12).Ilosc_Oddz Loop
If Not Bez_Statkow(12).Wojsko(I).Ucieczka Then
Logiczna1:=True;
End If;
End Loop;
For I In 1..Bez_Piechoty(16).Ilosc_Oddz Loop
If Not Bez_Piechoty(12).Wojsko(I).Ucieczka Then
Logiczna2:=True;
End If;
End Loop;
Return Logiczna1 Or Logiczna2;
End Statki_Vs_Piechota;


------------------------------------------------------------------------------
-------------------------------------!! procedury !!--------------------------
------------------------------------------------------------------------------

------------------------------------------------------------------------------
-----------------------------------wczytanie armii----------------------------
------------------------------------------------------------------------------

Procedure Wczytaj_Armie (
Ar : Out Armia;
Index : In Integer) Is
Ranga : Integer := 20;
Ilosc_Pod_Oddz : Integer := 0;


Procedure Wczytaj_Oddzial (
Oddzial : Out Jednostka) Is
Temp : Integer := 0;
Begin
--wybor rodzaju
While Not (Temp In 1..16) Loop
Put_Line(
"Wybierz typ oddzialu: 1-Wiesniacy, 2-Piechurzy, 3-Ciezcy piechurzy");
Put_Line(
"4-Lucznicy,5-Kawalerzysci, 6-Woj Swiatynni, 7-Jezdzcy, 8-Kusznicy");
Put_Line(
"9-Konni Strzelcy, 10-Straznicy, 11-Ciezcy Jezdzcy, 12 -Katapulty");
Put_Line("13-Barki, 14-Karawele, 15-Kogi, 16-Karaki");
Get(Temp);
End Loop;
Oddzial.Rodzaj:=Temp;
--wpisanie licznosci;
Temp:=0;
If Oddzial.Rodzaj = 12 Then
Temp:=50;
Elsif Oddzial.Rodzaj = 13 Then
Temp:=80;
Elsif Oddzial.Rodzaj = 14 Then
Temp := 160;
Elsif Oddzial.Rodzaj = 15 Then
Temp :=230;
Elsif Oddzial.Rodzaj = 16 Then
Temp := 300;
End If;
While Not ( (Temp In 1..100 And Oddzial.Rodzaj=1) Or (Temp In 1..
80 And Oddzial.Rodzaj=2) Or
(Temp In 1..60 And (Oddzial.Rodzaj In 3..10)) Or (Temp In 1..
40 And Oddzial.Rodzaj=11)
Or (Oddzial.Rodzaj In 12..16)) Loop
Put_Line(
"Podaj ilosc jednostek w oddziale: (max 100 dla wiesniakow, 80 dla piechurow ");
Put_Line(
"40 dla ciezkich jezdzcow lub 60 dla innych jednostek");
Get(Temp);
End Loop;
Oddzial.Liczba:=Temp;
--wpisanie rangi;
Temp:=20;
While Not (Temp In 0..10) Loop
Put_Line("Podaj range oddzialu");
Get(Temp);
End Loop;
Oddzial.Ranga:=Temp;
Oddzial.Zabil:=0;
End Wczytaj_Oddzial;


Begin
While Not (Ranga In 0..10) Loop
Put("Podaj range dowodcy ");
Put(Index,2);
Put(" armii:");
New_Line;
Get(Ranga);
End Loop;
Ar.Dowodca :=Ranga;
Ilosc_Pod_Oddz := 0;
While Not (Ilosc_Pod_Oddz In 1..40) Loop
Put_Line("Podaj ilosc oddzialow w armii:");
Get(Ilosc_Pod_Oddz);
End Loop;
Ar.Ilosc:=Ilosc_Pod_Oddz;
For I In 1..Ilosc_Pod_Oddz Loop
Wczytaj_Oddzial(Ar.Wojska(I));
End Loop;
End Wczytaj_Armie;
------------------------------------------------------------------------------
--------procedure przeliczania sil--------------------------------------------
------------------------------------------------------------------------------

Procedure Wylicz_Atak_Obrone (
Atak : Out Integer;
Obrona : Out Integer;
Morale : Out Integer;
Zmeczenie : Out Integer;
Rodzaj : In Integer;
Honor : In Integer;
Pole : In Integer) Is
Bazowy : Integer := 0;
Begin
Atak:=0;
Obrona:=0;
Morale:=0;
Zmeczenie:=0;
Case Rodzaj Is --wprowadzenie podstawowych danych jednostek
When 1 =>
Bazowy:=50+10*Honor;
Morale:=100;
Zmeczenie:=100;
When 2 =>
Bazowy:=60+10*Honor;
Morale:=150;
Zmeczenie:=150;

When 3 =>
Bazowy:=65+10*Honor;
Morale:=200;
Zmeczenie:=150;

When 4 =>
Bazowy:=50+10*Honor;
Morale:=100;
Zmeczenie:=110;

When 5 =>
Bazowy:=70+10*Honor;
Morale:=150;
Zmeczenie:=250;

When 6 =>
Bazowy:=100+20*Honor;
Morale:=300;
Zmeczenie:=250;

When 7 =>
Bazowy:=85+15*Honor;
Morale:=200;
Zmeczenie:=280;

When 8 =>
Bazowy:=70+15*Honor;
Morale:=150;
Zmeczenie:=130;

When 9 =>
Bazowy :=85+15*Honor;
Morale:=150;
Zmeczenie:=280;

When 10 =>
Bazowy := 150+20*Honor;
Morale:=350;
Zmeczenie:=250;

When 11 =>
Bazowy := 170+20*Honor;
Morale:=450;
Zmeczenie:=300;

When 12 =>
Bazowy := 600+10*Honor;
Morale:=30;
Zmeczenie:=100;

When 13 =>
Bazowy := 250+10*Honor;
Morale:=100;
Zmeczenie:=100;

When 14 =>
Bazowy := 340+10*Honor;
Morale:=200;
Zmeczenie:=200;

When 15 =>
Bazowy := 450+15*Honor;
Morale:=250;
Zmeczenie:=300;

When 16 =>
Bazowy := 650+20*Honor;
Morale:=600;
Zmeczenie:=400;

When Others =>
Null;
End Case;
Atak:=Bazowy;
Obrona:=Bazowy;
Case Rodzaj Is --modyfikator pola walki
When 1|2|3|4|6|8|10 =>
If Pole = 2 Then
Atak:=(Atak*4)/5;
Obrona:=(Obrona*6)/5;
Elsif Pole=3 Then
Atak:=(Atak*3)/5;
Obrona:=(Obrona*7)/5;
End If;
When 5|7|9|11 =>
If Pole =2 Then
Atak :=(Atak*3)/5;
Obrona:=(Obrona*6)/5;
Elsif Pole = 3 Then
Atak := (Atak*2)/5;
Obrona := (Obrona*7)/5;
Elsif Pole = 4 Then
Atak := (Atak*4)/5;
Obrona := (Obrona*9)/10;
Elsif Pole = 5 Then
If Rodzaj=5 Then
Atak :=65;
Obrona :=65;
ElsIf Rodzaj=7 Then
Atak :=80;
Obrona :=80;
ElsIf Rodzaj=9 Then
Atak :=70;
Obrona :=70;
ElsIf Rodzaj=11 Then
Atak :=170;
Obrona :=170;
End If;
Elsif Pole=6 Then
Atak := Atak/5;
Obrona := Obrona/5;
End If;
When 12 =>
If Pole = 4 Then
Atak := (Atak*7)/5;
End If;
Obrona := 20;
When 13|14|15|16 =>
If (Pole In 1..4) Or (Pole=7) Then
Atak:=0;
Obrona:=0;
End If;
When Others =>
Null;
End Case;
End Wylicz_Atak_Obrone;
------------------------------------------------------------------------------
--------------------------detransformacja-------------------------------------
------------------------------------------------------------------------------

Procedure Detransformacja (
Formacja : In Szyk;
Deformacja : Out Strona) Is
Type Ilosc_Chwilowa Is Array (Positive Range 1 .. 13) Of Integer;
Tablica : Ilosc_Chwilowa := (1 .. 13 => 0);
Begin
For I In 1..16 Loop
For J In 1..Formacja(I).Ilosc_Oddz Loop
Tablica(Formacja(I).Wojsko(J).Przydzial):=Tablica(Formacja(I).Wojsko(J).Przydzial)+1;
Deformacja(Formacja(I).Wojsko(J).Przydzial).Dowodca := Formacja(I).Wojsko(J).Dowodca;
Deformacja(Formacja(I).Wojsko(J).Przydzial).Wojska(Tablica(Formacja(I).Wojsko(J).Przydzial)).Rodzaj:=I;
Deformacja(Formacja(I).Wojsko(J).Przydzial).Wojska(Tablica(Formacja(I).Wojsko(J).Przydzial)).Liczba:=Formacja(I).Wojsko(J).Liczba;
Deformacja(Formacja(I).Wojsko(J).Przydzial).Wojska(Tablica(Formacja(I).Wojsko(J).Przydzial)).Ranga:=-Max(-10,-(Formacja(I).Wojsko(J).Ranga+Formacja(I).Wojsko(J).Mestwo));
Deformacja(Formacja(I).Wojsko(J).Przydzial).Wojska(Tablica(Formacja(I).Wojsko(J).Przydzial)).Zabil:=Formacja(I).Wojsko(J).Zabil;
End Loop;
End Loop;
For I In 1..13 Loop
Deformacja(I).Ilosc := Tablica(I);
End Loop;

End Detransformacja;
------------------------------------------------------------------------------
--------------------------wypisz oddzialy-------------------------------------
------------------------------------------------------------------------------
Procedure Wypisz (
Formacja : In Strona;
File : In Out File_Type) Is
Function Rodzaj (
Liczba : In Integer)
Return String Is
Begin
Case Liczba Is
When 1 =>
Return "wiesniacy";
When 2=>
Return "piechurzy";
When 3=>
Return "ciezcy piechurzy";
When 4=>
Return "lucznicy";
When 5=>
Return "kawaleria";
When 6=>
Return "wojownicy swiatynni";
When 7=>
Return "jezdzcy";
When 8=>
Return "kusznicy";
When 9=>
Return "konni lucznicy";
When 10=>
Return "straznicy";
When 11 =>
Return "ciezcy jezdzcy";
When 12 =>
Return "katapulty";
When 13=>
Return "barki";
When 14=>
Return "karawele";
When 15=>
Return "kogi";
When 16=>
Return "karaki";
When Others=>
Return " ";
End Case;
End Rodzaj;
Begin
For I In 1..13 Loop
Put(File,"-");
Put(File,I,2);
Put(File," armia:");
Put("Dowodca armii w randze: ");
Put(Formacja(I).Dowodca,2);
For J In 1..Formacja(I).Ilosc Loop
Put(File,"Oddzial : "&Rodzaj(Formacja(I).Wojska(J).Rodzaj)&" w liczbie");
Put(File,Formacja(I).Wojska(J).Liczba);
Put(File," o randze: ");
Put(File,Formacja(I).Wojska(J).Ranga,2);
Put(File," w bitwie scieli glow: ");
Put(File,Formacja(I).Wojska(J).Zabil,4);
New_Line(File,1);
End Loop;
New_Line(File,2);
End Loop;
End Wypisz;
------------------------------------------------------------------------------
--------------------------wylicz ilosc wojska---------------------------------
------------------------------------------------------------------------------

Procedure Wylicz_Wojsko (
Formacja : In Szyk;
Piechota : Out Integer;
Lucznicy : Out Integer;
Jezdzcy : Out Integer;
Katapulty : Out Integer;
Statki : Out Integer) Is
Begin
Piechota:=0;
Lucznicy:=0;
Jezdzcy:=0;
Katapulty:=0;
Statki:=0;
For I In 1..3 Loop
For J In 1..Formacja(I).Ilosc_Oddz Loop
If Not Formacja(I).Wojsko(J).Ucieczka Then
Piechota:=Piechota+Formacja(I).Wojsko(J).Liczba;
End If;
End Loop;
End Loop;
For J In 1..Formacja(4).Ilosc_Oddz Loop
If Not Formacja(4).Wojsko(J).Ucieczka Then
Lucznicy:=Lucznicy+Formacja(4).Wojsko(J).Liczba;
End If;
End Loop;
For J In 1..Formacja(5).Ilosc_Oddz Loop
If Not Formacja(5).Wojsko(J).Ucieczka Then
Jezdzcy:=Jezdzcy+Formacja(5).Wojsko(J).Liczba;
End If;
End Loop;
For J In 1..Formacja(6).Ilosc_Oddz Loop
If Not Formacja(6).Wojsko(J).Ucieczka Then
Piechota:=Piechota+Formacja(6).Wojsko(J).Liczba;
End If;
End Loop;
For J In 1..Formacja(7).Ilosc_Oddz Loop
If Not Formacja(7).Wojsko(J).Ucieczka Then
Jezdzcy:=Jezdzcy+Formacja(7).Wojsko(J).Liczba;
End If;
End Loop;
For I In 8..9 Loop
For J In 1..Formacja(I).Ilosc_Oddz Loop
If Not Formacja(I).Wojsko(J).Ucieczka Then
Lucznicy:=Lucznicy+Formacja(I).Wojsko(J).Liczba;
End If;
End Loop;
End Loop;
For J In 1..Formacja(10).Ilosc_Oddz Loop
If Not Formacja(10).Wojsko(J).Ucieczka Then
Piechota:=Piechota+Formacja(10).Wojsko(J).Liczba;
End If;
End Loop;
For J In 1..Formacja(11).Ilosc_Oddz Loop
If Not Formacja(11).Wojsko(J).Ucieczka Then
Jezdzcy:=Jezdzcy+Formacja(11).Wojsko(J).Liczba;
End If;
End Loop;
For J In 1..Formacja(12).Ilosc_Oddz Loop
If Not Formacja(12).Wojsko(J).Ucieczka Then
Katapulty:=Katapulty+Formacja(12).Wojsko(J).Liczba;
End If;
End Loop;
For I In 13..16 Loop
For J In 1..Formacja(I).Ilosc_Oddz Loop
If Not Formacja(I).Wojsko(J).Ucieczka Then
Statki:=Statki+Formacja(I).Wojsko(J).Liczba;
End If;
End Loop;
End Loop;
End Wylicz_Wojsko;

------------------------------------------------------------------------------
--------------------------walka oddzialow-------------------------------------
------------------------------------------------------------------------------

Procedure Walka (
Agresor : In Out Oddzial_T;
Obronca : In Out Oddzial_T) Is
Wsp_Atakujacego : Float := Float (Agresor.Atak) / Float (Agresor.Atak + Obronca.Obrona);
G : Generator;
Tmp : Float;
Tmp2 : Integer;
Begin
If Not Agresor.Ucieczka Then
Reset(G);
Tmp:=Wsp_Atakujacego*(4.5+Random(G))/5.0;
If (Tmp/Wsp_Atakujacego)>(5.48/5.0) Then --warunki na wyjatkowa postawe w walce
Agresor.Mestwo:=-Max(-(Agresor.Mestwo+1),-10);
Elsif (Tmp/Wsp_Atakujacego)<(4.52/5.0) Then
Obronca.Mestwo:=-Max(-10,-(Obronca.Mestwo+1));
End If;
Tmp2:=Integer(Float(Agresor.Liczba)*Tmp); --straty w ludziach
Obronca.Liczba:=Max(Obronca.Liczba-Tmp2,0); -- podliczenie stanu oddzialu
Agresor.Zmeczenie:=Max(Agresor.Zmeczenie-(Tmp2/6),0);--zmeczenie agresora
Obronca.Morale:=Max(Obronca.Morale-(Tmp2/4),0);--oslabienie morale
Agresor.Zabil:=-(Max(-Obronca.Liczba,-Tmp2))+Agresor.Zabil; --ilosc ofiar oddzialu
If Agresor.Zmeczenie < 30 Then --warunek na ucieczke
Agresor.Ucieczka:=True;
Elsif Obronca.Morale < 40 Or Obronca.Liczba=0 Then --warunek na ucieczke
Obronca.Ucieczka := True;
End If;
End If;
End Walka;

------------------------------------------------------------------------------
--------------------------Losowanie oddzialu----------------------------------
------------------------------------------------------------------------------
Procedure Losowanie (
Armia : In Szyk;
Suma : In Integer;
Piechota : In Boolean;
Luki : In Boolean;
Jazda : In Boolean;
Katapulty : In Boolean;
Statki : In Boolean;
I : Out Integer;
J : Out Integer) Is
Tmp : Integer := 0;
Mala_Suma : Integer := 0;
G : Generator;
Flaga : Boolean := False;

Function Czy_Niebroniona (
K : Integer;
--funkcja ktora stwierdza czy dany typ jednostek bierze udzial w danym starciu, jesli nie wyklucza go;
Piechota,
Luki,
Jazda,
Katapulty,
Statki : Boolean)
Return Boolean Is
Begin
Case K Is --warunki na typ jednostki
When 1|2|3|6|10 =>
Return Piechota;
When 4|8|9 =>
Return Luki;
When 5|7|11=>
Return Jazda;
When 12 =>
Return Katapulty;
When 13|14|15|16 =>
Return Statki;
When Others =>
Return False;
End Case;
End Czy_Niebroniona;

Begin
Reset(G);
While Not Flaga Loop --petla do uzyskania jednostki sposrod bioracych udzial w walce
--losowanie typu jednostki;
Tmp:=Integer(Random(G)*Float(Suma)+0.5);
Mala_Suma:=0;
For K In 1..16 Loop
If (Tmp > Mala_Suma) And (Tmp<=(Mala_Suma+Armia(K).Ilosc_Oddz)) And --ten warunek zapewnia wywazony wybor rodzaju jednostki
Czy_Niebroniona(K,Piechota,Luki,Jazda,Katapulty,Statki) Then --(kazda jednostka ma taka sama szanse wziac udzial w walce);
I:=K;
Flaga:=True;
End If;
Mala_Suma:=Mala_Suma+Armia(K).Ilosc_Oddz;
End Loop;
End Loop;
--losowanie numeru jednostki;
J:=Integer(Random(G)*Float(Armia(I).Ilosc_Oddz)+0.5);
End Losowanie;

------------------------------------------------------------------------------
--------------------------Wybor celu------------------------------------------
------------------------------------------------------------------------------


Procedure Wybierz_Cel (
Obronca : In Out Szyk;
Suma_Obrony : In Integer;
Typ_Cel : Out Integer;
Numer_Cel : Out Integer;
Piechota : In Boolean;
Luki : In Boolean;
Jazda : In Boolean;
Katapulty : In Boolean;
Statki : In Boolean) Is
G : Generator;
Logiczna : Boolean := False;
Begin
For I In 1..16 Loop
Logiczna:=Logiczna Or Czy_Ktos_Jeszcze_Walczy(Obronca,I);
End Loop;
If (Not Logiczna) Then
Numer_Cel:=0;
Typ_Cel:=0;
End If;
While Logiczna Loop
Reset(G);
Losowanie(Obronca,Suma_Obrony,Piechota,Luki,Jazda,Katapulty,--losowanie jednostki
Statki,Typ_Cel,Numer_Cel);
If Not Obronca(Typ_Cel).Wojsko(Numer_Cel).Ucieczka Then --warunek wyjscia poza petle, oddzial nie moze uciekac
Exit;
End If;
End Loop;
End Wybierz_Cel;
-------------------------------------------------------------------------------
Procedure Wybierz_Cel_Oblezenie (
Obronca : In Out Szyk;
Suma_Obrony : In Integer;
Mur : In Out Float;
--zmienna pomagajaca w wyliczeniu szans na trafienie w mury zamku
Brama : In Out Integer;
--wytrzymalosc bramy
Typ_Cel : Out Integer;
Numer_Cel : Out Integer) Is
Klasa_Celu : Integer;
G : Generator;
Logiczna : Boolean := True;
Begin
Reset(G);
Typ_Cel:=0;
Numer_Cel:=0;
Loop
Klasa_Celu:=Integer(Random(G)*(16.0+Mur)+0.5);
If Klasa_Celu >16 Then --efekt strzalu w zamek
If Random(G)>0.6 Then --40% szansa na trafienie kamieniem w zamek
Brama:=Max(Brama-Integer(Random(G)*40.0),0); --generacja uszkodzen
If Brama <1 Then--warunek zniszczenia bramy
Mur:=0.0;
End If;
End If;
Exit;
Else
For I In 1..16 Loop
Logiczna:=Logiczna And Czy_Ktos_Jeszcze_Walczy(Obronca,I);
End Loop;
If Logiczna Then
Losowanie(Obronca,Suma_Obrony,True,True,True,True,True, --losowanie dowolnego oddzialu przy trafieniu
Typ_Cel,Numer_Cel);
If Not Obronca(Typ_Cel).Wojsko(Numer_Cel).Ucieczka Then --warunkiem wyjsca za petle jest ze oddzial nie ucieka
Exit;
End If;
Elsif (Not Logiczna) And Mur=0.0 Then
Numer_Cel:=0;
Typ_Cel:=0;
End If;
End If;
End Loop;

End Wybierz_Cel_Oblezenie;

------------------------------------------------------------------------------
--------------------------!! Fazy Walki !!------------------------------------
------------------------------------------------------------------------------

------------------------------------------------------------------------------
-------------------------- Faza Ostrzalu Katapult ----------------------------
------------------------------------------------------------------------------

Procedure Ostrzal_Katapult (
Agresor : In Out Szyk;
Obronca : In Out Szyk;
Brama : In Out Integer;
Pole_Bitwy : In Integer) Is
Typ_Cel : Integer;
Numer_Cel : Integer;
Suma_Obrony : Integer := 0;
Mur : Float;
G : Generator;
Begin
Reset(G);
If (Pole_Bitwy = 7 Or Pole_Bitwy =9) And Brama >0 Then --warunek na istnienie zamku (lub jego gotowosci obronnej)
Mur := 12.0;
Else
Mur:=0.0;
End If;
For I In 1..16 Loop --wyliczenie ilosci oddzialow obroncy
Suma_Obrony:=Obronca(I).Ilosc_Oddz+Suma_Obrony;
End Loop;
For I In 1..Agresor(12).Ilosc_Oddz Loop --petla ostrzalu wszystkimi katapultami
Wybierz_Cel_Oblezenie(Obronca,Suma_Obrony,Mur,Brama,Typ_Cel,
Numer_Cel);
If (Not (Typ_Cel=0)) And (Random(G) > 0.7) Then --30% szansa na trafienie oddzialu
Walka(Agresor(12).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
End Ostrzal_Katapult;

------------------------------------------------------------------------------
-------------------------- Faza Ostrzalu Lucznikow ---------------------------
------------------------------------------------------------------------------

Procedure Ostrzal_Z_Lukow (
Agresor : In Out Szyk;
Obronca : In Out Szyk) Is
Typ_Cel : Integer;
Numer_Cel : Integer;
Suma_Obrony : Integer := 0;

Begin
For I In 1..16 Loop --wyliczenie ilosci oddzialow obroncy
Suma_Obrony:=Obronca(I).Ilosc_Oddz+Suma_Obrony;
End Loop;
For I In 1..Agresor(4).Ilosc_Oddz Loop --ataki lucznikow
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,True,True,True,
True,False);
If Not (Numer_Cel=0) Then
Walka(Agresor(4).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
For I In 1..Agresor(8).Ilosc_Oddz Loop --ataki kusznikow
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,True,True,True,
True,False);
If Not (Numer_Cel=0) Then
Walka(Agresor(8).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
For I In 1..Agresor(9).Ilosc_Oddz Loop--ataki konnych strzelcow
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,True,True,True,--celem jest wszystko procz okretow
True,False);
If Not (Numer_Cel=0) Then
Walka(Agresor(9).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
End Ostrzal_Z_Lukow;

------------------------------------------------------------------------------
-------------------------- Faza Ostrzalu z Karakow ---------------------------
------------------------------------------------------------------------------

Procedure Ostrzal_Karakow_Obl (
Agresor : In Out Szyk;
Obronca : In Out Szyk;
Brama : In Out Integer;
Pole_Bitwy : In Integer) Is
Typ_Cel : Integer;
Numer_Cel : Integer;
Suma_Obrony : Integer := 0;
Mur : Float;
G : Generator;
Begin
Reset(G);
If Pole_Bitwy In 8..9 And Brama >0 Then --trafienie w brame
Mur := 12.0;
Else
Mur:=0.0;
End If;
For I In 1..16 Loop
Suma_Obrony:=Obronca(I).Ilosc_Oddz+Suma_Obrony;
End Loop;
For I In 1..Agresor(16).Ilosc_Oddz Loop --ostrzal katapultami
Wybierz_Cel_Oblezenie(Obronca,Suma_Obrony,Mur,Brama,Typ_Cel,
Numer_Cel);
If (Not (Typ_Cel=0)) And Random(G)>0.80 Then --20% szans na trafienie
Walka(Agresor(16).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
End Ostrzal_Karakow_Obl;

------------------------------------------------------------------------------
-------------------- Ostrzal z Karakow na statki -----------------------------
------------------------------------------------------------------------------

Procedure Ostrzal_Karakow_Statki (
Agresor : In Out Szyk;
Obronca : In Out Szyk) Is
Typ_Cel : Integer;
Numer_Cel : Integer;
Suma_Obrony : Integer := 0;
G : Generator;
Begin
Reset(G);
For I In 1..16 Loop
Suma_Obrony:=Obronca(I).Ilosc_Oddz+Suma_Obrony;
End Loop;
For I In 1..Agresor(16).Ilosc_Oddz Loop --ostrzal katapult z karakami
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,False,False,False,False,True); --celem sa okrety
If Random(G)>0.85 And Not(Numer_Cel=0)Then --15% szans na trafienie okretu
Walka(Agresor(16).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
End Ostrzal_Karakow_Statki;

------------------------------------------------------------------------------
-------------------- Ostrzal z Karakow na katapulty --------------------------
------------------------------------------------------------------------------


Procedure Ostrzal_Karakow_Katapulty (
Agresor : In Out Szyk;
Obronca : In Out Szyk) Is
Typ_Cel : Integer;
Numer_Cel : Integer;
Suma_Obrony : Integer := 0;
G : Generator;
Begin
Reset(G);
For I In 1..16 Loop
Suma_Obrony:=Obronca(I).Ilosc_Oddz+Suma_Obrony;
End Loop;
For I In 1..Agresor(16).Ilosc_Oddz Loop
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,False,False,False,True,False);--celem ataku sa katapulty
If Random(G)>0.80 And Not (Numer_Cel=0) Then --20% szans na trafienie katapulty
Walka(Agresor(16).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
End Ostrzal_Karakow_Katapulty;


------------------------------------------------------------------------------
-------------------------- Faza Ostrzalu z Katapult do statkow ---------------
------------------------------------------------------------------------------

Procedure Ostrzal_Statkow (
Agresor : In Out Szyk;
Obronca : In Out Szyk) Is
Typ_Cel : Integer;
Numer_Cel : Integer;
Suma_Obrony : Integer := 0;
G : Generator;
Begin
Reset(G);
For I In 1..16 Loop
Suma_Obrony:=Obronca(I).Ilosc_Oddz+Suma_Obrony;
End Loop;
For I In 1..Agresor(12).Ilosc_Oddz Loop
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,False,False,False,False,True); --celem ataku sa statki
If Random(G)>0.75 And Not(Numer_Cel=0) Then --25% szans na trafienie okretu
Walka(Agresor(12).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
End Ostrzal_Statkow;


------------------------------------------------------------------------------
-------------------------- Faza Zwarcia Piechoty -----------------------------
------------------------------------------------------------------------------

Procedure Zwarcie_Piechota (
Agresor : In Out Szyk;
Obronca : In Out Szyk) Is
Typ_Cel : Integer;
Numer_Cel : Integer;
Suma_Obrony : Integer := 0;
Begin
For I In 1..16 Loop --wylicznie ilosci oddzialow obroncy
Suma_Obrony:=Obronca(I).Ilosc_Oddz+Suma_Obrony;
End Loop;
For I In 1..Agresor(1).Ilosc_Oddz Loop --atak wiesniakow
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,True,False,False,False,False);
If Not (Numer_Cel=0) Then
Walka(Agresor(1).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
For I In 1..Agresor(2).Ilosc_Oddz Loop --atak piechurow(pikinierow)
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,True,False,False,False,False);
If Not (Numer_Cel=0) Then
Walka(Agresor(2).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
For I In 1..Agresor(3).Ilosc_Oddz Loop --atak ciezkich piechurow
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,True,False,False,False,False);
If Not (Numer_Cel=0) Then
Walka(Agresor(3).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
For I In 1..Agresor(6).Ilosc_Oddz Loop --atak wojownikow swiatynnych
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,True,False,False,False,False);
If Not (Numer_Cel=0) Then
Walka(Agresor(6).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
For I In 1..Agresor(10).Ilosc_Oddz Loop --atak straznikow
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,True,False,False,False,False);
If Not (Numer_Cel=0) Then
Walka(Agresor(10).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
End Zwarcie_Piechota;

------------------------------------------------------------------------------
-------------------------- Faza Zwarcia Jazdy --------------------------------
------------------------------------------------------------------------------

Procedure Zwarcie_Jazda (
Agresor : In Out Szyk;
Obronca : In Out Szyk) Is
Typ_Cel : Integer;
Numer_Cel : Integer;
Suma_Obrony : Integer := 0;
Begin
For I In 1..16 Loop
Suma_Obrony:=Obronca(I).Ilosc_Oddz+Suma_Obrony;
End Loop;
For I In 1..Agresor(5).Ilosc_Oddz Loop --atak kawalerii
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,True,True,True,False,False);
If Not (Numer_Cel=0) Then
Walka(Agresor(5).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
For I In 1..Agresor(7).Ilosc_Oddz Loop --atak jezdzcow
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,True,True,True,False,False);
If Not (Numer_Cel=0) Then
Walka(Agresor(7).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
For I In 1..Agresor(11).Ilosc_Oddz Loop -- atak ciezkiej kawalerii
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,True,True,True,False,False);
If Not (Numer_Cel=0) Then
Walka(Agresor(11).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
End Zwarcie_Jazda;

------------------------------------------------------------------------------
-------------------------- Faza Zwarcia Jazdy z Piechota ---------------------
------------------------------------------------------------------------------

Procedure Zwarcie_Jazda_Z_Piech (
Agresor : In Out Szyk;
Obronca : In Out Szyk) Is
Typ_Cel : Integer;
Numer_Cel : Integer;
Suma_Obrony : Integer := 0;
Begin
For I In 1..16 Loop
Suma_Obrony:=Obronca(I).Ilosc_Oddz+Suma_Obrony;
End Loop;
For I In 1..Agresor(5).Ilosc_Oddz Loop --kawaleria
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,True,False, --celem jest piechota
False,False,False);
If Not (Numer_Cel=0) Then
Walka(Agresor(5).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
For I In 1..Agresor(7).Ilosc_Oddz Loop --jezdzcy
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,True,False,
False,False,False);
If Not (Numer_Cel=0) Then
Walka(Agresor(7).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
For I In 1..Agresor(11).Ilosc_Oddz Loop --ciezcy jezdzcy
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,True,False,
False,False,False);
If Not (Numer_Cel=0) Then
Walka(Agresor(11).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
End Zwarcie_Jazda_Z_Piech;

------------------------------------------------------------------------------
-------------------------- Faza Natarcia jazdy na Pikinierow -----------------
------------------------------------------------------------------------------

Procedure Natarcia_Na_Piki (
Agresor : In Out Szyk;
Obronca : In Out Szyk) Is
Numer_Cel : Integer;

Procedure Wybierz_Cel_Piki (
--osobna procedura starcia z pikinierami;
Obronca : In Out Szyk;
Numer_Cel : Out Integer) Is
G : Generator;
Tmp : Integer;
Begin
Reset(G);
If Czy_Ktos_Jeszcze_Walczy(Obronca,2) Then
Loop --petla wybierajca pierwszy losowy nie uciekajacy oddzial;
Tmp:=Integer(Random(G)*Float(Obronca(2).Ilosc_Oddz)+0.5);
If Not Obronca(2).Wojsko(Tmp).Ucieczka Then
Numer_Cel:=Tmp;
Exit;
End If;
End Loop;
Else
Numer_Cel:=0;
End If;
End Wybierz_Cel_Piki;

Begin

For I In 1..Agresor(5).Ilosc_Oddz Loop --kawaleria
Wybierz_Cel_Piki(Obronca,Numer_Cel);
If Not (Numer_Cel=0) Then
Walka(Agresor(5).Wojsko(I),Obronca(2).Wojsko(Numer_Cel));
End If;
End Loop;
For I In 1..Agresor(7).Ilosc_Oddz Loop --jezdzcy
Wybierz_Cel_Piki(Obronca,Numer_Cel);
If Not (Numer_Cel=0) Then
Walka(Agresor(7).Wojsko(I),Obronca(2).Wojsko(Numer_Cel));
End If;
End Loop;
For I In 1..Agresor(11).Ilosc_Oddz Loop -- ciezcy jezdzcy
Wybierz_Cel_Piki(Obronca,Numer_Cel);
If Not (Numer_Cel=0) Then
Walka(Agresor(11).Wojsko(I),Obronca(2).Wojsko(Numer_Cel));
End If;
End Loop;
End Natarcia_Na_Piki;

------------------------------------------------------------------------------
-------------------------- Faza Natarcia Statkow ----------------------------
------------------------------------------------------------------------------

Procedure Natarcie_Morskie (
Agresor : In Out Szyk;
Obronca : In Out Szyk) Is
Typ_Cel : Integer;
Numer_Cel : Integer;
Suma_Obrony : Integer := 0;
Begin
For I In 1..16 Loop
Suma_Obrony:=Obronca(I).Ilosc_Oddz+Suma_Obrony;
End Loop;
For I In 1..Agresor(13).Ilosc_Oddz Loop
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,False,False,
False,False,True);
If Not (Numer_Cel=0) Then
Walka(Agresor(13).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
For I In 1..Agresor(14).Ilosc_Oddz Loop
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,False,False,
False,False,True);
If Not (Numer_Cel=0) Then
Walka(Agresor(14).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
For I In 1..Agresor(15).Ilosc_Oddz Loop
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,False,False,
False,False,True);
If Not (Numer_Cel=0) Then
Walka(Agresor(15).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
For I In 1..Agresor(16).Ilosc_Oddz Loop
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,False,False,
False,False,True);
If Not (Numer_Cel=0) Then
Walka(Agresor(16).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
End Natarcie_Morskie;

------------------------------------------------------------------------------
-------------------------- Faza Frontalnego ataku ---------------------------
------------------------------------------------------------------------------
Procedure Atak_Frontowy (
Agresor : In Out Szyk;
Obronca : In Out Szyk) Is
Typ_Cel : Integer;
Numer_Cel : Integer;
Suma_Obrony : Integer := 0;
Begin
For I In 1..16 Loop
Suma_Obrony:=Obronca(I).Ilosc_Oddz+Suma_Obrony;
End Loop;
For K In 1..11 Loop
For I In 1..Agresor(K).Ilosc_Oddz Loop
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,True,True,
True,True,False);
If Not (Numer_Cel=0) Then
Walka(Agresor(K).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
End Loop;
End Atak_Frontowy;

------------------------------------------------------------------------------
-------------------------- Faza Oskrzydlenia --------------------------------
------------------------------------------------------------------------------

Procedure Oskrzydlenie (
Agresor : In Out Szyk;
Obronca : In Out Szyk) Is
Typ_Cel : Integer;
Numer_Cel : Integer;
Suma_Obrony : Integer := 0;
Begin
For I In 1..16 Loop
Suma_Obrony:=Obronca(I).Ilosc_Oddz+Suma_Obrony;
End Loop;
For I In 1..Agresor(5).Ilosc_Oddz Loop
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,True,True,True,
True,False);
If Not (Numer_Cel=0) Then
Walka(Agresor(5).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
For I In 1..Agresor(7).Ilosc_Oddz Loop
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,True,True,True,
True,False);
If Not (Numer_Cel=0) Then
Walka(Agresor(7).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
For I In 1..Agresor(11).Ilosc_Oddz Loop
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,True,True,True,
True,False);
If Not (Numer_Cel=0) Then
Walka(Agresor(11).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
End Oskrzydlenie;
------------------------------------------------------------------------------
-------------------------- Faza Podjazdu ------------------------------------
------------------------------------------------------------------------------

Procedure Podjazd_Konnych (
Agresor : In Out Szyk;
Obronca : In Out Szyk) Is
Typ_Cel : Integer;
Numer_Cel : Integer;
Suma_Obrony : Integer := 0;
Begin
For I In 1..16 Loop
Suma_Obrony:=Obronca(I).Ilosc_Oddz+Suma_Obrony;
End Loop;
For I In 1..Agresor(9).Ilosc_Oddz Loop
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,True,True,True,
True,False);
If Not (Numer_Cel=0) Then
Walka(Agresor(9).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
End Podjazd_Konnych;

------------------------------------------------------------------------------
-------------------------- Faza Zestrzelenia Podjazdu ------------------------
------------------------------------------------------------------------------

Procedure Strzelaj_Podjazd (
Agresor : In Out Szyk;
Obronca : In Out Szyk) Is
Numer_Cel : Integer;

Procedure Wybierz_Cel_Jezdziec (
Obronca : In Out Szyk;
Numer_Cel : Out Integer) Is
G : Generator;
Tmp : Integer;
Logiczna : Boolean := Czy_Ktos_Jeszcze_Walczy (Obronca, 9);
Begin
Reset(G);
Numer_Cel:=0;
While Logiczna Loop
Tmp:=Integer(Random(G)*Float(Obronca(9).Ilosc_Oddz)+0.5);
If Not Obronca(9).Wojsko(Tmp).Ucieczka Then
Numer_Cel:=Tmp;
Exit;
End If;
End Loop;
End Wybierz_Cel_Jezdziec;

Begin

For I In 1..Agresor(4).Ilosc_Oddz Loop
Wybierz_Cel_Jezdziec(Obronca,Numer_Cel);
If Not (Numer_Cel=0) Then
Walka(Agresor(4).Wojsko(I),Obronca(9).Wojsko(Numer_Cel));
End If;
End Loop;
For I In 1..Agresor(8).Ilosc_Oddz Loop
Wybierz_Cel_Jezdziec(Obronca,Numer_Cel);
If Not (Numer_Cel=0) Then
Walka(Agresor(8).Wojsko(I),Obronca(9).Wojsko(Numer_Cel));
End If;
End Loop;
For I In 1..Agresor(9).Ilosc_Oddz Loop
Wybierz_Cel_Jezdziec(Obronca,Numer_Cel);
If Not (Numer_Cel=0) Then
Walka(Agresor(9).Wojsko(I),Obronca(9).Wojsko(Numer_Cel));
End If;
End Loop;
End Strzelaj_Podjazd;

------------------------------------------------------------------------------
-------------------------- Faza Abordazu ------------------------------------
------------------------------------------------------------------------------
Procedure Abordaz (
Agresor : In Out Szyk;
Obronca : In Out Szyk) Is
Typ_Cel : Integer;
Numer_Cel : Integer;
Suma_Obrony : Integer := 0;
Begin
For I In 1..16 Loop
Suma_Obrony:=Obronca(I).Ilosc_Oddz+Suma_Obrony;
End Loop;
For K In 1..11 Loop
For I In 1..Agresor(K).Ilosc_Oddz Loop
Wybierz_Cel(Obronca,Suma_Obrony,Typ_Cel,Numer_Cel,True,True,
False,False,True);
If Not (Numer_Cel=0) Then
Walka(Agresor(K).Wojsko(I),Obronca(Typ_Cel).Wojsko(Numer_Cel));
End If;
End Loop;
End Loop;
End Abordaz;



------------------------------------------------------------------------------
-------------------------- Faza Ataku na Brame -------------------------------
------------------------------------------------------------------------------

Procedure Atak_Na_Brame (
Agresor : In Out Szyk;
Obronca : In Out Szyk;
Brama : In Out Integer;
Pole_Bitwy : In Integer) Is
Typ_Agresor : Integer;
Numer_Agresor : Integer;
Suma_Agresor : Integer := 0;
Typ_Cel : Integer;
Numer_Cel : Integer;
Suma_Obrony : Integer := 0;
Mur : Float;

Begin

If (Pole_Bitwy = 7 Or Pole_Bitwy =9) And Brama >0 Then
Mur := 42.0;
Else
Mur:=0.0;
End If;
For I In 1..16 Loop
Suma_Obrony:=Obronca(I).Ilosc_Oddz+Suma_Obrony;
Suma_Agresor:=Agresor(I).Ilosc_Oddz+Suma_Agresor;
End Loop;
Wybierz_Cel(Agresor,Suma_Agresor,Typ_Agresor,Numer_Agresor,True,
False,False,False,False);
Wybierz_Cel_Oblezenie(Obronca,Suma_Obrony,Mur,Brama,Typ_Cel,
Numer_Cel);
If Not (Typ_Cel=0) Then
Walka(Agresor(Typ_Agresor).Wojsko(Numer_Agresor),Obronca(Typ_Cel).
Wojsko(Numer_Cel));
End If;
End Atak_Na_Brame;
------------------------------------------------------------------------------
-----------------------------!! operator turowy !!----------------------------
------------------------------------------------------------------------------
Procedure Tura (
Agresor : In Out Szyk;
General_A : In String;
Ucieczka_A : In Out Boolean;
Obronca : In Out Szyk;
General_O : In String;
Akcja : In Out Boolean;
Forteca : In Out Integer;
Pole_Bitewne : In Integer;
Kolejka : In Out Integer;
Raport : In Out File_Type) Is

Piechota_A,
Piechota_O,
Lucznicy_A,
Lucznicy_O,
Jezdzcy_A,
Jezdzcy_O,
Katapulty_A,
Katapulty_O,
Statki_A,
Statki_O : Integer := 0;

Znak : Character := 'y';
Znak_Tmp : Character := 'a';
Walcza : Boolean;
Flaga : Boolean := True; --brak poprawnie wybranej akcji
Statki : Boolean;
Katapulty : Boolean;



Begin
If Kolejka > 0 Then
Walcza:=True;
Else
Walcza := False;
End If;
Wylicz_Wojsko(Agresor,Piechota_A,Lucznicy_A,Jezdzcy_A,Katapulty_A,Statki_A);
Wylicz_Wojsko(Obronca,Piechota_O,Lucznicy_O,Jezdzcy_O,Katapulty_O,Statki_O);
Put("Panie generale "&General_A&", mamy: ");
Put(Piechota_A,5);
Put(" piechurow");
New_Line;
Put(Raport,"Moj Panie, mamy ");
Put(Raport,Piechota_A,5);
Put(Raport," piechurow");
New_Line(Raport,1);
Put(Lucznicy_A,5);
Put(Raport,Lucznicy_A,5);
Put(" lucznikow ");
Put(Raport," lucznikow ");
Put(Jezdzcy_A,5);
Put(Raport,Jezdzcy_A,5);
Put(" jezdzcow");
Put(Raport," jezdzcow");
New_Line;
New_Line(Raport,1);
Put(Katapulty_A,5);
Put(Raport,Katapulty_A,5);
Put(" katapult ");
Put(Raport," katapult ");
Put(Statki_A,5);
Put(Raport,Statki_A,5);
Put(" statkow");
Put(Raport," statkow");
New_Line;
New_Line(Raport,1);

Put("Moj Panie, nasz przeciwnik, general "&General_O&", ma: ");
Put(Piechota_O,5);
Put(" piechurow");
New_Line;
Put(Raport,"Moj Panie, nasz przeciwnik ma ");
Put(Raport,Piechota_O,5);
Put(Raport," piechurow");
New_Line(Raport,1);
Put(Lucznicy_O,5);
Put(Raport,Lucznicy_O,5);
Put(" lucznikow ");
Put(Raport," lucznikow ");
Put(Jezdzcy_O,5);
Put(Raport,Jezdzcy_O,5);
Put(" jezdzcow");
Put(Raport," jezdzcow");
New_Line;
New_Line(Raport,1);
Put(Katapulty_O,5);
Put(Raport,Katapulty_O,5);
Put(" katapult ");
Put(Raport," katapult ");
Put(Statki_O,5);
Put(Raport,Statki_O,5);
Put(" statkow");
Put(Raport," statkow");
New_Line;
New_Line(Raport,1);
-----------------------------------------------------------------------------
------------------------- Wybor akcji agresora -----------------------------
-----------------------------------------------------------------------------
--nadanie kolejki
If To_Lower(Znak) = 'w' Then
Walcza := True;
End If;

If Walcza Then
Kolejka := Kolejka +1;
End If;

While Flaga Loop --petla wyboru mozliwej akcji
-- Wybor akcji
Loop
Znak:='y';
Put_Line("Generale "&General_A&", wybierz akcje ktora chcesz przeprowadzic:");
Put_Line("Ruszyc Wojskiem w boj - W (jedna akcja nie zaleznie od strony)");
Put_Line("Dokonac odwrotu - Q");
New_Line;
Put_Line("Atak Frontowy - A");
Put_Line("Natarcie piechoty - P");
Put_Line("Ostrzal z lukow - O");
Put_Line("Natarcie konnicy - N ");
Put_Line("Wyslac podjazd - J");
Put_Line("Wystrzelic z katapult - K");
Put_Line("Natarcie statkow - S");
Put_Line("Ostrzelac z karakow - R");
Put_Line("Dokonac abordazu - B");
Put_Line("Taranowac brame - T");
Put_Line("Czekac - C");
Get_Immediate(Znak);
If To_Lower(Znak)='a' Or To_Lower(Znak)='p' Or To_Lower(Znak)='o' Or To_Lower(Znak)='k'
Or To_Lower(Znak)='j' Or To_Lower(Znak)='n' Or To_Lower(Znak)='s' Or To_Lower(Znak)='r'
Or To_Lower(Znak)='b' Or To_Lower(Znak)='t' Or To_Lower(Znak)='w' Or To_Lower(Znak)='q'
Or To_Lower(Znak) = 'c' Then
Exit;
End If;
End Loop;
Flaga := False;
--werfyfikacja akcji przez pole bitwy
Case To_Lower(Znak) Is
When 'a'|'p'|'o'|'n'|'j'|'k' =>
If Pole_Bitewne = 6 Or Pole_Bitewne = 8 Then
Put_Line("Moj Panie ... ale przeciez walczymy na morzu");
New_Line;
Flaga :=True;
End If;
When 's'|'r'|'b' =>
If (Pole_Bitewne In 1..4) Or Pole_Bitewne = 7 Then
Put_Line("Moj Panie ... ale przeciez walczymy na ladzie");
New_Line;
Flaga:=True;
End If;
When 't' =>
If Not (Pole_Bitewne In 7..9) Then
Put_Line("Moj Panie ... przeciez tu nie ma warowni do zdobycia");
New_Line;
Flaga:=True;
Elsif Pole_Bitewne = 6 Then
Put_Line("Moj Panie ... ale przeciez walczymy na morzu");
New_Line;
Flaga :=True;
End If;
When 'w' =>
If Walcza Then
Put_Line("Moj Panie ... rozkaz wymarszu do bitwy już wydales");
New_Line;
Flaga:=True;
End If;
When Others =>
Null;
End Case;
--weryfikacja przez fortece
If Pole_Bitewne In 7..9 And Forteca > 0 And (Not Flaga) Then
Case To_Lower(Znak) Is
When 'a'|'p'|'o'|'n'|'j'|'b'|'s' =>
Put_Line("Moj Panie ... wrog chowa się za murami i nie mozemy się z nim zetrzec");
New_Line;
Flaga:=True;
When Others =>
Null;
End Case;
End If;
--weryfikacja przez kolejke
If Not Flaga Then
Case To_Lower(Znak) Is
When 'a'|'p'|'b'|'t' =>
If Kolejka < 4 Or (Kolejka < 6 And Pole_Bitewne = 3) Then
Put_Line("Moj Panie ... nasze wojsko jeszcze nie ma w zasiegu naszego wroga");
New_Line;
Flaga:=True;
End If;
When 'o'|'n'|'j'|'s' =>
If Kolejka < 2 Or (Kolejka < 4 And Pole_Bitewne =3) Then
Put_Line("Moj Panie ... nasze wojsko jeszcze nie ma w zasiegu naszego wroga");
New_Line;
Flaga:=True;
End If;
When Others =>
Null;
End Case;
End If;
-- weryfikacja prze ilosc wojska
If Not Flaga Then
Case To_Lower(Znak) Is
When 'p' =>
If Piechota_A =0 Then
Put_Line("Moj Panie ... nie mamy odpowiednich oddzialow wojska by wypelnic ten rozkaz");
New_Line;
Flaga:=True;
End If;
When 'a'|'b'|'t' =>
If Piechota_A+Lucznicy_A+Jezdzcy_A=0 Then
Put_Line("Moj Panie ... nie mamy odpowiednich oddzialow wojska by wypelnic ten rozkaz");
New_Line;
Flaga:=True;
End If;
When 'o' =>
If Lucznicy_A=0 Then
Put_Line("Moj Panie ... nie mamy odpowiednich oddzialow wojska by wypelnic ten rozkaz");
New_Line;
Flaga:=True;
End If;
When 'n' =>
If Jezdzcy_A=0 Then
Put_Line("Moj Panie ... nie mamy odpowiednich oddzialow wojska by wypelnic ten rozkaz");
New_Line;
Flaga:=True;
End If;
When 'j' =>
If Not (Agresor(9).Ilosc_Oddz >0 And Czy_Ktos_Jeszcze_Walczy(Agresor,9)) Then
Put_Line("Moj Panie ... nie mamy odpowiednich oddzialow wojska by wypelnic ten rozkaz");
New_Line;
Flaga:=True;
End If;
When 'k' =>
If Katapulty_A =0 Then
Put_Line("Moj Panie ... nie mamy odpowiednich oddzialow wojska by wypelnic ten rozkaz");
New_Line;
Flaga:=True;
End If;
When 's' =>
If Statki_A =0 Then
Put_Line("Moj Panie ... nie mamy odpowiednich oddzialow wojska by wypelnic ten rozkaz");
New_Line;
Flaga:=True;
End If;
When 'r' =>
If Not (Agresor(16).Ilosc_Oddz >0 And Czy_Ktos_Jeszcze_Walczy(Agresor,16)) Then
Put_Line("Moj Panie ... nie mamy odpowiednich oddzialow wojska by wypelnic ten rozkaz");
New_Line;
Flaga:=True;
End If;
When Others =>
Null;
End Case;
End If;
------- rozpatrzenie typu ostrzalu --------
--katapulty
If To_Lower(Znak)='k' And Statki_O >0 And (Pole_Bitewne In 5..6 Or Pole_Bitewne = 9) Then
Put_Line("Czy mam kazac celowac w statki wroga czy moga strzelac dowolnie?");
Znak_Tmp:='a';
While Not(To_Lower(Znak_Tmp)='t' Or To_Lower(Znak_Tmp) ='n') Loop
Put_Line("<t-tak w statki, n - nie, niech bija jak chca");
Get_Immediate(Znak_Tmp);
End Loop;
If To_Lower(Znak_Tmp) = 't' Then
Statki :=True;
Else
Statki := False;
End If;
Elsif To_Lower(Znak)='k' And Not(Statki_O >0 And (Pole_Bitewne In 5..6 Or Pole_Bitewne = 9))Then
Statki:=False;
End If;
--karaki
If To_Lower(Znak)='r' Then
If Statki_O >0 And Katapulty_O > 0 Then
Put_Line("Czy mam kazac celowac w statki wroga, jego katapulty czy dowolnie ?");
Znak_Tmp:='q';
While Not (To_Lower(Znak_Tmp) In 'a'..'c') Loop
Put_Line("<a-niech strzelaja w statki, b-niech strzelaja w katapulty, c-niech bija jak chca");
Get_Immediate(Znak_Tmp);
End Loop;
If To_Lower(Znak_Tmp)='a' Then
Statki:=True;
Katapulty:=False;
Elsif To_Lower(Znak_Tmp) = 'b' Then
Statki := False;
Katapulty := True;
Else
Statki:=False;
Katapulty :=False;
End If;
Elsif Statki_O >0 And Not(Katapulty_O > 0) Then
Put_Line("Czy mam kazac celowac w statki wroga czy dowolnie ?");
Znak_Tmp:='q';
While Not (To_Lower(Znak_Tmp) = 'a'Or To_Lower(Znak_Tmp) ='c') Loop
Put_Line("<a-niech strzelaja w statki, c-niech bija jak chca");
Get_Immediate(Znak_Tmp);
End Loop;
If To_Lower(Znak_Tmp)='a' Then
Statki:=True;
Katapulty:=False;
Elsif To_Lower(Znak_Tmp) = 'b' Then
Statki := False;
Katapulty := True;
Else
Statki:=False;
Katapulty :=False;
End If;
Elsif Not(Statki_O >0) And (Katapulty_O > 0) Then
Put_Line("Czy mam kazac celowac w katapulty wroga czy dowolnie ?");
Znak_Tmp:='q';
While Not (To_Lower(Znak_Tmp) = 'b'Or To_Lower(Znak_Tmp) ='c') Loop
Put_Line("< b-niech strzelaja w katapulty, c-niech bija jak chca");
Get_Immediate(Znak_Tmp);
End Loop;
If To_Lower(Znak_Tmp)='a' Then
Statki:=True;
Katapulty:=False;
Elsif To_Lower(Znak_Tmp) = 'b' Then
Statki := False;
Katapulty := True;
Else
Statki:=False;
Katapulty :=False;


Post został pochwalony 0 razy

Ostatnio zmieniony przez dyschemist dnia Śro 13:24, 14 Lut 2007, w całości zmieniany 8 razy
Powrót do góry
Zobacz profil autora
dyschemist
Zespolony z forum



Dołączył: 21 Gru 2006
Posty: 149
Przeczytał: 0 tematów

Ostrzeżeń: 0/5
Skąd: Z J.J. Portu

PostWysłany: Śro 23:17, 31 Sty 2007    Temat postu:

Krótki opis działania :

Wprowadzane są wszystkie dane niezbedne do programu jak stan armii wpisywane po oddziale, pole bitewne i przewagi. Wprowadzony układ danych jest jednak ciezki w programowaniu wiec dane sa przenoszone do innego systemu gdzie oddzialy sa uporzadkowane typem (Szyk (1-16) ozn rodzaj jednostki). W zależności od pola bitwy bedzie prowadzona chronologia faz.

Tzn że kolejne fazy bitwne tworzą pewien logiczny ciąg.

NA początku jakiś ostrzał z podjazdu lub seria z katapult.

Potem jakies ostrzal z łuku, w końcu zwarcie wojsk, potem chwila chaotycznego ataku frontalnego, potem jakies oskrzydlenie i tak w kółko te kilka serii takich schematow aż wiekszosc armii jednej ze stron bedzie w odwrocie. (Oddzial ucieka gdy spadnie morale, bedzie zmyt zmeczony lub wszyscy zginą) Potem przez chwile trwa poscig. A potem jedna ze stron jest zwyciezcą a druga leczy rany. Nastapi wtedy przeliczenie spowrotem danych na pierwotny typ i zapisanie ich w jakims pliku.

Walka odbywa się miedzy dwoma oddzialami. Jeden jest agresorem drugi obroncą. Agresor siła swojego ataku zabija czesc obroncow, osłabia ich morale, samemu się meczac.


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Wróbelek
Administrator



Dołączył: 21 Gru 2006
Posty: 151
Przeczytał: 0 tematów

Ostrzeżeń: 0/5
Skąd: Łódź

PostWysłany: Czw 10:04, 01 Lut 2007    Temat postu:

dyschemist napisał:
Oddzial ucieka gdy [..] lub wszyscy zginą

W takiej sytuacji oddział na pewno ucieka Razz


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
dyschemist
Zespolony z forum



Dołączył: 21 Gru 2006
Posty: 149
Przeczytał: 0 tematów

Ostrzeżeń: 0/5
Skąd: Z J.J. Portu

PostWysłany: Pią 14:22, 02 Lut 2007    Temat postu:

ad Paweł - oddział który ma status ucieczka nie bierze udziału w dalszej walce ... Smile

zrobiłem update programu. Zawiera on pierwszą(poczwórną : ląd, wzgórza, góry, równiny) chronologie symulowania bitwy. Można sobie to przejrzeć i zobaczyć jak to działa ...

wprowadzę również możliwość prowadzenia bitew tzn że jesli obydwaj gracz zgodzą się prowadzić bitwę to to oni bedą wybierać kolejne fazy bitwy.

Co do samych faz - to doszło ich kilka, ale głównie dlatego że mnie były potrzebne nie zaś z waszej inicjatywy :-> szkoda

Program ma obecnie 1500 linijek :-] a warningi odnoszą się tylko do braku odwołania się do jeszcze nie wykorzystanych procedur.

Ostatnim co bedę robił w programie bedzie prowadzenie raportów. Bedą 3 raporty z bitwy: ogólny, dla agresora i obroncy.

update: godz 16:35 - poprawiłem jeszcze chronologie i kilka kolejnych weryfikacji co do ilosci wojska. Poprawiłem bug który mógłby powodować że oddzialy miałyby ujemną ilość żołnierzy.

Dodałem również coś co będzie potrzebne przy części sterowanej bitwy, ale myśle że kilku osobom się spodoba od razu i bedą chciały częściej dostawać tą statystykę. "Ilość zabitych przez oddział"

update 23:30 -> poprawilem blad ktory sam znalazlem - nieskonczone petle w wypadku gdy brakuje już nieuciekajacyh oddziałów

BTW Czy jest premia za najdłuższego posta ?? Twisted Evil


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Luneta
Stały bywalec



Dołączył: 22 Gru 2006
Posty: 92
Przeczytał: 0 tematów

Ostrzeżeń: 0/5
Skąd: z Lunetowa

PostWysłany: Sob 1:08, 03 Lut 2007    Temat postu:

Wiesz, to ty, Kowal przyznajesz premie więc przyznaj sobie, Laughing Należy się tobie.

Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Wróbelek
Administrator



Dołączył: 21 Gru 2006
Posty: 151
Przeczytał: 0 tematów

Ostrzeżeń: 0/5
Skąd: Łódź

PostWysłany: Sob 1:30, 03 Lut 2007    Temat postu:

dyschemist napisał:
BTW Czy jest premia za najdłuższego posta ?? Twisted Evil


oczywiście, że tak, oprócz takich premii jak:
1. za posty zawierajace najwięcej: literek R i P / kolorowych czcionek / zdjęć okolewskiego Wink / innych pierdół
2. przejście w skórzanych stringach po piotrkowskiej
3. pieprze taką zimę
4. po co dawać za wszystko premię?
5. czuje się przytłoczony Razz


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
dyschemist
Zespolony z forum



Dołączył: 21 Gru 2006
Posty: 149
Przeczytał: 0 tematów

Ostrzeżeń: 0/5
Skąd: Z J.J. Portu

PostWysłany: Nie 13:38, 04 Lut 2007    Temat postu: update 4 luty

dopisalem 5 chronologie (bitwa morska) i poprawiłem sporego bug'a. Przy obliczaniu czy dana armia ucieka program sumował wszystkie uciekające jednostki a nie tylko te biorące uddział w walce. (z technicznego punktu widzenia skoro niektóre jednostki nie biorą udziału w bitwie, to nie tracą morale i sił więc nie otrzymają statusu ucieczka, skoro go nie otrzymają to podnoszą obronność wojska aż w końcu żaden oddział poza nimi nie będzie walczył a wtedy nie bedzie kogo atakować i program by padł).

Zmiana nastapila w procedurze ucieczki która dostała 5 zmiennych logicznych w zależności od tego czy dana jednostka walczy czy nie (piechota,łucznicy,jazda,katapulty,statki)

Dodatkowo daje to mozliwość ucieczek części armii (np, faza abordażu kończy się gdy jedna ze stron ma jej dość)

aha i jeszcze jedno - 1860 linijek Very Happy

edit 5.II.2007 -> poprawka kolejnych byków (np.agresor mimo statusu ucieczki mógł walczyć) i dopisanie kolejnej chronologii, obleżenia lądowego i bitwy morsko-lądowej
2300 linijek

edit 6.II.2007 -> czuje już koniec programu. Dopisałem ostatnie chronologie, detransformacje oraz wypisanie koncowego stanu armiu. Zostało dosłownie tylko raportowanie. Spróbuje je napisać wieczorem. Nie ma tam już trudnosci programowych, to jest tylko retusz estetyczny więc powinno się udac nawet po nocy to napisać Razz


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum Nasza Grupa Strona Główna -> Programy Wszystkie czasy w strefie EET (Europa)
Strona 1 z 1

Skocz do:  

Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach


fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001 phpBB Group

Chronicles phpBB2 theme by Jakob Persson (http://www.eddingschronicles.com). Stone textures by Patty Herford.
Regulamin