package Controller;
import Graphics.RenderMaster;
import States.StateContext;
import net.java.games.input.Event;
public class XboxController implements GameController {
private static final String START_BUTTON = "Unknown";
private static final String RIGHT_THUMB_BUTTON = "Right Thumb";
private static final String B_BUTTON = "B";
private static final String A_BUTTON = "A";
private static final String X_BUTTON = "X";
private static final String JOYSTICK_X_DIR = "x";
private static final String JOYSTICK_Y_DIR = "y";
private static final int MULTIPLIER = 2; // Keyboard has 1 as pressed, 2 as held, this maps it from Xbox
private int id;
private int aButtonValue;
private int bButtonValue;
private int xButtonValue;
private int weaponButtonValue;
private int pauseButtonValue;
private float leftRightValue;
private float upDownValue;
public XboxController(int id) {
aButtonValue = 0;
bButtonValue = 0;
xButtonValue = 0;
weaponButtonValue = 0;
pauseButtonValue = 0;
leftRightValue = 0;
upDownValue = 0;
this.id = id;
}
@Override
public void handleEvent(Event event, StateContext stateContext, RenderMaster renderMaster) {
float eventValue = event.getValue();
//System.out.println("My event is '" + event.getComponent().getName() + "' and value is '" + event.getValue() + "'");
int intEventValue = (int)eventValue;
String eventComponentString = event.getComponent().toString();
if(A_BUTTON.equals(eventComponentString)){
if(intEventValue == 1){
stateContext.useActionButton(stateContext, getId());
}
aButtonValue = intEventValue * MULTIPLIER;
}
else if(B_BUTTON.equals(eventComponentString)){
if(intEventValue == 1){
stateContext.useBackButton(stateContext, getId());
}
bButtonValue = intEventValue * MULTIPLIER;
}
else if(X_BUTTON.equals(eventComponentString)){
xButtonValue = intEventValue;
}
else if(RIGHT_THUMB_BUTTON.equals(eventComponentString)){
if(intEventValue == 1){
stateContext.useWeapon(stateContext, getId());
}
weaponButtonValue = intEventValue * MULTIPLIER;
}
else if(START_BUTTON.equals(eventComponentString)){
if(intEventValue == 1){
stateContext.pause(stateContext, getId());
}
pauseButtonValue = intEventValue * MULTIPLIER;
}
else if(JOYSTICK_X_DIR.equals(eventComponentString)){
if(eventValue < -0.2f){
stateContext.moveLeft(stateContext, getId());
leftRightValue = eventValue;
} else if (eventValue > 0.2f){
stateContext.moveRight(stateContext, getId());
leftRightValue = eventValue;
} else {
leftRightValue = 0f;
}
}
else if(JOYSTICK_Y_DIR.equals(eventComponentString)){
if(eventValue > 0.01f){
stateContext.moveDown(stateContext, getId());
} else if(eventValue < -0.01f){
stateContext.moveUp(stateContext, getId());
}
upDownValue = eventValue * MULTIPLIER;
}
}
@Override
public int getId(){
return id;
}
@Override
public int getActionValue() {
return aButtonValue;
}
@Override
public int getBackValue() {
return bButtonValue;
}
@Override
public int getWeaponValue() {
return weaponButtonValue;
}
@Override
public int getPauseValue() {
return pauseButtonValue;
}
@Override
public float getLeftRightValue(){
return leftRightValue;
}
@Override
public float getUpDownValue() {
return upDownValue;
}
@Override
public float getForwardBackValue() {
if (aButtonValue == bButtonValue) return 0;
return (aButtonValue - bButtonValue);
}
@Override
public float getJumpValue(){
return xButtonValue;
}
@Override
public boolean equals(Object other) {
if (other == null || !(other instanceof XboxController)){
return false;
}
XboxController otherController = (XboxController)other;
return (otherController.getId() == this.getId());
}
}