home *** CD-ROM | disk | FTP | other *** search
/ ST-Computer Leser 2002 January / STC_CD_01_2002.iso / GAMES / WINLABY / SOURCE / WL_DRAW.C < prev    next >
C/C++ Source or Header  |  1997-08-04  |  5KB  |  176 lines

  1. // ### Winlaby: Zeichen-Funktionen ###
  2.  
  3. #include <aes.h>
  4. #include <vdi.h>
  5.  
  6. /* Externe Variablen: */
  7. extern int xy[];
  8. extern int vhandle;
  9. extern GRECT wnd;
  10. extern int xpos, ypos;
  11. extern int zielx, ziely;
  12. extern unsigned char orttyp[21][21];
  13. extern int richtung;
  14. extern int pmode;
  15.  
  16. /* ****Diese Funktion zeichnet eine Seitenwand des Ganges**** */
  17. void draw_wall(int z, int lr, int mx, int my, int x_b, int y_h)
  18. {
  19.  x_b=x_b*3/2 ; y_h=y_h*3/2;
  20.  xy[0]=mx+lr*x_b/z        ; xy[1]=my-y_h/z;
  21.  xy[2]=xy[0]                ; xy[3]=my+y_h/z;
  22.  xy[4]=mx+lr*x_b/(z+1) ; xy[5]=my+y_h/(z+1);
  23.  xy[6]=xy[4]                ; xy[7]=my-y_h/(z+1);
  24.  xy[8]=xy[0]                ; xy[9]=xy[1];
  25.  switch(pmode)
  26.   {
  27.    case 1: v_pline(vhandle,5,xy); break;
  28.    case 2: v_fillarea(vhandle,5,xy); break;
  29.   }
  30. }
  31.  
  32.  
  33. /* ****Nun kommt die Funktion, die einen Seitengang zeichnet**** */
  34. void draw_corridor(int z, int lr, int mx, int my, int x_b, int y_h)
  35. {
  36.  x_b=x_b*3/2 ; y_h=y_h*3/2;
  37.  xy[0]=mx+lr*x_b/z        ; xy[1]=my-y_h/(z+1);
  38.  xy[2]=mx+lr*x_b/(z+1) ; xy[3]=xy[1];
  39.  xy[4]=xy[2]                ; xy[5]=my+y_h/(z+1);
  40.  xy[6]=xy[0]                ; xy[7]=xy[5];
  41.  switch(pmode)
  42.   {
  43.    case 1: v_pline(vhandle,4,xy); break;
  44.    case 2: v_fillarea(vhandle,4,xy); break;
  45.   }
  46. }
  47.  
  48.  
  49. /* ****Labyausgang zeichnen**** */
  50. void draw_exit(int z, int mx, int my, int x_b, int y_h)
  51. {
  52.  x_b=x_b*3/2 ; y_h=y_h*3/2;
  53.  xy[0]=mx+x_b/z        ; xy[1]=my+y_h/z;
  54.  xy[2]=mx+x_b/(z+1) ; xy[3]=my+y_h/(z+1);
  55.  xy[4]=mx-x_b/(z+1) ; xy[5]=xy[3];
  56.  xy[6]=mx-x_b/z        ; xy[7]=xy[1];
  57.  vsf_interior(vhandle,2); vsf_style(vhandle,1);
  58.  v_fillarea(vhandle,4,xy);
  59.  vsf_interior(vhandle,0); vsf_style(vhandle,0);
  60. }
  61.  
  62.  
  63. /* ****Labyrinth zeichnen, Hauptfunktion**** */
  64. void draw_laby()
  65. {
  66.  int wand_z=0;             /* Variable für Länge des Ganges */
  67.  int i;                    /* Zählvariable      */
  68.  int mx,my,max_w,max_h;
  69.  
  70.  switch(pmode)            /* Fenster löschen */
  71.   {
  72.    case 1:
  73.       xy[0]=wnd.g_x;            xy[1]=wnd.g_y;
  74.       xy[2]=wnd.g_x+wnd.g_w-1;    xy[3]=wnd.g_y+wnd.g_h-1;
  75.       v_bar(vhandle,xy);
  76.       break;
  77.    case 2:
  78.       vsf_interior(vhandle,2); vsf_style(vhandle,2); vsf_color(vhandle,2);
  79.       xy[0]=wnd.g_x;            xy[1]=wnd.g_y;
  80.       xy[2]=wnd.g_x+wnd.g_w-1;    xy[3]=wnd.g_y+wnd.g_h/2;
  81.       v_bar(vhandle,xy);
  82.       vsf_interior(vhandle,2); vsf_style(vhandle,6); vsf_color(vhandle,3);
  83.       xy[1]=wnd.g_y+wnd.g_h/2 ;    xy[3]=wnd.g_y+wnd.g_h-1;
  84.       v_bar(vhandle,xy);
  85.       break;
  86.   }
  87.  
  88.  max_w=wnd.g_w/2;     max_h=wnd.g_h/2;
  89.  mx=wnd.g_x+max_w;    my=wnd.g_y+max_h;
  90.  
  91.  vsf_color(vhandle,1); vsf_interior(vhandle,0); vsf_style(vhandle,0);
  92.  
  93.  /*--- Gang zeichnen ---*/
  94.  switch(richtung)
  95.  {
  96.   case 1:
  97.      for(i=ypos;i>0;i--)
  98.       {
  99.         wand_z++;
  100.         if(orttyp[xpos][i]==1) break;
  101.         if(xpos==zielx && i==ziely)  draw_exit(wand_z,mx,my,max_w,max_h);
  102.         switch(orttyp[xpos-1][i])
  103.          {
  104.           case 1: draw_wall(wand_z, -1, mx, my, max_w, max_h); break;
  105.           default: draw_corridor(wand_z, -1, mx, my, max_w, max_h); break;
  106.          }
  107.         switch(orttyp[xpos+1][i])
  108.          {
  109.           case 1: draw_wall(wand_z, 1, mx,my,max_w,max_h); break;
  110.           default: draw_corridor(wand_z, 1, mx,my,max_w,max_h); break;
  111.          }
  112.       }
  113.      break;
  114.   case 2:
  115.      for(i=xpos;i<=20;i++)
  116.       {
  117.         wand_z++;
  118.         if(orttyp[i][ypos]==1)    break;
  119.         if(ypos==ziely && i==zielx)  draw_exit(wand_z,mx,my,max_w,max_h);
  120.         switch(orttyp[i][ypos-1])
  121.          {
  122.           case 1: draw_wall(wand_z, -1, mx,my,max_w,max_h); break;
  123.           default: draw_corridor(wand_z, -1, mx,my,max_w,max_h); break;
  124.          }
  125.         switch(orttyp[i][ypos+1])
  126.          {
  127.           case 1: draw_wall(wand_z, 1, mx,my,max_w,max_h); break;
  128.           default: draw_corridor(wand_z,1, mx,my,max_w,max_h); break;
  129.          }
  130.       }
  131.      break;
  132.   case 3:
  133.      for(i=ypos;i<=20;i++)
  134.       {
  135.         wand_z++;
  136.         if(orttyp[xpos][i]==1)    break;
  137.         if(xpos==zielx && i==ziely)  draw_exit(wand_z,mx,my,max_w,max_h);
  138.         switch(orttyp[xpos+1][i])
  139.          {
  140.           case 1: draw_wall(wand_z, -1, mx,my,max_w,max_h); break;
  141.           default: draw_corridor(wand_z, -1, mx,my,max_w,max_h); break;
  142.          }
  143.         switch(orttyp[xpos-1][i])
  144.          {
  145.           case 1: draw_wall(wand_z, 1, mx,my,max_w,max_h); break;
  146.           default: draw_corridor(wand_z, 1, mx,my,max_w,max_h); break;
  147.          }
  148.       }
  149.      break;
  150.   case 4:
  151.      for(i=xpos;i>0;i--)
  152.       {
  153.         wand_z++;
  154.         if(orttyp[i][ypos]==1)    break;
  155.         if(ypos==ziely && i==zielx)  draw_exit(wand_z,mx,my,max_w,max_h);
  156.         switch(orttyp[i][ypos+1])
  157.          {
  158.           case 1: draw_wall(wand_z, -1, mx,my,max_w,max_h); break;
  159.           default: draw_corridor(wand_z, -1, mx,my,max_w,max_h); break;
  160.          }
  161.         switch(orttyp[i][ypos-1])
  162.          {
  163.           case 1: draw_wall(wand_z, 1, mx,my,max_w,max_h); break;
  164.           default: draw_corridor(wand_z, 1, mx,my,max_w,max_h); break;
  165.          }
  166.       }
  167.      break;
  168.  }
  169.  
  170.  xy[0]=mx-max_w*3/2/wand_z;
  171.  xy[1]=my-max_h*3/2/wand_z;    /* Koordinaten für Gangende ausrechnen */
  172.  xy[2]=mx+max_w*3/2/wand_z;
  173.  xy[3]=my+max_h*3/2/wand_z;
  174.  v_bar(vhandle,xy);            /* Gangende zeichnen */
  175. }
  176.