home *** CD-ROM | disk | FTP | other *** search
- unit Kausgabe; (* Version 4.1 *)
-
-
- interface
-
- uses crt,dos,screen;
-
- type Imagebild = array[0..15] of word;
- ImageType = record
- breite, Hoehe: word;
- bild: Imagebild
- end;
- const Version = 'Version 4.2';
- datum = '23.10.1992';
- titel_zeile = 'KAISER * '+version+' * '+datum+' * by Oliver Redner';
- hotkey = #59; (* F1: Taste für Sonderfunktionen *)
- rebuild_key = #113;
- cGaSimul = false;
- cursorGestalt = '▒';
- MaxLaenge = 64; (* Maximale Zahl der Einträge im Directory *)
- FSb_X = 5;
- FSb_Y = 7;
- extension = '.KSR';
- config_name = 'KAISER.CFG';
- MaxLng = 57; (* Für die Pfadeingabe *)
- MaxLw = 'J';
- ImageLength = 34;
- ZMuehle = 0;
- ZMarkt = 1; (* Zeichen 1-3 *)
- Laubbaum = 4;
- Tanne = 5;
- Geldsack = 6;
- Schuldbrief = 24;
- Mensch = 7;
- lo = 20; (* Ecke links oben *)
- ro = 21; (* Ecke rechts oben *)
- lu = 16; (* Ecke links unten *)
- ru = 18; (* Ecke rechts unten *)
- hz = 17; (* Horizontale Mauer *)
- sk = 19; (* Senkrechte Mauer *)
- toro = 22; (* Oberer Torteil *)
- toru = 23; (* Unterer Torteil *)
- ZweiFenster = 8;
- Tuerlinks = 9;
- Tuerrechts = 10;
- Spitzen = 11;
- Kuppel = 12;
- Fahne = 13;
- Kuppelfenster = 14;
- Kreuz = 15;
- grenze0 = 25;
- grenze1 = 26;
- grenze2 = 27;
- grenze3 = 28;
- grenze4 = 29;
- z_h = 30;
- z_a = 31;
- z_u = 32;
- z_p = 33;
- z_t = 34;
- z_s = 35;
- z_d = 36;
- z_markt2 = 37; (* 37-38 *)
- z_muehle2 = 39;
- z_kirche = 40; (* 40-41 *)
- z_kuppel2 = 42;
- z_spitzen2 = 43;
- z_palast2 = 44;
- z_kreuz2 = 45;
- z_kreuz3 = 46;
- z_kath2 = 47;
- fl_hz = 48;
- fl_lo = 49;
- fl_ru = 50;
- fl_lu = 51;
- fl_ro = 52;
- fl_str = 53;
- fl_stl = 54;
- fl_stu = 55;
- fl_sto = 56;
- z_baum1 = 57; (* 57 - 58 *)
- z_baum2 = 59; (* 59 - 60 *)
- z_truppen = 61-2; (* 61 - 76 *)
- z_reiter1 = 62;
- z_artillerie1 = 64;
- z_infanterie1 = 66;
- z_miliz1 = 68;
- z_reiter2 = 69;
- z_artillerie2 = 71;
- z_infanterie2 = 73;
- z_miliz2 = 75;
- z_ruine = 77; (* 77 - 78 *)
- z_krater = 79; (* 79 - 80 *)
- z_leer = 81;
- z_cursor = 82; (* 82-83 *)
- leer = Z_leer;
-
- type Reichstring = string[9];
- Namenstring = string[20];
- Titelstring = string[12];
- MaxString = string[80];
- Filename = string[13];
- bauwerkTyp = array[0..2] of byte;
- control_typ = (li,re,auf,ab,bauf,bab,pos1,end_,key,ext);
- menue_typ = record
- xs,ys,xl,yl,at: byte;
- end;
- menue_ptr = ^menue_typ;
-
- const norm = 7; hell = 15; inv = 7*16;
- att_spec_m = 0; (* 4 Attribute *)
- att_abbr_r = att_spec_m+4;
- att_abbr_s = att_abbr_r+1;
- att_tit_back = att_abbr_s+1;
- att_tit_schr = att_tit_back+1;
- att_tit_tit = att_tit_schr+1;
- att_zahl = att_tit_tit+1;
- att_strg = att_zahl+1;
- att_strg_c = att_strg+1;
- att_fsb_r = att_strg_c+1;
- att_fsb_n = att_fsb_r+1;
- att_fsb_h = att_fsb_n+1;
- att_fsb_c = att_fsb_h+1;
- att_spiel_m = att_fsb_c+1; (* 4 Attribute *)
- att_justiz_m = att_spiel_m+4; (* 4 Attribute *)
- att_korn_m = att_justiz_m+4; (* 4 Attribute *)
- att_zuteil_m = att_korn_m; (* gleich att_korn_m *)
- att_einn_m = att_zuteil_m+4; (* 4 Attribute *)
- att_einkauf_m = att_einn_m+4; (* 4 Attribute *)
- att_militaer_m = att_einkauf_m+4; (* 4 Attribute *)
- att_rekrut_m = att_militaer_m; (* gleich att_militaer_m *)
- att_speicher = att_rekrut_m+4;
- att_korn_b = att_speicher+1;
- att_korn_s = att_korn_b+1;
- att_zuteil_b = att_korn_s+1;
- att_zuteil_s = att_zuteil_b+1;
- att_uebers = att_zuteil_s+1;
- att_einn_tit = att_uebers+1;
- att_einn_s = att_einn_tit+1;
- att_einn_z = att_einn_s+1;
- att_nachr = att_einn_z+1;
- att_einkauf_tit = att_nachr+1;
- att_einkauf_s = att_einkauf_tit+1;
- att_spielst_tit = att_einkauf_s+1;
- att_spielst_s = att_spielst_tit+1;
- att_milit_tit = att_spielst_s+1;
- att_milit_s = att_milit_tit+1;
- att_befoer_tit = att_milit_s+1;
- att_befoer_s = att_befoer_tit+1;
- att_kaiser_tit = att_befoer_s+1;
- att_kaiser_s = att_kaiser_tit+1;
- att_verhalt_m = att_kaiser_s+1; (* 4 Attribute *)
- att_verhalt_s = att_verhalt_m+4;
- att_feind_tit = att_verhalt_s+1;
- att_feind_s = att_feind_tit+1;
- att_feind_m = att_feind_s+1; (* 4 Attribute *)
- att_weg_tit = att_feind_m+4;
- att_weg_s = att_weg_tit+1;
- att_praemie = att_weg_s+1;
- att_verluste = att_praemie+1;
- type palette_typ = array[0..att_verluste] of byte;
- const mono_palette: palette_typ =
- (* spec_m *) (norm,norm,hell,inv,
- (* abbr *) hell,hell+blink,
- (* tit *) inv,inv,norm,
- (* zahl *) inv,
- (* strg *) inv,norm,
- (* fsb *) norm,norm,hell,inv,
- (* spiel_m *) norm,norm,hell,inv,
- (* justiz_m *) norm,norm,hell,inv,
- (* korn_m *) norm,norm,hell,inv,
- (* einn_m *) norm,norm,hell,inv,
- (* einkauf_m *) norm,norm,hell,inv,
- (* militaer_m *) norm,norm,hell,inv,
- (* speicher *) hell,
- (* korn *) norm,norm,
- (* zuteil *) norm,norm,
- (* uebers *) norm,
- (* einn *) inv,norm,norm,
- (* nachr *) inv,
- (* einkauf *) inv,norm,
- (* spielst *) inv,norm,
- (* milit *) inv,norm,
- (* befoer *) inv,norm,
- (* kaiser *) inv,norm,
- (* verhalt_m *) norm,norm,hell,inv,
- (* verhalt_s *) norm,
- (* feind *) inv,norm,
- (* feind_m *) norm,norm,hell,inv,
- (* weg *) inv,norm,
- (* praemie *) norm,
- (* verluste *) norm);
- farb_palette: palette_typ =
- (* spec_m *) (blue*16+lightgray,blue*16+lightgray,blue*16+lightred,lightgray*16+blue,
- (* abbr *) red*16+white,red*16+white+blink,
- (* tit *) brown*16+lightgray,brown*16+white,lightgray*16,
- (* zahl *) blue*16+white,
- (* strg *) green*16+white,red*16+green,
- (* fsb *) red*16+yellow,red*16+lightgray,red*16+white,red+lightgray*16,
- (* spiel_m *) 16*lightgray,16*lightgray,lightgray*16+yellow,white+16*red,
- (* justiz_m *) blue*16+red,blue*16+lightgray,blue*16+white,red*16+lightgray,
- (* korn_m *) 16*lightgray,16*lightgray,lightgray*16+yellow,white+16*red,
- (* einn_m *) green*16+red,green*16,green*16+white,red*16+green,
- (* einkauf_m *) brown*16+lightgray,brown*16+lightgray,brown*16+white,lightgray*16+brown,
- (* militaer_m *) brown*16+lightgray,brown*16+lightgray,brown*16+white,lightgray*16+brown,
- (* speicher *) brown*16+yellow,
- (* korn *) brown*16+lightgray,brown*16+white,
- (* zuteil *) lightgray*16,lightgray*16+red,
- (* uebers *) brown*16+lightgray,
- (* einn *) green*16,16*lightgray+blue,16*lightgray+red,
- (* nachr *) red*16+white,
- (* einkauf *) blue*16+lightgray,lightgray*16+blue,
- (* spielst *) blue*16+lightgray,lightgray*16+blue,
- (* milit *) blue*16+lightgray,lightgray*16+blue,
- (* befoer *) blue*16+lightgray,lightgray*16+blue,
- (* kaiser *) blue*16+lightgray,lightgray*16+blue,
- (* verhalt_m *) brown*16+lightgray,brown*16+lightgray,brown*16+white,lightgray*16+brown,
- (* verhalt_s *) blue*16+lightgray,
- (* feind *) lightgray*16+blue,blue*16+lightgray,
- (* feind_m *) brown*16+lightgray,brown*16+lightgray,brown*16+white,lightgray*16+brown,
- (* weg *) lightgray*16+blue,blue*16+lightgray,
- (* praemie *) blue*16+lightgray,
- (* verluste *) blue*16+lightgray);
-
-
- var i,j: text;
- SavePath: PathStr;
- XWeite,YWeite: word;
- rebuild,langsam: boolean;
- graphmode,textmode: procedure;
- row: procedure (a: byte);
- mal: procedure (a: byte; b: word; c: byte);
- horline,verline,scroll: procedure (a,b,c: word);
- outtext: procedure (a: byte; b: word; c: string);
- kugel: procedure (a,b: word);
-
- att: palette_typ;
-
- {$I kextrn}
-
-
- type cfgtyp = record
- soundf,autosave: boolean;
- end;
-
- const cfg: cfgtyp = (soundf: true;
- autosave:true);
-
- procedure Titelschirm;
- procedure KeineTaste;
- procedure Wait;
- procedure Rahmen (att: byte);
- procedure Rand (att: byte);
- procedure clear(x1,x2,y1,y2,att: byte);
- procedure Hinweis(Text: MaxString);
- procedure cursor(an_aus: boolean);
- procedure Taste_druecken;
- procedure NeuerKaiser(var Name: MaxString);
- procedure NeuerTitelSound;
- procedure NachrichtSound;
- procedure OpenGraph;
- procedure ShutGraph;
- procedure midtext(y: word; s: maxstring);
- procedure wipetext(x,y: word; anzahl: byte);
- procedure sub0_int(var zahl1: integer; zahl2: integer);
- procedure rectangle(x1,y1,x2,y2: word);
- procedure lies (var control: control_typ; var taste: char; num_pad: boolean);
- procedure waehlen (menue: menue_ptr; var wahl: byte);
- procedure Warte(Laenge: longint);
- function alterKaiser: MaxString;
- function MomentZeit: longint;
- function Strg(Zahl: longint): string;
- function StrgR(Zahl: longint; Laenge: byte): string;
- function eingabe(Stellen: byte; Text: MaxString): longint;
- function eingcapStr(Laenge: byte): MaxString;
- function eingstring(laenge: byte): maxstring;
- function Lowercase(Zeichen: char): char;
- function Uppercase(Zeichen: char): char;
- function min(Zahl1, Zahl2: byte): byte;
- function fileselect(wildcard: filename; var path: dirstr): pathstr;
- function eingFilename: PathStr;
- function Ja: boolean;
- function Numerus(Zahl: longint; einzahl, endung: MaxString): MaxString;
- function SgPl(Zahl: longint; einzahl, Mehrzahl: MaxString): MaxString;
- function clog(von: real): real;
- function readkey: char;
-
-
- implementation
-
-
- type Toene = (c,cis,d,dis,e,f,fis,g,gis,a,b,h);
-
- const Hoehe: array[Toene] of word =
- (10465, 11087, 11747, 12445, 13185, 13969,
- 14800, 15680, 16613, 17600, 18647, 19755);
-
- Ganze = 150;
-
- type rettbildtyp = object
- bild: ^crt_screen_type;
- grafik: pointer;
- groesse: word;
- aktiv: boolean;
- constructor sichern;
- destructor wiederherstellen;
- end;
- rettbildptr = ^rettbildtyp;
- karten_typen = (keine,hgc,cga,ega);
- string2 = string[2];
-
- var oktavefaktor: byte;
- nextchar: char;
- spec_funx_aktiv,grafik_aktiv,
- ueberlapp: boolean;
- grafikkarte: karten_typen;
- save_size: word;
- scr_save,scr_restore: procedure (a: pointer);
-
-
- constructor rettbildtyp.sichern;
- begin
- aktiv:=grafik_aktiv;
- if grafik_aktiv
- then begin
- if ueberlapp then
- if (save_size>0) and (maxavail>=save_size)
- then begin getmem(grafik,save_size); scr_save (grafik); end
- else grafik:=nil;
- textmode;
- grafik_aktiv:=false;
- end else
- if maxavail>=sizeof(bild)
- then begin new(bild); bild^:=crt_screen^; end
- else bild:=nil;
- end;
-
- destructor rettbildtyp.wiederherstellen;
- begin
- grafik_aktiv:=aktiv;
- if grafik_aktiv
- then begin
- auto_cls:=false; graphmode;
- if ueberlapp and (grafik<>nil) then begin
- scr_restore (grafik); freemem(grafik,save_size);
- end;
- end else if bild<>nil then begin
- crt_screen^:=bild^; dispose(bild)
- end;
- end;
-
-
- {$F+}
- function video_adapter: byte; external;
- {$L vidadapt}
-
- {$I kgraph} {$L kgraph}
- {$F-}
-
-
- function MomentZeit: longint;
- var h,m,s,hund: word;
- begin
- GetTime(h, m, s, hund);
- Momentzeit := h*360000+m*6000+s*100+hund
- end;
-
-
- procedure Warte(Laenge: longint);
- var Start, Zeit1, Zeit2: longint;
- begin
- Start := Momentzeit;
- Zeit1 := Start + Laenge;
- repeat
- Zeit2 := Momentzeit;
- until (Zeit2 > Zeit1) or (Zeit2 < Start)
- end;
-
- procedure Play(Ton: Toene; Laenge, Pause: word);
- begin
- sound(Hoehe[Ton] div OktaveFaktor);
- warte(Ganze div Laenge);
- nosound;
- if Pause > 0 then
- warte(Ganze div Pause)
- end;
-
-
- procedure Oktave(OktavNr: byte);
- begin
- OktaveFaktor := 256 shr OktavNr
- end;
-
-
- procedure waehlen (menue: menue_ptr; var wahl: byte);
- var y,attr,cx: byte;
- s: maxstring;
- control: control_typ;
- taste: char;
- ende: boolean;
-
- procedure suchen (zeichen: char);
- var lauf,i: byte;
- found: boolean;
- s: maxstring;
- begin
- with menue^ do begin
- found:=false; lauf:=wahl;
- repeat
- move(mem[seg(menue^):ofs(menue^)+sizeof(menue_typ)+pred(lauf)*(xl+2)],s,xl+2);
- for i:=1 to length(s) do s[i]:=upcase(s[i]);
- if pos('^'+zeichen,s)>0 then found:=true
- else begin
- inc(lauf); if lauf>yl then lauf:=1;
- end;
- until found or (lauf=wahl);
- end;
- if found then begin wahl:=lauf; ende:=true; end
- else inc(wahl);
- end; (* suchen *)
-
- procedure zeile (y: byte);
- var x: byte;
- begin
- with menue^ do begin
- setattr (ys+y,xs,xl,att[succ(at)]);
- move(mem[seg(menue^):ofs(menue^)+sizeof(menue_typ)+y*(xl+2)],s,xl+2);
- attr:=att[succ(at)]; cx:=xs;
- for x:=1 to length(s) do
- if s[x]='^' then attr:=att[at+2]
- else begin
- wp(crt_screen)^[ys+y,cx]:=ord(s[x])+swap(attr);
- attr:=att[succ(at)]; inc(cx);
- end;
- end;
- end; (* zeile *)
-
- begin (* waehlen *)
- ende:=false;
- with menue^ do begin
- box (all_single_box,pred(xs),pred(ys),xl,yl,att[at],att[succ(at)]);
- for y:=0 to pred(yl) do zeile (y);
- repeat
- setattr (ys+pred(wahl),xs,xl,att[at+3]);
- lies (control,taste,true);
- zeile (pred(wahl));
- case control of
- li,auf: dec(wahl);
- re,ab: inc(wahl);
- pos1: wahl:=1;
- end_: wahl:=yl;
- key: case upcase(taste) of
- #13: ende:=true;
- #27: begin wahl:=0; ende:=true; end;
- else suchen (upcase(taste));
- end;
- end;
- if not ende then begin
- if wahl<1 then wahl:=yl;
- if wahl>yl then wahl:=1;
- end;
- until ende;
- if wahl>0 then setattr (ys+pred(wahl),xs,xl,att[at+2]);
- end;
- end; (* waehlen *)
-
-
- procedure schreibe_titelzeile;
- begin
- clrscr; writeln(titel_zeile); writeln;
- end;
-
-
- procedure parameter_auswerten;
- const ungueltig = 'Ungültiger Parameter: ';
- unbekannte_karte = 'Unbekannte Grafikkarte: ';
- unbekannt = 'Unbekannter Parameter: ';
- ueberfluessig = 'Überflüssiger Parameter: ';
- var s: maxstring;
- lauf: word;
- i: byte;
-
- procedure hilfe (text: maxstring);
- begin
- schreibe_titelzeile; writeln(text); writeln;
- writeln('Aufruf: KAISER [Parameter]'); writeln;
- writeln(' [Parameter]: /GH Hercules-Grafik benutzen');
- writeln(' C CGA-Grafik benutzen');
- writeln(' E EGA-Grafik benutzen');
- writeln(' /H Diese Hilfe erscheint');
- writeln;
- halt;
- end; (* hilfe *)
-
- procedure fragen;
- var taste: char;
- begin
- clrscr; writeln(titel_zeile); writeln;
- writeln('Welche Grafikkarte ist angeschlossen?'); writeln;
- writeln(' 1 ... Hercules');
- writeln(' 2 ... CGA');
- writeln(' 3 ... EGA');
- repeat
- taste:=crt.readkey;
- if taste=#27 then halt;
- until (taste>='1') and (taste<='3');
- grafikkarte:=karten_typen(ord(taste)-ord('0'));
- end; (* fragen *)
-
- begin (* parameter_auswerten *)
- grafikkarte:=keine;
- if paramcount>0 then for lauf:=1 to paramcount do begin
- s:=paramstr(lauf); for i:=1 to length(s) do s[i]:=upcase(s[i]);
- if not (s[1] in ['/','-'])
- then hilfe (ungueltig+s)
- else case s[2] of
- 'G': begin
- if grafikkarte<>keine then hilfe (ueberfluessig+s);
- case s[3] of
- 'H': grafikkarte:=hgc;
- 'C': grafikkarte:=cga;
- 'E': grafikkarte:=ega;
- else hilfe (unbekannte_karte+s);
- end;
- end;
- 'H': hilfe ('Hilfe:');
- else hilfe (unbekannt+s);
- end;
- end;
- if grafikkarte=keine then case video_adapter of
- 1: fragen; (* MDA *)
- 2: grafikkarte:=cga; (* CGA *)
- 3: grafikkarte:=hgc; (* HGC *)
- 4: grafikkarte:=ega; (* EGA *)
- 5: fragen; (* MCGA *)
- 6: grafikkarte:=ega; (* VGA *)
- else fragen;
- end;
- end; (* parameter_auswerten *)
-
- procedure load_config;
- var f: file;
- begin
- assign(f,config_name);
- reset(f,sizeof(cfgtyp));
- blockread(f,cfg,1);
- close(f);
- end;
-
-
- procedure save_config;
- var f: file;
- begin
- assign(f,config_name);
- rewrite(f,sizeof(cfgtyp));
- blockwrite(f,cfg,1);
- close(f);
- end;
-
-
-
- function specialfunx: boolean;
- const spec_m: menue_typ = (xs:28;ys:10;xl:23;yl:5;at:att_spec_m);
- spec_m_tx: array[1..5] of string[24] =
- (' ^Sound: ',
- ' ^Auto Save: ',
- '^Konfiguration Speichern',
- ' KAISER ^beenden',
- ' Spiel ^Fortsetzen');
- an_aus: array[boolean] of string[3] = ('aus',' an');
- var auswahl,y: byte;
- rettscreen: rettbildptr;
- carry: boolean;
-
- procedure abbruch;
- var Taste: char;
- y: byte;
- rettscreen: rettbildptr;
- begin (* abbruch *)
- new(rettscreen,sichern);
- box(all_double_box,12,11,55,1,att[att_abbr_r],att[att_abbr_s]);
- wr(12,14,att[att_abbr_s],'Druecken Sie ESC, wenn Sie wirklich abbrechen wollen!');
- taste:=crt.readkey;
- if taste=#27 then begin
- textattr:=lightgray; clrscr;
- writeln; writeln;
- wrm(0,40,lightgray*16,' Bis zum nächsten KAISER Spiel ... ');
- cursor(true);
- halt
- end;
- dispose(rettscreen,wiederherstellen);
- end; (* abbruch *)
-
- begin (* Special Funx *)
- if spec_funx_aktiv then exit;
- spec_funx_aktiv:=true; specialfunx:=false;
- new(rettscreen,sichern); carry:=rebuild;
- auswahl:=5;
- repeat
- with cfg do begin
- spec_m_tx[1]:=copy(spec_m_tx[1],1,16)+an_aus[soundf];
- spec_m_tx[2]:=copy(spec_m_tx[2],1,16)+an_aus[autosave];
- waehlen (@spec_m,auswahl);
- case auswahl of
- 1: soundf:=not soundf;
- 2: autosave:=not autosave;
- 3: save_config;
- 4: abbruch;
- end;
- end;
- until auswahl in [0,5];
- dispose(rettscreen,wiederherstellen); rebuild:=carry;
- spec_funx_aktiv:=false;
- if grafik_aktiv and ueberlapp and (save_size=0) then specialfunx:=true;
- end; (* Special Funx *)
-
-
- procedure Titelschirm;
- begin
- rahmen (att[att_tit_back]);
- wrm(1,40,att[att_tit_tit],' * * * K A I S E R * * * ');
- wr(1,2,att[att_tit_back],Version);
- wrr(1,77,att[att_tit_back],'von Oliver Redner');
- wrm(23,40,att[att_tit_back],'Drücken Sie während des Spiels F1 für die Sonderfunktionen');
- wrm(4,40,att[att_tit_back],
- 'KAISER wurde vom ATARI 800 XL - dort in ATARI BASIC geschrieben - in');
- wrm(5,40,att[att_tit_back],'Turbo-Pascal umgesetzt. Programmierbeginn am 26.12.1989.');
- wr(7,10,att[att_tit_back],Version);
- wrr(7,70,att[att_tit_back],datum);
- wrm(9,40,att[att_tit_back],'Sie dürfen und sollen KAISER an andere Computerbesitzer weitergeben.');
- wrm(11,40,att[att_tit_back],'Wenn Ihnen dieses Programm gefällt, schicken Sie dem Programmierer einen');
- wrm(12,40,att[att_tit_back],'beliebigen Geldbetrag für seine Mühe. Danke!');
- wrm(14,40,att[att_tit_back],'Lesen Sie unbedingt KAISER.TXT!');
- wrm(16,40,att[att_tit_back],'Meine Adresse: Oliver Redner');
- wr(17,44,att[att_tit_back],'Ludwigsaue 37');
- wr(18,44,att[att_tit_back],'3000 Hannover 51');
- end;
-
-
- procedure KeineTaste;
- var Taste: char;
- begin
- while keypressed do
- Taste:=crt.readkey
- end;
-
- procedure Wait;
- var Taste: char;
- begin
- KeineTaste;
- Taste:=readkey;
- if Taste = #0 then
- taste:=readkey;
- end;
-
-
- procedure clear(x1,x2,y1,y2,att: byte);
- var x,y: byte;
- begin
- for y:=y1 to y2 do
- for x:=x1 to x2 do begin
- crt_screen^[y,x,0]:=' '; crt_screen^[y,x,1]:=chr(att);
- end;
- end;
-
-
- procedure Rand (att: byte);
- begin
- box(all_single_box,0,0,78,23,att,att)
- end;
-
-
- procedure Rahmen (att: byte);
- begin
- rand (att);
- box(all_single_box,0,0,78,1,att,att);
- wr(2,0,att,'├'); wr(2,79,att,'┤')
- end;
-
-
- procedure Hinweis(Text: MaxString);
- var x,att: byte;
- rettscreen: rettbildptr;
- begin
- new(rettscreen,sichern);
- att:=ord(crt_screen^[24,0,1]);
- x:=(80-length(text)) div 2;
- wr(24,x-2,att,'┤ ');
- wr(24,x+length(Text),att,' ├');
- wr(24,x,att,Text);
- setattr(24,x,length(text),att+blink);
- wait;
- dispose(rettscreen,wiederherstellen);
- end;
-
-
- procedure cursor(an_aus: boolean);
-
- var Regs: Registers;
-
- begin
- with Regs do begin
- if an_aus then
- cX:=$0C0D
- else
- cX:=$1000;
- aX:=$0100;
- Intr($10,dos.Registers(Regs));
- end
- end;
-
- procedure Taste_druecken;
- begin
- Hinweis('Bitte eine Taste drücken !!!')
- end;
-
-
- procedure NeuerKaiser(var Name: MaxString);
- var x: byte;
- begin
- for x:=1 to length(Name) do
- Name[x] := Uppercase(Name[x]);
- rewrite(i);
- writeln(i, Name);
- close(i)
- end;
-
- procedure NeuerTitelSound;
- var x,y: byte;
- begin
- Oktave(3);
- for x:=1 to 2 do begin
- for y:=1 to 5 do
- play(d, 16, 32);
- play(g, 16, 8)
- end;
- for x:=1 to 4 do
- play(d, 16, 32);
- play(g, 16, 32);
- play(g, 16, 32);
- play(h, 16, 32);
- play(g, 16, 0)
- end;
-
- procedure NachrichtSound;
- var x: byte;
- begin
- Oktave(3);
- for x:=1 to 3 do
- Play(a, 4, 0);
- Play(d, 2, 4);
- for x:=1 to 3 do
- Play(h, 4, 0);
- Play(g, 2, 0)
- end;
-
-
- procedure opengraph;
- begin
- auto_cls:=true; graphmode;
- grafik_aktiv:=true; xorput:=false;
- end;
-
-
- procedure shutgraph;
- begin
- textmode; grafik_aktiv:=false;
- end;
-
-
- procedure midtext(y: word; s: maxstring);
- begin
- outtext(((succ(xweite) shr 3)-length(s)) shr 1,y,s)
- end;
-
-
- procedure wipetext(x,y: word; anzahl: byte);
- var s: string;
- i: byte;
- begin
- s[0]:=chr(anzahl); fillchar(s[1],anzahl,' ');
- outtext(x shr 3,y,s);
- end;
-
-
- procedure sub0_int(var zahl1: integer; zahl2: integer);
- begin
- if zahl2>zahl1 then
- zahl1:=0
- else
- dec(zahl1,zahl2);
- end;
-
-
- procedure grafik_init;
- var f: file;
- size: longint;
- textfont,graffont: pathstr;
-
- procedure fatal(text: maxstring);
- begin
- schreibe_titelzeile;
- writeln(text); writeln; halt;
- end;
-
- begin
- case grafikkarte of
- hgc: begin
- textfont:='KAIS8X8.FNT'; graffont:='KAISHGC.FNT';
- crt_screen:=ptr($B000,0); att:=mono_palette;
- graphmode:=hgc_graphmode; textmode:=hgc_textmode;
- horline:=hgc_horline; verline:=hgc_verline;
- outtext:=hgc_text; mal:=hgc_mal; row:=hgc_row;
- kugel:=hgc_kugel;
- xweite:=719; yweite:=347; farbe:=1;
- langsam:=false; ueberlapp:=false;
- end;
- cga: begin
- textfont:='KAIS8X8.FNT'; graffont:='KAISHGC.FNT';
- crt_screen:=ptr($B800,0); att:=farb_palette;
- graphmode:=cga_graphmode; textmode:=cga_textmode;
- horline:=cga_horline; verline:=cga_verline;
- outtext:=cga_text; mal:=cga_mal; row:=cga_row;
- kugel:=cga_kugel; scr_save:=cga_save; scr_restore:=cga_restore;
- xweite:=639; yweite:=199; farbe:=1;
- langsam:=false; ueberlapp:=true; save_size:=16000;
- end;
- ega: begin
- textfont:='KAIS8X8.FNT'; graffont:='KAISEGA.FNT';
- crt_screen:=ptr($B800,0); att:=farb_palette;
- graphmode:=ega_graphmode; textmode:=ega_textmode;
- horline:=ega_horline; verline:=ega_verline;
- outtext:=ega_text; mal:=ega_mal; row:=ega_row;
- kugel:=ega_kugel; scroll:=ega_scroll;
- xweite:=639; yweite:=349; farbe:=7;
- langsam:=true; ueberlapp:=true; save_size:=0;
- palette:=@palette1;att[att_speicher]:=brown*16+cyan;
- end;
- else halt;
- end;
- assign(f,textfont); reset(f,1);
- if ioresult<>0 then fatal(textfont+' nicht gefunden!');
- size:=filesize(f); getmem(text_satz,size);
- blockread(f,text_satz^,size);
- if ioresult<>0 then fatal(textfont+' fehlerhaft!');
- close(f);
- assign(f,graffont); reset(f,1);
- if ioresult<>0 then fatal(graffont+' nicht gefunden!');
- size:=filesize(f); getmem(graf_satz,size);
- blockread(f,graf_satz^,size);
- if ioresult<>0 then fatal(graffont+' fehlerhaft!');
- close(f);
- opengraph; shutgraph;
- end; (* grafik_init *)
-
-
- procedure rectangle(x1,y1,x2,y2: word);
- begin
- horline(x1,x2,y1); horline(x1,x2,y2);
- verline(x1,y1,y2); verline(x2,y1,y2);
- end;
-
-
- procedure lies (var control: control_typ; var taste: char; num_pad: boolean);
- begin
- taste:=readkey;
- if taste=#0
- then begin
- taste:=readkey;
- case ord(taste) of
- 72: control:=auf;
- 80: control:=ab;
- 75: control:=li;
- 77: control:=re;
- 73: control:=bauf;
- 81: control:=bab;
- 71: control:=pos1;
- 79: control:=end_;
- else control:=ext;
- end;
- end else
- if num_pad
- then case taste of
- '8': control:=auf;
- '2': control:=ab;
- '4': control:=li;
- '6': control:=re;
- '9': control:=bauf;
- '3': control:=bab;
- '7': control:=pos1;
- '1': control:=end_;
- else control:=key;
- end
- else control:=key;
- end; (* lies *)
-
-
- function alterKaiser: MaxString;
- var Name: MaxString;
- begin
- reset(i);
- readln(i, Name);
- close(i);
- alterKaiser := Name
- end;
-
-
- function Strg(Zahl: longint): string;
- var s: string;
- begin
- str(Zahl, s);
- Strg := s
- end;
-
- function StrgR(Zahl: longint; Laenge: byte): string;
- var s: string;
- begin
- str(Zahl:Laenge,s);
- StrgR := s
- end;
-
-
- function eingabe(Stellen: byte; Text: MaxString): longint;
-
- var X,XZahl : byte;
- Zahl: array [1..8] of char;
- Taste: char;
- Wert,Potenz: longint;
- rettscreen: rettbildptr;
-
- begin
- new(rettscreen,sichern);
- KeineTaste;
- x := (76 - length(Text)) div 2;
- box(all_single_box,x,10,length(text)+2,3,att[att_zahl],att[att_zahl]);
- box(all_single_box,x,12,length(text)+2,1,att[att_zahl],att[att_zahl]);
- crt_screen^[12, x, 0] := '├';
- crt_screen^[12, x+length(Text)+3, 0] := '┤';
- wr(11,x+2,att[att_zahl],text);
- XZahl := round( (80 - Stellen) / 2) + Stellen;
- for x:=1 to Stellen do
- Zahl[x] := '0';
- repeat
- for x:= 1 to Stellen do
- crt_screen^[13, XZahl-x, 0] := Zahl[x];
- Taste := ReadKey;
- case Taste of
- '0'..'9': begin
- for x:=Stellen-1 downto 1 do
- Zahl[x+1] := Zahl[x];
- Zahl[1] := Taste
- end;
- #8: begin
- for x:=2 to Stellen do
- Zahl[x-1] := Zahl[x];
- Zahl[Stellen] := '0'
- end;
- #0: taste:=readkey;
- end
- until Taste in [#13,#27];
- if Taste = #13 then begin
- Wert := 0; Potenz := 1;
- for x:=1 to Stellen do begin
- Wert := Wert + Potenz * (ord(Zahl[x])-ord('0'));
- Potenz := Potenz * 10
- end;
- eingabe := Wert end
- else
- eingabe := 0;
- dispose(rettscreen,wiederherstellen);
- end;
-
-
- function Uppercase(Zeichen: char): char;
- begin
- case Zeichen of
- 'ä': Uppercase := 'Ä';
- 'ö': Uppercase := 'Ö';
- 'ü': Uppercase := 'Ü'
- else Uppercase := upcase(Zeichen)
- end
- end;
-
-
- function Lowercase(Zeichen: char): char;
- begin
- case Zeichen of
- 'A'..'Z': Lowercase := chr(ord(Zeichen)+(ord('a') - ord('A')));
- 'Ä': Lowercase := 'ä';
- 'Ö': Lowercase := 'ö';
- 'Ü': Lowercase := 'ü'
- else Lowercase := Zeichen
- end
- end;
-
-
-
-
- function eingstring (laenge: byte): maxstring;
- const eing_y = 13;
- var s,s2: maxstring;
- eing_x,alt_lng,cs: byte;
- control: control_typ;
- taste: char;
- rettscreen: rettbildptr;
- begin
- new(rettscreen,sichern);
- eing_x:=(78-laenge) div 2;
- box(all_single_box,pred(eing_x),pred(eing_y),succ(laenge),1,att[att_strg],att[att_strg]);
- s:=''; alt_lng:=0; cs:=length(s);
- repeat
- if length(s)<alt_lng then wischen (eing_y,eing_x,succ(laenge),att[att_strg]);
- wr(eing_y,eing_x,att[att_strg],s+' ');
- crt_screen^[eing_y,eing_x+cs,1]:=chr(att[att_strg_c]);
- alt_lng:=length(s);
- lies (control,taste,false);
- case control of
- li: if cs>0 then dec(cs);
- re: if cs<alt_lng then inc(cs);
- pos1: cs:=0;
- end_: cs:=alt_lng;
- key: case taste of
- #8: if (cs>0) and (alt_lng>0) then begin
- delete(s,cs,1); dec(cs);
- end;
- #13,#27: ;
- else if length(s)<laenge then begin
- s2:=''; if cs>0 then s2:=copy(s,1,cs);
- s2:=s2+taste;
- if cs<alt_lng then s2:=s2+copy(s,succ(cs),alt_lng-cs);
- s:=s2; inc(cs);
- end;
- end;
- ext: case ord(taste) of
- 83: if (alt_lng>0) and (cs<alt_lng) then delete(s,succ(cs),1);
- end;
- end;
- until taste in [#13,#27];
- if taste=#27 then eingstring:=''
- else eingstring:=s;
- dispose(rettscreen,wiederherstellen);
- end; (* eingstring *)
-
-
- function eingFilename: PathStr;
- (* Eingabe eines Filenamens OHNE Extension mit Suchpfad *)
-
- var s: PathStr;
- x: byte;
-
- begin
- s := eingString(40);
- if s <> '' then begin
- s := Fexpand(s);
- x := pos('.',s);
- if x <> 0 then
- delete(s, x, length(s) - x + 1)
- end;
- eingFilename := s
- end;
-
-
-
- function eingcapStr(Laenge: byte): MaxString;
-
- var s: MaxString;
- x: byte;
-
- begin
- s := eingString(Laenge);
- if s <> ''then begin
- s[1] := Uppercase(s[1]);
- if length(s) > 1 then
- for x:=2 to length(s) do
- if s[x-1] = ' ' then
- s[x] := Uppercase(s[x])
- else
- s[x] := Lowercase(s[x]);
- while s[length(s)] = ' ' do
- delete(s, length(s), 1)
- end;
- eingcapStr := s
- end;
-
-
- function min(Zahl1, Zahl2: byte): byte;
- begin
- if Zahl1 > Zahl2 then
- min := Zahl2
- else
- min := Zahl1
- end;
-
-
- function fileselect(wildcard: filename; var path: dirstr): pathstr;
- type eintrag_ptr = ^eintragrec;
- eintrag_ptr_ad = ^eintrag_ptr;
- eintragrec = record
- name: filename;
- nachfolger: eintrag_ptr
- end;
- const fsb_x = 10;
- fsb_y = 8;
- fsb_pro_zeile = 4;
- fsb_zeilen = 10;
- fsb_eintr = fsb_pro_zeile*fsb_zeilen;
- var startzeiger: eintrag_ptr;
- fertig,abbruch,
- eintraege_vorh: boolean;
- eintraege: integer;
- rettscreen: rettbildptr;
-
- procedure eintraege_lesen;
- var eintrag: searchrec;
-
- procedure zur_liste(was: filename);
- var zeiger: eintrag_ptr_ad;
- hilfszeiger: eintrag_ptr;
- begin
- zeiger:=@startzeiger;
- while (zeiger^<>nil) and (zeiger^^.name<was) do zeiger:=@zeiger^^.nachfolger;
- if zeiger^=nil
- then begin
- new(zeiger^);
- zeiger^^.nachfolger:=nil;
- end else begin
- hilfszeiger:=zeiger^;
- new(zeiger^);
- zeiger^^.nachfolger:=hilfszeiger;
- end;
- zeiger^^.name:=was;
- inc(eintraege);
- end; (* zur_liste *)
-
- begin (* eintraege_lesen *)
- eintraege:=0;
- findfirst(path+wildcard,archive,eintrag);
- while doserror=0 do begin
- zur_liste(eintrag.name);
- findnext(eintrag)
- end;
- findfirst(path+'*.*',archive+directory,eintrag);
- while doserror=0 do begin
- if ((eintrag.attr and directory)>0) and (eintrag.name<>'.') then
- zur_liste('['+eintrag.name+']');
- findnext(eintrag)
- end;
- eintraege_vorh:=startzeiger<>nil;
- if not eintraege_vorh then
- wrm(fsb_y+1,40,att[att_fsb_h],'Keine Einträge vorhanden!');
- end; (* eintraege_lesen *)
-
- procedure auswaehlen;
- var wahl,oben: integer;
- taste: char;
- changed,cursor: boolean;
- control: control_typ;
- x,y: byte;
-
- function eintrag(nr: integer): eintrag_ptr;
- var zeiger: eintrag_ptr;
- begin
- zeiger:=startzeiger;
- while nr>0 do begin
- zeiger:=zeiger^.nachfolger;
- dec(nr);
- end;
- eintrag:=zeiger
- end; (* eintrag *)
-
- procedure ausschnitt;
-
- procedure darstellen;
- var nr: integer;
- zeiger: eintrag_ptr;
- lauf: byte;
- begin (* darstellen *)
- for lauf:=fsb_y to fsb_y+fsb_zeilen-1 do
- wischen (lauf,fsb_x,fsb_pro_zeile*15,att[att_fsb_n]);
- zeiger:=eintrag(oben);
- nr:=0;
- while (nr<fsb_eintr) and (zeiger<>nil) do begin
- wr(fsb_y+(nr div fsb_pro_zeile),fsb_x+(nr mod fsb_pro_zeile)*15,
- att[att_fsb_n],zeiger^.name);
- zeiger:=zeiger^.nachfolger;
- inc(nr);
- end;
- end; (* darstellen *)
-
- begin (* ausschnitt *)
- if (wahl<oben) then begin
- oben:=(wahl div fsb_pro_zeile)*fsb_pro_zeile;
- darstellen;
- end else
- if (wahl>=oben+fsb_eintr) then begin
- oben:=((wahl div fsb_pro_zeile)*fsb_pro_zeile)-fsb_eintr+fsb_pro_zeile;
- darstellen;
- end;
- x:=fsb_x+(wahl mod fsb_pro_zeile)*15;
- y:=fsb_y+((wahl-oben) div fsb_pro_zeile);
- setattr(y,x,14,att[att_fsb_c]);
- end; (* ausschnitt *)
-
- procedure suchen(wonach: string2);
- var zeiger: eintrag_ptr;
- alt: integer;
- begin
- if startzeiger=nil then exit;
- alt:=wahl;
- zeiger:=eintrag(wahl);
- repeat
- inc(wahl);
- zeiger:=zeiger^.nachfolger;
- if zeiger=nil then begin
- zeiger:=startzeiger;
- wahl:=0
- end;
- until (wahl=alt) or
- (copy(zeiger^.name,1,length(wonach))=wonach)
- end; (* suchen *)
-
- procedure laufwerk;
- begin
- if diskfree(ord(taste))<>-1 then begin
- path:=chr(ord(taste)+64)+':';
- changed:=true
- end;
- end; (* laufwerk *)
-
- procedure gewaehlt;
- var zeiger: eintrag_ptr;
- begin
- zeiger:=eintrag(wahl);
- if zeiger^.name[1]='[' then
- path:=path+copy(zeiger^.name,2,length(zeiger^.name)-2)+'\'
- else begin
- fileselect:=fexpand(path+zeiger^.name);
- fertig:=true
- end;
- end; (* gewaehlt *)
-
- begin (* auswaehlen *)
- changed:=false;
- wahl:=0;
- oben:=1;
- repeat
- if eintraege_vorh then ausschnitt;
- lies (control,taste,true);
- if eintraege_vorh then setattr(y,x,14,att[att_fsb_n]);
- case control of
- auf: dec(wahl,fsb_pro_zeile);
- ab: inc(wahl,fsb_pro_zeile);
- li: dec(wahl);
- re: inc(wahl);
- pos1: wahl:=0;
- end_: wahl:=eintraege;
- key: case taste of
- 'a'..'z': suchen(chr(ord(taste)-32));
- 'A'..'Z': suchen('['+taste);
- '.',':': suchen('[.');
- #1..#10: laufwerk;
- end;
- end;
- if wahl<0 then wahl:=0;
- if wahl>=eintraege then wahl:=eintraege-1;
- until changed or (taste in [#27,#13]);
- if taste=#27 then abbruch:=true
- else if not changed then gewaehlt
- end; (* auswaehlen *)
-
- procedure liste_loeschen;
- var zeiger: eintrag_ptr;
- begin
- zeiger:=startzeiger;
- while zeiger<>nil do begin
- dispose(zeiger); zeiger:=zeiger^.nachfolger;
- end;
- startzeiger:=nil;
- end; (* liste_loeschen *)
-
- begin (* fileselect *)
- new(rettscreen,sichern);
- fileselect:=''; fertig:=false; abbruch:=false;
- repeat
- path:=fexpand(path); startzeiger:=nil;
- box(all_single_box,fsb_x-2,fsb_y-4,succ(fsb_pro_zeile*15),fsb_zeilen+3,
- att[att_fsb_r],att[att_fsb_n]);
- box(all_single_box,fsb_x-2,fsb_y-4,succ(fsb_pro_zeile*15),2,
- att[att_fsb_r],att[att_fsb_n]);
- wr(fsb_y-1,fsb_x-2,att[att_fsb_r],'├');
- wr(fsb_y-1,fsb_x+fsb_pro_zeile*15,att[att_fsb_r],'┤');
- wr(fsb_y-3,fsb_x,att[att_fsb_n],'Pfad: '+path+wildcard);
- wrm(fsb_y-2,fsb_x+((fsb_pro_zeile*15) div 2),att[att_fsb_n],
- 'CTRL + Laufwerksbuchstabe: Laufwerk ändern');
- eintraege_lesen;
- auswaehlen;
- liste_loeschen;
- until fertig or abbruch;
- dispose(rettscreen,wiederherstellen);
- end; (* fileselect *)
-
-
- function Ja: boolean;
- var Taste: char;
- begin
- repeat
- Taste := Uppercase(ReadKey);
- if Taste = #0 then begin
- taste:=readkey;
- taste:=#0;
- end;
- until Taste in ['J','N'];
- ja:=taste='J'
- end;
-
-
- function Numerus(Zahl: longint; Einzahl, Endung: MaxString): MaxString;
- begin
- if Zahl=1 then
- Numerus:=Strg(Zahl)+' '+Einzahl
- else
- if zahl=0 then
- numerus:='Keine '+einzahl+endung
- else
- Numerus:=Strg(Zahl)+' '+Einzahl+Endung
- end;
-
-
- function SgPl(Zahl: longint; Einzahl, Mehrzahl: MaxString): MaxString;
- begin
- if Zahl=1 then
- SgPl:=Strg(Zahl)+' '+Einzahl
- else
- if zahl=0 then
- sgpl:='Keine '+mehrzahl
- else
- SgPl := Strg(Zahl) + ' ' + Mehrzahl
- end;
-
-
- function clog(von: real): real;
- begin
- clog:=ln(von)/ln(10);
- end;
-
-
- function readkey: char;
- var taste: char;
- begin
- if nextchar<>#0
- then begin
- readkey:=nextchar;
- nextchar:=#0;
- end
- else begin
- repeat
- taste:=crt.readkey; rebuild:=false;
- if taste=#0
- then begin
- taste:=crt.readkey;
- if taste=hotkey
- then if specialfunx
- then begin
- readkey:=#0; nextchar:=rebuild_key; rebuild:=true;
- end else taste:=#0
- else begin
- nextchar:=taste; readkey:=#0
- end;
- end
- else readkey:=taste
- until taste<>#0
- end;
- end;
-
-
- begin
- parameter_auswerten;
- grafik_init;
- setcbreak(false); checkbreak:=false;
- randomize; assign(i,'KAISER.NAM');
- savepath:=''; nextchar:=#0; spec_funx_aktiv:=false;
- load_config;
- end.