Index: code/weapon/weapons.cpp
===================================================================
--- code/weapon/weapons.cpp	(revision 9370)
+++ code/weapon/weapons.cpp	(working copy)
@@ -5589,7 +5589,7 @@
 }
 
 /**
- * Calculate teh damage for an object based on the location of an area-effect
+ * Calculate the damage for an object based on the location of an area-effect
  * explosion.
  *
  * @param objp			Object pointer ship receiving blast effect
@@ -5607,23 +5607,33 @@
  */
 int weapon_area_calc_damage(object *objp, vec3d *pos, float inner_rad, float outer_rad, float max_blast, float max_damage, float *blast, float *damage, float limit)
 {
-	float			dist, max_dist, min_dist;
+	float dist;
+	vec3d box_pt;
 
-	max_dist = objp->radius + outer_rad;
-	dist = vm_vec_dist_quick(&objp->pos, pos);	
-	if ( (dist > max_dist) || (dist > (limit+objp->radius)) ) {
+	// if object receiving the blast is a ship, use the bbox for distances
+	// otherwise use the objects radius
+	// could possibly exclude SIF_SMALL_SHIP (& other small objects) from using the bbox
+	if (objp->type == OBJ_SHIP) {
+		int inside = get_nearest_bbox_point(objp, pos, &box_pt);
+		if (inside) {
+			dist = 0.0001f;
+		} else {
+			dist = vm_vec_dist_quick(pos, &box_pt);
+		}
+	} else {
+		dist = vm_vec_dist_quick(&objp->pos, pos) - objp->radius;
+	}
+
+	if ( (dist > outer_rad) || (dist > limit) ) {
 		return -1;	// spheres don't intersect at all
 	}
 
-	if ( dist < (inner_rad+objp->radius) ) {
+	if ( dist < inner_rad ) {
 		// damage is maximum within inner radius
 		*damage = max_damage;
 		*blast = max_blast;
 	} else {
-		min_dist = dist - objp->radius;
-		Assert(min_dist < outer_rad);
-
-		float dist_to_outer_rad_squared = (outer_rad-min_dist)*(outer_rad-min_dist);
+		float dist_to_outer_rad_squared = (outer_rad-dist)*(outer_rad-dist);
 		float total_dist_squared = (inner_rad-outer_rad)*(inner_rad-outer_rad);
 
 		// this means the inner and outer radii are basically equal... and since we aren't within the inner radius,
@@ -5635,8 +5645,7 @@
 		// AL 2-24-98: drop off damage relative to square of distance
 		Assert(dist_to_outer_rad_squared <= total_dist_squared);
 		*damage = max_damage * dist_to_outer_rad_squared/total_dist_squared;
-
-		*blast =  (min_dist - outer_rad) * max_blast /(inner_rad - outer_rad);
+		*blast =  (dist - outer_rad) * max_blast /(inner_rad - outer_rad);
 	}
 
 	return 0;
Index: code/ai/aicode.cpp
===================================================================
--- code/ai/aicode.cpp	(revision 9370)
+++ code/ai/aicode.cpp	(working copy)
@@ -1834,30 +1834,9 @@
 	return 0;
 }
 
-/**
- * Given a ship with bounding box and a point, find the closest point on the bbox
- */
-int get_nearest_bbox_point(object *ship_obj, vec3d *start, vec3d *box_pt)
-{
-	vec3d temp, rf_start;
-	polymodel *pm;
-	pm = model_get(Ship_info[Ships[ship_obj->instance].ship_info_index].model_num);
 
-	// get start in ship rf
-	vm_vec_sub(&temp, start, &ship_obj->pos);
-	vm_vec_rotate(&rf_start, &temp, &ship_obj->orient);
 
-	// find box_pt
-	int inside = project_point_onto_bbox(&pm->mins, &pm->maxs, &rf_start, &temp);
 
-	// get box_pt in world rf
-	vm_vec_unrotate(box_pt, &temp, &ship_obj->orient);
-	vm_vec_add2(box_pt, &ship_obj->pos);
-
-	return inside;
-}
-
-
 typedef struct eval_nearest_objnum {
 	int	objnum;
 	object *trial_objp;
Index: code/ship/ship.cpp
===================================================================
--- code/ship/ship.cpp	(revision 9370)
+++ code/ship/ship.cpp	(working copy)
@@ -61,6 +61,7 @@
 #include "ship/shipcontrails.h"
 #include "weapon/beam.h"
 #include "math/staticrand.h"
+#include "math/fvi.h"
 #include "missionui/missionshipchoice.h"
 #include "hud/hudartillery.h"
 #include "species_defs/species_defs.h"
@@ -17435,3 +17436,32 @@
 		return true;
 }
 
+/**
+ * Given a ship with bounding box and a point, find the closest point on the bbox
+ *
+ * @param ship_obj Object that has the bounding box (should be a ship)
+ * @param start World position of the point being compared
+ * @param box_pt OUTPUT PARAMETER: closest point on the bbox to start
+ *
+ * @return point is inside bbox, TRUE/1
+ * @return point is outside bbox, FALSE/0
+ */
+int get_nearest_bbox_point(object *ship_obj, vec3d *start, vec3d *box_pt)
+{
+	vec3d temp, rf_start;
+	polymodel *pm;
+	pm = model_get(Ship_info[Ships[ship_obj->instance].ship_info_index].model_num);
+
+	// get start in ship rf
+	vm_vec_sub(&temp, start, &ship_obj->pos);
+	vm_vec_rotate(&rf_start, &temp, &ship_obj->orient);
+
+	// find box_pt
+	int inside = project_point_onto_bbox(&pm->mins, &pm->maxs, &rf_start, &temp);
+
+	// get box_pt in world rf
+	vm_vec_unrotate(box_pt, &temp, &ship_obj->orient);
+	vm_vec_add2(box_pt, &ship_obj->pos);
+
+	return inside;
+}
Index: code/ship/ship.h
===================================================================
--- code/ship/ship.h	(revision 9370)
+++ code/ship/ship.h	(working copy)
@@ -1975,4 +1975,16 @@
  */
 int get_default_player_ship_index();
 
+/**
+ * Given a ship with bounding box and a point, find the closest point on the bbox
+ *
+ * @param ship_obj Object that has the bounding box (should be a ship)
+ * @param start World position of the point being compared
+ * @param box_pt OUTPUT PARAMETER: closest point on the bbox to start
+ *
+ * @return point is inside bbox, TRUE/1
+ * @return point is outside bbox, FALSE/0
+ */
+int get_nearest_bbox_point(object *ship_obj, vec3d *start, vec3d *box_pt);
+
 #endif
