Index: code/ship/shiphit.cpp
===================================================================
--- code/ship/shiphit.cpp	(revision 4558)
+++ code/ship/shiphit.cpp	(working copy)
@@ -1285,11 +1285,14 @@
 				damage_to_apply = Armor_types[subsys->system_info->armor_type_idx].GetDamage(damage_to_apply, dmg_type_idx);
 			}
 
+			// if this subsystem doesn't carry damage then subtract it off of our total return
+			if (subsys->system_info->flags & MSS_FLAG_CARRY_NO_DAMAGE) {
+				damage -= MIN(subsys->current_hits, damage_to_apply);
+			}
+
 			subsys->current_hits -= damage_to_apply;
 			ship_p->subsys_info[subsys->system_info->type].current_hits -= damage_to_apply;
 
-			
-
 			if (subsys->current_hits < 0.0f) {
 				damage_left -= subsys->current_hits;
 				ship_p->subsys_info[subsys->system_info->type].current_hits -= subsys->current_hits;
@@ -1313,17 +1316,14 @@
 //nprintf(("AI", "j=%i, sys = %s, dam = %6.1f, dam left = %6.1f, subhits = %5.0f\n", j, subsys->system_info->name, damage_to_apply, damage_left, subsys->current_hits));
 	}
 
+	if (damage < 0.0f) {
+		damage = 0.0f;
+	}
+
 	//	Note: I changed this to return damage_left and it completely screwed up balance.
 	//	It had taken a few MX-50s to destory an Anubis (with 40% hull), then it took maybe ten.
 	//	So, I left it alone. -- MK, 4/15/98
-	//WMC - MK, whoever you are, thank you for that comment.
-	if(count)
-	{
-		if(subsys_list[0].ptr->system_info->flags & MSS_FLAG_CARRY_NO_DAMAGE)
-		{
-			return damage_left;
-		}
-	}
+
 	return damage;
 }
 
@@ -2471,9 +2471,6 @@
 	shipp = &Ships[ship_obj->instance];
 	ship_info* sip = &Ship_info[shipp->ship_info_index];
 
-	// maybe adjust damage done by shockwave for BIG|HUGE
-	maybe_shockwave_damage_adjust(ship_obj, other_obj, &damage);
-
 	// Goober5000 - check to see what other_obj is
 	if (other_obj)
 	{
@@ -2494,15 +2491,18 @@
 		other_obj_is_ship = 0;
 	}
 
+	// maybe do some damage scaling based on whether it's a weapon or shockwave
+	if (other_obj_is_shockwave) {
+		maybe_shockwave_damage_adjust(ship_obj, other_obj, &damage);
+	} else if (other_obj_is_weapon) {
+		damage *= weapon_get_damage_scale(&Weapon_info[Weapons[other_obj->instance].weapon_info_index], other_obj, ship_obj);
+	}
+
 	// update lethality of ship doing damage - modified by Goober5000
 	if (other_obj_is_weapon || other_obj_is_shockwave) {
 		ai_update_lethality(ship_obj, other_obj, damage);
 	}
 
-	// if this is a weapon
-	if (other_obj_is_weapon)
-		damage *= weapon_get_damage_scale(&Weapon_info[Weapons[other_obj->instance].weapon_info_index], other_obj, ship_obj);
-
 	MONITOR_INC( ShipHits, 1 );
 
 	//	Don't damage player ship in the process of warping out.
