diff --git a/src/config/player.cpp b/src/config/player.cpp deleted file mode 100644 index f6ae73c31..000000000 --- a/src/config/player.cpp +++ /dev/null @@ -1,49 +0,0 @@ - -#include "config/player.hpp" - -#include "karts/controller/player_controller.hpp" -#include "modes/world.hpp" - -ActivePlayer::ActivePlayer(PlayerProfile* player, InputDevice *device) -{ - m_player = player; - m_device = NULL; - setDevice(device); -} // ActivePlayer - -// ---------------------------------------------------------------------------- -ActivePlayer::~ActivePlayer() -{ - setDevice(NULL); -} // ~ActivePlayer - -// ---------------------------------------------------------------------------- -PlayerProfile* ActivePlayer::getProfile() -{ - return m_player; -} // getProfile - -// ---------------------------------------------------------------------------- -void ActivePlayer::setPlayerProfile(PlayerProfile* player) -{ - m_player = player; -} // setPlayerProfile - -// ---------------------------------------------------------------------------- -InputDevice* ActivePlayer::getDevice() const -{ - return m_device; -} // getDevice - -// ---------------------------------------------------------------------------- -void ActivePlayer::setDevice(InputDevice* device) -{ - // unset player from previous device he was assigned to, if any - if (m_device != NULL) m_device->setPlayer(NULL); - - m_device = device; - - // inform the devce of its new owner - if (device != NULL) device->setPlayer(this); -} // setDevice - diff --git a/src/config/player.hpp b/src/config/player.hpp index 3e0f0c590..ed3aba10c 100644 --- a/src/config/player.hpp +++ b/src/config/player.hpp @@ -22,10 +22,6 @@ #include #include "config/user_config.hpp" -#include "input/input_device.hpp" - -class InputDevice; -class Kart; /** * class for managing player profiles (name, control configuration, etc.) @@ -51,42 +47,12 @@ public: void setName(const std::string &name_){ m_name = name_;} - const char* getName() { return m_name.c_str(); } + const char* getName() const { return m_name.c_str(); } //int getLastKartId(){ return m_last_kart_id; } //void setLastKartId(int newLastKartId){ m_last_kart_id = newLastKartId; } }; -/** - * Represents a player that is currently playing. It helps manage associating with a - * player profile and an input device (we're very flexible on this; ActivePlayer #1 - * can choose to e.g. use profile #5 and device #2) - */ -class ActivePlayer -{ - PlayerProfile *m_player; - InputDevice *m_device; - - /** Pointer to the kart of this player, only valid during the game. */ - Kart *m_kart; -public: - /** ID of this player within the list of active players */ - int m_id; - - ActivePlayer(PlayerProfile* player, InputDevice* device); - ~ActivePlayer(); - - PlayerProfile* getProfile(); - void setPlayerProfile(PlayerProfile* player); - - InputDevice* getDevice() const; - void setDevice(InputDevice* device); - /** Sets the kart for this player. */ - void setKart(Kart *kart) { m_kart = kart; } - /** Returns the kart of this player. Only valid while world exists. */ - Kart* getKart() { return m_kart; } -}; - #endif /*EOF*/ diff --git a/src/ide/Xcode/STK_XCode.xcodeproj/project.pbxproj b/src/ide/Xcode/STK_XCode.xcodeproj/project.pbxproj index 39636ea4b..4ac827021 100644 --- a/src/ide/Xcode/STK_XCode.xcodeproj/project.pbxproj +++ b/src/ide/Xcode/STK_XCode.xcodeproj/project.pbxproj @@ -248,7 +248,6 @@ 956C6ED51128D3FB004336C8 /* end_controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 956C6ECC1128D3FB004336C8 /* end_controller.cpp */; }; 956C6ED61128D3FB004336C8 /* new_ai_controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 956C6ECF1128D3FB004336C8 /* new_ai_controller.cpp */; }; 956C6ED71128D3FB004336C8 /* player_controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 956C6ED11128D3FB004336C8 /* player_controller.cpp */; }; - 956D36A710095035007FCB95 /* player.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 956D36A610095035007FCB95 /* player.cpp */; }; 9574F17C11206881008D202E /* world_status.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9574F17A11206881008D202E /* world_status.cpp */; }; 958330CC10122B4A00C5137E /* engine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 958330B210122B4A00C5137E /* engine.cpp */; }; 958330CD10122B4A00C5137E /* event_handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 958330B410122B4A00C5137E /* event_handler.cpp */; }; @@ -456,7 +455,6 @@ 956C6ED01128D3FB004336C8 /* new_ai_controller.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = new_ai_controller.hpp; path = ../../karts/controller/new_ai_controller.hpp; sourceTree = SOURCE_ROOT; }; 956C6ED11128D3FB004336C8 /* player_controller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = player_controller.cpp; path = ../../karts/controller/player_controller.cpp; sourceTree = SOURCE_ROOT; }; 956C6ED21128D3FB004336C8 /* player_controller.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = player_controller.hpp; path = ../../karts/controller/player_controller.hpp; sourceTree = SOURCE_ROOT; }; - 956D36A610095035007FCB95 /* player.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = player.cpp; path = ../../config/player.cpp; sourceTree = SOURCE_ROOT; }; 9574F17A11206881008D202E /* world_status.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = world_status.cpp; path = ../../modes/world_status.cpp; sourceTree = SOURCE_ROOT; }; 9574F17B11206881008D202E /* world_status.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = world_status.hpp; path = ../../modes/world_status.hpp; sourceTree = SOURCE_ROOT; }; 958330B210122B4A00C5137E /* engine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = engine.cpp; path = ../../guiengine/engine.cpp; sourceTree = SOURCE_ROOT; }; @@ -2238,7 +2236,6 @@ children = ( 95B5CD13102DE08F00EF2001 /* device_config.cpp */, 95B5CD12102DE08F00EF2001 /* device_config.hpp */, - 956D36A610095035007FCB95 /* player.cpp */, 95D950CD0FE473CA002E10AD /* player.hpp */, 95D950CE0FE473CA002E10AD /* stk_config.cpp */, 95D950CF0FE473CA002E10AD /* stk_config.hpp */, @@ -2544,7 +2541,6 @@ 951BC65E0FFAF290006B5FF1 /* ipo.cpp in Sources */, 955DE88310042701006A4F3C /* check_manager.cpp in Sources */, 955DE88C1004273B006A4F3C /* check_structure.cpp in Sources */, - 956D36A710095035007FCB95 /* player.cpp in Sources */, 958330CC10122B4A00C5137E /* engine.cpp in Sources */, 958330CD10122B4A00C5137E /* event_handler.cpp in Sources */, 958330CE10122B4A00C5137E /* modaldialog.cpp in Sources */, diff --git a/src/input/device_manager.cpp b/src/input/device_manager.cpp index d95c88ab6..6c374161c 100644 --- a/src/input/device_manager.cpp +++ b/src/input/device_manager.cpp @@ -183,7 +183,7 @@ void DeviceManager::addGamepad(GamePadDevice* d) // ----------------------------------------------------------------------------- InputDevice* DeviceManager::mapKeyboardInput( int btnID, - ActivePlayer **player /* out */, + StateManager::ActivePlayer **player /* out */, PlayerAction *action /* out */ ) { const int keyboard_amount = m_keyboards.size(); @@ -218,7 +218,7 @@ InputDevice *DeviceManager::mapGamepadInput( Input::InputType type, int btnID, int axisDir, int value, - ActivePlayer **player /* out */, + StateManager::ActivePlayer **player /* out */, PlayerAction *action /* out */) { GamePadDevice *gPad = getGamePadFromIrrID(deviceID); @@ -248,7 +248,7 @@ bool DeviceManager::translateInput( Input::InputType type, int btnID, int axisDir, int value, - ActivePlayer** player /* out */, + StateManager::ActivePlayer** player /* out */, PlayerAction* action /* out */ ) { InputDevice *device = NULL; diff --git a/src/input/device_manager.hpp b/src/input/device_manager.hpp index 25119bffb..1f53dbcc2 100644 --- a/src/input/device_manager.hpp +++ b/src/input/device_manager.hpp @@ -48,7 +48,7 @@ private: int btnID, int axisDir, int value, - ActivePlayer **player /* out */, + StateManager::ActivePlayer **player /* out */, PlayerAction *action /* out */); /** @@ -59,7 +59,7 @@ private: * \return The device to which this input belongs */ InputDevice *mapKeyboardInput ( int btnID, - ActivePlayer **player /* out */, + StateManager::ActivePlayer **player /* out */, PlayerAction *action /* out */); bool deserialize(); @@ -108,7 +108,7 @@ public: int btnID, int axisDir, int value, - ActivePlayer** player /* out */, + StateManager::ActivePlayer** player /* out */, PlayerAction* action /* out */ ); InputDevice* getLatestUsedDevice(); diff --git a/src/input/input_device.cpp b/src/input/input_device.cpp index cf93de86d..4e7ca412b 100644 --- a/src/input/input_device.cpp +++ b/src/input/input_device.cpp @@ -18,7 +18,7 @@ InputDevice::InputDevice() /** * Sets which players uses this device; or pass NULL to say no player uses it. */ -void InputDevice::setPlayer(ActivePlayer* owner) +void InputDevice::setPlayer(StateManager::ActivePlayer* owner) { m_player = owner; } @@ -95,7 +95,7 @@ void GamePadDevice::setButtonPressed(const int i, bool isButtonPressed) void GamePadDevice::resetAxisDirection(const int axis, Input::AxisDirection direction, - ActivePlayer* player) + StateManager::ActivePlayer* player) { KeyBinding bind; if (StateManager::get()->getGameState() != GUIEngine::GAME) return; // ignore this while in menus @@ -126,7 +126,8 @@ void GamePadDevice::resetAxisDirection(const int axis, */ -bool GamePadDevice::hasBinding(Input::InputType type, const int id, const int value, ActivePlayer* player, PlayerAction* action /* out */) +bool GamePadDevice::hasBinding(Input::InputType type, const int id, const int value, + StateManager::ActivePlayer* player, PlayerAction* action /* out */) { bool success = false; if(m_prevAxisDirections == NULL) return false; // device not open diff --git a/src/input/input_device.hpp b/src/input/input_device.hpp index 601f39cbc..67091b20a 100644 --- a/src/input/input_device.hpp +++ b/src/input/input_device.hpp @@ -2,13 +2,13 @@ #define INPUT_DEVICE_HPP #include -#include "input/input.hpp" -#include "config/device_config.hpp" #include #include -#include "io/xml_node.hpp" -class ActivePlayer; +#include "config/device_config.hpp" +#include "input/input.hpp" +#include "io/xml_node.hpp" +#include "states_screens/state_manager.hpp" enum DeviceType { @@ -21,7 +21,7 @@ class InputDevice friend class DeviceManager; protected: DeviceType m_type; - ActivePlayer* m_player; + StateManager::ActivePlayer* m_player; DeviceConfig* m_configuration; public: @@ -33,8 +33,8 @@ public: DeviceType getType() const { return m_type; }; - void setPlayer(ActivePlayer* owner); - ActivePlayer *getPlayer() {return m_player;} + void setPlayer(StateManager::ActivePlayer* owner); + StateManager::ActivePlayer *getPlayer() { return m_player; } /** * returns a human-readable string for the key binded with the given action @@ -61,7 +61,7 @@ public: class GamePadDevice : public InputDevice { - void resetAxisDirection(const int axis, Input::AxisDirection direction, ActivePlayer* player); + void resetAxisDirection(const int axis, Input::AxisDirection direction, StateManager::ActivePlayer* player); bool m_buttonPressed[SEvent::SJoystickEvent::NUMBER_OF_BUTTONS]; public: @@ -85,7 +85,8 @@ public: * the value of the 'type' parameter) * \param[out] action The action associated to this input (only check this value if method returned true) */ - bool hasBinding(Input::InputType type, const int id, const int value, ActivePlayer* player, PlayerAction* action); + bool hasBinding(Input::InputType type, const int id, const int value, + StateManager::ActivePlayer* player, PlayerAction* action); }; diff --git a/src/input/input_manager.cpp b/src/input/input_manager.cpp index 49489d0b0..d67226765 100644 --- a/src/input/input_manager.cpp +++ b/src/input/input_manager.cpp @@ -256,7 +256,7 @@ int InputManager::getPlayerKeyboardID() const if (m_device_manager->getKeyboard(k) != NULL && m_device_manager->getKeyboard(k)->getPlayer() != NULL) { - return m_device_manager->getKeyboard(k)->getPlayer()->m_id; + return m_device_manager->getKeyboard(k)->getPlayer()->getID(); } } @@ -277,7 +277,7 @@ int InputManager::getPlayerKeyboardID() const */ void InputManager::dispatchInput(Input::InputType type, int deviceID, int btnID, int axisDirection, int value) { - ActivePlayer* player = NULL; + StateManager::ActivePlayer* player = NULL; PlayerAction action; bool action_found = m_device_manager->translateInput( type, deviceID, btnID, axisDirection, value, &player, &action); @@ -413,7 +413,7 @@ void InputManager::dispatchInput(Input::InputType type, int deviceID, int btnID, m_timer = 0.25; } - int playerID = (player == NULL ? 0 : player->m_id); + int playerID = (player == NULL ? 0 : player->getID()); // If only the master player can act, and this player is not the master, ignore his input if (m_device_manager->getAssignMode() == ASSIGN && m_master_player_only && playerID != 0) return; diff --git a/src/karts/controller/controller.cpp b/src/karts/controller/controller.cpp index 468b83787..0c248109f 100644 --- a/src/karts/controller/controller.cpp +++ b/src/karts/controller/controller.cpp @@ -26,7 +26,7 @@ /** Constructor, saves the kart pointer and a pointer to the KartControl * of the kart. */ -Controller::Controller(Kart *kart, ActivePlayer *player) +Controller::Controller(Kart *kart, StateManager::ActivePlayer *player) { m_controls = &(kart->getControls()); m_kart = kart; diff --git a/src/karts/controller/controller.hpp b/src/karts/controller/controller.hpp index c92dabf1e..13e94516c 100644 --- a/src/karts/controller/controller.hpp +++ b/src/karts/controller/controller.hpp @@ -22,10 +22,10 @@ using namespace irr; #include "karts/controller/kart_control.hpp" +#include "states_screens/state_manager.hpp" class Kart; class Item; -class ActivePlayer; /** This is the base class for kart controller - that can be a player * or a a robot. @@ -42,13 +42,13 @@ protected: /** If this belongs to a player, it stores the active player data * structure. Otherwise it is 0. */ - ActivePlayer *m_player; + StateManager::ActivePlayer *m_player; public: - Controller (Kart *kart, ActivePlayer *player=NULL); + Controller (Kart *kart, StateManager::ActivePlayer *player=NULL); virtual ~Controller () {}; /** Returns the active player for this controller (NULL * if this controller does not belong to a player. */ - ActivePlayer *getPlayer () {return m_player;} + StateManager::ActivePlayer *getPlayer () {return m_player;} virtual void reset () {}; virtual void update (float dt) {}; virtual void handleZipper () {}; diff --git a/src/karts/controller/end_controller.cpp b/src/karts/controller/end_controller.cpp index 051d3aac5..edf175d45 100644 --- a/src/karts/controller/end_controller.cpp +++ b/src/karts/controller/end_controller.cpp @@ -44,7 +44,7 @@ #include "tracks/track.hpp" #include "utils/constants.hpp" -EndController::EndController(Kart *kart, ActivePlayer *player) +EndController::EndController(Kart *kart, StateManager::ActivePlayer *player) : Controller(kart, player) { m_kart_length = m_kart->getKartProperties()->getKartModel()->getLength(); diff --git a/src/karts/controller/end_controller.hpp b/src/karts/controller/end_controller.hpp index 6713f6537..d2821be54 100644 --- a/src/karts/controller/end_controller.hpp +++ b/src/karts/controller/end_controller.hpp @@ -129,7 +129,7 @@ private: void setSteering(float angle, float dt); void findCurve(); public: - EndController(Kart *kart, ActivePlayer* player); + EndController(Kart *kart, StateManager::ActivePlayer* player); ~EndController(); virtual void update (float delta) ; virtual void reset (); diff --git a/src/karts/controller/player_controller.cpp b/src/karts/controller/player_controller.cpp index cd8ab5bee..27b4d4715 100644 --- a/src/karts/controller/player_controller.cpp +++ b/src/karts/controller/player_controller.cpp @@ -40,7 +40,7 @@ * \param init_pos The start coordinates and heading of the kart. * \param player_index Index of the player kart. */ -PlayerController::PlayerController(Kart *kart, ActivePlayer *player, +PlayerController::PlayerController(Kart *kart, StateManager::ActivePlayer *player, unsigned int player_index) : Controller(kart) { diff --git a/src/karts/controller/player_controller.hpp b/src/karts/controller/player_controller.hpp index c5c9aee70..326f0b026 100644 --- a/src/karts/controller/player_controller.hpp +++ b/src/karts/controller/player_controller.hpp @@ -47,7 +47,7 @@ private: void steer(float, int); public: - PlayerController (Kart *kart, ActivePlayer *_player, + PlayerController (Kart *kart, StateManager::ActivePlayer *_player, unsigned int player_index); ~PlayerController (); void update (float); diff --git a/src/network/connect_message.cpp b/src/network/connect_message.cpp index bcb534bf5..24dae7462 100644 --- a/src/network/connect_message.cpp +++ b/src/network/connect_message.cpp @@ -72,7 +72,7 @@ void ConnectMessage::setId() { char hostname[256]; gethostname(hostname, 255); - const std::string& id = StateManager::get()->getActivePlayer(0)->getProfile()->getName(); + const std::string& id = StateManager::get()->getActivePlayerProfile(0)->getName(); std::ostringstream o; o << id << '@' << hostname; m_id = o.str(); diff --git a/src/race/race_manager.cpp b/src/race/race_manager.cpp index 529391545..6298b4ea8 100644 --- a/src/race/race_manager.cpp +++ b/src/race/race_manager.cpp @@ -91,7 +91,7 @@ void RaceManager::setLocalKartInfo(unsigned int player_id, const std::string& ka assert(0<=player_id && player_id getActivePlayer(player_id)->getProfile()->getName(), + StateManager::get()->getActivePlayerProfile(player_id)->getName(), network_manager->getMyHostId()); } // setLocalKartInfo diff --git a/src/states_screens/kart_selection.cpp b/src/states_screens/kart_selection.cpp index ad08f071a..3ef8be671 100644 --- a/src/states_screens/kart_selection.cpp +++ b/src/states_screens/kart_selection.cpp @@ -182,7 +182,7 @@ FocusDispatcher* g_dispatcher = NULL; float x_speed, y_speed, w_speed, h_speed; /** Object representing this player */ - ActivePlayer* m_associatedPlayer; + StateManager::ActivePlayer* m_associatedPlayer; int m_playerID; /** Internal name of the spinner; useful to interpret spinner events, which contain the name of the activated object */ @@ -201,7 +201,8 @@ FocusDispatcher* g_dispatcher = NULL; std::string deviceName; std::string m_kartInternalName; - PlayerKartWidget(KartSelectionScreen* parent, ActivePlayer* associatedPlayer, Widget* area, const int m_playerID, const int irrlichtWidgetID=-1) : Widget() + PlayerKartWidget(KartSelectionScreen* parent,StateManager:: ActivePlayer* associatedPlayer, + Widget* area, const int m_playerID, const int irrlichtWidgetID=-1) : Widget() { m_associatedPlayer = associatedPlayer; x_speed = 1.0f; @@ -330,9 +331,10 @@ FocusDispatcher* g_dispatcher = NULL; /** Called when players are renumbered (changes the player ID) */ void setPlayerID(const int newPlayerID) { - if (StateManager::get()->getActivePlayers().get(newPlayerID) != m_associatedPlayer) + if (StateManager::get()->getActivePlayer(newPlayerID) != m_associatedPlayer) { - printf("Player: %p\nIndex: %d\nm_associatedPlayer: %p\n", StateManager::get()->getActivePlayers().get(newPlayerID), newPlayerID, m_associatedPlayer); + printf("Player: %p\nIndex: %d\nm_associatedPlayer: %p\n", + StateManager::get()->getActivePlayer(newPlayerID), newPlayerID, m_associatedPlayer); std::cerr << "Internal inconsistency, PlayerKartWidget has IDs and pointers that do not correspond to one player\n"; assert(false); } @@ -388,7 +390,7 @@ FocusDispatcher* g_dispatcher = NULL; } /** Get the associated ActivePlayer object*/ - ActivePlayer* getAssociatedPlayer() + StateManager::ActivePlayer* getAssociatedPlayer() { return m_associatedPlayer; } @@ -763,7 +765,7 @@ bool KartSelectionScreen::playerJoin(InputDevice* device, bool firstPlayer) // ---- Create new active player const int new_player_id = StateManager::get()->createActivePlayer( UserConfigParams::m_all_players.get(0), device ); - ActivePlayer* aplayer = StateManager::get()->getActivePlayer(new_player_id); + StateManager::ActivePlayer* aplayer = StateManager::get()->getActivePlayer(new_player_id); // ---- Create focus dispatcher if (firstPlayer) @@ -812,7 +814,7 @@ PlayerKartWidget* removedWidget = NULL; // ----------------------------------------------------------------------------- // Returns true if event was handled succesfully -bool KartSelectionScreen::playerQuit(ActivePlayer* player) +bool KartSelectionScreen::playerQuit(StateManager::ActivePlayer* player) { int playerID = -1; @@ -1013,13 +1015,14 @@ void KartSelectionScreen::allPlayersDone() DynamicRibbonWidget* w = this->getWidget("karts"); assert( w != NULL ); - ptr_vector< ActivePlayer, HOLD >& players = StateManager::get()->getActivePlayers(); + const ptr_vector< StateManager::ActivePlayer, HOLD >& players = StateManager::get()->getActivePlayers(); // ---- Print selection (for debugging purposes) std::cout << "==========\n" << players.size() << " players :\n"; - for(int n=0; ngetName() << " on " << players[n].getDevice()->m_name << std::endl; + std::cout << " Player " << n << " is " << players[n].getConstProfile()->getName() + << " on " << players[n].getDevice()->m_name << std::endl; } std::cout << "==========\n"; diff --git a/src/states_screens/kart_selection.hpp b/src/states_screens/kart_selection.hpp index a6f4a247f..bcc95163b 100644 --- a/src/states_screens/kart_selection.hpp +++ b/src/states_screens/kart_selection.hpp @@ -19,13 +19,13 @@ #include #include "guiengine/screen.hpp" +#include "states_screens/state_manager.hpp" namespace GUIEngine { class Widget; } class InputDevice; -class ActivePlayer; class PlayerKartWidget; class KartHoverListener; @@ -61,7 +61,7 @@ public: bool playerJoin(InputDevice* device, bool firstPlayer); /** Called when a player hits 'rescue' on his device to leave the game */ - bool playerQuit(ActivePlayer* player); + bool playerQuit(StateManager::ActivePlayer* player); /** Standard 'Screen' callback before screen is entered */ void init(); diff --git a/src/states_screens/state_manager.cpp b/src/states_screens/state_manager.cpp index 692a05002..dce7ef171 100644 --- a/src/states_screens/state_manager.cpp +++ b/src/states_screens/state_manager.cpp @@ -21,6 +21,7 @@ #include "guiengine/engine.hpp" #include "guiengine/modaldialog.hpp" #include "guiengine/screen.hpp" +#include "input/input_device.hpp" #include "input/input_manager.hpp" #include "states_screens/dialogs/race_paused_dialog.hpp" #include "utils/translation.hpp" @@ -35,16 +36,17 @@ StateManager* StateManager::get() return state_manager_singleton; } +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- + #if 0 #pragma mark - #pragma mark Player Management #endif -ptr_vector& StateManager::getActivePlayers() -{ - return m_active_players; -} -ActivePlayer* StateManager::getActivePlayer(const int id) +// ---------------------------------------------------------------------------- + +StateManager::ActivePlayer* StateManager::getActivePlayer(const int id) { ActivePlayer *returnPlayer = NULL; if (id < m_active_players.size() && id >= 0) @@ -54,12 +56,25 @@ ActivePlayer* StateManager::getActivePlayer(const int id) else { fprintf(stderr, "getActivePlayer(): id out of bounds\n"); + return false; } assert( returnPlayer->m_id == id ); return returnPlayer; } + +// ---------------------------------------------------------------------------- + +const PlayerProfile* StateManager::getActivePlayerProfile(const int id) +{ + ActivePlayer* a = getActivePlayer(id); + if (a == NULL) return NULL; + return a->getProfile(); +} + +// ---------------------------------------------------------------------------- + void StateManager::updateActivePlayerIDs() { const int amount = m_active_players.size(); @@ -69,6 +84,8 @@ void StateManager::updateActivePlayerIDs() } } +// ---------------------------------------------------------------------------- + int StateManager::createActivePlayer(PlayerProfile *profile, InputDevice *device) { ActivePlayer *p; @@ -82,16 +99,23 @@ int StateManager::createActivePlayer(PlayerProfile *profile, InputDevice *device return i; } +// ---------------------------------------------------------------------------- + void StateManager::removeActivePlayer(int id) { m_active_players.erase(id); updateActivePlayerIDs(); } + +// ---------------------------------------------------------------------------- + int StateManager::activePlayerCount() { return m_active_players.size(); } +// ---------------------------------------------------------------------------- + void StateManager::resetActivePlayers() { const int amount = m_active_players.size(); @@ -102,6 +126,9 @@ void StateManager::resetActivePlayers() m_active_players.clearAndDeleteAll(); } +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- + #if 0 #pragma mark - #pragma mark misc stuff @@ -112,6 +139,8 @@ bool StateManager::throttleFPS() return m_game_mode != GUIEngine::GAME && GUIEngine::getCurrentScreen()->throttleFPS; } +// ---------------------------------------------------------------------------- + void StateManager::escapePressed() { // in input sensing mode @@ -141,3 +170,41 @@ void StateManager::escapePressed() } +#if 0 +#pragma mark - +#pragma mark ActivePlayer +#endif + +StateManager::ActivePlayer::ActivePlayer(PlayerProfile* player, InputDevice *device) +{ + m_player = player; + m_device = NULL; + m_kart = NULL; + setDevice(device); +} // ActivePlayer + +// ---------------------------------------------------------------------------- +StateManager::ActivePlayer::~ActivePlayer() +{ + setDevice(NULL); +} // ~ActivePlayer + +// ---------------------------------------------------------------------------- +void StateManager::ActivePlayer::setPlayerProfile(PlayerProfile* player) +{ + m_player = player; +} // setPlayerProfile + +// ---------------------------------------------------------------------------- +void StateManager::ActivePlayer::setDevice(InputDevice* device) +{ + // unset player from previous device he was assigned to, if any + if (m_device != NULL) m_device->setPlayer(NULL); + + m_device = device; + + // inform the devce of its new owner + if (device != NULL) device->setPlayer(this); +} // setDevice + + diff --git a/src/states_screens/state_manager.hpp b/src/states_screens/state_manager.hpp index 9f5655995..e2c93a756 100644 --- a/src/states_screens/state_manager.hpp +++ b/src/states_screens/state_manager.hpp @@ -22,11 +22,11 @@ #include #include "guiengine/abstract_state_manager.hpp" #include "utils/ptr_vector.hpp" -#include "input/input_device.hpp" #include "config/player.hpp" struct Input; -class ActivePlayer; +class InputDevice; +class Kart; namespace GUIEngine { @@ -37,18 +37,72 @@ const static int GUI_PLAYER_ID = 0; class StateManager : public GUIEngine::AbstractStateManager { - /** - * A list of all currently playing players. - */ - ptr_vector m_active_players; void updateActivePlayerIDs(); public: - ptr_vector& getActivePlayers(); + + /** + * Represents a player that is currently playing. + * Ties toghether : + * - a player's identity (and thus his/her highscores) + * - which input device is used by which player + * (we're very flexible on this; ActivePlayer #1 + * can choose to e.g. use profile #5 and device #2) + */ + class ActivePlayer + { + friend class StateManager; + + PlayerProfile *m_player; + InputDevice *m_device; + + /** Pointer to the kart of this player, only valid during the game. */ + Kart *m_kart; + + /** ID of this player within the list of active players */ + int m_id; + + ActivePlayer(PlayerProfile* player, InputDevice* device); + + public: + + ~ActivePlayer(); + + /** \return the identity of this active player */ + PlayerProfile* getProfile() { return m_player; } + + /** \return the identity of this active player */ + const PlayerProfile* getConstProfile() const { return m_player; } + + /** Call to change the identity of this player (useful when player is selecting his identity) */ + void setPlayerProfile(PlayerProfile* player); + + /** ID of this player within the list of active players */ + int getID() const { return m_id; } + + /** \return Which input device this player is using, or NULL if none is set yet */ + InputDevice* getDevice() const { return m_device; } + + void setDevice(InputDevice* device); + + /** Sets the kart for this player. */ + void setKart(Kart *kart) { m_kart = kart; } + + /** \return the kart of this player. Only valid while world exists. */ + Kart* getKart() { assert(m_kart != NULL); return m_kart; } + }; + + + const ptr_vector& getActivePlayers() { return m_active_players; } ActivePlayer* getActivePlayer(const int id); + /** \return the PlayerProfile of a given ActivePlayer. + * \param id the ID of the active player for whichyou want the profile + */ + const PlayerProfile* getActivePlayerProfile(const int id); + /** * Adds a new player to the list of active players. StateManager takes ownership of the object * so no need to delete it yourself. @@ -68,6 +122,12 @@ public: // singleton static StateManager* get(); + +private: + /** + * A list of all currently playing players. + */ + ptr_vector m_active_players; }; #endif