This commit is contained in:
parent
18f65a792e
commit
d64d22c9f8
2 changed files with 113 additions and 184 deletions
|
@ -1,6 +1,6 @@
|
||||||
/*************/
|
/**********************/
|
||||||
/*** Laser ***/
|
/*** ZZZZ (for FMA) ***/
|
||||||
/*************/
|
/**********************/
|
||||||
|
|
||||||
#include "system\global.h"
|
#include "system\global.h"
|
||||||
#include <DStructs.h>
|
#include <DStructs.h>
|
||||||
|
@ -12,197 +12,120 @@
|
||||||
#include "game\game.h"
|
#include "game\game.h"
|
||||||
#include "gfx\otpos.h"
|
#include "gfx\otpos.h"
|
||||||
|
|
||||||
#include "FX\FXLaser.h"
|
#include "FX\FXzzzz.h"
|
||||||
|
|
||||||
#ifndef __PLAYER_PLAYER_H__
|
static const int FRM_Z=FRM__90;
|
||||||
#include "player\player.h"
|
static const int ZLifeInc=-8;
|
||||||
#endif
|
static const int ZDelay=32;
|
||||||
|
|
||||||
int LaserWidth=1;
|
static const s16 XT[16]={ 0,+1,+2,+2,+3,+2,+2,+1,
|
||||||
|
0,-1,-2,-2,-3,-2,-2,-1};
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
void CFXLaser::init(DVECTOR const &_Pos)
|
void CFXZZZZ::init(DVECTOR const &_Pos)
|
||||||
{
|
{
|
||||||
CFX::init(_Pos);
|
CFX::init(_Pos);
|
||||||
Life=-1;
|
|
||||||
R=G=B=255;
|
|
||||||
Offset.vx=Offset.vy=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
for (int i=0;i<Z_COUNT; i++)
|
||||||
void CFXLaser::setOffset(DVECTOR &Pos)
|
{
|
||||||
{
|
Z[i].Life=0;
|
||||||
Offset=Pos;
|
}
|
||||||
}
|
Count=ZDelay;
|
||||||
|
DieFlag=0;
|
||||||
/*****************************************************************************/
|
|
||||||
void CFXLaser::setTarget(DVECTOR &Pos)
|
|
||||||
{
|
|
||||||
Target=Pos;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/*** Think *******************************************************************/
|
/*** Think *******************************************************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
void CFXLaser::think(int _frames)
|
void CFXZZZZ::think(int _frames)
|
||||||
{
|
{
|
||||||
CThing *Parent=getParent();
|
// CFX::think(_frames);
|
||||||
ASSERT(Parent);
|
|
||||||
|
|
||||||
Pos=Parent->getPos();
|
Count-=_frames;
|
||||||
|
|
||||||
|
if (Count<=0 && !DieFlag)
|
||||||
|
{ // Make new
|
||||||
|
|
||||||
|
Count=ZDelay;
|
||||||
|
|
||||||
|
int Idx;
|
||||||
|
for (Idx=0; Idx<Z_COUNT; Idx++)
|
||||||
|
{
|
||||||
|
if (Z[Idx].Life==0) break;
|
||||||
|
}
|
||||||
|
if (Idx<Z_COUNT)
|
||||||
|
{ // Got free
|
||||||
|
sZ &ThisZ=Z[Idx];
|
||||||
|
|
||||||
|
ThisZ.Ofs.vx=0;
|
||||||
|
ThisZ.Ofs.vy=0;
|
||||||
|
ThisZ.Life=256;
|
||||||
|
ThisZ.TablePos=getRnd() & 15;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move Em
|
||||||
|
for (int i=0;i<Z_COUNT; i++)
|
||||||
|
{
|
||||||
|
if (Z[i].Life>0)
|
||||||
|
{
|
||||||
|
Z[i].Ofs.vx+=XT[Z[i].TablePos]-1;
|
||||||
|
Z[i].Ofs.vy--;
|
||||||
|
Z[i].Life+=ZLifeInc;
|
||||||
|
if (Z[i].Life<0) Z[i].Life=0;
|
||||||
|
|
||||||
|
Z[i].TablePos++;
|
||||||
|
Z[i].TablePos&=15;
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Z[i].Life=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
if (DieFlag==1)
|
||||||
|
{
|
||||||
|
DieFlag++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (DieFlag==2)
|
||||||
|
{
|
||||||
|
CFX::killFX();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/*** Render ******************************************************************/
|
/*** Render ******************************************************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
void CFXLaser::render()
|
void CFXZZZZ::render()
|
||||||
{
|
{
|
||||||
DVECTOR renderPos0,renderPos1;
|
CFX::render();
|
||||||
sOT *ThisOT=OtPtr+OtPos;
|
DVECTOR renderPos;
|
||||||
|
getFXRenderPos(renderPos);
|
||||||
getFXRenderPos(renderPos0);
|
|
||||||
if (!canRender() || Flags & FX_FLAG_HIDDEN) return;
|
if (!canRender() || Flags & FX_FLAG_HIDDEN) return;
|
||||||
|
int Frame=FRM_Z;
|
||||||
|
if (DieFlag)
|
||||||
|
Frame=FRM__BUBBLEPOP;
|
||||||
|
|
||||||
calcRenderPos(Target,renderPos1);
|
POLY_FT4 *Ft4;
|
||||||
renderPos0.vx+=Offset.vx;
|
for (int i=0; i<Z_COUNT; i++)
|
||||||
renderPos0.vy+=Offset.vy;
|
|
||||||
// Main Beam
|
|
||||||
LINE_F2 *L=GetPrimLF2();
|
|
||||||
L->x0=renderPos0.vx; L->y0=renderPos0.vy;
|
|
||||||
L->x1=renderPos1.vx; L->y1=renderPos1.vy;
|
|
||||||
setRGB0(L,R,G,B); addPrim(ThisOT,L);
|
|
||||||
|
|
||||||
// Surround
|
|
||||||
POLY_F4 *P=GetPrimF4();
|
|
||||||
P->x0=renderPos0.vx-LaserWidth; P->y0=renderPos0.vy-LaserWidth;
|
|
||||||
P->x1=renderPos0.vx+LaserWidth; P->y1=renderPos0.vy+LaserWidth;
|
|
||||||
P->x2=renderPos1.vx-LaserWidth; P->y2=renderPos1.vy-LaserWidth;
|
|
||||||
P->x3=renderPos1.vx+LaserWidth; P->y3=renderPos1.vy+LaserWidth;
|
|
||||||
setRGB0(P,R>>1,G>>1,B>>1); addPrim(ThisOT,P);
|
|
||||||
|
|
||||||
//
|
|
||||||
int W=renderPos1.vx-renderPos0.vx;
|
|
||||||
int H=renderPos1.vy-renderPos0.vy;
|
|
||||||
|
|
||||||
setCollisionCentreOffset( (W>>1) + Offset.vx, (H>>1) + Offset.vy );
|
|
||||||
if (W<0) W=-W;
|
|
||||||
if (H<0) H=-H;
|
|
||||||
setCollisionSize(W,H);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/*** checkCollisionAgainst ***************************************************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
int CFXLaser::checkCollisionAgainst(CThing *_thisThing, int _frames)
|
|
||||||
{
|
|
||||||
DVECTOR pos,thisThingPos;
|
|
||||||
int radius;
|
|
||||||
int collided;
|
|
||||||
|
|
||||||
pos=getCollisionCentre();
|
|
||||||
thisThingPos=_thisThing->getCollisionCentre();
|
|
||||||
|
|
||||||
radius=getCollisionRadius()+_thisThing->getCollisionRadius();
|
|
||||||
collided=false;
|
|
||||||
if(abs(pos.vx-thisThingPos.vx)<radius&&
|
|
||||||
abs(pos.vy-thisThingPos.vy)<radius)
|
|
||||||
{
|
{
|
||||||
CRECT thisRect,thatRect;
|
sZ &ThisZ=Z[i];
|
||||||
|
|
||||||
thisRect=getCollisionArea();
|
if (ThisZ.Life)
|
||||||
|
|
||||||
thatRect=_thisThing->getCollisionArea();
|
|
||||||
|
|
||||||
if(((thisRect.x1>=thatRect.x1&&thisRect.x1<=thatRect.x2)||(thisRect.x2>=thatRect.x1&&thisRect.x2<=thatRect.x2)||(thisRect.x1<=thatRect.x1&&thisRect.x2>=thatRect.x2))&&
|
|
||||||
((thisRect.y1>=thatRect.y1&&thisRect.y1<=thatRect.y2)||(thisRect.y2>=thatRect.y1&&thisRect.y2<=thatRect.y2)||(thisRect.y1<=thatRect.y1&&thisRect.y2>=thatRect.y2)))
|
|
||||||
{
|
{
|
||||||
// bounding boxes touch, now check for line vs box collision
|
DVECTOR ThisPos;
|
||||||
|
int HLife=ThisZ.Life/2;
|
||||||
|
ThisPos.vx=renderPos.vx+ThisZ.Ofs.vx;
|
||||||
|
ThisPos.vy=renderPos.vy+ThisZ.Ofs.vy;
|
||||||
|
Ft4=CGameScene::getSpriteBank()->printFT4Scaled(Frame,ThisPos.vx,ThisPos.vy,0,0,OtPos,128+HLife);
|
||||||
|
setShadeTex(Ft4,0);
|
||||||
|
setSemiTrans(Ft4,1);
|
||||||
|
Ft4->tpage|=1<<5;
|
||||||
|
|
||||||
s32 w = thatRect.x2 - thatRect.x1;
|
setRGB0(Ft4,HLife,HLife,HLife);
|
||||||
s32 h = thatRect.y2 - thatRect.y1;
|
|
||||||
|
|
||||||
s32 a = ( thatRect.x1 + thatRect.x2 ) >> 1;
|
|
||||||
s32 b = ( thatRect.y1 + thatRect.y2 ) >> 1;
|
|
||||||
|
|
||||||
s32 x1 = Pos.vx + Offset.vx;
|
|
||||||
s32 y1 = Pos.vy + Offset.vy;
|
|
||||||
|
|
||||||
s32 x2 = Target.vx;
|
|
||||||
s32 y2 = Target.vy;
|
|
||||||
|
|
||||||
s32 t1, t2, t3, t4;
|
|
||||||
|
|
||||||
if ( x1 == x2 )
|
|
||||||
{
|
|
||||||
// vertical line
|
|
||||||
// bounding boxes already colliding
|
|
||||||
|
|
||||||
collided = true;
|
|
||||||
}
|
}
|
||||||
else if ( y1 == y2 )
|
|
||||||
{
|
|
||||||
// horizontal line
|
|
||||||
// bounding boxes already colliding
|
|
||||||
|
|
||||||
collided = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// see http://www.flipcode.com/tpractice/issue01.shtml
|
|
||||||
|
|
||||||
t1 = ( ( ( w >> 1 ) - x1 + a ) << 8 ) / ( x2 - x1 );
|
|
||||||
t2 = ( ( -( ( w >> 1 ) + x1 - a ) ) << 8 ) / ( x2 - x1 );
|
|
||||||
|
|
||||||
t3 = ( ( ( h >> 1 ) - y1 + b ) << 8 ) / ( y2 - y1 );
|
|
||||||
t4 = ( ( -( ( h >> 1 ) + y1 - b ) ) << 8 ) / ( y2 - y1 );
|
|
||||||
|
|
||||||
if ( t1 > t2 )
|
|
||||||
{
|
|
||||||
s32 temp = t2;
|
|
||||||
t2 = t1;
|
|
||||||
t1 = temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( t3 > t4 )
|
|
||||||
{
|
|
||||||
s32 temp = t4;
|
|
||||||
t4 = t3;
|
|
||||||
t3 = temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( t1 < t4 && t3 < t2 )
|
|
||||||
{
|
|
||||||
collided = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return collided;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/*** CollidedWith ************************************************************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
void CFXLaser::collidedWith(CThing *_thisThing)
|
|
||||||
{
|
|
||||||
switch(_thisThing->getThingType())
|
|
||||||
{
|
|
||||||
case TYPE_PLAYER:
|
|
||||||
{
|
|
||||||
CPlayer *player = (CPlayer *) _thisThing;
|
|
||||||
|
|
||||||
if ( !player->isRecoveringFromHit() )
|
|
||||||
{
|
|
||||||
player->takeDamage( DAMAGE__HIT_ENEMY );
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,31 +1,37 @@
|
||||||
/*************/
|
/**********************/
|
||||||
/*** Laser ***/
|
/*** ZZZZ (for FMA) ***/
|
||||||
/*************/
|
/**********************/
|
||||||
|
|
||||||
#ifndef __FX_FX_LASER_HEADER__
|
#ifndef __FX_FX_ZZZZ_HEADER__
|
||||||
#define __FX_FX_LASER_HEADER__
|
#define __FX_FX_ZZZZ_HEADER__
|
||||||
|
|
||||||
#include "fx/fx.h"
|
#include "fx/fx.h"
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
class CFXLaser : public CFX
|
class CFXZZZZ : public CFX
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
Z_COUNT=8,
|
||||||
|
};
|
||||||
|
struct sZ
|
||||||
|
{
|
||||||
|
DVECTOR Ofs;
|
||||||
|
s16 TablePos;
|
||||||
|
s16 Life;
|
||||||
|
};
|
||||||
|
|
||||||
void init(DVECTOR const &Pos);
|
void init(DVECTOR const &Pos);
|
||||||
void think(int _frames);
|
void think(int _frames);
|
||||||
void render();
|
void render();
|
||||||
/*virtual */int canCollide() {return true;}
|
|
||||||
/*virtual */int checkCollisionAgainst(CThing *_thisThing, int _frames);
|
|
||||||
|
|
||||||
void setOffset(DVECTOR &Pos);
|
void killFX() {DieFlag=1;}
|
||||||
void setTarget(DVECTOR &Pos);
|
|
||||||
|
|
||||||
void setRGB(u8 r,u8 g,u8 b) {R=r; G=g; B=g;}
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/*virtual */void collidedWith(CThing *_thisThing);
|
sZ Z[Z_COUNT];
|
||||||
DVECTOR Offset,Target;
|
s16 Count;
|
||||||
u8 R,G,B;
|
u8 DieFlag;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue