&& game.getOptions().booleanOption(OptionsConstants.ADVANCED_MAXTECH_MOVEMENT_MODS)) { if ((distance >= 3) && (distance <= 4)) { toHit.addModifier(1, "target moved 3-4 hexes"); } else if ((distance >= 5) && (distance <= 6)) { toHit.addModifier(2, "target moved 5-6 hexes"); } else if ((distance >= 7) && (distance <= 9)) { toHit.addModifier(3, "target moved 7-9 hexes"); } else if ((distance >= 10) && (distance <= 13)) { toHit.addModifier(4, "target moved 10-13 hexes"); } else if ((distance >= 14) && (distance <= 18)) { toHit.addModifier(5, "target moved 18-24 hexes"); } else if ((distance >= 19) && (distance <= 24)) { toHit.addModifier(6, "target moved 18-24 hexes"); } else if (distance >= 25) { toHit.addModifier(7, "target moved 25+ hexes"); toHit.addModifier(1, "target moved 3-4 hexes"); } else if ((distance >= 5) && (distance <= 6)) { toHit.addModifier(2, "target moved 5-6 hexes"); } else if ((distance >= 7) && (distance <= 9)) { toHit.addModifier(3, "target moved 7-9 hexes"); } else if ((distance >= 10) && (distance <= 17)) { toHit.addModifier(4, "target moved 10-17 hexes"); } else if ((distance >= 18) && (distance <= 24)) { toHit.addModifier(5, "target moved 18-24 hexes"); } else if (distance >= 25) { toHit.addModifier(6, "target moved 25+ hexes"); toHit.addModifier(1, "target VTOL used MPs");
private static ToHitData getLimbModifier(int loc, Entity ae) { ToHitData toHit = new ToHitData(); // damaged or missing actuators if (!ae.hasWorkingSystem(Mech.ACTUATOR_UPPER_LEG, loc)) { toHit.addModifier(2, "Upper leg actuator destroyed"); } if (!ae.hasWorkingSystem(Mech.ACTUATOR_LOWER_LEG, loc)) { toHit.addModifier(2, "Lower leg actuator destroyed"); } if (!ae.hasWorkingSystem(Mech.ACTUATOR_FOOT, loc)) { toHit.addModifier(1, "Foot actuator destroyed"); } return toHit; } }
/** * Modifier to attacks due to spotter movement */ public static ToHitData getSpotterMovementModifier(IGame game, int entityId, EntityMovementType movement) { ToHitData toHit = new ToHitData(); Entity e = game.getEntity(entityId); if ((e != null) && (e instanceof Infantry)) { return toHit; } if ((movement == EntityMovementType.MOVE_WALK) || (movement == EntityMovementType.MOVE_VTOL_WALK)) { toHit.addModifier(1, "spotter walked"); } else if ((movement == EntityMovementType.MOVE_RUN) || (movement == EntityMovementType.MOVE_VTOL_RUN) || (movement == EntityMovementType.MOVE_SKID)) { toHit.addModifier(2, "spotter ran"); } else if (movement == EntityMovementType.MOVE_JUMP) { toHit.addModifier(3, "spotter jumped"); } else if (movement == EntityMovementType.MOVE_SPRINT || movement == EntityMovementType.MOVE_VTOL_SPRINT) { return new ToHitData(TargetRoll.IMPOSSIBLE, "spotter sprinted"); } return toHit; }
private static ToHitData getAntiMechMods(ToHitData data, Infantry attacker, Entity defender) { if (attacker == null) { data.addModifier(TargetRoll.IMPOSSIBLE, "Unknown attacker"); return data; data.addModifier(TargetRoll.IMPOSSIBLE, "Unknown defender"); return data; data.addModifier(TargetRoll.IMPOSSIBLE, "Launcher not jettisoned."); return data; .getMovementMode() == EntityMovementMode.INF_UMU)) && (attacker.moved == EntityMovementType.MOVE_JUMP)) { data.addModifier( TargetRoll.IMPOSSIBLE, "can't jump using mechanical jump booster and anti-mech attack in the same turn"); data.addModifier(TargetRoll.IMPOSSIBLE, "can't engage in anti-mek attacks with encumbering armor."); return data; data.addModifier(TargetRoll.IMPOSSIBLE, "Target is a passenger."); return data; data.addModifier(TargetRoll.IMPOSSIBLE, "Target is making a DFA."); return data; data.addModifier(TargetRoll.IMPOSSIBLE,
toHit.addModifier(1, woodsText); } else if (woodsLevel > 1) { if (eistatus > 0) { toHit.addModifier(woodsLevel - 1, woodsText); } else { toHit.addModifier(woodsLevel, woodsText); || (hex.terrainLevel(Terrains.SMOKE) == SmokeCloud.SMOKE_LI_HEAVY) || (hex.terrainLevel(Terrains.SMOKE) == SmokeCloud.SMOKE_CHAFF_LIGHT)) { toHit.addModifier(1, "light smoke"); } else if (hex.terrainLevel(Terrains.SMOKE) == SmokeCloud.SMOKE_HEAVY) { if (eistatus > 0) { toHit.addModifier(1, "heavy smoke"); } else { toHit.addModifier(2, "heavy smoke"); toHit.addModifier(1, "erupting geyser"); } else { toHit.addModifier(2, "erupting geyser");
toHit.addModifier(3, "attacker used UMUs"); } else if (entity instanceof LandAirMech && movement == EntityMovementType.MOVE_VTOL_WALK) { toHit.addModifier(3, "attacker cruised"); } else if (entity instanceof LandAirMech && movement == EntityMovementType.MOVE_VTOL_RUN) { toHit.addModifier(4, "attacker flanked"); } else if ((movement == EntityMovementType.MOVE_WALK) || (movement == EntityMovementType.MOVE_VTOL_WALK) || (movement == EntityMovementType.MOVE_CAREFUL_STAND)) { toHit.addModifier(1, "attacker walked"); } else if ((movement == EntityMovementType.MOVE_RUN) || (movement == EntityMovementType.MOVE_VTOL_RUN)) { toHit.addModifier(2, "attacker ran"); } else if (movement == EntityMovementType.MOVE_SKID) { toHit.addModifier(3, "attacker ran and skidded"); } else if (movement == EntityMovementType.MOVE_JUMP) { if (entity.hasAbility(OptionsConstants.PILOT_JUMPING_JACK)) { toHit.addModifier(1, "attacker jumped"); } else if (entity.hasAbility(OptionsConstants.PILOT_HOPPING_JACK)) { toHit.addModifier(2, "attacker jumped"); } else { toHit.addModifier(3, "attacker jumped");
/** * Modifier to physical attack BTH due to pilot advantages */ public static void modifyPhysicalBTHForAdvantages(Entity attacker, Entity target, ToHitData toHit, IGame game) { if (attacker.hasAbility(OptionsConstants.PILOT_MELEE_SPECIALIST) && (attacker instanceof Mech)) { toHit.addModifier(-1, OptionsConstants.PILOT_MELEE_SPECIALIST); } IHex curHex = game.getBoard().getHex(attacker.getPosition()); if (attacker.hasAbility(OptionsConstants.PILOT_TM_FROGMAN) && ((attacker instanceof Mech) || (attacker instanceof Protomech)) && (curHex.terrainLevel(Terrains.WATER) > 1)) { toHit.addModifier(-1, "Frogman"); } if (attacker.hasAbility(OptionsConstants.UNOFF_CLAN_PILOT_TRAINING)) { toHit.addModifier(1, "clan pilot training"); } // Mek targets that are dodging are harder to hit. if ((target != null) && (target instanceof Mech) && target.hasAbility(OptionsConstants.PILOT_DODGE_MANEUVER) && (target.dodging)) { toHit.addModifier(2, "target is dodging"); } }
toHit = new ToHitData(4, "Base"); if (range > 20 && range <= 25) { toHit.addModifier(6, "extreme range"); } else if (range > 12 && range <= 20) { toHit.addModifier(4, "long range"); } else if (range > 6 && range <= 12) { toHit.addModifier(2, "medium range"); } else if (range <= 6) { toHit.addModifier(0, "short range"); || (detRangeLong && range <= 12) || (detRangeMedium && range <= 6)) { toHit.addModifier(1, "target closer than range setting"); toHit.addModifier(2, "target is evading"); toHit.addModifier(-2, "target is not moving"); if ((bayWAmmo.getType().hasFlag(AmmoType.F_AR10_BARRACUDA)) || (bayAType.getAmmoType() == AmmoType.T_BARRACUDA)) { toHit.addModifier(-2, "Barracuda Missile"); toHit.addModifier(+1, "attack against nose"); toHit.addModifier(+2, "attack against side"); ecm = Math.min(4, ecm); if (ecm > 0) { toHit.addModifier(ecm, "ECM");
ToHitData.HIT_NORMAL, defender.sideTable(attackCoords)); toHit.addModifier(+4, "space bomb attack"); if (attacker.mpUsed > 0) { toHit.addModifier(attacker.mpUsed, "attacker thrust"); toHit.addModifier(defender.mpUsed, "defender thrust"); toHit.addModifier(-4, "immobile"); toHit.addModifier(penalty, "defender weight");
toHit.addModifier(1, "battle armor target"); toHit.addModifier(1, "infantry squad target"); toHit.addModifier(2, "ejected MechWarrior target"); toHit.addModifier(1, "Modular Armor"); toHit.addModifier(1, "attacker is superheavy mech"); return; } else if (sensorHits == 2) { toHit.addModifier(4, "Head Sensors Destroyed for Torso-Mounted Cockpit"); toHit.addModifier(+1, "attacker is spotting for indirect LRM fire"); toHit.addModifier(-2, "target prone and adjacent"); toHit.addModifier(-2, "target is large support tank"); toHit.addModifier(-2, "target is dropship"); toHit.addModifier(1, "target has partial cover"); toHit.addModifier(-2, "Weight Class Attack Modifier"); } else if (ae.getWeightClass() == EntityWeightClass.WEIGHT_MEDIUM) { toHit.addModifier(-1, "Weight Class Attack Modifier");
toHit.addModifier(TargetRoll.AUTOMATIC_SUCCESS, "original attacker"); return toHit; toHit.addModifier(2, "Left shoulder actuator destroyed"); toHit.addModifier(2, "Left upper arm actuator destroyed"); toHit.addModifier(2, "Left lower arm actuator destroyed"); toHit.addModifier(1, "Left hand actuator destroyed"); toHit.addModifier(2, "Right shoulder actuator destroyed"); toHit.addModifier(2, "Right upper arm actuator destroyed"); toHit.addModifier(2, "Right lower arm actuator destroyed"); toHit.addModifier(1, "Right hand actuator destroyed"); toHit.addModifier(-1,"AES modifer"); toHit.addModifier(wmod, "Weight class difference");
/** * Modifier to attacks due to attacker terrain */ public static ToHitData getAttackerTerrainModifier(IGame game, int entityId) { final Entity attacker = game.getEntity(entityId); final IHex hex = game.getBoard().getHex(attacker.getPosition()); ToHitData toHit = new ToHitData(); // space screens; bonus depends on number (level) if (hex.terrainLevel(Terrains.SCREEN) > 0) { toHit.addModifier(hex.terrainLevel(Terrains.SCREEN) + 1, "attacker in screen(s)"); } return toHit; }
&& !((entity instanceof Infantry) || (entity instanceof VTOL) || (entity instanceof GunEmplacement))) { ToHitData toHit = new ToHitData(); toHit.addModifier(-1, "target didn't move"); return toHit; toHit.addModifier(3, "target is assault dropping"); return toHit; && entity.getCrew().hasDedicatedPilot()) { if (toHit.getModifiers().isEmpty()) { toHit.addModifier(1, "target moved 1-2 hexes"); } else { toHit.getModifiers().get(0).setValue(toHit.getModifiers().get(0).getValue() + 1); toHit.addModifier(2, "target skidded"); toHit.addModifier(1, "target is airborne"); toHit.addModifier(-1, "target sprinted");
modifier = 7; toReturn.addModifier(modifier, men + " trooper(s) active"); } else if (attacker instanceof Infantry) { modifier = 7; toReturn.addModifier(modifier, men + " trooper(s) active"); toReturn.addModifier(-2, "has tracks");
toHit.addModifier(ae.mpUsed, "thrust used"); toHit.addModifier(+6, "out of fuel");
expected.addModifier(FireControl.TH_AIR_STRIKE); assertToHitDataEquals(expected, testFireControl.guessAirToGroundStrikeToHitModifier(mockFighter, mockShooterState,
toHita.addModifier(TargetRoll.IMPOSSIBLE, "Attacker in depth 2+ water"); toHitd.addModifier(TargetRoll.IMPOSSIBLE, "Defender in depth 2+ water"); } else if ((attHex.surface() == attEl) && (ae.height() > 0)) { pc = true; } else if (targHex.surface() > targEl) { toHita.addModifier(TargetRoll.IMPOSSIBLE, "Attacker in depth 2+ water"); toHitd.addModifier(TargetRoll.IMPOSSIBLE, "Defender in depth 2+ water"); toHita.addModifier(ae.getHeatFiringModifier(), "heatBuildup"); toHitd.addModifier(te.getHeatFiringModifier(), "heatBuildup"); toHita.addModifier(-4, "target immobile"); toHitd.addModifier(-4, "target immobile"); toHita.addModifier(-2, "target prone and adjacent"); toHita.addModifier(1, "target prone and at range"); toHitd.addModifier(-2, "target prone and adjacent"); toHitd.addModifier(1, "target prone and at range");
&& !Compute.inVisualRange(game, los, other, target) && !Compute.inSensorRange(game, los, other, target, null)) { mods.addModifier(TargetRoll.IMPOSSIBLE, "outside of visual and sensor range"); other.getId())); if (other.isAttackingThisTurn() && !other.getCrew().hasActiveCommandConsole()) { mods.addModifier(1, "spotter is making an attack this turn");
mods.addModifier(1, "attacker prone"); } else { mods.addModifier(2, "attacker prone"); mods.addModifier(1, "attacker prone"); } else { mods.addModifier(2, "attacker prone"); mods.addModifier(1, "attacker propping on single arm");
tohit.addModifier(TH_AIR_STRIKE);