/tecnoballz-0.92/src/controller_projectiles.cc

# · C++ · 902 lines · 741 code · 37 blank · 124 comment · 54 complexity · a14511775d857296623cac3ae0391d2b MD5 · raw file

  1. /**
  2. * @file controller_projectiles.cc
  3. * @brief Projectiles controller for a single paddle!
  4. * @date 2007-10-24
  5. * @copyright 1991-2007 TLK Games
  6. * @author Bruno Ethvignot
  7. * @version $Revision: 1.10 $
  8. */
  9. /*
  10. * copyright (c) 1991-2007 TLK Games all rights reserved
  11. * $Id: controller_projectiles.cc,v 1.10 2007/10/29 13:18:53 gurumeditation Exp $
  12. *
  13. * TecnoballZ is free software; you can redistribute it and/or modify
  14. * it under the terms of the GNU General Public License as published by
  15. * the Free Software Foundation; either version 3 of the License, or
  16. * (at your option) any later version.
  17. *
  18. * TecnoballZ is distributed in the hope that it will be useful, but
  19. * WITHOUT ANY WARRANTY; without even the implied warranty of
  20. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  21. * GNU General Public License for more details.
  22. *
  23. * You should have received a copy of the GNU General Public License
  24. * along with this program; if not, write to the Free Software
  25. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  26. * MA 02110-1301, USA.
  27. */
  28. #include "../include/controller_projectiles.h"
  29. /**
  30. * Create the projectiles controller
  31. */
  32. controller_projectiles::controller_projectiles ()
  33. {
  34. littleInit ();
  35. countTempo = 0;
  36. max_of_sprites = MAX_OF_PROJECTILES;
  37. sprites_have_shades = false;
  38. sprite_type_id = sprite_object::PROJECTILES;
  39. if (resolution == 1)
  40. {
  41. circular_sin = &circular_sin_320[0];
  42. }
  43. else
  44. {
  45. circular_sin = &circular_sin_640[0];
  46. }
  47. }
  48. /**
  49. * Release the projectiles controller
  50. */
  51. controller_projectiles::~controller_projectiles ()
  52. {
  53. release_sprites_list ();
  54. }
  55. /**
  56. * Create and initialize the list of projectiles sprites
  57. * @param paddle a pointer to a paddle sprite
  58. */
  59. void
  60. controller_projectiles::create_projectiles_list (sprite_paddle * paddle)
  61. {
  62. create_sprites_list ();
  63. gun_paddle = paddle;
  64. sprite_projectile **projectiles = sprites_list;
  65. for (Uint32 i = 0; i < max_of_sprites; i++)
  66. {
  67. sprite_projectile *projectile = *(projectiles++);
  68. projectile->init_members (paddle);
  69. }
  70. set_fire_1 ();
  71. }
  72. /**
  73. * Check if fire is available
  74. */
  75. void
  76. controller_projectiles::disponible ()
  77. {
  78. if (gun_paddle->fire_state == sprite_paddle::NOT_OWN_GUN)
  79. {
  80. /* not fire available */
  81. return;
  82. }
  83. Uint32 t = max_of_sprites;
  84. sprite_projectile **projectiles = sprites_list;
  85. /* special fire 7 (circular fire) */
  86. if (gun_paddle->length == gun_paddle->width_maxi)
  87. {
  88. for (Uint32 i = 0; i < t; i++)
  89. {
  90. sprite_projectile *projectile = *(projectiles++);
  91. if (!projectile->on_paddle)
  92. {
  93. return;
  94. }
  95. }
  96. }
  97. /* other fires */
  98. else
  99. {
  100. for (Uint32 i = 0; i < t; i++)
  101. {
  102. sprite_projectile *projectile = *(projectiles++);
  103. if (projectile->is_enabled)
  104. {
  105. return;
  106. }
  107. }
  108. }
  109. countTempo = 0;
  110. /** fire is requested */
  111. gun_paddle->fire_state = sprite_paddle::FIRE;
  112. #ifndef SOUNDISOFF
  113. audio->play_sound (handler_audio::PADDLE_FIRE);
  114. #endif
  115. }
  116. /**
  117. * New fire start
  118. */
  119. void
  120. controller_projectiles::fire ()
  121. {
  122. if (gun_paddle->fire_state != sprite_paddle::NOT_OWN_GUN)
  123. {
  124. Sint32 i = gun_paddle->length;
  125. paddle_length = i;
  126. /* smallest paddle is of 16/32 pixels width */
  127. i -= gun_paddle->width_mini;
  128. /* size of paddle step by 8/16 pixels */
  129. i >>= gun_paddle->shift_width;
  130. switch (i)
  131. {
  132. case 0:
  133. init_type1 ();
  134. break;
  135. case 1:
  136. init_type2 ();
  137. break;
  138. case 2:
  139. init_type3 ();
  140. break;
  141. case 3:
  142. init_type4 ();
  143. break;
  144. case 4:
  145. init_type5 ();
  146. break;
  147. case 5:
  148. init_type6 ();
  149. break;
  150. case 6:
  151. init_type7 ();
  152. break;
  153. }
  154. }
  155. }
  156. /**
  157. * Fire 1: 16/32 pixels paddle's whidth
  158. */
  159. void
  160. controller_projectiles::init_type1 ()
  161. {
  162. sprite_paddle *paddle = gun_paddle;
  163. if (paddle->fire_state != sprite_paddle::FIRE)
  164. {
  165. return;
  166. }
  167. paddle->fire_state = sprite_paddle::OWN_GUN;
  168. Sint32 x = paddle->x_coord;
  169. Sint32 y = paddle->y_coord;
  170. if (paddle->is_vertical)
  171. {
  172. y += (paddle_length / 2) - (SIZE_OF_PROJECTILE / 2);
  173. }
  174. else
  175. {
  176. x += (paddle_length / 2) - (SIZE_OF_PROJECTILE / 2);
  177. }
  178. sprite_projectile *projectile = sprites_list[0];
  179. projectile->is_enabled = true;
  180. projectile->x_coord = x;
  181. projectile->y_coord = y;
  182. }
  183. /**
  184. * Fire 2: 24/48 pixels paddle's whidth
  185. */
  186. void
  187. controller_projectiles::init_type2 ()
  188. {
  189. sprite_paddle *paddle = gun_paddle;
  190. if (paddle->fire_state != sprite_paddle::FIRE)
  191. {
  192. return;
  193. }
  194. paddle->fire_state = sprite_paddle::OWN_GUN;
  195. Sint32 x = paddle->x_coord;
  196. Sint32 y = paddle->y_coord;
  197. if (paddle->is_vertical)
  198. {
  199. y += (paddle_length / 2) - (SIZE_OF_PROJECTILE / 2);
  200. }
  201. else
  202. {
  203. x += (paddle_length / 2) - (SIZE_OF_PROJECTILE / 2);
  204. }
  205. sprite_projectile **projectiles = sprites_list;
  206. sprite_projectile *projectile;
  207. projectile = *(projectiles++);
  208. projectile->is_enabled = true;
  209. projectile->x_coord = x;
  210. projectile->y_coord = y;
  211. projectile = *(projectiles++);
  212. projectile->is_enabled = true;
  213. projectile->x_coord = x;
  214. projectile->y_coord = y;
  215. }
  216. /**
  217. * Fire 3: 24/48 pixels paddle's whidth
  218. */
  219. void
  220. controller_projectiles::init_type3 ()
  221. {
  222. sprite_paddle *paddle = gun_paddle;
  223. if (paddle->fire_state != sprite_paddle::FIRE)
  224. {
  225. return;
  226. }
  227. paddle->fire_state = sprite_paddle::OWN_GUN;
  228. Sint32 x = paddle->x_coord;
  229. Sint32 y = paddle->y_coord;
  230. if (paddle->is_vertical)
  231. {
  232. y += (paddle_length / 2) - (SIZE_OF_PROJECTILE / 2);
  233. }
  234. else
  235. {
  236. x += (paddle_length / 2) - (SIZE_OF_PROJECTILE / 2);
  237. }
  238. sprite_projectile **projectiles = sprites_list;
  239. sprite_projectile *projectile;
  240. projectile = *(projectiles++);
  241. projectile->is_enabled = true;
  242. projectile->x_coord = x;
  243. projectile->y_coord = y;
  244. projectile = *(projectiles++);
  245. projectile->is_enabled = true;
  246. projectile->x_coord = x;
  247. projectile->y_coord = y;
  248. projectile = *projectiles;
  249. projectile->is_enabled = true;
  250. projectile->x_coord = x;
  251. projectile->y_coord = y;
  252. }
  253. /**
  254. * Fire 4: 40/80 pixels paddle's whidth
  255. */
  256. void
  257. controller_projectiles::init_type4 ()
  258. {
  259. sprite_paddle *paddle = gun_paddle;
  260. if (paddle->fire_state != sprite_paddle::FIRE)
  261. {
  262. return;
  263. }
  264. paddle->fire_state = sprite_paddle::OWN_GUN;
  265. Sint32 x = paddle->x_coord;
  266. Sint32 y = paddle->y_coord;
  267. sprite_projectile **projectiles = sprites_list;
  268. sprite_projectile *projectile;
  269. projectile = *(projectiles++);
  270. projectile->is_enabled = true;
  271. projectile->x_coord = x;
  272. projectile->y_coord = y;
  273. if (paddle->is_vertical)
  274. {
  275. y += 18 * resolution;
  276. }
  277. else
  278. {
  279. x += 18 * resolution;
  280. }
  281. projectile = *(projectiles++);
  282. projectile->is_enabled = true;
  283. projectile->x_coord = x;
  284. projectile->y_coord = y;
  285. projectile = *(projectiles++);
  286. projectile->is_enabled = true;
  287. projectile->x_coord = x;
  288. projectile->y_coord = y;
  289. if (paddle->is_vertical)
  290. {
  291. y = paddle->y_coord + paddle->length - 4;
  292. }
  293. else
  294. {
  295. x = paddle->x_coord + paddle->length - 4;
  296. }
  297. projectile = *projectiles;
  298. projectile->is_enabled = true;
  299. projectile->x_coord = x;
  300. projectile->y_coord = y;
  301. }
  302. /**
  303. * Fire 5: 48/96 pixels paddle's whidth
  304. */
  305. void
  306. controller_projectiles::init_type5 ()
  307. {
  308. sprite_paddle *paddle = gun_paddle;
  309. if (paddle->fire_state != sprite_paddle::FIRE)
  310. {
  311. return;
  312. }
  313. paddle->fire_state = sprite_paddle::OWN_GUN;
  314. Sint32 x = paddle->x_coord;
  315. Sint32 y = paddle->y_coord;
  316. sprite_projectile **projectiles = sprites_list;
  317. sprite_projectile *projectile;
  318. projectile = *(projectiles++);
  319. projectile->is_enabled = true;
  320. projectile->x_coord = x;
  321. projectile->y_coord = y;
  322. Sint32 quarter = paddle_length / 4;
  323. if (paddle->is_vertical)
  324. {
  325. Sint32 i = paddle->projectile_xinc1;
  326. x += i;
  327. y += quarter;
  328. projectile = *(projectiles++);
  329. projectile->is_enabled = true;
  330. projectile->x_coord = x;
  331. projectile->y_coord = y;
  332. x += i;
  333. y += quarter;
  334. projectile = *(projectiles++);
  335. projectile->is_enabled = true;
  336. projectile->x_coord = x;
  337. projectile->y_coord = y;
  338. x -= i;
  339. y += quarter;
  340. projectile = *(projectiles++);
  341. projectile->is_enabled = true;
  342. projectile->x_coord = x;
  343. projectile->y_coord = y;
  344. x -= i;
  345. y += quarter - 2 * resolution;
  346. projectile = *(projectiles++);
  347. projectile->is_enabled = true;
  348. projectile->x_coord = x;
  349. projectile->y_coord = y;
  350. }
  351. else
  352. {
  353. Sint32 i = paddle->projectile_yinc1;
  354. y += i;
  355. x += quarter;
  356. projectile = *(projectiles++);
  357. projectile->is_enabled = true;
  358. projectile->x_coord = x;
  359. projectile->y_coord = y;
  360. y += i;
  361. x += quarter;
  362. projectile = *(projectiles++);
  363. projectile->is_enabled = true;
  364. projectile->x_coord = x;
  365. projectile->y_coord = y;
  366. y -= i;
  367. x += quarter;
  368. projectile = *(projectiles++);
  369. projectile->is_enabled = true;
  370. projectile->x_coord = x;
  371. projectile->y_coord = y;
  372. y -= i;
  373. x += quarter - 2 * resolution;
  374. projectile = *(projectiles++);
  375. projectile->is_enabled = true;
  376. projectile->x_coord = x;
  377. projectile->y_coord = y;
  378. }
  379. }
  380. /**
  381. * Fire 6: 56/112 pixels paddle's whidth
  382. */
  383. void
  384. controller_projectiles::init_type6 ()
  385. {
  386. sprite_paddle *paddle = gun_paddle;
  387. if (paddle->fire_state != sprite_paddle::FIRE)
  388. {
  389. return;
  390. }
  391. paddle->fire_state = sprite_paddle::OWN_GUN;
  392. sprite_projectile **projectiles = sprites_list;
  393. Sint32 x = paddle->x_coord;
  394. Sint32 y = paddle->y_coord;
  395. Sint32 offst = 22 * resolution;
  396. sprite_projectile *projectile;
  397. if (paddle->is_vertical)
  398. {
  399. Sint32 a = x + paddle->projectile_xoffset;
  400. projectile = *(projectiles++);
  401. projectile->is_enabled = true;
  402. projectile->x_coord = a;
  403. projectile->y_coord = y;
  404. projectile = *(projectiles++);
  405. projectile->is_enabled = true;
  406. projectile->x_coord = x;
  407. projectile->y_coord = y;
  408. y += offst;
  409. projectile = *(projectiles++);
  410. projectile->is_enabled = true;
  411. projectile->x_coord = x;
  412. projectile->y_coord = y;
  413. projectile = *(projectiles++);
  414. projectile->is_enabled = true;
  415. projectile->x_coord = x;
  416. projectile->y_coord = y;
  417. y += offst;
  418. projectile = *(projectiles++);
  419. projectile->is_enabled = true;
  420. projectile->x_coord = a;
  421. projectile->y_coord = y;
  422. projectile = *(projectiles++);
  423. projectile->is_enabled = true;
  424. projectile->x_coord = x;
  425. projectile->y_coord = y;
  426. }
  427. else
  428. {
  429. Sint32 o = y + paddle->projectile_yoffset;
  430. projectile = *(projectiles++);
  431. projectile->is_enabled = true;
  432. projectile->x_coord = x;
  433. projectile->y_coord = y;
  434. projectile = *(projectiles++);
  435. projectile->is_enabled = true;
  436. projectile->x_coord = x;
  437. projectile->y_coord = o;
  438. x += offst;
  439. projectile = *(projectiles++);
  440. projectile->is_enabled = true;
  441. projectile->x_coord = x;
  442. projectile->y_coord = y;
  443. projectile = *(projectiles++);
  444. projectile->is_enabled = true;
  445. projectile->x_coord = x;
  446. projectile->y_coord = y;
  447. x += offst;
  448. projectile = *(projectiles++);
  449. projectile->is_enabled = true;
  450. projectile->x_coord = x;
  451. projectile->y_coord = o;
  452. projectile = *(projectiles++);
  453. projectile->is_enabled = true;
  454. projectile->x_coord = x;
  455. projectile->y_coord = y;
  456. }
  457. }
  458. /**
  459. * Fire 7: 64/128 pixels paddle's width
  460. */
  461. void
  462. controller_projectiles::init_type7 ()
  463. {
  464. sprite_paddle *paddle = gun_paddle;
  465. /* paddle is firing? */
  466. if (paddle->fire_state == sprite_paddle::FIRE)
  467. {
  468. paddle->fire_state = sprite_paddle::OWN_GUN;
  469. sprite_projectile **projectiles = sprites_list;
  470. Sint32 x = paddle->x_coord + paddle->projectile_xcenter;
  471. Sint32 y = paddle->y_coord + paddle->projectile_ycenter;
  472. Sint32 j = 0;
  473. for (Sint32 i = 0; i < 7; i++, j += 8)
  474. {
  475. sprite_projectile *projectile = *(projectiles++);
  476. projectile->on_paddle = false;
  477. projectile->fire_Xscie = x;
  478. projectile->fire_Yscie = y;
  479. projectile->indexSinus = j;
  480. }
  481. }
  482. /* fire on the paddle */
  483. else
  484. {
  485. sprite_projectile **projectiles = sprites_list;
  486. paddle->fire_state = sprite_paddle::OWN_GUN;
  487. for (Sint32 i = 0; i < 7; i++)
  488. {
  489. sprite_projectile *projectile = *(projectiles++);
  490. if (projectile->is_enabled)
  491. {
  492. return;
  493. }
  494. }
  495. projectiles = sprites_list;
  496. Sint32 x = paddle->x_coord + paddle->projectile_xcenter;
  497. Sint32 y = paddle->y_coord + paddle->projectile_ycenter;
  498. Sint32 j = 0;
  499. for (Sint32 i = 0; i < 7; i++, j += 8)
  500. {
  501. sprite_projectile *projectile = *(projectiles++);
  502. projectile->is_enabled = true;
  503. projectile->on_paddle = true;
  504. projectile->fire_Xscie = x;
  505. projectile->fire_Yscie = y;
  506. projectile->indexSinus = j;
  507. }
  508. }
  509. }
  510. /**
  511. * Move paddle's projectiles
  512. */
  513. void
  514. controller_projectiles::move ()
  515. {
  516. Sint32 i = gun_paddle->length;
  517. paddle_length = i;
  518. /* smallest paddle width is of 16/32 pixels */
  519. i -= gun_paddle->width_mini;
  520. /* size of paddle step by 8/16 pixels */
  521. i >>= gun_paddle->shift_width;
  522. switch (i)
  523. {
  524. case 0:
  525. move_type1 ();
  526. break;
  527. case 1:
  528. move_type2 ();
  529. break;
  530. case 2:
  531. move_type3 ();
  532. break;
  533. case 3:
  534. move_type4 ();
  535. break;
  536. case 4:
  537. move_type5 ();
  538. break;
  539. case 5:
  540. move_type6 ();
  541. break;
  542. case 6:
  543. move_type7 ();
  544. break;
  545. }
  546. }
  547. /**
  548. * Move linear projectile (paddle's size: 16/32 pixels)
  549. */
  550. void
  551. controller_projectiles::move_type1 ()
  552. {
  553. sprite_projectile *projectile = sprites_list[0];
  554. sprite_paddle *paddle = gun_paddle;
  555. projectile->x_coord += paddle->projectile_xinc0;
  556. projectile->y_coord += paddle->projectile_yinc0;
  557. }
  558. /**
  559. * Move "fishtail fire" (paddle's size: 24/48 pixels)
  560. */
  561. void
  562. controller_projectiles::move_type2 ()
  563. {
  564. sprite_projectile **projectiles = sprites_list;
  565. sprite_paddle *paddle = gun_paddle;
  566. Sint32 a = countTempo;
  567. Sint32 b, c, d;
  568. a++;
  569. if (a > 20)
  570. {
  571. a = 0;
  572. }
  573. countTempo = a;
  574. if (a > 10)
  575. {
  576. a = paddle->projectile_xinc1;
  577. b = paddle->projectile_yinc1;
  578. c = paddle->projectile_xinc2;
  579. d = paddle->projectile_yinc2;
  580. }
  581. else
  582. {
  583. a = paddle->projectile_xinc2;
  584. b = paddle->projectile_yinc2;
  585. c = paddle->projectile_xinc1;
  586. d = paddle->projectile_yinc1;
  587. }
  588. sprite_projectile *projectile;
  589. projectile = *(projectiles++);
  590. projectile->x_coord += a;
  591. projectile->y_coord += b;
  592. projectile = *projectiles;
  593. projectile->x_coord += c;
  594. projectile->y_coord += d;
  595. }
  596. /**
  597. * Move "triangle fire" (paddle's size: 32/64 pixels)
  598. */
  599. void
  600. controller_projectiles::move_type3 ()
  601. {
  602. sprite_projectile **projectiles = sprites_list;
  603. sprite_paddle *paddle = gun_paddle;
  604. Sint32 i, j;
  605. sprite_projectile *projectile;
  606. /* shot leaves to the left */
  607. projectile = *(projectiles++);
  608. i = paddle->projectile_xinc1;
  609. j = paddle->projectile_yinc1;
  610. projectile->x_coord += i;
  611. projectile->y_coord += j;
  612. /* shot leaves any right */
  613. projectile = *(projectiles++);
  614. i = paddle->projectile_xinc0;
  615. j = paddle->projectile_yinc0;
  616. projectile->x_coord += i;
  617. projectile->y_coord += j;
  618. /* shot leaves to the right */
  619. projectile = *projectiles;
  620. i = paddle->projectile_xinc2;
  621. j = paddle->projectile_yinc2;
  622. projectile->x_coord += i;
  623. projectile->y_coord += j;
  624. }
  625. /**
  626. * Move "fishtail fire" + "linear fire" (paddle of 40/80 pixels width)
  627. */
  628. void
  629. controller_projectiles::move_type4 ()
  630. {
  631. Sint32 i, j;
  632. i = countTempo;
  633. i++;
  634. if (i > 20)
  635. {
  636. i = 0;
  637. }
  638. countTempo = i;
  639. sprite_projectile **projectiles = sprites_list;
  640. sprite_paddle *paddle = gun_paddle;
  641. sprite_projectile *projectile;
  642. /* [1] linar projectile */
  643. projectile = *(projectiles++);
  644. j = paddle->projectile_xinc0;
  645. projectile->x_coord += j;
  646. j = paddle->projectile_yinc0;
  647. projectile->y_coord += j;
  648. if (i > 10)
  649. {
  650. /* [2] fishtail projectile */
  651. projectile = *(projectiles++);
  652. i = paddle->projectile_xinc1;
  653. j = paddle->projectile_yinc1;
  654. projectile->x_coord += i;
  655. projectile->y_coord += j;
  656. /* [3] fishtail projectile */
  657. projectile = *(projectiles++);
  658. i = paddle->projectile_xinc2;
  659. j = paddle->projectile_yinc2;
  660. projectile->x_coord += i;
  661. projectile->y_coord += j;
  662. }
  663. else
  664. {
  665. /* [2] fishtail projectile */
  666. projectile = *(projectiles++);
  667. i = paddle->projectile_xinc2;
  668. j = paddle->projectile_yinc2;
  669. projectile->x_coord += i;
  670. projectile->y_coord += j;
  671. /* [3] fishtail projectile */
  672. projectile = *(projectiles++);
  673. i = paddle->projectile_xinc1;
  674. j = paddle->projectile_yinc1;
  675. projectile->x_coord += i;
  676. projectile->y_coord += j;
  677. }
  678. /* [1] linar projectile */
  679. projectile = *projectiles;
  680. i = paddle->projectile_xinc0;
  681. j = paddle->projectile_yinc0;
  682. projectile->x_coord += i;
  683. projectile->y_coord += j;
  684. }
  685. /**
  686. * Move 5 linears projectiles (paddle of 48/96 pixels width)
  687. */
  688. void
  689. controller_projectiles::move_type5 ()
  690. {
  691. sprite_projectile **projectiles = sprites_list;
  692. sprite_paddle *paddle = gun_paddle;
  693. Sint32 x = paddle->projectile_xinc0;
  694. Sint32 y = paddle->projectile_yinc0;
  695. for (Sint32 i = 0; i < 5; i++)
  696. {
  697. sprite_projectile *projectile = *(projectiles++);
  698. projectile->x_coord += x;
  699. projectile->y_coord += y;
  700. }
  701. }
  702. /**
  703. * Move 4 linears projectiles + 2 fishtails projectiles
  704. * (paddle of 56/112 pixels)
  705. */
  706. void
  707. controller_projectiles::move_type6 ()
  708. {
  709. Sint32 a, i, j;
  710. a = countTempo;
  711. a++;
  712. if (a > 20)
  713. {
  714. a = 0;
  715. }
  716. countTempo = a;
  717. sprite_projectile **projectiles = sprites_list;
  718. sprite_paddle *paddle = gun_paddle;
  719. i = paddle->projectile_xinc0;
  720. j = paddle->projectile_yinc0;
  721. sprite_projectile *projectile = *(projectiles++);
  722. projectile->x_coord += i;
  723. projectile->y_coord += j;
  724. projectile = *(projectiles++);
  725. projectile->x_coord += i;
  726. projectile->y_coord += j;
  727. if (a > 10)
  728. {
  729. /* [3] fishtail projectile */
  730. projectile = *(projectiles++);
  731. i = paddle->projectile_xinc1;
  732. j = paddle->projectile_yinc1;
  733. projectile->x_coord += i;
  734. projectile->y_coord += j;
  735. /* [4] fishtail prjectile */
  736. projectile = *(projectiles++);
  737. i = paddle->projectile_xinc2;
  738. j = paddle->projectile_yinc2;
  739. projectile->x_coord += i;
  740. projectile->y_coord += j;
  741. }
  742. else
  743. {
  744. /* [3] fishtail projectile */
  745. projectile = *(projectiles++);
  746. i = paddle->projectile_xinc2;
  747. j = paddle->projectile_yinc2;
  748. projectile->x_coord += i;
  749. projectile->y_coord += j;
  750. /* [4] fishtail projectile */
  751. projectile = *(projectiles++);
  752. i = paddle->projectile_xinc1;
  753. j = paddle->projectile_yinc1;
  754. projectile->x_coord += i;
  755. projectile->y_coord += j;
  756. }
  757. i = paddle->projectile_xinc0;
  758. j = paddle->projectile_yinc0;
  759. projectile = *(projectiles++);
  760. projectile->x_coord += i;
  761. projectile->y_coord += j;
  762. projectile = *projectiles;
  763. projectile->x_coord += i;
  764. projectile->y_coord += j;
  765. }
  766. /*
  767. * Move 7 circular projectiles (paddle of 56/128 pixels)
  768. */
  769. void
  770. controller_projectiles::move_type7 ()
  771. {
  772. sprite_projectile **projectiles = sprites_list;
  773. sprite_paddle *paddle = gun_paddle;
  774. for (Sint32 i = 0; i < 7; i++)
  775. {
  776. sprite_projectile *projectile = *(projectiles++);
  777. if (!projectile->is_enabled)
  778. {
  779. continue;
  780. }
  781. Sint32 j = projectile->indexSinus;
  782. j += 2;
  783. const Sint16 *table = circular_sin + j;
  784. if (*table == 99)
  785. {
  786. j = 0;
  787. table = circular_sin;
  788. }
  789. projectile->indexSinus = j;
  790. if (projectile->on_paddle)
  791. {
  792. Sint32 k = *(table++);
  793. k += paddle->x_coord + paddle->projectile_xcenter;
  794. projectile->x_coord = k;
  795. k = *table;
  796. k += paddle->y_coord + paddle->projectile_ycenter;
  797. projectile->y_coord = k;
  798. }
  799. else
  800. {
  801. projectile->fire_Xscie += paddle->projectile_xinc0;
  802. projectile->fire_Yscie += paddle->projectile_yinc0;
  803. Sint32 k = *(table++);
  804. k += projectile->fire_Xscie;
  805. projectile->x_coord = k;
  806. k = *table;
  807. k += projectile->fire_Yscie;
  808. projectile->y_coord = k;
  809. }
  810. }
  811. }
  812. /**
  813. * Enable fire power 1
  814. */
  815. void
  816. controller_projectiles::set_fire_1 ()
  817. {
  818. sprite_projectile **projectiles = sprites_list;
  819. for (Uint32 i = 0; i < max_of_sprites; i++)
  820. {
  821. sprite_projectile *projectile = *(projectiles++);
  822. projectile->set_power1 ();
  823. }
  824. }
  825. /**
  826. * Enable fire power 2
  827. */
  828. void
  829. controller_projectiles::set_fire_2 ()
  830. {
  831. sprite_projectile **projectiles = sprites_list;
  832. for (Uint32 i = 0; i < max_of_sprites; i++)
  833. {
  834. sprite_projectile *projectile = *(projectiles++);
  835. projectile->set_power2 ();
  836. }
  837. }
  838. /**
  839. * Sinus used for he fire 7 in 640 pixels resolution
  840. */
  841. const
  842. Sint16
  843. controller_projectiles::circular_sin_640[] =
  844. { 15 * 2, -3 * 2, 13 * 2, -7 * 2, 11 * 2, -10 * 2, 9 * 2, -12 * 2, 7 * 2,
  845. 13 * 2, 3 * 2, -15 * 2, 0 * 2, -15 * 2,
  846. -3 * 2, -15 * 2, -6 * 2, -14 * 2, -9 * 2, -12 * 2, -11 * 2, -10 * 2,
  847. -13 * 2, -07 * 2, -14 * 2, -04 * 2, -15 * 2, -01 * 2,
  848. -15 * 2, 3 * 2, -13 * 2, 7 * 2, -11 * 2, 10 * 2, -9 * 2, 12 * 2, -7 * 2,
  849. 13 * 2, -3 * 2, 15 * 2, 0 * 2, 15 * 2,
  850. 3 * 2, 15 * 2, 6 * 2, 14 * 2, 9 * 2, 12 * 2, 11 * 2, 10 * 2, 13 * 2, 7 * 2,
  851. 14 * 2, 4 * 2, 15 * 2, 1 * 2,
  852. 99, 99, 99, 99
  853. };
  854. /**
  855. * Sinus used for he fire 7 in 320 pixels resolution
  856. */
  857. const
  858. Sint16
  859. controller_projectiles::circular_sin_320[] =
  860. { 15, -3, 13, -7, 11, -10, 9, -12, 7, -13, 3, -15, 0, -15,
  861. -3, -15, -6, -14, -9, -12, -11, -10, -13, -7, -14, -4, -15, -1,
  862. -15, 3, -13, 7, -11, 10, -9, 12, -7, 13, -3, 15, 0, 15,
  863. 3, 15, 6, 14, 9, 12, 11, 10, 13, 7, 14, 4, 15, 1,
  864. 99, 99, 99, 99
  865. };