mirror of
https://github.com/dwsJason/xrick2gs.git
synced 2024-09-12 22:54:34 +00:00
154 lines
2.8 KiB
C
154 lines
2.8 KiB
C
/*
|
|
* xrick/src/e_bomb.c
|
|
*
|
|
* Copyright (C) 1998-2002 BigOrno (bigorno@bigorno.net). All rights reserved.
|
|
*
|
|
* The use and distribution terms for this software are contained in the file
|
|
* named README, which can be found in the root of this distribution. By
|
|
* using this software in any fashion, you are agreeing to be bound by the
|
|
* terms of this license.
|
|
*
|
|
* You must not remove this notice, or any other, from this software.
|
|
*/
|
|
|
|
#include "system.h"
|
|
#include "game.h"
|
|
#include "ents.h"
|
|
#include "e_bomb.h"
|
|
|
|
#include "e_rick.h"
|
|
|
|
/*
|
|
* public vars (for performance reasons)
|
|
*/
|
|
U8 e_bomb_lethal;
|
|
U8 e_bomb_xc;
|
|
U16 e_bomb_yc;
|
|
|
|
/*
|
|
* private vars
|
|
*/
|
|
U8 e_bomb_ticker;
|
|
|
|
/*
|
|
* Bomb hit test
|
|
*
|
|
* ASM 11CD
|
|
* returns: TRUE/hit, FALSE/not
|
|
*/
|
|
U8 e_bomb_hit(U8 e)
|
|
{
|
|
if (ent_ents[e].x > (E_BOMB_ENT.x >= 0xE0 ? 0xFF : E_BOMB_ENT.x + 0x20))
|
|
return FALSE;
|
|
if (ent_ents[e].x + ent_ents[e].w < (E_BOMB_ENT.x > 0x04 ? E_BOMB_ENT.x - 0x04 : 0))
|
|
return FALSE;
|
|
if (ent_ents[e].y > (E_BOMB_ENT.y + 0x1D))
|
|
return FALSE;
|
|
if (ent_ents[e].y + ent_ents[e].h < (E_BOMB_ENT.y > 0x0004 ? E_BOMB_ENT.y - 0x0004 : 0))
|
|
return FALSE;
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
* Initialize bomb
|
|
*/
|
|
void e_bomb_init(U16 x, U16 y)
|
|
{
|
|
E_BOMB_ENT.n = 0x03;
|
|
E_BOMB_ENT.x = x;
|
|
E_BOMB_ENT.y = y;
|
|
e_bomb_ticker = E_BOMB_TICKER;
|
|
e_bomb_lethal = FALSE;
|
|
|
|
/*
|
|
* Atari ST dynamite sprites are not centered the
|
|
* way IBM PC sprites were ... need to adjust things a little bit
|
|
*/
|
|
#ifdef GFXST
|
|
E_BOMB_ENT.x += 4;
|
|
E_BOMB_ENT.y += 5;
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
* Entity action
|
|
*
|
|
* ASM 18CA
|
|
*/
|
|
void
|
|
e_bomb_action(UNUSED(U8 e))
|
|
{
|
|
/* tick */
|
|
e_bomb_ticker--;
|
|
|
|
if (e_bomb_ticker == 0)
|
|
{
|
|
/*
|
|
* end: deactivate
|
|
*/
|
|
E_BOMB_ENT.n = 0;
|
|
e_bomb_lethal = FALSE;
|
|
}
|
|
else if (e_bomb_ticker >= 0x0A)
|
|
{
|
|
/*
|
|
* ticking
|
|
*/
|
|
#ifdef ENABLE_SOUND
|
|
if ((e_bomb_ticker & 0x03) == 0x02)
|
|
syssnd_play(WAV_BOMBSHHT, 1);
|
|
#endif
|
|
#ifdef GFXST
|
|
/* ST bomb sprites sequence is longer */
|
|
if (e_bomb_ticker < 40)
|
|
E_BOMB_ENT.sprite = 0x99 + 19 - (e_bomb_ticker >> 1);
|
|
else
|
|
#endif
|
|
E_BOMB_ENT.sprite = (e_bomb_ticker & 0x01) ? 0x23 : 0x22;
|
|
}
|
|
else if (e_bomb_ticker == 0x09)
|
|
{
|
|
/*
|
|
* explode
|
|
*/
|
|
#ifdef ENABLE_SOUND
|
|
syssnd_play(WAV_EXPLODE, 1);
|
|
#endif
|
|
#ifdef GFXPC
|
|
E_BOMB_ENT.sprite = 0x24 + 4 - (e_bomb_ticker >> 1);
|
|
#endif
|
|
#ifdef GFXST
|
|
/* See above: fixing alignment */
|
|
E_BOMB_ENT.x -= 4;
|
|
E_BOMB_ENT.y -= 5;
|
|
E_BOMB_ENT.sprite = 0xa8 + 4 - (e_bomb_ticker >> 1);
|
|
#endif
|
|
e_bomb_xc = E_BOMB_ENT.x + 0x0C;
|
|
e_bomb_yc = E_BOMB_ENT.y + 0x000A;
|
|
e_bomb_lethal = TRUE;
|
|
if (e_bomb_hit(E_RICK_NO))
|
|
e_rick_gozombie();
|
|
}
|
|
else
|
|
{
|
|
/*
|
|
* exploding
|
|
*/
|
|
#ifdef GFXPC
|
|
E_BOMB_ENT.sprite = 0x24 + 4 - (e_bomb_ticker >> 1);
|
|
#endif
|
|
#ifdef GFXST
|
|
E_BOMB_ENT.sprite = 0xa8 + 4 - (e_bomb_ticker >> 1);
|
|
#endif
|
|
/* exploding, hence lethal */
|
|
if (e_bomb_hit(E_RICK_NO))
|
|
e_rick_gozombie();
|
|
}
|
|
}
|
|
|
|
/* eof */
|
|
|
|
|