(svn r6464) -Fix r6393: killed a warning when compiling without asserts
authorbjarni
Sat, 16 Sep 2006 16:21:47 +0000
changeset 4611 bb035900cae5
parent 4610 45ac1d25fd62
child 4612 12b0b94205f5
(svn r6464) -Fix r6393: killed a warning when compiling without asserts
added an error popup in the game if autoreplace fails to refit
Since it's only triggered by conditions bugs can trigger, it works kind of like a non-fatal assert in builds without asserts
lang/english.txt
vehicle.c
--- a/lang/english.txt	Sat Sep 16 13:44:12 2006 +0000
+++ b/lang/english.txt	Sat Sep 16 16:21:47 2006 +0000
@@ -2906,6 +2906,8 @@
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Replacing: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} EXPERIMENTAL FEATURE {}Switch between engine and wagon replacement windows.{}Wagon replacement will only be done if the new wagon can be refitted into carrying the same type of cargo as the old one. This is checked for each wagon when the actual replacement takes place.
 STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Engine is not buildable
+STR_AUTOREPLACE_FAILED                                          :{WHITE}BUG: Autoreplace refit failure
+STR_AUTOREPLACE_REFIT_FAILURE                                   :{WHITE}{STRING} replaced into {STRING} failed to refit to {STRING}
 
 STR_ENGINES                                                     :Engines
 STR_WAGONS                                                      :Wagons
--- a/vehicle.c	Sat Sep 16 13:44:12 2006 +0000
+++ b/vehicle.c	Sat Sep 16 16:21:47 2006 +0000
@@ -1778,9 +1778,18 @@
 
 		/* refit if needed */
 		if (replacement_cargo_type != CT_NO_REFIT) {
-			int32 temp_cost = DoCommand(0, new_v->index, replacement_cargo_type, DC_EXEC, CMD_REFIT_VEH(new_v->type));
-			assert(!CmdFailed(temp_cost)); // assert failure here indicates a bug in GetNewCargoTypeForReplace()
+			if (CmdFailed(DoCommand(0, new_v->index, replacement_cargo_type, DC_EXEC, CMD_REFIT_VEH(new_v->type)))) {
+				/* We should not be here
+				 * being here shows a failure indicates a bug in GetNewCargoTypeForReplace() or incorrect estimation costs */
+				SetDParam(0, GetCustomEngineName(old_v->engine_type));
+				SetDParam(1, GetCustomEngineName(new_v->engine_type));
+				SetDParam(2, _cargoc.names_s[replacement_cargo_type]);
+				ShowInfo("Error: Autoreplace failed to refit (bug)");
+				ShowErrorMessage(STR_AUTOREPLACE_REFIT_FAILURE, STR_AUTOREPLACE_FAILED, 0 ,0);
+				NOT_REACHED(); // stop debug builds at this error for easier debugging
+			}
 		}
+
 		if (new_v->type == VEH_Train && HASBIT(old_v->u.rail.flags, VRF_REVERSE_DIRECTION) && !IsMultiheaded(new_v) && !(new_v->next != NULL && IsArticulatedPart(new_v->next))) {
 			// we are autorenewing to a single engine, so we will turn it as the old one was turned as well
 			SETBIT(new_v->u.rail.flags, VRF_REVERSE_DIRECTION);