package controller.action.ui;
import java.util.ArrayList;
import common.Log;
import controller.EventHandler;
import controller.action.ActionType;
import controller.action.GCAction;
import controller.action.ui.penalty.CoachMotion;
import controller.action.ui.penalty.Penalty;
import controller.action.ui.penalty.MotionInSet;
import controller.action.ui.penalty.PickUp;
import controller.action.ui.penalty.PickUpHL;
import controller.action.ui.penalty.ServiceHL;
import controller.action.ui.penalty.Substitute;
import data.AdvancedData;
import data.AdvancedData.PenaltyQueueData;
import data.PlayerInfo;
import data.Rules;
import data.SPL;
/**
* @author Michel Bartsch
*
* This action means that a player has been selected.
*/
public class Robot extends GCAction
{
/** On which side (0:left, 1:right) */
private int side;
/** The players`s number, beginning with 0! */
private int number;
/**
* Creates a new Robot action.
* Look at the ActionBoard before using this.
*
* @param side On which side (0:left, 1:right)
* @param number The players`s number, beginning with 0!
*/
public Robot(int side, int number)
{
super(ActionType.UI);
this.side = side;
this.number = number;
}
/**
* Performs this action to manipulate the data (model).
*
* @param data The current data to work on.
*/
@Override
public void perform(AdvancedData data)
{
PlayerInfo player = data.team[side].player[number];
if (player.penalty == PlayerInfo.PENALTY_SUBSTITUTE && !isCoach(data)) {
ArrayList<PenaltyQueueData> playerInfoList = data.penaltyQueueForSubPlayers.get(side);
if (playerInfoList.isEmpty()) {
player.penalty = Rules.league.substitutePenalty;
data.whenPenalized[side][number] = data.getTime();
} else {
PenaltyQueueData playerInfo = playerInfoList.get(0);
player.penalty = playerInfo.penalty;
data.whenPenalized[side][number] = playerInfo.whenPenalized;
playerInfoList.remove(0);
}
Log.state(data, "Entering Player " + Rules.league.teamColorName[data.team[side].teamColor]
+ " " + (number+1));
}
else if (EventHandler.getInstance().lastUIEvent instanceof MotionInSet && player.penalty == PlayerInfo.PENALTY_NONE
|| (EventHandler.getInstance().lastUIEvent instanceof Penalty
&& !(EventHandler.getInstance().lastUIEvent instanceof MotionInSet))
|| EventHandler.getInstance().lastUIEvent instanceof TeammatePushing) {
EventHandler.getInstance().lastUIEvent.performOn(data, player, side, number);
}
else if (player.penalty != PlayerInfo.PENALTY_NONE) {
player.penalty = PlayerInfo.PENALTY_NONE;
Log.state(data, ("Unpenalised ")+
Rules.league.teamColorName[data.team[side].teamColor]
+ " " + (number+1));
}
}
/**
* 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.ejected[side][number]
&& ((!(EventHandler.getInstance().lastUIEvent instanceof Penalty) || EventHandler.getInstance().lastUIEvent instanceof MotionInSet)
&& data.team[side].player[number].penalty != PlayerInfo.PENALTY_NONE
&& (Rules.league.allowEarlyPenaltyRemoval || data.getRemainingPenaltyTime(side, number) == 0)
&& (data.team[side].player[number].penalty != PlayerInfo.PENALTY_SUBSTITUTE || data.getNumberOfRobotsInPlay(side) < Rules.league.robotsPlaying)
&& !isCoach(data)
|| EventHandler.getInstance().lastUIEvent instanceof PickUpHL
&& data.team[side].player[number].penalty != PlayerInfo.PENALTY_HL_SERVICE
&& data.team[side].player[number].penalty != PlayerInfo.PENALTY_SUBSTITUTE
|| EventHandler.getInstance().lastUIEvent instanceof ServiceHL
&& data.team[side].player[number].penalty != PlayerInfo.PENALTY_HL_SERVICE
&& data.team[side].player[number].penalty != PlayerInfo.PENALTY_SUBSTITUTE
|| (EventHandler.getInstance().lastUIEvent instanceof PickUp && Rules.league instanceof SPL)
&& data.team[side].player[number].penalty != PlayerInfo.PENALTY_SPL_REQUEST_FOR_PICKUP
&& data.team[side].player[number].penalty != PlayerInfo.PENALTY_SUBSTITUTE
|| EventHandler.getInstance().lastUIEvent instanceof Substitute
&& data.team[side].player[number].penalty != PlayerInfo.PENALTY_SUBSTITUTE
&& (!isCoach(data) && (!(Rules.league instanceof SPL) || number != 0))
|| (EventHandler.getInstance().lastUIEvent instanceof CoachMotion)
&& (isCoach(data) && (data.team[side].coach.penalty != PlayerInfo.PENALTY_SPL_COACH_MOTION))
|| data.team[side].player[number].penalty == PlayerInfo.PENALTY_NONE
&& (EventHandler.getInstance().lastUIEvent instanceof Penalty)
&& !(EventHandler.getInstance().lastUIEvent instanceof CoachMotion)
&& !(EventHandler.getInstance().lastUIEvent instanceof Substitute)
&& (!isCoach(data))
|| (data.team[side].player[number].penalty == PlayerInfo.PENALTY_NONE)
&& (EventHandler.getInstance().lastUIEvent instanceof TeammatePushing))
|| data.testmode;
}
public boolean isCoach(AdvancedData data)
{
return Rules.league.isCoachAvailable && number == Rules.league.teamSize;
}
}