PROGRAM DmMap;
USES graph,raton,crt;
CONST
     maxhelps=50;

TYPE
    tayuda=RECORD
                x,y:word;
                ntxt,itxt:word
          END;
VAR
   cabecera:RECORD
                  ancho:word;
                  alto:word;
                  nose1:word;
                  nose2:word;
                  dibus:ARRAY[1..13] OF char
            END;

   helptxt: ARRAY[1..500] OF ^string;
   ptxt:word;

   nhelps:word;

   cuerpo:ARRAY[0..34,0..34] OF byte;

   ayuda:ARRAY[1..maxhelps] OF tayuda;

   f:file;

   simbolo:ARRAY [0..74] OF pointer;

   nombre:string;

   i:byte;

   x,y,b:integer;
   mapx,mapy:byte;
   tmp:integer;

   s:string;

PROCEDURE graficos;
VAR
  GraphDriver, GraphMode: Integer;
BEGIN
     GraphDriver:=VGA;
     GraphMode:=VGAHi;
     InitGraph(GraphDriver,GraphMode,'');
     IF GraphResult <> grOk THEN Halt(1);
     SettextStyle(DefaultFont,Horizdir,1);
     Textcolor(1);
     setfillstyle(solidfill,0)
END;

PROCEDURE texto;
BEGIN
     closegraph
END;

FUNCTION getc:char;
VAR
   c:char;
BEGIN
     blockread(f,c,1);
     getc:=c
END;

PROCEDURE leecstr (n:word);
VAR
   c:char;
BEGIN
     s:='';
     c:=getc;
     ayuda[n].itxt:=ptxt;
     ayuda[n].ntxt:=0;
     WHILE c<>#$ff DO
     BEGIN
          IF c=#0
             THEN BEGIN
                       getmem(helptxt[ptxt],length(s)+1);
                       helptxt[ptxt]^:=s;
                       inc(ptxt);
                       inc(ayuda[n].ntxt);
                       s:=''
                  END
             ELSE IF length(s)<255 THEN s:=s+c;
          c:=getc
     END
END;


PROCEDURE leemapa(VAR nombre:string);
VAR
   i,j,b:byte;
   leidos:word;
   tmp:word;

BEGIN
     assign(f,nombre);
     reset(f,1);
     blockread(f,cabecera,sizeof(cabecera));
     WITH cabecera DO
     BEGIN
          ancho:=swap(ancho);
          alto:=swap(alto);
          nose1:=swap(nose1);
          nose2:=swap(nose2)
     END;

      { Lee el mapa }

     FOR i:=0 TO cabecera.alto-1 DO
         FOR j:=0 TO cabecera.ancho-1 DO
         BEGIN
              blockread(f,b,1);
              cuerpo[i,j]:=b
         END;


     { Lee las ayudas }
     blockread(f,i,1);
     blockread(f,i,1);

     nhelps:=0;
     blockread(f,tmp,2,leidos);
     WHILE leidos>0 DO
     BEGIN
          IF nhelps<maxhelps
             THEN nhelps:=nhelps+1
             ELSE BEGIN
                       writeln('Ayuda perdida');
                       readln
                  END;
          WITH ayuda[nhelps] DO
          BEGIN
               x:=swap(tmp);
               blockread(f,y,2);
               y:=swap(y);
               leecstr(nhelps)
          END;
          blockread(f,tmp,2,leidos)
     END;
     close(f)
END;


PROCEDURE leesimbolos;
VAR
   tamano:word;
   i:byte;
   color:RECORD
               r,g,b:byte
         END;
BEGIN
     assign(f,'DIBUJOS.DAT');
     reset(f,1);
     FOR i:=0 TO 15 DO
     BEGIN
          setpalette(i,i);
          blockread(f,color,3);
          WITH color DO
               setrgbpalette(i,r,g,b)
     END;
     tamano:=imagesize(0,0,15,12);
     FOR i:=0 TO 74 DO
     BEGIN
          getmem(simbolo[i],tamano);
          blockread(f,simbolo[i]^,tamano)
     END;
     close(f)
