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