package controller.action.ui;
import common.Log;
import controller.action.ActionBoard;
import controller.action.ActionType;
import controller.action.GCAction;
import data.AdvancedData;
import data.GameControlData;
import data.Rules;
/**
* @author Michel Bartsch
*
* This action means that a timeOut is to be taken or ending.
*/
public class TimeOut extends GCAction
{
/** On which side (0:left, 1:right) */
private int side;
/**
* Creates a new TimeOut action.
* Look at the ActionBoard before using this.
*
* @param side On which side (0:left, 1:right)
*/
public TimeOut(int side)
{
super(ActionType.UI);
this.side = side;
}
/**
* Performs this action to manipulate the data (model).
*
* @param data The current data to work on.
*/
@Override
public void perform(AdvancedData data)
{
if (!data.timeOutActive[side]) {
data.previousSecGameState = data.secGameState;
data.secGameState = GameControlData.STATE2_TIMEOUT;
data.timeOutActive[side] = true;
data.timeOutTaken[side] = true;
if (data.previousSecGameState != GameControlData.STATE2_PENALTYSHOOT) {
data.kickOffTeam = data.team[1 - side].teamNumber;
} else if (data.gameState == GameControlData.STATE_SET) {
data.team[data.kickOffTeam == data.team[0].teamNumber ? 0 : 1].penaltyShot--;
}
Log.setNextMessage("Timeout "+Rules.league.teamColorName[data.team[side].teamColor]);
data.gameState = -1; // something impossible to force execution of next call
ActionBoard.initial.perform(data);
} else {
data.secGameState = data.previousSecGameState;
data.previousSecGameState = GameControlData.STATE2_TIMEOUT;
data.timeOutActive[side] = false;
Log.setNextMessage("End of Timeout "+Rules.league.teamColorName[data.team[side].teamColor]);
if (data.secGameState != GameControlData.STATE2_PENALTYSHOOT) {
ActionBoard.ready.perform(data);
}
}
}
/**
* Checks if this action is legal with the given data (model).
* Illegal actions are not performed by the EventHandler.
*
* @param data The current data to check with.
*/
@Override
public boolean isLegal(AdvancedData data)
{
return data.timeOutActive[side]
|| ((data.gameState == GameControlData.STATE_INITIAL ||
data.gameState == GameControlData.STATE_READY ||
data.gameState == GameControlData.STATE_SET)
&& !data.timeOutTaken[side]
&& !data.timeOutActive[side == 0 ? 1 : 0]
&& !(data.secGameState == GameControlData.STATE2_TIMEOUT))
|| data.testmode;
}
}