{ ------------------------ SOKOGRAF.INC --------------------------- Include-File fuer Grafikbefehle auf dem JOYCE unter Turbo Pascal fuer das Spiel SOKOBAN Hauptmodul, enthaelt MCode und elementare Routinen. Muss auf alle Faelle ins Hauptprogramm eingebinden werden. Es sind enthalten: procedure GraphInit -> Initialisierung des MCode procedure Plot(x,y,m) -> Pixel set/reset/invert procedure ShowCursor -> Cursor ein procedure HideCursor -> Cursor aus procedure CLRGRAF -> Grafikschirm loeschen Variablen & Prozeduren mit dem Namen GX_ sind zu vermeiden, um nicht mit Interna der Grafikerweiterungen zu kollidieren... Zum Compilieren die Endadresse auf $F3FF setzen, um nicht den MCode zu ueberschreiben!!! --------------------------------------------------------------------- } type {!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!} GX_MCode = array[0..102] of byte; {Anpassen an Assembler Code} {!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!} GX_String = string[8]; Strg_14 = string[14]; Strg_90 = string[90]; var GX_MProg : GX_MCode absolute $F400; const ESC = #$1b; GX_Data : GX_MCode = ( {0000} $ED,$5B,$10,$F4,$2A,$12,$F4,$01,$14,$F4,$CD,$5A,$FC,$E9,$00,$C9, {0010} $00,$00,$00,$00,$3E,$03,$A2,$57,$E5,$26,$00,$29,$01,$00,$B6,$09, {0020} $4E,$23,$46,$79,$E6,$F8,$6F,$60,$29,$19,$7D,$E6,$F8,$6F,$79,$E6, {0030} $07,$B5,$6F,$7B,$E6,$07,$3C,$47,$AF,$37,$1F,$10,$FD,$C1,$4F,$78, {0040} $FE,$00,$20,$04,$79,$B6,$77,$C9,$FE,$01,$C0,$79,$2F,$A6,$77,$C9, {0050} $01,$59,$F4,$CD,$5A,$FC,$E9,$00,$C9,$21,$30,$59,$36,$00,$11,$31, {0060} $59,$01,$FF,$59,$ED,$B0,$C9 ); procedure GX_Dot; external $F400; procedure GX_Clr; external $F450; procedure GraphInit; Begin GX_MProg:=GX_Data; End; procedure Plot(x:integer; y,m:byte); var GX_X : integer absolute $F410; GX_Y : byte absolute $F412; GX_M : byte absolute $F413; Begin GX_X:=x; GX_Y:=y; GX_M:=m; GX_Dot; End; procedure HideCursor; Begin write(ESC,'f'); End; procedure ShowCursor; Begin write(ESC,'e'); End; procedure CLRGRAF; Begin GX_Clr; clrscr; End; (************************************************************************) (* *) (* Grafikbibliotheksmodul fuer Joyce *) (* *) (* Prozeduren: *) (* line (x1, y1, x2, y2 : INTEGER; modus : BYTE); *) (* ellipse (x_center, y_center, radius_x, radius_y : INTEGER; *) (* modus : BYTE); *) (* circle (x_center, y_center, radius: INTEGER; modus : BYTE); *) (* *) (************************************************************************) (* Grafikkonstanten f}r JOYCE *) const aspect_ratio = 0.45; procedure line(x1,y1,x2,y2:integer;modus:byte); (* zieht Linie zwischen den Punkten x1/y1 und x2/y2 im entsprechenden Modus *) var x,dx,dy, diff,i1 : integer; y,z : byte; Begin z:=1; dx:=abs(x1-x2); dy:=abs(y1-y2); if (x1y2) then z:=-1; end else begin x:=x2; y:=y2; if (y2>y1) then z:=-1; end; plot(x,y,modus); if ((dx+dy)=0) then exit; if (dx>dy) then begin if (dy=0) then (* Horizontale Linie *) for i1:=1 to dx do begin x:=succ(x); plot(x,y,modus); end else (* Steigung < 1 *) begin diff:=dx shr 1; for i1:=1 to dx do begin diff:=diff+dy; if (diff>=dx) then begin diff:=diff-dx; y:=y+z; end; x:=succ(x); plot(x,y,modus); end; end; end else begin if (dx=0) then (* Vertikale Linie *) for i1:=1 to dy do begin y:=y+z; plot(x,y,modus); end else (* Steigung >=1 *) begin diff:= dy shr 1; for i1:=1 to dy do begin diff:=diff+dx; if (diff>=dy) then begin diff:=diff-dy; x:=succ(x); end; y:=y+z; plot(x,y,modus); end; end; end; End; { ORIGINAL ======== procedure ellipse(x_center,y_center,radius_x,radius_y:integer;modus:byte); (* Ellipse mit Mittelpunkt und x- bzw. y-Halbachse im entsprechenden Modus mit Hilfe der Konstanten aspect_ratio wird das Achsenverhaeltnis gewahrt Achsen parallel zu den Bildschirmachsen *) var Diff,AspRX,AspRY, x,y : integer; ax_ratio : real; Begin x:=0; y:=radius_x; Diff:=pred(radius_x); ax_ratio:=aspect_ratio*radius_y/radius_x; repeat if (Diff<0) then begin y:=pred(y); Diff:=Diff+y+y; end; AspRX:=round(ax_ratio*x); AspRY:=round(ax_ratio*y); plot(x_center+x,y_center+AspRY,modus); plot(x_center-x,y_center+AspRY,modus); plot(x_center+x,y_center-AspRY,modus); plot(x_center-x,y_center-AspRY,modus); plot(x_center+y,y_center+AspRX,modus); plot(x_center-y,y_center+AspRX,modus); plot(x_center+y,y_center-AspRX,modus); plot(x_center-y,y_center-AspRX,modus); Diff:=Diff-x-x-1; x:=succ(x); until (x>y); plot(x_center+x,y_center+AspRY,modus); End; } procedure circle(x_center,y_center,radius: integer; modus : byte); (* Kreis mit Mittelpunkt und Radius fuer das Spiel taucht grundsaetzlich der Aufruf mit Radius=3 auf. Deshalb laesst sich dieser Kreis mit 12 Pixeln darstellen, die aus der Originalroutine vorab erstellt wurden *) Begin { ORIGINAL ======== ellipse(x_center,y_center,radius,radius,modus); } { OPTIMIERT ======== } plot(x_center, y_center+1,modus); plot(x_center+1,y_center+1,modus); plot(x_center+2,y_center+1,modus); plot(x_center+3,y_center, modus); plot(x_center+2,y_center-1,modus); plot(x_center+1,y_center-1,modus); plot(x_center ,y_center-1,modus); plot(x_center-1,y_center-1,modus); plot(x_center-2,y_center-1,modus); plot(x_center-3,y_center, modus); plot(x_center-2,y_center+1,modus); plot(x_center-1,y_center+1,modus); End;