/******************************************************************************* * Copyright (c) 2001, 2010 Mathew A. Nelson and Robocode contributors * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://robocode.sourceforge.net/license/epl-v10.html * * Contributors: * Pavel Savara * - Initial implementation *******************************************************************************/ package net.sf.robocode.host; import net.sf.robocode.peer.IRobotStatics; import net.sf.robocode.repository.IRobotRepositoryItem; import net.sf.robocode.security.HiddenAccess; import net.sf.robocode.serialization.ISerializableHelper; import net.sf.robocode.serialization.RbSerializer; import robocode.BattleRules; import robocode.control.RobotSpecification; import java.io.Serializable; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; /** * @author Pavel Savara (original) */ public final class RobotStatics implements IRobotStatics, Serializable { private static final long serialVersionUID = 1L; private final boolean isJuniorRobot; private final boolean isInteractiveRobot; private final boolean isPaintRobot; private final boolean isAdvancedRobot; private final boolean isTeamRobot; private final boolean isTeamLeader; private final boolean isDroid; private final String name; private final String shortName; private final String veryShortName; private final String fullClassName; private final String shortClassName; private final BattleRules battleRules; private final String[] teammates; private final String teamName; private final int index; private final int contestantIndex; public RobotStatics(RobotSpecification robotSpecification, int duplicate, boolean isLeader, BattleRules rules, String teamName, List<String> teamMembers, int index, int contestantIndex) { IRobotRepositoryItem specification = ((IRobotRepositoryItem) HiddenAccess.getFileSpecification( robotSpecification)); shortClassName = specification.getShortClassName(); fullClassName = specification.getFullClassName(); if (duplicate >= 0) { String countString = " (" + (duplicate + 1) + ')'; name = specification.getUniqueFullClassNameWithVersion() + countString; shortName = specification.getUniqueShortClassNameWithVersion() + countString; veryShortName = specification.getUniqueVeryShortClassNameWithVersion() + countString; } else { name = specification.getUniqueFullClassNameWithVersion(); shortName = specification.getUniqueShortClassNameWithVersion(); veryShortName = specification.getUniqueVeryShortClassNameWithVersion(); } isJuniorRobot = specification.isJuniorRobot(); isInteractiveRobot = specification.isInteractiveRobot(); isPaintRobot = specification.isPaintRobot(); isAdvancedRobot = specification.isAdvancedRobot(); isTeamRobot = specification.isTeamRobot(); isDroid = specification.isDroid(); isTeamLeader = isLeader; battleRules = rules; this.index = index; this.contestantIndex = contestantIndex; if (teamMembers != null) { List<String> list = new ArrayList<String>(); for (String mate : teamMembers) { if (!name.equals(mate)) { list.add(mate); } } teammates = list.toArray(new String[] {}); this.teamName = teamName; } else { teammates = null; this.teamName = name; } } RobotStatics(boolean isJuniorRobot, boolean isInteractiveRobot, boolean isPaintRobot, boolean isAdvancedRobot, boolean isTeamRobot, boolean isTeamLeader, boolean isDroid, String name, String shortName, String veryShortName, String fullClassName, String shortClassName, BattleRules battleRules, String[] teammates, String teamName, int index, int contestantIndex) { this.isJuniorRobot = isJuniorRobot; this.isInteractiveRobot = isInteractiveRobot; this.isPaintRobot = isPaintRobot; this.isAdvancedRobot = isAdvancedRobot; this.isTeamRobot = isTeamRobot; this.isTeamLeader = isTeamLeader; this.isDroid = isDroid; this.name = name; this.shortName = shortName; this.veryShortName = veryShortName; this.fullClassName = fullClassName; this.shortClassName = shortClassName; this.battleRules = battleRules; this.teammates = teammates; this.teamName = teamName; this.index = index; this.contestantIndex = contestantIndex; } public String getAnonymousName() { return "#" + index; } public boolean isJuniorRobot() { return isJuniorRobot; } public boolean isInteractiveRobot() { return isInteractiveRobot; } public boolean isPaintRobot() { return isPaintRobot; } public boolean isAdvancedRobot() { return isAdvancedRobot; } public boolean isTeamRobot() { return isTeamRobot; } public boolean isTeamLeader() { return isTeamLeader; } public boolean isDroid() { return isDroid; } public String getName() { return name; } public String getShortName() { return shortName; } public String getVeryShortName() { return veryShortName; } public String getFullClassName() { return fullClassName; } public String getShortClassName() { return shortClassName; } public BattleRules getBattleRules() { return battleRules; } public String[] getTeammates() { return teammates == null ? null : teammates.clone(); } public String getTeamName() { return teamName; } public int getIndex() { return index; } public int getContestIndex() { return contestantIndex; } static ISerializableHelper createHiddenSerializer() { return new SerializableHelper(); } private static class SerializableHelper implements ISerializableHelper { public int sizeOf(RbSerializer serializer, Object object) { RobotStatics obj = (RobotStatics) object; int size = RbSerializer.SIZEOF_TYPEINFO + RbSerializer.SIZEOF_BOOL * 7 + serializer.sizeOf(obj.name) + serializer.sizeOf(obj.shortName) + serializer.sizeOf(obj.veryShortName) + serializer.sizeOf(obj.fullClassName) + serializer.sizeOf(obj.shortClassName) + RbSerializer.SIZEOF_INT * 5 + RbSerializer.SIZEOF_DOUBLE + RbSerializer.SIZEOF_LONG; if (obj.teammates != null) { for (String mate : obj.teammates) { size += serializer.sizeOf(mate); } } size += RbSerializer.SIZEOF_INT; size += serializer.sizeOf(obj.teamName); return size; } public void serialize(RbSerializer serializer, ByteBuffer buffer, Object object) { RobotStatics obj = (RobotStatics) object; serializer.serialize(buffer, obj.isJuniorRobot); serializer.serialize(buffer, obj.isInteractiveRobot); serializer.serialize(buffer, obj.isPaintRobot); serializer.serialize(buffer, obj.isAdvancedRobot); serializer.serialize(buffer, obj.isTeamRobot); serializer.serialize(buffer, obj.isTeamLeader); serializer.serialize(buffer, obj.isDroid); serializer.serialize(buffer, obj.name); serializer.serialize(buffer, obj.shortName); serializer.serialize(buffer, obj.veryShortName); serializer.serialize(buffer, obj.fullClassName); serializer.serialize(buffer, obj.shortClassName); serializer.serialize(buffer, obj.battleRules.getBattlefieldWidth()); serializer.serialize(buffer, obj.battleRules.getBattlefieldHeight()); serializer.serialize(buffer, obj.battleRules.getNumRounds()); serializer.serialize(buffer, obj.battleRules.getGunCoolingRate()); serializer.serialize(buffer, obj.battleRules.getInactivityTime()); if (obj.teammates != null) { for (String mate : obj.teammates) { serializer.serialize(buffer, mate); } } buffer.putInt(-1); serializer.serialize(buffer, obj.teamName); serializer.serialize(buffer, obj.index); serializer.serialize(buffer, obj.contestantIndex); } public Object deserialize(RbSerializer serializer, ByteBuffer buffer) { boolean isJuniorRobot = serializer.deserializeBoolean(buffer); boolean isInteractiveRobot = serializer.deserializeBoolean(buffer); boolean isPaintRobot = serializer.deserializeBoolean(buffer); boolean isAdvancedRobot = serializer.deserializeBoolean(buffer); boolean isTeamRobot = serializer.deserializeBoolean(buffer); boolean isTeamLeader = serializer.deserializeBoolean(buffer); boolean isDroid = serializer.deserializeBoolean(buffer); String name = serializer.deserializeString(buffer); String shortName = serializer.deserializeString(buffer); String veryShortName = serializer.deserializeString(buffer); String fullClassName = serializer.deserializeString(buffer); String shortClassName = serializer.deserializeString(buffer); BattleRules battleRules = HiddenAccess.createRules(serializer.deserializeInt(buffer), serializer.deserializeInt(buffer), serializer.deserializeInt(buffer), serializer.deserializeDouble(buffer), serializer.deserializeLong(buffer), serializer.deserializeBoolean(buffer)); List<String> teammates = new ArrayList<String>(); Object item = serializer.deserializeString(buffer); if (item == null) { teammates = null; } while (item != null) { if (item instanceof String) { teammates.add((String) item); } item = serializer.deserializeString(buffer); } String teamName = serializer.deserializeString(buffer); int index = serializer.deserializeInt(buffer); int contestantIndex = serializer.deserializeInt(buffer); return new RobotStatics(isJuniorRobot, isInteractiveRobot, isPaintRobot, isAdvancedRobot, isTeamRobot, isTeamLeader, isDroid, name, shortName, veryShortName, fullClassName, shortClassName, battleRules, teammates.toArray(new String[teammates.size()]), teamName, index, contestantIndex); } } }