home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 4: Phase Four / 17Bit_Phase_Four.iso / files / 3185.dms / 3185.adf / Quadrix.c < prev    next >
C/C++ Source or Header  |  1994-09-15  |  18KB  |  796 lines

  1. /*    QUADRIX
  2.     written by Kai Karsten
  3.            Saalestr.7
  4.            3300 Braunschweig
  5.  
  6.     Compiler:    Aztec C v3.4
  7.     Options :    cc +l -e300
  8.             ln -lm32 -lc32
  9. */
  10.  
  11. #include <stdio.h>
  12. #include <math.h>
  13. #include <ctype.h>
  14. #include <fcntl.h>
  15. #include <functions.h>
  16. #include <exec/types.h>
  17. #include <exec/io.h>
  18. #include <exec/exec.h>
  19. #include <exec/devices.h>
  20. #include <exec/memory.h>
  21. #include <graphics/gfx.h>
  22. #include <graphics/rastport.h>
  23. #include <graphics/copper.h>
  24. #include <graphics/view.h>
  25. #include <graphics/gels.h>
  26. #include <graphics/regions.h>
  27. #include <graphics/clip.h>
  28. #include <graphics/layers.h>
  29. #include <graphics/display.h>
  30. #include <graphics/gfxmacros.h>
  31. #include <graphics/gfxbase.h>
  32. #include <devices/keyboard.h>
  33. #include <devices/inputevent.h>
  34. #include <intuition/intuition.h>
  35. #include <intuition/intuitionbase.h>
  36. #include <libraries/mathffp.h>
  37. #include <math.h>
  38.  
  39. #define DUAL1    0
  40. #define DUAL2    1
  41. #define DBUFF1    DUAL1
  42. #define DBUFF2    DUAL2+1
  43.  
  44. struct View        View;
  45. struct ViewPort        ViewPort;
  46. struct RasInfo        RasInfos[3];
  47. struct BitMap        BitMaps[3];
  48. struct RastPort        RastPorts[3];
  49. struct TmpRas        tmpras;
  50. struct AreaInfo        areainfo;
  51. struct GfxBase        *GfxBase;
  52. struct View        *OldView;
  53. struct cprlist        *LOF[2];
  54. struct IntuitionBase    *IntuitionBase;
  55. struct Window        *DummyWindow;
  56. struct IntuiMessage    *Message;
  57.  
  58. struct NewWindow FirstNewWindow =
  59. {
  60.  0,0,0,0,0,1,RAWKEY|INACTIVEWINDOW|INTUITICKS,
  61.  NOCAREREFRESH|ACTIVATE|BORDERLESS|BACKDROP,
  62.  NULL,NULL,NULL,NULL,NULL,0,0,0,0,WBENCHSCREEN
  63. };
  64.  
  65. extern struct ColorMap    *GetColorMap();
  66.  
  67. UWORD ColorTable[16] = {0x000,0xFFF,0x708,0x50F,
  68.             0x483,0xFA2,0xF72,0xC00,
  69.             0x000,0xFFF,0x708,0x50F,
  70.             0x483,0xFA2,0xF72,0xC00};
  71.  
  72. UWORD UnvisibleImage[6] =
  73. {
  74.  0,0,0x0000,0x0000,0,0
  75. };
  76.  
  77. SHORT punktdaten[9][27] =    {
  78.     {1,1, 8,-1,-1, 1,-1, 1, 1,-1, 1},
  79.     {2,1, 8,-2,-1, 2,-1, 2, 1,-2, 1},
  80.     {2,1, 8,-3,-1, 3,-1, 3, 1,-3, 1},
  81.     {2,2,16,-3, 0,-1, 0,-1,-2, 1,-2, 1, 0, 3, 0, 3, 2,-3, 2},
  82.     {2,2,12,-3, 0, 1, 0, 1,-2, 3,-2, 3, 2,-3, 2},
  83.     {2,2,16,-3,-2, 1,-2, 1, 0, 3, 0, 3, 2,-1, 2,-1, 0,-3, 0},
  84.     {2,2, 8,-2,-2, 2,-2, 2, 2,-2, 2},
  85.     {2,2,24,-3,-1,-1,-1,-1,-3, 1,-3, 1,-1, 3,-1, 3, 1, 1, 1, 1, 3,-1, 3,-1, 1,-3, 1},
  86.     {2,2,16,-3,-2,-1,-2,-1, 0, 1, 0, 1,-2, 3,-2, 3, 2,-3, 2}
  87.                 };
  88.  
  89. SHORT cubedaten[9][11] =    {
  90.     {1, 0, 0},
  91.     {2,-1, 0, 1, 0},
  92.     {3,-2, 0, 0, 0, 2, 0},
  93.     {4,-2, 1, 0, 1, 2, 1, 0,-1},
  94.     {4, 2,-1,-2, 1, 0, 1, 2, 1},
  95.     {4,-2,-1, 0,-1, 0, 1, 2, 1},
  96.     {4,-1,-1,-1, 1, 1,-1, 1, 1},
  97.     {5, 0, 0,-2, 0, 0,-2, 2, 0, 0, 2},
  98.     {5,-2,-1,-2, 1, 0, 1, 2, 1, 2,-1},
  99.                 };
  100.  
  101. SHORT scoredaten[9] = {10,50,100,250,200,300,150,500,400};
  102.  
  103. SHORT perspektive[13] = {10,12,14,16,18,20,23,26,30,34,39,44,51};
  104.  
  105. UWORD BUFF[2]={DBUFF1,DBUFF2};
  106.  
  107. PLANEPTR mem;
  108. LONG timer,intervall,planes,bricks,score,pause,sec,micsec;
  109. WORD areabuffer[250];
  110. UWORD koordx[6][6][13];
  111. UWORD koordy[6][6][13];
  112. BOOL  cube[5][5][12],draw,gameover,fillkoerper,exitgame,trig1=0,trig2=0;
  113. SHORT p[2][2][24][3],liniendaten[9][73],plane[12];
  114. SHORT xort,yort,zort,panz,lanz,canz,nummer,maxheight;
  115. DOUBLE ran();
  116.  
  117. ClearKoerperData()
  118. {
  119.  SHORT i,j;
  120.  
  121.  for(i=0;i<24;i++)
  122.   for(j=0;j<3;j++)
  123.     p[0][0][i][j]=p[0][1][i][j]=p[1][0][i][j]=p[1][1][i][j]=0;
  124. }
  125.  
  126. ClearCubesData()
  127. {
  128.  SHORT i,j,k;
  129.  
  130.  timer=maxheight=planes=score=0;
  131.  bricks=1;
  132.  intervall = pause = 50;
  133.  gameover = draw = FALSE;
  134.  
  135.  for(i=0;i<5;i++)
  136.   for(j=0;j<5;j++)
  137.    for(k=0;k<12;k++)
  138.     cube[i][j][k]=FALSE;
  139.  for(i=0;i<12;i++)
  140.   plane[i]=0;
  141. }
  142.  
  143. ReadKoerperData()
  144. {
  145.  SHORT i;
  146.  
  147.  xort=punktdaten[nummer][0]+4;
  148.  yort=punktdaten[nummer][1]+4;
  149.  zort=23;
  150.  panz=punktdaten[nummer][2];
  151.  lanz=liniendaten[nummer][0];
  152.  canz=cubedaten[nummer][0];
  153.  for(i=0;i<panz;i+=2)
  154.  {
  155.   p[0][trig2][i][0]=p[0][trig2][i+1][0]=punktdaten[nummer][i+3];
  156.   p[0][trig2][i][1]=p[0][trig2][i+1][1]=punktdaten[nummer][i+4];
  157.   p[0][trig2][i][2]=-1;
  158.   p[0][trig2][i+1][2]=1;
  159.   p[1][trig2][i>>1][0]=cubedaten[nummer][i+1];
  160.   p[1][trig2][i>>1][1]=cubedaten[nummer][i+2];
  161.   p[1][trig2][i>>1][2]=0;
  162.  }
  163. }
  164.  
  165. RotateKoerper(achse,rchtg)
  166. SHORT achse,rchtg;
  167. {
  168.  BOOL MoveDown = FALSE;
  169.  SHORT i,x,y,z,px,py,pz,cx,cy,cz;
  170.  
  171.  draw = TRUE;
  172.  for(i=0;i<panz;i++)
  173.  {
  174.   px=p[0][trig2][i][0];
  175.   py=p[0][trig2][i][1];
  176.   pz=p[0][trig2][i][2];
  177.   cx=p[1][trig2][i][0];
  178.   cy=p[1][trig2][i][1];
  179.   cz=p[1][trig2][i][2];
  180.  
  181.   switch(achse)
  182.   {
  183.    case 1:
  184.     p[0][trig2^1][i][0]=px;            /* x-Achse */
  185.     p[0][trig2^1][i][1]=rchtg*pz;
  186.     p[0][trig2^1][i][2]=-rchtg*py; 
  187.     p[1][trig2^1][i][0]=cx;
  188.     p[1][trig2^1][i][1]=rchtg*cz;
  189.     p[1][trig2^1][i][2]=-rchtg*cy; 
  190.     break;
  191.    case 2:
  192.     p[0][trig2^1][i][0]=rchtg*pz;        /* y-Achse */
  193.     p[0][trig2^1][i][1]=py;
  194.     p[0][trig2^1][i][2]=-rchtg*px;
  195.     p[1][trig2^1][i][0]=rchtg*cz;
  196.     p[1][trig2^1][i][1]=cy;
  197.     p[1][trig2^1][i][2]=-rchtg*cx; 
  198.     break;
  199.    case 3:
  200.     p[0][trig2^1][i][0]=rchtg*py;        /* z-Achse */
  201.     p[0][trig2^1][i][1]=-rchtg*px;
  202.     p[0][trig2^1][i][2]=pz;
  203.     p[1][trig2^1][i][0]=rchtg*cy;
  204.     p[1][trig2^1][i][1]=-rchtg*cx;
  205.     p[1][trig2^1][i][2]=cz; 
  206.     break;   
  207.   }
  208.   if(i<canz)
  209.   {
  210.    x=(xort+p[1][trig2^1][i][0]-1)>>1;
  211.    y=(yort+p[1][trig2^1][i][1]-1)>>1;
  212.    z=(zort+p[1][trig2^1][i][2]-1)>>1;
  213.    if(x<0) xort+=2;
  214.    if(x>4) xort-=2;
  215.    if(y<0) yort+=2;
  216.    if(y>4) yort-=2;
  217.    if(z>11)
  218.    {
  219.     if(fillkoerper == FALSE)    MoveDown = TRUE;
  220.     else            return;
  221.    }
  222.    if(x>=0 && x<=4 && y>=0 && y<=4 && z<=11) 
  223.     if(cube[x][y][z] == TRUE) return;
  224.   }
  225.  }
  226.  trig2^=1;
  227.  if(MoveDown == TRUE)
  228.  {
  229.   zort-=2;
  230.   MoveKoerper(0,0);
  231.  }
  232. }
  233.  
  234. MoveKoerper(xmove,ymove)
  235. SHORT xmove,ymove;
  236. {
  237.  SHORT i,j,x,y,z;
  238.  BOOL cubenotfree;
  239.  
  240.  draw = TRUE;
  241.  for(i=1;i>=0;i--)
  242.  {
  243.   fillkoerper=cubenotfree=FALSE;
  244.   for(j=0;j<canz;j++)
  245.   {
  246.    x=(xort+i*xmove+p[1][trig2][j][0]-1)>>1;
  247.    y=(yort+i*ymove+p[1][trig2][j][1]-1)>>1;
  248.    z=(zort+p[1][trig2][j][2]-1)>>1;
  249.    if(x<0 || x>4 || y<0 || y>4 || cube[x][y][z]==TRUE ) cubenotfree = TRUE;
  250.    if(z==0 || cube[x][y][z-1]==TRUE) fillkoerper = TRUE;
  251.   }
  252.   if(!cubenotfree) return i*2;
  253.  }
  254. }
  255.  
  256. DrawKoerper()
  257. {
  258.  SHORT i,p1,p2,kx1[36],ky1[36],kz1[36],kx2[36],ky2[36],kz2[36];
  259.  
  260.  for(i=0;i<lanz;i++)
  261.  {
  262.   p1=liniendaten[nummer][(i<<1)+1]-1;
  263.   p2=liniendaten[nummer][(i<<1)+2]-1;
  264.   kx1[i]=(p[0][trig2][p1][0]+xort)>>1;
  265.   ky1[i]=(p[0][trig2][p1][1]+yort)>>1;
  266.   kz1[i]=(p[0][trig2][p1][2]+zort)>>1;
  267.   kx2[i]=(p[0][trig2][p2][0]+xort)>>1;
  268.   ky2[i]=(p[0][trig2][p2][1]+yort)>>1;
  269.   kz2[i]=(p[0][trig2][p2][2]+zort)>>1;
  270.   Move(&RastPorts[BUFF[trig1]],koordx[kx1[i]][ky1[i]][kz1[i]],koordy[kx1[i]][ky1[i]][kz1[i]]);
  271.   Draw(&RastPorts[BUFF[trig1]],koordx[kx2[i]][ky2[i]][kz2[i]],koordy[kx2[i]][ky2[i]][kz2[i]]);
  272.  }
  273.  SwitchScreen(&View);
  274.  draw = FALSE;
  275. }
  276.  
  277. ChooseNewKoerper()
  278. {
  279.  nummer = (int)(ran()*9);
  280.  ClearKoerperData();
  281.  ReadKoerperData();
  282.  MoveKoerper(0,0);
  283.  DrawKoerper();
  284. }
  285.  
  286. FillKoerper()
  287. {
  288.  SHORT i,x,y,z,zmax=0,zmin=11;
  289.  
  290.  for(i=0;i<canz;i++)
  291.  {
  292.   x=(xort+p[1][trig2][i][0]-1)>>1;
  293.   y=(yort+p[1][trig2][i][1]-1)>>1;
  294.   z=(zort+p[1][trig2][i][2]-1)>>1;
  295.   plane[z]++;
  296.   cube[x][y][z]=TRUE;
  297.   if(z>zmax) zmax=z;
  298.   if(z<zmin) zmin=z;
  299.  }
  300.  if(zmax>maxheight) maxheight=zmax;
  301.  DrawCubes(zmin,maxheight);
  302.  for(i=11;i>=0;i--)
  303.   if(plane[i] == 25) KillPlane(i);
  304.  WriteNumber(++bricks,225,2);
  305.  WriteNumber(score+=scoredaten[nummer],75,5);
  306.  intervall = pause;
  307. }
  308.  
  309. DrawCubes(von,bis)
  310. SHORT von,bis;
  311. {
  312.  SHORT color,i,j,k;
  313.  
  314.  for(i=von;i<bis+1;i++)
  315.  {
  316.   color = (i>5) ? (i-4) : (i+2);
  317.   SetAPen(&RastPorts[DUAL2],color);
  318.   for(j=0;j<5;j++)
  319.    for(k=0;k<5;k++)
  320.     if(cube[j][k][i] == TRUE)
  321.     {
  322.      if(j>2 && cube[j-1][k][i] == FALSE)
  323.      {
  324.       AreaMove(&RastPorts[DUAL2],koordx[j][k][i+1],koordy[j][k][i+1]);
  325.       AreaDraw(&RastPorts[DUAL2],koordx[j][k+1][i+1],koordy[j][k+1][i+1]);
  326.       AreaDraw(&RastPorts[DUAL2],koordx[j][k+1][i],koordy[j][k+1][i]);
  327.       AreaDraw(&RastPorts[DUAL2],koordx[j][k][i],koordy[j][k][i]);
  328.       AreaEnd(&RastPorts[DUAL2]);
  329.      }
  330.      if(k>2 && cube[j][k-1][i] == FALSE)
  331.      {
  332.       AreaMove(&RastPorts[DUAL2],koordx[j][k][i+1],koordy[j][k][i+1]);
  333.       AreaDraw(&RastPorts[DUAL2],koordx[j+1][k][i+1],koordy[j+1][k][i+1]);
  334.       AreaDraw(&RastPorts[DUAL2],koordx[j+1][k][i],koordy[j+1][k][i]);
  335.       AreaDraw(&RastPorts[DUAL2],koordx[j][k][i],koordy[j][k][i]);
  336.       AreaEnd(&RastPorts[DUAL2]);
  337.      }
  338.      if(j<2 && cube[j+1][k][i] == FALSE)
  339.      {
  340.       AreaMove(&RastPorts[DUAL2],koordx[j+1][k][i+1],koordy[j+1][k][i+1]);
  341.       AreaDraw(&RastPorts[DUAL2],koordx[j+1][k+1][i+1],koordy[j+1][k+1][i+1]);
  342.       AreaDraw(&RastPorts[DUAL2],koordx[j+1][k+1][i],koordy[j+1][k+1][i]);
  343.       AreaDraw(&RastPorts[DUAL2],koordx[j+1][k][i],koordy[j+1][k][i]);
  344.       AreaEnd(&RastPorts[DUAL2]);
  345.      }
  346.      if(k<2 && cube[j][k+1][i] == FALSE)
  347.      {
  348.       AreaMove(&RastPorts[DUAL2],koordx[j][k+1][i+1],koordy[j][k+1][i+1]);
  349.       AreaDraw(&RastPorts[DUAL2],koordx[j+1][k+1][i+1],koordy[j+1][k+1][i+1]);
  350.       AreaDraw(&RastPorts[DUAL2],koordx[j+1][k+1][i],koordy[j+1][k+1][i]);
  351.       AreaDraw(&RastPorts[DUAL2],koordx[j][k+1][i],koordy[j][k+1][i]);
  352.       AreaEnd(&RastPorts[DUAL2]);
  353.      }
  354.     }
  355.   for(j=0;j<5;j++)
  356.    for(k=0;k<5;k++)
  357.     if(cube[j][k][i] == TRUE) 
  358.      RectFill(&RastPorts[DUAL2],koordx[j][k][i+1],koordy[j][k][i+1],koordx[j+1][k+1][i+1],koordy[j+1][k+1][i+1]);
  359.  }
  360.  SwitchScreen(&View);
  361. }
  362.  
  363. KillPlane(nr)
  364. SHORT nr;
  365. {
  366.  SHORT i,j,k;
  367.  
  368.  if(nr<11)
  369.   for(i=nr+1;i<12;i++)
  370.   {
  371.    plane[i-1]=plane[i];
  372.    for(j=0;j<5;j++)
  373.     for(k=0;k<5;k++)
  374.      cube[j][k][i-1]=cube[j][k][i];
  375.   }
  376.  plane[11]=0;
  377.  for(i=0;i<5;i++)
  378.   for(j=0;j<5;j++)
  379.    cube[i][j][11] = FALSE;
  380.  Delay(30L);
  381.  WriteNumber(++planes,175,7);
  382.  WriteNumber(score+=1000,75,5);
  383.  DrawBackground();
  384.  DrawCubes(0,10);
  385. }
  386.  
  387. DrawBackground()
  388. {
  389.  SHORT i;
  390.  
  391.  SetAPen(&RastPorts[DUAL2],0);
  392.  RectFill(&RastPorts[DUAL2],0,0,255,255);
  393.  SetAPen(&RastPorts[DUAL2],1);
  394.  SetDrPt(&RastPorts[DUAL2],0x8888);
  395.  for(i=0;i<5;i++)
  396.  {
  397.   Move(&RastPorts[DUAL2],0,i*51);
  398.   Draw(&RastPorts[DUAL2],127-25,127-25+i*10);
  399.   Draw(&RastPorts[DUAL2],127+25,127-25+i*10);
  400.   Draw(&RastPorts[DUAL2],254,i*51);
  401.   Move(&RastPorts[DUAL2],i*51,0);
  402.   Draw(&RastPorts[DUAL2],127-25+i*10,127-25);
  403.   Draw(&RastPorts[DUAL2],127-25+i*10,127+25);
  404.   Draw(&RastPorts[DUAL2],i*51,254);
  405.  }
  406.  Move(&RastPorts[DUAL2],127+25,127+25);
  407.  Draw(&RastPorts[DUAL2],254,254);
  408.  for(i=0;i<13;i++)
  409.   DrawSquare(perspektive[i]*5);
  410.  SetDrPt(&RastPorts[DUAL2],0xFFFF);
  411.  SetOPen(&RastPorts[DUAL2],0);
  412. }
  413.  
  414. DrawScoreBoard()
  415. {
  416.  SetAPen(&RastPorts[DUAL2],3);
  417.  RectFill(&RastPorts[DUAL2],258,0,319,254);
  418.  SetAPen(&RastPorts[DUAL2],0);
  419.  RectFill(&RastPorts[DUAL2],260,2,317,252);
  420.  WriteText("Quadrix",6,260,20);
  421.  WriteText("score",4,268,60);
  422.  WriteNumber(score,75,5);
  423.  WriteText("delay",4,268,110);
  424.  WriteNumber(pause*2,125,6);
  425.  WriteText("planes",4,264,160);
  426.  WriteNumber(planes,175,7);
  427.  WriteText("bricks",4,264,210);
  428.  WriteNumber(bricks,225,2);
  429. }
  430.  
  431. GameOver(delay)
  432. LONG delay;
  433. {
  434.  gameover = TRUE;
  435.  Delay(delay);
  436.  SetAPen(&RastPorts[DUAL2],3);
  437.  RectFill(&RastPorts[DUAL2],10,50,245,205);
  438.  SetAPen(&RastPorts[DUAL2],0);
  439.  RectFill(&RastPorts[DUAL2],13,53,242,202);
  440.  WriteText("Quadrix",6,103,70);
  441.  WriteText("© 1990 by K.Karsten",7,50,85);
  442.  WriteText("ESC         = Ende",4,20,110);
  443.  WriteText("SPACE       = Start",4,20,130);
  444.  WriteText("CURSORKEYS  = Move Object",4,20,150);
  445.  WriteText("NUMERIC PAD = Rotate Object",4,20,170);
  446.  WriteText("ENTER       = Drop Object",4,20,190);
  447. }
  448.  
  449. WriteText(text,color,x,y)
  450. SHORT color,x,y;
  451. TEXT text[];
  452. {
  453.  SHORT len;
  454.  
  455.  len=strlen(&text[0]);
  456.  SetAPen(&RastPorts[DUAL2],1);
  457.  SetDrMd(&RastPorts[DUAL2],JAM2);
  458.  Move(&RastPorts[DUAL2],x,y);
  459.  Text(&RastPorts[DUAL2],&text[0],len);
  460.  SetAPen(&RastPorts[DUAL2],color);
  461.  SetDrMd(&RastPorts[DUAL2],JAM1);
  462.  Move(&RastPorts[DUAL2],x+1,y+1);
  463.  Text(&RastPorts[DUAL2],&text[0],len);
  464. }
  465.  
  466. WriteNumber(num,y,color)
  467. SHORT y,color;
  468. LONG num;
  469. {
  470.  SHORT len;
  471.  TEXT zahl[8];
  472.  
  473.  ItoA(num,zahl);
  474.  WriteText(&zahl[0],color,264,y);
  475. }
  476.  
  477. ItoA(n,s)
  478. register LONG n;
  479. register TEXT *s;
  480. {
  481.  register SHORT i;
  482.  
  483.  for(i=0;i<6;i++)
  484.   s[i]='0';
  485.  i=0;
  486.  do
  487.   s[i++] = n % 10 +'0';
  488.  while(n /= 10);
  489.  s[6] = '\0';
  490.  Reverse(s);
  491. }
  492.  
  493. Reverse(s)
  494. register TEXT *s;
  495. {
  496.  register SHORT c,i,j;
  497.  
  498.  for(i=0,j=strlen(s)-1;i<j;i++,j--)
  499.  {
  500.   c=s[i];
  501.   s[i]=s[j];
  502.   s[j]=c;
  503.  }
  504. }
  505.  
  506. DrawSquare(a)
  507. SHORT a;
  508. {
  509.  a>>=1;
  510.  Move(&RastPorts[DUAL2],127-a,127-a);
  511.  Draw(&RastPorts[DUAL2],127+a,127-a);
  512.  Draw(&RastPorts[DUAL2],127+a,127+a);
  513.  Draw(&RastPorts[DUAL2],127-a,127+a);
  514.  Draw(&RastPorts[DUAL2],127-a,127-a); 
  515. }
  516.  
  517. SwitchScreen(View)
  518. struct View *View;
  519. {
  520.  View->LOFCprList = LOF[trig1];
  521.  trig1^=1;
  522.  SetRast (&RastPorts[BUFF[trig1]],0);
  523.  LoadView(View);
  524.  WaitTOF();
  525. }
  526.  
  527. InitKoord()
  528. {
  529.  SHORT a,b,c,i,j,k;
  530.  
  531.  for(i=0;i<13;i++)
  532.  {
  533.   a=perspektive[i]*5;
  534.   for(j=0;j<6;j++)
  535.   {
  536.    b=127-a/2+j*(a/5);
  537.    for(k=0;k<6;k++)
  538.    {
  539.     c=127-a/2+k*(a/5);
  540.     koordx[j][k][i]=b;
  541.     koordy[j][k][i]=c;
  542.    }
  543.   }
  544.  }
  545. }
  546.  
  547. InitLinienDaten()
  548. {
  549.  SHORT i,j,anz;
  550.  
  551.  for(i=0;i<9;i++)
  552.  {
  553.   anz=punktdaten[i][2];
  554.   liniendaten[i][0] = anz/2*3;
  555.   for(j=1;j < anz+1;j++)
  556.    liniendaten[i][j]=j;
  557.   for(j=0;j < anz;j+=2)
  558.   {
  559.    liniendaten[i][j+anz+1]=j+1;
  560.    liniendaten[i][j+anz+2]=j+3;
  561.    liniendaten[i][j+anz*2+1]=j+2;
  562.    liniendaten[i][j+anz*2+2]=j+4;
  563.   }
  564.   liniendaten[i][anz*2]=1;
  565.   liniendaten[i][anz*3]=2;
  566.  }
  567. }
  568.  
  569. InitDisplay()
  570. {
  571.  SHORT i,j;
  572.  
  573.  if ((!(GfxBase = (struct GfxBase *) OpenLibrary("graphics.library",0))) ||
  574.      (!(IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library",0))) ||
  575.      (!(DummyWindow = (struct Window *) OpenWindow(&FirstNewWindow))))
  576.       FreeMemory2();
  577.  
  578.  OldView = GfxBase -> ActiView;
  579.  InitView(&View);
  580.  InitVPort(&ViewPort);
  581.  View.ViewPort    = &ViewPort;
  582.  InitBitMap(&BitMaps[DUAL1],3,320,256);
  583.  InitBitMap(&BitMaps[DUAL2],3,320,256);
  584.  InitBitMap(&BitMaps[DBUFF2],3,320,256);
  585.  for(i=0;i<3;i++)
  586.  {
  587.   RasInfos[i].BitMap     = &BitMaps[i];
  588.   RasInfos[i].RxOffset    = 0;
  589.   RasInfos[i].RyOffset    = 0;
  590.   RasInfos[i].Next    = NULL;
  591.  }
  592.  ViewPort.DxOffset    = 0;
  593.  ViewPort.DyOffset    = 0;
  594.  ViewPort.DWidth    = 320;
  595.  ViewPort.DHeight    = 256;
  596.  ViewPort.RasInfo    = &RasInfos[DUAL1];
  597.  ViewPort.Modes        = DUALPF;
  598.  ViewPort.Next        = NULL;
  599.  if(!(ViewPort.ColorMap=GetColorMap(16))) FreeMemory2();
  600.  RasInfos[DUAL1].Next    = &RasInfos[DUAL2];
  601.  LoadRGB4(&ViewPort,&ColorTable[0],16);
  602.  for(i=0;i<3;i++)
  603.  {
  604.   if((!(BitMaps[0].Planes[i]=(PLANEPTR)AllocRaster(320,256))) ||
  605.      (!(BitMaps[1].Planes[i]=(PLANEPTR)AllocRaster(320,256))) ||
  606.      (!(BitMaps[2].Planes[i]=(PLANEPTR)AllocRaster(320,256))))
  607.       FreeMemory2();
  608.  
  609.   BltClear((UBYTE *)BitMaps[0].Planes[i],RASSIZE(320,256),0);
  610.   BltClear((UBYTE *)BitMaps[1].Planes[i],RASSIZE(320,256),0);
  611.   BltClear((UBYTE *)BitMaps[2].Planes[i],RASSIZE(320,256),0);
  612.  }
  613.  if(!(mem=(PLANEPTR)AllocRaster(320,256))) FreeMemory2();
  614.  BltClear((UBYTE *)mem,RASSIZE(320,256),0);
  615.  InitTmpRas(&tmpras,mem,RASSIZE(320,256));
  616.  for(i=0;i<3;i++)
  617.  {
  618.   InitRastPort(&RastPorts[i]);
  619.   RastPorts[i].BitMap    = &BitMaps[i];
  620.   RastPorts[i].AreaInfo    = &areainfo;
  621.   RastPorts[i].TmpRas    = &tmpras; 
  622.  }
  623.  MakeVPort(&View,&ViewPort);
  624.  MrgCop(&View);
  625.  LOF[0] = View.LOFCprList;
  626.  ViewPort.RasInfo    = &RasInfos[DBUFF2];
  627.  RasInfos[DBUFF2].Next    = &RasInfos[DUAL2];
  628.  View.LOFCprList = NULL;
  629.  View.SHFCprList = NULL;
  630.  MakeVPort(&View,&ViewPort);
  631.  MrgCop(&View);
  632.  LOF[1] = View.LOFCprList;
  633.  InitArea(&areainfo,areabuffer,100);
  634.  SetPointer(IntuitionBase->ActiveWindow,&UnvisibleImage[0],1,15,0,0);
  635.  SetAPen(&RastPorts[BUFF[0]],1);
  636.  SetAPen(&RastPorts[BUFF[1]],1);
  637. }
  638.  
  639. FreeMemory1()
  640. {
  641.  FreeVPortCopLists(&ViewPort);
  642.  FreeCprList(LOF[0]);
  643.  FreeCprList(LOF[1]);
  644.  FreeMemory2();
  645. }
  646.  
  647. FreeMemory2()
  648. {
  649.  SHORT i;
  650.  
  651.  ClearPointer(IntuitionBase->ActiveWindow);
  652.  
  653.  for(i=0;i<3;i++)
  654.  {
  655.   if(BitMaps[DUAL1].Planes[i]) FreeRaster(BitMaps[DUAL1].Planes[i],320,256);
  656.   if(BitMaps[DUAL2].Planes[i]) FreeRaster(BitMaps[DUAL2].Planes[i],320,256);
  657.   if(BitMaps[DBUFF2].Planes[i])FreeRaster(BitMaps[DBUFF2].Planes[i],320,256);
  658.  }
  659.  if (mem)        FreeRaster(mem,320,256);
  660.  if (ViewPort.ColorMap)    FreeColorMap(ViewPort.ColorMap);
  661.  if (DummyWindow)    CloseWindow(DummyWindow);
  662.  if (IntuitionBase)    CloseLibrary(IntuitionBase);
  663.  if (GfxBase)        CloseLibrary(GfxBase);
  664. }
  665.  
  666. main()
  667. {
  668.  USHORT Code;
  669.  ULONG MessageClass,s,ms;
  670.  struct Message *GetMsg();
  671.  
  672.  exitgame = FALSE;
  673.  
  674.  InitKoord();
  675.  InitLinienDaten();
  676.  ClearCubesData();
  677.  InitDisplay();
  678.  DrawBackground();
  679.  DrawScoreBoard();
  680.  SwitchScreen(&View);
  681.  GameOver(0L);
  682.  
  683.  while(!exitgame)
  684.  {
  685.   if(!(Message=(struct IntuiMessage *) GetMsg(DummyWindow->UserPort)))
  686.   {
  687.    Wait(1L<<DummyWindow->UserPort->mp_SigBit);
  688.    continue;
  689.   }
  690.   MessageClass=Message->Class;
  691.   Code=Message->Code;
  692.   ReplyMsg(Message);
  693.   switch(MessageClass)
  694.   {
  695.    case    RAWKEY:
  696.     if(!gameover)
  697.         {
  698.      switch(Code)
  699.      {
  700.       case    0x43:
  701.         intervall=0;
  702.         break;
  703.       case    0x4f:
  704.         xort-=MoveKoerper(-2, 0);
  705.         break;
  706.       case    0x4c:
  707.         yort-=MoveKoerper( 0,-2);
  708.         break;
  709.       case    0x4d:
  710.         yort+=MoveKoerper( 0, 2);
  711.         break;
  712.       case    0x4e:
  713.         xort+=MoveKoerper( 2, 0);
  714.         break;
  715.       case    0x1e:
  716.         RotateKoerper( 1, 1);
  717.         break;
  718.       case    0x3e:
  719.         RotateKoerper( 1,-1);
  720.         break;
  721.       case    0x2f:
  722.         RotateKoerper( 2, 1);
  723.         break;
  724.       case    0x2d:
  725.         RotateKoerper( 2,-1);
  726.         break;
  727.       case    0x1d:
  728.         RotateKoerper( 3, 1);
  729.         break;
  730.       case    0x3f:
  731.         RotateKoerper( 3,-1);
  732.         break;
  733.      }
  734.      if(draw) DrawKoerper();
  735.         }
  736.         else
  737.         {
  738.          switch(Code)
  739.          {
  740.           case    0x45:
  741.         exitgame = TRUE;
  742.         break;
  743.       case  0x40:
  744.         gameover = FALSE;
  745.         ClearCubesData();
  746.         DrawBackground();
  747.         DrawScoreBoard();
  748.         ChooseNewKoerper();
  749.                 CurrentTime(&sec,&micsec);
  750.         break;
  751.          }
  752.         }
  753.     break;
  754.  
  755.    case INACTIVEWINDOW:
  756.     ActivateWindow(DummyWindow);
  757.     break;
  758.  
  759.    case INTUITICKS:
  760.         if(!gameover)
  761.         {
  762.          CurrentTime(&s,&ms);
  763.          if((s-sec) > 45 && pause > 5)
  764.          {
  765.           sec = s;
  766.           pause = pause-(pause/10)-1;
  767.           if(intervall) intervall = pause;
  768.           WriteNumber(pause*2,125,6);
  769.          }
  770.      timer++;
  771.      if(timer >= intervall)
  772.      {
  773.       if(fillkoerper == TRUE) 
  774.       {
  775.        FillKoerper();
  776.        if(zort == 23)    GameOver(200L);
  777.        else            ChooseNewKoerper();
  778.       }
  779.       else 
  780.       {
  781.        zort-=2;
  782.        MoveKoerper(0,0);
  783.        DrawKoerper();
  784.       }
  785.       timer=0;
  786.      }
  787.         }
  788.         else
  789.          ran();
  790.     break;
  791.   } 
  792.  }
  793.  LoadView(OldView);
  794.  FreeMemory1();
  795. }
  796.