END;

PROCEDURE liberasimbolos;
VAR
   i:byte;
   tamano:word;
BEGIN
     tamano:=imagesize(0,0,15,12);
     FOR i:=0 TO 74 DO
         freemem(simbolo[i],tamano)
END;

PROCEDURE muestramapa;
VAR
   i,j:byte;
BEGIN
     FOR i:=0 TO cabecera.alto-1 DO
         FOR j:=0 TO cabecera.ancho-1 DO
             putimage(j*16,i*13,simbolo[cuerpo[i,j] AND $7f]^,NormalPut)
END;

PROCEDURE muestrayuda(x,y:byte);
VAR
   i,j,l:byte;
BEGIN
     i:=0;
     REPEAT
           inc(i)
     UNTIL ((ayuda[i].x=x) AND (ayuda[i].y=y)) OR (i>nhelps);
     IF i<=nhelps
        THEN BEGIN
                  ocultar_raton;
                  putimage(mapx*16,mapy*13,simbolo[0]^,NormalPut);
                  l:=0;
                  setcolor(0);
                  bar(0,459,639,479);
                  setcolor(2);
                  WITH ayuda[i] DO
                       FOR j:=0 TO ntxt-1 DO
                       BEGIN
                            IF l=2
                               THEN BEGIN
                                         l:=0;
                                         REPEAT
                                               obtener_estado_raton(tmp,tmp,b)
                                         UNTIL b=0;
                                         REPEAT
                                               obtener_estado_raton(tmp,tmp,b)
                                         UNTIL b<>0;
                                         setcolor(0);
                                         bar(0,459,639,479);
                                         setcolor(2)
                                    END;
                            outtextxy(0,459+10*l,helptxt[itxt+j]^);
                            l:=l+1
                       END;
                  REPEAT
                        obtener_estado_raton(tmp,tmp,b)
                  UNTIL b=0;
                  putimage(mapx*16,mapy*13,simbolo[cuerpo[mapy,mapx] AND $7f]^,NormalPut);
                  mostrar_raton
             END
END;

PROCEDURE iluminayuda;
VAR
   i:byte;
BEGIN
     ocultar_raton;
     FOR i:=1 TO nhelps DO
     WITH ayuda[i] DO
          putimage(x*16,y*13,simbolo[0]^,NormalPut);
     REPEAT
           obtener_estado_raton(x,y,b)
     UNTIL b=0;
     FOR i:=1 TO nhelps DO
     WITH ayuda[i] DO
          putimage(x*16,y*13,simbolo[cuerpo[y,x] AND $7f]^,NormalPut);
     mostrar_raton
END;

PROCEDURE inicializa;
BEGIN
     ptxt:=1
END;

PROCEDURE finaliza;
VAR
   i:byte;
   tamano:word;
BEGIN
     tamano:=imagesize(0,0,15,12);
     FOR i:=0 TO 74 DO
         freemem(simbolo[i],tamano);
     FOR i:=1 TO ptxt-1 DO
         freemem(helptxt[i],length(helptxt[i]^)+1)
END;



BEGIN
     IF paramcount=0
        THEN BEGIN
                  writeln('Ulilice DMMAP n, siendo n el n£mero del nivel a visualizar.');
                  halt(2)
             END;
     inicializa;
     nombre:='DMAP'+paramstr(1)+'.MAP';
     leemapa(nombre);
     graficos;
     leesimbolos;

     muestramapa;
     inicializar_raton;
     mostrar_raton;
     REPEAT
           REPEAT
                 obtener_estado_raton(x,y,b)
           UNTIL (b<>0) OR keypressed;

           IF (b AND 2)<>0
              THEN iluminayuda
              ELSE IF b<>0
                      THEN BEGIN
                                mapx:=x DIV 16;
                                mapy:=y DIV 13;
                                IF (mapx<cabecera.ancho) AND (mapy<cabecera.alto)
                                   THEN muestrayuda(mapx,mapy)
                           END
     UNTIL keypressed AND (readkey=#27);

     finaliza;
     texto
END.
