diff --git a/source/fx/fx.cpp b/source/fx/fx.cpp index 3e98054ed..90c84a94f 100644 --- a/source/fx/fx.cpp +++ b/source/fx/fx.cpp @@ -19,6 +19,7 @@ #include "FX\FXAttachAnim.h" +#include "FX\FXLaser.h" #include "FX\FXThwack.h" #include "FX\FXBubble.h" #include "FX\FXfallingTile.h" @@ -39,7 +40,7 @@ CFXBaseAnim::sFXAnim FXWaterSplashData= 127,127,255, 0, {0,0}, - 0, + CFX::FX_TYPE_NONE }; CFXBaseAnim::sFXAnim FXAcidSplashData= @@ -50,7 +51,7 @@ CFXBaseAnim::sFXAnim FXAcidSplashData= 127,255,127, 0, {0,0}, - 0 + CFX::FX_TYPE_NONE }; CFXBaseAnim::sFXAnim FXLavaSplashData= { @@ -60,7 +61,7 @@ CFXBaseAnim::sFXAnim FXLavaSplashData= 255,0,0, 0, {0,0}, - 0 + CFX::FX_TYPE_NONE }; CFXBaseAnim::sFXAnim FXOilSplashData= { @@ -81,7 +82,7 @@ CFXBaseAnim::sFXAnim FXExplodeData= 127,127,127, 0, {0,0}, - 0 + CFX::FX_TYPE_NONE }; CFXBaseAnim::sFXAnim FXFireData= @@ -92,7 +93,7 @@ CFXBaseAnim::sFXAnim FXFireData= 127,127,127, CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_TRANS, {0,0}, - 0 + CFX::FX_TYPE_NONE }; CFXBaseAnim::sFXAnim FXWaterDripData= @@ -145,7 +146,7 @@ CFXBaseAnim::sFXAnim FXBubbleWaterData= 127,127,255, CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL, {0,-1}, - CFX::FX_TYPE_SPLASH_WATER + CFX::FX_TYPE_NONE }; CFXBaseAnim::sFXAnim FXBubbleAcidData= @@ -156,7 +157,7 @@ CFXBaseAnim::sFXAnim FXBubbleAcidData= 0,255,0, CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL, {0,-1}, - CFX::FX_TYPE_SPLASH_WATER + CFX::FX_TYPE_NONE }; CFXBaseAnim::sFXAnim FXBubbleLavaData= { @@ -166,7 +167,7 @@ CFXBaseAnim::sFXAnim FXBubbleLavaData= 255,0,0, CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL, {0,-1}, - CFX::FX_TYPE_SPLASH_WATER + CFX::FX_TYPE_NONE }; CFXBaseAnim::sFXAnim FXBubbleOilData= { @@ -176,7 +177,7 @@ CFXBaseAnim::sFXAnim FXBubbleOilData= 32,32,32, CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL, {0,-1}, - CFX::FX_TYPE_SPLASH_WATER + CFX::FX_TYPE_NONE }; CFXBaseAnim::sFXAnim FXWaterFountainData= @@ -187,7 +188,7 @@ CFXBaseAnim::sFXAnim FXWaterFountainData= 127,127,255, CFXBaseAnim::FXANIM_FLAG_LOOP, {0,0}, - 0, + CFX::FX_TYPE_NONE }; CFXBaseAnim::sFXAnim FXAcidFountainData= { @@ -197,7 +198,7 @@ CFXBaseAnim::sFXAnim FXAcidFountainData= 0,255,0, CFXBaseAnim::FXANIM_FLAG_LOOP, {0,0}, - 0, + CFX::FX_TYPE_NONE }; CFXBaseAnim::sFXAnim FXLavaFountainData= { @@ -207,7 +208,7 @@ CFXBaseAnim::sFXAnim FXLavaFountainData= 255,0,0, CFXBaseAnim::FXANIM_FLAG_LOOP, {0,0}, - 0, + CFX::FX_TYPE_NONE }; CFXBaseAnim::sFXAnim FXOilFountainData= { @@ -217,22 +218,20 @@ CFXBaseAnim::sFXAnim FXOilFountainData= 32,32,32, CFXBaseAnim::FXANIM_FLAG_LOOP, {0,0}, - 0, + CFX::FX_TYPE_NONE }; /*****************************************************************************/ -/* -CFXSteam *TestFXPtr=0; -void TestFX(DVECTOR Pos) + +CFXLaser *TestFXPtr=0; +void TestFX(DVECTOR Pos,CThing *Parent) { if (!TestFXPtr) { - Pos.vx=256; - Pos.vy=128; - TestFXPtr=(CFXSteam*)CFX::Create(CFX::FX_TYPE_STEAM,Pos); - TestFXPtr->setLife(32); - TestFXPtr->setRelativeToMap(false); - TestFXPtr=0; + TestFXPtr=(CFXLaser*)CFX::Create(CFX::FX_TYPE_LASER,Parent); +// TestFXPtr->setLife(32); +// TestFXPtr->setRelativeToMap(false); +// TestFXPtr=0; } else { @@ -240,18 +239,27 @@ void TestFX(DVECTOR Pos) TestFXPtr=0; } } -*/ + /*****************************************************************************/ -int FXType=(CFX::FX_TYPE)CFX::FX_TYPE_THWACK; +/* +int FXType=(CFX::FX_TYPE)CFX::FX_TYPE_LASER; #include "game\game.h" + +int OX=32; +int OY=32; void TestFX(DVECTOR Pos,CThing *Parent) { -//CFXAttachAnim *FX=(CFXAttachAnim*)CFX::Create((CFX::FX_TYPE)FXType,Pos); +CFXLaser *FX=(CFXLaser*)CFX::Create((CFX::FX_TYPE)FXType,Pos); + +// FX->setOrigin(Pos); + Pos.vx+=OX; + Pos.vy+=OY; + FX->setTarget(Pos); // Parent->addChild(FX); // TestFXPtr->setLife(32); - CGameScene::dropHealth(Pos,0,0); +// CGameScene::dropHealth(Pos,0,0); } - +*/ /*****************************************************************************/ CFX *CFX::Create(const FX_TYPE Type) { @@ -261,6 +269,9 @@ CFX *NewFX; if (!NewFX) switch(Type) { + case FX_TYPE_NONE: + ASSERT(!"FX NONE CANT BE CREATED!"); + break; case FX_TYPE_FALLINGTILE: NewFX=new ("FXFalling Tile") CFXFallingTile(); break; @@ -355,18 +366,12 @@ CFX *NewFX; NewFX=new ("JellyFish Legs") CFXJellyFishLegs(); break; + case FX_TYPE_LASER: + NewFX=new ("FX Laser") CFXLaser(); + break; + case FX_TYPE_LIGHTNING_BOLT: - case FX_TYPE_LIGHTNING_SHEET: - case FX_TYPE_LIGHTNING_BLAST: - case FX_TYPE_LIGHTNING_RADIAL: - case FX_TYPE_LIGHTNING_PROJECTILE: - case FX_TYPE_SHOCKWAVE: case FX_TYPE_DAZE: - - case FX_TYPE_CASCADE: - case FX_TYPE_CASCADE_SPLASH: - case FX_TYPE_FIREBALL: - case FX_TYPE_SMOKE: case FX_TYPE_GAS: diff --git a/source/fx/fx.h b/source/fx/fx.h index 5f2ed5f9e..1ddf39217 100644 --- a/source/fx/fx.h +++ b/source/fx/fx.h @@ -13,10 +13,7 @@ class CFX : public CFXThing public: enum FX_TYPE { - FX_TYPE_JELLYFISH_LEGS, // zero also used to chain fx, so first must be unique type (I know what I mean) - FX_TYPE_FALLINGTILE, - - FX_TYPE_EXPLODE, + FX_TYPE_NONE=0, FX_TYPE_SPLASH_WATER, FX_TYPE_SPLASH_ACID, @@ -41,23 +38,19 @@ public: FX_TYPE_THWACK, FX_TYPE_LIGHTNING_BOLT, - FX_TYPE_LIGHTNING_SHEET, - FX_TYPE_LIGHTNING_BLAST, - FX_TYPE_LIGHTNING_RADIAL, - FX_TYPE_LIGHTNING_PROJECTILE, - + FX_TYPE_SHOCKWAVE, FX_TYPE_DAZE, - - FX_TYPE_CASCADE, - FX_TYPE_CASCADE_SPLASH, - FX_TYPE_FIREBALL, FX_TYPE_STEAM, FX_TYPE_SMOKE, FX_TYPE_GAS, FX_TYPE_FLAMES, + FX_TYPE_JELLYFISH_LEGS, + FX_TYPE_FALLINGTILE, + FX_TYPE_EXPLODE, FX_TYPE_NRG_BAR, + FX_TYPE_LASER, FX_TYPE_MAX }; enum diff --git a/source/fx/fxbaseanim.cpp b/source/fx/fxbaseanim.cpp index 6740c3725..a8c7b422a 100644 --- a/source/fx/fxbaseanim.cpp +++ b/source/fx/fxbaseanim.cpp @@ -80,7 +80,7 @@ void CFXBaseAnim::killFX() { setToShutdown(); // If has follow on effect, create it now - if (DataPtr->EndFX || canThink()) + if (DataPtr->EndFX!=CFX::FX_TYPE_NONE && canThink()) { CFX::Create((CFX::FX_TYPE)DataPtr->EndFX,getPos()); } diff --git a/source/fx/fxlaser.cpp b/source/fx/fxlaser.cpp index e3eaa3ff4..f6b1da65f 100644 --- a/source/fx/fxlaser.cpp +++ b/source/fx/fxlaser.cpp @@ -1,6 +1,6 @@ -/*****************/ -/*** Thwack!!! ***/ -/*****************/ +/*************/ +/*** Laser ***/ +/*************/ #include "system\global.h" #include @@ -12,37 +12,78 @@ #include "game\game.h" #include "gfx\otpos.h" -#include "FX\FXThwack.h" +#include "FX\FXLaser.h" -const int ThwackLife=12; +int LaserWidth=1; /*****************************************************************************/ -void CFXThwack::init(DVECTOR const &_Pos) +void CFXLaser::init(DVECTOR const &_Pos) { CFX::init(_Pos); - Life=ThwackLife; - OtPos=OTPOS__ACTOR_POS-1; - Angle=getRnd()&4095; - Scale=2048+1024+(getRnd()&2047); + Life=-1; + R=G=B=255; + Offset.vx=Offset.vy=0; +} + +/*****************************************************************************/ +void CFXLaser::setOffset(DVECTOR &Pos) +{ + Offset=Pos; +} + +/*****************************************************************************/ +void CFXLaser::setTarget(DVECTOR &Pos) +{ + Target=Pos; +} + +/*****************************************************************************/ +/*** Think *******************************************************************/ +/*****************************************************************************/ +void CFXLaser::think(int _frames) +{ +CThing *Parent=getParent(); + ASSERT(Parent); + + Pos=Parent->getPos(); } /*****************************************************************************/ /*** Render ******************************************************************/ /*****************************************************************************/ - -void CFXThwack::render() +void CFXLaser::render() { -DVECTOR RenderPos; +DVECTOR renderPos0,renderPos1; +sOT *ThisOT=OtPtr+OtPos; - getFXRenderPos(RenderPos); + getFXRenderPos(renderPos0); if (!canRender() || !IsVisible) return; -SpriteBank *SprBank=CGameScene::getSpriteBank(); -POLY_FT4 *Ft4=SprBank->printRotatedScaledSprite(FRM__THWACK,RenderPos.vx,RenderPos.vy,Scale,Scale,Angle,OtPos); - setSemiTrans(Ft4,1); - Ft4->tpage|=1<<5; -int Col=(256/ThwackLife)*Life; - setRGB0(Ft4,Col,Col,Col); + calcRenderPos(Target,renderPos1); + renderPos0.vx+=Offset.vx; + 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; + + if (W<0) W=-W; + if (H<0) H=-H; + setCollisionCentreOffset(W>>1,H>>1); + setCollisionSize(W,H); } diff --git a/source/fx/fxlaser.h b/source/fx/fxlaser.h index ff3370545..27b5b2687 100644 --- a/source/fx/fxlaser.h +++ b/source/fx/fxlaser.h @@ -1,21 +1,28 @@ -/*****************/ -/*** Thwack!!! ***/ -/*****************/ +/*************/ +/*** Laser ***/ +/*************/ -#ifndef __FX_FX_THWACK_HEADER__ -#define __FX_FX_THWACK_HEADER__ +#ifndef __FX_FX_LASER_HEADER__ +#define __FX_FX_LASER_HEADER__ #include "fx/fx.h" /*****************************************************************************/ -class CFXThwack : public CFX +class CFXLaser : public CFX { public: -virtual void init(DVECTOR const &Pos); -virtual void render(); + void init(DVECTOR const &Pos); + void think(int _frames); + void render(); + + void setOffset(DVECTOR &Pos); + void setTarget(DVECTOR &Pos); + + void setRGB(u8 r,u8 g,u8 b) {R=r; G=g; B=g;} protected: - u16 Angle,Scale; + DVECTOR Offset,Target; + u8 R,G,B; }; #endif