if ((target.getTargetType() != Targetable.TYPE_BUILDING) && (target.getTargetType() != Targetable.TYPE_FUEL_TANK)) { return new ToHitData(TargetRoll.IMPOSSIBLE, "You can only target buildings"); return new ToHitData(TargetRoll.IMPOSSIBLE, "You can't attack from a null entity!"); if (!(ae instanceof Infantry)) return new ToHitData(TargetRoll.IMPOSSIBLE, "Attacker is not infantry"); Infantry inf = (Infantry) ae; if (inf.turnsLayingExplosives > 0) return new ToHitData(TargetRoll.AUTOMATIC_SUCCESS, "STOP: Expected Damage: " + getDamageFor(ae)); boolean ok = false; return new ToHitData(TargetRoll.IMPOSSIBLE, "No explosives carried"); return new ToHitData(TargetRoll.AUTOMATIC_SUCCESS, "START: Can't move or fire while laying explosives");
/** * Gets the ToHitData associated with firing at an immobile target. Returns null if target isn't. * @param target The target being considered for firing * @param aimingAt The location of the unit being aimed at * @param aimingMode The aiming mode * @return The relevant ToHitData */ @Nullable public static ToHitData getImmobileMod(Targetable target, int aimingAt, int aimingMode) { // if we are bombing hexes, they are not considered immobile. if(target.getTargetType() == Targetable.TYPE_HEX_BOMB || target.getTargetType() == Targetable.TYPE_HEX_AERO_BOMB) { return null; } if (target.isImmobile()) { if ((target instanceof Mech) && (aimingAt == Mech.LOC_HEAD) && (aimingMode == IAimingModes.AIM_MODE_IMMOBILE)) { return new ToHitData(3, "aiming at head"); } return new ToHitData(-4, "target immobile"); } return null; }
/** * 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; }
return new ToHitData(TargetRoll.IMPOSSIBLE, "Target is null"); return new ToHitData(TargetRoll.IMPOSSIBLE, "Infantry can't D.F.A."); return new ToHitData(TargetRoll.IMPOSSIBLE, "Can't D.F.A. using mechanical jump boosters."); return new ToHitData(TargetRoll.IMPOSSIBLE, "D.F.A. action not found in movement path"); return new ToHitData(TargetRoll.IMPOSSIBLE, "D.F.A. must involve jumping"); return new ToHitData(TargetRoll.IMPOSSIBLE, "Cannot D.F.A. an airborne target."); return new ToHitData(TargetRoll.IMPOSSIBLE, "Cannot D.F.A. a dropship."); return new ToHitData(TargetRoll.IMPOSSIBLE, "Target is a passenger."); return new ToHitData(TargetRoll.IMPOSSIBLE, "No evading while charging"); return new ToHitData(TargetRoll.IMPOSSIBLE, "Target is swarming a Mek."); return new ToHitData(TargetRoll.IMPOSSIBLE,
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 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; }
return new ToHitData(TargetRoll.IMPOSSIBLE, "Target is null"); && ae.getOwner().getTeam() != IPlayer.TEAM_NONE && ae.getOwner().getTeam() == ((Entity)target).getOwner().getTeam()))) return new ToHitData(TargetRoll.IMPOSSIBLE, "A friendly unit can never be the target of a direct attack."); ToHitData toHit = new ToHitData(2, "base");
return new ToHitData(TargetRoll.IMPOSSIBLE, "Ram action not found in movement path"); return new ToHitData(TargetRoll.IMPOSSIBLE, "No evading while charging"); return new ToHitData(TargetRoll.IMPOSSIBLE, "Could not reach target with movement"); return new ToHitData(TargetRoll.IMPOSSIBLE, "Violation of stacking limit in second last step");
final MovePath mockFlightPathGood = Mockito.mock(MovePath.class); final MovePath mockFlightPathBad = Mockito.mock(MovePath.class); Mockito.doReturn(new ToHitData()) .when(testFireControl) .guessToHitModifierHelperForAnyAttack(Mockito.any(Entity.class), Mockito.any(EntityState.class), expected = new ToHitData(mockCrew.getGunnery(), FireControl.TH_GUNNERY); expected.addModifier(FireControl.TH_AIR_STRIKE); assertToHitDataEquals(expected, testFireControl.guessAirToGroundStrikeToHitModifier(mockFighter, expected = new ToHitData(FireControl.TH_AIR_STRIKE_PATH); assertToHitDataEquals(expected, testFireControl.guessAirToGroundStrikeToHitModifier(mockFighter, mockShooterState, expected = new ToHitData(FireControl.TH_WEAP_NO_AMMO); assertToHitDataEquals(expected, testFireControl.guessAirToGroundStrikeToHitModifier(mockFighter, mockShooterState, expected = new ToHitData(FireControl.TH_WEAP_NO_AMMO); assertToHitDataEquals(expected, testFireControl.guessAirToGroundStrikeToHitModifier(mockFighter, mockShooterState, expected = new ToHitData(FireControl.TH_WEAP_CANNOT_FIRE); assertToHitDataEquals(expected, testFireControl.guessAirToGroundStrikeToHitModifier(mockFighter, mockShooterState,
toReturn = new ToHitData(inf.getCrew().getPiloting(), "anti-mech skill", ToHitData.HIT_KICK, ToHitData.SIDE_FRONT); int men = inf.getShootingStrength(); toReturn = new ToHitData(inf.getCrew().getPiloting(), "anti-mech skill", ToHitData.HIT_KICK, ToHitData.SIDE_FRONT); int men = inf.getShootingStrength(); toReturn = new ToHitData(TargetRoll.IMPOSSIBLE, reason.toString(), ToHitData.HIT_KICK, ToHitData.SIDE_FRONT);
entity.getSubEntities().ifPresent(ents -> ents.forEach( ent -> { ToHitData squadronToHit = new ToHitData(); squadronToHit.setHitTable(ToHitData.HIT_NORMAL); HitData hit = ent.rollHitLocation(squadronToHit.getHitTable(), ToHitData.SIDE_FRONT); })); } else { ToHitData hexToHit = new ToHitData(); hexToHit.setHitTable(ToHitData.HIT_NORMAL); HitData hit = entity.rollHitLocation(hexToHit.getHitTable(), ToHitData.SIDE_FRONT);
entity.getSubEntities().ifPresent(ents -> ents.forEach( ent -> { ToHitData squadronToHit = new ToHitData(); squadronToHit.setHitTable(ToHitData.HIT_NORMAL); HitData hit = ent.rollHitLocation(squadronToHit.getHitTable(), ToHitData.SIDE_FRONT); })); } else { ToHitData hexToHit = new ToHitData(); hexToHit.setHitTable(ToHitData.HIT_NORMAL); HitData hit = entity.rollHitLocation(hexToHit.getHitTable(), ToHitData.SIDE_FRONT);
return new ToHitData(); && !entity.isImmobile() && !((entity instanceof Infantry) || (entity instanceof VTOL) || (entity instanceof GunEmplacement))) { ToHitData toHit = new ToHitData(); toHit.addModifier(-1, "target didn't move"); return toHit; ToHitData toHit = new ToHitData(); toHit.addModifier(3, "target is assault dropping"); return toHit;
ToHitData toHit = new ToHitData(); if (distance == 0 && !jumped) { return toHit;
public static ToHitData getStrafingTerrainModifier(IGame game, int eistatus, IHex hex) { ToHitData toHit = new ToHitData();
taggedBy = ((Entity) target).getTaggedBy(); ToHitData bestMods = new ToHitData(TargetRoll.IMPOSSIBLE, "");
private void setToHit(Targetable target) { toHit = new ToHitData(4, "Base"); if (range > 20 && range <= 25) { toHit.addModifier(6, "extreme range");