*/
}
public Entity getEntity() throws EntityLoadingException {
try {
Mech mech;
int iGyroType = Mech.GYRO_STANDARD;
try {
iGyroType = Mech.getGyroTypeForString(gyroType.substring(5));
if (iGyroType == Mech.GYRO_UNKNOWN) {
iGyroType = Mech.GYRO_STANDARD;
}
} catch (Exception e) {
iGyroType = Mech.GYRO_STANDARD;
}
int iCockpitType = Mech.COCKPIT_STANDARD;
try {
iCockpitType = Mech.getCockpitTypeForString(cockpitType
.substring(8));
if (iCockpitType == Mech.COCKPIT_UNKNOWN) {
iCockpitType = Mech.COCKPIT_STANDARD;
}
} catch (Exception e) {
iCockpitType = Mech.COCKPIT_STANDARD;
}
if (chassisConfig.indexOf("Quad") != -1) {
mech = new QuadMech(iGyroType, iCockpitType);
} else if (chassisConfig.indexOf("LAM") != -1) {
mech = new LandAirMech(iGyroType, iCockpitType);
} else {
mech = new BipedMech(iGyroType, iCockpitType);
}
// aarg! those stupid sub-names in parenthesis screw everything up
// we may do something different in the future, but for now, I'm
// going to strip them out
int pindex = name.indexOf("(");
if (pindex == -1) {
mech.setChassis(name.trim());
} else {
mech.setChassis(name.substring(0, pindex - 1).trim());
}
mech.setModel(model.trim());
mech.setYear(Integer.parseInt(techYear.substring(4).trim()));
mech.setSource(source.substring("Source:".length()).trim());
if (chassisConfig.indexOf("Omni") != -1) {
mech.setOmni(true);
}
if (techBase.substring(9).trim().equals("Inner Sphere")) {
switch (Integer.parseInt(rulesLevel.substring(12).trim())) {
case 1:
mech.setTechLevel(TechConstants.T_INTRO_BOXSET);
break;
case 2:
mech.setTechLevel(TechConstants.T_IS_TW_NON_BOX);
break;
case 3:
mech.setTechLevel(TechConstants.T_IS_ADVANCED);
break;
case 4:
mech.setTechLevel(TechConstants.T_IS_EXPERIMENTAL);
break;
case 5:
mech.setTechLevel(TechConstants.T_IS_UNOFFICIAL);
break;
default:
throw new EntityLoadingException(
"Unsupported tech level: "
+ rulesLevel.substring(12).trim());
}
} else if (techBase.substring(9).trim().equals("Clan")) {
switch (Integer.parseInt(rulesLevel.substring(12).trim())) {
case 2:
mech.setTechLevel(TechConstants.T_CLAN_TW);
break;
case 3:
mech.setTechLevel(TechConstants.T_CLAN_ADVANCED);
break;
case 4:
mech.setTechLevel(TechConstants.T_CLAN_EXPERIMENTAL);
break;
case 5:
mech.setTechLevel(TechConstants.T_CLAN_UNOFFICIAL);
break;
default:
throw new EntityLoadingException(
"Unsupported tech level: "
+ rulesLevel.substring(12).trim());
}
} else if (techBase.substring(9).trim()
.equals("Mixed (IS Chassis)")) {
switch (Integer.parseInt(rulesLevel.substring(12).trim())) {
case 3:
mech.setTechLevel(TechConstants.T_IS_ADVANCED);
break;
case 4:
mech.setTechLevel(TechConstants.T_IS_EXPERIMENTAL);
break;
case 5:
mech.setTechLevel(TechConstants.T_IS_UNOFFICIAL);
break;
default:
throw new EntityLoadingException(
"Unsupported tech level: "
+ rulesLevel.substring(12).trim());
}
mech.setMixedTech(true);
} else if (techBase.substring(9).trim().equals(
"Mixed (Clan Chassis)")) {
switch (Integer.parseInt(rulesLevel.substring(12).trim())) {
case 3:
mech.setTechLevel(TechConstants.T_CLAN_ADVANCED);
break;
case 4:
mech.setTechLevel(TechConstants.T_CLAN_EXPERIMENTAL);
break;
case 5:
mech.setTechLevel(TechConstants.T_CLAN_UNOFFICIAL);
break;
default:
throw new EntityLoadingException(
"Unsupported tech level: "
+ rulesLevel.substring(12).trim());
}
mech.setMixedTech(true);
} else if (techBase.substring(9).trim().equals("Mixed")) {
throw new EntityLoadingException(
"Unsupported tech base: \"Mixed\" is no longer allowed by itself. You must specify \"Mixed (IS Chassis)\" or \"Mixed (Clan Chassis)\".");
} else {
throw new EntityLoadingException("Unsupported tech base: "
+ techBase.substring(9).trim());
}
mech.setWeight(Integer.parseInt(tonnage.substring(5)));
int engineFlags = 0;
if ((mech.isClan() && !mech.isMixedTech())
|| (mech.isMixedTech() && mech.isClan() && !mech
.itemOppositeTech(engine))) {
engineFlags = Engine.CLAN_ENGINE;
}
int engineRating = Integer.parseInt(engine.substring(engine
.indexOf(":") + 1, engine.indexOf(" ")));
mech.setEngine(new Engine(engineRating, Engine
.getEngineTypeByString(engine), engineFlags));
mech.setOriginalJumpMP(Integer.parseInt(jumpMP.substring(8)));
boolean dblSinks = (heatSinks.substring(14).equalsIgnoreCase("Double"));
boolean laserSinks = heatSinks.substring(14).equalsIgnoreCase("Laser");
int expectedSinks = Integer.parseInt(heatSinks.substring(11, 13).trim());
int baseHeatSinks = Integer.parseInt(baseChassieHeatSinks.substring("base chassis heat sinks:".length()).trim());
String thisStructureType = internalType.substring(internalType.indexOf(':') + 1);
if (thisStructureType.length() > 0) {
mech.setStructureType(thisStructureType);
} else {
mech.setStructureType(EquipmentType.T_STRUCTURE_STANDARD);
}
mech.autoSetInternal();
String thisArmorType = armorType
.substring(armorType.indexOf(':') + 1);
if (thisArmorType.indexOf('(') != -1) {
if (thisArmorType.toLowerCase().indexOf("clan") != -1) {
switch (Integer.parseInt(rulesLevel.substring(12).trim())) {
case 2:
mech.setArmorTechLevel(TechConstants.T_CLAN_TW);
break;
case 3:
mech.setArmorTechLevel(TechConstants.T_CLAN_ADVANCED);
break;
case 4:
mech.setArmorTechLevel(TechConstants.T_CLAN_EXPERIMENTAL);
break;
case 5:
mech.setArmorTechLevel(TechConstants.T_CLAN_UNOFFICIAL);
break;
default:
throw new EntityLoadingException(
"Unsupported tech level: "
+ rulesLevel.substring(12).trim());
}
} else if (thisArmorType.toLowerCase().indexOf("inner sphere") != -1) {
switch (Integer.parseInt(rulesLevel.substring(12).trim())) {
case 1:
mech.setArmorTechLevel(TechConstants.T_INTRO_BOXSET);
break;
case 2:
mech.setArmorTechLevel(TechConstants.T_IS_TW_NON_BOX);
break;
case 3:
mech.setArmorTechLevel(TechConstants.T_IS_ADVANCED);
break;
case 4:
mech.setArmorTechLevel(TechConstants.T_IS_EXPERIMENTAL);
break;
case 5:
mech.setArmorTechLevel(TechConstants.T_IS_UNOFFICIAL);
break;
default:
throw new EntityLoadingException(
"Unsupported tech level: "
+ rulesLevel.substring(12).trim());
}
}
thisArmorType = thisArmorType.substring(0, thisArmorType.indexOf('('));
} else {
mech.setArmorTechLevel(mech.getTechLevel());
}
if (thisArmorType.length() > 0) {
mech.setArmorType(thisArmorType);
} else {
mech.setArmorType(EquipmentType.T_ARMOR_STANDARD);
}
for (int x = 0; x < locationOrder.length; x++) {
mech.initializeArmor(Integer.parseInt(armorValues[x]
.substring(armorValues[x].indexOf(':')+1)), locationOrder[x]);
}
for (int x = 0; x < rearLocationOrder.length; x++) {
mech.initializeRearArmor(Integer.parseInt(armorValues[x
+ locationOrder.length].substring(10)),
rearLocationOrder[x]);
}
// oog, crits.
compactCriticals(mech);
// we do these in reverse order to get the outermost
// locations first, which is necessary for split crits to work
for (int i = mech.locations() - 1; i >= 0; i--) {
parseCrits(mech, i);
}
if (mech.isClan()) {
mech.addClanCase();
}
// add any heat sinks not allocated
if ( laserSinks ){
mech.addEngineSinks(expectedSinks - mech.heatSinks(), "CLLaser Heat Sink");
} else {
mech.addEngineSinks(expectedSinks - mech.heatSinks(), dblSinks);
}
if (mech.isOmni()) {
if (baseHeatSinks >= 10) {
mech.getEngine().setBaseChassisHeatSinks(baseHeatSinks);
} else {
mech.getEngine().setBaseChassisHeatSinks(expectedSinks);
}
}
return mech;
} catch (NumberFormatException ex) {
ex.printStackTrace();