public static void applyFX(
    DeviceType type, Mobile uses, Target applied, boolean hits
  ) {
    
    final World world = uses.world() ;
    if (type == null || type.hasProperty(MELEE)) {
      //
      //  Put in a little 'splash' FX, in the direction of the arc.
      final float r = uses.radius() ;
      final Sprite slashFX = SLASH_FX_MODEL.makeSprite() ;
      slashFX.scale = r * 2 ;
      world.ephemera.addGhost(uses, r, slashFX, 0.33f) ;
    }
    else if (type.hasProperty(RANGED | PHYSICAL)) {
      
      //  You'll have to create a missile effect, with similar parameters.
      final ShotFX shot = (ShotFX) SPEAR_FX_MODEL.makeSprite() ;
      
      final JointSprite sprite = (JointSprite) uses.sprite() ;
      uses.viewPosition(sprite.position) ;
      shot.origin.setTo(sprite.attachPoint("fire")) ;
      shot.target.setTo(hitPoint(applied, hits)) ;
      
      shot.position.setTo(shot.origin).add(shot.target).scale(0.5f) ;
      final float size = shot.origin.sub(shot.target, null).length() / 2 ;
      world.ephemera.addGhost(null, size + 1, shot, 1) ;
    }
    else if (type.hasProperty(RANGED | ENERGY)) {
      
      //  Otherwise, create an appropriate 'beam' FX-
      final ShotFX shot = (ShotFX) LASER_FX_MODEL.makeSprite() ;
      
      final JointSprite sprite = (JointSprite) uses.sprite() ;
      uses.viewPosition(sprite.position) ;
      shot.origin.setTo(sprite.attachPoint("fire")) ;
      shot.target.setTo(hitPoint(applied, hits)) ;
      
      shot.position.setTo(shot.origin).add(shot.target).scale(0.5f) ;
      final float size = shot.origin.sub(shot.target, null).length() / 2 ;
      world.ephemera.addGhost(null, size + 1, shot, 0.66f) ;
      
      final Sprite
        BO = LASER_BURST_MODEL.makeSprite(),
        BT = LASER_BURST_MODEL.makeSprite() ;
      BO.position.setTo(shot.origin) ;
      BT.position.setTo(shot.target) ;
      //world.ephemera.addGhost(null, 1, BO, 0.66f) ;
      world.ephemera.addGhost(null, 1, BT, 0.66f) ;
    }
  }