// And we're done!
return;
}
HitData hit = te.rollHitLocation(toHit.getHitTable(), toHit.getSideTable());
hit.setGeneralDamageType(HitData.DAMAGE_PHYSICAL);
r = new Report(4045);
r.subject = ae.getId();
r.add(toHit.getTableDesc());
r.add(te.getLocationAbbr(hit));
r.newlines = 0;
addReport(r);
// The building shields all units from a certain amount of damage.
// The amount is based upon the building's CF at the phase's start.
if (targetInBuilding && (bldg != null)) {
int bldgAbsorbs = (int) Math.ceil(bldg.getPhaseCF(target.getPosition()) / 10.0);
int toBldg = Math.min(bldgAbsorbs, damage);
damage -= toBldg;
addNewLines();
Vector<Report> buildingReport = damageBuilding(bldg, toBldg, target.getPosition());
for (Report report : buildingReport) {
report.subject = ae.getId();
}
addReport(buildingReport);
}
// A building may absorb the entire shot.
if (damage == 0) {
r = new Report(4050);
r.subject = ae.getId();
r.add(te.getShortName());
r.add(te.getOwner().getName());
r.newlines = 0;
addReport(r);
} else {
if (glancing) {
damage = (int) Math.floor(damage / 2.0);
}
if (directBlow) {
damage += toHit.getMoS() / 3;
hit.makeDirectBlow(toHit.getMoS() / 3);
}
if ((damage >= 1) && te.hasWorkingMisc(MiscType.F_SPIKES, -1, hit.getLocation())) {
r = new Report(4330);
r.indent(2);
r.newlines = 0;
r.subject = ae.getId();
addReport(r);
checkBreakSpikes(te, hit.getLocation());
damage = Math.max(1, damage - 4);
HitData ahit;
if (paa.getArm() == PunchAttackAction.LEFT) {
ahit = new HitData(Mech.LOC_LARM);
} else {
ahit = new HitData(Mech.LOC_RARM);
}
addReport(damageEntity(ae, ahit, 2, false, DamageType.NONE, false, false, false));
}
DamageType damageType = DamageType.NONE;
addReport(damageEntity(te, hit, damage, false, damageType, false, false, throughFront));
if (target instanceof VTOL) {
// destroy rotor
addReport(applyCriticalHit(te, VTOL.LOC_ROTOR, new CriticalSlot(CriticalSlot.TYPE_SYSTEM, VTOL.CRIT_ROTOR_DESTROYED), false));
}
//check for extending retractable blades
if(paa.isBladeExtended(paa.getArm())) {
addNewLines();
r = new Report(4455);
r.indent(2);
r.subject = ae.getId();
r.newlines = 0;
addReport(r);
//conventional infantry don't take crits and battle armor need to be handled differently
if(!(target instanceof Infantry)) {
addNewLines();
addReport(criticalEntity(te, hit.getLocation(), 0, true, false));
}
if((target instanceof BattleArmor)
&& (hit.getLocation() < te.locations()) && (te.getInternal(hit.getLocation()) > 0)) {
//TODO: we should really apply BA criticals through the critical
//hits methods. Right now they are applied in damageentity
HitData bahit = new HitData(hit.getLocation(), false, HitData.EFFECT_CRITICAL);
addReport(damageEntity(te,bahit,0));
}
//extend the blade
//since retracting/extending is a freebie in the movement phase, lets assume that the
//blade retracts to its original mode