diff --git a/source/fx/fx.cpp b/source/fx/fx.cpp index 8635f1287..0494c7841 100644 --- a/source/fx/fx.cpp +++ b/source/fx/fx.cpp @@ -132,8 +132,10 @@ CFX *NewFX; case FX_TYPE_JELLYFISH_LEGS: -// NewFX=new ("JellyFish Legs") CFXJellyFishLegs(); - ASSERT(!"FISH LEGS OUT OF STOCK\n"); + NewFX=new ("JellyFish Legs") CFXJellyFishLegs(); + break; + + case FX_TYPE_BUBBLE: case FX_TYPE_BUBBLE_WATER: case FX_TYPE_BUBBLE_ACID: @@ -172,9 +174,8 @@ CFX *CFX::Create(const FX_TYPE Type,CThing *Parent) { CFX *NewFX=CFX::Create(Type); - ASSERT(Parent); - NewFX->init(Parent->getPos()); + ASSERT(Parent); Parent->addChild(NewFX); return NewFX; diff --git a/source/fx/fxjfish.cpp b/source/fx/fxjfish.cpp index 8b009ce37..1eb8a0e78 100644 --- a/source/fx/fxjfish.cpp +++ b/source/fx/fxjfish.cpp @@ -9,157 +9,96 @@ #include "gfx\sprbank.h" #include #include "level\level.h" +#include "game\game.h" #include "FX\FXjfish.h" +int LegCount=3; +int LegWInc=32/LegCount; +int LegHInc=-4; +int LegAngleInc=7; /*****************************************************************************/ /*****************************************************************************/ /*****************************************************************************/ -void CFXJellyFishLegs::init() +void CFXJellyFishLegs::init(DVECTOR const &_Pos) { CFX::init(); - FXList=0; + Pos=_Pos; + + Ofs.vx=0; Ofs.vy=0; + Angle=getRnd(); + AngleInc=LegAngleInc+getRndRange(3); } /*****************************************************************************/ void CFXJellyFishLegs::shutdown() { - for (int L=0; L>12; - } - - HeightTable=(s16*)MemAlloc(Width*sizeof(s16),"FishLegHTable"); -int AInc=1024/Width; - for (int H=0; H8) dH=8; - if (dH<2) dH=2; - HeightTable[H]=(s16)dH; - } -*/ + Ofs.vx=XOfs; + Ofs.vy=YOfs; + this->XFlip=XFlip; } /*****************************************************************************/ /*** Think *******************************************************************/ /*****************************************************************************/ -//int XT[]={-3,-3,-3,-2,-2,-2,-1,-1, +1,+1,+2,+2,+2,+3,+3,+3}; -int XT[]={-3,-2,-2,-2,-2,-1,-1,-1, +1,+1,+1,+2,+2,+2,+2,+3}; + void CFXJellyFishLegs::think(int _frames) { -/* ASSERT(FXList); + Pos=getParent()->getPos(); + CFX::think(_frames); - - ListIdx--; - if (ListIdx<0) ListIdx+=Count; - for (int i=0; igetPos(); -// ThisList[ListIdx].Ofs.vx/=16; -// ThisList[ListIdx].Ofs.vy/=16; - int XO=getRnd(); - XO&=15; - - ThisList[ListIdx].Ofs.vx+=XT[XO]; - } -*/ + Angle++; Angle&=CIRCLE_TAB_MASK; + AngleInc=LegAngleInc; } /*****************************************************************************/ /*** Render ******************************************************************/ /*****************************************************************************/ -const int Trans=3; -int LX=8; -int LY=32; - void CFXJellyFishLegs::render() { -/* -DVECTOR _MapOfs=CLevel::getCameraPos(); -DVECTOR MapOfs; -int dRGB=256/Count; -s16 *dH=HeightTable; + CFX::render(); + if (!canRender()) return; - _MapOfs.vx+=LX; - _MapOfs.vy+=LY; +SpriteBank *SprBank=CGameScene::getSpriteBank();; +DVECTOR RenderPos=getRenderPos(); +int WOfs=0; +int H; +int ThisAngle=Angle; +int LegHeight=SprBank->getFrameHeight(FRM__LEG)-4; + + RenderPos.vx+=Ofs.vx; + RenderPos.vy+=Ofs.vy; - if (!Parent->canRender()) return; - MapOfs.vx=_MapOfs.vx+XOfs; - - for (int L=0; L=Count) Idx=0; - POLY_FT4 *Ft4=CGameScene::getSpriteBank()->printFT4(FRM__TENTACLE,LastPos.vx,LastPos.vy,0,0,OtPos); + ThisAngle+=AngleInc; + ThisAngle&=CIRCLE_TAB_MASK; + H=LegHeight+(CircleTable[ThisAngle]>>5); - Ft4->x0=LastPos.vx+0+LastdW; Ft4->y0=LastPos.vy; - Ft4->x1=LastPos.vx+8-LastdW; Ft4->y1=LastPos.vy; - setSemiTrans(Ft4,1); - Ft4->tpage|=Trans<<5; - LastPos.vx=List[Idx].Ofs.vx-MapOfs.vx; - LastPos.vy=List[Idx].Ofs.vy-MapOfs.vy; - LastdW=*dW++; - Ft4->x2=LastPos.vx+0+LastdW; Ft4->y2=LastPos.vy; - Ft4->x3=LastPos.vx+8-LastdW; Ft4->y3=LastPos.vy; - setRGB0(Ft4,C,C,C); - C-=dRGB; - MapOfs.vy-=Height; - Idx++; + POLY_FT4 *Ft4=SprBank->printFT4(FRM__LEG,RenderPos.vx,RenderPos.vy,XFlip,0,OtPos*0); + + if (!XFlip) + { + Ft4->x1-=WOfs; + Ft4->x3-=WOfs; + } + else + { + Ft4->x0+=WOfs; + Ft4->x2+=WOfs; + } + + + Ft4->y2=Ft4->y0+H; + Ft4->y3=Ft4->y1+H; + RenderPos.vy+=H+LegHInc; + WOfs+=LegWInc; } - MapOfs.vx+=Gap; - } -*/ } diff --git a/source/fx/fxjfish.h b/source/fx/fxjfish.h index 8a671770f..8899b8f26 100644 --- a/source/fx/fxjfish.h +++ b/source/fx/fxjfish.h @@ -11,29 +11,20 @@ class CFXJellyFishLegs : public CFX { public: - struct sList - { - DVECTOR Ofs; - }; -virtual void init(); +virtual void init(DVECTOR const &Pos); virtual void shutdown(); virtual void think(int _frames); virtual void render(); - void SetUp(int _Width,int _Gap,int _Length,int _Count); -//virtual CRECT const &getCollisionArea() {return (Parent->getCollisionArea());} + void Setup(int XOfs,int YOfs,bool XFlip); protected: + DVECTOR Ofs; - int XOfs; - int Width,Gap; - int Length,Count; + int Angle,AngleInc; + bool XFlip; - sList **FXList; - int ListIdx; - s16 *WidthTable; - s16 *HeightTable; }; #endif diff --git a/source/utils/utils.cpp b/source/utils/utils.cpp index bf64be36a..43d7ea2b9 100644 --- a/source/utils/utils.cpp +++ b/source/utils/utils.cpp @@ -19,6 +19,15 @@ #endif +/*****************************************************************************/ +const s16 CircleTable[ CIRCLE_TAB_MAX] = +{ + 0,25,49,74,97,120,142,162,181,197,212,225,236,244,251,254, + 255,254,251,244,236,225,212,197,181,162,142,120,97,74,49,25, + 0,-25,-49,-74,-97,-120,-142,-162,-181,-197,-212,-225,-236,-244,-251,-254, + -255,-254,-251,-244,-236,-225,-212,-197,-181,-162,-142,-120,-97,-74,-49,-25 +}; + /*****************************************************************************/ /* const MATRIX IdentityMtx = diff --git a/source/utils/utils.h b/source/utils/utils.h index 74ec40fae..0b5587712 100644 --- a/source/utils/utils.h +++ b/source/utils/utils.h @@ -14,26 +14,12 @@ #endif /*****************************************************************************/ -#define NO_SIN 64 -#define SINMASK (NO_SIN - 1) -#define COSPOS (NO_SIN / 4) +#define CIRCLE_TAB_MAX 64 +#define CIRCLE_TAB_MASK 63 +extern const s16 CircleTable[ CIRCLE_TAB_MAX]; -//extern const s16 c_circle[ NO_SIN ]; -//extern const MATRIX IdentityMtx; - -/*****************************************************************************/ -/* -struct sBox -{ - s16 x0,y0; - s16 x1,y1; - s16 x2,y2; - s16 x3,y3; -}; -*/ /*****************************************************************************/ u8 *MakePtr(void *BasePtr,int Offset); -//void RotateBox(sBox *B,int W,int H,int _xScale,int _yScale,int _rot); /*****************************************************************************/ /*** Loads of inlines ********************************************************/