home *** CD-ROM | disk | FTP | other *** search
/ Dominator / DOMINATOR.ISO / dos / utils / wolf3d-f / mapedit.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1992-06-05  |  24.7 KB  |  930 lines

  1. {$A+,B-,D-,E-,F-,G-,I+,L-,N-,O-,R-,S-,V+,X-}
  2. {$M 16384,0,655360}
  3. program mapedit;
  4.  
  5. uses crt,graph,mouse;
  6.  
  7. const MAP_X = 5;
  8.       MAP_Y = 5;
  9.       TEXTLOC = 460;
  10.  
  11. type level_type = record
  12.        map_size,
  13.        object_size,
  14.        end_size        : word;
  15.        width,
  16.        height          : word;
  17.        name            : array[0..15] of byte;
  18.        map_data,
  19.        object_data,
  20.        end_data        : pointer;
  21.      end;
  22.  
  23.      grid = array[0..63,0..63] of word;
  24.  
  25.      filltype = (solid,check);
  26.      doortype = (horiz,vert);
  27.  
  28.  
  29. var levelmap,
  30.     objectmap    : grid;
  31.     levels       : array[1..10] of level_type;
  32.  
  33.     show_objects,
  34.     show_floor   : boolean;
  35.  
  36.     mapgraph,
  37.     objgraph     : array[0..255] of string[4];
  38.     mapnames,
  39.     objnames     : array[0..255] of string[20];
  40.  
  41.     themouse  : resetrec;
  42.     mouseloc  : locrec;
  43.  
  44. procedure waitforkey;
  45. var key: char;
  46. begin
  47.   repeat until keypressed;
  48.   key:= readkey;
  49.   if key=#0 then key:= readkey;
  50. end;
  51.  
  52. procedure getkey(var key: char; var control: boolean);
  53. begin
  54.   control:= false;
  55.   key:= readkey;
  56.   if key=#0 then
  57.     begin
  58.       control:= true;
  59.       key:= readkey;
  60.     end;
  61. end;
  62.  
  63. procedure decorate(x,y,c: integer);
  64. var i,j: integer;
  65. begin
  66.   setfillstyle(1,c);
  67.   bar(x*7+MAP_X+2,y*7+MAP_Y+2,x*7+MAP_X+4,y*7+MAP_Y+4);
  68. end;
  69.  
  70. procedure box(fill: filltype; x,y,c1,c2: integer; dec: boolean);
  71. begin
  72.   if fill=solid then
  73.     setfillstyle(1,c1)
  74.   else
  75.     setfillstyle(9,c1);
  76.  
  77.   bar(x*7+MAP_X,y*7+MAP_Y,x*7+6+MAP_X,y*7+6+MAP_Y);
  78.   if dec then decorate(x,y,c2);
  79. end;
  80.  
  81. procedure outtext(x,y,color: integer; s: string);
  82. begin
  83.   setcolor(color);
  84.   outtextxy(x*7+MAP_X,y*7+MAP_Y,s);
  85. end;
  86.  
  87. function hex(x: word): string;
  88. const digit : string[16] = '0123456789ABCDEF';
  89. var temp : string[4];
  90.     i    : integer;
  91. begin
  92.   temp:= '    ';
  93.   for i:= 4 downto 1 do
  94.     begin
  95.       temp[i]:= digit[(x and $000f)+1];
  96.       x:= x div 16;
  97.     end;
  98.   hex:= temp;
  99. end;
  100.  
  101. procedure doline(x,y,x2,y2: integer);
  102. begin
  103.   line(x+MAP_X,y+MAP_Y,x2+MAP_X,y2+MAP_Y);
  104. end;
  105.  
  106. procedure dobar(x,y,x2,y2: integer);
  107. begin
  108.   bar(x+MAP_Y,y+MAP_Y,x2+MAP_X,y2+MAP_Y);
  109. end;
  110.  
  111. procedure circle(x,y,c1,c2: integer);
  112. const sprite : array[0..6,0..6] of byte =
  113.                    ((0,0,1,1,1,0,0),
  114.                     (0,1,1,1,1,1,0),
  115.                     (1,1,1,2,1,1,1),
  116.                     (1,1,2,2,2,1,1),
  117.                     (1,1,1,2,1,1,1),
  118.                     (0,1,1,1,1,1,0),
  119.                     (0,0,1,1,1,0,0));
  120. var i,j,c: integer;
  121. begin
  122.   for i:= 0 to 6 do
  123.     for j:= 0 to 6 do
  124.       begin
  125.         case sprite[i,j] of
  126.           0: c:=0;
  127.           1: c:=c1;
  128.           2: c:=c2;
  129.         end;
  130.         putpixel(x*7+MAP_X+i,y*7+MAP_Y+j,c);
  131.       end;
  132. end;
  133.  
  134. procedure door(dtype: doortype; x,y,color: integer);
  135. begin
  136.   case dtype of
  137.     vert: begin
  138.             setfillstyle(1,color);
  139.             dobar(x*7+2,y*7,x*7+4,y*7+6);
  140.           end;
  141.     horiz : begin
  142.               setfillstyle(1,color);
  143.               dobar(x*7,y*7+2,x*7+6,y*7+4);
  144.           end;
  145.   end;
  146. end;
  147.  
  148. function hexnibble(c: char): byte;
  149. begin
  150.   case c of
  151.     '0'..'9': hexnibble:= ord(c)-ord('0');
  152.     'a'..'f': hexnibble:= ord(c)-ord('a')+10;
  153.     'A'..'F': hexnibble:= ord(c)-ord('A')+10;
  154.     else hexnibble:= 0;
  155.   end;
  156. end;
  157.  
  158. procedure output(x,y: integer; data: string);
  159. var size  : integer;
  160.     temp  : string[4];
  161.     c1,c2 : byte;
  162. begin
  163.   if data<>'0000' then
  164.     begin
  165.       temp:= data;
  166.       c1:= hexnibble(temp[1]);
  167.       c2:= hexnibble(temp[2]);
  168.       case temp[3] of
  169.         '0': outtext(x,y,c1,temp[4]);
  170.         '1': box(solid,x,y,c1,c2,false);
  171.         '2': box(check,x,y,c1,c2,false);
  172.         '3': box(solid,x,y,c1,c2,true);
  173.         '4': box(check,x,y,c1,c2,true);
  174.         '5': circle(x,y,c1,c2);
  175.         '6': door(horiz,x,y,c1);
  176.         '7': door(vert,x,y,c1);
  177.         '8': begin
  178.                setfillstyle(1,c1);
  179.                dobar(x*7,y*7,x*7+6,y*7+3);
  180.                setfillstyle(1,c2);
  181.                dobar(x*7,y*7+4,x*7+6,y*7+6);
  182.               end;
  183.         '9': putpixel(x*7+MAP_X+3,y*7+MAP_Y+3,c1);
  184.         'a': begin setfillstyle(1,c1); dobar(x*7+2,y*7+1,x*7+4,y*7+5); end;
  185.         'b': begin setfillstyle(1,c1); dobar(x*7+2,y*7+2,x*7+4,y*7+4); end;
  186.         'c': begin setfillstyle(1,c1); dobar(x*7+1,y*7+1,x*7+5,y*7+5); end;
  187.         'd': begin
  188.                setcolor(c1);
  189.                doline(x*7+1,y*7+1,x*7+5,y*7+5);
  190.                doline(x*7+5,y*7+1,x*7+1,y*7+5);
  191.              end;
  192.         'e': begin
  193.                setcolor(c1);
  194.                rectangle(x*7+MAP_X,y*7+MAP_Y,x*7+MAP_X+6,y*7+MAP_Y+6);
  195.              end;
  196.         'f': case c2 of
  197.               2: begin {east}
  198.                    setcolor(c1);
  199.                    doline(x*7,y*7+3,x*7+6,y*7+3);
  200.                    doline(x*7+6,y*7+3,x*7+3,y*7);
  201.                    doline(x*7+6,y*7+3,x*7+3,y*7+6);
  202.                 end;
  203.               0: begin {north}
  204.                    setcolor(c1);
  205.                    doline(x*7+3,y*7+6,x*7+3,y*7);
  206.                    doline(x*7+3,y*7,x*7,y*7+3);
  207.                    doline(x*7+3,y*7,x*7+6,y*7+3);
  208.                  end;
  209.               6: begin {west}
  210.                    setcolor(c1);
  211.                    doline(x*7+6,y*7+3,x*7,y*7+3);
  212.                    doline(x*7,y*7+3,x*7+3,y*7);
  213.                    doline(x*7,y*7+3,x*7+3,y*7+6);
  214.                  end;
  215.               4: begin {south}
  216.                    setcolor(c1);
  217.                    doline(x*7+3,y*7,x*7+3,y*7+6);
  218.                    doline(x*7+3,y*7+6,x*7,y*7+3);
  219.                    doline(x*7+3,y*7+6,x*7+6,y*7+3);
  220.                  end;
  221.               1: begin {northeast}
  222.                    setcolor(c1);
  223.                    doline(x*7,y*7+6,x*7+6,y*7);
  224.                    doline(x*7+6,y*7,x*7+3,y*7);
  225.                    doline(x*7+6,y*7,x*7+6,y*7+3);
  226.                  end;
  227.               7: begin {northwest}
  228.                    setcolor(c1);
  229.                    doline(x*7+6,y*7+6,x*7,y*7);
  230.                    doline(x*7,y*7,x*7+3,y*7);
  231.                    doline(x*7,y*7,x*7,y*7+3);
  232.                  end;
  233.               3: begin {southeast}
  234.                    setcolor(c1);
  235.                    doline(x*7,y*7,x*7+6,y*7+6);
  236.                    doline(x*7+6,y*7+6,x*7+3,y*7+6);
  237.                    doline(x*7+6,y*7+6,x*7+6,y*7+3);
  238.                  end;
  239.               5: begin {southwest}
  240.                    setcolor(c1);
  241.                    doline(x*7+6,y*7,x*7,y*7+6);
  242.                    doline(x*7,y*7+6,x*7+3,y*7+6);
  243.                    doline(x*7,y*7+6,x*7,y*7+3);
  244.                  end;
  245.  
  246.              end;
  247.       end;
  248.     end;
  249. end;
  250.  
  251. procedure display_map;
  252. var i,j: integer;
  253. begin
  254.   j:= 63;
  255.   i:= 0;
  256.   repeat
  257.     setfillstyle(1,0);
  258.     dobar(i*7,j*7,i*7+6,j*7+6);
  259.     if show_floor then
  260.       output(i,j,mapgraph[levelmap[i,j]])
  261.     else
  262.       if not (levelmap[i,j] in [$6a..$8f]) then
  263.         output(i,j,mapgraph[levelmap[i,j]]);
  264.     if show_objects then
  265.       output(i,j,objgraph[objectmap[i,j]]);
  266.     inc(i);
  267.     if i=64 then
  268.       begin
  269.         i:= 0;
  270.         dec(j);
  271.       end;
  272.   until (j=-1) or keypressed;
  273. end;
  274.  
  275. procedure read_levels;
  276. var head,map : file;
  277.     s,o,
  278.     size     : word;
  279.     idsig    : string[4];
  280.     level    : integer;
  281.     levelptr : longint;
  282.     tempstr  : string[16];
  283.     map_pointer,
  284.     object_pointer,
  285.     end_pointer    : longint;
  286.  
  287. begin
  288.   idsig:= '    ';
  289.   tempstr:= '                ';
  290.   assign(head,'maphead.wl1');
  291.   {$I-}
  292.   reset(head,1);
  293.   {$I+}
  294.   if ioresult<>0 then
  295.     begin
  296.       writeln('error opening MAPHEAD.WL1');
  297.       halt(1);
  298.     end;
  299.   assign(map,'maptemp.wl1');
  300.   {$I-}
  301.   reset(map,1);
  302.   {$I+}
  303.   if ioresult<>0 then
  304.     begin
  305.       writeln('error opening MAPTEMP.WL1');
  306.       halt(1);
  307.     end;
  308.  
  309.   for level:= 1 to 10 do
  310.     begin
  311.       seek(head,2+(level-1)*4);
  312.       blockread(head,levelptr,4);
  313.       seek(map,levelptr);
  314.       with levels[level] do
  315.         begin
  316.           blockread(map,map_pointer,4);
  317.           blockread(map,object_pointer,4);
  318.           blockread(map,end_pointer,4);
  319.           blockread(map,map_size,2);
  320.           blockread(map,object_size,2);
  321.           blockread(map,end_size,2);
  322.           blockread(map,width,2);
  323.           blockread(map,height,2);
  324.           blockread(map,name,16);
  325.           getmem(map_data,map_size);
  326.           s:= seg(map_data^);
  327.           o:= ofs(map_data^);
  328.           blockread(map,mem[s:o],map_size);
  329.           getmem(object_data,object_size);
  330.           s:= seg(object_data^);
  331.           o:= ofs(object_data^);
  332.           blockread(map,mem[s:o],object_size);
  333.           getmem(end_data,end_size);
  334.           s:= seg(end_data^);
  335.           o:= ofs(end_data^);
  336.           blockread(map,mem[s:o],end_size);
  337.           blockread(map,idsig[1],4);
  338.         end;
  339.     end;
  340.   close(map);
  341.   close(head);
  342. end;
  343.  
  344. procedure write_levels;
  345. var head,map : file;
  346.     abcd,
  347.     s,o,
  348.     size     : word;
  349.     idsig    : string[4];
  350.     level    : integer;
  351.     levelptr : longint;
  352.     tempstr  : string[16];
  353.     map_pointer,
  354.     object_pointer,
  355.     end_pointer    : longint;
  356.  
  357. begin
  358.   abcd:= $abcd;
  359.   idsig:= '!ID!';
  360.   tempstr:= 'TED5v1.0';
  361.   assign(head,'maphead.wl1');
  362.   rewrite(head,1);
  363.   assign(map,'maptemp.wl1');
  364.   rewrite(map,1);
  365.  
  366.   blockwrite(head,abcd,2);
  367.   blockwrite(map,tempstr[1],8);
  368.   levelptr:= 8;
  369.  
  370.   for level:= 1 to 10 do
  371.     begin
  372.       blockwrite(head,levelptr,4);
  373.       with levels[level] do
  374.         begin
  375.           map_pointer:= levelptr+38;
  376.           object_pointer:= map_pointer+map_size;
  377.           end_pointer:= object_pointer+object_size;
  378.           levelptr:= end_pointer+end_size+4;
  379.           blockwrite(map,map_pointer,4);
  380.           blockwrite(map,object_pointer,4);
  381.           blockwrite(map,end_pointer,4);
  382.           blockwrite(map,map_size,2);
  383.           blockwrite(map,object_size,2);
  384.           blockwrite(map,end_size,2);
  385.           blockwrite(map,width,2);
  386.           blockwrite(map,height,2);
  387.           blockwrite(map,name,16);
  388.           s:= seg(map_data^);
  389.           o:= ofs(map_data^);
  390.           blockwrite(map,mem[s:o],map_size);
  391.           s:= seg(object_data^);
  392.           o:= ofs(object_data^);
  393.           blockwrite(map,mem[s:o],object_size);
  394.           s:= seg(end_data^);
  395.           o:= ofs(end_data^);
  396.           blockwrite(map,mem[s:o],end_size);
  397.           blockwrite(map,idsig[1],4);
  398.         end;
  399.     end;
  400.   close(map);
  401.   close(head);
  402. end;
  403.  
  404. procedure expand(p: pointer; var g: grid);
  405. var i,x,y : integer;
  406.     s,o,
  407.     data,
  408.     count : word;
  409. begin
  410.   x:= 0;
  411.   y:= 0;
  412.   s:= seg(p^);
  413.   o:= ofs(p^);
  414.   inc(o,2);
  415.   while (y<64) do
  416.     begin
  417.       move(mem[s:o],data,2); inc(o,2);
  418.       if data=$abcd then
  419.         begin
  420.           move(mem[s:o],count,2); inc(o,2);
  421.           move(mem[s:o],data,2); inc(o,2);
  422.           for i:= 1 to count do
  423.             begin
  424.               g[x,y]:= data;
  425.               inc(x);
  426.               if x=64 then
  427.                 begin
  428.                   x:= 0;
  429.                   inc(y);
  430.                 end;
  431.             end;
  432.         end
  433.       else
  434.         begin
  435.           g[x,y]:= data;
  436.           inc(x);
  437.           if x=64 then
  438.             begin
  439.               x:= 0;
  440.               inc(y);
  441.             end;
  442.         end;
  443.     end;
  444. end;
  445.  
  446. procedure compress(g: grid; var p: pointer; var size: word);
  447. var temp     : pointer;
  448.     abcd,
  449.     s,o,
  450.     olddata,
  451.     data,
  452.     nextdata,
  453.     count    : word;
  454.     x,y,i    : integer;
  455.  
  456. begin
  457.   abcd:= $abcd;
  458.   x:= 0;
  459.   y:= 0;
  460.   getmem(temp,8194);
  461.   s:= seg(temp^);
  462.   o:= ofs(temp^);
  463.   data:= $2000;
  464.   move(data,mem[s:o],2);
  465.  
  466.   size:= 2;
  467.   data:= g[0,0];
  468.   while (y<64) do
  469.     begin
  470.       count:= 1;
  471.       repeat
  472.         inc(x);
  473.         if x=64 then
  474.           begin
  475.             x:=0;
  476.             inc(y);
  477.           end;
  478.         if y<64 then
  479.           nextdata:= g[x,y];
  480.         inc(count);
  481.       until (nextdata<>data) or (y=64);
  482.       dec(count);
  483.       if count<3 then
  484.         begin
  485.           for i:= 1 to count do
  486.             begin
  487.               move(data,mem[s:o+size],2);
  488.               inc(size,2);
  489.             end;
  490.         end
  491.       else
  492.         begin
  493.           move(abcd,mem[s:o+size],2);
  494.           inc(size,2);
  495.           move(count,mem[s:o+size],2);
  496.           inc(size,2);
  497.           move(data,mem[s:o+size],2);
  498.           inc(size,2);
  499.         end;
  500.       data:= nextdata;
  501.     end;
  502.   getmem(p,size);
  503.   move(mem[seg(temp^):ofs(temp^)],mem[seg(p^):ofs(p^)],size);
  504.   freemem(temp,8194);
  505. end;
  506.  
  507. procedure clear_level(n: integer);
  508. var x,y: integer;
  509. begin
  510.    mhide;
  511.    for x:= 0 to 63 do
  512.      for y:= 0 to 63 do
  513.        begin
  514.          levelmap[x,y]:= $8c;
  515.          objectmap[x,y]:= 0;
  516.        end;
  517.    for x:= 0 to 63 do
  518.      begin
  519.        levelmap[x,0]:= 1;
  520.        levelmap[x,63]:= 1;
  521.        levelmap[0,x]:= 1;
  522.        levelmap[63,x]:= 1;
  523.      end;
  524.    display_map;
  525.    mshow;
  526. end;
  527.  
  528. function str_to_hex(s: string): word;
  529. var temp : word;
  530.     i    : integer;
  531. begin
  532.   temp:= 0;
  533.   for i:= 1 to length(s) do
  534.     begin
  535.       temp:= temp * 16;
  536.       case s[i] of
  537.         '0'..'9': temp:= temp + ord(s[i])-ord('0');
  538.         'a'..'f': temp:= temp + ord(s[i])-ord('a')+10;
  539.         'A'..'F': temp:= temp + ord(s[i])-ord('A')+10;
  540.       end;
  541.     end;
  542.   str_to_hex:= temp;
  543. end;
  544.  
  545. procedure showlegend(which,start,n: integer);
  546. var i,x,y: integer;
  547.     save: boolean;
  548. begin
  549.   mhide;
  550.   save:= show_objects;
  551.   show_objects:= true;
  552.   setfillstyle(1,0);
  553.   bar(64*7+MAP_X+13,5,639-5,380-30);
  554.   x:= 66;
  555.   y:= 0;
  556.   for i:= start to start+n-1 do
  557.     begin
  558.       if which=0 then
  559.         begin
  560.           output(x,y,mapgraph[i]);
  561.           outtext(x+2,y,15,mapnames[i]);
  562.         end
  563.       else
  564.         begin
  565.           output(x,y,objgraph[i]);
  566.           outtext(x+2,y,15,objnames[i]);
  567.         end;
  568.       inc(y,2);
  569.     end;
  570.   show_objects:= save;
  571.   mshow;
  572. end;
  573.  
  574. function inside(x1,y1,x2,y2,x,y: integer): boolean;
  575. begin
  576.   inside:= (x>=x1) and (x<=x2) and
  577.            (y>=y1) and (y<=y2);
  578. end;
  579.  
  580. procedure wait_for_mouserelease;
  581. begin
  582.   repeat
  583.     mpos(mouseloc);
  584.   until mouseloc.buttonstatus=0;
  585. end;
  586.  
  587. var gd,gm,
  588.     i,j,x,y   : integer;
  589.     infile    : text;
  590.     level     : word;
  591.     oldx,oldy : integer;
  592.     done      : boolean;
  593.     outstr,
  594.     tempstr   : string;
  595.  
  596.     hexstr    : string[4];
  597.     graphstr  : string[4];
  598.     name      : string[20];
  599.     junk      : char;
  600.  
  601.     legendpos : integer;
  602.     legendtype: integer;
  603.     newj        : integer;
  604.     currenttype,
  605.     currentval: integer;
  606.  
  607.     oldj,oldi : integer;
  608.  
  609.     key       : char;
  610.     control   : boolean;
  611.  
  612. begin
  613.   for i:= 0 to 255 do
  614.     begin
  615.       mapnames[i]:= 'unknown '+hex(i);
  616.       objnames[i]:= 'unknown '+hex(i);
  617.       mapgraph[i]:= '0010';
  618.       objgraph[i]:= '0000';
  619.     end;
  620.   assign(infile,'mapdata.def');
  621.   reset(infile);
  622.   while not eof(infile) do
  623.     begin
  624.       readln(infile,hexstr,junk,graphstr,junk,name);
  625.       mapnames[str_to_hex(hexstr)]:= name;
  626.       mapgraph[str_to_hex(hexstr)]:= graphstr;
  627.     end;
  628.   close(infile);
  629.  
  630.   assign(infile,'objdata.def');
  631.   reset(infile);
  632.   while not eof(infile) do
  633.     begin
  634.       readln(infile,hexstr,junk,graphstr,junk,name);
  635.       objnames[str_to_hex(hexstr)]:= name;
  636.       objgraph[str_to_hex(hexstr)]:= graphstr;
  637.     end;
  638.   close(infile);
  639.  
  640.  
  641.   directvideo:=false;
  642.   read_levels;
  643.  
  644.   gd:= vga;
  645.   gm:= vgahi;
  646.   initgraph(gd,gm,'');
  647.  
  648.   settextstyle(0,0,1);
  649.   mreset(themouse);
  650.  
  651.   show_objects:= true;
  652.   show_floor:= false;
  653.  
  654.   x:= port[$3da];
  655.   port[$3c0]:= 0;
  656.  
  657.   setfillstyle(1,7);
  658.   bar(0,0,64*7+MAP_X+4,64*7+MAP_Y+4);
  659.   bar(64*7+MAP_X+9,0,639,380);
  660.   setfillstyle(1,0);
  661.   bar(2,2,64*7+MAP_X+2,64*7+MAP_Y+2);
  662.   bar(64*7+MAP_X+11,2,637,380-28);
  663.   bar(64*7+MAP_X+11,380-25,637,378);
  664.   setcolor(15);
  665.   outtextxy(64*7+MAP_X+15,380-16,' MAP  OBJ  UP  DOWN');
  666.   setfillstyle(1,7);
  667.   bar(64*7+MAP_X+11+043,380-25,64*7+MAP_X+11+044,378);
  668.   bar(64*7+MAP_X+11+083,380-25,64*7+MAP_X+11+084,378);
  669.   bar(64*7+MAP_X+11+113,380-25,64*7+MAP_X+11+114,378);
  670.  
  671.  
  672.   legendpos:= 0;
  673.   legendtype:= 0;
  674.   currenttype:= 0;
  675.   currentval:= 1;
  676.   setfillstyle(1,0);
  677.   bar(66*7+MAP_X,60*7+MAP_Y,637,61*7+MAP_Y);
  678.   if currenttype=0 then
  679.     begin
  680.       output(66,60,mapgraph[currentval]);
  681.       outtext(67,60,15,' - '+mapnames[currentval]);
  682.     end
  683.   else
  684.     begin
  685.       output(66,60,objgraph[currentval]);
  686.       outtext(67,60,15,' - '+objnames[currentval]);
  687.     end;
  688.  
  689.  
  690.   showlegend(legendtype,legendpos,25);
  691.  
  692.   x:= port[$3da];
  693.   port[$3c0]:= 32;
  694.   mshow;
  695.   level:=1;
  696.   done:= false;
  697.   repeat
  698.     mhide;
  699.     setfillstyle(1,0);
  700.     bar(0,TEXTLOC,64*7-1+MAP_X,479);
  701.     setcolor(15);
  702.     str(level:2,tempstr);
  703.     outtextxy(0,TEXTLOC,'Level: '+tempstr);
  704.     expand(levels[level].map_data,levelmap);
  705.     expand(levels[level].object_data,objectmap);
  706.     display_map;
  707.     mshow;
  708.     oldx:= 0;
  709.     oldy:= 0;
  710.     key:= #0;
  711.     repeat
  712.       repeat
  713.         mpos(mouseloc);
  714.         x:= mouseloc.column;
  715.         y:= mouseloc.row;
  716.       until (oldx<>x) or (oldy<>y) or keypressed or (mouseloc.buttonstatus<>0);
  717.       oldx:= x;
  718.       oldy:= y;
  719.       if (mouseloc.buttonstatus<>0) then
  720.         begin
  721.           if inside(MAP_X,MAP_Y,64*7+MAP_X-1,64*7+MAP_Y-1,x,y) then
  722.             begin
  723.               mhide;
  724.               repeat
  725.                 i:= (x - MAP_X) div 7;
  726.                 j:= (y - MAP_Y) div 7;
  727.                 if currenttype=0 then
  728.                   levelmap[i,j]:= currentval
  729.                 else
  730.                   objectmap[i,j]:= currentval;
  731.                 setfillstyle(1,0);
  732.                 dobar(i*7,j*7,i*7+6,j*7+6);
  733.                 if show_floor then
  734.                   output(i,j,mapgraph[levelmap[i,j]])
  735.                 else
  736.                   if not (levelmap[i,j] in [$6a..$8f]) then
  737.                     output(i,j,mapgraph[levelmap[i,j]]);
  738.                 if show_objects then
  739.                   output(i,j,objgraph[objectmap[i,j]]);
  740.                 mpos(mouseloc);
  741.                 x:= mouseloc.column;
  742.                 y:= mouseloc.row;
  743.               until (not inside(MAP_X,MAP_Y,64*7+MAP_X-1,64*7+MAP_Y-1,x,y)) or
  744.                     (mouseloc.buttonstatus=0);
  745.               mshow;
  746.             end;
  747.           if inside(464,355,506,378,x,y) then
  748.             begin
  749.               wait_for_mouserelease;
  750.               legendpos:= 0;
  751.               legendtype:= 0;
  752.               showlegend(legendtype,legendpos,25);
  753.             end;
  754.           if inside(509,355,546,378,x,y) then
  755.             begin
  756.               wait_for_mouserelease;
  757.               legendpos:= 0;
  758.               legendtype:= 1;
  759.               showlegend(legendtype,legendpos,25);
  760.             end;
  761.           if inside(549,355,576,378,x,y) then
  762.             begin
  763.               wait_for_mouserelease;
  764.               dec(legendpos,25);
  765.               if legendpos<0 then legendpos:= 0;
  766.               showlegend(legendtype,legendpos,25);
  767.             end;
  768.           if inside(579,355,637,378,x,y) then
  769.             begin
  770.               wait_for_mouserelease;
  771.               inc(legendpos,25);
  772.               if (legendpos+25)>255 then legendpos:= 255-25;
  773.               showlegend(legendtype,legendpos,25);
  774.             end;
  775.         end;
  776.       if inside(464,2,637,350,x,y) then
  777.         begin
  778.           mhide;
  779.           j:= (y-2) div 14;
  780.           setcolor(15);
  781.           rectangle(465,j*14+2+1,636,j*14+2+12);
  782.           repeat
  783.             mpos(mouseloc);
  784.             newj:= (mouseloc.row-2) div 14;
  785.             if mouseloc.buttonstatus<>0 then
  786.               begin
  787.                 currenttype:= legendtype;
  788.                 currentval:= legendpos+j;
  789.                 setfillstyle(1,0);
  790.                 bar(66*7+MAP_X,60*7+MAP_Y,637,61*7+MAP_Y);
  791.                 if currenttype=0 then
  792.                   begin
  793.                     output(66,60,mapgraph[currentval]);
  794.                     outtext(67,60,15,' - '+mapnames[currentval]);
  795.                   end
  796.                 else
  797.                   begin
  798.                     output(66,60,objgraph[currentval]);
  799.                     outtext(67,60,15,' - '+objnames[currentval]);
  800.                   end;
  801.               end;
  802.           until (newj<>j) or (mouseloc.column<464) or keypressed;
  803.           setcolor(0);
  804.           rectangle(465,j*14+2+1,636,j*14+2+12);
  805.           mshow;
  806.         end;
  807.  
  808.       if inside(MAP_X,MAP_Y,64*7+MAP_X-1,64*7+MAP_Y-1,x,y) then
  809.         begin
  810.           i:= (x - MAP_X) div 7;
  811.           j:= (y - MAP_Y) div 7;
  812.           if (oldj<>j) or (oldi<>i) then
  813.             begin
  814.               outstr:= '(';
  815.               str(i:2,tempstr);
  816.               outstr:= outstr+tempstr+',';
  817.               str(j:2,tempstr);
  818.               outstr:= outstr+tempstr+')    map: '+hex(levelmap[i,j]);
  819.               outstr:= outstr+' - '+mapnames[levelmap[i,j]];
  820.               setfillstyle(1,0);
  821.               setcolor(15);
  822.               bar(100,TEXTLOC,64*7+MAP_X-1,479);
  823.               outtextxy(100,TEXTLOC,outstr);
  824.               outstr:= '        object: '+hex(objectmap[i,j])+' - '+objnames[objectmap[i,j]];
  825.               outtextxy(100,TEXTLOC+10,outstr);
  826.               oldj:= j;
  827.               oldi:= i;
  828.             end;
  829.         end
  830.       else
  831.         begin
  832.           mhide;
  833.           setfillstyle(1,0);
  834.           bar(100,TEXTLOC,360,479);
  835.           mshow;
  836.         end;
  837.  
  838.       if keypressed then
  839.         begin
  840.           control:= false;
  841.           key:= readkey;
  842.           if key=#0 then
  843.             begin
  844.               control:= true;
  845.               key:= readkey;
  846.             end;
  847.           if control then
  848.             case key of
  849.               'H':
  850.                 begin
  851.                   freemem(levels[level].map_data,levels[level].map_size);
  852.                   freemem(levels[level].object_data,levels[level].object_size);
  853.                   compress(levelmap,levels[level].map_data,levels[level].map_size);
  854.                   compress(objectmap,levels[level].object_data,levels[level].object_size);
  855.                   inc(level);
  856.                 end;
  857.               'P':
  858.                 begin
  859.                   freemem(levels[level].map_data,levels[level].map_size);
  860.                   freemem(levels[level].object_data,levels[level].object_size);
  861.                   compress(levelmap,levels[level].map_data,levels[level].map_size);
  862.                   compress(objectmap,levels[level].object_data,levels[level].object_size);
  863.                   dec(level);
  864.                 end;
  865.             end
  866.           else
  867.             case key of
  868.               'q','Q':
  869.                    begin
  870.                      done:= true;
  871.                      freemem(levels[level].map_data,levels[level].map_size);
  872.                      freemem(levels[level].object_data,levels[level].object_size);
  873.                      compress(levelmap,levels[level].map_data,levels[level].map_size);
  874.                      compress(objectmap,levels[level].object_data,levels[level].object_size);
  875.                    end;
  876.               'H': begin
  877.                      freemem(levels[level].map_data,levels[level].map_size);
  878.                      freemem(levels[level].object_data,levels[level].object_size);
  879.                      compress(levelmap,levels[level].map_data,levels[level].map_size);
  880.                      compress(objectmap,levels[level].object_data,levels[level].object_size);
  881.                      inc(level);
  882.                    end;
  883.               'P': begin
  884.                      freemem(levels[level].map_data,levels[level].map_size);
  885.                      freemem(levels[level].object_data,levels[level].object_size);
  886.                      compress(levelmap,levels[level].map_data,levels[level].map_size);
  887.                      compress(objectmap,levels[level].object_data,levels[level].object_size);
  888.                      dec(level);
  889.                    end;
  890.               'c','C': clear_level(level);
  891.               'o','O': begin
  892.                          mhide;
  893.                          show_objects:= not show_objects;
  894.                          display_map;
  895.                          mshow;
  896.                        end;
  897.               'f','F': begin
  898.                          mhide;
  899.                          show_floor:= not show_floor;
  900.                          display_map;
  901.                          if legendtype=0 then
  902.                            showlegend(legendtype,legendpos,25);
  903.                          mshow;
  904.                        end;
  905.             end;
  906.         end;
  907.     until done or (key in ['P','H']);
  908.     if level=0 then level:=10;
  909.     if level=11 then level:=1;
  910.   until done;
  911.  
  912.   setfillstyle(1,0);
  913.   bar(0,TEXTLOC,639,479);
  914.   setcolor(15);
  915.   outtextxy(0,TEXTLOC,' Save the current levels to disk? (Y/N) ');
  916.  
  917.   repeat
  918.     repeat until keypressed;
  919.     key:= readkey;
  920.     if key=#0 then
  921.       begin
  922.         key:= readkey;
  923.         key:= #0;
  924.       end;
  925.   until key in ['y','Y','n','N'];
  926.  
  927.   if key in ['y','Y'] then write_levels;
  928.  
  929.   textmode(co80);
  930. end.