maps..

I'm making up a game that uses a map, which I did just fine. (I've been
programming for 3 years in Pascal, started with Turbo Pascal for Windows
back in 11th grade, now I just have the DOS version, and I'm
experiementing with the graph unit stuff). Well, I made the map and all,
next thing I need to do is wrap-around, which I think I know how to do..
But first, I need to tackle a bug and a problem.. First, I have this
"ghost icon" bug where there's just *ONE* coordinate on the WHOLE map that
is "invisible" to the program. (note: this is just a small scale map, I'm
going to make a 250x250 icon size map, with 26x19 screen size) Anyway,
I'm including the files here. (Can't seem to attach them right.)

(BTW, I'll explain the rest at the bottom.. Sorry for the incovience.. :)
)

MAP.PAS:

{ $A+,B-,D+,E+,F-,I+,L+,N-,O-,R-,S+,V-}
{ $M 65520,0,655360}
uses dos,crt,graph,graph3;

type Map_Record = record
     ch : array[1..26] of byte;
end;

Map_Rec = array[1..19] of Map_Record;

type Temp_Record = record
     x : array[1..3] of byte;
end;

Temp_Rec = array[1..3] of Temp_Record;

var
   Line : Map_Rec;
   LTemp : Temp_Rec;
   Temp : Char;
   num  : byte;
   f : text;
   i,j : integer;

Procedure CheckArray;

var
   i,j : integer;

begin
     for i := 1 to 19 do
         begin
              for j := 1 to 26 do
                  begin
                       write(Line[i].ch[j],' ');
                  end;
              writeln;
         end;
     readkey;
end;

Procedure Grass(x,y,row : integer); {1}

begin
       SetColor(2);
       OutTextxy(x,y+row,'210');
       y := (y + 8);
       OutTextxy(x,y+row,'121');
       y := (y + 8);
       OutTextxy(x,y+row,'021');
end;

Procedure Plains(x,y,row : integer); {2}

begin
       SetColor(10);
       OutTextxy(x,y+row,'110');
       y := (y + 8);
       OutTextxy(x,y+row,'101');
       y := (y + 8);
       OutTextxy(x,y+row,'011');
end;

Procedure Hills(x,y,row : integer); {3}

begin
       SetColor(14);
       OutTextxy(x,y+row,'^^^');
       y := (y + 8);
       OutTextxy(x,y+row,'^^^');
       y := (y + 8);
       OutTextxy(x,y+row,'^^^');
end;

Procedure Mountains(x,y,row : integer); {4}

begin
       SetColor(6);
       OutTextxy(x,y+row,'^^^');
       y := (y + 8);
       OutTextxy(x,y+row,'^^^');
       y := (y + 8);
       OutTextxy(x,y+row,'^^^');
end;

Procedure Forest(x,y,row : integer); {5}

begin
       SetColor(2);
       OutTextxy(x,y+row,'');
       y := (y + 8);
       SetColor(3);
       OutTextxy(x,y+row,'');
       y := (y + 8);
       SetColor(2);
       OutTextxy(x,y+row,'');
end;

Procedure Shallows(x,y,row : integer); {6}

begin
       SetColor(9);
       OutTextxy(x,y+row,'0xy');
       y := (y + 8);
       OutTextxy(x,y+row,'y01');
       y := (y + 8);
       OutTextxy(x,y+row,'x0x');
end;

Procedure River(x,y,row : integer); {7}

begin
     SetColor(11);
     OutTextxy(x,y+row,'101');
     y := (y + 8);
     OutTextxy(x,y+row,'110');
     y := (y + 8);
     OutTextxy(x,y+row,'211');
     y := (y + 8);
end;

Procedure Desert(x,y,row : integer); {8}

begin
     SetColor(14);
     OutTextxy(x,y+row,'111');
     y := (y + 8);
     OutTextxy(x,y+row,'111');
     y := (y + 8);
     OutTextxy(x,y+row,'111');
     y := (y + 8);
end;

Procedure Ocean(x,y,row : integer); {9}

begin
       SetColor(1);
       OutTextxy(x,y+row,'212');
       y := (y + 8);
       OutTextxy(x,y+row,'102');
       y := (y + 8);
       OutTextxy(x,y+row,'211');
end;

Procedure City(x,y,row : integer); {10}

begin
       SetColor(15);
       OutTextxy(x,y+row,'ZD?');
       y := (y + 8);
       OutTextxy(x,y+row,'3C3');
       y := (y + 8);
       OutTextxy(x,y+row,'@DY');
