Player::Player(float x, float y, float speedX, float speedY, unsigned int number, std::string sprite, PlayerModel* model, 
	unsigned int lives )
	: DynamicEntity( x, y, speedX, speedY ), _playerNumber( number ), _lives( lives ), _score( 0 ) ,_model( model ),
	_spriteResourceKey( sprite ), _weapon( new Weapon("Standard laser", "sprites/shot", GameManager::getInstance()->getPlayerOptions()->shotDelay ) ),
	_controller( GamepadController::getNewGamepad( 0 ) ), _invincible( false ), _invincibilityTimerBase(1500),
	_invincibilityTimer( 0 ), _alphaFlash( 0.5f )
{
	setCurrentWeapon( _weapon );
	_weapon->setShotSpeed( GameManager::getInstance()->getPlayerOptions()->shotSpeedX,
		GameManager::getInstance()->getPlayerOptions()->shotSpeedY );

	if (_controller == NULL)
	{
		_controller = new KeyboardController();
	}

	GameManager* manager = GameManager::getInstance();
	clan::Canvas& gc = manager->getCanvas();
	_currentSprite = clan::Sprite::resource( gc, sprite, manager->getResourceManager() );

	std::string descriptor = sprite.substr( sprite.find_last_of( "/" ) + 1 );

	for (int i = 0; i < _currentSprite.get_frame_count(); i++)
	{
		std::string collisionResource = clan::string_format( "outlines/player/%1_00%2", descriptor, i );
		_currentOutlines.push_back( clan::CollisionOutline::load( collisionResource.c_str(), manager->getResourceDocument() ) );
	}

}
void inputHandler() {
    while (isRunning()) {
        try {
            if(SDL_PollEvent(&event)) {
                switch (event.type) {
                case SDL_QUIT:
                    setRunning(false);
                    break;
                case SDL_MOUSEBUTTONDOWN:
                    println("Mouse button pressed");
                    switch (event.button.button) {
                        case SDL_BUTTON_WHEELDOWN:
                            setCurrentWeapon(((((getCurrentWeapon() - 1) > 9001) && ((getCurrentWeapon() - 1) < 9007)) ? (getCurrentWeapon() - 1) :
                                #if mouseWheelWeaponChangeScrollLoop
                                    9006
                                #else
                                    getCurrentWeapon()
                                #endif
                            ));
                            break;
                        case SDL_BUTTON_WHEELUP:
                            setCurrentWeapon(((((getCurrentWeapon() + 1) > 9001) && ((getCurrentWeapon() + 1) < 9007)) ? (getCurrentWeapon() + 1) :
                                #if mouseWheelWeaponChangeScrollLoop
                                    9006
                                #else
                                    getCurrentWeapon()
                                #endif
                            ));
                            break;
                        case SDL_BUTTON_LEFT:
                        case SDL_BUTTON_RIGHT:
                            fireWeapon();
                    }
                    break;
                case SDL_MOUSEBUTTONUP:
                    println("Mouse button released");
                    setFiring(false);
                    break;
                case SDL_MOUSEMOTION:
                    SDL_GetMouseState(&mouse_x,&mouse_y);
                    #if debugMouseMovement
                        printf("Mouse movement detected. X: %d Y: %d\n",mouse_x,mouse_y);
                    #endif
                    break;
                case SDL_KEYDOWN:
                    SDLKey keyPressed = event.key.keysym.sym;
                    switch (keyPressed) {
                        case SDLK_ESCAPE:
                            println("Escape key pressed.");
                        case SDLK_F12: //in case escape doesn't get detected, we can also use F12.
                            setRunning(false);
                            break;
                        case SDLK_F1:
                            setCurrentWeapon(RIFLE);
                            break;
                        case SDLK_F2:
                            setCurrentWeapon(MACHINE_GUN);
                            break;
                        case SDLK_F3:
                            setCurrentWeapon(SHOTGUN);
                            break;
                        case SDLK_F4:
                            setCurrentWeapon(MACHINE_SHOTGUN);
                            break;
                        case SDLK_F5:
                            setCurrentWeapon(FLAMETHROWER);
                            break;
                        case SDLK_HOME:
                            toggleAlphaVisible();
                            println("Home key pressed. Toggling alpha test visibility.");
                            break;
                        case SDLK_DELETE:
                            println("Delete key pressed. Removing all damage, and resetting the game");
                            resetGame();
                            break;
                        case SDLK_F11:
                            println("F11 pressed. Toggling fullscreen...");
                            toggleFullscreen();
                            break;
                        default:
                            printf("An unhandled key was pressed: ");
                            displayKey(&event.key);
                        }
                    break;
                }
            }
        } catch(...) {
            println("Exception occurred handling input...");
        }
    }
}