diff --git a/makefile.gaz b/makefile.gaz index 1ad15190a..e0ea0eb5e 100644 --- a/makefile.gaz +++ b/makefile.gaz @@ -130,7 +130,8 @@ platform_src := platform \ pconveyr \ pplayer \ pcbubble \ - pdrop + pdrop \ + psswitch hazard_src := hazard \ hfalling \ diff --git a/source/platform/platdata.cpp b/source/platform/platdata.cpp index 458705c69..58b55523e 100644 --- a/source/platform/platdata.cpp +++ b/source/platform/platdata.cpp @@ -478,6 +478,18 @@ CNpcPlatform::NPC_PLATFORM_DATA CNpcPlatform::m_data[NPC_PLATFORM_TYPE_MAX] = 0, NPC_PLATFORM_TIMER_NONE, }, + + { // NPC_STEAM_SWITCH_PLATFORM + 2, + 128, + true, + DAMAGE__NONE, + 0, + 2, + NPC_PLATFORM_INFINITE_LIFE, + 0, + NPC_PLATFORM_TIMER_NONE, + }, }; CNpcPlatform::NPC_PLATFORM_UNIT_TYPE CNpcPlatform::mapEditConvertTable[NPC_PLATFORM_TYPE_MAX] = @@ -515,6 +527,7 @@ CNpcPlatform::NPC_PLATFORM_UNIT_TYPE CNpcPlatform::mapEditConvertTable[NPC_PLATF NPC_CONVEYOR_GENERATOR, NPC_COLLAPSING_ACRID_PLATFORM, NPC_DROP_PLATFORM, + NPC_STEAM_SWITCH_PLATFORM, NPC_CONVEYOR_PLATFORM, NPC_PLAYER_BUBBLE_PLATFORM, NPC_CLAM_PLATFORM, diff --git a/source/platform/platform.cpp b/source/platform/platform.cpp index 7eba30e44..a315e5523 100644 --- a/source/platform/platform.cpp +++ b/source/platform/platform.cpp @@ -175,6 +175,10 @@ #include "platform\pdrop.h" #endif +#ifndef __PLATFORM_PSSWITCH_H__ +#include "platform\psswitch.h" +#endif + #include "fx\fx.h" #include "fx\fxjfish.h" @@ -401,6 +405,12 @@ CNpcPlatform *CNpcPlatform::Create(int Type) break; } + case NPC_STEAM_SWITCH_PLATFORM: + { + platform = new ("steam switch platform") CNpcSteamSwitchPlatform; + break; + } + default: { ASSERT( 0 ); diff --git a/source/platform/platform.h b/source/platform/platform.h index b09d71f6c..be8cc7375 100644 --- a/source/platform/platform.h +++ b/source/platform/platform.h @@ -90,6 +90,7 @@ public: NPC_CLAM_PLATFORM, NPC_COLLAPSING_ACRID_PLATFORM, NPC_DROP_PLATFORM, + NPC_STEAM_SWITCH_PLATFORM, NPC_PLATFORM_TYPE_MAX, }; enum diff --git a/source/platform/psswitch.cpp b/source/platform/psswitch.cpp new file mode 100644 index 000000000..e38134599 --- /dev/null +++ b/source/platform/psswitch.cpp @@ -0,0 +1,148 @@ +/*========================================================================= + + psswitch.cpp + + Author: CRB + Created: + Project: Spongebob + Purpose: + + Copyright (c) 2001 Climax Development Ltd + +===========================================================================*/ + +#ifndef __PLATFORM_PSSWITCH_H__ +#include "platform\psswitch.h" +#endif + +#ifndef __GAME_GAME_H__ +#include "game\game.h" +#endif + +#ifndef __UTILS_HEADER__ +#include "utils\utils.h" +#endif + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void CNpcSteamSwitchPlatform::postInit() +{ + CNpcPlatform::postInit(); + + m_state = NPC_STEAM_SWITCH_STOP; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void CNpcSteamSwitchPlatform::processMovement( int _frames ) +{ + switch( m_state ) + { + case NPC_STEAM_SWITCH_STOP: + { + if ( m_contact ) + { + CPlayer *player = GameScene.getPlayer(); + ATTACK_STATE playerState = player->getAttackState(); + + if ( playerState == ATTACK_STATE__BUTT_BOUNCE ) + { + m_state = NPC_STEAM_SWITCH_DEPRESS; + } + } + + break; + } + + case NPC_STEAM_SWITCH_DEPRESS: + { + s32 extension = m_maxExtension - m_extension; + s32 maxMove = m_speed * _frames; + + if ( extension > maxMove ) + { + extension = maxMove; + } + else if ( extension < -maxMove ) + { + extension = -maxMove; + } + + if ( extension ) + { + m_extension += extension; + } + else + { + m_state = NPC_STEAM_SWITCH_RETURN; + } + + break; + } + + case NPC_STEAM_SWITCH_RETURN: + { + s32 extension = -m_extension; + s32 maxMove = m_speed * _frames; + + if ( extension > maxMove ) + { + extension = maxMove; + } + else if ( extension < -maxMove ) + { + extension = -maxMove; + } + + if ( extension ) + { + m_extension += extension; + } + else + { + m_state = NPC_STEAM_SWITCH_STOP; + } + + break; + } + } + + Pos.vy = m_base.vy + m_extension; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void CNpcSteamSwitchPlatform::setWaypoints( sThingPlatform *ThisPlatform ) +{ + int pointNum; + + u16 *PntList=(u16*)MakePtr(ThisPlatform,sizeof(sThingPlatform)); + + u16 newXPos, newYPos; + + newXPos = (u16) *PntList; + PntList++; + newYPos = (u16) *PntList; + PntList++; + + DVECTOR startPos; + startPos.vx = ( newXPos << 4 ) + 8; + startPos.vy = ( newYPos << 4 ) + 16; + + init( startPos ); + + if ( ThisPlatform->PointCount > 1 ) + { + newXPos = (u16) *PntList; + PntList++; + newYPos = (u16) *PntList; + PntList++; + + m_maxExtension = ( ( newYPos << 4 ) + 16 ) - startPos.vy; + } + else + { + m_maxExtension = 100; + } +} diff --git a/source/platform/psswitch.h b/source/platform/psswitch.h new file mode 100644 index 000000000..3cce33fe0 --- /dev/null +++ b/source/platform/psswitch.h @@ -0,0 +1,39 @@ +/*========================================================================= + + psswitch.h + + Author: CRB + Created: + Project: Spongebob + Purpose: + + Copyright (c) 2001 Climax Development Ltd + +===========================================================================*/ + +#ifndef __PLATFORM_PSSWITCH_H__ +#define __PLATFORM_PSSWITCH_H__ + +#ifndef __PLATFORM_PLATFORM_H__ +#include "platform\platform.h" +#endif + +class CNpcSteamSwitchPlatform : public CNpcPlatform +{ +public: + virtual void postInit(); + virtual void setWaypoints( sThingPlatform *ThisPlatform ); +protected: + virtual void processMovement( int _frames ); + + enum NPC_STEAM_SWITCH_STATE + { + NPC_STEAM_SWITCH_STOP = 0, + NPC_STEAM_SWITCH_DEPRESS = 1, + NPC_STEAM_SWITCH_RETURN, + }; + + s32 m_maxExtension; +}; + +#endif \ No newline at end of file diff --git a/tools/Data/bin/MkLevel.ini b/tools/Data/bin/MkLevel.ini index 11a50709f..baa3773ec 100644 --- a/tools/Data/bin/MkLevel.ini +++ b/tools/Data/bin/MkLevel.ini @@ -122,6 +122,7 @@ AcridBubble=31 LeafRaft=19 OilRigPlatform=1 RockBridge=32 +SteamSwitch=33 ################################################ # Triggers diff --git a/tools/MapEdit/platform.ini b/tools/MapEdit/platform.ini index af2883e66..689731323 100644 --- a/tools/MapEdit/platform.ini +++ b/tools/MapEdit/platform.ini @@ -139,3 +139,6 @@ Gfx=..\..\Graphics\platforms\oilrig\oilrigplatform.gin [RockBridge] Gfx=..\..\Graphics\platforms\rockbridge\rockbridge.gin +[SteamSwitch] +Gfx=..\..\Graphics\platforms\steam_switch\steam_switch.gin + diff --git a/users/paul/spongebob project/spongebob project.dsp b/users/paul/spongebob project/spongebob project.dsp index ffe215b44..f148b27d1 100644 --- a/users/paul/spongebob project/spongebob project.dsp +++ b/users/paul/spongebob project/spongebob project.dsp @@ -1629,6 +1629,14 @@ SOURCE=..\..\..\source\platform\pseesaw.h # End Source File # Begin Source File +SOURCE=..\..\..\source\platform\psswitch.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\source\platform\psswitch.h +# End Source File +# Begin Source File + SOURCE=..\..\..\source\platform\ptrpdoor.cpp # End Source File # Begin Source File