Index: code/ship/ship.cpp
===================================================================
--- code/ship/ship.cpp	(revision 9385)
+++ code/ship/ship.cpp	(working copy)
@@ -8972,32 +8972,37 @@
 
 
 	// Goober5000 - maintain the original hull, shield, and subsystem percentages... gah
+	// ...except when in FRED, because this stuff is handled in the missionparse/missionsave part. The E
 
-	// hull
-	if (sp->special_hitpoints) {
-		hull_pct = objp->hull_strength / sp->ship_max_hull_strength; 
-	} else {
-		Assert( Ship_info[sp->ship_info_index].max_hull_strength > 0.0f );
-		hull_pct = objp->hull_strength / Ship_info[sp->ship_info_index].max_hull_strength;
-	}
+	if (!Fred_running) {
+		// hull
+		if (sp->special_hitpoints) {
+			hull_pct = objp->hull_strength / sp->ship_max_hull_strength; 
+		} else {
+			Assert( Ship_info[sp->ship_info_index].max_hull_strength > 0.0f );
+			hull_pct = objp->hull_strength / Ship_info[sp->ship_info_index].max_hull_strength;
+		}
 
-	// extra check
-	Assert(hull_pct > 0.0f && hull_pct <= 1.0f);
-    CLAMP(hull_pct, 0.1f, 1.0f);
+		// extra check
+		Assert(hull_pct > 0.0f && hull_pct <= 1.0f);
+		CLAMP(hull_pct, 0.1f, 1.0f);
 
-	// shield
-	if (sp->special_shield > 0) {
-		shield_pct = shield_get_strength(objp) / sp->ship_max_shield_strength;
-	} else if (Ship_info[sp->ship_info_index].max_shield_strength > 0.0f) {
-		shield_pct = shield_get_strength(objp) / Ship_info[sp->ship_info_index].max_shield_strength;
+		// shield
+		if (sp->special_shield > 0) {
+			shield_pct = shield_get_strength(objp) / sp->ship_max_shield_strength;
+		} else if (Ship_info[sp->ship_info_index].max_shield_strength > 0.0f) {
+			shield_pct = shield_get_strength(objp) / Ship_info[sp->ship_info_index].max_shield_strength;
+		} else {
+			shield_pct = 0.0f;
+		}
+
+		// extra check
+		Assert(shield_pct >= 0.0f && shield_pct <= 1.0f);
+		CLAMP(shield_pct, 0.0f, 1.0f);
 	} else {
-		shield_pct = 0.0f;
+		shield_pct = hull_pct = 1.0f;
 	}
 
-	// extra check
-	Assert(shield_pct >= 0.0f && shield_pct <= 1.0f);
-    CLAMP(shield_pct, 0.0f, 1.0f);
-
 	// subsystems
 	int num_saved_subsystems = 0;
 	char **subsys_names = new char *[sip_orig->n_subsystems];
