package data; import java.io.Serializable; import java.nio.ByteBuffer; import java.nio.ByteOrder; /** * @author Michel Bartsch * * This class is part of the data wich are send to the robots. * It just represents this data, reads and writes between C-structure and * Java, nothing more. */ public class PlayerInfo implements Serializable { private static final long serialVersionUID = -8480462279073509072L; /** What type of penalty a player may have. */ public static final byte PENALTY_NONE = 0; public static final byte PENALTY_SPL_ILLEGAL_BALL_CONTACT = 1; public static final byte PENALTY_SPL_PLAYER_PUSHING = 2; public static final byte PENALTY_SPL_ILLEGAL_MOTION_IN_SET = 3; public static final byte PENALTY_SPL_INACTIVE_PLAYER = 4; public static final byte PENALTY_SPL_ILLEGAL_DEFENDER = 5; public static final byte PENALTY_SPL_LEAVING_THE_FIELD = 6; public static final byte PENALTY_SPL_KICK_OFF_GOAL = 7; public static final byte PENALTY_SPL_REQUEST_FOR_PICKUP = 8; public static final byte PENALTY_SPL_COACH_MOTION = 9; public static final byte PENALTY_HL_BALL_MANIPULATION = 1; public static final byte PENALTY_HL_PHYSICAL_CONTACT = 2; public static final byte PENALTY_HL_ILLEGAL_ATTACK = 3; public static final byte PENALTY_HL_ILLEGAL_DEFENSE = 4; public static final byte PENALTY_HL_PICKUP_OR_INCAPABLE = 5; public static final byte PENALTY_HL_SERVICE = 6; public static final byte PENALTY_SUBSTITUTE = 14; public static final byte PENALTY_MANUAL = 15; /** The size in bytes this class has packed. */ public static final int SIZE = 1 + // penalty 1; // secsToUnpen /** The size in bytes this class has packed in version 7. */ public static final int SIZE7 = 2 + // penalty 2; // secsToUnpen //this is streamed public byte penalty = PENALTY_NONE; // penalty state of the player public byte secsTillUnpenalised; // estimate of time till unpenalised /** * Packing this Java class to the C-structure to be send. * @return Byte array representing the C-structure. */ public byte[] toByteArray() { ByteBuffer buffer = ByteBuffer.allocate(SIZE); buffer.order(ByteOrder.LITTLE_ENDIAN); buffer.put(penalty); buffer.put(secsTillUnpenalised); return buffer.array(); } /** * Packing this Java class to the C-structure to be send, using version 7 * of the protocol. * @return Byte array representing the C-structure. */ public byte[] toByteArray7() { ByteBuffer buffer = ByteBuffer.allocate(SIZE7); buffer.order(ByteOrder.LITTLE_ENDIAN); buffer.putShort(penalty); buffer.putShort(secsTillUnpenalised); return buffer.array(); } /** * Unpacking the C-structure to the Java class. * * @param buffer The buffered C-structure. */ public void fromByteArray(ByteBuffer buffer) { buffer.order(ByteOrder.LITTLE_ENDIAN); penalty = buffer.get(); secsTillUnpenalised = buffer.get(); } @Override public String toString() { String out = "----------------------------------------\n"; String temp; if (Rules.league instanceof SPL) { switch (penalty) { case PENALTY_NONE: temp = "none"; break; case PENALTY_SPL_ILLEGAL_BALL_CONTACT: temp = "illegal ball contact"; break; case PENALTY_SPL_PLAYER_PUSHING: temp = "pushing"; break; case PENALTY_SPL_ILLEGAL_MOTION_IN_SET: temp = "illegal motion in set"; break; case PENALTY_SPL_INACTIVE_PLAYER: temp = "inactive"; break; case PENALTY_SPL_ILLEGAL_DEFENDER: temp = "illegal defender"; break; case PENALTY_SPL_LEAVING_THE_FIELD: temp = "leaving the field"; break; case PENALTY_SPL_KICK_OFF_GOAL: temp = "kickoff goal"; break; case PENALTY_SPL_REQUEST_FOR_PICKUP: temp = "request for pickup"; break; case PENALTY_SPL_COACH_MOTION: temp = "coach motion"; break; case PENALTY_SUBSTITUTE: temp = "substitute"; break; case PENALTY_MANUAL: temp = "manual"; break; default: temp = "undefined("+penalty+")"; } } else { switch (penalty) { case PENALTY_NONE: case PENALTY_HL_BALL_MANIPULATION: temp = "none"; break; case PENALTY_HL_PHYSICAL_CONTACT: temp = "pushing"; break; case PENALTY_HL_ILLEGAL_ATTACK: temp = "illegal attack"; break; case PENALTY_HL_ILLEGAL_DEFENSE: temp = "illegal defender"; break; case PENALTY_HL_PICKUP_OR_INCAPABLE: temp = "pickup/incapable"; break; case PENALTY_HL_SERVICE: temp = "service"; break; case PENALTY_MANUAL: temp = "manual"; break; case PENALTY_SUBSTITUTE: temp = "substitute"; break; default: temp = "undefined("+penalty+")"; } } out += " penalty: "+temp+"\n"; out += "secsTillUnpenalised: "+secsTillUnpenalised+"\n"; return out; } }