From e531fb31fc008a33b5641118581ed4c7fdad2624 Mon Sep 17 00:00:00 2001 From: Giel van Schijndel Date: Sun, 8 Jul 2007 20:45:01 +0000 Subject: [PATCH] * Remove a futile check for error condition (psBuilding->psStructureType->numFuncs == 0) which can never occur unless errors occur while loading a stats file (and if they do, they should be detected by the code loading that file) * Use calloc instead of malloc followed by memset(0) (calloc both allocates memory; and then sets all of it to zero) * Move a lot of duplicated malloc (calloc now) calls out of the switch statement; and in front of it * Use map_coord and world_coord instead of bitshifting with TILE_SHIFT * Declare and use variables in a more local scope * Take advantage of the fact that FUNCTIONALITY now is a struct by not casting anymore Parts from patch by Freddie Witherden plus changes by me git-svn-id: svn+ssh://svn.gna.org/svn/warzone/trunk@2044 4a71c877-e1ca-e34f-864e-861f7616d084 --- src/structure.c | 264 +++++++++++++++--------------------------------- 1 file changed, 79 insertions(+), 185 deletions(-) diff --git a/src/structure.c b/src/structure.c index b81fbb3f9..fc8f54c92 100644 --- a/src/structure.c +++ b/src/structure.c @@ -1363,7 +1363,7 @@ SDWORD structureDamage(STRUCTURE *psStructure, UDWORD damage, UDWORD weaponClass debug( LOG_ATTACK, " penetrated: %d\n", actualDamage); } - // If the shell did sufficient damage to destroy the structure + // If the shell did sufficient damage to destroy the structure if (actualDamage >= psStructure->body) { debug( LOG_ATTACK, " DESTROYED\n"); @@ -2236,69 +2236,67 @@ STRUCTURE* buildStructure(STRUCTURE_STATS* pStructureType, UDWORD x, UDWORD y, U BOOL setFunctionality(STRUCTURE *psBuilding, UDWORD functionType) { - //SDWORD upgrade; - FACTORY *psFactory; - RESEARCH_FACILITY *psResFac; - POWER_GEN *psPowerGen; - REPAIR_FACILITY *psRepairFac; - REPAIR_DROID_FUNCTION *pFuncRepair; - REARM_PAD *psReArmPad; - UDWORD x, y; - CHECK_STRUCTURE(psBuilding); - psBuilding->pFunctionality = NULL; - switch(functionType) + switch (functionType) { case REF_FACTORY: case REF_CYBORG_FACTORY: case REF_VTOL_FACTORY: - { - //this structure must have a function assigned to the stat - if (psBuilding->pStructureType->numFuncs == 0) - { - debug( LOG_ERROR, "There must be a function assigned to this building - %s", getName( psBuilding->pStructureType->pName ) ); - abort(); - return FALSE; - } + case REF_RESEARCH: + case REF_POWER_GEN: + case REF_RESOURCE_EXTRACTOR: + case REF_REPAIR_FACILITY: + case REF_REARM_PAD: + // Allocate space for the buildings functionality + psBuilding->pFunctionality = calloc(1, sizeof(FUNCTIONALITY)); - //allocate the necessary space - psBuilding->pFunctionality = malloc(sizeof(FUNCTIONALITY)); if (psBuilding->pFunctionality == NULL) { debug(LOG_ERROR, "setFunctionality: Out of memory"); abort(); return FALSE; } + break; - //initialise the memory - memset(psBuilding->pFunctionality, 0, sizeof(FUNCTIONALITY)); + default: + psBuilding->pFunctionality = NULL; + break; + } - psFactory = (FACTORY *)psBuilding->pFunctionality; - psFactory->capacity = (UBYTE)((PRODUCTION_FUNCTION*)psBuilding-> - pStructureType->asFuncList[0])->capacity; - psFactory->productionOutput = (UBYTE)((PRODUCTION_FUNCTION*)psBuilding-> - pStructureType->asFuncList[0])->productionOutput; + switch (functionType) + { + case REF_FACTORY: + case REF_CYBORG_FACTORY: + case REF_VTOL_FACTORY: + { + FACTORY* psFactory = &psBuilding->pFunctionality->factory; + unsigned int x, y; + + psFactory->capacity = (UBYTE) ((PRODUCTION_FUNCTION*)psBuilding->pStructureType->asFuncList[0])->capacity; + psFactory->productionOutput = (UBYTE) ((PRODUCTION_FUNCTION*)psBuilding->pStructureType->asFuncList[0])->productionOutput; psFactory->psSubject = NULL; - //default the secondary order - AB 22/04/99 - psFactory->secondaryOrder = DSS_ARANGE_DEFAULT | DSS_REPLEV_NEVER | - DSS_ALEV_ALWAYS | DSS_HALT_GUARD; - //add the assembly point to the factory + // Default the secondary order - AB 22/04/99 + psFactory->secondaryOrder = DSS_ARANGE_DEFAULT | DSS_REPLEV_NEVER + | DSS_ALEV_ALWAYS | DSS_HALT_GUARD; + + // Create the assembly point for the factory if (!createFlagPosition(&psFactory->psAssemblyPoint, psBuilding->player)) { return FALSE; } - //initialise the assembly point position - x = (psBuilding->x+256) >> TILE_SHIFT; - y = (psBuilding->y+256) >> TILE_SHIFT; - // Belt and braces - shouldn't be able to build too near edge - setAssemblyPoint( psFactory->psAssemblyPoint, x << TILE_SHIFT, - y << TILE_SHIFT, psBuilding->player, TRUE); - // add it to the list + // initialise the assembly point position + x = map_coord(psBuilding->x + 256); + y = map_coord(psBuilding->y + 256); + + // Set the assembly point + setAssemblyPoint(psFactory->psAssemblyPoint, world_coord(x), world_coord(y), psBuilding->player, TRUE); + + // Add the flag to the list addFlagPosition(psFactory->psAssemblyPoint); - switch(functionType) + switch (functionType) { case REF_FACTORY: setFlagPositionInc(psFactory, psBuilding->player, FACTORY_FLAG); @@ -2314,207 +2312,103 @@ BOOL setFunctionality(STRUCTURE *psBuilding, UDWORD functionType) } psFactory->psFormation = NULL; + + // Take advantage of upgrades structureProductionUpgrade(psBuilding); break; } case REF_RESEARCH: { - //this structure must have a function assigned to the stat - if (psBuilding->pStructureType->numFuncs == 0) - { - debug( LOG_ERROR, "There must be a function assigned to this building - %s", getName( psBuilding->pStructureType->pName ) ); - abort(); - return FALSE; - } - //try and create the Structure - psBuilding->pFunctionality = malloc(sizeof(FUNCTIONALITY)); - if (psBuilding->pFunctionality == NULL) - { - debug(LOG_ERROR, "setFunctionality: Out of memory"); - abort(); - return FALSE; - } - //initialise the memory - memset(psBuilding->pFunctionality, 0, sizeof(FUNCTIONALITY)); + RESEARCH_FACILITY* psResFac = &psBuilding->pFunctionality->researchFacility; - psResFac = (RESEARCH_FACILITY *)psBuilding->pFunctionality; - psResFac->researchPoints = ((RESEARCH_FUNCTION*)psBuilding-> - pStructureType->asFuncList[0])->researchPoints; - //check for upgrades - work backwards since want the most recent + psResFac->researchPoints = ((RESEARCH_FUNCTION *) psBuilding->pStructureType->asFuncList[0])->researchPoints; + + // Take advantage of upgrades structureResearchUpgrade(psBuilding); break; } case REF_POWER_GEN: { - //this structure must have a function assigned to the stat - if (psBuilding->pStructureType->numFuncs == 0) - { - debug( LOG_ERROR, "There must be a function assigned to this building - %s", getName( psBuilding->pStructureType->pName ) ); - abort(); - return FALSE; - } + POWER_GEN* psPowerGen = &psBuilding->pFunctionality->powerGenerator; - //try and create the Structure - psBuilding->pFunctionality = malloc(sizeof(FUNCTIONALITY)); - if (psBuilding->pFunctionality == NULL) - { - debug(LOG_ERROR, "setFunctionality: Out of memory"); - abort(); - return FALSE; - } - - //initialise the memory - memset(psBuilding->pFunctionality, 0, sizeof(FUNCTIONALITY)); - - psPowerGen = (POWER_GEN *)psBuilding->pFunctionality; - psPowerGen->power = ((POWER_GEN_FUNCTION*)psBuilding-> - pStructureType->asFuncList[0])->powerOutput; - psPowerGen->multiplier = ((POWER_GEN_FUNCTION*)psBuilding-> - pStructureType->asFuncList[0])->powerMultiplier; + psPowerGen->power = ((POWER_GEN_FUNCTION *) psBuilding->pStructureType->asFuncList[0])->powerOutput; + psPowerGen->multiplier = ((POWER_GEN_FUNCTION *) psBuilding->pStructureType->asFuncList[0])->powerMultiplier; psPowerGen->capacity = 0; - //check for upgrades + + // Take advantage of upgrades structurePowerUpgrade(psBuilding); break; } case REF_RESOURCE_EXTRACTOR: { - //this structure must have a function assigned to the stat - if (psBuilding->pStructureType->numFuncs == 0) - { - debug( LOG_ERROR, "There must be a function assigned to this building - %s", getName( psBuilding->pStructureType->pName ) ); - abort(); - return FALSE; - } + RES_EXTRACTOR* psResExtracter = &psBuilding->pFunctionality->resourceExtractor; - //try and create the Structure - psBuilding->pFunctionality = malloc(sizeof(FUNCTIONALITY)); - if (psBuilding->pFunctionality == NULL) - { - debug(LOG_ERROR, "setFunctionality: Out of memory"); - abort(); - return FALSE; - } - //initialise the memory - memset(psBuilding->pFunctionality, 0, sizeof(FUNCTIONALITY)); + psResExtracter->power = ((RESOURCE_FUNCTION*)psBuilding->pStructureType->asFuncList[0])->maxPower; - ((RES_EXTRACTOR*)psBuilding->pFunctionality)->power = (( - //POWER_REG_FUNCTION*)psBuilding->pStructureType->asFuncList[0])-> - RESOURCE_FUNCTION*)psBuilding->pStructureType->asFuncList[0])-> - maxPower; - - //set the structure to inactive - ((RES_EXTRACTOR*)psBuilding->pFunctionality)->active = FALSE; - ((RES_EXTRACTOR*)psBuilding->pFunctionality)->psPowerGen = NULL; + // Make the structure inactive + psResExtracter->active = FALSE; + psResExtracter->psPowerGen = NULL; break; } - //this just checks that a function has been assigned case REF_HQ: { + // If an HQ has just been built make sure the radar is displayed! radarOnScreen = TRUE; - //this structure must have a function assigned to the stat - if (psBuilding->pStructureType->numFuncs == 0) - { - debug( LOG_ERROR, "There must be a function assigned to this building - %s", getName( psBuilding->pStructureType->pName ) ); - abort(); - return FALSE; - } - //this function is called once the structure has been built - break; - } - case REF_WALL: - { - //this structure must have a function assigned to the stat - this is just a check! - if (psBuilding->pStructureType->numFuncs == 0) - { - debug( LOG_ERROR, "There must be a function assigned to this building - %s", getName( psBuilding->pStructureType->pName ) ); - abort(); - return FALSE; - } break; } case REF_REPAIR_FACILITY: { - //this structure must have a function assigned to the stat - if (psBuilding->pStructureType->numFuncs == 0) - { - debug( LOG_ERROR, "There must be a function assigned to this building - %s", getName( psBuilding->pStructureType->pName ) ); - abort(); - return FALSE; - } + REPAIR_FACILITY* psRepairFac = &psBuilding->pFunctionality->repairFacility; + REPAIR_DROID_FUNCTION* pFuncRepair = (REPAIR_DROID_FUNCTION*)psBuilding->pStructureType->asFuncList[0]; + unsigned int x, y; - //try and create the Structure - psBuilding->pFunctionality = malloc(sizeof(FUNCTIONALITY)); - if (psBuilding->pFunctionality == NULL) - { - debug(LOG_ERROR, "setFunctionality: Out of memory"); - abort(); - return FALSE; - } - //initialise the memory - memset(psBuilding->pFunctionality, 0, sizeof(FUNCTIONALITY)); - - psRepairFac = (REPAIR_FACILITY *) psBuilding->pFunctionality; - pFuncRepair = (REPAIR_DROID_FUNCTION *) psBuilding->pStructureType->asFuncList[0]; psRepairFac->power = pFuncRepair->repairPoints; psRepairFac->psObj = NULL; - if ( !grpCreate(&((REPAIR_FACILITY *) psBuilding->pFunctionality)->psGroup) ) + if (!grpCreate(&((REPAIR_FACILITY*)psBuilding->pFunctionality)->psGroup)) { debug( LOG_NEVER, "setFunctionality: couldn't create repair facility group" ); } else { - /* add null droid */ - grpJoin( psRepairFac->psGroup, NULL ); + // Add NULL droid to the group + grpJoin(psRepairFac->psGroup, NULL); } - //check for upgrades + + // Take advantage of upgrades structureRepairUpgrade(psBuilding); - // add an assembly point + // Create an assembly point for repaired droids if (!createFlagPosition(&psRepairFac->psDeliveryPoint, psBuilding->player)) { return FALSE; } - //initialise the assembly point position - x = (psBuilding->x+256) >> TILE_SHIFT; - y = (psBuilding->y+256) >> TILE_SHIFT; - // Belt and braces - shouldn't be able to build too near edge - setAssemblyPoint( psRepairFac->psDeliveryPoint, x << TILE_SHIFT, - y << TILE_SHIFT, psBuilding->player, TRUE); + // Initialise the assembly point + x = map_coord(psBuilding->x+256); + y = map_coord(psBuilding->y+256); + // Set the assembly point + setAssemblyPoint(psRepairFac->psDeliveryPoint, world_coord(x), + world_coord(y), psBuilding->player, TRUE); + + // Add the flag (triangular marker on the ground) at the delivery point addFlagPosition(psRepairFac->psDeliveryPoint); setFlagPositionInc(psRepairFac, psBuilding->player, REPAIR_FLAG); break; } case REF_REARM_PAD: { - //this structure must have a function assigned to the stat - if (psBuilding->pStructureType->numFuncs == 0) - { - debug( LOG_ERROR, "There must be a function assigned to this building - %s", getName( psBuilding->pStructureType->pName ) ); - abort(); - return FALSE; - } - //try and create the Structure - psBuilding->pFunctionality = malloc(sizeof(FUNCTIONALITY)); - if (psBuilding->pFunctionality == NULL) - { - debug(LOG_ERROR, "setFunctionality: Out of memory"); - abort(); - return FALSE; - } - //initialise the memory - memset(psBuilding->pFunctionality, 0, sizeof(FUNCTIONALITY)); + REARM_PAD* psReArmPad = &psBuilding->pFunctionality->rearmPad; - psReArmPad = (REARM_PAD *)psBuilding->pFunctionality; - psReArmPad->reArmPoints = ((REARM_PAD *)psBuilding-> - pStructureType->asFuncList[0])->reArmPoints; - //check for upgrades + psReArmPad->reArmPoints = ((REARM_PAD *)psBuilding->pStructureType->asFuncList[0])->reArmPoints; + + // Take advantage of upgrades structureReArmUpgrade(psBuilding); break; } - }//end of switch + } + return TRUE; }