home *** CD-ROM | disk | FTP | other *** search
/ Die ASC Mega 2 / ASC-Mega2-CD-ROM.iso / SPIELE / KAISER / KRIEG.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-08-20  |  39.0 KB  |  1,537 lines

  1. procedure krieg;
  2.  
  3. (* !!! alle Zeilennummern beziehen sich auf KRIEG.BAS !!! *)
  4.  
  5. const verhalt_m: menue_typ = (xs:28;ys:19;xl:24;yl:4;at:att_verhalt_m);
  6.       verhalt_m_tx: array[1..4] of string[25] =
  7.         ('  Durchmarsch gewähren  ',
  8.          '  Dem Angreifer helfen  ',
  9.          'Dem Angegriffenen helfen',
  10.          '         Neutral        ');
  11. (* DATA Zeilen 3000 - 3263 *)
  12.       max_wege = 28;
  13.       Wege: array[1..MaxSpieler,1..max_wege] of word =
  14.       ((2,23,53,43,983,4,5,6,47,67,537,237,9837,28,98,538,438,6738,9,0,0,0,0,0,
  15.         0,0,0,0),
  16.        (1,3,14,34,54,5,16,546,376,346,5376,37,147,167,547,8,9,0,0,0,0,0,0,0,0,
  17.          0,0,0),
  18.        (21,51,41,761,891,2,4,5,46,76,516,216,8916,7,8,29,89,519,419,7619,0,0,
  19.         0,0,0,0,0,0),
  20.        (1,12,32,52,3,5,6,7,38,528,198,329,529,389,19,0,0,0,0,0,0,0,0,0,0,0,0,
  21.         0),
  22.        (1,2,3,4,16,46,376,37,47,167,28,38,198,19,29,389,0,0,0,0,0,0,0,0,0,0,
  23.         0,0),
  24.        (1,12,452,432,732,43,73,153,123,1983,5,7,738,438,128,198,1538,4528,
  25.         19,4529,4389,4329,7389,7329,0,0,0,0),
  26.        (61,41,351,321,3891,32,452,412,612,3,4,35,45,615,6,38,4528,4128,4198,
  27.         6128,6198,389,329,419,619,3519,4529,0),
  28.        (91,21,351,341,3761,2,3,34,254,214,914,25,35,915,376,46,216,916,3516,
  29.         2546,37,2547,2147,2167,9147,9167,9,0),
  30.        (1,2,83,23,153,143,1673,14,254,234,834,25,15,835,16,2546,2376,8346,
  31.         8376,237,167,147,2547,1537,8,0,0,0));
  32.  
  33.       hauptstadt: array[0..1,0..4] of byte =
  34.         ((z_h,z_a,z_u,z_p,z_t),
  35.          (z_s,z_t,z_a,z_d,z_t));
  36.  
  37. type VerhaltenTyp = (Durchmarsch, Hilfe_Angreifer, Hilfe_Verteidiger, Neutral);
  38.      verhaltenset = set of verhaltentyp;
  39.      string5      = string[5];
  40.  
  41. var Feind:    (* FEIND *) byte;
  42.     geliehen: (* LEIH  *) array[1..maxspieler,0..2] of longint;
  43.  
  44.  
  45. procedure clear_arrays;
  46. var x,y: byte;
  47. begin
  48.   for x:=1 to maxspieler do
  49.     for y:=0 to 2 do
  50.       geliehen[x,y]:=0;
  51. end;
  52.  
  53.  
  54. procedure FeindWaehlen;
  55.  
  56. const ZLaenge = 40; (* Maximale Laenge eines Namens *)
  57.  
  58. var Liste:      array[1..MaxSpieler] of byte;
  59.     Anzahl, nr: byte;
  60.     s:          string[zlaenge];
  61.  
  62.  
  63. begin
  64.   Anzahl := 0;
  65.   for nr:=1 to Anzahl_Spieler do
  66.     if (Tod[nr] > 1700) and (nr<>AmZug) then begin
  67.       inc(Anzahl);
  68.       Liste[Anzahl] := nr
  69.     end;
  70.   NameUndJahr (att[att_feind_s]);
  71.   wrm(6,40,att[att_feind_tit],' Wer soll angegriffen werden ? ');
  72.   if Anzahl>0 then begin
  73.     for nr:=1 to Anzahl do begin
  74.       s:=copy(ganzername(liste[nr]),1,zlaenge);
  75.       while length(s)<zlaenge do begin
  76.         s:=' '+s;
  77.         if length(s)<zlaenge then s:=s+' ';
  78.       end;
  79.       feind_m_tx[nr]:=s;
  80.     end;
  81.     feind_m_tx[succ(anzahl)]:='               Niemanden';
  82.     with feind_m do begin
  83.       xs:=(80-zLaenge) div 2;
  84.       ys:=9;
  85.       xl:=zlaenge;
  86.       yl:=succ(anzahl);
  87.       at:=att_feind_m;
  88.     end;
  89.     feind:=succ(anzahl);
  90.     waehlen (@feind_m,feind);
  91.     if feind=succ(anzahl) then feind:=0;
  92.     if feind<>0 then begin
  93.       if feind>=amzug then inc(feind);
  94.       krieggefuehrt:=true
  95.     end
  96.   end
  97. end;
  98.  
  99.  
  100. procedure krieg_wenn_moeglich;
  101. const y0=44; (* erste Y-Koordinate des Spielfelds *)
  102. var Verhalten:   (* HELP$ *) array [1..MaxSpieler] of Verhaltentyp;
  103.     truppen:     (* S *)     array[0..1,0..4] of integer;
  104.     schaden:     (* P *)     array[0..1,0..3] of real;
  105.     weglaenge,
  106.     feld_laenge:             byte;
  107.     schaden_a,   (* EA *)
  108.     schaden_f,   (* EF *)
  109.     erobert:                 longint;
  110.  
  111.  
  112. procedure PruefVerhalten;
  113. var y2,Spieler,Auswahl: byte;
  114.     Rest,NameSpieler:  MaxString;
  115. begin
  116.   y:=4;
  117.   for Spieler:=1 to Anzahl_Spieler do
  118.     if (Spieler<>AmZug) and (Spieler<>Feind) then begin
  119.       NameSpieler:=GanzerName(Spieler);
  120.       wrm(y,40,att[att_verhalt_s],'Wie verhält sich '+NameSpieler+' ?');
  121.       repeat
  122.         Auswahl:=4;
  123.         waehlen (@verhalt_m,auswahl);
  124.       until auswahl<>0;
  125.       case Auswahl of
  126.         1: begin
  127.              Verhalten[Spieler]:=Durchmarsch;
  128.              Rest:=' gewährt dem Angreifer Durchmarsch.'
  129.            end;
  130.         2: begin
  131.              Verhalten[Spieler]:=Hilfe_Angreifer;
  132.              Rest:=' hilft dem Angreifer.'
  133.            end;
  134.         3: begin
  135.              Verhalten[Spieler]:=Hilfe_Verteidiger;
  136.              Rest:=' hilft dem Angegriffdnen.'
  137.            end;
  138.         4: begin
  139.              Verhalten[Spieler]:=Neutral;
  140.              Rest:=' verhält sich neutral.'
  141.            end
  142.       end;
  143.       clear(1,78,y,y,att_verhalt_s);
  144.       wrm(y,40,att[att_verhalt_s],NameSpieler+Rest);
  145.       inc(y,2)
  146.     end;
  147.     if Anzahl_Spieler < MaxSpieler then
  148.       for Spieler:=Anzahl_Spieler+1 to MaxSpieler do begin
  149.         wrm(y,40,att_verhalt_s,'Der Herrscher von '+Reich[Spieler]+' verhält sich neutral.');
  150.         Verhalten[Spieler]:=Neutral;
  151.         inc(y,2)
  152.       end;
  153.     with verhalt_m do
  154.       clear(xs-1,xs+xl,ys-1,ys+yl+1,att_verhalt_s);
  155.     Taste_Druecken
  156. end; (* Prüf Verhalten *)
  157.  
  158.  
  159. function angriff_moeglich: boolean;
  160. var zaehler,zaehler2: byte;
  161.     s:                string5;
  162.     moeglich:         boolean;
  163. (* Zeile 4100 - *)
  164. begin
  165.   nameundjahr (att[att_weg_s]);
  166.   angriff_moeglich:=true;
  167.   for zaehler:=1 to max_wege do begin
  168.     str(wege[amzug,zaehler],s);
  169.     weglaenge:=length(s);
  170.     if s='0' then begin
  171.       wrm(12,40,att[att_weg_tit],' Alle Wege nach '+reich[feind]+' sind versperrt !!! ');
  172.       angriff_moeglich:=false;
  173.       taste_druecken;
  174.       exit
  175.     end
  176.     else
  177.       if s[weglaenge]=chr(ord('0')+feind) then begin
  178.         if weglaenge=1 then begin
  179.           wrm(12,40,att[att_weg_tit],'Direkter Angriff');
  180.           taste_druecken;
  181.           exit
  182.         end
  183.         else begin
  184.           moeglich:=true;
  185.           for zaehler2:=1 to weglaenge-1 do
  186.             if verhalten[ord(s[zaehler2])-ord('0')]
  187.                                             in [hilfe_verteidiger,neutral] then
  188.               moeglich:=false;
  189.           if moeglich then begin
  190.             wrm(5,40,att[att_weg_tit],'Der Angriffsweg sieht folgendermaßen aus:');
  191.             wrm(8,40,att[att_weg_s],reich[amzug]);
  192.             for zaehler2:=1 to weglaenge do
  193.               wrm(zaehler2*2+8,40,att[att_weg_s],reich[ord(s[zaehler2])-ord('0')]);
  194.             taste_druecken;
  195.             exit
  196.           end;
  197.         end;
  198.       end;
  199.   end;
  200.   halt
  201. end; (* Angriff möglich ? *)
  202.  
  203.  
  204. procedure werte_aktualisieren;
  205. var zaehler: byte;
  206.  
  207.  
  208. function hilfe_moeglich(von: byte;ausnahmen: verhaltenset):boolean;
  209. var counter,counter2,laenge: byte;
  210.     s:                       string5;
  211.     moeglich:                boolean;
  212. begin
  213.   hilfe_moeglich:=true;
  214.   for counter:=1 to max_wege do begin
  215.     str(wege[von,counter],s);
  216.     laenge:=length(s);
  217.     if s='0' then begin
  218.       nameundjahr (att_weg_s);
  219.       wrm(12,40,att_weg_tit,
  220.               'Die Truppen aus '+reich[von]+' können nicht zu Hilfe kommen.');
  221.       taste_druecken;
  222.       hilfe_moeglich:=false;
  223.       exit
  224.     end
  225.     else
  226.       if ord(s[laenge])-ord('0')=feind then
  227.         if laenge=1 then exit
  228.         else begin
  229.           moeglich:=true;
  230.           for counter2:=1 to laenge-1 do
  231.             if verhalten[ord(s[counter2])-ord('0')] in ausnahmen then
  232.               moeglich:=false;
  233.           if moeglich then exit
  234.         end;
  235.   end;
  236.   halt
  237. end;
  238.  
  239.  
  240. procedure verbinde(nach: byte);
  241. begin
  242.   geliehen[zaehler,0]:=reiter[zaehler];
  243.   inc(reiter[nach],reiter[zaehler]);
  244.   geliehen[zaehler,1]:=artillerie[zaehler];
  245.   inc(artillerie[nach],artillerie[zaehler]);
  246.   geliehen[zaehler,2]:=infanterie[zaehler];
  247.   inc(infanterie[nach],infanterie[zaehler]);
  248.   varkfa[nach]:=(soldaten[nach]*varkfa[nach] +
  249.                  soldaten[zaehler]*varkfa[zaehler]) /
  250.                 (soldaten[nach] + soldaten[zaehler]);
  251.   varkfa[zaehler]:=varkfa[nach];
  252.   soldaten[nach]:=20*(reiter[nach]+artillerie[nach]+
  253.                       infanterie[nach]+miliz[nach]);
  254. end;
  255.  
  256.  
  257. procedure setzen(nr: byte; truppen_array: intarray);
  258. begin
  259.   truppen[0,nr]:=truppen_array[amzug];
  260.   truppen[1,nr]:=truppen_array[feind];
  261. end;
  262.  
  263.  
  264. begin (* Werte aktualisieren *)
  265.   varkfa[amzug]:=varkfa[amzug]*2/(weglaenge+1);
  266.   for zaehler:=1 to anzahl_spieler do
  267.     if (zaehler<>amzug) and (zaehler<>feind) then
  268.       case verhalten[zaehler] of
  269.         hilfe_angreifer:   if hilfe_moeglich(zaehler,
  270.                            [neutral,hilfe_verteidiger]) then
  271.                              verbinde(amzug);
  272.         hilfe_verteidiger: if hilfe_moeglich(zaehler,
  273.                            [durchmarsch,hilfe_angreifer]) then
  274.                              verbinde(feind);
  275.       end;
  276.   setzen(0,soldaten);
  277.   setzen(1,reiter);
  278.   setzen(2,artillerie);
  279.   setzen(3,infanterie);
  280.   setzen(4,miliz);
  281. end; (* Werte aktualisieren *)
  282.  
  283.  
  284. procedure zeige_zeile(y: byte);
  285. begin
  286.   c_y:=y0+(y-feld_oben)*16;
  287.   row(y-feld_oben)
  288. end;
  289.  
  290.  
  291. procedure feld_anzeigen(nach: shortint);
  292. var x,y,wohin,diff,y_start,y_ende: shortint;
  293.     p:                             pointer;
  294.     groesse,zwischen:              word;
  295. begin (* feld_anzeigen *)
  296.   wohin:=nach;
  297.   if wohin<0 then wohin:=0;
  298.   if wohin>80-feld_laenge then wohin:=80-feld_laenge;
  299.   if feld_oben<>wohin then begin
  300.     y_start:=0; y_ende:=pred(feld_laenge); c_y:=y0;
  301.     if langsam then begin
  302.       diff:=abs(feld_oben-wohin);
  303.       if diff<feld_laenge then
  304.         if wohin<feld_oben
  305.           then begin
  306.             scroll (y0,y0+diff*16,(feld_laenge-diff)*16*80);
  307.             y_ende:=pred(diff);
  308.           end else begin
  309.             scroll (y0+diff*16,y0,(feld_laenge-diff)*16*80);
  310.             y_start:=feld_laenge-diff; inc(c_y,y_start*16);
  311.           end;
  312.     end;
  313.     feld_oben:=wohin;
  314.     for y:=y_start to y_ende do begin
  315.       row(y); inc(c_y,16);
  316.     end;
  317.   end;
  318. end; (* feld_anzeigen *)
  319.  
  320.  
  321. procedure adjust_to(y: shortint; step: byte);
  322. begin
  323.   if (y<=feld_oben+step-1) and (feld_oben>0) then
  324.     feld_anzeigen(y-step);
  325.   if (y>=feld_oben+feld_laenge-step-1) and (feld_oben<80-feld_laenge) then
  326.     feld_anzeigen(y-feld_laenge+step+1);
  327. end;
  328.  
  329.  
  330. procedure window_cls;
  331. var x,y: byte;
  332.     s:   string;
  333. begin
  334.   s[0]:=chr(succ(xweite) shr 3); fillchar(s[1],length(s),' ');
  335.   for y:=0 to (y0-10) shr 3 do outtext(0,y shl 3,s);
  336. end;
  337.  
  338.  
  339. function occupied(x,y: byte): boolean;
  340. begin
  341.   occupied:=((spielfeld[y,x]<>z_leer) or (spielfeld[y,x+1]<>z_leer))
  342. end;
  343.  
  344.  
  345. procedure bewege_ausschnitt;
  346. type control_type = (nix,auf,ab,b_auf,b_ab,pos1,ende);
  347. var taste:    char;
  348.     control:  control_type;
  349.     position: shortint;
  350. begin
  351.   keinetaste;
  352.   repeat
  353.     taste:=readkey;
  354.     control:=nix;
  355.     position:=feld_oben;
  356.     if taste=#0 then begin
  357.       taste:=readkey;
  358.       case taste of
  359.         #72: control:=auf;
  360.         #80: control:=ab;
  361.         #73: control:=b_auf;
  362.         #81: control:=b_ab;
  363.         #71: control:=pos1;
  364.         #79: control:=ende
  365.       end
  366.     end
  367.     else
  368.       case taste of
  369.         '8': control:=auf;
  370.         '2': control:=ab;
  371.         '9': control:=b_auf;
  372.         '3': control:=b_ab;
  373.         '7': control:=pos1;
  374.         '1': control:=ende;
  375.       end;
  376.     case control of
  377.       auf:   dec(position);
  378.       ab:    inc(position);
  379.       b_auf: dec(position,feld_laenge-1);
  380.       b_ab:  inc(position,feld_laenge-1);
  381.       pos1:  position:=0;
  382.       ende:  position:=80-feld_laenge;
  383.     end;
  384.     if control<>nix then begin
  385.       if position<0 then position:=0;
  386.       if position>80-feld_laenge then position:=80-feld_laenge;
  387.       feld_anzeigen(position)
  388.     end;
  389.   until rebuild or (taste=#13);
  390. end;
  391.  
  392.  
  393. procedure zeige_array;
  394. var lauf: byte;
  395. begin
  396.   for lauf:=1 to 4 do begin
  397.     wipetext(feld_x+150,lauf*8+1,3);
  398.     wipetext(feld_x+465,lauf*8+1,3);
  399.     outtext((feld_x+150) shr 3,lauf*8+1,strgr(truppen[0,lauf],3));
  400.     outtext((feld_x+465) shr 3,lauf*8+1,strgr(truppen[1,lauf],3));
  401.   end;
  402. end;
  403.  
  404.  
  405. procedure spielfeld_init;
  406. var maerkte_gesetzt, muehlen_gesetzt: array[0..1] of integer;
  407.  
  408.  
  409. procedure clear_spielfeld;
  410. var x,y: byte;
  411. begin
  412.   for y:=0 to 79 do
  413.     for x:=0 to 39 do
  414.       spielfeld[y,x]:=z_leer;
  415.   for x:=0 to 1 do begin
  416.     maerkte_gesetzt[x]:=0;
  417.     muehlen_gesetzt[x]:=0
  418.   end;
  419. end;
  420.  
  421.  
  422. procedure grenze_setzen;
  423. var x,y: byte;
  424.     i:   shortint;
  425. begin (* Grenze setzen *)
  426.   x:=20;
  427.   for y:=0 to 79 do begin
  428.     repeat
  429.       i:=random(3)-1;
  430.     until (i=0) or ((i=-1) and (x>=19)) or ((i=1) and (x<=21));
  431.     case i of
  432.       -1: begin
  433.             spielfeld[y,x-1]:=grenze1;
  434.             spielfeld[y,x]:=grenze2;
  435.           end;
  436.       0:  spielfeld[y,x]:=grenze0;
  437.       1:  begin
  438.             spielfeld[y,x]:=grenze3;
  439.             spielfeld[y,x+1]:=grenze4;
  440.           end;
  441.     end;
  442.     x:=x+i;
  443.   end;
  444. end; (* Grenze setzen *)
  445.  
  446.  
  447. procedure hauptstaedte_setzen;
  448. var haupt_x,haupt_y,spieler: byte;
  449.  
  450.  
  451. procedure schrift;
  452. var x,y: byte;
  453. begin
  454.   haupt_y:=random(71)+4;
  455.   for y:=0 to 1 do
  456.     for x:=0 to 4 do
  457.       spielfeld[haupt_y+y,haupt_x+x]:=hauptstadt[y,x];
  458. end;
  459.  
  460.  
  461. procedure gebaeude;
  462. var x:byte;
  463.  
  464.  
  465. procedure setzen(was,wieoft: byte);
  466. var count: byte;
  467. begin
  468.   for count:=1 to wieoft do begin
  469.     x:=random(7)+haupt_x;
  470.     y:=random(8)-3+haupt_y;
  471.     if not occupied(x,y) then begin
  472.       spielfeld[y,x]:=was;
  473.       spielfeld[y,x+1]:=was+1;
  474.       inc(maerkte_gesetzt[spieler]);
  475.     end;
  476.   end;
  477. end;
  478.  
  479.  
  480. begin (* Gebäude *)
  481.   setzen(z_kirche,3);
  482.   setzen(z_markt2,15);
  483.   for x:=0 to 7 do begin
  484.     spielfeld[haupt_y-4,haupt_x+x]:=hz;
  485.     spielfeld[haupt_y+5,haupt_x+x]:=hz;
  486.   end;
  487. end; (* Gebäude *)
  488.  
  489.  
  490. procedure mauer;
  491. var y:byte;
  492. begin
  493.   for y:=haupt_y-3 to haupt_y+4 do
  494.     spielfeld[y,haupt_x+8]:=sk;
  495.   spielfeld[haupt_y,haupt_x+8]:=toro;
  496.   spielfeld[haupt_y+1,haupt_x+8]:=toru;
  497. end;
  498.  
  499.  
  500. procedure palast_und_kath(von: byte);
  501.  
  502.  
  503. procedure setze_palast_1;
  504. begin
  505.   spielfeld[haupt_y-2,haupt_x]:=z_kuppel2;
  506.   spielfeld[haupt_y-2,haupt_x+1]:=z_spitzen2;
  507.   spielfeld[haupt_y-1,haupt_x]:=z_palast2;
  508.   spielfeld[haupt_y-1,haupt_x+1]:=z_palast2
  509. end;
  510.  
  511.  
  512. procedure setze_palast_2;
  513. begin
  514.   spielfeld[haupt_y-2,haupt_x+2]:=z_kuppel2;
  515.   spielfeld[haupt_y-1,haupt_x+2]:=z_palast2;
  516. end;
  517.  
  518.  
  519. procedure setze_kath_1;
  520. begin
  521.   spielfeld[haupt_y+2,haupt_x]:=z_kreuz2;
  522.   spielfeld[haupt_y+2,haupt_x+1]:=z_kreuz3;
  523.   spielfeld[haupt_y+3,haupt_x]:=z_kath2;
  524.   spielfeld[haupt_y+3,haupt_x+1]:=z_kath2;
  525. end;
  526.  
  527.  
  528. procedure setze_kath_2;
  529. begin
  530.   spielfeld[haupt_y+2,haupt_x+2]:=z_kreuz2;
  531.   spielfeld[haupt_y+3,haupt_x+2]:=z_kath2
  532. end;
  533.  
  534.  
  535. begin
  536.   if palast[von]>4 then begin
  537.     setze_palast_1;
  538.     if palast[von]>10 then
  539.       setze_palast_2;
  540.   end;
  541.   if kathedrale[von]>0 then begin
  542.     setze_kath_1;
  543.     if kathedrale[von]>5 then
  544.       setze_kath_2
  545.   end;
  546. end;
  547.  
  548.  
  549. (* Zeile 15100- *)
  550. begin (* Hauptstädte setzen *)
  551.   spieler:=0;
  552.   haupt_x:=0;
  553.   schrift;
  554.   palast_und_kath(amzug);
  555.   gebaeude;
  556.   spielfeld[haupt_y-4,8]:=ro;
  557.   spielfeld[haupt_y+5,8]:=ru;
  558.   mauer;
  559.  
  560.   spieler:=1;
  561.   haupt_x:=35;
  562.   schrift;
  563.   haupt_x:=37;
  564.   palast_und_kath(feind);
  565.   haupt_x:=32;
  566.   gebaeude;
  567.   spielfeld[haupt_y-4,31]:=lo;
  568.   spielfeld[haupt_y+5,31]:=lu;
  569.   haupt_x:=23;
  570.   mauer;
  571. end; (* Hauptstädte setzen *)
  572.  
  573.  
  574. procedure muehlen_und_maerkte_setzen;
  575.  
  576.  
  577. procedure zufall(was1,was2,wer: byte);
  578. var x,y: byte;
  579. begin
  580.   repeat
  581.     x:=random(14);
  582.     if wer=feind then inc(x,25);
  583.     y:=random(80);
  584.   until (spielfeld[y,x]=z_leer) and (spielfeld[y,x+1]=z_leer);
  585.   spielfeld[y,x]:=was1;
  586.   spielfeld[y,x+1]:=was2
  587. end;
  588.  
  589.  
  590. procedure s_muehlen(wer: byte);
  591. var lauf,anzahl: integer;
  592. begin
  593.   anzahl:=muehlen[wer];
  594.   if anzahl>0 then
  595.     for lauf:=1 to anzahl do
  596.       zufall(zmuehle,z_muehle2,wer);
  597. end;
  598.  
  599.  
  600. procedure s_maerkte(wer: byte);
  601. var lauf,anzahl: integer;
  602. begin
  603.   anzahl:=maerkte[wer];
  604.   if wer=amzug then
  605.     anzahl:=anzahl-maerkte_gesetzt[0]
  606.   else
  607.     anzahl:=anzahl-maerkte_gesetzt[1];
  608.   if anzahl>0 then
  609.     for lauf:=1 to anzahl do
  610.       zufall(z_markt2,z_markt2+1,wer);
  611. end;
  612.  
  613.  
  614. begin
  615.   s_muehlen(feind);
  616.   s_muehlen(amzug);
  617.   s_maerkte(feind);
  618.   s_maerkte(amzug);
  619. end;
  620.  
  621.  
  622. procedure fluesse_setzen;
  623. var lauf: byte;
  624.  
  625.  
  626. procedure seite(links: boolean);
  627. var next,x,xalt,stumpf,stumpf_neu,r,hori: byte;
  628.     y,yalt:                                shortint;
  629. begin
  630.   if links then begin
  631.     x:=0;
  632.     hori:=fl_str
  633.   end
  634.   else begin
  635.     x:=39;
  636.     hori:=fl_stl
  637.   end;
  638.   y:=random(80);
  639.   next:=fl_hz;
  640.   stumpf_neu:=hori;
  641.   r:=random(100);
  642.   while (y>=0) and (y<80) and
  643.         (spielfeld[y,x]=z_leer) and (r>=3) do
  644.   begin
  645.     r:=random(100);
  646.     xalt:=x;
  647.     yalt:=y;
  648.     spielfeld[y,x]:=next;
  649.     if links then
  650.       inc(x)
  651.     else
  652.       dec(x);
  653.     stumpf:=stumpf_neu;
  654.     if (spielfeld[y,x]=z_leer) and (r>=3) then begin
  655.       xalt:=x;
  656.       case random(3) of
  657.         0: begin
  658.              if links then begin
  659.                spielfeld[y,x]:=fl_lo;
  660.                next:=fl_ru;
  661.              end
  662.              else begin
  663.                spielfeld[y,x]:=fl_ro;
  664.                next:=fl_lu
  665.              end;
  666.              stumpf:=hori;
  667.              stumpf_neu:=fl_stu;
  668.              dec(y);
  669.            end;
  670.         1: begin
  671.              if links then begin
  672.                spielfeld[y,x]:=fl_lu;
  673.                next:=fl_ro;
  674.              end
  675.              else begin
  676.                spielfeld[y,x]:=fl_ru;
  677.                next:=fl_lo
  678.              end;
  679.              stumpf:=hori;
  680.              stumpf_neu:=fl_sto;
  681.              inc(y);
  682.            end;
  683.         2: begin
  684.              next:=fl_hz;
  685.              stumpf_neu:=hori
  686.            end
  687.       end;
  688.     end;
  689.   end;
  690.   if (y>=0) and (y<80) and (x<>0) and (x<>39) then
  691.     spielfeld[yalt,xalt]:=stumpf;
  692. end;
  693.  
  694.  
  695. begin (* Flüsse setzen *)
  696.   for lauf:=0 to 7 do begin
  697.     seite(true);
  698.     seite(false);
  699.   end;
  700. end; (* Flüsse setzen *)
  701.  
  702.  
  703. procedure baeume_setzen;
  704. var x,y: byte;
  705.  
  706. procedure baum(welcher,wieoft: byte);
  707. var lauf: byte;
  708. begin
  709.   for lauf:=0 to wieoft do begin
  710.     x:=random(40);
  711.     y:=random(80);
  712.     if not occupied(x,y) then begin
  713.       spielfeld[y,x]:=welcher;
  714.       spielfeld[y,x+1]:=welcher+1
  715.     end;
  716.   end;
  717. end;
  718.  
  719. begin
  720.   baum(z_baum1,110);
  721.   baum(z_baum2,60);
  722. end;
  723.  
  724.  
  725. (* Zeile 15000- *)
  726. begin (* Spielfeld Init *)
  727.   clear_spielfeld;
  728.   grenze_setzen;
  729.   hauptstaedte_setzen;
  730.   muehlen_und_maerkte_setzen;
  731.   fluesse_setzen;
  732.   baeume_setzen;
  733. end; (* Spielfeld Init *)
  734.  
  735.  
  736. procedure grafik_ein;
  737.  
  738. procedure groesse_berechnen;
  739. begin
  740.   feld_laenge:=(yweite-y0) div 16;
  741.   feld_x:=(xweite-639) div 2;
  742.   if feld_x>2 then begin
  743.     verline(feld_x-2,y0-1,y0+feld_laenge*16+1);
  744.     verline(feld_x+642,y0-1,y0+feld_laenge*16+1);
  745.     if y0+feld_laenge*16+1<yweite then
  746.       horline(feld_x-1,feld_x+641,y0+feld_laenge*16+1);
  747.   end
  748.   else
  749.     if y0+feld_laenge*16+1<yweite then
  750.       horline(feld_x,feld_x+639,y0+feld_laenge*16+1);
  751.   feld_oben:=127;
  752. end;
  753.  
  754. begin
  755.   opengraph;
  756.   horline(0,xweite,y0-2);
  757.   groesse_berechnen;
  758. end;   (* grafik_ein *)
  759.  
  760.  
  761. procedure grafik_spielfeld;
  762. begin  (* grafik_spielfeld *)
  763.   grafik_ein;
  764.   midtext(0,ganzername(amzug));
  765.   midtext(12,'Das ist das Schlachtfeld.');
  766.   midtext(20,
  767.           'Links befinden sich Ihre Truppen. Rechts ist das Grenzgebiet von '+
  768.           reich[feind]+'.');
  769.   midtext(32,
  770.       'Rollen Sie die Karte mit den Cursor-Tasten oder druecken Sie RETURN!');
  771.   feld_anzeigen(0);
  772. end;   (* grafik_spielfeld *)
  773.  
  774.  
  775. procedure truppen_setzen;
  776. var taste: char;
  777.     x,y:   shortint;
  778.     cy:    array[0..1] of shortint;
  779.  
  780. procedure setz_truppe(nummer: byte);
  781. var trupp_nr,
  782.     zeichen:  byte;
  783.  
  784. procedure bewege_cursor;
  785. type control_type = (nix,links,rechts,auf,ab,b_auf,b_ab,pos1,ende,return);
  786. var taste:      char;
  787.     control:    control_type;
  788.     fertig,
  789.     b_moeglich: boolean;
  790.  
  791. procedure grund_x;
  792. begin
  793.   if nummer=0 then
  794.     x:=10
  795.   else
  796.     x:=28;
  797. end;
  798.  
  799. procedure invertieren;
  800. var xx: byte;
  801.     yy: word;
  802. begin
  803.   xx:=(feld_x+x shl 4) shr 3; yy:=y0+(y-feld_oben) shl 4;
  804.   xorput:=true;
  805.   mal(xx,yy,zeichen); mal(xx+2,yy,succ(zeichen));
  806.   mal(xx,yy,z_cursor); mal(xx+2,yy,succ(z_cursor));
  807.   xorput:=false;
  808. end;
  809.  
  810. begin (* Bewege Cursor *)
  811.   keinetaste;
  812.   fertig:=false;
  813.   grund_x; adjust_to(y,2);
  814.   repeat
  815.     invertieren;
  816.     taste:=readkey;
  817.     if not rebuild then invertieren;
  818.     control:=nix;
  819.     if nummer=0 then
  820.       b_moeglich:=(x<=17)
  821.     else
  822.       b_moeglich:=(x>=23);
  823.     if taste=#0 then begin
  824.       taste:=readkey;
  825.       case taste of
  826.         #72: control:=auf;
  827.         #80: control:=ab;
  828.         #75: control:=links;
  829.         #77: control:=rechts;
  830.         #73: control:=b_auf;
  831.         #81: control:=b_ab;
  832.         #71: control:=pos1;
  833.         #79: control:=ende
  834.       end
  835.     end
  836.     else
  837.       case taste of
  838.         '8': control:=auf;
  839.         '2': control:=ab;
  840.         '4': control:=links;
  841.         '6': control:=rechts;
  842.         '9': control:=b_auf;
  843.         '3': control:=b_ab;
  844.         '7': control:=pos1;
  845.         '1': control:=ende;
  846.         #13: control:=return;
  847.       end;
  848.     case control of
  849.       auf:    dec(y);
  850.       ab:     inc(y);
  851.       links:  dec(x);
  852.       rechts: inc(x);
  853.       b_auf:  dec(y,feld_laenge-1);
  854.       b_ab:   inc(y,feld_laenge-1);
  855.       pos1:   y:=0;
  856.       ende:   y:=79;
  857.       return: fertig:=not occupied(x,y);
  858.     end;
  859.     if not (control in [nix,return]) then begin
  860.       if (not b_moeglich) and (control in [b_auf..ende]) then grund_x;
  861.       if y<0 then y:=0;
  862.       if y>79 then y:=79;
  863.       if x<0 then x:=0;
  864.       if x>38 then x:=38;
  865.       if (spielfeld[y,x] in [grenze0..grenze4])  or
  866.          (spielfeld[y,x+1] in [grenze0..grenze4]) then
  867.         if nummer=0 then
  868.           x:=pred(x)
  869.         else
  870.           x:=succ(x);
  871.       adjust_to(y,2);
  872.     end;
  873.   until rebuild or fertig;
  874. end; (* Bewege Cursor *)
  875.  
  876. begin (* Setz 1 Truppe *)
  877.   trupp_nr:=1;
  878.   while truppen[nummer,trupp_nr]<=0 do
  879.     inc(trupp_nr);
  880.   zeichen:=z_truppen+nummer*8+trupp_nr*2;
  881.   bewege_cursor;
  882.   if not rebuild then begin
  883.     spielfeld[y,x]:=zeichen;
  884.     spielfeld[y,x+1]:=zeichen+1;
  885.     zeige_zeile(y);
  886.     dec(truppen[nummer,0],20);
  887.     dec(truppen[nummer,trupp_nr]);
  888.   end;
  889. end; (* Setz 1 Truppe *)
  890.  
  891.  
  892. procedure grafik_truppen;
  893. begin
  894.   grafik_ein;
  895.   midtext(0,'Verteilen Sie jetzt bitte Ihre Truppen!');
  896.   outtext(feld_x shr 3,9, 'Kavallerie:');
  897.   outtext(feld_x shr 3,17,'Artillerie:');
  898.   outtext(feld_x shr 3,25,'Infanterie:');
  899.   outtext(feld_x shr 3,33,'Miliz:');
  900. end;   (* grafik_truppen *)
  901.  
  902.  
  903. begin (* Truppen setzen *)
  904.   y:=feld_oben+(feld_laenge div 2); cy[0]:=y; cy[1]:=y; rebuild:=true;
  905.   while truppen[0,0]+truppen[1,0]>0 do begin
  906.     if rebuild then grafik_truppen;
  907.     zeige_array;
  908.     if truppen[0,0]>=truppen[1,0]
  909.       then begin y:=cy[0]; setz_truppe(0); cy[0]:=y; end
  910.       else begin y:=cy[1]; setz_truppe(1); cy[1]:=y; end;
  911.   end;
  912. end; (* Truppen setzen *)
  913.  
  914.  
  915. procedure angriff;
  916. var x,y,step,
  917.     trupp_nr:     (* I *)      byte;
  918.     gegenangriff,
  919.     zaehlt:       (* ZAEHLT *) boolean;
  920.     energie:      (* ZZ *)     real;
  921.     taste:                     char;
  922.  
  923. procedure clear_schaden;
  924. var x,y: byte;
  925. begin
  926.   schaden_a:=0;
  927.   schaden_f:=0;
  928.   for x:=0 to 1 do
  929.     for y:=0 to 3 do
  930.       schaden[x,y]:=0;
  931. end;
  932.  
  933. procedure vorruecken;
  934. var left,right, (* P1,P2 *)
  935.     old_left,
  936.     x2,         (* J *)
  937.     zeichen,    (* FR2 *)
  938.     strecke:    (* A *)         byte;
  939.     staerke:    (* FR *)        real;
  940.     rueckkehr:                  boolean;
  941.  
  942. procedure kampf;
  943. var staerke2:  real;
  944.     trupp_nr2: byte;
  945. (* Zeile 700- *)
  946. begin (* Kampf *)
  947.   if gegenangriff then begin
  948.     case zeichen of
  949.       z_reiter1:     begin staerke2:=0.7; trupp_nr2:=1 end;
  950.       z_artillerie1: begin staerke2:=0.6; trupp_nr2:=2 end;
  951.       z_infanterie1: begin staerke2:=1;   trupp_nr2:=3 end;
  952.       z_miliz1:      begin staerke2:=1.5; trupp_nr2:=4 end;
  953.     end;
  954.     staerke2:=staerke2*varkfa[feind];
  955.   end
  956.   else begin
  957.     case zeichen of
  958.       z_reiter2:     begin staerke2:=0.7; trupp_nr2:=1 end;
  959.       z_artillerie2: begin staerke2:=0.6; trupp_nr2:=2 end;
  960.       z_infanterie2: begin staerke2:=1;   trupp_nr2:=3 end;
  961.       z_miliz2:      begin staerke2:=1.5; trupp_nr2:=4 end;
  962.     end;
  963.     staerke2:=staerke2*varkfa[feind];
  964.   end;
  965.   if random*(staerke2+staerke+energie)<=staerke2 then begin
  966.     (* Angreifer verliert *)
  967.     if gegenangriff then begin
  968.       spielfeld[y,x2]:=left;
  969.       spielfeld[y,x2+1]:=right;
  970.       inc(truppen[1,trupp_nr]);
  971.     end
  972.     else begin
  973.       spielfeld[y,x2-1]:=left;
  974.       spielfeld[y,x2]:=right;
  975.       inc(truppen[0,trupp_nr]);
  976.     end;
  977.     energie:=energie+staerke;
  978.     zeige_array;
  979.     zeige_zeile(y);
  980.     rueckkehr:=true;
  981.   end
  982.   else begin
  983.     (* Verteidiger verliert *)
  984.     if gegenangriff then begin
  985.       spielfeld[y,x2-1]:=z_leer;
  986.       spielfeld[y,x2-2]:=z_leer;
  987.       inc(truppen[0,trupp_nr2]);
  988.     end
  989.     else begin
  990.       spielfeld[y,x2+1]:=z_leer;
  991.       spielfeld[y,x2+2]:=z_leer;
  992.       inc(truppen[1,trupp_nr2]);
  993.     end;
  994.     energie:=0;
  995.     staerke:=staerke-staerke2;
  996.     zeige_array
  997.   end;
  998. end; (* Kampf *)
  999.  
  1000. procedure zerstoerung;
  1001. var gebaeude: byte;
  1002. (* Zeile 800- *)
  1003. begin (* Zerstörung *)
  1004.   if (gegenangriff and (x2>17)) or
  1005.      ((not gegenangriff) and (x2<23)) then exit; (* Eigene(r) Mühle/Markt *)
  1006.   if zeichen in [zmuehle,z_muehle2] then
  1007.     gebaeude:=1
  1008.   else
  1009.     gebaeude:=0;
  1010.   energie:=energie+staerke;
  1011.   staerke:=energie-0.3-gebaeude*0.25;
  1012.   if staerke<0 then
  1013.     rueckkehr:=true
  1014.   else begin
  1015.     if gegenangriff then begin
  1016.       spielfeld[y,x2-2]:=z_ruine;
  1017.       spielfeld[y,x2-1]:=z_ruine+1;
  1018.       schaden[0,gebaeude]:=schaden[0,gebaeude]+1;
  1019.     end
  1020.     else begin
  1021.       spielfeld[y,x2+1]:=z_ruine;
  1022.       spielfeld[y,x2+2]:=z_ruine+1;
  1023.       schaden[1,gebaeude]:=schaden[1,gebaeude]+1;
  1024.     end;
  1025.     zeige_zeile(y);
  1026.     energie:=0;
  1027.   end;
  1028. end; (* Zerstörung *)
  1029.  
  1030. procedure mauer_ueberwinden;
  1031. (* Zeile 850- *)
  1032. begin (* Mauer überwinden *)
  1033.   energie:=energie+staerke;
  1034.   staerke:=2*energie-0.4;
  1035.   if staerke<0 then
  1036.     rueckkehr:=true
  1037.   else begin
  1038.     if gegenangriff then
  1039.       spielfeld[y,x2-1]:=z_leer
  1040.     else
  1041.       spielfeld[y,x2+1]:=z_leer;
  1042.     energie:=0;
  1043.   end;
  1044. end; (* Mauer überwinden *)
  1045.  
  1046. procedure ansturm(gegen: byte);
  1047. (* Zeile 875 *)
  1048. begin (* Ansturm *)
  1049.   if gegenangriff then
  1050.     schaden[0,gegen]:=schaden[0,gegen]+staerke/(0.5*gegen)
  1051.   else
  1052.     schaden[1,gegen]:=schaden[1,gegen]+staerke/(0.5*gegen);
  1053.   rueckkehr:=true;
  1054. end; (* Ansturm *)
  1055.  
  1056. (* Zeile 500- *)
  1057. begin (* Vorrücken *)
  1058.   left:=z_leer;
  1059.   right:=z_leer;
  1060.   x2:=x;
  1061.   if spielfeld[y,x] in [z_reiter1,z_reiter2] then begin
  1062.     strecke:=19;
  1063.     staerke:=0.7;
  1064.     trupp_nr:=1;
  1065.   end
  1066.   else begin
  1067.     strecke:=13;
  1068.     staerke:=1;
  1069.     trupp_nr:=3;
  1070.   end;
  1071.   if gegenangriff then
  1072.     staerke:=staerke+varkfa[feind]
  1073.   else
  1074.     staerke:=staerke+varkfa[amzug];
  1075.   rueckkehr:=false;
  1076.   repeat
  1077.     if gegenangriff then
  1078.       zeichen:=spielfeld[y,pred(x2)]
  1079.     else
  1080.       zeichen:=spielfeld[y,succ(x2)];
  1081.     case zeichen of
  1082.       z_baum1..z_baum2+1:        staerke:=staerke*0.95;
  1083.       fl_hz..fl_sto:             staerke:=staerke*0.6;
  1084.       grenze0..grenze4:          zaehlt:=true;
  1085.       z_reiter1,z_artillerie1,
  1086.       z_infanterie1,z_miliz1:    if gegenangriff then kampf;
  1087.       z_reiter2,z_artillerie2,
  1088.       z_infanterie2,z_miliz2:    if not gegenangriff then kampf;
  1089.       zmuehle,
  1090.       z_markt2..z_kirche+1:      zerstoerung;
  1091.       sk,toro,toru:              mauer_ueberwinden;
  1092.       lo,ro,lu,ru,hz:            rueckkehr:=true;
  1093.       z_kuppel2..z_palast2:      ansturm(2);
  1094.       z_kreuz2..z_kath2:         ansturm(3);
  1095.     end;
  1096.     if not rueckkehr then begin
  1097.       if gegenangriff then begin
  1098.         old_left:=right;
  1099.         right:=left;
  1100.         left:=spielfeld[y,x2-1];
  1101.         spielfeld[y,x2-1]:=spielfeld[y,x2];
  1102.         spielfeld[y,x2]:=spielfeld[y,x2+1];
  1103.         spielfeld[y,x2+1]:=old_left;
  1104.         if zaehlt then begin
  1105.           erobert:=erobert-(land[amzug] div 800);
  1106.           schaden_a:=schaden_f-erobert;
  1107.         end;
  1108.         dec(x2);
  1109.       end
  1110.       else begin
  1111.         old_left:=left;
  1112.         left:=right;
  1113.         right:=spielfeld[y,x2+1];
  1114.         spielfeld[y,x2+1]:=spielfeld[y,x2];
  1115.         spielfeld[y,x2]:=spielfeld[y,x2-1];
  1116.         spielfeld[y,x2-1]:=old_left;
  1117.         if zaehlt then begin
  1118.           erobert:=erobert+(land[feind] div 800);
  1119.           schaden_f:=erobert;
  1120.         end;
  1121.         inc(x2);
  1122.       end;
  1123.       zeige_zeile(y);
  1124.       delay(100);
  1125.       dec(strecke);
  1126.       if (x2>38) or (x2<1) or (strecke=0) then
  1127.         rueckkehr:=true;
  1128.     end;
  1129.   until rueckkehr
  1130. end; (* Vorrücken *)
  1131.  
  1132. procedure beschiessen;
  1133. var faktor,
  1134.     teil,
  1135.     staerke: (* FR *)   real;
  1136.     weit,    (* WEIT *)
  1137.     schuesse,
  1138.     zeichen: (* A *)    byte;
  1139.     x2:                 shortint;
  1140.     im_feld:            boolean;
  1141.     start,
  1142.     abweichung,
  1143.     k_x, k_y,
  1144.     ziel:               word;
  1145.  
  1146. procedure mal_kugel;
  1147. begin
  1148.   kugel(k_x,k_y-abweichung);
  1149. end;
  1150.  
  1151. procedure zerstoert(was,abweichung: byte);
  1152. var spieler: byte;
  1153. begin
  1154.   spielfeld[y,x2-abweichung]:=z_ruine;
  1155.   spielfeld[y,x2+1-abweichung]:=z_ruine+1;
  1156.   if x2<20 then
  1157.     spieler:=0
  1158.   else
  1159.     spieler:=1;
  1160.   schaden[spieler,was]:=schaden[spieler,was]+1;
  1161. end;
  1162.  
  1163. procedure rest_malen;
  1164. var davor,danach,zeichen2,spieler: byte;
  1165.  
  1166. procedure krater_bei(wo: byte);
  1167. begin
  1168.   spielfeld[y,x2-wo]:=z_krater;
  1169.   spielfeld[y,x2+1-wo]:=z_krater+1;
  1170. end;
  1171.  
  1172. begin (* Rest malen *)
  1173.   davor:=spielfeld[y,x2-1];
  1174.   (* leer oder Baum, rechtes Ende *)
  1175.   if ((zeichen=z_leer) and (davor=z_leer)) or
  1176.      ((zeichen=z_baum1+1) and (davor=z_baum1)) or
  1177.      ((zeichen=z_baum2+1) and (davor=z_baum2)) then
  1178.      begin
  1179.        krater_bei(1);
  1180.        exit
  1181.      end;
  1182.   danach:=spielfeld[y,x2+1];
  1183.   (* leer oder Baum, linkes Ende *)
  1184.   if ((zeichen=z_leer) and (danach=z_leer)) or
  1185.      ((zeichen=z_baum1) and (danach=z_baum1+1)) or
  1186.      ((zeichen=z_baum2) and (danach=z_baum2+1)) then
  1187.      begin
  1188.        krater_bei(0);
  1189.        exit
  1190.      end;
  1191.   (* Truppe *)
  1192.   if zeichen in [z_reiter1-1..z_miliz2+1] then begin
  1193.     zeichen2:=zeichen;
  1194.     zeichen2:=zeichen2-z_reiter1+1;
  1195.     krater_bei(zeichen2 and 1);
  1196.     zeichen2:=zeichen2 shr 1;
  1197.     if zeichen2>=4 then
  1198.       spieler:=1
  1199.     else
  1200.       spieler:=0;
  1201.     zeichen2:=zeichen2 and 3;
  1202.     inc(truppen[spieler,succ(zeichen2)]);
  1203.     zeige_array;
  1204.     exit
  1205.   end;
  1206. end; (* Rest malen *)
  1207.  
  1208. procedure rest_berechnen;
  1209. var spieler: byte;
  1210. begin
  1211.   if gegenangriff then
  1212.     spieler:=0
  1213.   else
  1214.     spieler:=1;
  1215.   case zeichen of
  1216.     z_kuppel2..z_palast2:  schaden[spieler,2]:=schaden[spieler,2]+1;
  1217.     z_kreuz2..z_kath2:     schaden[spieler,3]:=schaden[spieler,3]+1;
  1218.     z_reiter1-1..z_miliz1: varkfa[amzug]:=varkfa[amzug]-0.02;
  1219.     z_reiter2..z_miliz2+1: varkfa[feind]:=varkfa[feind]-0.02
  1220.   end;
  1221. end;
  1222.  
  1223. (* Zeile 900- *)
  1224. begin (* Beschiessen *)
  1225.   if gegenangriff then
  1226.     staerke:=varkfa[feind]
  1227.   else
  1228.     staerke:=varkfa[amzug];
  1229.   if staerke>1 then staerke:=1;
  1230.   schuesse:=trunc(staerke/0.2);
  1231.   while schuesse>0 do begin
  1232.     weit:=16+random(6);
  1233.     if gegenangriff then
  1234.       x2:=x-weit
  1235.     else
  1236.       x2:=x+weit;
  1237.     im_feld:=true;
  1238.     k_y:=y0+(y-feld_oben)*16+2;
  1239.     ziel:=feld_x+x2*16+4;
  1240.     if (x2>39) or (x2<0) then begin
  1241.       if x2<0 then
  1242.         ziel:=feld_x
  1243.       else
  1244.         ziel:=feld_x+635;
  1245.       im_feld:=false;
  1246.     end;
  1247.     start:=feld_x+x*16+6;
  1248.     faktor:=8.0/(longint(ziel)-longint(start));
  1249.     if gegenangriff then
  1250.       for k_x:=start downto ziel do begin
  1251.         teil:=(longint(k_x)-longint(start))*faktor;
  1252.         abweichung:=trunc(8*teil-teil*teil);
  1253.         mal_kugel;
  1254.         delay(10);
  1255.         mal_kugel;
  1256.       end
  1257.     else
  1258.       for k_x:=start to ziel do begin
  1259.         teil:=(longint(k_x)-longint(start))*faktor;
  1260.         abweichung:=trunc(8*teil-teil*teil);
  1261.         mal_kugel;
  1262.         delay(10);
  1263.         mal_kugel;
  1264.       end;
  1265.     if im_feld then begin
  1266.       zeichen:=spielfeld[y,x2];
  1267.       case zeichen of
  1268.         z_kirche,  z_markt2:   zerstoert(0,0);
  1269.         z_kirche+1,z_markt2+1: zerstoert(0,1);
  1270.         zmuehle:               zerstoert(1,0);
  1271.         z_muehle2:             zerstoert(1,1);
  1272.         sk,toro,toru:          spielfeld[y,x2]:=z_leer;
  1273.         else                   begin
  1274.                                  rest_malen;
  1275.                                  rest_berechnen
  1276.                                end;
  1277.       end;
  1278.     end;
  1279.     zeige_zeile(y);
  1280.     dec(schuesse);
  1281.   end;
  1282. end; (* Beschiessen *)
  1283.  
  1284. procedure verlorene_einheiten;
  1285. begin
  1286.   wipetext(feld_x,0,80);
  1287.   outtext(feld_x shr 3,0,'Verlorene Einheiten:');
  1288. end;
  1289.  
  1290.  
  1291. begin (* Angriff *)
  1292.   clear_schaden;
  1293.   step:=(feld_laenge div 2)-1;
  1294.   erobert:=0;
  1295.   verlorene_einheiten;
  1296.   midtext(0,'Der Angriff laeuft...');
  1297.   zeige_array;
  1298.   gegenangriff:=false;
  1299.   for y:=0 to 79 do begin
  1300.     adjust_to(y,step);
  1301.     zaehlt:=false;
  1302.     energie:=0;
  1303.     for x:=25 downto 0 do begin
  1304.       if spielfeld[y,x] in [z_reiter1,z_infanterie1] then
  1305.         vorruecken;
  1306.       if spielfeld[y,x]=z_artillerie1 then
  1307.         beschiessen;
  1308.     end;
  1309.   end;
  1310.  
  1311.   verlorene_einheiten;
  1312.   midtext(0,'Der Gegenangriff laeuft...');
  1313.   gegenangriff:=true;
  1314.   for y:=79 downto 0 do begin
  1315.     adjust_to(y,step);
  1316.     zaehlt:=false;
  1317.     energie:=0;
  1318.     for x:=14 to 39 do begin
  1319.       if spielfeld[y,x] in [z_reiter2,z_infanterie2] then
  1320.         vorruecken;
  1321.       if spielfeld[y,x]=z_artillerie2 then
  1322.         beschiessen;
  1323.     end;
  1324.   end;
  1325.  
  1326.   verlorene_einheiten;
  1327.   midtext(0,'Karte rollen oder RETURN druecken!');
  1328.   bewege_ausschnitt;
  1329.   shutgraph;
  1330. end; (* Angriff *)
  1331.  
  1332.  
  1333. procedure verluste;
  1334. var schaden2:   array[0..1,0..5] of longint;
  1335.  
  1336. procedure rechnen;
  1337. var spieler,
  1338.     lauf,lauf2: byte;
  1339. begin
  1340.   for lauf:=0 to 1 do begin
  1341.     for lauf2:=0 to 3 do
  1342.       schaden2[lauf,lauf2]:=trunc(schaden[lauf,lauf2]);
  1343.     if lauf=0 then
  1344.       spieler:=amzug
  1345.     else
  1346.       spieler:=feind;
  1347.     sub0_int(reiter[spieler],truppen[lauf,1]);
  1348.     sub0_int(artillerie[spieler],truppen[lauf,2]);
  1349.     sub0_int(infanterie[spieler],truppen[lauf,3]);
  1350.     soldaten[spieler]:=20*
  1351.                     (reiter[spieler]+artillerie[spieler]+infanterie[spieler]);
  1352.   end;
  1353.   if erobert>land[feind]-1 then begin
  1354.     erobert:=land[feind]-1;
  1355.     schaden_f:=erobert;
  1356.   end;
  1357.   if -erobert>land[amzug]-1 then begin
  1358.     erobert:=1-land[amzug];
  1359.     schaden_a:=abs(erobert);
  1360.   end;
  1361. end;
  1362.  
  1363. procedure praemie_verteilen;
  1364. type string8 = string[8];
  1365. const partizip: array[boolean] of string8 = ('verloren','gewonnen');
  1366. var gewinn: boolean;
  1367.     praemie: longint;
  1368. (* Zeile 4420- *)
  1369. begin
  1370.   nameundjahr (att[att_praemie]);
  1371.   wrm(8,40,att[att_praemie],ganzername(amzug));
  1372.   gewinn:=erobert>=0;
  1373.   wrm(10,40,att[att_praemie],'hat '+strg(abs(erobert))+' Hektar Land '+partizip[gewinn]+'.');
  1374.   if gewinn then begin
  1375.     praemie:=soldaten[amzug]*trunc(clog(erobert+1))*2;
  1376.     wrm(12,40,att[att_praemie],'Die überlebenden Soldaten bekommen');
  1377.     wrm(13,40,att[att_praemie],'eine großzügige Prämie von '+strg(praemie)+taler+'n.');
  1378.     dec(geld[amzug],praemie)
  1379.   end;
  1380.   taste_druecken;
  1381. end;
  1382.  
  1383. procedure verluste_anzeigen;
  1384. type string17 = string[17];
  1385. const art: array[0..5] of string17 = ('Märkte:          ',
  1386.                                       'Mühlen:          ',
  1387.                                       'Palastteile:     ',
  1388.                                       'Kathedralenteile:',
  1389.                                       'Einwohner:       ',
  1390.                                       'Staatskasse:     ');
  1391. var lauf,y,spieler: byte;
  1392.     schaden_:       longint;
  1393.  
  1394. procedure abziehen(nr: byte; var gebaeude: bytearray);
  1395. begin
  1396.   if schaden2[lauf,nr]>gebaeude[spieler] then
  1397.     schaden2[lauf,nr]:=gebaeude[spieler];
  1398.   dec(gebaeude[spieler],schaden2[lauf,nr]);
  1399. end;
  1400.  
  1401. (* Zeile 4452- *)
  1402. begin
  1403.   for lauf:=0 to 1 do begin
  1404.     if lauf=0 then
  1405.       spieler:=amzug
  1406.     else
  1407.       spieler:=feind;
  1408.     abziehen(0,maerkte);
  1409.     miliz[spieler]:=(maerkte[spieler] div 5)*4;
  1410.     abziehen(1,muehlen);
  1411.     abziehen(2,palast);
  1412.     abziehen(3,kathedrale);
  1413.     schaden2[lauf,4]:=0;
  1414.     schaden2[lauf,5]:=0;
  1415.     if lauf=0 then schaden_:=schaden_a
  1416.               else schaden_:=schaden_f;
  1417.     if geld[spieler]>0 then
  1418.       schaden2[lauf,5]:=trunc((geld[spieler]/land[spieler])*schaden_);
  1419.     schaden2[lauf,4]:=
  1420.       trunc(int((einwohner[spieler]/2/land[spieler])*schaden_));
  1421.     dec(einwohner[spieler],schaden2[lauf,4]);
  1422.     dec(geld[spieler],schaden2[lauf,5]);
  1423.   end;
  1424.   land[amzug]:=land[amzug]+erobert;
  1425.   land[feind]:=land[feind]-erobert;
  1426.   nameundjahr (att[att_verluste]);
  1427.   wrm(4,40,att[att_verluste],'Außer an Soldaten entstanden folgende Verluste:');
  1428.   wrm(7,40,att[att_verluste],'Angreifer:');
  1429.   wrm(7,60,att[att_verluste],'Verteidiger:');
  1430.   for lauf:=0 to 5 do begin
  1431.     y:=10+lauf*2;
  1432.     wr(y,10,att[att_verluste],art[lauf]);
  1433.     wr(y,33,att[att_verluste],strgr(schaden2[0,lauf],6));
  1434.     wr(y,53,att[att_verluste],strgr(schaden2[1,lauf],6));
  1435.   end;
  1436.   taste_druecken;
  1437. end;
  1438.  
  1439. procedure truppen_zurueck;
  1440. var lauf:   byte;
  1441.     strafe: array[1..maxspieler] of longint;
  1442.  
  1443. procedure zurueck(spieler: byte);
  1444.  
  1445. procedure pruef(hoehe: longint; nr: byte; var truppe: intarray);
  1446. var teilstrafe: longint;
  1447. begin
  1448.   if truppe[spieler]>=geliehen[lauf,nr] then
  1449.     dec(truppe[spieler],geliehen[lauf,nr])
  1450.   else begin
  1451.     dec(geliehen[lauf,nr],truppe[spieler]);
  1452.     truppe[spieler]:=0;
  1453.     dec(truppe[lauf],geliehen[lauf,nr]);
  1454.     teilstrafe:=geliehen[lauf,nr]*hoehe;
  1455.     inc(strafe[spieler],teilstrafe);
  1456.     dec(geld[spieler],teilstrafe);
  1457.     inc(geld[spieler],teilstrafe);
  1458.   end;
  1459. end;
  1460.  
  1461. begin (* zurück *)
  1462.   pruef(1200,0,reiter    );
  1463.   pruef(800, 1,artillerie);
  1464.   pruef(500, 2,infanterie);
  1465. end; (* zurück *)
  1466.  
  1467. procedure anzeigen(y,wer: byte);
  1468. begin
  1469.   wrm(y,40,att[att_verluste],ganzername(wer));
  1470.   wrm(y+2,40,att[att_verluste],'kann nicht alle geliehenen Truppen zurückzahlen und muß deshalb');
  1471.   wrm(y+3,40,att[att_verluste],'eine Wiedergutmachung von');
  1472.   wrm(y+5,40,att[att_verluste],strg(strafe[wer])+taler+'n');
  1473.   wrm(y+7,40,att[att_verluste],'zahlen.');
  1474. end;
  1475.  
  1476. (* Zeile 4475- *)
  1477. begin (* Truppen zurück *)
  1478.   strafe[amzug]:=0;
  1479.   strafe[feind]:=0;
  1480.   for lauf:=1 to anzahl_spieler do
  1481.     if not (lauf in [amzug,feind]) then
  1482.       case verhalten[lauf] of
  1483.         hilfe_angreifer:   zurueck(amzug);
  1484.         hilfe_verteidiger: zurueck(feind);
  1485.       end;
  1486.   if strafe[amzug]+strafe[feind]>0 then begin
  1487.     nameundjahr (att[att_verluste]);
  1488.     if strafe[amzug]>0 then
  1489.       anzeigen(4,amzug);
  1490.     if strafe[feind]>0 then
  1491.       anzeigen(14,feind);
  1492.     taste_druecken;
  1493.   end;
  1494. end; (* Truppen zurück *)
  1495.  
  1496.  
  1497. begin (* Verluste *)
  1498.   rechnen;
  1499.   praemie_verteilen;
  1500.   verluste_anzeigen;
  1501.   truppen_zurueck;
  1502. end; (* Verluste *)
  1503.  
  1504.  
  1505. (* Zeile 4000- *)
  1506. begin (* Krieg, wenn möglich *)
  1507.   if cfg.autosave then speichern;
  1508.   NameUndJahr (att[att_verhalt_s]);
  1509.   if anzahl_spieler>2
  1510.     then begin
  1511.       pruefverhalten;
  1512.       if not angriff_moeglich then exit;
  1513.     end else weglaenge:=1;
  1514.   werte_aktualisieren;
  1515.   spielfeld_init;
  1516.   repeat
  1517.     grafik_spielfeld;
  1518.     bewege_ausschnitt;
  1519.   until not rebuild;
  1520.   truppen_setzen;
  1521.   angriff;
  1522.   verluste;
  1523.   anzahlmilitaer;
  1524.   save:=cfg.autosave;
  1525. end; (* Krieg, wenn möglich *)
  1526.  
  1527.  
  1528. begin (* Krieg *)
  1529.   clear_arrays;
  1530.   if Rang[AmZug] = 1 then begin
  1531.     Hinweis('Es ist noch zu früh !!!');
  1532.     Exit
  1533.   end;
  1534.   FeindWaehlen;
  1535.   if Feind = 0 then Exit;
  1536.   krieg_wenn_moeglich;
  1537. end;