00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "PlayerController.h"
00015
00016 #include "../Util/GeneralException.h"
00017 #include "../Util/StringUtil.h"
00018 #include "../Menu/MenuManager.h"
00019
00020 using namespace Game;
00021
00022 ReadKey::ReadKey(SDLKey& key_) :
00023 key(key_)
00024 { }
00025
00026 void ReadKey::getValue(std::istream& in) {
00027 std::string keyString;
00028 in >> keyString;
00029 Util::makeLowercase(keyString);
00030 const Menu::StringToKeyMap_t::const_iterator i = Menu::KeyMapContainer::getStringToKeyMap().find(keyString);
00031 if (i != Menu::KeyMapContainer::getStringToKeyMap().end()) {
00032 key = i->second;
00033 }
00034 }
00035
00036 Parse::Parser* KeyboardController::makeParserToParseMe(std::istream& in) {
00037 Parse::Parser* parser = new Parse::SimpleParser(in);
00038
00039 parser->addAction("rightkey", new ReadKey(right));
00040 parser->addAction("leftkey", new ReadKey(left));
00041 parser->addAction("downkey", new ReadKey(down));
00042 parser->addAction("upkey", new ReadKey(up));
00043 parser->addAction("bombkey", new ReadKey(bomb));
00044
00045 return parser;
00046 }
00047
00048 bool KeyboardController::actionIsEnabled(PlayerAction p) {
00049 Uint8* keys = SDL_GetKeyState(NULL);
00050 switch (p) {
00051 case Constants::MOVE_RIGHT: return keys[right] != 0;
00052 case Constants::MOVE_LEFT: return keys[left] != 0;
00053 case Constants::MOVE_UP: return keys[up] != 0;
00054 case Constants::MOVE_DOWN: return keys[down] != 0;
00055 case Constants::DROP_BOMB: return keys[bomb] != 0;
00056 }
00057 return false;
00058 }
00059
00060 JoyPortOpener::JoyPortOpener(JoystickController* jc) :
00061 joyController(jc),
00062 index(0)
00063 { }
00064
00065 void JoyPortOpener::finishingAction() {
00066 if (index < SDL_NumJoysticks()) {
00067 joyController->setJoystick(SDL_JoystickOpen(index));
00068 } else {
00069 throw Util::GeneralException("Could not open joystick " + Util::toString(index) + " only " +
00070 Util::toString(SDL_NumJoysticks()) + " joysticks in the system", __FILE__, __LINE__);
00071 }
00072 }
00073
00074 void JoyPortOpener::getValue(std::istream& in) {
00075 in >> index;
00076 }
00077
00078 bool JoystickController::actionIsEnabled(PlayerAction p) {
00079 switch(p) {
00080 case Constants::MOVE_RIGHT: return SDL_JoystickGetAxis(joy, 0) > Constants::MIN_JOY_AXIS_VALUE;
00081 case Constants::MOVE_LEFT: return SDL_JoystickGetAxis(joy, 0) < -Constants::MIN_JOY_AXIS_VALUE;
00082 case Constants::MOVE_UP: return SDL_JoystickGetAxis(joy, 1) < -Constants::MIN_JOY_AXIS_VALUE;
00083 case Constants::MOVE_DOWN: return SDL_JoystickGetAxis(joy, 1) > Constants::MIN_JOY_AXIS_VALUE;
00084 case Constants::DROP_BOMB: return SDL_JoystickGetButton(joy, bombButton) != 0;
00085 }
00086 return false;
00087 }
00088
00089 void JoystickController::setJoystick(SDL_Joystick* j) {
00090 joy = j;
00091 }
00092
00093 Parse::Parser* JoystickController::makeParserToParseMe(std::istream& in) {
00094 Parse::Parser* parser = new Parse::SimpleParser(in);
00095 parser->addAction("BombButton", new Parse::StdRead<int>(bombButton));
00096 parser->addAction("JoyPort", new JoyPortOpener(this));
00097 return parser;
00098 }