Subversion Repositories Games.Rick Dangerous

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * src/e_bomb.c
  3.  *
  4.  * Copyright (C) 1998-2002 BigOrno (bigorno@bigorno.net). All rights reserved.
  5.  *
  6.  * The use and distribution terms for this software are contained in the file
  7.  * named README, which can be found in the root of this distribution. By
  8.  * using this software in any fashion, you are agreeing to be bound by the
  9.  * terms of this license.
  10.  *
  11.  * You must not remove this notice, or any other, from this software.
  12.  */
  13.  
  14. #include "system.h"
  15. #include "game.h"
  16. #include "ents.h"
  17. #include "e_bomb.h"
  18.  
  19. #include "e_rick.h"
  20.  
  21. /*
  22.  * public vars (for performance reasons)
  23.  */
  24. U8 e_bomb_lethal;
  25. U8 e_bomb_xc;
  26. U16 e_bomb_yc;
  27.  
  28. /*
  29.  * private vars
  30.  */
  31. U8 e_bomb_ticker;
  32.  
  33.  
  34. /*
  35.  * Bomb hit test
  36.  *
  37.  * ASM 11CD
  38.  * returns: TRUE/hit, FALSE/not
  39.  */
  40. U8 e_bomb_hit (U8 e)
  41. {
  42.    if (ent_ents[e].x > (E_BOMB_ENT.x >= 0xE0 ? 0xFF : E_BOMB_ENT.x + 0x20))
  43.       return FALSE;
  44.    if (ent_ents[e].x + ent_ents[e].w < (E_BOMB_ENT.x > 0x04 ? E_BOMB_ENT.x - 0x04 : 0))
  45.       return FALSE;
  46.    if (ent_ents[e].y > (E_BOMB_ENT.y + 0x1D))
  47.       return FALSE;
  48.    if (ent_ents[e].y + ent_ents[e].h < (E_BOMB_ENT.y > 0x0004 ? E_BOMB_ENT.y - 0x0004 : 0))
  49.       return FALSE;
  50.  
  51.    return TRUE;
  52. }
  53.  
  54.  
  55. /*
  56.  * Initialize bomb
  57.  */
  58. void e_bomb_init (U16 x, U16 y)
  59. {
  60.       E_BOMB_ENT.n = 0x03;
  61.       E_BOMB_ENT.x = x;
  62.       E_BOMB_ENT.y = y;
  63.       e_bomb_ticker = E_BOMB_TICKER;
  64.       e_bomb_lethal = FALSE;
  65.  
  66.       /*
  67.        * Atari ST dynamite sprites are not centered the
  68.        * way IBM PC sprites were ... need to adjust things a little bit
  69.        */
  70.       E_BOMB_ENT.x += 4;
  71.       E_BOMB_ENT.y += 5;
  72.  
  73. }
  74.  
  75.  
  76. /*
  77.  * Entity action
  78.  *
  79.  * ASM 18CA
  80.  */
  81. void e_bomb_action (U8 e)
  82. {
  83.    /* tick */
  84.    e_bomb_ticker--;
  85.  
  86.    if (e_bomb_ticker == 0)
  87.    {
  88.       /*
  89.        * end: deactivate
  90.        */
  91.       E_BOMB_ENT.n = 0;
  92.       e_bomb_lethal = FALSE;
  93.    }
  94.    else if (e_bomb_ticker >= 0x0A)
  95.    {
  96.       /*
  97.        * ticking
  98.        */
  99.       if ((e_bomb_ticker & 0x03) == 0x02)
  100.          syssnd_play (WAV_BOMBSHHT, 1);
  101.  
  102.       /* ST bomb sprites sequence is longer */
  103.       if (e_bomb_ticker < 40)
  104.          E_BOMB_ENT.sprite = 0x99 + 19 - (e_bomb_ticker >> 1);
  105.       else
  106.          E_BOMB_ENT.sprite = (e_bomb_ticker & 0x01) ? 0x23 : 0x22;
  107.    }
  108.    else if (e_bomb_ticker == 0x09)
  109.    {
  110.       if (E_RICK_STTST (E_RICK_STZOMBIE))
  111.          return;
  112.  
  113.       /*
  114.        * explode
  115.        */
  116.       syssnd_play (WAV_EXPLODE, 1);
  117.  
  118.       /* See above: fixing alignment */
  119.       E_BOMB_ENT.x -= 4;
  120.       E_BOMB_ENT.y -= 5;
  121.       E_BOMB_ENT.sprite = 0xa8 + 4 - (e_bomb_ticker >> 1);
  122.       e_bomb_xc = E_BOMB_ENT.x + 0x0C;
  123.       e_bomb_yc = E_BOMB_ENT.y + 0x000A;
  124.       e_bomb_lethal = TRUE;
  125.  
  126.       if (e_bomb_hit (E_RICK_NO))
  127.          e_rick_gozombie ();
  128.    }
  129.    else
  130.    {
  131.       if (E_RICK_STTST (E_RICK_STZOMBIE))
  132.          return;
  133.  
  134.       /*
  135.        * exploding
  136.        */
  137.       E_BOMB_ENT.sprite = 0xa8 + 4 - (e_bomb_ticker >> 1);
  138.  
  139.       /* exploding, hence lethal */
  140.       if (e_bomb_hit (E_RICK_NO))
  141.          e_rick_gozombie ();
  142.    }
  143. }
  144.