buildingReport.newlines = 1;
    private void resolvePunchAttack(PhysicalResult pr, int lastEntityId) {        final PunchAttackAction paa = (PunchAttackAction)pr.aaa;        final Entity ae = game.getEntity(paa.getEntityId());        final Targetable target = game.getTarget(paa.getTargetType(), paa.getTargetId());        Entity te = null;        if (target.getTargetType() == Targetable.TYPE_ENTITY) {            te = (Entity)target;        }        boolean throughFront = true;        if (te!=null) {            throughFront = Compute.isThroughFrontHex(game, paa.getEntityId(), te);        }        final String armName = paa.getArm() == PunchAttackAction.LEFT        ? "Left Arm" : "Right Arm";        // get damage, ToHitData and roll from the PhysicalResult        int damage = paa.getArm() == PunchAttackAction.LEFT        ? pr.damage : pr.damageRight;        final ToHitData toHit = paa.getArm() == PunchAttackAction.LEFT        ? pr.toHit : pr.toHitRight;        int roll = paa.getArm() == PunchAttackAction.LEFT        ? pr.roll : pr.rollRight;        final boolean targetInBuilding = Compute.isInBuilding( game, te );        final boolean glancing = game.getOptions().booleanOption("maxtech_glancing_blows") && roll == toHit.getValue();        Report r;        // Which building takes the damage?        Building bldg = game.getBoard().getBuildingAt( target.getPosition() );        if (lastEntityId != paa.getEntityId()) {            //report who is making the attacks            r = new Report(4005);            r.subject = ae.getId();            r.addDesc(ae);            addReport(r);        }        r = new Report(4010);        r.subject = ae.getId();        r.indent();        r.add(armName);        r.add(target.getDisplayName());        r.newlines = 0;        addReport(r);        if (toHit.getValue() == ToHitData.IMPOSSIBLE) {            r = new Report(4015);            r.subject = ae.getId();            r.add(toHit.getDesc());            addReport(r);            return;        } else if (toHit.getValue() == ToHitData.AUTOMATIC_SUCCESS) {            r = new Report(4020);            r.subject = ae.getId();            r.add(toHit.getDesc());            r.newlines = 0;            addReport(r);            roll = Integer.MAX_VALUE;        } else {            r = new Report(4025);            r.subject = ae.getId();            r.add(toHit.getValue());            r.add(roll);            r.newlines = 0;            addReport(r);            if (glancing) {                r = new Report(4030);                r.subject = ae.getId();                r.newlines = 0;                addReport(r);            }        }        // do we hit?        if (roll < toHit.getValue()) {            //nope            r = new Report(4035);            r.subject = ae.getId();            addReport(r);            // If the target is in a building, the building absorbs the damage.            if ( targetInBuilding && bldg != null ) {                // Only report if damage was done to the building.                if ( damage > 0 ) {                    Report buildingReport = damageBuilding( bldg, damage );                    buildingReport.indent();                    buildingReport.subject = ae.getId();                    addReport(buildingReport);                }            }            return;        }        // Targeting a building.        if ( target.getTargetType() == Targetable.TYPE_BUILDING ) {            // The building takes the full brunt of the attack.            r = new Report(4040);            r.subject = ae.getId();            addReport(r);            Report buildingReport = damageBuilding( bldg, damage );            buildingReport.indent();            buildingReport.subject = ae.getId();            addReport(buildingReport);            // Damage any infantry in the hex.            damageInfantryIn( bldg, damage );            // And we're done!            return;        }        HitData hit = te.rollHitLocation(toHit.getHitTable(), toHit.getSideTable());        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() / 10.0 );            int toBldg = Math.min( bldgAbsorbs, damage );            damage -= toBldg;            addNewLines();            Report buildingReport = damageBuilding( bldg, toBldg );            buildingReport.indent();            buildingReport.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 (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);                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,0,false,false,false));            }            int damageType = 0;            if(game.getOptions().booleanOption("maxtech_infantry_damage")) {                damageType = 6;            }            addReport(damageEntity(te, hit, damage, false, damageType, false, false, throughFront));        }        addNewLines();    }