home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / GRAPHICS / 3DSPACE2.ZIP / 3DSPACE2.PAS next >
Encoding:
Pascal/Delphi Source File  |  1994-02-21  |  51.8 KB  |  1,405 lines

  1. program PHANTOM_3D_ENGINE;
  2. uses vga256,crt;
  3. const SCRWIDTH=320;
  4.       MWIDTH=128;
  5.       MCENTRE=64;
  6.       SIZE=160;           { veelvoud van 2!! }
  7.       LINES=65;           { aantal lijnen voor vloer (MAX. 70) }
  8.       KIM=20;             { hoogte tussen plafond en vloer }
  9.       XPOS=0;
  10.       DARK=1;             { donker in de verte }
  11.       DIST=4500;          { 1769 voor SIZE=320 }
  12.       HAZE=0;             { mistig in de verte }
  13.  
  14. { SOURCES INCLUDED - SOFTWARE MADE BY THE PHANTOM - A MEGAVOLT DEMOCODER }
  15. { explaining everything about this source is getting a bit too laborous, }
  16. { so if you wanna know anything just give me a ring or leave me a messy  }
  17. { at MEGAVOLT BBS.                                                       }
  18.  
  19. { Important parts for try-out programmers:
  20.   - The first lines (the constants):
  21.     use these to alter the screen size and position.
  22.     you better not change the mapsize, I don't know what will happen,
  23.     but it's vital to the program (I am shifting 7 bits to get a
  24.     128 times multiply you see)
  25.   - The 'dummysource' procedure:
  26.     Here the map is generated. Offcourse you could load your own map,
  27.     just do a blockread after the getmem. There are even animated blocks,
  28.     have a look at the sample map to see how you can use them.
  29.   - The 'dummybitmaps' procedure:
  30.     Every bitmap is 32x32 pixels, that's one kilobyte per bitmap.
  31.     Just draw a bitmap at adres 0, and do a convertbitmap afterwards
  32.     to get it in the right place. Just do the same as I did.
  33.     Hint: Don't use straigt lines, just ditter a little, the effect
  34.     is much better and more natural.
  35.     O yes, color 0 means a bar. Bitmap 3 is completely zero, so you
  36.     get a wall. But you could draw a circle with color 0, so you
  37.     could draw pilars (bitmapped pilars in the future)
  38.     Bitmap 43 (the lavastream) is scrolled to the left, maybe you
  39.     would like something else to scroll to the left, or a different
  40.     effect (like bubbling mud or so)
  41.   - The 'MakeOutlines' procedure:
  42.     I hate to draw a charset by myself, so I made a charset with
  43.     7x7 dots. This looks ugly, but is easy to make. Then I wrote a
  44.     small procedure to make the outlines slightly darker. Looks great.
  45.   - DrawAMap:
  46.     The wonderfull PHANTOM 3D engine. Actually quitte short, but I
  47.     needed a version for every fourth of a circle (quadrant?), that's
  48.     how I kept the transformation-table so short.
  49.     Just pass the correct parameters to it: A coord, and an angle.
  50.     The coords are a bit special:
  51.     Every square on the map is 512 steps, so you can move really smooth.
  52.     X=0 and Y=0 gives you the centre of the map, thus 64,64.
  53.     So, the edges of the map have coords of 32768. (That's the largest
  54.     int, in case you were wondering why the map is so small).
  55.     The rotation is not really in degrees: an angle of 45 is 90 degrees
  56.     real rotation. So, a whole turn is 180 steps. Easy, isn't it?
  57.  
  58.   Well, I guess this will do for now, just have fun, and call me if
  59.   anything is unclear.
  60.  
  61.   My adres is: (I love mail)
  62.   Jacco Bikker
  63.   Gestellaan 44
  64.   3431 GN  Nieuwegein
  65.  
  66.   And my phonenumber is still:  03402-33309
  67. }
  68.  
  69.  
  70. var s1,o1,s3,o3,s2,o2,s4,o4: word;
  71.     p1,p2,p3,p4: pointer;
  72.     i,x,y,width: word;
  73.     a1,a2,a3,x1,y1: word;
  74.     sy,ss,w,bg: real;
  75.     f: file;
  76.     sn,cs: array[0..360] of real;
  77.     a: char;
  78.     b: byte;
  79.     r,s,d,x2,y2: integer;
  80.     cset: string;
  81.  
  82. {assembler variables}
  83.     stacks,loop,bloop,stackp,base,startf,startc: word;
  84.     inner,transp,transs,xdelta,ydelta,wstep: word;
  85.     htable,screen,screen2,hight,bitmap,curr: word;
  86.     xp,yp,map,dir,colsize,coltab,stepsize,steptab,ceiling: word;
  87.  
  88. procedure DummySource(var p: pointer);
  89. var i,s,o,x: word;
  90.     r,m: array[0..63] of string[64];
  91.     t: string;
  92.     q,w: word;
  93. Function Conv(s: char): byte;
  94. var i: byte;
  95. begin
  96.    for i:=1 to length(cset) do if cset[i]=s then Conv:=i;
  97. end;
  98.  
  99. begin
  100.    GetMem(p,65535);
  101.    s:=Seg(p^);
  102.    o:=Ofs(p^);
  103.    Cset:=': #ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890/*!)=@;';
  104.  
  105.    m[ 0]:='################################################################';
  106.    m[ 1]:='################################################################';
  107.    m[ 2]:='#:::::::::::::::: : : : : : : :###: : : : : : : : :::::::::::::#';
  108.    m[ 3]:='#::::::::::::::::: : : : : : PHANTOM## : : : : : : ::::::::::::#';
  109.    m[ 4]:='#:::::::::::::::: : : : : : ;;;;;;;;##: : : : : : : :::::::::::#';
  110.    m[ 5]:='#::::::::::::::::: :PROUDLY PRESENTS## : : : : : : : ::::::::::#';
  111.    m[ 6]:='#===================================#==========================#';
  112.    m[ 7]:='#::::::::::::::::: : : : A FAST;;##============================#';
  113.    m[ 8]:='#:::::::::::::::: : : : : : ;;;;;##============================#';
  114.    m[ 9]:='#::::::::::::::::: : : 3D ENGINE;####===========###: : ::::::::#';
  115.    m[10]:='#:::::::::::::::: : : : : ##====================### : :::::::::#';
  116.    m[11]:='#::::::::::::::::: : : : :##==============## : :###: ::::::::::#';
  117.    m[12]:='#:::::::::::::::: : : FEATURES ARE:#########: : : : : :::::::::#';
  118.    m[13]:='#::::::::::::::::: :######## : : : ######### : : : : ::::::::::#';
  119.    m[14]:='#:::::::::::::::: : : SHADED WALLS: :!:#####: : : : : :::::::::#';
  120.    m[15]:='#::::::::::::::::: : : :## : : : : : ! ##### : : : : ::::::::::#';
  121.    m[16]:='#:::::::::::::::: : :TEXTURED#FLOORS:!:#####: : : : : :::::::::#';
  122.    m[17]:='#::::::::::::::::: : : :## : : : : : ! ##### : : : : ::::::::::#';
  123.    m[18]:='#:::::::::::::::: : : TEXTURED:ROOF :!:#####: : : : : :::::::::#';
  124.    m[19]:='#::::::::::::::::: : : :## : : : : : ########: : : : ::::::::::#';
  125.    m[20]:='#:::::::::::::::: : : HAZE EFFECTS: :######## : : : :::::::::::#';
  126.    m[21]:='#::::::::::::::::: : : :## : : : : : : : : ##: : : : ::::::::::#';
  127.    m[22]:='#:::::::::::::::: : : : ##: : : : : : : : :## : : : : :::::::::#';
  128.    m[23]:='#::::::::::::::::: : : :## : : : : : : : : ##: : : : ::::::::::#';
  129.    m[24]:='#:::::::::::::::: : : : ##: : :9: : : : : :## : : : :::::::::::#';
  130.    m[25]:='#::::::::::::::::: : : :## : :   : : : : : : : : : : ::::::::::#';
  131.    m[26]:='#:::::::::::::::::::::::::::###8 ####::::::::::::::::::::::::::#';
  132.    m[27]:='#:::::::::::::::::::::::::::###  ####::::::::::::::::::::::::::#';
  133.    m[28]:='#::::::::::::::::::::::::::::##7 ###:::::::::::::::::::::::::::#';
  134.    m[29]:='#::::::::::::::::::::::::::::##  ###:::::::::::::::::::::::::::#';
  135.    m[30]:='#::::::::::::::::::::::::::::##6 ###:::::::::::::::::::::::::::#';
  136.    m[31]:='#::::::::::::::::::::::::::::##  ###:::::::::::::::::::::::::::#';
  137.    m[32]:='#::::::::::::::::::::::::::::##5 ###:::::::::::::::::::::::::::#';
  138.    m[33]:='###############################  ###############################';
  139.    m[34]:='###############################4 ###############################';
  140.    m[35]:='#=========================##: : : : : : : :==================  #';
  141.    m[36]:='#=========================## : 3 : : : ##: == == == == == ==   #';
  142.    m[37]:='#=========================##: : : : : :##====================  #';
  143.    m[38]:='#=========================## : 2 : : : ##====================  #';
  144.    m[39]:='#=========================##: : : : : :##====================  #';
  145.    m[40]:='#=========================## : 1 : : : ##====================  #';
  146.    m[41]:='#=========================##: : : : : :##====================  #';
  147.    m[42]:='#=========================## :#0 # :#: ##====================  #';
  148.    m[43]:='#=============================#::#==#========================  #';
  149.    m[44]:='#==============================::============================  #';
  150.    m[45]:='#===================#==========::===============#============  #';
  151.    m[46]:='#==============================::============================  #';
  152.    m[47]:='#==============================::============================  #';
  153.    m[48]:='#==============================::============================  #';
  154.    m[49]:='#===================#==========::===============#============  #';
  155.    m[50]:='#==============================::============================  #';
  156.    m[51]:='#==============================::============================  #';
  157.    m[52]:='#==============================::============================  #';
  158.    m[53]:='#===================#==========::===============#============  #';
  159.    m[54]:='#==========================;;;;;;;;;;;=======================  #';
  160.    m[55]:='#==========================;;;;;;;;;;;=======================  #';
  161.    m[56]:='#==========================;;;;;;;;;;;=======================  #';
  162.    m[57]:='#===================#===#==;#;;;#;;;#;==#===#===#============  #';
  163.    m[58]:='#==========================;;;;;;;;;;;=======================  #';
  164.    m[59]:='#============================================================  #';
  165.    m[60]:='#============================================================  #';
  166.    m[61]:='#============================================================  #';
  167.    m[62]:='################################################################';
  168.    m[63]:='################################################################';
  169.  
  170.    r[ 0]:='################################################################';
  171.    r[ 1]:='################################################################';
  172.    r[ 2]:='#//////////////////*/*/*/*/*/*/###/////////////////////////////#';
  173.    r[ 3]:='#::::::::::::::::::::::::::::://////##:::::::::::::::::::::::::#';
  174.    r[ 4]:='#::::::::::::::::::::::::::::::::::/##:::::::::::::::::::::::::#';
  175.    r[ 5]:='#::::::::::::::::::::::::::::::::::/##:::::::::::::::::::::::::#';
  176.    r[ 6]:='#:::::::::::::::::::::::::::::::*///#/:::::::::::::::::::::::::#';
  177.    r[ 7]:='#:::::::::::::::::::::          /##///:::::::::::::::::::::::::#';
  178.    r[ 8]:='#:::::::::::::::::::::          /##///:::::::::::::::::::::::::#';
  179.    r[ 9]:='#:::::::::::::::::::::   ///*   /####/:::::::::::::::::::::::::#';
  180.    r[10]:='#:::::::::::::::::::::   /##/   //*///:::////::::::::::::::::::#';
  181.    r[11]:='#:::::::::::::::::::::   /##/:: :://////:/##/::::::::::::::::::#';
  182.    r[12]:='#:::::::::::::::::://////////:: ::/####/:/##/::::::::::::::::::#';
  183.    r[13]:='#::::::::::::::::::/########*:: ::/####/:/##/::::::::::::::::::#';
  184.    r[14]:='#:::::::::::::::::://////////:: ::*/////:/##/::::::::::::::::::#';
  185.    r[15]:='#::::::::::::::::::::::/##/://* :::::::::/##/::::::::::::::::::#';
  186.    r[16]:='#::::::::::::::::::::::////:/#/ :::::::::/##/::::::::::::::::::#';
  187.    r[17]:='#::::::::::::::::::::::/##/:/// :::::::::/##/::::::::::::::::::#';
  188.    r[18]:='#::::::::::::::::::::::////:::: :::://////##//:::::::::::::::::#';
  189.    r[19]:='#:::::::::::::::::     /##/         /########/:::::::::::::::::#';
  190.    r[20]:='#:::::::::::::::::     ////         ///////##/:::::::::::::::::#';
  191.    r[21]:='#:::::::::::::::::     /##*****************##/:::::::::::::::::#';
  192.    r[22]:='#:::::::::::::::::     /##/          :::::/##/:::::::::::::::::#';
  193.    r[23]:='#:::::::::::::::::     /##*****************##/:::::::::::::::::#';
  194.    r[24]:='#:::::::::::::::::     /##/          :::::/##/:::::::::::::::::#';
  195.    r[25]:='#:::::::::::::::::     /##*************************************#';
  196.    r[26]:='#:::::::::::::::::     //// ###//####::::::::::::::::::::::::::#';
  197.    r[27]:='#:::::::::::::::::          ###**####::::::::::::::::::::::::::#';
  198.    r[28]:='#:::::::::::::::::           ##//### ::::::::::::::::::::::::::#';
  199.    r[29]:='#:::::::::::::::::           ##**### ::::::::::::::::::::::::::#';
  200.    r[30]:='#::::::::::::::::::::::::::::##//###:::::::::::::::::::::::::::#';
  201.    r[31]:='#::::::::::::::::::::::::::::##**###:::::::::::::::::::::::::::#';
  202.    r[32]:='#::::::::::::::::::::::::::::##//###:::::::::::::::::::::::::::#';
  203.    r[33]:='###############################**###############################';
  204.    r[34]:='###############################//###############################';
  205.    r[35]:='#:::::::::::::::::::::::::##*************//////////////////////#';
  206.    r[36]:='#:::::::::::::::::::::::::##///////////##/*/*/*/*/*/*/*/*/*/*/*#';
  207.    r[37]:='#:::::::::::::::::::::::::##***********##//////////////////////#';
  208.    r[38]:='#:::::::::::::::::::::::::##///////////##::::::::::::::::::::/*#';
  209.    r[39]:='#:::::::::::::::::::::::::##***********##:::::::::::::::::::://#';
  210.    r[40]:='#:::::::::::::::://///////##///////////##/////////////:::::::/*#';
  211.    r[41]:='#:::::::::::::::://*//*//*##***********##//*//*//*//*/::::::://#';
  212.    r[42]:='#:::::::::::::::://///////##//#//#//#//##/////////////:::::::/*#';
  213.    r[43]:='#:::::::::::::::://///////////#//#//#/////////////////::::::://#';
  214.    r[44]:='#:::::::::::::::://*//*//*//*//*//*//*//*//*//*//*//*/:::::::/*#';
  215.    r[45]:='#::::::::::::::::///#///////////////////////////#/////::::::://#';
  216.    r[46]:='#:::::::::::::::://///////////////////////////////////:::::::/*#';
  217.    r[47]:='#:::::::::::::::://*//*//*//*//*//*//*//*//*//*//*//*/::::::://#';
  218.    r[48]:='#:::::::::::::::://///////////////////////////////////:::::::/*#';
  219.    r[49]:='#::::::::::::::::///#///////////////////////////#/////::::::://#';
  220.    r[50]:='#:::::::::::::::://*/////*//*//*//*//*//*//*//*//*//*/:::::::/*#';
  221.    r[51]:='#:::::::::::::::://///////////////////////////////////::::::://#';
  222.    r[52]:='#:::::::::::::::://///////////////////////////////////:::::::/*#';
  223.    r[53]:='#:::::::::::::::://*#/*//*//*//*//*//*//*//*//*/#*//*/::::::://#';
  224.    r[54]:='#:::::::::::::::://///////////////////////////////////:::::::/*#';
  225.    r[55]:='#:::::::::::::::://///////////////////////////////////::::::://#';
  226.    r[56]:='#:::::::::::::::://*//*//*//*//*//*//*//*//*//*//*//*/:::::::/*#';
  227.    r[57]:='#::::::::::::::::///#///#///#///#///#///#///#///#/////::::::://#';
  228.    r[58]:='#:::::::::::::::://///////////////////////////////////:::::::/*#';
  229.    r[59]:='#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::://#';
  230.    r[60]:='#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::/*#';
  231.    r[61]:='#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::://#';
  232.    r[62]:='################################################################';
  233.    r[63]:='################################################################';
  234.  
  235.    q:=32*MWIDTH+32+o;
  236.    w:=q+16384;
  237.    for i:=0 to 63 do begin
  238.       for x:=0 to 63 do begin
  239.          mem[s:q+x]:=Conv(m[i][x]);
  240.          mem[s:w+x]:=Conv(r[i][x]);
  241.       end;
  242.       inc(q,MWIDTH);
  243.       inc(w,MWIDTH);
  244.    end;
  245. end;
  246.  
  247. procedure ConvertBitmap(s,o,n: word);
  248. var x,y,a: word;
  249. begin
  250.    a:=n*1024+o;
  251.    for x:=16 to 47 do for y:=16 to 47 do
  252.       mem[s:a+(x mod 32)+(y mod 32)*32]:=mem[s:o+x+(y-16)*32-16];
  253. end;
  254.  
  255. function Pixel(s,o: word; x,y: byte): byte;
  256. begin
  257.    Pixel:=0;
  258.    if mem[s:o+x*4+y*128]=31 then Pixel:=1
  259. end;
  260.  
  261. procedure MakeOutlines(s,o: word);
  262. var z: byte;
  263.     x,y,i,q,w: word;
  264. begin
  265.    for x:=1 to 7 do for y:=1 to 7 do begin
  266.       q:=x*4-2+((y*4)-2)*32+o;
  267.       if mem[s:q+34]=31 then begin
  268.          z:=Pixel(s,o,x,y-1)+2*Pixel(s,o,x+1,y)+4*Pixel(s,o,x,y+1)+8*Pixel(s,o,x-1,y);
  269.          if not (odd(z)) then meml[s:q]:=$8080808;
  270.          if (z=1) or (z=4) or (z=5) or (z=8) or (z=9) or (z=12) or (z=13) or (z=0) then begin
  271.             mem[s:q+35]:=8;
  272.             mem[s:q+67]:=8;
  273.             mem[s:q+99]:=8;
  274.             mem[s:q+3]:=8;
  275.          end;
  276.          if (z=1) or (z=3) or (z=2) or (z=8) or (z=9) or (z=10) or (z=11) or (z=0) then
  277.             meml[s:q+96]:=$8080808;
  278.          if (z<8) then begin
  279.             mem[s:q+32]:=8;
  280.             mem[s:q+64]:=8;
  281.             mem[s:q+96]:=8;
  282.             mem[s:q]:=8;
  283.          end;
  284.       end;
  285.    end;
  286. end;
  287.  
  288. procedure MChar(b: byte; c: string; var s,o: word);
  289. var i,x,y,x1,y1,a: word;
  290.     t: char;
  291. begin
  292.    for i:=0 to 255 do meml[s:o+(i shl 2)]:=meml[s:o+2048+(i shl 2)];
  293.    for y:=1 to 7 do for x:=1 to 7 do begin
  294.       t:=c[y*8+x-8];
  295.       if t='*' then for x1:=x*4-2 to x*4+1 do for y1:=y*4-2 to y*4+1 do
  296.          mem[s:o+x1+y1*32]:=31;
  297.    end;
  298.    MakeOutlines(s,o);
  299.    ConvertBitmap(s,o,b);
  300. end;
  301.  
  302. procedure DummyBitmaps(var p: pointer);
  303. var x,y,i,s,o,a,c: word;
  304. begin
  305.    GetMem(p,1024*63);                           {2 bitmaps voorlopig}
  306.    s:=Seg(p^);
  307.    o:=Ofs(p^);
  308.    {clear all bitmaps}
  309.    for i:=0 to 256*63 do meml[s:o+i shl 2]:=0;
  310.    {bitmap 1}
  311.    for y:=0 to 31 do for x:=0 to 31 do mem[s:o+x+y*32]:=random(3)+2;
  312.    ConvertBitmap(s,o,1);
  313.    {bitmap 2}
  314.    for y:=0 to 31 do for x:=0 to 31 do mem[s:o+x+y*32]:=random(3)+5;
  315.    ConvertBitmap(s,o,2);
  316.    {bitmap 4-29 are characters!}
  317.    MChar(4, '---*--- --***-- -**-**- **---** ******* **---** **---**',s,o); {A}
  318.    MChar(5, '*****-- **--**- **---** ******- **---** **--**- *****--',s,o); {B}
  319.    MChar(6, '--****- -**--** **----- **----- **----- -**--** --****-',s,o); {C}
  320.    MChar(7, '*****-- **--**- **---** **---** **---** **--**- *****--',s,o); {D}
  321.    MChar(8, '******* **----- **----- *****-- **----- **----- *******',s,o); {E}
  322.    MChar(9, '******* **----- **----- *****-- **----- **----- **-----',s,o); {F}
  323.    MChar(10,'--****- -**--** **----- **--*** **---** -**--** --****-',s,o); {G}
  324.    MChar(11,'**---** **---** **---** ******* **---** **---** **---**',s,o); {H}
  325.    MChar(12,'-*****- --***-- --***-- --***-- --***-- --***-- -*****-',s,o); {I}
  326.    MChar(13,'-*****- ----**- ----**- ----**- ----**- -**-**- --***--',s,o); {J}
  327.    MChar(14,'**--**- **-**-- ****--- ***---- ****--- **-**-- **--**-',s,o); {K}
  328.    MChar(15,'**----- **----- **----- **----- **----- **----- *******',s,o); {L}
  329.    MChar(16,'**---** **---** ***-*** ***-*** ******* ******* **-*-**',s,o); {M}
  330.    MChar(17,'**---** **---** ***--** ****-** **-**** **--*** **---**',s,o); {N}
  331.    MChar(18,'-*****- **---** **---** **---** **---** **---** -*****-',s,o); {O}
  332.    MChar(19,'******- **---** **---** ******- **----- **----- **-----',s,o); {P}
  333.    MChar(20,'-*****- **---** **---** **---** **---** **--*** -******',s,o); {Q}
  334.    MChar(21,'******- **---** **---** ******- **-**-- **--**- *----**',s,o); {R}
  335.    MChar(22,'-*****- **---** **----- -*****- -----** **---** -*****-',s,o); {S}
  336.    MChar(23,'******* --***-- --***-- --***-- --***-- --***-- --***--',s,o); {T}
  337.    MChar(24,'**---** **---** **---** **---** **---** **---** -*****-',s,o); {U}
  338.    MChar(25,'**---** **---** -**-**- -**-**- --***-- --***-- ---*---',s,o); {V}
  339.    MChar(26,'**---** **---** **---** **-*-** ******* ***-*** **---**',s,o); {W}
  340.    MChar(27,'**---** -**-**- --***-- ---*--- --***-- -**-**- **---**',s,o); {X}
  341.    MChar(28,'**---** **---** -**-**- -**-**- --***-- --***-- --***--',s,o); {Y}
  342.    MChar(29,'******* -----** ----**- ---**-- --**--- -**---- *******',s,o); {Z}
  343.    MChar(30,'---**-- --***-- ---**-- ---**-- ---**-- ---**-- --****-',s,o); {1}
  344.    MChar(31,'-*****- **---** ----**- ---**-- --**--- -**---- *******',s,o); {2}
  345.    MChar(32,'-*****- **---** -----** ----**- -----** **---** -*****-',s,o); {3}
  346.    MChar(33,'----**- ---***- --****- -**-**- ******* ----**- ---****',s,o); {4}
  347.    MChar(34,'******* **----- **----- ******- -----** **---** -*****-',s,o); {5}
  348.    MChar(35,'-*****- **---** **----- ******- **---** **---** -*****-',s,o); {6}
  349.    MChar(36,'******* -----** ----**- ---**-- --**--- -**---- -**----',s,o); {7}
  350.    MChar(37,'-*****- **---** **---** -*****- **---** **---** -*****-',s,o); {8}
  351.    MChar(38,'-*****- **---** **---** -****** -----** **---** -*****-',s,o); {9}
  352.    MChar(39,'-*****- **--*** **--*** **-*-** **-*-** ***--** -*****-',s,o); {0}
  353.    { bitmap 40: plafondpanelen }
  354.    for y:=0 to 31 do for x:=0 to 31 do mem[s:o+x+y*32]:=9;
  355.    for y:=1 to 30 do for x:=1 to 30 do mem[s:o+x+y*32]:=10;
  356.    for y:=14 to 18 do for x:=14 to 18 do mem[s:o+x+y*32]:=9;
  357.    ConvertBitmap(s,o,40);
  358.    { bitmap 41: lampen aan het plafond }
  359.    for y:=11 to 21 do for x:=5 to 27 do mem[s:o+x+y*32]:=12;
  360.    for y:=12 to 20 do for x:=6 to 26 do mem[s:o+x+y*32]:=11;
  361.    ConvertBitmap(s,o,41);
  362.    { bitmap 42: tralies }
  363.    for y:=0 to 31 do for x:=0 to 31 do mem[s:o+x+y*32]:=random(3)+2;
  364.    for i:=0 to 3 do begin
  365.       memw[s:o+(i*8)*32+15]:=0;
  366.       meml[s:o+(i*8+1)*32+14]:=0;
  367.       meml[s:o+(i*8+2)*32+14]:=0;
  368.       memw[s:o+(i*8+3)*32+15]:=0;
  369.    end;
  370.    ConvertBitmap(s,o,42);
  371.    { bitmap 43: deuk in muur }
  372.    for y:=0 to 31 do for x:=0 to 31 do mem[s:o+x+y*32]:=random(3)+2;
  373.    for y:=0 to 31 do for x:=0 to round(31*sin((y*5.625*3.14159)/180)) do mem[s:o+x+y*32]:=0;
  374.    ConvertBitmap(s,o,43);
  375.    { bitmap 44: lavastroompje (wordt naar links gescrolld) }
  376.    c:=13;
  377.    for y:=0 to 31 do for x:=0 to 31 do begin
  378.       mem[s:o+x+y*32]:=c;
  379.       if random(4)=1 then begin inc(c); if c=16 then c:=13 end;
  380.    end;
  381.    ConvertBitmap(s,o,44);
  382.    { bitmap 45 contains something really special: A shrinked version
  383.      of the last displayed screen! (didn't look so good after all) }
  384.    { Bitmap 46: Kleine schaakbordjes }
  385.    for y:=0 to 31 do for x:=0 to 31 do
  386.       if (y<16) and (x<16) or (x>15) and (y>15)
  387.          then mem[s:o+x+y*32]:=random(3)+2
  388.          else mem[s:o+x+y*32]:=random(3)+5;
  389.    ConvertBitmap(s,o,46);
  390.    { wall-bitpattern }
  391.    for y:=0 to 25 do mem[s:o+y*32]:=11;
  392.    for y:=26 to 31 do mem[s:o+y*32]:=12;
  393. end;
  394.  
  395. procedure ScrollLava; Assembler;
  396. label regels,words;
  397. asm
  398.    mov ES,[s3]                { bitmap-segment }
  399.    mov DI,[o3]
  400.    add DI,44*1024
  401.    mov AL,32
  402. regels:
  403.    mov CX,15
  404.    mov DX,ES:[DI]             { eerste word opslaan }
  405. words:
  406.    mov BX,ES:[DI+2]
  407.    mov ES:[DI],BX
  408.    add DI,2
  409.    loop words
  410.    mov ES:[DI],DX
  411.    add DI,2
  412.    dec AL
  413.    jnz regels
  414. end;
  415.  
  416. procedure Monitor; Assembler;
  417. label regels,words1,words2,nietnul1,nietnul2,niethalf;
  418. asm
  419.    mov [stacks],SS
  420.    mov ES,[s3]
  421.    mov DI,[o3]
  422.    mov SS,[s4]
  423.    add DI,45*1024+16+16*32
  424.    mov SI,320*39+XPOS
  425.    mov AL,32
  426. regels:
  427.    mov CX,16
  428.    mov BX,SI
  429.    add SI,320*5
  430. words1:
  431.    mov DL,SS:[BX]
  432.    and DL,31
  433.    jnz nietnul1
  434.    mov DL,30
  435. nietnul1:
  436.    mov ES:[DI],DL
  437.    inc DI
  438.    add BX,8
  439.    loop words1
  440.    mov CX,16
  441.    sub DI,32
  442. words2:
  443.    mov DL,SS:[BX]
  444.    and DL,31
  445.    jnz nietnul2
  446.    mov DL,30
  447. nietnul2:
  448.    mov ES:[DI],DL
  449.    inc DI
  450.    add BX,(SIZE/33)
  451.    loop words2
  452.    add DI,32
  453.    cmp AL,17
  454.    jnz niethalf
  455.    mov DI,45*1024+16
  456. niethalf:
  457.    dec AL
  458.    jnz regels
  459.    mov SS,[stacks]
  460. end;
  461.  
  462.  
  463. procedure SetPalette;
  464. var r,g,b: array[0..31] of byte;
  465.     a,i: byte;
  466. begin
  467.    { 32 kleuren kunnen gedefinieerd worden: Alle andere worden
  468.      hieruit afgeleid (donkerder). Elk van de 32 kleuren wordt
  469.      donkerder in de diepte, in 8 stappen.                       }
  470.  
  471. {        red:     green:      blue:     description:             }
  472.  
  473.    r[ 0]:= 0; g[ 0]:= 0; b[ 0]:= 0;     { grey-scale             }
  474.    r[ 1]:=20; g[ 1]:=15; b[ 1]:=10;
  475.    r[ 2]:=32; g[ 2]:=20; b[ 2]:= 0;     { vloertegel a kleur 1   }
  476.    r[ 3]:=30; g[ 3]:=19; b[ 3]:= 0;     { vloertegel a kleur 2   }
  477.    r[ 4]:=28; g[ 4]:=18; b[ 4]:= 0;     { vloertegel a kleur 3   }
  478.    r[ 5]:=30; g[ 5]:=18; b[ 5]:= 0;     { vloertegel b kleur 1   }
  479.    r[ 6]:=28; g[ 6]:=17; b[ 6]:= 0;     { vloertegel b kleur 2   }
  480.    r[ 7]:=26; g[ 7]:=16; b[ 7]:= 0;     { vloertegel b kleur 3   }
  481.    r[ 8]:=40; g[ 8]:=25; b[ 8]:= 0;     { rand om karakerset     }
  482.    r[ 9]:=24; g[ 9]:=14; b[ 9]:= 0;     { plafond kleur 1        }
  483.    r[10]:=22; g[10]:=12; b[10]:= 0;     { plafond kleur 2        }
  484.    r[11]:=63; g[11]:=63; b[11]:=63;     { lamp kleur 1           }
  485.    r[12]:=55; g[12]:=55; b[12]:=55;     { lamp kleur 2           }
  486.    r[13]:=63; g[13]:=10; b[13]:=10;     { vuurstroom kleur 1     }
  487.    r[14]:=55; g[14]:= 7; b[14]:= 7;     { vuurstroom kleur 2     }
  488.    r[15]:=47; g[15]:= 4; b[15]:= 4;     { vuurstroom kleur 3     }
  489.    r[16]:= 0; g[16]:= 0; b[16]:= 0;
  490.    r[17]:= 0; g[17]:= 0; b[17]:= 0;
  491.    r[18]:= 0; g[18]:= 0; b[18]:= 0;
  492.    r[19]:= 0; g[19]:= 0; b[19]:= 0;
  493.    r[20]:= 0; g[20]:= 0; b[20]:= 0;
  494.    r[21]:= 0; g[21]:= 0; b[21]:= 0;
  495.    r[22]:= 0; g[22]:= 0; b[22]:= 0;
  496.    r[23]:= 0; g[23]:= 0; b[23]:= 0;
  497.    r[24]:= 0; g[24]:= 0; b[24]:= 0;
  498.    r[25]:= 0; g[25]:= 0; b[25]:= 0;
  499.    r[26]:= 0; g[26]:= 0; b[26]:= 0;
  500.    r[27]:= 0; g[27]:= 0; b[27]:= 0;
  501.    r[28]:= 0; g[28]:= 0; b[28]:= 0;
  502.    r[29]:= 0; g[29]:= 0; b[29]:= 0;
  503.    r[30]:= 0; g[30]:= 0; b[30]:= 0;
  504.    r[31]:=63; g[31]:=63; b[31]:=63;
  505.  
  506.    if (DARK=1) then for a:=0 to 7 do for i:=0 to 31 do palette(i+a*32,
  507.                                              r[i]-((r[i]*a) div 8),
  508.                                              g[i]-((g[i]*a) div 8),
  509.                                              b[i]-((b[i]*a) div 8));
  510.    if (HAZE=1) then for a:=0 to 7 do for i:=0 to 31 do palette(i+a*32,
  511.                                          r[i]+(((63-r[i])*a) div 8),
  512.                                          g[i]+(((63-g[i])*a) div 8),
  513.                                          b[i]+(((63-b[i])*a) div 8));
  514.    if (HAZE=0) and (DARK=0) then for a:=0 to 7 do for i:=0 to 31 do
  515.                                          palette(i+a*32,r[i],g[i],b[i]);
  516. end;
  517.  
  518. procedure MakeTransTabel(r: word);
  519. var s,o: word;
  520.     w,sy,x1,y1: real;
  521.     yb,yc,y,a2,x,a3,a4: word;
  522.     x2,y2,x3,y3: real;
  523.     f: file;
  524. begin
  525.    w:=SIZE div 2;
  526.    a4:=o1+r*560+32768;
  527.    r:=r*2;
  528.    for y:=0 to LINES do begin
  529.       y1:=(((65536*500)/w)-65536*3.125)/(-4);
  530.       yb:=round(y1/-DIST);
  531.       yc:=round(yb div 32)*32;
  532.       x2:=MCENTRE*65536-(cs[r]*(SIZE div 2)*65536)/w-sn[r]*y1;
  533.       y2:=65536*64+cs[r]*y1-(sn[r]*(SIZE div 2)*65536)/w;
  534.       memw[s1:a4+y*8]:=round(x2/128);
  535.       memw[s1:a4+y*8+2]:=round(y2/128);
  536.       x3:=65536*MCENTRE+cs[r]*(65536*((SIZE div 2)-1))/w-sn[r]*y1-x2;
  537.       y3:=65536*64+cs[r]*y1+sn[r]*(65536*((SIZE div 2)-1))/w-y2;
  538.       memw[s1:a4+y*8+4]:=round(x3/SIZE);
  539.       memw[s1:a4+y*8+6]:=round(y3/SIZE);
  540.       w:=w-(SIZE/145.454545);
  541.       memw[s3:o3+y*2+65350]:=yc+yc*256;
  542.       memw[s3:o3+y*2+64600]:=((65536 div (2*(LINES-y)+KIM))+32768) mod 65536;
  543.    end;
  544. end;
  545.  
  546.  
  547. procedure DrawInside(xm,ym,r: integer); assembler;
  548. label q1,q2,q3,q4,picture_q1,picture_q2,drawline_q1,drawline_q2,einde
  549.       ,cx_q1,cy_q1,skipx_q1,skipx_q2,fillup,blkx_q1,blkx_q2
  550.       ,cx_q2,cy_q2,cy_q3,cx_q3,blkx_q3,skipx_q3,drawline_q3,picture_q3
  551.       ,nextx,picture_q4,cy_q4,cx_q4,blkx_q4,skipx_q4,drawline_q4,bklx_q4
  552.       ,bar_q1,bar_q2,bar_q3,bar_q4,drawsky,drawx,clear,uitgang,update,regels
  553.       ,bar_q11,bar_q22,bar_q33,bar_q44;
  554.  
  555.  
  556. { This version draws a floor, a ceiling and shaded walls. }
  557. { For other features, see previous procedure.             }
  558.  
  559. asm
  560.     cli
  561.     mov AX,[xm]
  562.     mov [xp],AX
  563.     mov AX,[ym]
  564.     mov [yp],AX
  565.     mov AX,[r]
  566.     mov [stackp],SP           { store SP                  }
  567.     mov [stacks],SS           { store SS                  }
  568.     mov [base],BP             { store BP                  }
  569.     mov SS,[s3]               { hoogte-tabel resetten     }
  570.     mov BX,65350              { adres color-tabel         }
  571.     mov [coltab],BX           { effe opslaan              }
  572.     mov BX,64600              { adres stepsize-tabel      }
  573.     mov [steptab],BX          { ook effe opslaan          }
  574.     mov BX,65000
  575.     mov CX,SIZE
  576.     mov DL,200-LINES
  577. fillup:
  578.     mov SS:[BX],DL
  579.     inc BX
  580.     loop fillup
  581.     mov byte ptr [hight],2*LINES+KIM
  582.     mov ES,[s4]
  583.     cmp AX,45                 { richting > 90?            }
  584.     jae q2
  585. q1:                           { rotaties van 0-89 graden  }
  586.     mov SP,AX                 { rotatie * 560 uitrekenen  }
  587.     mov DX,AX
  588.     shl AX,9                  { *512                      }
  589.     shl SP,5                  { *32                       }
  590.     shl DX,4                  { *16   512+32+16=560       }
  591.     add SP,AX
  592.     add SP,DX
  593.     add SP,32768              { adres na map-memory       }
  594.     mov [transp],SP           { store transtabel-pointer  }
  595.     mov BX,200*320+XPOS-2+2*SIZE
  596.     mov [screen],BX
  597.     mov BX,((198-2*LINES)-KIM)*320+XPOS-2+2*SIZE
  598.     mov [screen2],BX
  599.     mov [loop],LINES          { for loop=0 to 69          }
  600. picture_q1:
  601.     sub byte ptr [hight],2    { hoogteverschil scherm     }
  602.     mov SS,[s1]
  603.     mov SI,[transp]           { restore transtabel-pointer}
  604.     mov AX,SS:[SI]            { start x-coord lijn        }
  605.     add AX,[xp]
  606.     mov BP,SS:[SI+2]          { start y-coord lijn        }
  607.     add BP,[yp]
  608.     mov DX,SS:[SI+4]          { xplus                     }
  609.     mov DI,SS:[SI+6]          { yplus                     }
  610.     mov [xdelta],DX           { free registers, use mem.  }
  611.     mov [ydelta],DI           { idem                      }
  612.     add [transp],8            { alvast voor volgende lijn }
  613.     mov SI,AX                 { adres op map=             }
  614.     shr SI,9                  { bx shr 8+                 }
  615.     mov DI,BP                 { (cx shr 8)                }
  616.     shr DI,9
  617.     shl DI,7
  618.     add SI,DI                 { si= nu adres op map       }
  619.     mov [map],SI              { bewaar dat adres          }
  620.     mov DI,SS:[SI+16384]
  621.     mov SI,SS:[SI]            { en haal actuele veld op   }
  622.     shr SI,8                  { maar 1 byte graag         }
  623.     shl SI,10
  624.     shr DI,8
  625.     shl DI,10
  626.     mov [ceiling],DI
  627.     shl AX,7                  { laagste 7 bits * 512      }
  628.     shl BP,7                  { levert start-steps op     }
  629.     xor AH,128
  630.     xor BP,32768
  631.     sub [screen],320+2*SIZE
  632.     add [screen2],320-2*SIZE
  633.     mov SS,[s3]
  634.     mov DI,[coltab]           { haal adres colortabel     }
  635.     mov SP,SS:[DI]            { SP bevat colsize          }
  636.     add [coltab],2            { alvast voor volgende lijn }
  637.     mov [inner],SIZE          { dot-counter               }
  638.     mov [htable],64999
  639.     mov DL,0
  640. drawline_q1:
  641.     add [screen],2
  642.     add [screen2],2
  643.     inc [htable]
  644.     mov DI,[htable]
  645.     cmp SS:[DI],DL
  646.     jz  skipx_q1              { x niet meer behandelen    }
  647.     mov BX,SI                 { haal byte uit map-memory  }
  648.     mov BL,AH                 { VERY tricky piece of code }
  649.     shr BL,3
  650.     mov DI,BP
  651.     shr DI,11
  652.     shl DI,5
  653.     mov CL,SS:[DI+BX]
  654.     cmp CL,DL
  655.     jz blkx_q1                { teken muur, blokker x     }
  656.     mov CH,CL
  657.     add CX,SP
  658.     sub DI,SI
  659.     add DI,[ceiling]
  660.     mov BL,SS:[DI+BX]         { BL bevat plafond-pixel    }
  661.     mov BH,BL
  662.     add BX,SP                 { CH en CL donkerder maken  }
  663.     mov DI,[screen2]
  664.     mov ES:[DI],BX
  665.     mov DI,[screen]
  666.     mov ES:[DI],CX
  667.     add AX,[xdelta]
  668.     jo  cx_q1
  669.     add BP,[ydelta]
  670.     jo  cy_q1
  671.     dec [inner]
  672.     jnz drawline_q1
  673.     dec [loop]                { verlaag loopcounter       }
  674.     jnz picture_q1            { volgende lijn             }
  675.     jmp einde                 { verlaat routine           }
  676. skipx_q1:
  677.     add AX,[xdelta]
  678.     jo  cx_q1
  679.     add BP,[ydelta]
  680.     jo  cy_q1
  681.     dec [inner]
  682.     jnz drawline_q1
  683.     dec [loop]                { verlaag loopcounter       }
  684.     jnz picture_q1            { volgende lijn             }
  685.     jmp einde                 { verlaat routine           }
  686. blkx_q1:
  687.     mov DI,[htable]
  688.     mov SS:[DI],DL            { blokkeer x-coordinaat     }
  689.     mov CH,byte ptr[hight]
  690.     shr CX,8
  691.     add CL,3
  692.     mov DI,[screen]           { huidige schermadres       }
  693.     mov BL,1
  694.     add BX,SP
  695.     mov BH,BL
  696. bar_q1:
  697.     mov ES:[DI],BX
  698.     sub DI,320
  699.     loop bar_q1
  700.     add AX,[xdelta]
  701.     jo  cx_q1
  702.     add BP,[ydelta]
  703.     jo  cy_q1
  704.     dec [inner]
  705.     jnz drawline_q1
  706.     dec [loop]                { verlaag loopcounter       }
  707.     jnz picture_q1            { volgende lijn             }
  708.     jmp einde                 { verlaat routine           }
  709. cx_q1:
  710.     inc [map]
  711.     mov SS,[s1]
  712.     mov SI,[map]
  713.     mov DI,SI
  714.     add DI,16384
  715.     mov SI,SS:[SI]
  716.     mov DI,SS:[DI]
  717.     shr DI,8
  718.     shl DI,10
  719.     mov [ceiling],DI
  720.     shr SI,8
  721.     shl SI,10
  722.     add BP,[ydelta]
  723.     jo  cy_q1
  724.     mov SS,[s3]
  725.     dec [inner]
  726.     jnz drawline_q1
  727.     dec [loop]                { verlaag loopcounter       }
  728.     jnz picture_q1            { volgende lijn             }
  729.     jmp einde                 { verlaat routine           }
  730. cy_q1:
  731.     add [map],MWIDTH
  732.     mov SS,[s1]
  733.     mov SI,[map]
  734.     mov DI,SI
  735.     add DI,16384
  736.     mov SI,SS:[SI]
  737.     mov DI,SS:[DI]
  738.     shr DI,8
  739.     shl DI,10
  740.     mov [ceiling],DI
  741.     shr SI,8
  742.     shl SI,10
  743.     mov SS,[s3]
  744.     dec [inner]
  745.     jnz drawline_q1
  746.     dec [loop]                { verlaag loopcounter       }
  747.     jnz picture_q1            { volgende lijn             }
  748.     jmp einde                 { verlaat routine           }
  749.  
  750. q2:
  751.     sub AX,45
  752.     cmp AX,45
  753.     jae q3
  754.  
  755.     mov SP,AX                 { rotatie * 560 uitrekenen  }
  756.     mov DX,AX
  757.     shl AX,9                  { *512                      }
  758.     shl SP,5                  { *32                       }
  759.     shl DX,4                  { *16   512+32+16=560       }
  760.     add SP,AX
  761.     add SP,DX
  762.     add SP,32768              { adres na map-memory       }
  763.     mov [transp],SP           { store transtabel-pointer  }
  764.     mov BX,200*320+XPOS-2+2*SIZE
  765.     mov [screen],BX
  766.     mov BX,((198-2*LINES)-KIM)*320+XPOS-2+2*SIZE
  767.     mov [screen2],BX
  768.     mov [loop],LINES          { for loop=0 to 69          }
  769. picture_q2:
  770.     sub [hight],2             { hoogteverschil scherm     }
  771.     mov SS,[s1]
  772.     mov SI,[transp]           { restore transtabel-pointer}
  773.     mov AX,[xp]
  774.     sub AX,SS:[SI+2]          { start x-coord lijn        }
  775.     mov BP,SS:[SI]            { start y-coord lijn        }
  776.     add BP,[yp]
  777.     mov DX,SS:[SI+6]          { xmin                      }
  778.     mov DI,SS:[SI+4]          { yplus                     }
  779.     mov [xdelta],DX           { free registers, use mem.  }
  780.     mov [ydelta],DI           { idem                      }
  781.     add word ptr[transp],8    { alvast voor volgende lijn }
  782.     mov SI,AX                 { adres op map=             }
  783.     shr SI,9                  { bx shr 8+                 }
  784.     mov DI,BP                 { (cx shr 8)                }
  785.     shr DI,9
  786.     shl DI,7
  787.     add SI,DI                 { si= nu adres op map       }
  788.     mov [map],SI              { bewaar dat adres          }
  789.     mov DI,SS:[SI+16384]
  790.     mov SI,SS:[SI]            { en haal actuele veld op   }
  791.     shr SI,8                  { maar 1 byte graag         }
  792.     shl SI,10
  793.     shr DI,8
  794.     shl DI,10
  795.     mov [ceiling],DI
  796.     shl AX,7                  { laagste 7 bits * 512      }
  797.     shl BP,7                  { levert start-steps op     }
  798.     xor AH,128
  799.     xor BP,32768
  800.     sub [screen],320+2*SIZE
  801.     add [screen2],320-2*SIZE
  802.     mov SS,[s3]
  803.     mov DI,[coltab]           { haal adres colortabel     }
  804.     mov SP,SS:[DI]            { SP bevat colsize          }
  805.     add [coltab],2            { alvast voor volgende lijn }
  806.     mov [inner],SIZE          { dot-counter               }
  807.     mov [htable],64999
  808.     mov DL,0
  809. drawline_q2:
  810.     add [screen],2
  811.     add [screen2],2
  812.     inc [htable]
  813.     mov DI,[htable]
  814.     cmp SS:[DI],DL
  815.     jz  skipx_q2              { x niet meer behandelen    }
  816.     mov BX,SI                 { haal byte uit map-memory  }
  817.     mov BL,AH                 { VERY tricky piece of code }
  818.     shr BL,3
  819.     mov DI,BP
  820.     shr DI,11
  821.     shl DI,5
  822.     mov CL,SS:[DI+BX]
  823.     cmp CL,DL
  824.     jz blkx_q2                { teken muur, blokker x     }
  825.     mov CH,CL
  826.     add CX,SP
  827.     sub DI,SI
  828.     add DI,[ceiling]
  829.     mov BL,SS:[DI+BX]         { BL bevat plafond-pixel    }
  830.     mov BH,BL
  831.     add BX,SP                 { CH en CL donkerder maken  }
  832.     mov DI,[screen2]
  833.     mov ES:[DI],BX
  834.     mov DI,[screen]
  835.     mov ES:[DI],CX
  836.     sub AX,[xdelta]
  837.     jo  cx_q2
  838.     add BP,[ydelta]
  839.     jo  cy_q2
  840.     dec [inner]
  841.     jnz drawline_q2
  842.     dec [loop]                { verlaag loopcounter       }
  843.     jnz picture_q2            { volgende lijn             }
  844.     jmp einde                 { verlaat routine           }
  845. skipx_q2:
  846.     sub AX,[xdelta]
  847.     jo  cx_q2
  848.     add BP,[ydelta]
  849.     jo  cy_q2
  850.     dec [inner]
  851.     jnz drawline_q2
  852.     dec [loop]                { verlaag loopcounter       }
  853.     jnz picture_q2            { volgende lijn             }
  854.     jmp einde                 { verlaat routine           }
  855. blkx_q2:
  856.     mov DI,[htable]
  857.     mov SS:[DI],DL            { blokkeer x-coordinaat     }
  858.     mov CH,byte ptr[hight]
  859.     shr CX,8
  860.     add CL,3
  861.     mov DI,[screen]           { huidige schermadres       }
  862.     mov BL,1
  863.     add BX,SP
  864.     mov BH,BL
  865. bar_q2:
  866.     mov ES:[DI],BX
  867.     sub DI,320
  868.     loop bar_q2
  869.     sub AX,[xdelta]
  870.     jo  cx_q2
  871.     add BP,[ydelta]
  872.     jo  cy_q2
  873.     dec [inner]
  874.     jnz drawline_q2
  875.     dec [loop]                { verlaag loopcounter       }
  876.     jnz picture_q2            { volgende lijn             }
  877.     jmp einde                 { verlaat routine           }
  878. cx_q2:
  879.     dec [map]
  880.     mov SS,[s1]
  881.     mov SI,[map]
  882.     mov DI,SI
  883.     add DI,16384
  884.     mov SI,SS:[SI]
  885.     mov DI,SS:[DI]
  886.     shr DI,8
  887.     shl DI,10
  888.     mov [ceiling],DI
  889.     shr SI,8
  890.     shl SI,10
  891.     add BP,[ydelta]
  892.     jo  cy_q2
  893.     mov SS,[s3]
  894.     dec [inner]
  895.     jnz drawline_q2
  896.     dec [loop]                { verlaag loopcounter       }
  897.     jnz picture_q2            { volgende lijn             }
  898.     jmp einde                 { verlaat routine           }
  899. cy_q2:
  900.     add [map],MWIDTH
  901.     mov SS,[s1]
  902.     mov SI,[map]
  903.     mov DI,SI
  904.     add DI,16384
  905.     mov SI,SS:[SI]
  906.     mov DI,SS:[DI]
  907.     shr DI,8
  908.     shl DI,10
  909.     mov [ceiling],DI
  910.     shr SI,8
  911.     shl SI,10
  912.     mov SS,[s3]
  913.     dec [inner]
  914.     jnz drawline_q2
  915.     dec [loop]                { verlaag loopcounter       }
  916.     jnz picture_q2            { volgende lijn             }
  917.     jmp einde                 { verlaat routine           }
  918.  
  919. q3:
  920.     sub AX,45
  921.     cmp AX,45
  922.     jae q4
  923.  
  924.     mov SP,AX                 { rotatie * 560 uitrekenen  }
  925.     mov DX,AX
  926.     shl AX,9                  { *512                      }
  927.     shl SP,5                  { *32                       }
  928.     shl DX,4                  { *16   512+32+16=560       }
  929.     add SP,AX
  930.     add SP,DX
  931.     add SP,32768              { adres na map-memory       }
  932.     mov [transp],SP           { store transtabel-pointer  }
  933.     mov BX,200*320+XPOS-2+2*SIZE
  934.     mov [screen],BX
  935.     mov BX,((198-2*LINES)-KIM)*320+XPOS-2+2*SIZE
  936.     mov [screen2],BX
  937.     mov [loop],LINES          { for loop=0 to 69          }
  938. picture_q3:
  939.     sub [hight],2             { hoogteverschil scherm     }
  940.     mov SS,[s1]
  941.     mov SI,[transp]           { restore transtabel-pointer}
  942.     mov AX,[xp]
  943.     sub AX,SS:[SI]            { start x-coord lijn        }
  944.     mov BP,[yp]
  945.     sub BP,SS:[SI+2]          { start y-coord lijn        }
  946.     mov DX,SS:[SI+4]          { xmin                      }
  947.     mov DI,SS:[SI+6]          { ymin                      }
  948.     mov [xdelta],DX           { free registers, use mem.  }
  949.     mov [ydelta],DI           { idem                      }
  950.     add word ptr[transp],8    { alvast voor volgende lijn }
  951.     mov SI,AX                 { adres op map=             }
  952.     shr SI,9                  { bx shr 8+                 }
  953.     mov DI,BP                 { (cx shr 8)                }
  954.     shr DI,9
  955.     shl DI,7
  956.     add SI,DI                 { si= nu adres op map       }
  957.     mov [map],SI              { bewaar dat adres          }
  958.     mov DI,SS:[SI+16384]
  959.     mov SI,SS:[SI]            { en haal actuele veld op   }
  960.     shr SI,8                  { maar 1 byte graag         }
  961.     shl SI,10
  962.     shr DI,8
  963.     shl DI,10
  964.     mov [ceiling],DI
  965.     shl AX,7                  { laagste 7 bits * 512      }
  966.     shl BP,7                  { levert start-steps op     }
  967.     xor AH,128
  968.     xor BP,32768
  969.     sub [screen],320+2*SIZE
  970.     add [screen2],320-2*SIZE
  971.     mov SS,[s3]
  972.     mov DI,[coltab]           { haal adres colortabel     }
  973.     mov SP,SS:[DI]            { SP bevat colsize          }
  974.     add [coltab],2            { alvast voor volgende lijn }
  975.     mov [inner],SIZE          { dot-counter               }
  976.     mov [htable],64999
  977.     mov DL,0
  978. drawline_q3:
  979.     add [screen],2
  980.     add [screen2],2
  981.     inc [htable]
  982.     mov DI,[htable]
  983.     cmp SS:[DI],DL
  984.     jz  skipx_q3              { x niet meer behandelen    }
  985.     mov BX,SI                 { haal byte uit map-memory  }
  986.     mov BL,AH                 { VERY tricky piece of code }
  987.     shr BL,3
  988.     mov DI,BP
  989.     shr DI,11
  990.     shl DI,5
  991.     mov CL,SS:[DI+BX]
  992.     cmp CL,DL
  993.     jz blkx_q3                { teken muur, blokker x     }
  994.     mov CH,CL
  995.     add CX,SP
  996.     sub DI,SI
  997.     add DI,[ceiling]
  998.     mov BL,SS:[DI+BX]         { BL bevat plafond-pixel    }
  999.     mov BH,BL
  1000.     add BX,SP                 { CH en CL donkerder maken  }
  1001.     mov DI,[screen2]
  1002.     mov ES:[DI],BX
  1003.     mov DI,[screen]
  1004.     mov ES:[DI],CX
  1005.     sub AX,[xdelta]
  1006.     jo  cx_q3
  1007.     sub BP,[ydelta]
  1008.     jo  cy_q3
  1009.     dec [inner]
  1010.     jnz drawline_q3
  1011.     dec [loop]                { verlaag loopcounter       }
  1012.     jnz picture_q3            { volgende lijn             }
  1013.     jmp einde                 { verlaat routine           }
  1014. skipx_q3:
  1015.     sub AX,[xdelta]
  1016.     jo  cx_q3
  1017.     sub BP,[ydelta]
  1018.     jo  cy_q3
  1019.     dec [inner]
  1020.     jnz drawline_q3
  1021.     dec [loop]                { verlaag loopcounter       }
  1022.     jnz picture_q3            { volgende lijn             }
  1023.     jmp einde                 { verlaat routine           }
  1024. blkx_q3:
  1025.     mov DI,[htable]
  1026.     mov SS:[DI],DL            { blokkeer x-coordinaat     }
  1027.     mov CH,byte ptr[hight]
  1028.     shr CX,8
  1029.     add CL,3
  1030.     mov DI,[screen]           { huidige schermadres       }
  1031.     mov BL,1
  1032.     add BX,SP
  1033.     mov BH,BL
  1034. bar_q3:
  1035.     mov ES:[DI],BX
  1036.     sub DI,320
  1037.     loop bar_q3
  1038.     sub AX,[xdelta]
  1039.     jo  cx_q3
  1040.     sub BP,[ydelta]
  1041.     jo  cy_q3
  1042.     dec [inner]
  1043.     jnz drawline_q3
  1044.     dec [loop]                { verlaag loopcounter       }
  1045.     jnz picture_q3            { volgende lijn             }
  1046.     jmp einde                 { verlaat routine           }
  1047. cx_q3:
  1048.     dec [map]
  1049.     mov SS,[s1]
  1050.     mov SI,[map]
  1051.     mov DI,SI
  1052.     add DI,16384
  1053.     mov SI,SS:[SI]
  1054.     mov DI,SS:[DI]
  1055.     shr DI,8
  1056.     shl DI,10
  1057.     mov [ceiling],DI
  1058.     shr SI,8
  1059.     shl SI,10
  1060.     sub BP,[ydelta]
  1061.     jo  cy_q3
  1062.     mov SS,[s3]
  1063.     dec [inner]
  1064.     jnz drawline_q3
  1065.     dec [loop]                { verlaag loopcounter       }
  1066.     jnz picture_q3            { volgende lijn             }
  1067.     jmp einde                 { verlaat routine           }
  1068. cy_q3:
  1069.     sub [map],MWIDTH
  1070.     mov SS,[s1]
  1071.     mov SI,[map]
  1072.     mov DI,SI
  1073.     add DI,16384
  1074.     mov SI,SS:[SI]
  1075.     mov DI,SS:[DI]
  1076.     shr DI,8
  1077.     shl DI,10
  1078.     mov [ceiling],DI
  1079.     shr SI,8
  1080.     shl SI,10
  1081.     mov SS,[s3]
  1082.     dec [inner]
  1083.     jnz drawline_q3
  1084.     dec [loop]                { verlaag loopcounter       }
  1085.     jnz picture_q3            { volgende lijn             }
  1086.     jmp einde                 { verlaat routine           }
  1087.  
  1088. q4:                           {rotaties van 270-360 graden}
  1089.     sub AX,45
  1090.     mov SP,AX                 { rotatie * 560 uitrekenen  }
  1091.     mov DX,AX
  1092.     shl AX,9                  { *512                      }
  1093.     shl SP,5                  { *32                       }
  1094.     shl DX,4                  { *16   512+32+16=560       }
  1095.     add SP,AX
  1096.     add SP,DX
  1097.     add SP,32768              { adres na map-memory       }
  1098.     mov [transp],SP           { store transtabel-pointer  }
  1099.     mov BX,200*320+XPOS-2+2*SIZE
  1100.     mov [screen],BX
  1101.     mov BX,((198-2*LINES)-KIM)*320+XPOS-2+2*SIZE
  1102.     mov [screen2],BX
  1103.     mov [loop],LINES          { for loop=0 to 69          }
  1104. picture_q4:
  1105.     sub [hight],2             { hoogteverschil scherm     }
  1106.     mov SS,[s1]
  1107.     mov SI,[transp]           { restore transtabel-pointer}
  1108.     mov AX,SS:[SI+2]          { start x-coord lijn        }
  1109.     add AX,[xp]
  1110.     mov BP,[yp]
  1111.     sub BP,SS:[SI]            { start y-coord lijn        }
  1112.     mov DX,SS:[SI+6]          { xplus                     }
  1113.     mov DI,SS:[SI+4]          { ymin                      }
  1114.     mov [xdelta],DX           { free registers, use mem.  }
  1115.     mov [ydelta],DI           { idem                      }
  1116.     add word ptr[transp],8    { alvast voor volgende lijn }
  1117.     mov SI,AX                 { adres op map=             }
  1118.     shr SI,9                  { bx shr 8+                 }
  1119.     mov DI,BP                 { (cx shr 8)                }
  1120.     shr DI,9
  1121.     shl DI,7
  1122.     add SI,DI                 { si= nu adres op map       }
  1123.     mov [map],SI              { bewaar dat adres          }
  1124.     mov DI,SS:[SI+16384]
  1125.     mov SI,SS:[SI]            { en haal actuele veld op   }
  1126.     shr SI,8                  { maar 1 byte graag         }
  1127.     shl SI,10
  1128.     shr DI,8
  1129.     shl DI,10
  1130.     mov [ceiling],DI
  1131.     shl AX,7                  { laagste 7 bits * 512      }
  1132.     shl BP,7                  { levert start-steps op     }
  1133.     xor AH,128
  1134.     xor BP,32768
  1135.     sub [screen],320+2*SIZE
  1136.     add [screen2],320-2*SIZE
  1137.     mov SS,[s3]
  1138.     mov DI,[coltab]           { haal adres colortabel     }
  1139.     mov SP,SS:[DI]            { SP bevat colsize          }
  1140.     add [coltab],2            { alvast voor volgende lijn }
  1141.     mov [inner],SIZE          { dot-counter               }
  1142.     mov [htable],64999
  1143.     mov DL,0
  1144. drawline_q4:
  1145.     add [screen],2
  1146.     add [screen2],2
  1147.     inc [htable]
  1148.     mov DI,[htable]
  1149.     cmp SS:[DI],DL
  1150.     jz  skipx_q4              { x niet meer behandelen    }
  1151.     mov BX,SI                 { haal byte uit map-memory  }
  1152.     mov BL,AH                 { VERY tricky piece of code }
  1153.     shr BL,3
  1154.     mov DI,BP
  1155.     shr DI,11
  1156.     shl DI,5
  1157.     mov CL,SS:[DI+BX]
  1158.     cmp CL,DL
  1159.     jz blkx_q4                { teken muur, blokker x     }
  1160.     mov CH,CL
  1161.     add CX,SP
  1162.     sub DI,SI
  1163.     add DI,[ceiling]
  1164.     mov BL,SS:[DI+BX]         { BL bevat plafond-pixel    }
  1165.     mov BH,BL
  1166.     add BX,SP                 { CH en CL donkerder maken  }
  1167.     mov DI,[screen2]
  1168.     mov ES:[DI],BX
  1169.     mov DI,[screen]
  1170.     mov ES:[DI],CX
  1171.     add AX,[xdelta]
  1172.     jo  cx_q4
  1173.     sub BP,[ydelta]
  1174.     jo  cy_q4
  1175.     dec [inner]
  1176.     jnz drawline_q4
  1177.     dec [loop]                { verlaag loopcounter       }
  1178.     jnz picture_q4            { volgende lijn             }
  1179.     jmp einde                 { verlaat routine           }
  1180. skipx_q4:
  1181.     add AX,[xdelta]
  1182.     jo  cx_q4
  1183.     sub BP,[ydelta]
  1184.     jo  cy_q4
  1185.     dec [inner]
  1186.     jnz drawline_q4
  1187.     dec [loop]                { verlaag loopcounter       }
  1188.     jnz picture_q4            { volgende lijn             }
  1189.     jmp einde                 { verlaat routine           }
  1190. blkx_q4:
  1191.     mov DI,[htable]
  1192.     mov SS:[DI],DL            { blokkeer x-coordinaat     }
  1193.     mov CH,byte ptr[hight]
  1194.     shr CX,8
  1195.     add CL,3
  1196.     mov DI,[screen]           { huidige schermadres       }
  1197.     mov BL,1
  1198.     add BX,SP
  1199.     mov BH,BL
  1200. bar_q4:
  1201.     mov ES:[DI],BX
  1202.     sub DI,320
  1203.     loop bar_q4
  1204.     add AX,[xdelta]
  1205.     jo  cx_q4
  1206.     sub BP,[ydelta]
  1207.     jo  cy_q4
  1208.     dec [inner]
  1209.     jnz drawline_q4
  1210.     dec [loop]                { verlaag loopcounter       }
  1211.     jnz picture_q4            { volgende lijn             }
  1212.     jmp einde                 { verlaat routine           }
  1213. cx_q4:
  1214.     inc [map]
  1215.     mov SS,[s1]
  1216.     mov SI,[map]
  1217.     mov DI,SI
  1218.     add DI,16384
  1219.     mov SI,SS:[SI]
  1220.     mov DI,SS:[DI]
  1221.     shr DI,8
  1222.     shl DI,10
  1223.     mov [ceiling],DI
  1224.     shr SI,8
  1225.     shl SI,10
  1226.     sub BP,[ydelta]
  1227.     jo  cy_q4
  1228.     mov SS,[s3]
  1229.     dec [inner]
  1230.     jnz drawline_q4
  1231.     dec [loop]                { verlaag loopcounter       }
  1232.     jnz picture_q4            { volgende lijn             }
  1233.     jmp einde                 { verlaat routine           }
  1234. cy_q4:
  1235.     sub [map],MWIDTH
  1236.     mov SS,[s1]
  1237.     mov SI,[map]
  1238.     mov DI,SI
  1239.     add DI,16384
  1240.     mov SI,SS:[SI]
  1241.     mov DI,SS:[DI]
  1242.     shr DI,8
  1243.     shl DI,10
  1244.     mov [ceiling],DI
  1245.     shr SI,8
  1246.     shl SI,10
  1247.     mov SS,[s3]
  1248.     dec [inner]
  1249.     jnz drawline_q4
  1250.     dec [loop]                { verlaag loopcounter       }
  1251.     jnz picture_q4            { volgende lijn             }
  1252.     jmp einde                 { verlaat routine           }
  1253.  
  1254. einde:
  1255.     mov DI,XPOS+((199-LINES)-KIM)*320
  1256.                               { beginadres huidige x      }
  1257.     mov BP,SIZE               { loopcounter (horizontaal  }
  1258.     mov SI,65000              { adres htable              }
  1259.     mov AL,0
  1260.     mov DL,255*HAZE
  1261.     mov DH,DL
  1262. clear:
  1263.     cmp SS:[SI],AL            { staat daar een muur?      }
  1264.     jz nextx                  { ja: volgende x positie    }
  1265.     mov CX,KIM+1              { anders lijntje trekken    }
  1266.     mov BX,DI                 { haal beginadres op        }
  1267. drawx:
  1268.     mov ES:[BX],DX            { zet een byte neer         }
  1269.     add BX,320                { volgende regel            }
  1270.     loop drawx
  1271. nextx:
  1272.     add DI,2
  1273.     inc SI
  1274.     dec BP                    { volgende kolom graag      }
  1275.     jnz clear
  1276.  
  1277.     mov BP,XPOS+199*320
  1278.     mov DL,2*LINES+KIM
  1279.     mov AX,0A000h
  1280.     mov SS,AX
  1281. regels:
  1282.     mov CX,(SIZE)             {copieer werkscherm naar beeld}
  1283.     mov BX,BP
  1284.     sub BP,320
  1285. update:
  1286.     mov AX,ES:[BX]
  1287.     mov SS:[BX],AX
  1288.     add BX,2
  1289.     loop update
  1290.     dec DL
  1291.     jnz regels
  1292.  
  1293.     mov SS,[stacks]
  1294.     mov SP,[stackp]
  1295.     mov BP,[base]
  1296.     sti
  1297.  
  1298. end;
  1299.  
  1300.  
  1301. procedure Demo;
  1302. var x,y,r: integer;
  1303. begin
  1304.    x:=0;
  1305.    y:=0;
  1306.    r:=45;
  1307. end;
  1308.  
  1309. begin
  1310.     for i:=0 to 360 do begin
  1311.        sn[i]:=sin((i*3.14159)/180);
  1312.        cs[i]:=cos((i*3.14159)/180);
  1313.     end;
  1314.     DummyBitmaps(p3);                     {p3=pointer naar bitmaps}
  1315.     s3:=Seg(p3^);
  1316.     o3:=Ofs(p3^);
  1317.     DummySource(p1);                      {p1=pointer naar map-geheugen}
  1318.     s1:=Seg(p1^);
  1319.     o1:=Ofs(p1^);
  1320.     GetMem(p4,64000);                     {werkscherm}
  1321.     s4:=Seg(p4^);
  1322.     o4:=Ofs(p4^);
  1323.     for i:=0 to 15999 do meml[s4:o4+i shl 2]:=0;
  1324.     for i:=0 to 44 do MakeTransTabel(i);
  1325.  
  1326.     InitScreen;
  1327.     NCls(0);
  1328.     SetPalette;
  1329.  
  1330.     assign(f,'3dspace.wad');
  1331.     rewrite(f,1);
  1332.     BlockWrite(f,p1^,65535);
  1333.     BlockWrite(f,p3^,65535);
  1334.     close(f);
  1335.  
  1336.     repeat
  1337.        i:=0;
  1338.        s:=1;
  1339.        r:=90;
  1340.        repeat
  1341.           inc(i,s div 4);
  1342.           inc(s);
  1343.           DrawInside(0,-15000+i*8,r);
  1344.           ScrollLava;
  1345.        until (i>3400) or (keypressed);
  1346.        if not keypressed then begin
  1347.           repeat
  1348.              dec(i,s div 4);
  1349.              dec(s);
  1350.              DrawInside(0,-15000+i*8,r);
  1351.              ScrollLava;
  1352.              inc(r,2);
  1353.              if r=180 then r:=0;
  1354.           until (((i*8)<1000) and (r=0)) or (keypressed);
  1355.        end;
  1356.        if not keypressed then begin
  1357.           if r>90 then for s:=0 to (r-90) do DrawInside(0,-15000+i*8,r-s)
  1358.                   else for s:=r to 90 do DrawInside(0,-15000+i*8,s);
  1359.        end;
  1360.        if not keypressed then begin
  1361.           for s:=0 to (-15000+i*8) do DrawInside(0,(-15000+i*8)-s,90);
  1362.        end;
  1363.     until keypressed;
  1364.     NCls(0);
  1365.     TextMode(LastMode);
  1366.     ClrScr;
  1367.     Writeln('THE PHANTOM - INDEPENDENT CODER');
  1368.     Writeln;
  1369.     Writeln('This is the promissed update to the 3D-engine I uploaded to several');
  1370.     Writeln('BBS''es two weeks ago. This algoritm does not support backgrounds');
  1371.     Writeln('anymore, because there''s a roof, and usually you don''t look trough a');
  1372.     Writeln('ceiling, do you? Anyway, everything looks much better now, it should be');
  1373.     Writeln('slightly faster on local-bus computers (other computers have to wait for');
  1374.     Writeln('their slow videocards to draw the pictures).');
  1375.     Writeln;
  1376.     Writeln('The features of this version are:');
  1377.     Writeln('-Fully texture-mapped floors and ceilings, no limitations');
  1378.     Writeln('-Shaded and curved walls (curves not demonstrated here)');
  1379.     Writeln('-Animated tiles, look at the lava');
  1380.     Writeln('-A better animation-sequence');
  1381.     Writeln('-Source included! (call me if your syzo deleted it)');
  1382.     Writeln;
  1383.     Writeln('About the source: I would not be happy if OCEAN comes up with this great');
  1384.     Writeln('game in the summer, featuring, guess what, an all new 3D engine, so this');
  1385.     Writeln('engine may be used, but only for NON-COMMERCIAL purposes.');
  1386.     Writeln('And if you wish to release an awesome demo featuring MY 3D-engine, just');
  1387.     Writeln('show my name (THE PHANTOM) somewhere.');
  1388.     Writeln;
  1389.     Writeln('Well, this looks like the bottom of the screen, so, see you, enjoy life,');
  1390.     Writeln('call MEGAVOLT BBS, greetings from');
  1391.     Write  ('                                                          THE PHANTOM!');
  1392.     gotoxy(1,1);
  1393.     repeat
  1394.        b:=ord(readkey);
  1395.     until not(keypressed);
  1396.     repeat
  1397.     until keypressed;
  1398.     ClrScr;
  1399.     Writeln('Thanx for watching our show.');
  1400.     Writeln;
  1401.     Writeln('Don''t forget to call MEGAVOLT BBS for the latest games, a cool ratio-');
  1402.     Writeln('system, and the latest PHANTOM sources. Just DIAL:  030-211143');
  1403.     Writeln;
  1404. end.
  1405.