diff --git a/makefile.gaz b/makefile.gaz index c35e62553..a38eb5f4a 100644 --- a/makefile.gaz +++ b/makefile.gaz @@ -317,7 +317,11 @@ triggers_src := trigger \ thazwalk \ tsemit \ tsswitch \ - tgbowl + tgbowl \ + twdripemit \ + tadripemit \ + todripemit \ + tldripemit utils_src := utils \ sincos \ diff --git a/source/fx/fx.cpp b/source/fx/fx.cpp index f132c19b6..2cb3bfcc0 100644 --- a/source/fx/fx.cpp +++ b/source/fx/fx.cpp @@ -43,7 +43,7 @@ CFXBaseAnim::sFXAnim FXAcidSplashData= ONE, FRM__SPLASH001,FRM__SPLASH006, 1, - 0,255,0, + 127,255,127, 0, {0,0}, 0 @@ -63,7 +63,7 @@ CFXBaseAnim::sFXAnim FXOilSplashData= ONE, FRM__SPLASH001,FRM__SPLASH006, 1, - 0,0,0, + 64,64,64, 0, {0,0}, CFX::FX_TYPE_EXPLODE, @@ -107,30 +107,30 @@ CFXBaseAnim::sFXAnim FXAcidDripData= ONE, FRM__DRIP,FRM__DRIP, 1, - 127,127,255, - CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL | CFXBaseAnim::FXANIM_FLAG_HAS_GRAVITY, + 127,255,127, + CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL | CFXBaseAnim::FXANIM_FLAG_HAS_GRAVITY | CFXBaseAnim::FXANIM_FLAG_INJURE_PLAYER, {0,1}, - CFX::FX_TYPE_SPLASH_WATER + CFX::FX_TYPE_SPLASH_ACID }; CFXBaseAnim::sFXAnim FXLavaDripData= { ONE, FRM__DRIP,FRM__DRIP, 1, - 127,127,255, - CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL | CFXBaseAnim::FXANIM_FLAG_HAS_GRAVITY, + 255,127,127, + CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL | CFXBaseAnim::FXANIM_FLAG_HAS_GRAVITY | CFXBaseAnim::FXANIM_FLAG_INJURE_PLAYER, {0,1}, - CFX::FX_TYPE_SPLASH_WATER + CFX::FX_TYPE_SPLASH_LAVA }; CFXBaseAnim::sFXAnim FXOilDripData= { ONE, FRM__DRIP,FRM__DRIP, 1, - 127,127,255, - CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL | CFXBaseAnim::FXANIM_FLAG_HAS_GRAVITY, + 64,64,64, + CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL | CFXBaseAnim::FXANIM_FLAG_HAS_GRAVITY | CFXBaseAnim::FXANIM_FLAG_INJURE_PLAYER, {0,1}, - CFX::FX_TYPE_SPLASH_WATER + CFX::FX_TYPE_SPLASH_OIL }; // Bubble CFXBaseAnim::sFXAnim FXBubbleWaterData= @@ -407,3 +407,8 @@ void CFX::getFXRenderPos(DVECTOR &Pos) Pos=getPos(); } } + +/*****************************************************************************/ +void CFX::collidedWith(CThing *_thisThing) +{ +} diff --git a/source/fx/fx.h b/source/fx/fx.h index 2e3f07a14..a2e304ab2 100644 --- a/source/fx/fx.h +++ b/source/fx/fx.h @@ -81,6 +81,7 @@ virtual void killFX() {setToShutdown();} virtual void toggleVisible() {IsVisible = !IsVisible;} protected: +virtual void collidedWith(CThing *_thisThing); s32 OtPos; s16 Life; diff --git a/source/fx/fxbaseanim.cpp b/source/fx/fxbaseanim.cpp index c35e44447..cd1fce2c0 100644 --- a/source/fx/fxbaseanim.cpp +++ b/source/fx/fxbaseanim.cpp @@ -13,6 +13,10 @@ #include "level\layercollision.h" #include "FX\FXBaseAnim.h" +#ifndef __PLAYER_PLAYER_H__ +#include "player\player.h" +#endif + /*****************************************************************************/ void CFXBaseAnim::init(DVECTOR const &_Pos) @@ -108,3 +112,32 @@ POLY_FT4 *Ft4=SprBank->printRotatedScaledSprite(renderFrame,RenderPos.vx,RenderP setShadeTex(Ft4,0); setRGB0(Ft4,DataPtr->R,DataPtr->G,DataPtr->B); } + +/*****************************************************************************/ +void CFXBaseAnim::collidedWith(CThing *_thisThing) +{ + switch(_thisThing->getThingType()) + { + case TYPE_PLAYER: + { + CPlayer *player = (CPlayer *) _thisThing; + + if ( !player->isRecoveringFromHit() ) + { + if ( DataPtr->Flags & FXANIM_FLAG_KILL_PLAYER ) + { + player->takeDamage( DAMAGE__KILL_OUTRIGHT ); + } + else if ( DataPtr->Flags & FXANIM_FLAG_INJURE_PLAYER ) + { + player->takeDamage( DAMAGE__HIT_ENEMY ); + } + } + + break; + } + + default: + break; + } +} diff --git a/source/fx/fxbaseanim.h b/source/fx/fxbaseanim.h index f052ab600..b1c86a409 100644 --- a/source/fx/fxbaseanim.h +++ b/source/fx/fxbaseanim.h @@ -26,6 +26,8 @@ public: FXANIM_FLAG_LOOP =1<<0, FXANIM_FLAG_COLLIDE_KILL =1<<1, FXANIM_FLAG_HAS_GRAVITY =1<<2, + FXANIM_FLAG_INJURE_PLAYER =1<<3, + FXANIM_FLAG_KILL_PLAYER =1<<4, }; virtual void init(DVECTOR const &Pos); @@ -33,6 +35,7 @@ virtual void shutdown(); virtual void think(int _frames); virtual void render(); virtual void killFX(); +virtual int canCollide() {return true;} void setData(void *Data) {DataPtr=(sFXAnim*)Data;} @@ -42,6 +45,8 @@ virtual void SetScaleY(int S) {CurrentScaleY=S;} virtual void SetHeading(int H) {CurrentHeading=H;} protected: +virtual void collidedWith(CThing *_thisThing); + sFXAnim *DataPtr; s16 VelY; s16 MaxFrame; diff --git a/source/thing/thing.cpp b/source/thing/thing.cpp index ce67bd124..336ba1b13 100644 --- a/source/thing/thing.cpp +++ b/source/thing/thing.cpp @@ -515,6 +515,17 @@ DVECTOR const &CamPos=CLevel::getCameraPos(); thing1=thing1->m_nextCollisionThing; } + // Player -> Effect collision + thing1=s_CollisionLists[CThing::TYPE_FX]; + while(thing1) + { + if(thing1->checkCollisionAgainst(playerThing, _frames)) + { + thing1->collidedWith(playerThing); + } + thing1=thing1->m_nextCollisionThing; + } + // Player -> Friend collision thing1=s_CollisionLists[CThing::TYPE_NPC]; while(thing1) diff --git a/source/triggers/trigger.cpp b/source/triggers/trigger.cpp index d4fea73cd..8e349ac9a 100644 --- a/source/triggers/trigger.cpp +++ b/source/triggers/trigger.cpp @@ -91,6 +91,22 @@ #include "triggers\tgbowl.h" #endif +#ifndef __TRIGGERS_TWDRIPEMIT_H__ +#include "triggers\twdripemit.h" +#endif + +#ifndef __TRIGGERS_TADRIPEMIT_H__ +#include "triggers\tadripemit.h" +#endif + +#ifndef __TRIGGERS_TODRIPEMIT_H__ +#include "triggers\todripemit.h" +#endif + +#ifndef __TRIGGERS_TLDRIPEMIT_H__ +#include "triggers\tldripemit.h" +#endif + #ifndef __GAME_GAME_H__ #include "game\game.h" #endif @@ -184,6 +200,26 @@ CTrigger *trigger; trigger=(CSteamEmitterTrigger*)new("SteamEmitterTrigger") CSteamEmitterTrigger(); break; + // Water drip emitter + case TRIGGER_WATER_DRIP_EMITTER: + trigger=(CWaterDripEmitterTrigger*)new("WaterDripEmitterTrigger") CWaterDripEmitterTrigger(); + break; + + // Acid drip emitter + case TRIGGER_ACID_DRIP_EMITTER: + trigger=(CAcidDripEmitterTrigger*)new("AcidDripEmitterTrigger") CAcidDripEmitterTrigger(); + break; + + // Oil drip emitter + case TRIGGER_OIL_DRIP_EMITTER: + trigger=(COilDripEmitterTrigger*)new("OilDripEmitterTrigger") COilDripEmitterTrigger(); + break; + + // Lava drip emitter + case TRIGGER_LAVA_DRIP_EMITTER: + trigger=(CLavaDripEmitterTrigger*)new("LavaDripEmitterTrigger") CLavaDripEmitterTrigger(); + break; + case TRIGGER_PLATFORM: trigger = (CPlatformTrigger*)new ("PlatformTrigger") CPlatformTrigger(); break; diff --git a/source/triggers/trigger.h b/source/triggers/trigger.h index a8dc19a8e..c7d8152b8 100644 --- a/source/triggers/trigger.h +++ b/source/triggers/trigger.h @@ -41,6 +41,10 @@ enum TRIGGER_TYPE TRIGGER_BUBBLE_GEYSER_EMITTER, TRIGGER_STEAM_EMITTER, TRIGGER_GARY_BOWL, + TRIGGER_WATER_DRIP_EMITTER, + TRIGGER_ACID_DRIP_EMITTER, + TRIGGER_OIL_DRIP_EMITTER, + TRIGGER_LAVA_DRIP_EMITTER, // Code based triggers TRIGGER_PLATFORM, diff --git a/tools/Data/bin/MkLevel.ini b/tools/Data/bin/MkLevel.ini index 62686b417..f30b9d516 100644 --- a/tools/Data/bin/MkLevel.ini +++ b/tools/Data/bin/MkLevel.ini @@ -146,6 +146,10 @@ IntermittentDownFlameEmitter=14 StreamGeyser=15 SteamEmitter=16 GaryBowl=17 +WaterDripEmitter=18 +AcidDripEmitter=19 +OilDripEmitter=20 +LavaDripEmitter=21 ################################################ # FX diff --git a/tools/MapEdit/trigger.ini b/tools/MapEdit/trigger.ini index 76d4112a0..86bc65237 100644 --- a/tools/MapEdit/trigger.ini +++ b/tools/MapEdit/trigger.ini @@ -41,4 +41,12 @@ HasBox=1 [GaryGoRight] -[GaryBowl] \ No newline at end of file +[GaryBowl] + +[WaterDripEmitter] + +[AcidDripEmitter] + +[OilDripEmitter] + +[LavaDripEmitter] \ No newline at end of file diff --git a/users/paul/spongebob project/spongebob project.dsp b/users/paul/spongebob project/spongebob project.dsp index 088b7af97..4ae582c8e 100644 --- a/users/paul/spongebob project/spongebob project.dsp +++ b/users/paul/spongebob project/spongebob project.dsp @@ -2069,6 +2069,14 @@ SOURCE=..\..\..\source\thing\thing.h # PROP Default_Filter "" # Begin Source File +SOURCE=..\..\..\source\triggers\tadripemit.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\triggers\tadripemit.h +# End Source File +# Begin Source File + SOURCE=..\..\..\source\triggers\tbemit.cpp # End Source File # Begin Source File @@ -2165,6 +2173,14 @@ SOURCE=..\..\..\source\triggers\tifemit.h # End Source File # Begin Source File +SOURCE=..\..\..\source\triggers\tldripemit.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\triggers\tldripemit.h +# End Source File +# Begin Source File + SOURCE=..\..\..\source\triggers\tlevexit.cpp # End Source File # Begin Source File @@ -2181,6 +2197,14 @@ SOURCE=..\..\..\source\triggers\tlook.h # End Source File # Begin Source File +SOURCE=..\..\..\source\triggers\todripemit.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\triggers\todripemit.h +# End Source File +# Begin Source File + SOURCE=..\..\..\source\triggers\tplatfrm.cpp # End Source File # Begin Source File @@ -2235,6 +2259,14 @@ SOURCE=..\..\..\source\triggers\twater.cpp SOURCE=..\..\..\source\triggers\twater.h # End Source File +# Begin Source File + +SOURCE=..\..\..\source\triggers\twdripemit.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\triggers\twdripemit.h +# End Source File # End Group # Begin Group "utils"