public Set<Modifier> getOffensiveModifiers(FreeColGameObject attacker,
                                               FreeColGameObject defender) {
        Set<Modifier> result = new LinkedHashSet<Modifier>();
        if (attacker == null) {
            throw new IllegalStateException("Null attacker");
        } else if (combatIsAttackMeasurement(attacker, defender)
            || combatIsAttack(attacker, defender)
            || combatIsSettlementAttack(attacker, defender)) {
            Unit attackerUnit = (Unit) attacker;
            UnitType type = attackerUnit.getType();
            result.add(new Modifier(Modifier.OFFENCE,
                                    Specification.BASE_OFFENCE_SOURCE,
                                    type.getOffence(),
                                    Modifier.Type.ADDITIVE));
            result.addAll(attackerUnit.getModifierSet(Modifier.OFFENCE));
            if (defender instanceof Ownable) {
                result.addAll(attackerUnit
                              .getModifierSet(Modifier.OFFENCE_AGAINST,
                                              (Ownable) defender));
            }
            if (attackerUnit.isNaval()) {
                addNavalOffensiveModifiers(attackerUnit, result);
            } else {
                addLandOffensiveModifiers(attacker, defender, result);
            }

        } else if (combatIsBombard(attacker, defender)) {
            result.add(new Modifier("model.modifier.bombardModifier",
                                    getOffencePower(attacker, defender),
                                    Modifier.Type.ADDITIVE));

        } else {
            throw new IllegalArgumentException("Bogus combat");
        }
        return result;
    }