diff --git a/Graphics/sfx/+drip.bmp b/Graphics/sfx/+drip.bmp new file mode 100644 index 000000000..ed0e0a154 Binary files /dev/null and b/Graphics/sfx/+drip.bmp differ diff --git a/makefile.gfx b/makefile.gfx index a32f1146b..d4ebd20ed 100644 --- a/makefile.gfx +++ b/makefile.gfx @@ -162,6 +162,8 @@ SFX_GFX := +smoke.bmp \ +splash001.bmp +splash002.bmp +splash003.bmp +splash004.bmp +splash005.bmp +splash006.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 \ +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 5919f547c..6d1710bb3 100644 --- a/source/fx/fx.cpp +++ b/source/fx/fx.cpp @@ -26,42 +26,110 @@ /*****************************************************************************/ /*****************************************************************************/ // Anim Data -CFXBaseAnim::sFXData FXWaterSplashData= +CFXBaseAnim::sFXAnim FXWaterSplashData= { ONE, FRM__SPLASH001,FRM__SPLASH006, 1, - 127,127,255 + 127,127,255, + 0, + {0,0}, + 0, }; -CFXBaseAnim::sFXData FXAcidSplashData= +CFXBaseAnim::sFXAnim FXAcidSplashData= { ONE, FRM__SPLASH001,FRM__SPLASH006, 1, - 0,255,0 + 0,255,0, + 0, + {0,0}, + 0 }; -CFXBaseAnim::sFXData FXLavaSplashData= +CFXBaseAnim::sFXAnim FXLavaSplashData= { ONE, FRM__SPLASH001,FRM__SPLASH006, 1, - 255,0,0 + 255,0,0, + 0, + {0,0}, + 0 }; -CFXBaseAnim::sFXData FXOilSplashData= +CFXBaseAnim::sFXAnim FXOilSplashData= { ONE, FRM__SPLASH001,FRM__SPLASH006, 1, - 0,0,0 + 0,0,0, + 0, + {0,0}, + CFX::FX_TYPE_EXPLODE, }; -CFXBaseAnim::sFXData FXExplodeData= +CFXBaseAnim::sFXAnim FXExplodeData= { ONE, FRM__EXPLOSION0001,FRM__EXPLOSION0006, 1, - 127,127,127 + 127,127,127, + 0, + {0,0}, + 0 +}; + +CFXBaseAnim::sFXAnim FXFireData= +{ + ONE, + FRM__FIRE01,FRM__FIRE06, + 1, + 127,127,127, + CFXBaseAnim::FXANIM_FLAG_LOOP, + {0,0}, + 0 +}; + +CFXBaseAnim::sFXAnim FXWaterDripData= +{ + ONE, + FRM__DRIP,FRM__DRIP, + 1, + 127,127,255, + CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL | CFXBaseAnim::FXANIM_FLAG_HAS_GRAVITY, + {0,1}, + CFX::FX_TYPE_SPLASH_WATER +}; + +CFXBaseAnim::sFXAnim FXAcidDripData= +{ + ONE, + FRM__DRIP,FRM__DRIP, + 1, + 127,127,255, + CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL, + {0,1}, + CFX::FX_TYPE_SPLASH_WATER +}; +CFXBaseAnim::sFXAnim FXLavaDripData= +{ + ONE, + FRM__DRIP,FRM__DRIP, + 1, + 127,127,255, + CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL, + {0,1}, + CFX::FX_TYPE_SPLASH_WATER +}; +CFXBaseAnim::sFXAnim FXOilDripData= +{ + ONE, + FRM__DRIP,FRM__DRIP, + 1, + 127,127,255, + CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL, + {0,1}, + CFX::FX_TYPE_SPLASH_WATER }; /*****************************************************************************/ @@ -86,7 +154,7 @@ void TestFX(DVECTOR Pos) } */ /*****************************************************************************/ -int FXType=(CFX::FX_TYPE)0; +int FXType=(CFX::FX_TYPE)CFX::FX_TYPE_DROP_WATER; void TestFX(DVECTOR Pos) { CFX::Create((CFX::FX_TYPE)FXType,Pos); @@ -128,6 +196,27 @@ CFX *NewFX; NewFX=new ("FXExplode") CFXBaseAnim(); NewFX->setData(&FXExplodeData); break; + case FX_TYPE_FLAMES: + NewFX=new ("FXFlames") CFXBaseAnim(); + NewFX->setData(&FXFireData); + break; + + case FX_TYPE_DROP_WATER: + NewFX=new ("FXWaterDrip") CFXBaseAnim(); + NewFX->setData(&FXWaterDripData); + break; + case FX_TYPE_DROP_ACID: + NewFX=new ("FXAcidDrip") CFXBaseAnim(); + NewFX->setData(&FXAcidDripData); + break; + case FX_TYPE_DROP_LAVA: + NewFX=new ("FXLavaDrip") CFXBaseAnim(); + NewFX->setData(&FXLavaDripData); + break; + case FX_TYPE_DROP_OIL: + NewFX=new ("FXOilDrip") CFXBaseAnim(); + NewFX->setData(&FXOilDripData); + break; case FX_TYPE_NRG_BAR: NewFX=new ("NRG Bar") CFXNRGBar(); @@ -149,10 +238,6 @@ CFX *NewFX; case FX_TYPE_SHOCKWAVE: case FX_TYPE_DAZE: - 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: @@ -160,8 +245,7 @@ CFX *NewFX; case FX_TYPE_SMOKE: case FX_TYPE_GAS: - case FX_TYPE_FLAMES: - + default: ASSERT(!"UNKNOWN FX TYPE"); return NULL; diff --git a/source/fx/fx.h b/source/fx/fx.h index 2a2712219..8890aaad0 100644 --- a/source/fx/fx.h +++ b/source/fx/fx.h @@ -7,26 +7,13 @@ #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 { public: enum FX_TYPE { - FX_TYPE_JELLYFISH_LEGS, + 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, diff --git a/source/fx/fxbaseanim.cpp b/source/fx/fxbaseanim.cpp index 0b125713c..83e49c3fe 100644 --- a/source/fx/fxbaseanim.cpp +++ b/source/fx/fxbaseanim.cpp @@ -10,15 +10,27 @@ #include #include "level\level.h" #include "game\game.h" +#include "level\layercollision.h" #include "FX\FXBaseAnim.h" + /*****************************************************************************/ void CFXBaseAnim::init(DVECTOR const &_Pos) { CFX::init(_Pos); CurrentFrame=0; CurrentScale=DataPtr->Scale; - Life=((DataPtr->EndFrame-DataPtr->StartFrame)<FrameShift)-1; + 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; + } + + Gravity=0; } /*****************************************************************************/ @@ -34,9 +46,44 @@ void CFXBaseAnim::think(int _frames) { CFX::think(_frames); CurrentFrame+=_frames; - Pos.vy-=4; + + if (CurrentFrame>=MaxFrame) + { + 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) + { + Pos.vy-=DistY; + killFX(); + } + } } +/*****************************************************************************/ +void CFXBaseAnim::killFX() +{ + setToShutdown(); +// If has follow on effect, create it now + if (DataPtr->EndFX) + { + CFX::Create((CFX::FX_TYPE)DataPtr->EndFX,getPos()); + } +} + +/*****************************************************************************/ /*****************************************************************************/ /*** Render ******************************************************************/ /*****************************************************************************/ @@ -51,7 +98,7 @@ SpriteBank *SprBank=CGameScene::getSpriteBank(); int ThisFrame=CurrentFrame>>DataPtr->FrameShift; -POLY_FT4 *Ft4=SprBank->printFT4Scaled(DataPtr->StartFrame+ThisFrame,RenderPos.vx,RenderPos.vy,0,0,OtPos,CurrentScale>>4); +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); diff --git a/source/fx/fxbaseanim.h b/source/fx/fxbaseanim.h index 97fff65ac..f69393655 100644 --- a/source/fx/fxbaseanim.h +++ b/source/fx/fxbaseanim.h @@ -11,25 +11,38 @@ class CFXBaseAnim : public CFX { public: - struct sFXData + struct sFXAnim { - s16 Scale; - s16 StartFrame,EndFrame; - s16 FrameShift; - u8 R,G,B; + 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(); - void setData(void *Data) {DataPtr=(sFXData*)Data;} +virtual void killFX(); + + void setData(void *Data) {DataPtr=(sFXAnim*)Data;} virtual void SetScale(int S) {CurrentScale=S;} protected: - sFXData *DataPtr; + sFXAnim *DataPtr; + s16 Gravity; + s16 MaxFrame; s16 CurrentFrame; s16 CurrentScale; }; diff --git a/tools/Data/include/dstructs.h b/tools/Data/include/dstructs.h index 47cae9207..d3ea43038 100644 --- a/tools/Data/include/dstructs.h +++ b/tools/Data/include/dstructs.h @@ -16,13 +16,14 @@ enum PSX_COLLSION_ENUM COLLISION_TYPE_SLIPPERY =2, COLLISION_TYPE_ELECTRIC =3, COLLISION_TYPE_DESTRUCTABLE_WALL =4, - COLLISION_TYPE_DEATH_LIQUID =5, + COLLISION_TYPE_SOAKUP =5, COLLISION_TYPE_SOLID =6, COLLISION_TYPE_DEATH_FALL =7, COLLISION_TYPE_DESTRUCTABLE_FLOOR =8, COLLISION_TYPE_DEATH_INSTANT =9, COLLISION_TYPE_MOVE_LEFT =10, COLLISION_TYPE_MOVE_RIGHT =11, + COLLISION_TYPE_DEATH_LIQUID =12, COLLISION_TYPE_FLAG_SHIFT =3, COLLISION_TYPE_FLAG_NORMAL =COLLISION_TYPE_NORMAL << COLLISION_TYPE_FLAG_SHIFT, @@ -30,13 +31,14 @@ enum PSX_COLLSION_ENUM COLLISION_TYPE_FLAG_SLIPPERY =COLLISION_TYPE_SLIPPERY << COLLISION_TYPE_FLAG_SHIFT, COLLISION_TYPE_FLAG_ELECTRIC =COLLISION_TYPE_ELECTRIC << COLLISION_TYPE_FLAG_SHIFT, COLLISION_TYPE_FLAG_DESTRUCTABLE_WALL =COLLISION_TYPE_DESTRUCTABLE_WALL << COLLISION_TYPE_FLAG_SHIFT, - COLLISION_TYPE_FLAG_DEATH_LIQUID =COLLISION_TYPE_DEATH_LIQUID << COLLISION_TYPE_FLAG_SHIFT, + COLLISION_TYPE_FLAG_SOAKUP =COLLISION_TYPE_SOAKUP << COLLISION_TYPE_FLAG_SHIFT, COLLISION_TYPE_FLAG_SOLID =COLLISION_TYPE_SOLID << COLLISION_TYPE_FLAG_SHIFT, COLLISION_TYPE_FLAG_DEATH_FALL =COLLISION_TYPE_DEATH_FALL << COLLISION_TYPE_FLAG_SHIFT, COLLISION_TYPE_FLAG_DESTRUCTABLE_FLOOR =COLLISION_TYPE_DESTRUCTABLE_FLOOR << COLLISION_TYPE_FLAG_SHIFT, COLLISION_TYPE_FLAG_DEATH_INSTANT =COLLISION_TYPE_DEATH_INSTANT << COLLISION_TYPE_FLAG_SHIFT, COLLISION_TYPE_FLAG_MOVE_LEFT =COLLISION_TYPE_MOVE_LEFT << COLLISION_TYPE_FLAG_SHIFT, COLLISION_TYPE_FLAG_MOVE_RIGHT =COLLISION_TYPE_MOVE_RIGHT << COLLISION_TYPE_FLAG_SHIFT, + COLLISION_TYPE_FLAG_DEATH_LIQUID =COLLISION_TYPE_DEATH_LIQUID << COLLISION_TYPE_FLAG_SHIFT, COLLISION_TYPE_MASK = ((0xff<