if ( secondaryEffects && eqType.isExplosive() && !hitBefore ) {
if ( (secondaryEffects && eqType.isExplosive() || mounted.isHotLoaded()) && !hitBefore ) {
    public Vector applyCriticalHit( Entity en, int loc, CriticalSlot cs,                                     boolean secondaryEffects ) {        Vector vDesc = new Vector();        Report r;        // Handle hits on "critical slots" of tanks.        if ( en instanceof Tank ) {            Tank tank = (Tank)en;            VTOL vtol = null;            if (en instanceof VTOL)                vtol = (VTOL)en;            r = new Report(6180);            r.subject = en.getId();            r.indent(3);            r.newlines = 0;            vDesc.addElement(r);            switch ( cs.getIndex() ) {                case 1 : //crew stunned, or killed if VTOL                    if (vtol == null) {                        r = new Report(6185);                        r.subject = en.getId();                        r.newlines = 0;                        vDesc.addElement(r);                        // Carried units can't unload from a stunned transport.                        // Units that escape a transport don't need to un-stun.                        tank.stunCrew();                    } else { //VTOL's suffer crew death instead                        r = new Report(6190);                        r.subject = en.getId();                        r.newlines = 0;                        vDesc.addElement(r);                        vDesc.addAll(                                              destroyEntity(vtol, "crew death", true));                        en.getCrew().setDoomed(true);                        vDesc.addAll( crashVTOL(vtol));                    }                    break;                case 2 : //this one's ridiculous.  the 'main weapon' jams.                    Mounted mWeap = tank.getMainWeapon();                    if (mWeap == null) { //no main weapon, no crit                        r = new Report(6195);                        r.subject = en.getId();                        r.newlines = 0;                        vDesc.addElement(r);                    }                    else {                        r = new Report(6200);                        r.subject = en.getId();                        r.add(mWeap.getName());                        int jamTurns = tank.getJammedTurns() + 1;                        if ( jamTurns > 1 ) {                            r.messageId = 6205;                            r.add(jamTurns);                        }                        r.newlines = 0;                        vDesc.addElement(r);                        tank.setJammedTurns( jamTurns );                    }                    break;                case 3 : //engine destroyed                    r = new Report(6210);                    r.subject = en.getId();                    r.newlines = 0;                    vDesc.addElement(r);                    tank.immobilize();                    // Does the hovercraft sink?                    // Sinking immobile hovercraft is a secondary effect                    // and does not occur when loading from a scenario.                    if ( secondaryEffects ) {                        IHex te_hex = game.getBoard().getHex( en.getPosition() );                        if (vtol == null) {                            if ( en.getMovementMode() == IEntityMovementMode.HOVER                                 && te_hex.terrainLevel(Terrains.WATER) > 0                                 && !te_hex.containsTerrain(Terrains.ICE)) {                                vDesc.addAll(                                                      destroyEntity(en,"a watery grave", false));                            }                        } else { //VTOLs may land or crash                            //TODO: Nothing if VTOL is landed.  If over clear,                            // paved, rough, or building, VTOL must make PSR                            // to land or crash.  Other terrain is automatic                            // crash.                            Report.addNewline(vDesc);                            //report problem: add 3 tabs                            vDesc.addAll(crashVTOL(vtol));                        }                    }                    break;                case 4 : //crew killed                    r = new Report(6190);                    r.subject = en.getId();                    r.newlines = 0;                    vDesc.addElement(r);                    vDesc.addAll(                        destroyEntity(en, "crew death", true));                    en.getCrew().setDoomed(true);                    if (vtol != null) { //VTOL's crash too                        Report.addNewline(vDesc);                        //report problem: add 3 tabs                        vDesc.addAll( crashVTOL(vtol));                    }                    break;                case 5 : //fuel tank/engine shielding, vehicle explodes                    r = new Report(6215);                    r.subject = en.getId();                    r.newlines = 0;                    vDesc.addElement(r);                    if (vtol == null) {                        vDesc.addAll(destroyEntity(en, "fuel tank explosion", false, false));                    } else { //VTOL's explode and scatter burning fuel                        Report.addNewline(vDesc);                        //report problem: add 3 tabs                        vDesc.addAll( explodeVTOL(vtol));                    }                    en.getCrew().setDoomed(true);                    break;                case 6 : //power plant hit, vehicle explodes                    r = new Report(6220);                    r.subject = en.getId();                    r.newlines = 0;                    vDesc.addElement(r);                    boolean hasCASE = en.locationHasCase(Tank.LOC_BODY);                    if (vtol == null) {                        vDesc.addAll(destroyEntity(en, "power plant destruction", hasCASE, hasCASE));                    } else { //VTOL's explode and scatter burning fuel                        Report.addNewline(vDesc);                        //report problem: add 3 tabs                        vDesc.addAll( explodeVTOL(vtol));                    }                    en.getCrew().setDoomed(!hasCASE);                    break;            }            // End entity-is-tank        } else if (en instanceof BattleArmor) {            // We might as well handle this here.            // However, we're considering a crit against BA as a "crew kill".            BattleArmor ba = (BattleArmor)en;            r = new Report(6111);            int randomTrooper = ba.getRandomTrooper();            destroyLocation(ba, randomTrooper);            r.add(randomTrooper);            r.newlines = 1;            vDesc.add(r);        } else if ( CriticalSlot.TYPE_SYSTEM == cs.getType() ) {            // Handle critical hits on system slots.            cs.setHit(true);            if (en instanceof Protomech) {                int numHit=((Protomech)en).getCritsHit(loc);                if ( cs.getIndex() != Protomech.SYSTEM_TORSO_WEAPON_A &&                     cs.getIndex() != Protomech.SYSTEM_TORSO_WEAPON_B ) {                    r = new Report(6225);                    r.subject = en.getId();                    r.indent(3);                    r.newlines = 0;                    r.add(Protomech.systemNames[cs.getIndex()]);                    vDesc.addElement(r);                }                switch (cs.getIndex()) {                case Protomech.SYSTEM_HEADCRIT:                    if (2==numHit) {                        r = new Report(6230);                        r.subject = en.getId();                        r.newlines = 0;                        vDesc.addElement(r);                        destroyLocation(en, loc);                    }                    break;                case Protomech.SYSTEM_ARMCRIT:                    if (2==numHit) {                        r = new Report(6235);                        r.subject = en.getId();                        r.newlines = 0;                        vDesc.addElement(r);                        destroyLocation(en,loc);                    }                    break;                case Protomech.SYSTEM_LEGCRIT:                    if (3==numHit) {                        r = new Report(6240);                        r.subject = en.getId();                        r.newlines = 0;                        vDesc.addElement(r);                        destroyLocation(en,loc);                    }                    break;                case Protomech.SYSTEM_TORSOCRIT:                    if (3==numHit) {                        vDesc.addAll(                            destroyEntity(en, "torso destruction"));                    }                    // Torso weapon hits are secondary effects and                    // do not occur when loading from a scenario.                    else if ( secondaryEffects ) {                        int tweapRoll=Compute.d6(1);                        CriticalSlot newSlot = null;                        switch (tweapRoll) {                        case 1:                        case 2:                            newSlot = new CriticalSlot                                ( CriticalSlot.TYPE_SYSTEM,                                  Protomech.SYSTEM_TORSO_WEAPON_A );                            vDesc.addAll(                                applyCriticalHit(en, Entity.NONE,                                                  newSlot, secondaryEffects));                            break;                        case 3:                        case 4:                            newSlot = new CriticalSlot                                ( CriticalSlot.TYPE_SYSTEM,                                  Protomech.SYSTEM_TORSO_WEAPON_B );                            vDesc.addAll(                                applyCriticalHit(en, Entity.NONE,                                                  newSlot, secondaryEffects));                            break;                        case 5:                        case 6:                            //no effect                        }                    }                    break;                case Protomech.SYSTEM_TORSO_WEAPON_A:                    Mounted weaponA =( (Protomech) en ).getTorsoWeapon(true);                    if ( null != weaponA ) {                        weaponA.setHit(true);                        r = new Report(6245);                        r.subject = en.getId();                        r.newlines = 0;                        vDesc.addElement(r);                    }                    break;                case Protomech.SYSTEM_TORSO_WEAPON_B:                    Mounted weaponB = ( (Protomech) en ).getTorsoWeapon(false);                    if ( null != weaponB ) {                        weaponB.setHit(true);                        r = new Report(6250);                        r.subject = en.getId();                        r.newlines = 0;                        vDesc.addElement(r);                    }                    break;                } // End switch( cs.getType() )                // Shaded hits cause pilot damage.                if ( ((Protomech)en).shaded(loc, numHit) ) {                    // Destroyed Protomech sections have                    // already damaged the pilot.                    int pHits =                        Protomech.POSSIBLE_PILOT_DAMAGE[ loc ] -                        ((Protomech)en).getPilotDamageTaken( loc );                    if (  Math.min(1, pHits) > 0 ) {                        Report.addNewline(vDesc);                        vDesc.addAll(                                              damageCrew(en, 1));                        pHits = 1 + ((Protomech)en)                            .getPilotDamageTaken( loc );                        ((Protomech)en).setPilotDamageTaken                            ( loc, pHits );                    }                } // End have-shaded-hit            } // End entity-is-protomech            else {                r = new Report(6225);                r.subject = en.getId();                r.indent(3);                r.add(((Mech)en).getSystemName(cs.getIndex()));                r.newlines = 0;                vDesc.addElement(r);                switch(cs.getIndex()) {                case Mech.SYSTEM_COCKPIT :                    // Don't kill a pilot multiple times.                    if ( Pilot.DEATH > en.getCrew().getHits() ) {                        // boink!                        en.getCrew().setDoomed(true);                        Report.addNewline(vDesc);                        vDesc.addAll(                            destroyEntity(en, "pilot death", true));                    }                    break;                case Mech.SYSTEM_ENGINE :                    en.engineHitsThisRound++;                    boolean engineExploded = false;                    int numEngineHits = 0;                    numEngineHits += en.getHitCriticals                        (CriticalSlot.TYPE_SYSTEM,                         Mech.SYSTEM_ENGINE, Mech.LOC_CT);                    numEngineHits += en.getHitCriticals                        (CriticalSlot.TYPE_SYSTEM,                         Mech.SYSTEM_ENGINE, Mech.LOC_RT);                    numEngineHits += en.getHitCriticals                        (CriticalSlot.TYPE_SYSTEM,                         Mech.SYSTEM_ENGINE, Mech.LOC_LT);                    engineExploded = checkEngineExplosion(en, vDesc, numEngineHits);                    if ( !engineExploded && numEngineHits > 2 ) {                        // third engine hit                        vDesc.addAll(                            destroyEntity(en, "engine destruction"));                        if (game.getOptions().booleanOption("auto_abandon_unit")) {                            vDesc.addAll(abandonEntity(en));                        }                    }                    break;                case Mech.SYSTEM_GYRO :                    if ( en.getGyroType() != Mech.GYRO_HEAVY_DUTY ){                        if (en.getHitCriticals(CriticalSlot.TYPE_SYSTEM,                                               Mech.SYSTEM_GYRO, loc) > 1) {                                    // gyro destroyed                            game.addPSR( new PilotingRollData                                (en.getId(), PilotingRollData.AUTOMATIC_FAIL,                                 3, "gyro destroyed") );                        } else {                                    // first gyro hit                            game.addPSR( new PilotingRollData                                (en.getId(), 3, "gyro hit") );                        }//No check against HD Gyros.                    }else{                        int gyroHits = en.getHitCriticals(CriticalSlot.TYPE_SYSTEM,Mech.SYSTEM_GYRO, loc);                        if ( gyroHits > 2) {                            // gyro destroyed                            game.addPSR( new PilotingRollData (en.getId(), PilotingRollData.AUTOMATIC_FAIL,                              3, "gyro destroyed") );                        } else if ( gyroHits == 1 ){                            //first gyro hit                            game.addPSR( new PilotingRollData                                (en.getId(), 2, "gyro hit") );                        } else {                            // second gyro hit                            game.addPSR( new PilotingRollData                                (en.getId(), 3, "gyro hit") );                        }                    }                    break;                case Mech.ACTUATOR_UPPER_LEG :                case Mech.ACTUATOR_LOWER_LEG :                case Mech.ACTUATOR_FOOT :                    // leg/foot actuator piloting roll                    game.addPSR( new PilotingRollData                        (en.getId(), 1, "leg/foot actuator hit") );                    break;                case Mech.ACTUATOR_HIP :                    // hip piloting roll                    game.addPSR( new PilotingRollData                        (en.getId(), 2, "hip actuator hit") );                    break;                }            } // End entity-is-mek        } // End crit-on-system-slot        // Handle critical hits on equipment slots.        else if ( CriticalSlot.TYPE_EQUIPMENT == cs.getType() ) {            cs.setHit(true);            Mounted mounted = en.getEquipment(cs.getIndex());            EquipmentType eqType = mounted.getType();            boolean hitBefore = mounted.isHit();            r = new Report(6225);            r.subject = en.getId();            r.indent(3);            r.add(mounted.getDesc());            r.newlines = 0;            vDesc.addElement(r);            //Shield objects are not useless when they take one crit.            //Shields can be critted and still be usable.            if (eqType instanceof MiscType && ((MiscType)eqType).isShield())                mounted.setHit(false);            else                mounted.setHit(true);            if (eqType instanceof MiscType && eqType.hasFlag(MiscType.F_HARJEL)) {                r = new Report(6254);                r.subject = en.getId();                r.indent(2);                breachLocation(en, loc, null, true);            }            // If the item is the ECM suite of a Mek Stealth system            // then it's destruction turns off the stealth.            if ( !hitBefore && eqType instanceof MiscType &&                 eqType.hasFlag(MiscType.F_ECM) &&                 mounted.getLinkedBy() != null ) {                Mounted stealth = mounted.getLinkedBy();                r = new Report(6255);                r.subject = en.getId();                r.indent(2);                r.add(stealth.getType().getName());                r.newlines = 0;                vDesc.addElement(r);                stealth.setMode( "Off" );            }            // Handle equipment explosions.            // Equipment explosions are secondary effects and            // do not occur when loading from a scenario.            if ( secondaryEffects && eqType.isExplosive() && !hitBefore ) {                vDesc.addAll(explodeEquipment(en, loc, mounted));            }            // Make sure that ammo in this slot is exhaused.            if ( mounted.getShotsLeft() > 0 ) {                mounted.setShotsLeft(0);            }        } // End crit-on-equipment-slot        // mechs with TSM hit by anti-tsm missiles this round get another crit        if (en instanceof Mech && en.hitThisRoundByAntiTSM) {            Mech mech = (Mech)en;            if (mech.hasTSM()) {                r = new Report(6430);                r.subject = en.getId();                r.indent(2);                r.addDesc(en);                r.newlines = 0;                vDesc.addElement(r);                vDesc.addAll(oneCriticalEntity(en, Compute.d6(2)));            }            en.hitThisRoundByAntiTSM = false;        }        // Return the results of the damage.        return vDesc;    }