diff --git a/makefile.gaz b/makefile.gaz index ef9ce3e38..caeab37a0 100644 --- a/makefile.gaz +++ b/makefile.gaz @@ -156,15 +156,11 @@ hazard_src := hazard \ fx_src := fx \ fxbaseanim \ fxbasetrail \ + fxbaseemitter \ fxnrgbar \ fxjfish \ fxfallingtile \ - fxsteam \ - fxsplash \ - fxsplashacid \ - fxsplashlava \ - fxsplashoil \ - fxexplode + fxsteam projectl_src := projectl \ prnpc \ diff --git a/source/fx/fx.cpp b/source/fx/fx.cpp index 000ad5883..5919f547c 100644 --- a/source/fx/fx.cpp +++ b/source/fx/fx.cpp @@ -15,62 +15,54 @@ #include "FX\FXjfish.h" #include "FX\FXBaseTrail.h" #include "FX\FXBaseAnim.h" +#include "FX\FXBaseEmitter.h" + #include "FX\FXfallingTile.h" #include "FX\FXSteam.h" -#include "FX\FXSplash.h" -#include "FX\FXSplashAcid.h" -#include "FX\FXSplashLava.h" -#include "FX\FXSplashOil.h" -#include "FX\FXExplode.h" + #include "FX\FXNrgBar.h" -/* FX - Jellyfish legs - Bubbles (inc acid) - Electricity lightning bolt - Electricity sheet lightning - Electricity Blast - Electricity Radial? - Electricity projectile +/*****************************************************************************/ +/*****************************************************************************/ +/*****************************************************************************/ +// Anim Data +CFXBaseAnim::sFXData FXWaterSplashData= +{ + ONE, + FRM__SPLASH001,FRM__SPLASH006, + 1, + 127,127,255 +}; - Shockwave - From falling items - Daze stars - - water/acid/lava/oil - drip - splashes - - - water/acid/lava.oil - drops - waterfall - waterfall end (splash) - - fireballs - - steam - smoke - flames - marsh gas - - explosions (implode!!) - - Coral debris - -*************************** -Level Effect Emitters - - Bubble - Acid drip - Acid Flow - steam - smoke - fireballs - flames - gas - -*/ +CFXBaseAnim::sFXData FXAcidSplashData= +{ + ONE, + FRM__SPLASH001,FRM__SPLASH006, + 1, + 0,255,0 +}; +CFXBaseAnim::sFXData FXLavaSplashData= +{ + ONE, + FRM__SPLASH001,FRM__SPLASH006, + 1, + 255,0,0 +}; +CFXBaseAnim::sFXData FXOilSplashData= +{ + ONE, + FRM__SPLASH001,FRM__SPLASH006, + 1, + 0,0,0 +}; +CFXBaseAnim::sFXData FXExplodeData= +{ + ONE, + FRM__EXPLOSION0001,FRM__EXPLOSION0006, + 1, + 127,127,127 +}; /*****************************************************************************/ /* @@ -79,21 +71,25 @@ void TestFX(DVECTOR Pos) { 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; } else { - TestFXPtr->setDie(); + TestFXPtr->killFX(); TestFXPtr=0; } } */ /*****************************************************************************/ +int FXType=(CFX::FX_TYPE)0; void TestFX(DVECTOR Pos) { - CFX::Create(CFX::FX_TYPE_SPLASH,Pos); + CFX::Create((CFX::FX_TYPE)FXType,Pos); // TestFXPtr->setLife(32); } @@ -112,26 +108,27 @@ CFX *NewFX; case FX_TYPE_STEAM: NewFX=new ("FXSteam") CFXSteam(); break; - case FX_TYPE_SPLASH: - NewFX=new ("FXSplash") CFXSplash(); - break; case FX_TYPE_SPLASH_WATER: - NewFX=new ("FXSplash") CFXSplash(); + NewFX=new ("FXWaterSplash") CFXBaseAnim(); + NewFX->setData(&FXWaterSplashData); break; case FX_TYPE_SPLASH_ACID: - NewFX=new ("FXSplashAcid") CFXSplashAcid(); + NewFX=new ("FXAcidSplash") CFXBaseAnim(); + NewFX->setData(&FXAcidSplashData); break; case FX_TYPE_SPLASH_LAVA: - NewFX=new ("FXSplashLava") CFXSplashLava(); + NewFX=new ("FXLavaSplash") CFXBaseAnim(); + NewFX->setData(&FXLavaSplashData); break; case FX_TYPE_SPLASH_OIL: - NewFX=new ("FXSplashOil") CFXSplashOil(); + NewFX=new ("FXOilSplash") CFXBaseAnim(); + NewFX->setData(&FXOilSplashData); break; case FX_TYPE_EXPLODE: - NewFX=new ("FXExplode") CFXExplode(); + NewFX=new ("FXExplode") CFXBaseAnim(); + NewFX->setData(&FXExplodeData); break; - case FX_TYPE_NRG_BAR: NewFX=new ("NRG Bar") CFXNRGBar(); break; @@ -140,12 +137,10 @@ CFX *NewFX; NewFX=new ("JellyFish Legs") CFXJellyFishLegs(); break; - - case FX_TYPE_BUBBLE: - case FX_TYPE_BUBBLE_WATER: - case FX_TYPE_BUBBLE_ACID: - case FX_TYPE_BUBBLE_LAVA: - case FX_TYPE_BUBBLE_OIL: + case FX_TYPE_BUBBLE_WATER: + case FX_TYPE_BUBBLE_ACID: + case FX_TYPE_BUBBLE_LAVA: + case FX_TYPE_BUBBLE_OIL: case FX_TYPE_LIGHTNING_BOLT: case FX_TYPE_LIGHTNING_SHEET: case FX_TYPE_LIGHTNING_BLAST: @@ -153,18 +148,19 @@ CFX *NewFX; case FX_TYPE_LIGHTNING_PROJECTILE: case FX_TYPE_SHOCKWAVE: case FX_TYPE_DAZE: - case FX_TYPE_DROP: - case FX_TYPE_DROP_WATER: - case FX_TYPE_DROP_ACID: - case FX_TYPE_DROP_LAVA: - case FX_TYPE_DROP_OIL: + + case FX_TYPE_DROP_WATER: + case FX_TYPE_DROP_ACID: + case FX_TYPE_DROP_LAVA: + case FX_TYPE_DROP_OIL: case FX_TYPE_CASCADE: case FX_TYPE_CASCADE_SPLASH: case FX_TYPE_FIREBALL: - case FX_TYPE_SMOKE: - case FX_TYPE_GAS: + + case FX_TYPE_SMOKE: + case FX_TYPE_GAS: + case FX_TYPE_FLAMES: - case FX_TYPE_DEBRIS: default: ASSERT(!"UNKNOWN FX TYPE"); @@ -203,8 +199,15 @@ void CFX::init() { CFXThing::init(); OtPos=OTPOS__ACTOR_POS; + RelativeToMap=true; + Life=-1; // Set to immortal +} - Life=-1; +/*****************************************************************************/ +void CFX::init(DVECTOR const &_Pos) +{ + init(); + Pos=_Pos; } /*****************************************************************************/ @@ -217,12 +220,13 @@ void CFX::shutdown() void CFX::think(int _frames) { CFXThing::think(_frames); + if (Life>0) { - Life--; - if (Life==0 && !DieOut) + Life-=_frames; + if (Life<=0) { - setDie(); + killFX(); } } @@ -234,3 +238,33 @@ void CFX::render() CFXThing::render(); } +/*****************************************************************************/ +bool CFX::getFXParentPos(DVECTOR &Pos) +{ +CThing *Parent=getParent(); + if (!Parent) return(false); + + if (RelativeToMap) + { + Pos=Parent->getPos(); + } + else + { + Pos=getPos(); + } + return(true); +} + +/*****************************************************************************/ +void CFX::getFXRenderPos(DVECTOR &Pos) +{ + if (RelativeToMap) + { + CFX::render(); + Pos=getRenderPos(); + } + else + { + Pos=getPos(); + } +} diff --git a/source/fx/fx.h b/source/fx/fx.h index da93f366c..2a2712219 100644 --- a/source/fx/fx.h +++ b/source/fx/fx.h @@ -7,6 +7,19 @@ #include "thing/thing.h" +/*****************************************************************************/ +/* +struct sFXData +{ + s16 StartLife; + s16 StartScale; + s16 StartFrame,EndFrame; + DVECTOR Velocity; + u8 R,G,B; + u16 Trans; + +}; +*/ /*****************************************************************************/ class CFX : public CFXThing { @@ -15,28 +28,33 @@ public: { FX_TYPE_JELLYFISH_LEGS, FX_TYPE_FALLINGTILE, - FX_TYPE_BUBBLE, - FX_TYPE_BUBBLE_WATER, - FX_TYPE_BUBBLE_ACID, - FX_TYPE_BUBBLE_LAVA, - FX_TYPE_BUBBLE_OIL, + + FX_TYPE_EXPLODE, + + FX_TYPE_SPLASH_WATER, + FX_TYPE_SPLASH_ACID, + FX_TYPE_SPLASH_LAVA, + FX_TYPE_SPLASH_OIL, + + FX_TYPE_BUBBLE_WATER, + FX_TYPE_BUBBLE_ACID, + FX_TYPE_BUBBLE_LAVA, + FX_TYPE_BUBBLE_OIL, + + FX_TYPE_DROP_WATER, + FX_TYPE_DROP_ACID, + FX_TYPE_DROP_LAVA, + FX_TYPE_DROP_OIL, + 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_DROP, - FX_TYPE_DROP_WATER, - FX_TYPE_DROP_ACID, - FX_TYPE_DROP_LAVA, - FX_TYPE_DROP_OIL, - FX_TYPE_SPLASH, - FX_TYPE_SPLASH_WATER, - FX_TYPE_SPLASH_ACID, - FX_TYPE_SPLASH_LAVA, - FX_TYPE_SPLASH_OIL, + FX_TYPE_CASCADE, FX_TYPE_CASCADE_SPLASH, FX_TYPE_FIREBALL, @@ -44,8 +62,6 @@ public: FX_TYPE_SMOKE, FX_TYPE_GAS, FX_TYPE_FLAMES, - FX_TYPE_EXPLODE, - FX_TYPE_DEBRIS, FX_TYPE_NRG_BAR, FX_TYPE_MAX @@ -58,24 +74,29 @@ public: static CFX *Create(const FX_TYPE Type); static CFX *Create(const FX_TYPE Type,CThing *Parent); static CFX *Create(const FX_TYPE Type,DVECTOR const &Pos); +virtual bool alwaysThink() {return(!RelativeToMap);} virtual void init(); -virtual void init(DVECTOR const &Pos){}; +virtual void init(DVECTOR const &Pos); virtual void shutdown(); virtual void think(int _frames); virtual void render(); - +virtual void setData(void *Data){}; virtual int canCollide() {return false;} virtual void SetOtPos(int Ot) {OtPos=Ot;} -virtual void setDie() {DieOut=true;} virtual void setLife(int L) {Life=L;} +virtual void setRelativeToMap(bool f) {RelativeToMap=f;} + +virtual void getFXRenderPos(DVECTOR &Pos); +virtual bool getFXParentPos(DVECTOR &Pos); + +virtual void killFX() {setToShutdown();} protected: s32 OtPos; - - u8 DieOut; s16 Life; + bool RelativeToMap; }; /*****************************************************************************/ diff --git a/source/fx/fxbaseanim.cpp b/source/fx/fxbaseanim.cpp index 0343ce147..0b125713c 100644 --- a/source/fx/fxbaseanim.cpp +++ b/source/fx/fxbaseanim.cpp @@ -12,16 +12,13 @@ #include "game\game.h" #include "FX\FXBaseAnim.h" - -/*****************************************************************************/ -/*****************************************************************************/ /*****************************************************************************/ void CFXBaseAnim::init(DVECTOR const &_Pos) { - CFX::init(); - Pos=_Pos; - SetFrame(0,0); - Scale=ONE; + CFX::init(_Pos); + CurrentFrame=0; + CurrentScale=DataPtr->Scale; + Life=((DataPtr->EndFrame-DataPtr->StartFrame)<FrameShift)-1; } /*****************************************************************************/ @@ -30,24 +27,14 @@ void CFXBaseAnim::shutdown() CFX::shutdown(); } -/*****************************************************************************/ -void CFXBaseAnim::SetFrame(int Base,int Count,int Shift=0) -{ - Frame=0; - BaseFrame=Base; - FrameShift=Shift; - MaxFrame=(Count<=MaxFrame) setToShutdown(); + CurrentFrame+=_frames; + Pos.vy-=4; } /*****************************************************************************/ @@ -55,16 +42,18 @@ void CFXBaseAnim::think(int _frames) /*****************************************************************************/ void CFXBaseAnim::render() { - CFX::render(); +DVECTOR RenderPos; + + getFXRenderPos(RenderPos); + if (!canRender()) return; - if (!canRender() || isSetToShutdown()) return; SpriteBank *SprBank=CGameScene::getSpriteBank(); -DVECTOR &RenderPos=getRenderPos(); -int ThisFrame=Frame>>FrameShift; -POLY_FT4 *Ft4=SprBank->printFT4Scaled(BaseFrame+ThisFrame,RenderPos.vx,RenderPos.vy,0,0,OtPos*0,Scale>>4); +int ThisFrame=CurrentFrame>>DataPtr->FrameShift; + +POLY_FT4 *Ft4=SprBank->printFT4Scaled(DataPtr->StartFrame+ThisFrame,RenderPos.vx,RenderPos.vy,0,0,OtPos,CurrentScale>>4); Ft4->u1--; Ft4->u3--; Ft4->v2--; Ft4->v3--; - setRGB0(Ft4,R,G,B); - + setShadeTex(Ft4,0); + setRGB0(Ft4,DataPtr->R,DataPtr->G,DataPtr->B); } diff --git a/source/fx/fxbaseanim.h b/source/fx/fxbaseanim.h index 0c3ed2a4f..97fff65ac 100644 --- a/source/fx/fxbaseanim.h +++ b/source/fx/fxbaseanim.h @@ -11,21 +11,27 @@ class CFXBaseAnim : public CFX { public: + struct sFXData + { + s16 Scale; + s16 StartFrame,EndFrame; + s16 FrameShift; + u8 R,G,B; + }; virtual void init(DVECTOR const &Pos); virtual void shutdown(); virtual void think(int _frames); virtual void render(); -virtual void SetScale(int S) {Scale=S;} -virtual void SetFrame(int Base,int Count,int Shift=0); + void setData(void *Data) {DataPtr=(sFXData*)Data;} + +virtual void SetScale(int S) {CurrentScale=S;} protected: - s16 BaseFrame,Frame; - s16 MaxFrame; - s16 FrameShift; + sFXData *DataPtr; - s16 Scale; - u8 R,G,B; + s16 CurrentFrame; + s16 CurrentScale; }; #endif diff --git a/source/fx/fxbaseemitter.cpp b/source/fx/fxbaseemitter.cpp index 74a6a627c..5f69750e4 100644 --- a/source/fx/fxbaseemitter.cpp +++ b/source/fx/fxbaseemitter.cpp @@ -10,64 +10,54 @@ #include #include "level\level.h" #include "game\game.h" -#include "FX\FXEmitter.h" +#include "FX\FXBaseEmitter.h" /*****************************************************************************/ /*****************************************************************************/ /*****************************************************************************/ -void CFXEmitter::init(DVECTOR const &_Pos) +void CFXBaseEmitter::init(DVECTOR const &_Pos) { - CFX::init(); - Pos=_Pos; - SetFrame(0,0); - Scale=ONE; - BirthCount=0; + CFX::init(_Pos); + Width=Height=16; + CurrentCount=DataPtr->Rate; + Life=DataPtr->Life; } /*****************************************************************************/ -void CFXEmitter::shutdown() +void CFXBaseEmitter::shutdown() { CFX::shutdown(); } -/*****************************************************************************/ -void CFXEmitter::setUp(int W,int H,int Rate,int Amount,int Life) -{ - SetSize(W,H); - SetRate(Rate,Amount); - SetLife(L); -} - /*****************************************************************************/ /*** Think *******************************************************************/ /*****************************************************************************/ -void CFXEmitter::think(int _frames) +void CFXBaseEmitter::think(int _frames) { CFX::think(_frames); - BirthCount-=_frames; - if (BirthCount<=0) + CurrentCount-=_frames; + if (CurrentCount<=0) { - BirthCount=BirthRate; - Create(_frames); + CurrentCount=DataPtr->Rate; + createParticle(_frames); } - Life--; - if (Life - + } /*****************************************************************************/ -void CFXEmitter::Create(int _frames) +void CFXBaseEmitter::createParticle(int _frames) { - + CFX::Create(DataPtr->ParticleType,getPos()); } /*****************************************************************************/ /*** Render ******************************************************************/ /*****************************************************************************/ -void CFXEmitter::render() +void CFXBaseEmitter::render() { +/* DVECTOR renderPos; if (MapEmitter) { @@ -77,15 +67,16 @@ DVECTOR renderPos; } else { - renderPos=getPos() + renderPos=getPos(); } POLY_F4 *f4; f4=GetPrimF4(); setPolyF4(f4); - setXYWH(f4,renderPos.vx,renderPos.vy,Width.Height); + setXYWH(f4,renderPos.vx,renderPos.vy,Width,Height); setSemiTrans(f4,1); setShadeTex(f4,0); setRGB0(f4,30,40,50); AddPrimToList(f4,0); +*/ } diff --git a/source/fx/fxbaseemitter.h b/source/fx/fxbaseemitter.h index 8d3248a54..5738d646e 100644 --- a/source/fx/fxbaseemitter.h +++ b/source/fx/fxbaseemitter.h @@ -2,78 +2,36 @@ /*** Emitter Base Class ***/ /**************************/ -#ifndef __FX_FX_EMITTER_HEADER__ -#define __FX_FX_EMITTER_HEADER__ +#ifndef __FX_FX_BASE_EMITTER_HEADER__ +#define __FX_FX_BASE_EMITTER_HEADER__ #include "fx/fx.h" /*****************************************************************************/ -class CFXEmitter : public CFX +class CFXBaseEmitter : public CFX { public: + struct sFXData + { + u16 Rate,Amount; + u16 Life; + CFX::FX_TYPE ParticleType; + }; virtual void init(DVECTOR const &Pos); virtual void shutdown(); virtual void think(int _frames); virtual void render(); + void setData(void *Data) {DataPtr=(sFXData*)Data;} -virtual void setUp(int W,int H,int Rate,int Amount,int Life); +virtual void setSize(int W,int H) {Width=W; Height=H;} +virtual void createParticle(int _frames); -virtual void create(int _frames); - - void SetSize(int W,int H) {Width=W; Height=H;} - void SetRate(int Rate,int Amount) {BirthRate=Rate; BirthAmount=Amount;} - void SetLife(int L) {Life=L;} protected: + sFXData *DataPtr; s16 Width,Height; - s16 BirthRate,BirthAmount; - s16 BirthCount; - s16 Life; - bool MapEmitter; + s16 CurrentCount; }; #endif -/* -typedef struct -{ - int m_x,m_y,m_w,m_h; // Size and position of emitter - s16 m_birthRate,m_birthAmount; // birthAmount bubicles born every birthRate frames - s16 m_life; // -1 for infinite life - s16 m_applyMapOffset; // Is bubicle position relative to the map or not? - - BubicleData m_bubicleBase; - BubicleData m_bubicleRange; -} BubicleEmitterData; - -class CBubicleEmitter -{ -public: - void kill(); - void setPos(int _x,int _y); - void setSize(int _w,int _h); - void setPosAndSize(int _x,int _y,int _w,int _h) {setPos(_x,_y);setSize(_w,_h);} - - int isActive() {return m_active;} - - -private: - CBubicleEmitter() {;} - - void create(); - void init(BubicleEmitterData *_init); - - void think(int _frames); -#ifdef SHOW_BUBICLE_EMITTERS - void render(); -#endif - - - u8 m_active; - BubicleEmitterData m_data; - int m_frameCount; - s16 m_spawnFrameCount; - -friend class CBubicleFactory; -}; -*/ \ No newline at end of file diff --git a/source/fx/fxbasetrail.cpp b/source/fx/fxbasetrail.cpp index 3e5ce4a96..c4dc1a132 100644 --- a/source/fx/fxbasetrail.cpp +++ b/source/fx/fxbasetrail.cpp @@ -23,7 +23,6 @@ void CFXBaseTrail::init(DVECTOR const &_Pos) Pos=_Pos; HeadIdx=0; ListCount=0; - DieOut=0; } /*****************************************************************************/ @@ -37,11 +36,12 @@ void CFXBaseTrail::shutdown() /*****************************************************************************/ void CFXBaseTrail::think(int _frames) { -CThing *Parent=getParent(); +DVECTOR Pos; +bool hasParent=getFXParentPos(Pos); - if (Parent) + if (hasParent) { - this->setPos(Parent->getPos()); + setPos(Pos); } } @@ -61,11 +61,12 @@ CFXBaseTrail::sList &CFXBaseTrail::moveHead() void CFXBaseTrail::render() { - CFX::render(); +DVECTOR RenderPos; + + getFXRenderPos(RenderPos); if (canRender()) { - DVECTOR RenderPos=getRenderPos(); SpriteBank *SprBank=CGameScene::getSpriteBank(); int ThisIdx=HeadIdx; int StartY=RenderPos.vy; diff --git a/source/fx/fxbasetrail.h b/source/fx/fxbasetrail.h index a845e879b..d545536fe 100644 --- a/source/fx/fxbasetrail.h +++ b/source/fx/fxbasetrail.h @@ -11,6 +11,14 @@ class CFXBaseTrail : public CFX { public: + struct sFXData + { + s16 Scale; + s16 StartFrame,EndFrame; + s16 FrameShift; + u8 R,G,B; + }; + struct sList { u16 Frame; diff --git a/source/fx/fxfallingtile.cpp b/source/fx/fxfallingtile.cpp index e4f2e7334..a8799f74a 100644 --- a/source/fx/fxfallingtile.cpp +++ b/source/fx/fxfallingtile.cpp @@ -14,7 +14,6 @@ /*****************************************************************************/ -int TT=1; const int FallingTile_DefVY=-2; const int FallingTile_DefLife=32; @@ -35,8 +34,6 @@ sLevelHdr *LevelHdr=CLevel::getLevelHdr(); Velocity.vx=getRndRange(7)-4; Velocity.vy=FallingTile_DefVY; Life=FallingTile_DefLife; - Tile=TT++; - } /*****************************************************************************/ @@ -54,8 +51,6 @@ void CFXFallingTile::think(int _frames) Pos.vx+=Velocity.vx; Pos.vy+=Velocity.vy; Velocity.vy++; - Life--; - if (!Life) setToShutdown(); } /*****************************************************************************/ @@ -68,7 +63,7 @@ void CFXFallingTile::render() { CFX::render(); - if (!canRender() && Life) return; + if (!canRender()) return; u8 *PrimPtr=GetPrimPtr(); POLY_FT3 *TPrimPtr=(POLY_FT3*)PrimPtr; diff --git a/source/fx/fxfallingtile.h b/source/fx/fxfallingtile.h index afe4ccd8e..5a99aaff2 100644 --- a/source/fx/fxfallingtile.h +++ b/source/fx/fxfallingtile.h @@ -20,7 +20,6 @@ virtual void render(); protected: u16 Tile; - u16 Life; DVECTOR Velocity; sTile3d *TileBank3d; diff --git a/source/fx/fxsteam.cpp b/source/fx/fxsteam.cpp index 1c516933e..f00610d5f 100644 --- a/source/fx/fxsteam.cpp +++ b/source/fx/fxsteam.cpp @@ -48,9 +48,9 @@ void CFXSteam::SetSize(int Size) } /*****************************************************************************/ -void CFXSteam::setDie() +void CFXSteam::killFX() { - CFXBaseTrail::setDie(); + DieOut=true; for (int i=0; i