I know I only posted it only 4 days ago, but I really sleep better when I know my patches have been applied. Could someone apply this patch? I even polished it a little bit more.

This patch prevents a segfault when designing a droid on amd64.
Reproduce: on amd64, go to the droid design screen and design a construction droid. Then hover your mouse over another system, like sensor or command.

Regards,

Gerard
Index: src/design.c
===================================================================
--- src/design.c	(revision 747)
+++ src/design.c	(working copy)
@@ -3612,13 +3612,43 @@
 static void intSetTemplatePowerShadowStats(COMP_BASE_STATS *psStats)
 {
 	UDWORD				type;
-	//SDWORD				Avail, Used, Total;
-	DROID_TEMPLATE		compTempl;
 
-	if (&sCurrDesign != NULL && psStats != NULL)
-	{
-		//create the comparison Template
-		memcpy(&compTempl, &sCurrDesign, sizeof(DROID_TEMPLATE));
+	if (psStats != NULL) {
+        BODY_STATS* bodyStats = asBodyStats + sCurrDesign.asParts[COMP_BODY];
+        BRAIN_STATS* brainStats = asBrainStats + sCurrDesign.asParts[COMP_BRAIN];
+        SENSOR_STATS* sensorStats = asSensorStats + sCurrDesign.asParts[COMP_SENSOR];
+        ECM_STATS* ECMStats = asECMStats + sCurrDesign.asParts[COMP_ECM];
+        REPAIR_STATS* repairStats = asRepairStats + sCurrDesign.asParts[COMP_REPAIRUNIT];
+        CONSTRUCT_STATS* constructStats = asConstructStats + sCurrDesign.asParts[COMP_CONSTRUCT];
+        PROPULSION_STATS* propulsionStats = asPropulsionStats + sCurrDesign.asParts[COMP_PROPULSION];
+        WEAPON_STATS* weaponStats = asWeaponStats + sCurrDesign.asWeaps[0];
+		switch (type)
+		{
+		case COMP_BODY:
+			bodyStats = (BODY_STATS*)psStats;
+			break;
+		case COMP_PROPULSION:
+			propulsionStats = (PROPULSION_STATS*)psStats;
+			break;
+		case COMP_ECM:
+			ECMStats = (ECM_STATS*)psStats;
+			break;
+		case COMP_SENSOR:
+			sensorStats = (SENSOR_STATS*)psStats;
+			break;
+		case COMP_CONSTRUCT:
+			constructStats = (CONSTRUCT_STATS*)psStats;
+			break;
+		case COMP_REPAIRUNIT:
+			repairStats = (REPAIR_STATS*)psStats;
+			break;
+		case COMP_WEAPON:
+			weaponStats = (WEAPON_STATS*)psStats;
+			break;
+		//default:
+			//don't want to draw for unknown comp
+		}
+
 		type = statType(psStats->ref);
 		/*if type = BODY or PROPULSION can do a straight comparison but if the new stat is
 		a 'system' stat then need to find out which 'system' is currently in place so the
@@ -3648,43 +3678,56 @@
 			}
 			else
 			{
-				type = COMP_UNKNOWN;
+			    // compare it with the current weapon
+				type = COMP_WEAPON;
 			}
 		}
 
 		switch (type)
 		{
 		case COMP_BODY:
-			compTempl.asParts[COMP_BODY] = (BODY_STATS *)psStats - asBodyStats;
+			bodyStats = (BODY_STATS*)psStats;
 			break;
 		case COMP_PROPULSION:
-			compTempl.asParts[COMP_PROPULSION] = (PROPULSION_STATS *)psStats -
-				asPropulsionStats;
+			propulsionStats = (PROPULSION_STATS*)psStats;
 			break;
 		case COMP_ECM:
-			compTempl.asParts[COMP_ECM] = (ECM_STATS *)psStats - asECMStats;
+			ECMStats = (ECM_STATS*)psStats;
 			break;
 		case COMP_SENSOR:
-			compTempl.asParts[COMP_SENSOR] = (SENSOR_STATS *)psStats -
-				asSensorStats;
+			sensorStats = (SENSOR_STATS*)psStats;
 			break;
 		case COMP_CONSTRUCT:
-			compTempl.asParts[COMP_CONSTRUCT] = (CONSTRUCT_STATS *)psStats -
-				asConstructStats;
+			constructStats = (CONSTRUCT_STATS*)psStats;
 			break;
 		case COMP_REPAIRUNIT:
-			compTempl.asParts[COMP_REPAIRUNIT] = (REPAIR_STATS *)psStats -
-				asRepairStats;
+			repairStats = (REPAIR_STATS*)psStats;
 			break;
 		case COMP_WEAPON:
-			compTempl.asWeaps[0] = (WEAPON_STATS *)psStats - asWeaponStats;
+			weaponStats = (WEAPON_STATS*)psStats;
 			break;
 		//default:
 			//don't want to draw for unknown comp
 		}
+		// this code is from calcTemplatePower
+    	UDWORD power, i;
 
-		widgSetMinorBarSize( psWScreen, IDDES_POWERBAR,
-								calcTemplatePower(&compTempl));
+    	//get the component power
+    	power = bodyStats->buildPower + brainStats->buildPower + sensorStats->buildPower + ECMStats->buildPower + repairStats->buildPower + constructStats->buildPower;
+
+    	/* propulsion power points are a percentage of the bodys' power points */
+    	power += (propulsionStats->buildPower *
+    		bodyStats->buildPower) / 100;
+    		
+     	//add weapon power
+        // FIXME: Only takes first weapon into account
+        power += weaponStats->buildPower;
+    	for(i=1; i<sCurrDesign.numWeaps; i++)
+    	{
+    		power += (asWeaponStats + sCurrDesign.asWeaps[i])->buildPower;
+    	}
+   		widgSetMinorBarSize( psWScreen, IDDES_POWERBAR,
+								power);
 	}
 	else
 	{
@@ -3705,12 +3748,18 @@
 static void intSetTemplateBodyShadowStats(COMP_BASE_STATS *psStats)
 {
 	UDWORD				type;
-	DROID_TEMPLATE		compTempl;
 
-	if (&sCurrDesign != NULL && psStats != NULL)
-	{
-		//create the comparison Template
-		memcpy(&compTempl, &sCurrDesign, sizeof(DROID_TEMPLATE));
+	if (psStats != NULL) {
+        BODY_STATS* bodyStats = asBodyStats + sCurrDesign.asParts[COMP_BODY];
+        BRAIN_STATS* brainStats = asBrainStats + sCurrDesign.asParts[COMP_BRAIN];
+        SENSOR_STATS* sensorStats = asSensorStats + sCurrDesign.asParts[COMP_SENSOR];
+        ECM_STATS* ECMStats = asECMStats + sCurrDesign.asParts[COMP_ECM];
+        REPAIR_STATS* repairStats = asRepairStats + sCurrDesign.asParts[COMP_REPAIRUNIT];
+        CONSTRUCT_STATS* constructStats = asConstructStats + sCurrDesign.asParts[COMP_CONSTRUCT];
+        PROPULSION_STATS* propulsionStats = asPropulsionStats + sCurrDesign.asParts[COMP_PROPULSION];
+        WEAPON_STATS* weaponStats = asWeaponStats + sCurrDesign.asWeaps[0];
+
+
 		type = statType(psStats->ref);
 		/*if type = BODY or PROPULSION can do a straight comparison but if the new stat is
 		a 'system' stat then need to find out which 'system' is currently in place so the
@@ -3740,44 +3789,57 @@
 			}
 			else
 			{
-				type = COMP_UNKNOWN;
+			    // compare it with the current weapon
+				type = COMP_WEAPON;
 			}
 		}
 
 		switch (type)
 		{
 		case COMP_BODY:
-			compTempl.asParts[COMP_BODY] = (BODY_STATS *)psStats - asBodyStats;
+			bodyStats = (BODY_STATS*)psStats;
 			break;
 		case COMP_PROPULSION:
-			compTempl.asParts[COMP_PROPULSION] = (PROPULSION_STATS *)psStats -
-				asPropulsionStats;
+			propulsionStats = (PROPULSION_STATS*)psStats;
 			break;
 		case COMP_ECM:
-			compTempl.asParts[COMP_ECM] = (ECM_STATS *)psStats - asECMStats;
+			ECMStats = (ECM_STATS*)psStats;
 			break;
 		case COMP_SENSOR:
-			compTempl.asParts[COMP_SENSOR] = (SENSOR_STATS *)psStats -
-				asSensorStats;
+			sensorStats = (SENSOR_STATS*)psStats;
 			break;
 		case COMP_CONSTRUCT:
-			compTempl.asParts[COMP_CONSTRUCT] = (CONSTRUCT_STATS *)psStats -
-				asConstructStats;
+			constructStats = (CONSTRUCT_STATS*)psStats;
 			break;
 		case COMP_REPAIRUNIT:
-			compTempl.asParts[COMP_REPAIRUNIT] = (REPAIR_STATS *)psStats -
-				asRepairStats;
+			repairStats = (REPAIR_STATS*)psStats;
 			break;
 		case COMP_WEAPON:
-//			compTempl.asWeaps[COMP_WEAPON] = (WEAPON_STATS *)psStats - asWeaponStats;
-			compTempl.asWeaps[0] = (WEAPON_STATS *)psStats - asWeaponStats;
+			weaponStats = (WEAPON_STATS*)psStats;
 			break;
 		//default:
 			//don't want to draw for unknown comp
 		}
+	    // this code is from calcTemplateBody
+    	UDWORD body, i;
 
-		widgSetMinorBarSize( psWScreen, IDDES_BODYPOINTS,
-								calcTemplateBody(&compTempl, (UBYTE)selectedPlayer));
+    	//get the component power
+    	body = bodyStats->body + brainStats->body + sensorStats->body + ECMStats->body + repairStats->body + constructStats->body;
+
+    	/* propulsion power points are a percentage of the bodys' power points */
+    	body += (propulsionStats->body *
+    		bodyStats->body) / 100;
+    		
+     	//add weapon power
+        // FIXME: Only takes first weapon into account
+        body += weaponStats->body;
+    	for(i=1; i<sCurrDesign.numWeaps; i++)
+    	{
+    		body += (asWeaponStats + sCurrDesign.asWeaps[i])->body;
+    	}
+    	body += (body * asBodyUpgrade[selectedPlayer]->body / 100);
+   		widgSetMinorBarSize( psWScreen, IDDES_BODYPOINTS,
+								body);
 	}
 	else
 	{
_______________________________________________
Warzone-dev mailing list
Warzone-dev@gna.org
https://mail.gna.org/listinfo/warzone-dev

Reply via email to