--- /dev/null
+// WOLFHACK.C\r
+\r
+#include "WL_DEF.H"\r
+\r
+#define MAXVIEWHEIGHT 200\r
+\r
+int spanstart[MAXVIEWHEIGHT/2];\r
+\r
+fixed stepscale[MAXVIEWHEIGHT/2];\r
+fixed basedist[MAXVIEWHEIGHT/2];\r
+\r
+extern char far planepics[8192]; // 4k of ceiling, 4k of floor\r
+\r
+int halfheight = 0;\r
+\r
+byte far *planeylookup[MAXVIEWHEIGHT/2];\r
+unsigned mirrorofs[MAXVIEWHEIGHT/2];\r
+\r
+fixed psin, pcos;\r
+\r
+fixed FixedMul (fixed a, fixed b)\r
+{\r
+ return (a>>8)*(b>>8);\r
+}\r
+\r
+\r
+int mr_rowofs;\r
+int mr_count;\r
+int mr_xstep;\r
+int mr_ystep;\r
+int mr_xfrac;\r
+int mr_yfrac;\r
+int mr_dest;\r
+\r
+\r
+/*\r
+==============\r
+=\r
+= DrawSpans\r
+=\r
+= Height ranges from 0 (infinity) to viewheight/2 (nearest)\r
+==============\r
+*/\r
+\r
+void DrawSpans (int x1, int x2, int height)\r
+{\r
+ fixed length;\r
+ int ofs;\r
+ int prestep;\r
+ fixed startxfrac, startyfrac;\r
+\r
+ int x, startx, count, plane, startplane;\r
+ byte far *toprow, far *dest;\r
+\r
+ toprow = planeylookup[height]+bufferofs;\r
+ mr_rowofs = mirrorofs[height];\r
+\r
+ mr_xstep = (psin<<1)/height;\r
+ mr_ystep = (pcos<<1)/height;\r
+\r
+ length = basedist[height];\r
+ startxfrac = (viewx + FixedMul(length,pcos));\r
+ startyfrac = (viewy - FixedMul(length,psin));\r
+\r
+// draw two spans simultaniously\r
+\r
+ plane = startplane = x1&3;\r
+ prestep = viewwidth/2 - x1;\r
+ do\r
+ {\r
+ outportb (SC_INDEX+1,1<<plane);\r
+ mr_xfrac = startxfrac - (mr_xstep>>2)*prestep;\r
+ mr_yfrac = startyfrac - (mr_ystep>>2)*prestep;\r
+\r
+ startx = x1>>2;\r
+ mr_dest = (unsigned)toprow + startx;\r
+ mr_count = ((x2-plane)>>2) - startx + 1;\r
+ x1++;\r
+ prestep--;\r
+ if (mr_count)\r
+ MapRow ();\r
+ plane = (plane+1)&3;\r
+ } while (plane != startplane);\r
+\r
+}\r
+\r
+\r
+\r
+\r
+/*\r
+===================\r
+=\r
+= SetPlaneViewSize\r
+=\r
+===================\r
+*/\r
+\r
+void SetPlaneViewSize (void)\r
+{\r
+ int x,y;\r
+ byte far *dest, far *src;\r
+\r
+ halfheight = viewheight>>1;\r
+\r
+\r
+ for (y=0 ; y<halfheight ; y++)\r
+ {\r
+ planeylookup[y] = (byte far *)0xa0000000l + (halfheight-1-y)*SCREENBWIDE;;\r
+ mirrorofs[y] = (y*2+1)*SCREENBWIDE;\r
+\r
+ stepscale[y] = y*GLOBAL1/32;\r
+ if (y>0)\r
+ basedist[y] = GLOBAL1/2*scale/y;\r
+ }\r
+\r
+ src = PM_GetPage(0);\r
+ dest = planepics;\r
+ for (x=0 ; x<4096 ; x++)\r
+ {\r
+ *dest = *src++;\r
+ dest += 2;\r
+ }\r
+ src = PM_GetPage(1);\r
+ dest = planepics+1;\r
+ for (x=0 ; x<4096 ; x++)\r
+ {\r
+ *dest = *src++;\r
+ dest += 2;\r
+ }\r
+\r
+}\r
+\r
+\r
+/*\r
+===================\r
+=\r
+= DrawPlanes\r
+=\r
+===================\r
+*/\r
+\r
+void DrawPlanes (void)\r
+{\r
+ int height, lastheight;\r
+ int x;\r
+\r
+ if (viewheight>>1 != halfheight)\r
+ SetPlaneViewSize (); // screen size has changed\r
+\r
+\r
+ psin = viewsin;\r
+ if (psin < 0)\r
+ psin = -(psin&0xffff);\r
+ pcos = viewcos;\r
+ if (pcos < 0)\r
+ pcos = -(pcos&0xffff);\r
+\r
+//\r
+// loop over all columns\r
+//\r
+ lastheight = halfheight;\r
+\r
+ for (x=0 ; x<viewwidth ; x++)\r
+ {\r
+ height = wallheight[x]>>3;\r
+ if (height < lastheight)\r
+ { // more starts\r
+ do\r
+ {\r
+ spanstart[--lastheight] = x;\r
+ } while (lastheight > height);\r
+ }\r
+ else if (height > lastheight)\r
+ { // draw spans\r
+ if (height > halfheight)\r
+ height = halfheight;\r
+ for ( ; lastheight < height ; lastheight++)\r
+ DrawSpans (spanstart[lastheight], x-1, lastheight);\r
+ }\r
+ }\r
+\r
+ height = halfheight;\r
+ for ( ; lastheight < height ; lastheight++)\r
+ DrawSpans (spanstart[lastheight], x-1, lastheight);\r
+}\r
+\r