if ( ae instanceof Infantry ) { return new ToHitData(ToHitData.IMPOSSIBLE, "Infantry can't D.F.A."); }
    public static ToHitData toHitDfa(Game game, int attackerId, int targetId, MovementData md) {        final Entity ae = game.getEntity(attackerId);        final Entity te = game.getEntity(targetId);        Coords chargeSrc = ae.getPosition();        MovementData.Step chargeStep = null;                // let's just check this        if (!md.contains(MovementData.STEP_DFA)) {            return new ToHitData(ToHitData.IMPOSSIBLE, "D.F.A. action not found in movment path");        }                // have to jump        if (!md.contains(MovementData.STEP_START_JUMP)) {            return new ToHitData(ToHitData.IMPOSSIBLE, "D.F.A. must involve jumping");        }                // determine last valid step        compile(game, attackerId, md);        for (final Enumeration i = md.getSteps(); i.hasMoreElements();) {            final MovementData.Step step = (MovementData.Step)i.nextElement();            if (step.getMovementType() == Entity.MOVE_ILLEGAL) {                break;            } else {                if (step.getType() == MovementData.STEP_DFA) {                    chargeStep = step;                } else {                    chargeSrc = step.getPosition();                }            }        }                // need to reach target        if (chargeStep == null || !te.getPosition().equals(chargeStep.getPosition())) {            return new ToHitData(ToHitData.IMPOSSIBLE, "Could not reach target with movement");        }                // target must have moved already        if (te.ready) {            return new ToHitData(ToHitData.IMPOSSIBLE, "Target must be done with movement");        }        	return toHitDfa(game, attackerId, targetId, chargeSrc);    }