From bce429efdbe794ede789dab556bec2eb84c87521 Mon Sep 17 00:00:00 2001 From: Daveo Date: Thu, 31 May 2001 22:02:07 +0000 Subject: [PATCH] --- Graphics/sfx/+drip.bmp | Bin 0 -> 1366 bytes makefile.gfx | 2 + source/fx/fx.cpp | 118 +++++++++++++++++++++++++++++----- source/fx/fx.h | 15 +---- source/fx/fxbaseanim.cpp | 53 ++++++++++++++- source/fx/fxbaseanim.h | 27 ++++++-- tools/Data/include/dstructs.h | 6 +- 7 files changed, 178 insertions(+), 43 deletions(-) create mode 100644 Graphics/sfx/+drip.bmp diff --git a/Graphics/sfx/+drip.bmp b/Graphics/sfx/+drip.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ed0e0a154eb3df28c8d45069467206e7810d0507 GIT binary patch literal 1366 zcmeHHyN!e}5HSh;->Cgp@!Flt2rVKu8;uK)T_DZ%4p-ml96G z(s<@s&-2D3dA@&s6OXLxqt?7%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<