diff --git a/data/translations/text.dat b/data/translations/text.dat index bc1f6a500..ad52927dd 100644 --- a/data/translations/text.dat +++ b/data/translations/text.dat @@ -90,6 +90,8 @@ eng=JUMP eng=FIRE [STR__FRONTEND__CATCH] eng=CATCH +[STR__FRONTEND__WEAPONCHANGE] +eng=CHANGE WEAPON ; Screen menu [STR__FRONTEND__HORIZONTAL_POSITION] diff --git a/source/frontend/options.cpp b/source/frontend/options.cpp index b7b96a185..37ebddb50 100644 --- a/source/frontend/options.cpp +++ b/source/frontend/options.cpp @@ -117,6 +117,7 @@ int CFrontEndOptions::s_buttonOrder[]= CPadConfig::PAD_CFG_JUMP, CPadConfig::PAD_CFG_FIRE, CPadConfig::PAD_CFG_CATCH, + CPadConfig::PAD_CFG_WEAPONCHANGE, }; CGUISpriteReadout::SpriteReadoutData CFrontEndOptions::s_controlReadoutSprites[]= @@ -318,6 +319,15 @@ void CFrontEndOptions::init() tb->init(fr); tb->setObjectXYWH(146+26,30,120,15); tb->setText(STR__FRONTEND__CATCH); + sr=new ("spritereadout") CGUISpriteReadout(); + sr->init(fr); + sr->setObjectXYWH(146,45,26,15); + sr->setReadoutTarget(&m_controlIcons[CONTROL_WEAPONCHANGE]); + sr->setReadoutData(s_controlReadoutSprites); + tb=new ("textbox") CGUITextBox(); + tb->init(fr); + tb->setObjectXYWH(146+26,45,120,15); + tb->setText(STR__FRONTEND__WEAPONCHANGE); // Populate SCREEN menu diff --git a/source/frontend/options.h b/source/frontend/options.h index 811214a70..dd6edff19 100644 --- a/source/frontend/options.h +++ b/source/frontend/options.h @@ -71,6 +71,7 @@ private: CONTROL_JUMP, CONTROL_FIRE, CONTROL_CATCH, + CONTROL_WEAPONCHANGE, CONTROL_COUNT }; diff --git a/source/level/layercollision.cpp b/source/level/layercollision.cpp index 62f7526dd..f790ef2b0 100644 --- a/source/level/layercollision.cpp +++ b/source/level/layercollision.cpp @@ -242,7 +242,7 @@ ColShowType showCollision=SHOW_NONE; #endif void CLayerCollision::render(DVECTOR &MapPos) { - if(PadGetDown(0)&PAD_CIRCLE) + if(PadGetDown(0)&PAD_L2) { showCollision=(ColShowType)(showCollision+1); if(showCollision>SHOW_SEMITRANS)showCollision=SHOW_NONE; diff --git a/source/level/level.cpp b/source/level/level.cpp index 3b3ae804a..979ba3591 100644 --- a/source/level/level.cpp +++ b/source/level/level.cpp @@ -447,8 +447,7 @@ void CLevel::initThings(int _respawningLevel) createThisPickup=false; } - if(((PICKUP_TYPE)ItemList->Type==PICKUP__NET|| - (PICKUP_TYPE)ItemList->Type==PICKUP__HELMET)&& + if((PICKUP_TYPE)ItemList->Type==PICKUP__HELMET&& _respawningLevel) { createThisPickup=false; diff --git a/source/pad/pads.cpp b/source/pad/pads.cpp index 3b1bc1631..38a28ca43 100644 --- a/source/pad/pads.cpp +++ b/source/pad/pads.cpp @@ -401,6 +401,7 @@ CPadConfig::sPadConfigTable CPadConfig::s_padConfigs[NUM_PAD_CONFIGS]= PAD_SQUARE, // PAD_CFG_FIRE PAD_TRIANGLE, // PAD_CFG_CATCH PAD_CROSS, // PAD_CFG_JUMP + PAD_CIRCLE, // PAD_CFG_WEAPONCHANGE }}, // Config B {{ @@ -413,6 +414,7 @@ CPadConfig::sPadConfigTable CPadConfig::s_padConfigs[NUM_PAD_CONFIGS]= PAD_CROSS, // PAD_CFG_FIRE PAD_TRIANGLE, // PAD_CFG_CATCH PAD_SQUARE, // PAD_CFG_JUMP + PAD_CIRCLE, // PAD_CFG_WEAPONCHANGE }}, // Config C {{ @@ -425,6 +427,7 @@ CPadConfig::sPadConfigTable CPadConfig::s_padConfigs[NUM_PAD_CONFIGS]= PAD_CIRCLE, // PAD_CFG_FIRE PAD_CROSS, // PAD_CFG_CATCH PAD_TRIANGLE, // PAD_CFG_JUMP + PAD_SQUARE, // PAD_CFG_WEAPONCHANGE }}, // Config D {{ @@ -437,6 +440,7 @@ CPadConfig::sPadConfigTable CPadConfig::s_padConfigs[NUM_PAD_CONFIGS]= PAD_LEFT, // PAD_CFG_FIRE PAD_UP, // PAD_CFG_CATCH PAD_DOWN, // PAD_CFG_JUMP + PAD_RIGHT, // PAD_CFG_WEAPONCHANGE }}, }; diff --git a/source/pad/pads.h b/source/pad/pads.h index f96a10c54..c992ecaa9 100644 --- a/source/pad/pads.h +++ b/source/pad/pads.h @@ -119,6 +119,7 @@ public: PAD_CFG_FIRE, PAD_CFG_CATCH, PAD_CFG_JUMP, + PAD_CFG_WEAPONCHANGE, PAD_CFG_MAX }; diff --git a/source/pickups/pballoon.cpp b/source/pickups/pballoon.cpp index 208c91d30..f6a4c7aa5 100644 --- a/source/pickups/pballoon.cpp +++ b/source/pickups/pballoon.cpp @@ -83,7 +83,7 @@ void CBalloonPickup::init() { sFrameHdr *fh; - CBaseRespawningPickup::init(); + CBaseWeaponPickup::init(); m_sin=0; fh=getSpriteBank()->getFrameHeader(FRM__BALLOON); @@ -117,7 +117,7 @@ void CBalloonPickup::collect(class CPlayer *_player) { _player->setMode(PLAYER_MODE_BALLOON); CSoundMediator::playSfx(CSoundMediator::SFX_BALLOON_INFLATE); - CBaseRespawningPickup::collect(_player); + CBaseWeaponPickup::collect(_player); } /*---------------------------------------------------------------------- diff --git a/source/pickups/pballoon.h b/source/pickups/pballoon.h index b291d2fcf..893374eaf 100644 --- a/source/pickups/pballoon.h +++ b/source/pickups/pballoon.h @@ -34,7 +34,7 @@ Structure defintions -------------------- */ -class CBalloonPickup : public CBaseRespawningPickup +class CBalloonPickup : public CBaseWeaponPickup { public: virtual void init(); diff --git a/source/pickups/pblower.cpp b/source/pickups/pblower.cpp index 4c50f2656..3e19f42ce 100644 --- a/source/pickups/pblower.cpp +++ b/source/pickups/pblower.cpp @@ -69,33 +69,11 @@ ---------------------------------------------------------------------- */ void CCoralBlowerPickup::init() { - sFrameHdr *fh; - - CBasePickup::init(); - - fh=getSpriteBank()->getFrameHeader(FRM__BLOWER); - setCollisionSize(fh->W,fh->H); + CBaseWeaponSimplePickup::init(); GameScene.getPlayer()->registerAddon(PLAYER_ADDON_CORALBLOWER); } -/*---------------------------------------------------------------------- - Function: - Purpose: - Params: - Returns: - ---------------------------------------------------------------------- */ -DVECTOR CCoralBlowerPickup::getSizeForPlacement() -{ - DVECTOR size; - sFrameHdr *fh; - - fh=getSpriteBank()->getFrameHeader(FRM__BLOWER); - size.vx=fh->W; - size.vy=fh->H; - return size; -} - /*---------------------------------------------------------------------- Function: Purpose: @@ -105,7 +83,7 @@ DVECTOR CCoralBlowerPickup::getSizeForPlacement() void CCoralBlowerPickup::collect(class CPlayer *_player) { _player->setMode(PLAYER_MODE_CORALBLOWER); - CBasePickup::collect(_player); + CBaseWeaponSimplePickup::collect(_player); } /*---------------------------------------------------------------------- @@ -114,17 +92,9 @@ void CCoralBlowerPickup::collect(class CPlayer *_player) Params: Returns: ---------------------------------------------------------------------- */ -void CCoralBlowerPickup::renderPickup(DVECTOR *_pos) +int CCoralBlowerPickup::getWeaponSpriteFrame() { - SpriteBank *sprites; - sFrameHdr *fh; - int x,y; - - sprites=getSpriteBank(); - fh=sprites->getFrameHeader(FRM__BLOWER); - x=_pos->vx-(fh->W/2); - y=_pos->vy-(fh->H/2); - sprites->printFT4(fh,x,y,0,0,OTPOS__PICKUP_POS); + return FRM__BLOWER; } /*=========================================================================== diff --git a/source/pickups/pblower.h b/source/pickups/pblower.h index 0a501b6c7..1bb745678 100644 --- a/source/pickups/pblower.h +++ b/source/pickups/pblower.h @@ -34,15 +34,14 @@ Structure defintions -------------------- */ -class CCoralBlowerPickup : public CBasePickup +class CCoralBlowerPickup : public CBaseWeaponSimplePickup { public: virtual void init(); - virtual DVECTOR getSizeForPlacement(); virtual void collect(class CPlayer *_player); protected: - virtual void renderPickup(DVECTOR *_pos); + virtual int getWeaponSpriteFrame(); }; diff --git a/source/pickups/pbubmix.cpp b/source/pickups/pbubmix.cpp index 3c129caf7..f1a9ea7b1 100644 --- a/source/pickups/pbubmix.cpp +++ b/source/pickups/pbubmix.cpp @@ -165,33 +165,11 @@ void CBubbleMixturePickup::renderPickup(DVECTOR *_pos) ---------------------------------------------------------------------- */ void CBubbleWandPickup::init() { - sFrameHdr *fh; - - CBaseRespawningPickup::init(); - - fh=getSpriteBank()->getFrameHeader(FRM__BUBBLEWAND); - setCollisionSize(fh->W,fh->H); + CBaseWeaponSimplePickup::init(); GameScene.getPlayer()->registerAddon(PLAYER_ADDON_BUBBLEWAND); } -/*---------------------------------------------------------------------- - Function: - Purpose: - Params: - Returns: - ---------------------------------------------------------------------- */ -DVECTOR CBubbleWandPickup::getSizeForPlacement() -{ - DVECTOR size; - sFrameHdr *fh; - - fh=getSpriteBank()->getFrameHeader(FRM__BUBBLEWAND); - size.vx=fh->W; - size.vy=fh->H; - return size; -} - /*---------------------------------------------------------------------- Function: Purpose: @@ -201,7 +179,7 @@ DVECTOR CBubbleWandPickup::getSizeForPlacement() void CBubbleWandPickup::collect(class CPlayer *_player) { _player->setMode(PLAYER_MODE_BUBBLE_MIXTURE); - CBaseRespawningPickup::collect(_player); + CBaseWeaponSimplePickup::collect(_player); } /*---------------------------------------------------------------------- @@ -210,28 +188,9 @@ void CBubbleWandPickup::collect(class CPlayer *_player) Params: Returns: ---------------------------------------------------------------------- */ -int CBubbleWandPickup::getRespawnTime() +int CBubbleWandPickup::getWeaponSpriteFrame() { - return 60*10; -} - -/*---------------------------------------------------------------------- - Function: - Purpose: - Params: - Returns: - ---------------------------------------------------------------------- */ -void CBubbleWandPickup::renderPickup(DVECTOR *_pos) -{ - SpriteBank *sprites; - sFrameHdr *fh; - int x,y; - - sprites=getSpriteBank(); - fh=sprites->getFrameHeader(FRM__BUBBLEWAND); - x=_pos->vx-(fh->W/2); - y=_pos->vy-(fh->H/2); - sprites->printFT4(fh,x,y,0,0,OTPOS__PICKUP_POS); + return FRM__BUBBLEWAND; } /*=========================================================================== diff --git a/source/pickups/pbubmix.h b/source/pickups/pbubmix.h index b63733d18..7aca5354e 100644 --- a/source/pickups/pbubmix.h +++ b/source/pickups/pbubmix.h @@ -54,18 +54,14 @@ private: }; -class CBubbleWandPickup : public CBaseRespawningPickup +class CBubbleWandPickup : public CBaseWeaponSimplePickup { public: virtual void init(); - - virtual DVECTOR getSizeForPlacement(); virtual void collect(class CPlayer *_player); protected: - virtual int getRespawnTime(); - - virtual void renderPickup(DVECTOR *_pos); + virtual int getWeaponSpriteFrame(); }; diff --git a/source/pickups/pickup.cpp b/source/pickups/pickup.cpp index aa0b93463..0a6fd8b62 100644 --- a/source/pickups/pickup.cpp +++ b/source/pickups/pickup.cpp @@ -25,6 +25,10 @@ #include "level\level.h" #endif +#ifndef __PLAYER_PLAYER_H__ +#include "player\player.h" +#endif + // For the factory.. #ifndef __PICKUPS_PHEALTH_H__ @@ -277,6 +281,88 @@ void CBaseRespawningPickup::collect(class CPlayer *_player) + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void CBaseWeaponPickup::collidedWith(CThing *_thisThing) +{ + switch(_thisThing->getThingType()) + { + case TYPE_PLAYER: + if(((CPlayer*)_thisThing)->tryingToPickupWeapon()) + { + collect((CPlayer*)_thisThing); + } + break; + + default: + ASSERT(0); + break; + } +} + + + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void CBaseWeaponSimplePickup::init() +{ + sFrameHdr *fh; + + CBaseWeaponPickup::init(); + + fh=getSpriteBank()->getFrameHeader(FRM__NET); + setCollisionSize(fh->W,fh->H); +} + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +DVECTOR CBaseWeaponSimplePickup::getSizeForPlacement() +{ + DVECTOR size; + sFrameHdr *fh; + + fh=getSpriteBank()->getFrameHeader(getWeaponSpriteFrame()); + size.vx=fh->W; + size.vy=fh->H; + return size; +} + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void CBaseWeaponSimplePickup::renderPickup(DVECTOR *_pos) +{ + SpriteBank *sprites; + sFrameHdr *fh; + int x,y; + + sprites=getSpriteBank(); + fh=sprites->getFrameHeader(getWeaponSpriteFrame()); + x=_pos->vx-(fh->W/2); + y=_pos->vy-(fh->H/2); + sprites->printFT4(fh,x,y,0,0,OTPOS__PICKUP_POS); +} + + + + /*---------------------------------------------------------------------- Function: Purpose: This is basically a factory method for making pickups :) diff --git a/source/pickups/pickup.h b/source/pickups/pickup.h index b279aba40..813311f77 100644 --- a/source/pickups/pickup.h +++ b/source/pickups/pickup.h @@ -107,6 +107,31 @@ private: }; + +class CBaseWeaponPickup : public CBaseRespawningPickup +{ +protected: + virtual void collidedWith(CThing *_thisThing); + + virtual int getRespawnTime() {return 5*60;} + +}; + + +class CBaseWeaponSimplePickup : public CBaseWeaponPickup +{ +public: + virtual void init(); + virtual DVECTOR getSizeForPlacement(); + +protected: + virtual void renderPickup(DVECTOR *_pos); + + virtual int getWeaponSpriteFrame()=0; + +}; + + /*---------------------------------------------------------------------- Globals ------- */ diff --git a/source/pickups/pjlammo.cpp b/source/pickups/pjlammo.cpp index 979fde909..d13f0b8fb 100644 --- a/source/pickups/pjlammo.cpp +++ b/source/pickups/pjlammo.cpp @@ -163,33 +163,11 @@ void CJellyLauncherAmmoPickup::renderPickup(DVECTOR *_pos) ---------------------------------------------------------------------- */ void CJellyLauncherPickup::init() { - sFrameHdr *fh; - - CBasePickup::init(); - - fh=getSpriteBank()->getFrameHeader(FRM__LAUNCHER); - setCollisionSize(fh->W,fh->H); + CBaseWeaponSimplePickup::init(); GameScene.getPlayer()->registerAddon(PLAYER_ADDON_JELLYLAUNCHER); } -/*---------------------------------------------------------------------- - Function: - Purpose: - Params: - Returns: - ---------------------------------------------------------------------- */ -DVECTOR CJellyLauncherPickup::getSizeForPlacement() -{ - DVECTOR size; - sFrameHdr *fh; - - fh=getSpriteBank()->getFrameHeader(FRM__LAUNCHER); - size.vx=fh->W; - size.vy=fh->H; - return size; -} - /*---------------------------------------------------------------------- Function: Purpose: @@ -199,7 +177,7 @@ DVECTOR CJellyLauncherPickup::getSizeForPlacement() void CJellyLauncherPickup::collect(class CPlayer *_player) { _player->setMode(PLAYER_MODE_JELLY_LAUNCHER); - CBasePickup::collect(_player); + CBaseWeaponSimplePickup::collect(_player); } /*---------------------------------------------------------------------- @@ -208,17 +186,9 @@ void CJellyLauncherPickup::collect(class CPlayer *_player) Params: Returns: ---------------------------------------------------------------------- */ -void CJellyLauncherPickup::renderPickup(DVECTOR *_pos) +int CJellyLauncherPickup::getWeaponSpriteFrame() { - SpriteBank *sprites; - sFrameHdr *fh; - int x,y; - - sprites=getSpriteBank(); - fh=sprites->getFrameHeader(FRM__LAUNCHER); - x=_pos->vx-(fh->W/2); - y=_pos->vy-(fh->H/2); - sprites->printFT4(fh,x,y,0,0,OTPOS__PICKUP_POS); + return FRM__LAUNCHER; } diff --git a/source/pickups/pjlammo.h b/source/pickups/pjlammo.h index b39cbd0ae..cfff5c2b2 100644 --- a/source/pickups/pjlammo.h +++ b/source/pickups/pjlammo.h @@ -50,15 +50,14 @@ private: }; -class CJellyLauncherPickup : public CBasePickup +class CJellyLauncherPickup : public CBaseWeaponSimplePickup { public: virtual void init(); - virtual DVECTOR getSizeForPlacement(); virtual void collect(class CPlayer *_player); protected: - virtual void renderPickup(DVECTOR *_pos); + virtual int getWeaponSpriteFrame(); }; diff --git a/source/pickups/pnet.cpp b/source/pickups/pnet.cpp index b9f6d1d65..f01cbd623 100644 --- a/source/pickups/pnet.cpp +++ b/source/pickups/pnet.cpp @@ -69,34 +69,12 @@ ---------------------------------------------------------------------- */ void CNetPickup::init() { - sFrameHdr *fh; - - CBasePickup::init(); - - fh=getSpriteBank()->getFrameHeader(FRM__NET); - setCollisionSize(fh->W,fh->H); + CBaseWeaponSimplePickup::init(); GameScene.getPlayer()->registerAddon(PLAYER_ADDON_NET); GameScene.getPlayer()->registerAddon(PLAYER_ADDON_JELLYFISHINNET); } -/*---------------------------------------------------------------------- - Function: - Purpose: - Params: - Returns: - ---------------------------------------------------------------------- */ -DVECTOR CNetPickup::getSizeForPlacement() -{ - DVECTOR size; - sFrameHdr *fh; - - fh=getSpriteBank()->getFrameHeader(FRM__NET); - size.vx=fh->W; - size.vy=fh->H; - return size; -} - /*---------------------------------------------------------------------- Function: Purpose: @@ -106,7 +84,7 @@ DVECTOR CNetPickup::getSizeForPlacement() void CNetPickup::collect(class CPlayer *_player) { _player->setMode(PLAYER_MODE_NET); - CBasePickup::collect(_player); + CBaseWeaponSimplePickup::collect(_player); } /*---------------------------------------------------------------------- @@ -115,18 +93,11 @@ void CNetPickup::collect(class CPlayer *_player) Params: Returns: ---------------------------------------------------------------------- */ -void CNetPickup::renderPickup(DVECTOR *_pos) +int CNetPickup::getWeaponSpriteFrame() { - SpriteBank *sprites; - sFrameHdr *fh; - int x,y; - - sprites=getSpriteBank(); - fh=sprites->getFrameHeader(FRM__NET); - x=_pos->vx-(fh->W/2); - y=_pos->vy-(fh->H/2); - sprites->printFT4(fh,x,y,0,0,OTPOS__PICKUP_POS); + return FRM__NET; } + /*=========================================================================== end */ diff --git a/source/pickups/pnet.h b/source/pickups/pnet.h index 5573a29fb..139686762 100644 --- a/source/pickups/pnet.h +++ b/source/pickups/pnet.h @@ -34,16 +34,14 @@ Structure defintions -------------------- */ -class CNetPickup : public CBasePickup +class CNetPickup : public CBaseWeaponSimplePickup { public: virtual void init(); - virtual int dontKillDuringLevelRespawn() {return true;} - virtual DVECTOR getSizeForPlacement(); virtual void collect(class CPlayer *_player); protected: - virtual void renderPickup(DVECTOR *_pos); + virtual int getWeaponSpriteFrame(); }; diff --git a/source/player/player.cpp b/source/player/player.cpp index 8f989ba25..e0cb4bece 100644 --- a/source/player/player.cpp +++ b/source/player/player.cpp @@ -684,15 +684,6 @@ else if(oldmode!=-1&&!(PadGetHeld(0)&PAD_L1)) oldmode=-1; } -#ifdef __USER_paul__ -if(PadGetHeld(0)&PAD_L1&&PadGetHeld(0)&PAD_L2) -{ - if(m_currentMode!=PLAYER_MODE_DEAD) - { - dieYouPorousFreak(); - } -} -#endif if(newmode!=-1) { setMode((PLAYER_MODE)newmode); @@ -723,10 +714,26 @@ if(newmode!=-1) } } + m_tryingToPickupWeapon=false; for(i=0;i<_frames;i++) { // Think updatePadInput(); +if(getPadInputDown()) +{ + PAUL_DBGMSG("%02x",getPadInputDown()); +} + if(getPadInputDown()&PI_WEAPONCHANGE) + { + if(!m_tryingToPickupWeapon&& + m_currentMode!=PLAYER_MODE_BASICUNARMED&& + m_currentMode!=PLAYER_MODE_FULLUNARMED&& + m_currentMode!=PLAYER_MODE_DEAD) + { + setMode(PLAYER_MODE_FULLUNARMED); + } + m_tryingToPickupWeapon=true; + } // Trying to converate? if(m_allowConversation==false&& @@ -1959,6 +1966,10 @@ PLAYERINPUT CPlayer::readPadInput() { input=(PLAYERINPUT)(input|PI_CATCH); } + if(pad&CPadConfig::getButton(CPadConfig::PAD_CFG_WEAPONCHANGE)) + { + input=(PLAYERINPUT)(input|PI_WEAPONCHANGE); + } #ifdef _RECORD_DEMO_MODE_ diff --git a/source/player/player.h b/source/player/player.h index 2f9e3e9a5..8a2fd438a 100644 --- a/source/player/player.h +++ b/source/player/player.h @@ -156,6 +156,7 @@ typedef enum PI_JUMP =1<<4, PI_FIRE =1<<5, PI_CATCH =1<<6, + PI_WEAPONCHANGE =1<<7, }PLAYERINPUT; @@ -258,6 +259,7 @@ public: void setPlayerPos(DVECTOR *_pos) {Pos=*_pos;} PLAYERINPUT getPadInputHeld() {return m_padInput;} PLAYERINPUT getPadInputDown() {return m_padInputDown;} + int tryingToPickupWeapon() {return m_tryingToPickupWeapon;} class CLayerCollision *getLayerCollision() {return m_layerCollision;} void inSoakUpState(); @@ -336,6 +338,7 @@ private: PLAYERINPUT m_padInput; // Controls that are being held down PLAYERINPUT m_lastPadInput; // Last frames controls PLAYERINPUT m_padInputDown; // Controls that were pressed this frame + int m_tryingToPickupWeapon; // Various info about the current map