diff -rupN uc_discount/uc_discount.ca.inc uc_discount_new/uc_discount.ca.inc
--- uc_discount/uc_discount.ca.inc	2010-01-20 12:58:54.954780515 +1100
+++ uc_discount.ca.inc	2010-01-20 13:00:55.568781455 +1100
@@ -362,20 +362,18 @@ function uc_discount_get_line_item_disco
  * @see uc_discount_ca_action()
  */
 function uc_discount_get_discount($entity, $settings) {
-  // If we are adding a base number as a discount, return it.
-  if ($settings['operation'] == 'add') {
-    return floatval($settings['amount']);
-  }
-
-  // When multiplying, we need to figure out how much to multiply the amount
-  // by.
+  // Figure out what to multiply by
+  // If the operator is add we multiply by the number of items/products
+  // Otherwise we multiple by the total cost of the items/products
   $type = $settings['discount']['type'];
   $discount = uc_discount_get_discounts('discounts', $type);
 
   // Each discount type uses its settings and the order object to calculate
   // what the discount applies to.
   if (isset($discount['callback']) && function_exists($discount['callback'])) {
-    $base = call_user_func($discount['callback'], $entity, $settings['discount'][$type]);
+    $callback_settings = $settings['discount'][$type];
+    $callback_settings['operation'] = $settings['operation'];
+    $base = call_user_func($discount['callback'], $entity, $callback_settings);
   }
   else {
     $base = 0;
diff -rupN uc_discount/uc_discount.module uc_discount_new/uc_discount.module
--- uc_discount/uc_discount.module	2010-01-20 12:58:54.958780746 +1100
+++ uc_discount.module	2010-01-20 13:03:10.762781791 +1100
@@ -424,14 +424,19 @@ function uc_discount_order_product_disco
 
   foreach ($order->products as $product) {
     if ($product->nid == $settings['product']) {
-      $context['subject']['product'] = $product;
-      $context['subject']['node'] = node_load($product->nid);
-      $price_info = array(
-        'price' => $product->price,
-        'qty' => min($settings['qty'], $product->qty),
-      );
+      if ($settings['operation'] == 'add') {
+        $multiplier++;
+      }
+      else {
+        $context['subject']['product'] = $product;
+        $context['subject']['node'] = node_load($product->nid);
+        $price_info = array(
+          'price' => $product->price,
+          'qty' => min($settings['qty'], $product->qty),
+        );
 
-      $multiplier += uc_price($price_info, $context);
+        $multiplier += uc_price($price_info, $context);
+      }
     }
   }
 
@@ -580,13 +585,13 @@ function uc_discount_line_items_discount
   if (is_array($order->line_items)) {
     foreach ($order->line_items as $i => $item) {
       if (in_array($item['type'], $settings['line_items'])) {
-        $total += $item['amount'];
+        $total += ($settings['operation'] == 'add') ? 1 : $item['amount'];
       }
     }
   }
   if (in_array('discount', $settings['line_items'])) {
     foreach ($order->discounts as $other_discount) {
-      $amount += $other_discount['amount'];
+      $total += ($settings['operation'] == 'add') ? 1 : $other_discount['amount'];
     }
   }
 
