diff --git a/Graphics/sfx/+bubblepop.bmp b/Graphics/sfx/+bubblepop.bmp new file mode 100644 index 000000000..fe6ee28ee Binary files /dev/null and b/Graphics/sfx/+bubblepop.bmp differ diff --git a/makefile.gaz b/makefile.gaz index caeab37a0..d4b47a9dc 100644 --- a/makefile.gaz +++ b/makefile.gaz @@ -157,6 +157,7 @@ fx_src := fx \ fxbaseanim \ fxbasetrail \ fxbaseemitter \ + fxbubble \ fxnrgbar \ fxjfish \ fxfallingtile \ diff --git a/makefile.gfx b/makefile.gfx index d4ebd20ed..cb9da3e6b 100644 --- a/makefile.gfx +++ b/makefile.gfx @@ -163,7 +163,7 @@ SFX_GFX := +smoke.bmp \ +Star0001.bmp +Star0002.bmp +Star0003.bmp \ +Star20001.bmp +Star20002.bmp +Star20003.bmp \ +fire01.bmp +fire02.bmp +fire03.bmp +fire04.bmp +fire05.bmp +fire06.bmp \ - +drip.bmp \ + +drip.bmp +bubblepop.bmp\ +leg.bmp SFX_GFX_IN := $(foreach FILE,$(SFX_GFX),$(SFX_GFX_DIR)/$(FILE)) diff --git a/source/fx/fx.cpp b/source/fx/fx.cpp index 6d1710bb3..06e2ffc8a 100644 --- a/source/fx/fx.cpp +++ b/source/fx/fx.cpp @@ -17,6 +17,7 @@ #include "FX\FXBaseAnim.h" #include "FX\FXBaseEmitter.h" +#include "FX\FXBubble.h" #include "FX\FXfallingTile.h" #include "FX\FXSteam.h" @@ -107,7 +108,7 @@ CFXBaseAnim::sFXAnim FXAcidDripData= FRM__DRIP,FRM__DRIP, 1, 127,127,255, - CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL, + CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL | CFXBaseAnim::FXANIM_FLAG_HAS_GRAVITY, {0,1}, CFX::FX_TYPE_SPLASH_WATER }; @@ -117,7 +118,7 @@ CFXBaseAnim::sFXAnim FXLavaDripData= FRM__DRIP,FRM__DRIP, 1, 127,127,255, - CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL, + CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL | CFXBaseAnim::FXANIM_FLAG_HAS_GRAVITY, {0,1}, CFX::FX_TYPE_SPLASH_WATER }; @@ -127,10 +128,52 @@ CFXBaseAnim::sFXAnim FXOilDripData= FRM__DRIP,FRM__DRIP, 1, 127,127,255, - CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL, + CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL | CFXBaseAnim::FXANIM_FLAG_HAS_GRAVITY, {0,1}, CFX::FX_TYPE_SPLASH_WATER }; +// Bubble +CFXBaseAnim::sFXAnim FXBubbleWaterData= +{ + ONE/2, + FRM__BUBBLE_2,FRM__BUBBLE_2, + 1, + 127,127,255, + CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL, + {0,-1}, + CFX::FX_TYPE_SPLASH_WATER +}; + +CFXBaseAnim::sFXAnim FXBubbleAcidData= +{ + ONE/2, + FRM__BUBBLE_2,FRM__BUBBLE_2, + 1, + 127,127,255, + CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL, + {0,-1}, + CFX::FX_TYPE_SPLASH_WATER +}; +CFXBaseAnim::sFXAnim FXBubbleLavaData= +{ + ONE/2, + FRM__BUBBLE_2,FRM__BUBBLE_2, + 1, + 127,127,255, + CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL, + {0,-1}, + CFX::FX_TYPE_SPLASH_WATER +}; +CFXBaseAnim::sFXAnim FXBubbleOilData= +{ + ONE/2, + FRM__BUBBLE_2,FRM__BUBBLE_2, + 1, + 127,127,255, + CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL, + {0,-1}, + CFX::FX_TYPE_SPLASH_WATER +}; /*****************************************************************************/ /* @@ -154,7 +197,7 @@ void TestFX(DVECTOR Pos) } */ /*****************************************************************************/ -int FXType=(CFX::FX_TYPE)CFX::FX_TYPE_DROP_WATER; +int FXType=(CFX::FX_TYPE)CFX::FX_TYPE_BUBBLE_WATER; void TestFX(DVECTOR Pos) { CFX::Create((CFX::FX_TYPE)FXType,Pos); @@ -217,6 +260,22 @@ CFX *NewFX; NewFX=new ("FXOilDrip") CFXBaseAnim(); NewFX->setData(&FXOilDripData); break; + case FX_TYPE_BUBBLE_WATER: + NewFX=new ("FXBubbleWater") CFXBubble(); + NewFX->setData(&FXBubbleWaterData); + break; + case FX_TYPE_BUBBLE_ACID: + NewFX=new ("FXBubbleAcid") CFXBubble(); + NewFX->setData(&FXBubbleAcidData); + break; + case FX_TYPE_BUBBLE_LAVA: + NewFX=new ("FXBubbleLava") CFXBubble(); + NewFX->setData(&FXBubbleLavaData); + break; + case FX_TYPE_BUBBLE_OIL: + NewFX=new ("FXBubbleOil") CFXBubble(); + NewFX->setData(&FXBubbleOilData); + break; case FX_TYPE_NRG_BAR: NewFX=new ("NRG Bar") CFXNRGBar(); @@ -226,10 +285,6 @@ CFX *NewFX; NewFX=new ("JellyFish Legs") CFXJellyFishLegs(); break; - 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: @@ -245,7 +300,6 @@ CFX *NewFX; case FX_TYPE_SMOKE: case FX_TYPE_GAS: - default: ASSERT(!"UNKNOWN FX TYPE"); return NULL; diff --git a/source/fx/fxbaseanim.cpp b/source/fx/fxbaseanim.cpp index 83e49c3fe..7addf7c22 100644 --- a/source/fx/fxbaseanim.cpp +++ b/source/fx/fxbaseanim.cpp @@ -30,7 +30,8 @@ void CFXBaseAnim::init(DVECTOR const &_Pos) Life=MaxFrame; } - Gravity=0; + VelY=0; + renderFrame=DataPtr->StartFrame; } /*****************************************************************************/ @@ -52,11 +53,14 @@ void CFXBaseAnim::think(int _frames) CurrentFrame=0; } Pos.vx+=DataPtr->Velocity.vx; - Pos.vy+=DataPtr->Velocity.vy+Gravity; + Pos.vy+=DataPtr->Velocity.vy+VelY; + +int ThisFrame=CurrentFrame>>DataPtr->FrameShift; + renderFrame=DataPtr->StartFrame+ThisFrame; if (DataPtr->Flags & FXANIM_FLAG_HAS_GRAVITY) { - Gravity++; + VelY++; } if (DataPtr->Flags & FXANIM_FLAG_COLLIDE_KILL) @@ -96,9 +100,7 @@ DVECTOR RenderPos; SpriteBank *SprBank=CGameScene::getSpriteBank(); -int ThisFrame=CurrentFrame>>DataPtr->FrameShift; - -POLY_FT4 *Ft4=SprBank->printFT4Scaled(DataPtr->StartFrame+ThisFrame,RenderPos.vx,RenderPos.vy,0,0,OtPos*0,CurrentScale>>4); +POLY_FT4 *Ft4=SprBank->printFT4Scaled(renderFrame,RenderPos.vx,RenderPos.vy,0,0,OtPos*0,CurrentScale>>4); Ft4->u1--; Ft4->u3--; Ft4->v2--; Ft4->v3--; setShadeTex(Ft4,0); diff --git a/source/fx/fxbaseanim.h b/source/fx/fxbaseanim.h index f69393655..a15e94d15 100644 --- a/source/fx/fxbaseanim.h +++ b/source/fx/fxbaseanim.h @@ -40,10 +40,10 @@ virtual void SetScale(int S) {CurrentScale=S;} protected: sFXAnim *DataPtr; - - s16 Gravity; + s16 VelY; s16 MaxFrame; s16 CurrentFrame; + u16 renderFrame; s16 CurrentScale; }; diff --git a/source/fx/fxbubble.cpp b/source/fx/fxbubble.cpp index 83e49c3fe..5249dc9e6 100644 --- a/source/fx/fxbubble.cpp +++ b/source/fx/fxbubble.cpp @@ -1,6 +1,6 @@ -/***********************/ -/*** Anim Base Class ***/ -/***********************/ +/*****************/ +/*** Bubble FX ***/ +/*****************/ #include "system\global.h" #include @@ -12,95 +12,50 @@ #include "game\game.h" #include "level\layercollision.h" #include "FX\FXBaseAnim.h" +#include "FX\FXBubble.h" /*****************************************************************************/ -void CFXBaseAnim::init(DVECTOR const &_Pos) +void CFXBubble::init(DVECTOR const &_Pos) { - CFX::init(_Pos); - CurrentFrame=0; - CurrentScale=DataPtr->Scale; - MaxFrame=((DataPtr->EndFrame-DataPtr->StartFrame)<FrameShift)-1; - if (DataPtr->Flags & FXANIM_FLAG_LOOP) - { // Looping Anim, so let it live forever! - Life=-1; - } - else - { - Life=MaxFrame; - } + CFXBaseAnim::init(_Pos); + Life=32+getRndRange(63); + VelY=-getRndRange(4)-1; + CurrentScale=getRndRange(DataPtr->Scale/2)+(DataPtr->Scale/2); + Die=0; + XIdx=getRnd()&15; - Gravity=0; -} - -/*****************************************************************************/ -void CFXBaseAnim::shutdown() -{ - CFX::shutdown(); } /*****************************************************************************/ /*** Think *******************************************************************/ /*****************************************************************************/ -void CFXBaseAnim::think(int _frames) +int XT[16]={ 0,+1,+0,+1,+0, 0,-1,+0,-1,+0,0,+1,+0,+1,+0,}; +void CFXBubble::think(int _frames) { - CFX::think(_frames); - CurrentFrame+=_frames; - - if (CurrentFrame>=MaxFrame) + if (Die) { - CurrentFrame=0; - } - Pos.vx+=DataPtr->Velocity.vx; - Pos.vy+=DataPtr->Velocity.vy+Gravity; - - if (DataPtr->Flags & FXANIM_FLAG_HAS_GRAVITY) - { - Gravity++; - } - - if (DataPtr->Flags & FXANIM_FLAG_COLLIDE_KILL) - { - CLayerCollision *ColLayer=CGameScene::getCollision(); - int DistY = ColLayer->getHeightFromGround( Pos.vx, Pos.vy, 16 ); - - if (DistY<=0) + if (renderFrame!=FRM__BUBBLEPOP) { - Pos.vy-=DistY; - killFX(); + renderFrame=FRM__BUBBLEPOP; + } + else + { + setToShutdown(); } } + else + { + CFXBaseAnim::think(_frames); + Pos.vx+=XT[XIdx++]; + XIdx&=15; + } } /*****************************************************************************/ -void CFXBaseAnim::killFX() +void CFXBubble::killFX() { - setToShutdown(); -// If has follow on effect, create it now - if (DataPtr->EndFX) - { - CFX::Create((CFX::FX_TYPE)DataPtr->EndFX,getPos()); - } + + Die=1; } -/*****************************************************************************/ -/*****************************************************************************/ -/*** Render ******************************************************************/ -/*****************************************************************************/ -void CFXBaseAnim::render() -{ -DVECTOR RenderPos; - - getFXRenderPos(RenderPos); - if (!canRender()) return; - -SpriteBank *SprBank=CGameScene::getSpriteBank(); - -int ThisFrame=CurrentFrame>>DataPtr->FrameShift; - -POLY_FT4 *Ft4=SprBank->printFT4Scaled(DataPtr->StartFrame+ThisFrame,RenderPos.vx,RenderPos.vy,0,0,OtPos*0,CurrentScale>>4); - Ft4->u1--; Ft4->u3--; - Ft4->v2--; Ft4->v3--; - setShadeTex(Ft4,0); - setRGB0(Ft4,DataPtr->R,DataPtr->G,DataPtr->B); -} diff --git a/source/fx/fxbubble.h b/source/fx/fxbubble.h index f69393655..8b51a7301 100644 --- a/source/fx/fxbubble.h +++ b/source/fx/fxbubble.h @@ -1,50 +1,23 @@ -/***********************/ -/*** Anim Base Class ***/ -/***********************/ +/*****************/ +/*** Bubble FX ***/ +/*****************/ -#ifndef __FX_FX_BASE_ANIM_HEADER__ -#define __FX_FX_BASE_ANIM_HEADER__ +#ifndef __FX_FX_BUBBLE_HEADER__ +#define __FX_FX_BUBBLE_HEADER__ -#include "fx/fx.h" +#include "fx/fxbaseanim.h" /*****************************************************************************/ -class CFXBaseAnim : public CFX +class CFXBubble : public CFXBaseAnim { public: - struct sFXAnim - { - s16 Scale; - s16 StartFrame,EndFrame; - s16 FrameShift; - u8 R,G,B; - u8 Flags; - DVECTOR Velocity; - u16 EndFX; - }; - enum FXAnim_Flags - { - FXANIM_FLAG_LOOP =1<<0, - FXANIM_FLAG_COLLIDE_KILL =1<<1, - FXANIM_FLAG_HAS_GRAVITY =1<<2, - }; - virtual void init(DVECTOR const &Pos); -virtual void shutdown(); virtual void think(int _frames); -virtual void render(); virtual void killFX(); - void setData(void *Data) {DataPtr=(sFXAnim*)Data;} - -virtual void SetScale(int S) {CurrentScale=S;} - protected: - sFXAnim *DataPtr; - - s16 Gravity; - s16 MaxFrame; - s16 CurrentFrame; - s16 CurrentScale; + s8 Die; + u16 XIdx; }; #endif