home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format 98 / af098sub.adf / asteroids2.LZX / asteroids2 / rotx / battleship.c < prev    next >
C/C++ Source or Header  |  2010-01-21  |  12KB  |  533 lines

  1. #include <exec/types.h>
  2. #include <intuition/intuition.h>
  3. #include <stdio.h>
  4. #include <math.h>
  5. #include <h/rot.h>
  6. #include <h/extern.h>
  7.  
  8. /*
  9. #define MWDEBUG 1
  10. #include "sc:extras/memlib/memwatch.h"
  11. */
  12.  
  13. InitBattleshipDefenseFire(n,x,y,type)
  14. LONG n,x,y,type;
  15. {
  16. LONG num,t;
  17.  
  18. num=-1;
  19. for(t=0;t<bs[n].dnum;t++)
  20.     {
  21.     if (bs[n].fdelay[t] == -1)
  22.         {
  23.         num = t;
  24.         break;
  25.         }
  26.     }
  27.  
  28. if (num != -1)
  29.     {
  30.     if (type == 0)
  31.         {
  32.         bs[n].x2[num] = ship[x].shotI[y].xp;
  33.         bs[n].y2[num] = ship[x].shotI[y].yp;
  34.         ship[x].shotI[y].flight = LAST;
  35.         }
  36.     else
  37.         {
  38.         bs[n].x2[num] = ship[x].photI[y].xp;
  39.         bs[n].y2[num] = ship[x].photI[y].yp;
  40.         ship[x].photI[y].flight = LAST;
  41.         }
  42.  
  43.     bs[n].fdelay[num] = 6;
  44.     AllocateExplosion(bs[n].x2[num],bs[n].y2[num],6);
  45.     }
  46. }
  47.  
  48.  
  49. DrawBattleshipDefenseFire(n)
  50. LONG n;
  51. {
  52. LONG y;
  53.  
  54. for (y=0;y<bs[n].dnum;y++)
  55.     {
  56.     if (bs[n].fdelay[y] != -1)
  57.         {
  58.         bs[n].ox1[y] = bs[n].x1[y];
  59.         bs[n].oy1[y] = bs[n].y1[y];
  60.         bs[n].ox2[y] = bs[n].x2[y];
  61.         bs[n].oy2[y] = bs[n].y2[y];
  62.         }
  63.  
  64.     if (bs[n].fdelay[y] > 0)
  65.         {
  66.         bs[n].x1[y] = bs[n].x + id[bs[n].image+bs[n].pos].wi/2-(12*VxINC[bs[n].pos])/100;
  67.         bs[n].y1[y] = bs[n].y + id[bs[n].image+bs[n].pos].he/2-(12*VyINC[bs[n].pos])/100;
  68.  
  69.         Move(rp1[bit],bs[n].x1[y],bs[n].y1[y]);
  70.         Draw(rp1[bit],bs[n].x2[y],bs[n].y2[y]);
  71.         }
  72.     }
  73. }
  74.  
  75.  
  76. EraseBattleshipDefenseFire(n)
  77. LONG n;
  78. {
  79. LONG y;
  80.  
  81. for (y=0;y<bs[n].dnum;y++)
  82.     {
  83.     if (bs[n].fdelay[y] != -1)
  84.         {
  85.         bs[n].fdelay[y]--;
  86.         Move(rp1[1-bit],bs[n].ox1[y],bs[n].oy1[y]);
  87.         Draw(rp1[1-bit],bs[n].ox2[y],bs[n].oy2[y]);
  88.         }
  89.     }
  90. }
  91.  
  92. HandleBattleshipFire(n)
  93. LONG n;
  94. {
  95. LONG x,y;
  96. LONG fpos,xx,yy;
  97.  
  98. for (x=0;x<control.playernum;x++)
  99.     {
  100.     fpos = determineheading(ship[x].x,ship[x].y,bs[n].x,bs[n].y,bs[n].pos) + Random(2.0) - 1;
  101.  
  102.     if (control.fire[x] < 2)
  103.         {
  104.         if (bs[n].line == TRUE)
  105.         for (y=0;y<ship[x].fnum;y++)
  106.             if (ship[x].shotI[y].flight == TRUE)
  107.                 {
  108.                 xx = bs[n].x+id[bs[n].image+bs[n].pos].wi/2;
  109.                 yy = bs[n].y+id[bs[n].image+bs[n].pos].he/2;
  110.                 if (abs(xx-ship[x].shotI[y].xp)+abs(yy-ship[x].shotI[y].yp)<80)
  111.                     InitBattleshipDefenseFire(n,x,y,0);
  112.                 }
  113.         }
  114.     else
  115.         {
  116.         if (bs[n].line == TRUE)
  117.         for (y=0;y<ship[x].pnum;y++)
  118.             if (ship[x].photI[y].flight == TRUE)
  119.                 {
  120.                 xx = bs[n].x+id[bs[n].image+bs[n].pos].wi/2;
  121.                 yy = bs[n].y+id[bs[n].image+bs[n].pos].he/2;
  122.                 if (abs(xx-ship[x].photI[y].xp)+abs(yy-ship[x].photI[y].yp)<60)
  123.                     InitBattleshipDefenseFire(n,x,y,1);
  124.                 }
  125.         }
  126.  
  127.     if ((Random(100.0) < 20) && (control.endgame == FALSE)) InitBattleshipFire(n,fpos);
  128.     }
  129. }
  130.  
  131. UpdateBattleship(n)
  132. LONG n;
  133. {
  134. LONG wi,he,wo;
  135. LONG dir;
  136. LONG xx,yy;
  137. LONG pic,bspic;
  138. LONG rx,ry,x;
  139.  
  140. bs[n].ox = bs[n].x;
  141. bs[n].oy = bs[n].y;
  142.  
  143.  
  144. if (bs[n].flight == TRUE)
  145. {
  146. HandleBattleshipFire(n);
  147.  
  148. if (bs[n].shield < 0)
  149.     {
  150.     for (x=0;x<10;x++)
  151.         {
  152.         rx = Random((DOUBLE)(id[bs[n].image+bs[n].pos].wi-40));
  153.         ry = Random((DOUBLE)(id[bs[n].image+bs[n].pos].he-40));
  154.         AllocateExplosion(bs[n].x+20+rx,bs[n].y+20+ry,6);
  155.         AllocateBoxes(bs[n].x+20+rx,bs[n].y+20+ry,1);
  156.         AllocateDebris(bs[n].x+20+rx,bs[n].y+20+ry,2);
  157.         }
  158.     makesound(3,3);
  159.     bs[n].flight = FALSE;
  160.     for(x=0;x<control.playernum;x++)
  161.         {
  162.         control.shield[x]+=100;
  163.         if (++control.weapon[x] > 4) control.weapon[x] = 4;
  164.         }
  165.     }
  166. else
  167. if (Random(500.0) > bs[n].shield*2)
  168.     {
  169.     rx = Random((DOUBLE)(id[bs[n].image+bs[n].pos].wi-40));
  170.     ry = Random((DOUBLE)(id[bs[n].image+bs[n].pos].he-40));
  171.     AllocateExplosion(bs[n].x+20+rx,bs[n].y+20+ry,6);
  172.     makesound(2,2);
  173.     }
  174. }
  175.  
  176.  
  177. if (bs[n].shield > 200)
  178.     {
  179.     if (++bs[n].turn == bs[n].man)
  180.         {
  181.         bs[n].turn = 0;
  182.         dir = determineheading(bs[n].fx,bs[n].fy,bs[n].x,bs[n].y,bs[n].pos);
  183.         if (abs(dir) > 1)
  184.             {
  185.             bs[n].pos+=sign(dir);
  186.             if (bs[n].pos > 31) bs[n].pos=0;
  187.             if (bs[n].pos <  0) bs[n].pos=31;
  188.             }
  189.         }
  190.  
  191.     bs[n].x += 2*VxINC[bs[n].pos]/100;
  192.     bs[n].y += 2*VyINC[bs[n].pos]/100;
  193.     if (abs(bs[n].x - bs[n].fx) + abs(bs[n].y - bs[n].fy) < 10)
  194.         {
  195.         bs[n].fx     = gi.x1 + Random(450.0) + 50;
  196.         bs[n].fy     = gi.y1 + Random(210.0) + 30;
  197.         }
  198.     }
  199.  
  200.  
  201. bspic = bs[n].image+bs[n].pos;
  202.  
  203. if (bs[n].flight == TRUE)
  204.     {
  205.     wi = id[bspic].wi;
  206.     he = id[bspic].he;
  207.     wo = 2*id[bspic].wo;
  208.     BltTemplate(id[bspic].data,0,wo,rp1[bit],bs[n].x,bs[n].y,wi,he);
  209.  
  210.     if (bs[n].lbox == TRUE)
  211.         {
  212.         if (--bs[n].lrot < 15) bs[n].lrot=3;
  213.         pic = il.box+bs[n].lrot;
  214.         wi = id[pic].wi;
  215.         he = id[pic].he;
  216.         wo = 2*id[pic].wo;
  217.         xx = bs[n].x+id[bspic].wi/2-(12*VyINC[bs[n].pos])/100-(8*VxINC[bs[n].pos])/100;
  218.         yy = bs[n].y+id[bspic].he/2+(12*VxINC[bs[n].pos])/100-(8*VyINC[bs[n].pos])/100;
  219.         BltTemplate(id[pic].data,0,wo,rp1[bit],xx-wi/2,yy-he/2,wi,he);
  220.         }
  221.  
  222.     if (bs[n].rbox == TRUE)
  223.         {
  224.         if (++bs[n].rrot > 15) bs[n].rrot=0;
  225.         pic = il.box+bs[n].rrot;
  226.         wi = id[pic].wi;
  227.         he = id[pic].he;
  228.         wo = 2*id[pic].wo;
  229.         xx = bs[n].x+id[bspic].wi/2+(12*VyINC[bs[n].pos])/100-(8*VxINC[bs[n].pos])/100;
  230.         yy = bs[n].y+id[bspic].he/2-(12*VxINC[bs[n].pos])/100-(8*VyINC[bs[n].pos])/100;
  231.         BltTemplate(id[pic].data,0,wo,rp1[bit],xx-wi/2,yy-he/2,wi,he);
  232.         }
  233.  
  234.     if (bs[n].line == TRUE)
  235.         {
  236.         if (++bs[n].lirot > 15) bs[n].lirot=0;
  237.         pic = il.line+bs[n].lirot;
  238.         wi = id[pic].wi;
  239.         he = id[pic].he;
  240.         wo = 2*id[pic].wo;
  241.         xx = bs[n].x+id[bspic].wi/2-(12*VxINC[bs[n].pos])/100;
  242.         yy = bs[n].y+id[bspic].he/2-(12*VyINC[bs[n].pos])/100;
  243.         BltTemplate(id[pic].data,0,wo,rp1[bit],xx-wi/2,yy-he/2,wi,he);
  244.         }
  245.     }
  246.  
  247. }
  248.  
  249.  
  250. EraseBattleship(x)
  251. LONG x;
  252. {
  253. LONG wi,he;
  254.  
  255. wi = id[bs[x].image+bs[x].pos].wi;
  256. he = id[bs[x].image+bs[x].pos].he;
  257. RectFill(rp1[1-bit],bs[x].ox-2,bs[x].oy-2,bs[x].ox+wi+2,bs[x].oy+he+2);
  258. }
  259.  
  260.  
  261. InitBattleshipFire(n,fpos)
  262. LONG n,fpos;
  263. {
  264. LONG num;
  265. LONG x,y,pos;
  266.  
  267. pos = bs[n].pos;
  268. fpos+=pos;
  269. if (fpos < 0) fpos+=32;
  270. else
  271. if (fpos > 31) fpos-=32;
  272.  
  273. for(y=0;y<2;y++)
  274. {
  275. num=-1;
  276. for(x=0;x<bs[n].fnum;x++)
  277.     {
  278.     if (bs[n].shotI[x].flight == FALSE)
  279.         {
  280.         num = x;
  281.         break;
  282.         }
  283.     }
  284.  
  285. if (num != -1)
  286. if (((y==0)&&(bs[n].lbox == TRUE)) || ((y==1)&&(bs[n].rbox == TRUE)))
  287.     {
  288.     makesound(5,0);
  289.  
  290.     bs[n].shotI[x].xp = bs[n].x+id[bs[n].image+pos].wi/2+(2*y-1)*(12*VyINC[pos])/100-(8*VxINC[pos])/100;
  291.     bs[n].shotI[x].yp = bs[n].y+id[bs[n].image+pos].he/2-(2*y-1)*(12*VxINC[pos])/100-(8*VyINC[pos])/100;
  292.     bs[n].shotI[x].vx = bs[n].fvmax*VxINC[fpos];
  293.     bs[n].shotI[x].vy = bs[n].fvmax*VyINC[fpos];
  294.  
  295.     bs[n].shotI[x].len = 10;
  296.     bs[n].shotI[x].pos = fpos;
  297.     bs[n].shotI[x].flight = TRUE;
  298.     }
  299. }
  300. }
  301.  
  302.  
  303. DrawBattleshipFire(n)
  304. LONG n;
  305. {
  306. LONG x;
  307. LONG xx,yy;
  308. LONG dx,dy;
  309.  
  310. for(x=0;x<bs[n].fnum;x++)
  311.     if (bs[n].shotI[x].flight == TRUE)
  312.         {
  313.         bs[n].shotI[x].oxp = bs[n].shotI[x].xp;
  314.         bs[n].shotI[x].oyp = bs[n].shotI[x].yp;
  315.         bs[n].shotI[x].opos= bs[n].shotI[x].pos;
  316.  
  317.         bs[n].shotI[x].xp += bs[n].shotI[x].vx/100;
  318.         bs[n].shotI[x].yp += bs[n].shotI[x].vy/100;
  319.  
  320.         dx = (bs[n].shotI[x].len * VxINC[bs[n].shotI[x].pos]) /100;
  321.         dy = (bs[n].shotI[x].len * VyINC[bs[n].shotI[x].pos]) /100;
  322.         xx = bs[n].shotI[x].xp + dx;
  323.         yy = bs[n].shotI[x].yp + dy;
  324.  
  325.         CollisionBattleshipFireShips(n,x,xx,yy);
  326.  
  327.         if ( (bs[n].shotI[x].xp > gi.x2+10) ||
  328.             (bs[n].shotI[x].xp < gi.x1-10) ||
  329.             (bs[n].shotI[x].yp > gi.y2+10) ||
  330.             (bs[n].shotI[x].yp < gi.y1-10))
  331.                 bs[n].shotI[x].flight = LAST;
  332.  
  333.         if (bs[n].shotI[x].flight == TRUE)
  334.             {
  335.             Move(rp1[bit],xx-dx,yy-dy);
  336.             Draw(rp1[bit],xx,yy);
  337.             }
  338.         }
  339. }
  340.  
  341.  
  342. EraseBattleshipFire(n)
  343. LONG n;
  344. {
  345. LONG x,xx,yy;
  346. LONG dx,dy;
  347.  
  348. for(x=0;x<bs[n].fnum;x++)
  349. {
  350. if (bs[n].shotI[x].flight != FALSE)
  351.     {
  352.     xx = bs[n].shotI[x].oxp;
  353.     yy = bs[n].shotI[x].oyp;
  354.  
  355.     dx = (bs[n].shotI[x].len * VxINC[bs[n].shotI[x].opos]) /100;
  356.     dy = (bs[n].shotI[x].len * VyINC[bs[n].shotI[x].opos]) /100;
  357.  
  358.     Move(rp1[1-bit],xx,yy);
  359.     Draw(rp1[1-bit],xx+dx,yy+dy);
  360.  
  361.     if (bs[n].shotI[x].flight == LAST) bs[n].shotI[x].flight = FALSE;
  362.     }
  363. }    
  364. }
  365.  
  366. CollisionFireBattleship(n,x,xx,yy)
  367. LONG n,x,xx,yy;
  368. {
  369. LONG y,bspic;
  370. WORD lbx,lby;
  371. WORD rbx,rby;
  372. WORD lx,ly;
  373.  
  374. for(y=0;y<control.battleshipnum;y++)
  375.     {
  376.     if (bs[y].flight == TRUE)
  377.         {
  378.         bspic = bs[y].image+bs[y].pos;
  379.  
  380.         if (bs[y].line == FALSE)
  381.             {
  382.             if ( (xx > bs[y].x+15) &&
  383.                 (xx < bs[y].x+id[bspic].wi-15) &&
  384.                 (yy > bs[y].y+15) &&
  385.                 (yy < bs[y].y+id[bspic].he-15))
  386.                     {
  387.                     makesound(2,2);
  388.                     ship[n].shotI[x].flight = LAST;
  389.                     AllocateExplosion(xx,yy,6);
  390.                     bs[y].shield-=ship[n].fdam;
  391.                     }
  392.  
  393.             lbx = bs[y].x+id[bspic].wi/2-(12*VyINC[bs[y].pos])/100-(8*VxINC[bs[y].pos])/100;
  394.             lby = bs[y].y+id[bspic].he/2+(12*VxINC[bs[y].pos])/100-(8*VyINC[bs[y].pos])/100;
  395.             if (bs[y].lbox == TRUE)
  396.             if ( (xx > lbx) &&
  397.                 (xx < lbx+id[il.box+bs[y].lrot].wi) &&
  398.                 (yy > lby) &&
  399.                 (yy < lby+id[il.box+bs[y].lrot].he))
  400.                     {
  401.                     control.asize = 0;
  402.                     makesound(3,3);
  403.                     ship[n].shotI[x].flight = LAST;
  404.                     AllocateExplosion(xx,yy,6);
  405.                     AllocateDebris(xx,yy,control.standarddebris);
  406.                     bs[y].lbox = FALSE;
  407.                     }
  408.  
  409.             rbx = bs[y].x+id[bspic].wi/2+(12*VyINC[bs[y].pos])/100-(8*VxINC[bs[y].pos])/100;
  410.             rby = bs[y].y+id[bspic].he/2-(12*VxINC[bs[y].pos])/100-(8*VyINC[bs[y].pos])/100;
  411.             if (bs[y].rbox == TRUE)
  412.             if ( (xx > rbx) &&
  413.                 (xx < rbx+id[il.box+bs[y].rrot].wi) &&
  414.                 (yy > rby) &&
  415.                 (yy < rby+id[il.box+bs[y].rrot].he))
  416.                     {
  417.                     control.asize = 0;
  418.                     makesound(3,3);
  419.                     ship[n].shotI[x].flight = LAST;
  420.                     AllocateDebris(xx,yy,control.standarddebris);
  421.                     AllocateExplosion(xx,yy,6);
  422.                     bs[y].rbox = FALSE;
  423.                     }
  424.             }
  425.         else
  426.             {
  427.  
  428.             lx = bs[y].x+id[bspic].wi/2-(12*VxINC[bs[y].pos])/100;
  429.             ly = bs[y].y+id[bspic].he/2-(12*VyINC[bs[y].pos])/100;
  430.             if (bs[y].line == TRUE)
  431.             if ( (xx > lx) &&
  432.                 (xx < lx+id[il.line+bs[y].lirot].wi) &&
  433.                 (yy > ly) &&
  434.                 (yy < ly+id[il.line+bs[y].lirot].he))
  435.                     {
  436.                     makesound(3,3);
  437.                     ship[n].shotI[x].flight = LAST;
  438.                     AllocateExplosion(xx,yy,8);
  439.                     AllocateDebris(xx,yy,control.standarddebris);
  440.                     bs[y].line = FALSE;
  441.                 }
  442.             }
  443.         }
  444.     }
  445. }
  446.  
  447.  
  448. CollisionPhotonBattleship(n,x)
  449. LONG n,x;
  450. {
  451. LONG xx,yy;
  452. LONG y,bspic;
  453. WORD lbx,lby;
  454. WORD rbx,rby;
  455. WORD lx,ly;
  456.  
  457. xx = ship[n].photI[x].xp+2;
  458. yy = ship[n].photI[x].yp+2;
  459.  
  460. for(y=0;y<control.battleshipnum;y++)
  461.     {
  462.     if (bs[y].flight == TRUE)
  463.         {
  464.         bspic = bs[y].image+bs[y].pos;
  465.  
  466.         if (bs[y].line == FALSE)
  467.             {
  468.             if ( (xx > bs[y].x+15) &&
  469.                 (xx < bs[y].x+id[bspic].wi-15) &&
  470.                 (yy > bs[y].y+15) &&
  471.                 (yy < bs[y].y+id[bspic].he-15))
  472.                     {
  473.                     makesound(2,2);
  474.                     IncreaseScore(n,500);
  475.                     ship[n].photI[x].flight = LAST;
  476.                     AllocateExplosion(xx,yy,6);
  477.                     bs[y].shield-=ship[n].fdam;
  478.                     }
  479.  
  480.             lbx = bs[y].x+id[bspic].wi/2-(12*VyINC[bs[y].pos])/100-(8*VxINC[bs[y].pos])/100;
  481.             lby = bs[y].y+id[bspic].he/2+(12*VxINC[bs[y].pos])/100-(8*VyINC[bs[y].pos])/100;
  482.             if (bs[y].lbox == TRUE)
  483.             if ( (xx > lbx) &&
  484.                 (xx < lbx+id[il.box+bs[y].lrot].wi) &&
  485.                 (yy > lby) &&
  486.                 (yy < lby+id[il.box+bs[y].lrot].he))
  487.                     {
  488.                     control.asize = 0;
  489.                     makesound(3,3);
  490.                     ship[n].photI[x].flight = LAST;
  491.                     AllocateExplosion(xx,yy,6);
  492.                     AllocateDebris(xx,yy,control.standarddebris);
  493.                     bs[y].lbox = FALSE;
  494.                     }
  495.  
  496.             rbx = bs[y].x+id[bspic].wi/2+(12*VyINC[bs[y].pos])/100-(8*VxINC[bs[y].pos])/100;
  497.             rby = bs[y].y+id[bspic].he/2-(12*VxINC[bs[y].pos])/100-(8*VyINC[bs[y].pos])/100;
  498.             if (bs[y].rbox == TRUE)
  499.             if ( (xx > rbx) &&
  500.                 (xx < rbx+id[il.box+bs[y].rrot].wi) &&
  501.                 (yy > rby) &&
  502.                 (yy < rby+id[il.box+bs[y].rrot].he))
  503.                     {
  504.                     control.asize = 0;
  505.                     makesound(3,3);
  506.                     ship[n].photI[x].flight = LAST;
  507.                     AllocateDebris(xx,yy,control.standarddebris);
  508.                     AllocateExplosion(xx,yy,6);
  509.                     bs[y].rbox = FALSE;
  510.                     }
  511.             }
  512.         else
  513.             {
  514.  
  515.             lx = bs[y].x+id[bspic].wi/2-(12*VxINC[bs[y].pos])/100;
  516.             ly = bs[y].y+id[bspic].he/2-(12*VyINC[bs[y].pos])/100;
  517.             if (bs[y].line == TRUE)
  518.             if ( (xx > lx) &&
  519.                 (xx < lx+id[il.line+bs[y].lirot].wi) &&
  520.                 (yy > ly) &&
  521.                 (yy < ly+id[il.line+bs[y].lirot].he))
  522.                     {
  523.                     makesound(3,3);
  524.                     ship[n].photI[x].flight = LAST;
  525.                     AllocateDebris(xx,yy,control.standarddebris);
  526.                     AllocateExplosion(xx,yy,6);
  527.                     bs[y].line = FALSE;
  528.                 }
  529.             }
  530.         }
  531.     }
  532. }
  533.