/* ************************************************************************* *
SDL-Ball - DX-Ball/Breakout remake with openGL and SDL for Linux
Copyright (C) 2008 Jimmy Christensen ( dusted at dusted dot dk )
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
* ************************************************************************* */
class controllerClass {
private:
paddle_class *paddle;
bulletsClass *bullet;
ballManager *bMan;
#define ITEMSELECTTIME 300 /* Milliseconds before changing item */
int shotTime, itemSelectTime;
float accel;
SDL_Joystick *joystick;
Sint16 joystickx;
Sint16 joysticky;
Uint8 joystickbtnA, joystickbtnB;
bool joyBtnALock; //TODO: implement this in the rest of the joystick functions (current only using it in cal)
GLfloat joystickLeftX; //There are two because the calibrated values differ
GLfloat joystickRightX;
int calMin, calMax, calLowJitter, calHighJitter;
#ifdef WITH_WIIUSE
wiimote** wiimotes;
float motePitch;
GLfloat moteAccel;
#endif
public:
controllerClass(paddle_class *pc, bulletsClass *bu, ballManager *bm);
~controllerClass();
void movePaddle(GLfloat px);
void btnPress();
bool get();
void calibrate();
#ifdef WITH_WIIUSE
bool connectMote();
#endif
};
controllerClass::controllerClass(paddle_class *pc, bulletsClass *bu, ballManager *bm)
{
paddle = pc;
bullet = bu;
bMan = bm;
shotTime=200;
itemSelectTime=0;
//Try to open a joystick.
if(setting.joyEnabled && SDL_NumJoysticks() > 0)
{
joystickLeftX = setting.controlMaxSpeed / setting.JoyCalMin;
joystickRightX = setting.controlMaxSpeed / setting.JoyCalMax;
joystick = NULL;
joystick = SDL_JoystickOpen(0);
if(SDL_JoystickOpened(0))
{
cout << "Using joystick: '"<posx = px;
if(paddle->posx > 1.66-paddle->width-0.06)
{
paddle->posx=1.66-paddle->width-0.06;
}
else if(paddle->posx < -1.66+paddle->width+0.06)
{
paddle->posx=-1.66+paddle->width+0.06;
}
}
}
void controllerClass::btnPress()
{
if(var.titleScreenShow)
{
var.titleScreenShow=0;
SDL_WarpMouse(var.halfresx,0);
return;
}
struct pos p;
if(shotTime > 150)
{
shotTime=0;
if(!var.menu && !var.paused)
{
bMan->unglue();
var.startedPlaying=1;
if(player.powerup[PO_GUN])
{
p.x = paddle->posx-paddle->width/1.5;
p.y = paddle->posy;
bullet->shoot(p);
p.x = paddle->posx+paddle->width/1.5;
bullet->shoot(p);
}
}
}
}
bool controllerClass::get()
{
Uint8 *keyStates;
Uint8 keyDown[3]; //Need this since its not a good idea to write to keyStates for some reason
shotTime += globalTicks;
SDL_PumpEvents();
keyStates = SDL_GetKeyState( NULL );
keyDown[0] = keyStates[setting.keyLeft];
keyDown[1] = keyStates[setting.keyRight];
keyDown[2] = keyStates[setting.keyShoot];
itemSelectTime += globalTicks;
//Read joystick here so we can override keypresses if the joystick is digital
//We shouldn't need to check if the joystick is enabled, since it won't be opened if its not enabled anyway.
if(setting.joyEnabled && SDL_JoystickOpened(0))
{
joystickx = SDL_JoystickGetAxis(joystick, 0);
joysticky = SDL_JoystickGetAxis(joystick, 1);
joystickbtnA = SDL_JoystickGetButton(joystick, 0);
joystickbtnB = SDL_JoystickGetButton(joystick, 1);
if(joystickbtnA)
{
keyDown[2] = 1;
}
if(joystickbtnB && itemSelectTime > ITEMSELECTTIME)
{
itemSelectTime=0;
gVar.shopBuyItem=1;
}
if(setting.joyIsDigital)
{
if(joystickx < -200)
{
keyDown[0]=1;
} else if(joystickx > 200)
{
keyDown[1]=1;
}
if(joysticky < -200 && itemSelectTime > ITEMSELECTTIME)
{
itemSelectTime=0;
gVar.shopNextItem = 1;
} else if(joysticky > 200 && itemSelectTime > ITEMSELECTTIME)
{
itemSelectTime=0;
gVar.shopPrevItem = 1;
}
} else {
GLfloat x; //This is the actual traveling speed of the paddle
if(joystickx > setting.JoyCalHighJitter)
{
x = joystickRightX * joystickx;
} else if(joystickx < setting.JoyCalLowJitter)
{
x = -(joystickLeftX * joystickx);
}
if(joysticky < setting.JoyCalLowJitter && itemSelectTime > ITEMSELECTTIME)
{
itemSelectTime=0;
gVar.shopNextItem = 1;
} else if(joysticky > setting.JoyCalHighJitter && itemSelectTime > ITEMSELECTTIME)
{
itemSelectTime=0;
gVar.shopPrevItem = 1;
}
//Move the paddle:
movePaddle( paddle->posx += (x*globalMilliTicks) );
}
}
#ifdef WITH_WIIUSE
if(var.wiiConnect)
{
if (wiiuse_poll(wiimotes, MAX_WIIMOTES)) {
switch(wiimotes[0]->event)
{
case WIIUSE_EVENT:
if(IS_PRESSED(wiimotes[0], WIIMOTE_BUTTON_TWO))
{
keyDown[2]=1;
} else if(IS_PRESSED(wiimotes[0], WIIMOTE_BUTTON_ONE) && itemSelectTime > ITEMSELECTTIME)
{
gVar.shopBuyItem = 1;
itemSelectTime=0;
}else if(IS_PRESSED(wiimotes[0], WIIMOTE_BUTTON_UP) && itemSelectTime > ITEMSELECTTIME)
{
itemSelectTime=0;
gVar.shopPrevItem = 1;
}else if(IS_PRESSED(wiimotes[0], WIIMOTE_BUTTON_DOWN) && itemSelectTime > ITEMSELECTTIME)
{
itemSelectTime=0;
gVar.shopNextItem = 1;
} else if(WIIUSE_USING_ACC(wiimotes[0]))
{
motePitch = wiimotes[0]->orient.pitch;
motePitch *=-1;
}
break;
case WIIUSE_DISCONNECT:
case WIIUSE_UNEXPECTED_DISCONNECT:
var.wiiConnect=0;
cout << "WiiMote disconnected." << endl;
wiiuse_cleanup(wiimotes, MAX_WIIMOTES);
break;
}
}
if(motePitch < -0.2 || motePitch > 0.2)
{
movePaddle( paddle->posx += ( moteAccel*motePitch)*globalMilliTicks );
}
}
#endif
//React to keystates here, this way, if joyisdig it will press keys
if(keyDown[0])
{
accel+=globalMilliTicks*setting.controlAccel;
if(accel > setting.controlMaxSpeed)
accel=setting.controlMaxSpeed;
movePaddle( paddle->posx - ( accel*globalMilliTicks) );
} else if(keyDown[1])
{
accel+=globalMilliTicks*setting.controlAccel;
if(accel > setting.controlMaxSpeed)
accel=setting.controlMaxSpeed;
movePaddle( paddle->posx + ( accel*globalMilliTicks) );
} else {
accel = setting.controlStartSpeed;
}
if(keyDown[2])
{
btnPress();
return(1);
} else {
return(0);
}
}
void controllerClass::calibrate()
{
Sint16 x=0;
if(SDL_JoystickOpened(0))
{
x = SDL_JoystickGetAxis(joystick, 0);
if(SDL_JoystickGetButton(joystick, 0))
{
if(!joyBtnALock && var.menuJoyCalStage != 5)
{
var.menuJoyCalStage++;
joyBtnALock=1;
}
} else {
joyBtnALock=0;
}
}
switch(var.menuJoyCalStage)
{
case 0:
calMin=0;
calMax=0;
calLowJitter=0;
calHighJitter=0;
break;
case 1:
if(x < calLowJitter)
calLowJitter=x;
else if(x > calHighJitter)
calHighJitter=x;
break;
case 2:
if(x < calMin)
calMin=x;
break;
case 3:
if(x > calMax)
calMax=x;
break;
case 4:
setting.JoyCalMin=calMin;
setting.JoyCalMax=calMax;
setting.JoyCalLowJitter=calLowJitter;
setting.JoyCalHighJitter=calHighJitter;
cout << "Joystick calibration report:" << endl;
cout << "calMin: " << calMin << endl << "calMax: " << calMax << endl;
cout << "lowJit: " << calLowJitter << endl << "higJit: " << calHighJitter << endl;
var.menuJoyCalStage++;
writeSettings();
break;
#ifdef WITH_WIIUSE
case -1: //We do this to make it draw a frame before freezing (searching)
var.menuJoyCalStage--;
break;
case -2:
wiimotes = wiiuse_init(MAX_WIIMOTES);
if(wiiuse_find(wiimotes, MAX_WIIMOTES, 4))
{
var.wiiConnect=1;
} else {
var.wiiConnect=0;
}
if(var.wiiConnect)
{
var.wiiConnect=0;
if(wiiuse_connect(wiimotes, MAX_WIIMOTES))
{
var.wiiConnect=1;
wiiuse_set_leds(wiimotes[0], WIIMOTE_LED_1);
wiiuse_rumble(wiimotes[0], 1);
usleep(500000);
wiiuse_rumble(wiimotes[0], 0);
wiiuse_motion_sensing(wiimotes[0], 1);
}
var.menuJoyCalStage=-3;
} else {
var.menuJoyCalStage=-4;
}
break;
#endif
}
}