end;

Procedure Map_Make;
var
  Driver, Mode: Integer;
  DriverF: file;
  DriverP: Pointer;
 Y0, Y1, Y2, X1, X2: Integer;
 x,y,icon,row,StartX,StartY,EndX,EndY : integer;
 g1,g2,g3,g4 : integer;
 t1,t2,t3,t4,temp : string;
 ch : char;

begin
  { Open driver file, read into memory, register it }
  Assign(DriverF, 'c:\pascal\bgi\EGAVGA.BGI');
  Reset(DriverF, 1);
  GetMem(DriverP, FileSize(DriverF));
  BlockRead(DriverF, DriverP^, FileSize(DriverF));
  if RegisterBGIdriver(DriverP) < 0 then
  begin
    Writeln('Error registering driver: ',
      GraphErrorMsg(GraphResult));
    Halt(1);
  end;
  { Init graphics }
  Driver := VGA;
  Mode := VGAHi;
  InitGraph(Driver, Mode, '');
  if GraphResult < 0
     then
         begin
              writeln('Could not load VGA Driver!');
              Halt(1);
         end;

     i := 1;
     j := 1;
     x := 0;
     y := 10; {adjust y to center window}
     row := 1; { 25 rows allowed on screen }
     icon := 0;
     StartX := 1;
     Starty := 1;
     EndX := StartX + 2;
     EndY := Starty + 2;
     assign(f,'test.dat');
     reset(f);
     while not eof(f) do
     begin
                read(f,num);
                Line[i].ch[j] := num;
                inc(j);
                if (j > 25)
                   then
                       begin
                            j := 0;
                            inc(i);
                       end;
     end;
     close(f);
            { Map is in a 25x19 (x,y) square }
            { Center is on 13,10) }
            { Lower X from center, [(13 * 2) - 1] }
            { Lower Y from center, [(10 * 2) - 1] }

     i := 0;
     j := 0;
     ch := #0;

     while NOT (ch = #27) do
     begin
          for i := StartY to EndY do
              begin
                   setcolor(15);
                   str(i,temp);
                   outtext('Line '+temp+': ');
                   for j := StartX to EndX do
                       begin
                            num := Line[i].ch[j];
                            LTemp[i].x[j] := num;
                           { str(Line[i].ch[j],temp);
                            outtext(temp);  }
                            str(LTemp[i].x[j],temp);
                            setcolor(10);
                            outtext(temp+' ');

                            case num of

                                 1 :
                                   begin
                                        Grass(x,y,row);
                                        x := x + 24;
                                   end;

                                 2 :
                                   begin
                                        Plains(x,y,row);
                                        x := x + 24;
                                   end;

                                 3 :
                                   begin
                                        Hills(x,y,row);
                                        x := x + 24;
                                   end;

                                 4 :
                                   begin
                                        Mountains(x,y,row);
                                        x := x + 24;
                                   end;

                                 5 :
                                   begin
                                        Forest(x,y,row);
                                        x := x + 24;
                                   end;

                                 6 :
                                   begin
                                        Shallows(x,y,row);
                                        x := x + 24;
                                   end;

                                 7 :
                                   begin
                                        River(x,y,row);
                                        x := x + 24;
                                   end;

                                 8 :
                                   begin
                                        Desert(x,y,row);
                                        x := x + 24;
                                   end;

                                 9 :
                                   begin
                                        Ocean(x,y,row);
                                        x := x + 24;
                                   end;

                                 10:
                                    begin
                                         City(x,y,row);
                                         x := x + 24;
                                    end;

                            end; {case end}

                            inc(icon);

                            if (icon > 2)
                               then
                                   begin
                                        icon := 0;
                                        row := row + 24;
                                        x := 0;
                                   end;
                       end;{StartX to EndX end}
              end;{StartY to EndY end}
                       { "Ghost icon" at (3,5) }
                       { End coords are (6,4) }
                 if LTemp[i-1].x[j-1] = 1
                    then
                        begin
                             setcolor(5);
                             outtext('Found the icon!');
                             str(j,temp);
                             outtext(' x is : '+temp+' ');
                             str(i,temp);
                             outtext(' y is : '+temp+' ');

                        end;
                   repeat
                         ch := readkey;
                   until ch in [#72,#75,#77,#80,#27];

              case ch of
                   #72: begin
                            Dec(StartY);     {Up Arrow}
                            Dec(EndY);
                       end;

                   #75: begin
                            Dec(StartX);     {Left Arrow}
                            Dec(EndX);
                       end;

                   #77: begin
                            Inc(StartX);     {Right arrow}
                            Inc(EndX);
                       end;

                   #80: begin
                            Inc(StartY);     {Down Arrow}
                            Inc(EndY);
                       end;
              end;

                if EndX > 26
                   then
                       begin
                            StartX := 24;
                            EndX := 26;
                       end;

                if EndY > 19
                   then
                       begin
                            StartY := 17;
                            EndY := 19;
                       end;

                if StartX < 1
                   then
                       begin
                            StartX := 1;
                            EndX := 3;
                       end;

                if StartY < 1
                   then
                       begin
                            StartY := 1;
                            EndY := 3;
                       end;
          row := 0;

          ClearViewPort;
     end; {while loop end}

     CloseGraph;
     CheckArray;
end;

begin
     Map_Make;
end.

And here's test.dat (I temporarily made this one so I could home in on the
problem.

8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
8 8 8 6 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
8 8 8 5 3 9 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
8 8 8 4 2 1 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
8 8 8 8 9 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
8 8 8 8 8 1 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8

---

ok, the main problem is that when the "center" is over coordinate (5,3),
it'll read it as (6,4), but the rest work fine. (I'll send another "map"
later on in this (long) message... (like, maybe right now! <G>)

1 1 1 2 2 2 7 8 9 1 1 2 3 4 5 6 7 8 9 3 1 2 3 4 5 7
5 5 8 8 8 8 8 8 1 1 5 5 2 2 2 2 2 2 2 2 2 2 2 2 2 2
8 8 8 2 5 2 8 8 2 5 5 5 5 5 2 2 2 2 2 2 2 2 2 2 2 2
4 4 8 8 8 8 8 8 8 9 5 5 5 9 9 2 2 2 5 5 5 2 5 5 9 9
9 9 8 8 8 8 8 2 9 9 9 9 9 9 9 9 9 9 2 9 9 9 9 9 2 9
9 9 9 9 2 2 2 9 9 9 9 9 9 9 9 9 2 9 9 9 2 9 2 9 9 9
9 9 2 2 2 2 2 2 2 9 9 9 9 2 2 9 2 2 2 9 2 9 9 2 2 2
2 2 2 2 2 2 2 8 2 2 2 2 9 2 2 2 2 2 2 9 2 2 2 2 2 2
2 2 2 2 2 5 5 2 5 1 5 5 5 2 2 5 2 2 2 5 5 2 2 5 5 2
4 4 4 4 3 2 2 2 2 5 5 5 2 2 2 2 2 2 2 2 2 2 2 2 2 2
3 3 3 3 3 3 2 2 2 1 5 5 2 2 2 2 9 9 5 6 2 2 2 2 2 2
2 3 3 3 2 2 2 2 2 5 5 5 5 5 2 2 2 2 2 2 2 2 2 2 2 2
9 9 9 9 9 7 7 7 7 9 5 5 5 9 9 2 2 2 5 5 5 2 5 5 9 9
7 7 7 7 7 7 2 2 7 9 9 9 9 9 9 9 9 9 2 9 9 9 9 9 2 9
9 9 6 6 2 2 2 9 7 7 7 7 7 7 7 9 2 9 9 9 2 9 2 9 9 9
9 9 2 2 2 2 2 2 2 9 9 9 9 2 2 9 2 2 2 9 2 9 9 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 9 2 2 2 2 2 2 9 2 2 2 2 2 2
2 2 2 2 2 5 5 2 5 1 5 5 5 2 2 5 2 2 2 5 5 2 2 5 5 2
2 2 2 2 8 8 8 8 2 5 5 5 2 2 2 2 2 2 2 2 2 2 5 5 5 5

Another problem I have is "smooth scrolling" (as I call it). Without the
ClearViewPort, it just overwrites, but I want it to clear the "box" and
paint the new window over it.. (I don't know asembly BTW). Another thing,
How do you include a BGI file into your program so you don't have to have
the .BGI "trail along" with your exe?) (I want them inside, not outside..
) :)

I've seen other source codes where it has nice graphical tiles (icons) and
scrolling, however, they used AutoDesk, and I don't have that software
yet... (I still have a lot of other "icons" to put in the program, for
coastlines etc. but, I'm waiting to get these problems fixed first..)..