Use the unique, untranslated pName to identify templates, not anything else. (This would create trouble with translations.) Fixes bug #11345.

Cleanup loadDroidTemplates and loadDroidWeapons.


git-svn-id: svn+ssh://svn.gna.org/svn/warzone/trunk@4238 4a71c877-e1ca-e34f-864e-861f7616d084
master
Dennis Schridde 2008-03-23 13:17:30 +00:00
parent 6aa9b6fa35
commit 57afe59782
6 changed files with 183 additions and 228 deletions

View File

@ -2077,61 +2077,42 @@ BOOL droidUpdateDroidRepair(DROID *psRepairDroid)
/* load the Droid stats for the components from the Access database */ /* load the Droid stats for the components from the Access database */
BOOL loadDroidTemplates(const char *pDroidData, UDWORD bufferSize) BOOL loadDroidTemplates(const char *pDroidData, UDWORD bufferSize)
{ {
const char *pStartDroidData; unsigned int NumDroids = numCR(pDroidData, bufferSize), line;
int cnt;
UDWORD NumDroids = 0, i, player;
char componentName[MAX_STR_LENGTH];
BOOL found = FALSE; //,EndOfFile;
DROID_TEMPLATE *pDroidDesign;
COMP_BASE_STATS *pStats;
UDWORD size, inc, templateID;
BOOL bDefaultTemplateFound = FALSE; BOOL bDefaultTemplateFound = FALSE;
UDWORD id;
/* init default template */ /* init default template */
memset( &sDefaultDesignTemplate, 0, sizeof(DROID_TEMPLATE) ); memset( &sDefaultDesignTemplate, 0, sizeof(DROID_TEMPLATE) );
pStartDroidData = pDroidData; for (line = 0; line < NumDroids; line++)
NumDroids = numCR(pDroidData, bufferSize);
for (i=0; i < NumDroids; i++)
{ {
pDroidDesign = malloc(sizeof(DROID_TEMPLATE)); char componentName[MAX_STR_LENGTH];
unsigned int cnt, player;
DROID_TEMPLATE *pDroidDesign = malloc(sizeof(DROID_TEMPLATE));
if (pDroidDesign == NULL) if (pDroidDesign == NULL)
{ {
debug(LOG_ERROR, "loadDroidTemplates: Out of memory"); debug(LOG_ERROR, "loadDroidTemplates: pDroidDesign: Out of memory");
return FALSE; return FALSE;
} }
memset(pDroidDesign, 0, sizeof(DROID_TEMPLATE)); memset(pDroidDesign, 0, sizeof(DROID_TEMPLATE));
pDroidDesign->pName = NULL;
//read the data into the storage - the data is delimited using comma's //read the data into the storage - the data is delimited using comma's
componentName[0] = '\0'; sscanf(pDroidData, "%[^','],%d,%n", componentName, &pDroidDesign->multiPlayerID, &cnt);
sscanf(pDroidData, "%[^','],%d,%n", componentName, &templateID, &cnt);
pDroidData += cnt; pDroidData += cnt;
/*ALWAYS get the name associated with the resource for PC regardless // Store unique name in pName
of STORE_RESOURCE_ID or RESOURCE_NAMES! - 25/06/98 AB*/ pDroidDesign->pName = strdup(componentName);
if (!strresGetIDNum(psStringRes, componentName, &id))
// Store translated name in aName
if (!getDroidResourceName(componentName))
{ {
debug(LOG_ERROR, "Unable to find string resource for %s", componentName);
return FALSE; return FALSE;
} }
strlcpy(pDroidDesign->aName, componentName, sizeof(pDroidDesign->aName));
//get the string from the id and copy into the Name space
strlcpy(pDroidDesign->aName, strresGetString(psStringRes, id), sizeof(pDroidDesign->aName));
//store the unique template id
pDroidDesign->multiPlayerID = templateID;
//read in Body Name //read in Body Name
componentName[0] = '\0';
sscanf(pDroidData, "%[^','],%n", componentName, &cnt); sscanf(pDroidData, "%[^','],%n", componentName, &cnt);
pDroidData += cnt; pDroidData += cnt;
found = FALSE;
//get the Body stats pointer //get the Body stats pointer
if (!strcmp(componentName,"0")) if (!strcmp(componentName,"0"))
{ {
@ -2139,8 +2120,11 @@ BOOL loadDroidTemplates(const char *pDroidData, UDWORD bufferSize)
} }
else else
{ {
pStats = (COMP_BASE_STATS *)asBodyStats; COMP_BASE_STATS *pStats = (COMP_BASE_STATS *)asBodyStats;
size = sizeof(BODY_STATS); unsigned int size = sizeof(BODY_STATS);
unsigned int inc = 0;
BOOL found = FALSE;
if (!getResourceName(componentName)) if (!getResourceName(componentName))
{ {
return FALSE; return FALSE;
@ -2166,8 +2150,6 @@ BOOL loadDroidTemplates(const char *pDroidData, UDWORD bufferSize)
} }
//read in Brain Name //read in Brain Name
found = FALSE;
componentName[0] = '\0';
sscanf(pDroidData, "%[^','],%n", componentName, &cnt); sscanf(pDroidData, "%[^','],%n", componentName, &cnt);
pDroidData += cnt; pDroidData += cnt;
@ -2178,8 +2160,11 @@ BOOL loadDroidTemplates(const char *pDroidData, UDWORD bufferSize)
} }
else else
{ {
pStats = (COMP_BASE_STATS *)asBrainStats; COMP_BASE_STATS *pStats = (COMP_BASE_STATS *)asBrainStats;
size = sizeof(BRAIN_STATS); unsigned int size = sizeof(BRAIN_STATS);
unsigned int inc = 0;
BOOL found = FALSE;
if (!getResourceName(componentName)) if (!getResourceName(componentName))
{ {
return FALSE; return FALSE;
@ -2206,8 +2191,6 @@ BOOL loadDroidTemplates(const char *pDroidData, UDWORD bufferSize)
} }
//read in Construct Name //read in Construct Name
found = FALSE;
componentName[0] = '\0';
sscanf(pDroidData, "%[^','],%n", componentName, &cnt); sscanf(pDroidData, "%[^','],%n", componentName, &cnt);
pDroidData += cnt; pDroidData += cnt;
@ -2218,8 +2201,11 @@ BOOL loadDroidTemplates(const char *pDroidData, UDWORD bufferSize)
} }
else else
{ {
pStats = (COMP_BASE_STATS *)asConstructStats; COMP_BASE_STATS *pStats = (COMP_BASE_STATS *)asConstructStats;
size = sizeof(CONSTRUCT_STATS); unsigned int size = sizeof(CONSTRUCT_STATS);
unsigned int inc = 0;
BOOL found = FALSE;
if (!getResourceName(componentName)) if (!getResourceName(componentName))
{ {
return FALSE; return FALSE;
@ -2244,8 +2230,6 @@ BOOL loadDroidTemplates(const char *pDroidData, UDWORD bufferSize)
} }
//read in Ecm Name //read in Ecm Name
found = FALSE;
componentName[0] = '\0';
sscanf(pDroidData, "%[^','],%n", componentName, &cnt); sscanf(pDroidData, "%[^','],%n", componentName, &cnt);
pDroidData += cnt; pDroidData += cnt;
@ -2256,8 +2240,11 @@ BOOL loadDroidTemplates(const char *pDroidData, UDWORD bufferSize)
} }
else else
{ {
pStats = (COMP_BASE_STATS *)asECMStats; COMP_BASE_STATS *pStats = (COMP_BASE_STATS *)asECMStats;
size = sizeof(ECM_STATS); unsigned int size = sizeof(ECM_STATS);
unsigned int inc = 0;
BOOL found = FALSE;
if (!getResourceName(componentName)) if (!getResourceName(componentName))
{ {
return FALSE; return FALSE;
@ -2285,9 +2272,14 @@ BOOL loadDroidTemplates(const char *pDroidData, UDWORD bufferSize)
sscanf(pDroidData, "%d,%n", &player,&cnt); sscanf(pDroidData, "%d,%n", &player,&cnt);
pDroidData += cnt; pDroidData += cnt;
if (getTemplateFromUniqueName(pDroidDesign->pName, player))
{
debug( LOG_ERROR, "Duplicate template %s", pDroidDesign->pName );
abort();
return FALSE;
}
//read in Propulsion Name //read in Propulsion Name
found = FALSE;
componentName[0] = '\0';
sscanf(pDroidData, "%[^','],%n", componentName, &cnt); sscanf(pDroidData, "%[^','],%n", componentName, &cnt);
pDroidData += cnt; pDroidData += cnt;
@ -2298,8 +2290,11 @@ BOOL loadDroidTemplates(const char *pDroidData, UDWORD bufferSize)
} }
else else
{ {
pStats = (COMP_BASE_STATS *)asPropulsionStats; COMP_BASE_STATS *pStats = (COMP_BASE_STATS *)asPropulsionStats;
size = sizeof(PROPULSION_STATS); unsigned int size = sizeof(PROPULSION_STATS);
unsigned int inc = 0;
BOOL found = FALSE;
if (!getResourceName(componentName)) if (!getResourceName(componentName))
{ {
return FALSE; return FALSE;
@ -2324,8 +2319,6 @@ BOOL loadDroidTemplates(const char *pDroidData, UDWORD bufferSize)
} }
//read in Repair Name //read in Repair Name
found = FALSE;
componentName[0] = '\0';
sscanf(pDroidData, "%[^','],%n", componentName, &cnt); sscanf(pDroidData, "%[^','],%n", componentName, &cnt);
pDroidData += cnt; pDroidData += cnt;
@ -2336,8 +2329,11 @@ BOOL loadDroidTemplates(const char *pDroidData, UDWORD bufferSize)
} }
else else
{ {
pStats = (COMP_BASE_STATS *)asRepairStats; COMP_BASE_STATS *pStats = (COMP_BASE_STATS *)asRepairStats;
size = sizeof(REPAIR_STATS); unsigned int size = sizeof(REPAIR_STATS);
unsigned int inc = 0;
BOOL found = FALSE;
if (!getResourceName(componentName)) if (!getResourceName(componentName))
{ {
return FALSE; return FALSE;
@ -2362,9 +2358,9 @@ BOOL loadDroidTemplates(const char *pDroidData, UDWORD bufferSize)
} }
//read in droid type - only interested if set to PERSON //read in droid type - only interested if set to PERSON
componentName[0] = '\0';
sscanf(pDroidData, "%[^','],%n", componentName, &cnt); sscanf(pDroidData, "%[^','],%n", componentName, &cnt);
pDroidData += cnt; pDroidData += cnt;
if (!strcmp(componentName, "PERSON")) if (!strcmp(componentName, "PERSON"))
{ {
pDroidDesign->droidType = DROID_PERSON; pDroidDesign->droidType = DROID_PERSON;
@ -2394,11 +2390,8 @@ BOOL loadDroidTemplates(const char *pDroidData, UDWORD bufferSize)
pDroidDesign->droidType = DROID_DEFAULT; pDroidDesign->droidType = DROID_DEFAULT;
bDefaultTemplateFound = TRUE; bDefaultTemplateFound = TRUE;
} }
//pDroidData += (strlen(componentName)+1);
//read in Sensor Name //read in Sensor Name
found = FALSE;
componentName[0] = '\0';
sscanf(pDroidData, "%[^','],%n", componentName, &cnt); sscanf(pDroidData, "%[^','],%n", componentName, &cnt);
pDroidData += cnt; pDroidData += cnt;
@ -2409,8 +2402,11 @@ BOOL loadDroidTemplates(const char *pDroidData, UDWORD bufferSize)
} }
else else
{ {
pStats = (COMP_BASE_STATS *)asSensorStats; COMP_BASE_STATS *pStats = (COMP_BASE_STATS *)asSensorStats;
size = sizeof(SENSOR_STATS); unsigned int size = sizeof(SENSOR_STATS);
unsigned int inc = 0;
BOOL found = FALSE;
if (!getResourceName(componentName)) if (!getResourceName(componentName))
{ {
return FALSE; return FALSE;
@ -2451,7 +2447,7 @@ BOOL loadDroidTemplates(const char *pDroidData, UDWORD bufferSize)
} }
pDroidDesign->ref = REF_TEMPLATE_START + i; pDroidDesign->ref = REF_TEMPLATE_START + line;
/* Loaded in from the database now AB 29/10/98 /* Loaded in from the database now AB 29/10/98
pDroidDesign->multiPlayerID = i; // another unique number, just for multiplayer stuff. pDroidDesign->multiPlayerID = i; // another unique number, just for multiplayer stuff.
*/ */
@ -2473,9 +2469,6 @@ BOOL loadDroidTemplates(const char *pDroidData, UDWORD bufferSize)
pDroidData = strchr(pDroidData,'\n') + 1; pDroidData = strchr(pDroidData,'\n') + 1;
pDroidDesign++; pDroidDesign++;
} }
// free(pStartDroidData);
if ( bDefaultTemplateFound == FALSE ) if ( bDefaultTemplateFound == FALSE )
{ {
@ -2624,81 +2617,35 @@ DROID_TYPE droidTemplateType(DROID_TEMPLATE *psTemplate)
} }
//Load the weapons assigned to Droids in the Access database //Load the weapons assigned to Droids in the Access database
//Watermelon:reads 3 WeaponName for now?
BOOL loadDroidWeapons(const char *pWeaponData, UDWORD bufferSize) BOOL loadDroidWeapons(const char *pWeaponData, UDWORD bufferSize)
{ {
const char *pStartWeaponData; unsigned int NumWeapons = numCR(pWeaponData, bufferSize);
UDWORD NumWeapons = 0, i, player; unsigned int SkippedWeaponCount = 0;
char WeaponName[MAX_STR_LENGTH], TemplateName[MAX_STR_LENGTH]; unsigned int line = 0;
//Watermelon:TODO:fix this temp naming one day,WeaponName[DROID_MAXWEAPS][MAX_STR_LENGTH] causes stack corruption
char WeaponNameA[MAX_STR_LENGTH],WeaponNameB[MAX_STR_LENGTH];
UBYTE j;
DROID_TEMPLATE *pTemplate;
BOOL recFound;
UWORD SkippedWeaponCount=0;
SDWORD incW[DROID_MAXWEAPS];
//initialise the store count variable
for (player=0; player < MAX_PLAYERS; player++)
{
for(pTemplate = apsDroidTemplates[player]; pTemplate != NULL;
pTemplate = pTemplate->psNext)
{
//clear the storage flags
pTemplate->storeCount = 0;
}
}
pStartWeaponData = pWeaponData;
NumWeapons = numCR(pWeaponData, bufferSize);
ASSERT(NumWeapons > 0, "template without weapons"); ASSERT(NumWeapons > 0, "template without weapons");
for (i=0; i < NumWeapons; i++) for (line = 0; line < NumWeapons; line++)
{ {
recFound = FALSE; unsigned int player = 0;
char WeaponName[DROID_MAXWEAPS][MAX_STR_LENGTH] = {{'\0'}},
TemplateName[MAX_STR_LENGTH] = {'\0'};
//read the data into the storage - the data is delimeted using comma's //read the data into the storage - the data is delimeted using comma's
TemplateName[0] = '\0'; sscanf(pWeaponData, "%[^','],%[^','],%[^','],%[^','],%d",
WeaponName[0] = '\0'; TemplateName, WeaponName[0], WeaponName[1], WeaponName[2], &player);
WeaponNameA[0] = '\0';
WeaponNameB[0] = '\0';
//Watermelon:kcah
sscanf(pWeaponData,"%[^','],%[^','],%[^','],%[^','],%d", TemplateName, WeaponName, WeaponNameA, WeaponNameB, &player);
//loop through each droid to compare the name
/*if (!getResourceName(TemplateName))
{
return FALSE;
}*/
if (!getDroidResourceName(TemplateName))
{
return FALSE;
}
if (!getResourceName(WeaponName))
{
return FALSE;
}
if (player < MAX_PLAYERS) if (player < MAX_PLAYERS)
{ {
for(pTemplate = apsDroidTemplates[player]; pTemplate != NULL; pTemplate = unsigned int j = 0;
pTemplate->psNext)
{ DROID_TEMPLATE *pTemplate = getTemplateFromUniqueName(TemplateName, player);
if (!(strcmp(TemplateName, pTemplate->aName)))
{
//Template found
recFound = TRUE;
break;
}
}
/* if Template not found - try default design */ /* if Template not found - try default design */
if (!recFound) if (!pTemplate)
{ {
pTemplate = &sDefaultDesignTemplate; pTemplate = &sDefaultDesignTemplate;
if ( strcmp(TemplateName, pTemplate->aName) ) if ( strcmp(TemplateName, pTemplate->pName) != 0 )
{ {
debug( LOG_ERROR, "Unable to find Template - %s", TemplateName ); debug( LOG_ERROR, "Unable to find Template - %s", TemplateName );
abort(); abort();
@ -2706,35 +2653,34 @@ BOOL loadDroidWeapons(const char *pWeaponData, UDWORD bufferSize)
} }
} }
ASSERT(pTemplate->numWeaps <= DROID_MAXWEAPS, "stack corruption unavoidable");
for (j = 0; j < pTemplate->numWeaps; j++) for (j = 0; j < pTemplate->numWeaps; j++)
{ {
//Watermelon:test int incWpn;
if (j == 0)
if (!getResourceName(WeaponName[j]))
{ {
incW[j] = getCompFromName(COMP_WEAPON, WeaponName); return FALSE;
}
else if (j == 1)
{
incW[j] = getCompFromName(COMP_WEAPON, WeaponNameA);
}
else if (j == 2)
{
incW[j] = getCompFromName(COMP_WEAPON, WeaponNameB);
} }
incWpn = getCompFromName(COMP_WEAPON, WeaponName[j]);
//if weapon not found - error //if weapon not found - error
if (incW[j] == -1) if (incWpn == -1)
{ {
debug( LOG_ERROR, "Unable to find Weapon %s for template %s", WeaponNameA, TemplateName ); debug( LOG_ERROR, "Unable to find Weapon %s for template %s",
WeaponName[j], TemplateName );
abort(); abort();
return FALSE; return FALSE;
} }
else else
{ {
//Weapon found, alloc this to the current Template //Weapon found, alloc this to the current Template
pTemplate->asWeaps[pTemplate->storeCount] = incW[j]; pTemplate->asWeaps[pTemplate->storeCount] = incWpn;
//check not allocating more than allowed //check not allocating more than allowed
if (pTemplate->storeCount > if (pTemplate->storeCount > pTemplate->numWeaps)
pTemplate->numWeaps)
{ {
debug( LOG_ERROR, "Trying to allocate more weapons than allowed for Template - %s", TemplateName ); debug( LOG_ERROR, "Trying to allocate more weapons than allowed for Template - %s", TemplateName );
abort(); abort();
@ -2743,7 +2689,6 @@ BOOL loadDroidWeapons(const char *pWeaponData, UDWORD bufferSize)
//check valid weapon/propulsion //check valid weapon/propulsion
if (!checkValidWeaponForProp(pTemplate)) if (!checkValidWeaponForProp(pTemplate))
{ {
// ffs
debug( LOG_ERROR, "Weapon is invalid for air propulsion for template %s", pTemplate->aName ); debug( LOG_ERROR, "Weapon is invalid for air propulsion for template %s", pTemplate->aName );
abort(); abort();
@ -2765,32 +2710,33 @@ BOOL loadDroidWeapons(const char *pWeaponData, UDWORD bufferSize)
if (SkippedWeaponCount > 0) if (SkippedWeaponCount > 0)
{ {
debug( LOG_ERROR, "Illegal player number in %d droid weapons", SkippedWeaponCount ); debug( LOG_ERROR, "Illegal player number in %d droid weapons", SkippedWeaponCount );
abort(); abort();
} }
// free(pStartWeaponData);
return TRUE; return TRUE;
} }
//free the storage for the droid templates //free the storage for the droid templates
BOOL droidTemplateShutDown(void) BOOL droidTemplateShutDown(void)
{ {
DROID_TEMPLATE *pTemplate, *pNext; unsigned int player;
UDWORD player;
for (player = 0; player < MAX_PLAYERS; player++) for (player = 0; player < MAX_PLAYERS; player++)
{ {
DROID_TEMPLATE *pTemplate, *pNext;
for(pTemplate = apsDroidTemplates[player]; pTemplate != NULL; for(pTemplate = apsDroidTemplates[player]; pTemplate != NULL;
pTemplate = pNext) pTemplate = pNext)
{ {
pNext = pTemplate->psNext; pNext = pTemplate->psNext;
free(pTemplate->pName);
free(pTemplate); free(pTemplate);
} }
apsDroidTemplates[player] = NULL; apsDroidTemplates[player] = NULL;
} }
free(sDefaultDesignTemplate.pName);
return TRUE; return TRUE;
} }
@ -3389,7 +3335,7 @@ void droidSetBits(DROID_TEMPLATE *pTemplate,DROID *psDroid)
// Sets the parts array in a template given a droid. // Sets the parts array in a template given a droid.
static void templateSetParts(DROID *psDroid,DROID_TEMPLATE *psTemplate) static void templateSetParts(const DROID *psDroid, DROID_TEMPLATE *psTemplate)
{ {
UDWORD inc; UDWORD inc;
psTemplate->numWeaps = 0; psTemplate->numWeaps = 0;
@ -3800,46 +3746,62 @@ BOOL calcDroidMuzzleLocation(DROID *psDroid, Vector3i *muzzle, int weapon_slot)
return TRUE; return TRUE;
} }
/* IF YOU USE THIS FUNCTION - NOTE THAT selectedPlayer's TEMPLATES ARE NOT USED!!!!
gets a template from its name - relies on the name being unique (or it will /*!
return the first one it finds!! */ * Gets a template from its name
DROID_TEMPLATE * getTemplateFromName(char *pName) * relies on the name being unique (or it will return the first one it finds!)
* \param pName Template name
* \param player Player number
* \pre pName has to be the unique, untranslated name!
* \pre player \< MAX_PLAYERS
*/
DROID_TEMPLATE * getTemplateFromUniqueName(const char *pName, unsigned int player)
{ {
UDWORD player;
DROID_TEMPLATE *psCurr; DROID_TEMPLATE *psCurr;
for (psCurr = apsDroidTemplates[player]; psCurr != NULL; psCurr = psCurr->psNext)
{
if (strcmp(psCurr->pName, pName) == 0)
{
return psCurr;
}
}
return NULL;
}
/*!
* Gets a template from its name
* relies on the name being unique (or it will return the first one it finds!)
* \param pName Template name
* \pre pName has to be the unique, untranslated name!
* \post pName will be translated via getDroidResourceName()!
* \warning IF YOU USE THIS FUNCTION - NOTE THAT selectedPlayer's TEMPLATES ARE NOT USED!!!!
*/
DROID_TEMPLATE * getTemplateFromTranslatedNameNoPlayer(char *pName)
{
unsigned int player;
/*all droid and template names are now stored as the translated /*all droid and template names are now stored as the translated
name regardless of RESOURCE_NAMES and STORE_RESOURCE_ID! - AB 26/06/98*/ name regardless of RESOURCE_NAMES and STORE_RESOURCE_ID! - AB 26/06/98*/
getDroidResourceName(pName); getDroidResourceName(pName);
for (player = 0; player < MAX_PLAYERS; player++) for (player = 0; player < MAX_PLAYERS; player++)
{ {
DROID_TEMPLATE *psCurr;
// OK so we want selectedPlayer's CYBORG templates since they cannot be edited // OK so we want selectedPlayer's CYBORG templates since they cannot be edited
// and we don't want to duplicate them for the sake of it! (ha!) // and we don't want to duplicate them for the sake of it! (ha!)
// don't use selectedPlayer's templates if not multiplayer // don't use selectedPlayer's templates if not multiplayer
// this was written for use in the scripts and we don't want the scripts to use // this was written for use in the scripts and we don't want the scripts to use
// selectedPlayer's templates because we cannot guarentee they will exist! // selectedPlayer's templates because we cannot guarentee they will exist!
/*
if (!bMultiPlayer)
{
if (player == selectedPlayer)
{
continue;
}
}
*/
for (psCurr = apsDroidTemplates[player]; psCurr != NULL; psCurr = psCurr->psNext) for (psCurr = apsDroidTemplates[player]; psCurr != NULL; psCurr = psCurr->psNext)
{ {
if (!strcmp(psCurr->aName, pName)) if (strcmp(psCurr->aName, pName) == 0)
{ {
//if template is selectedPlayers' it must be a CYBORG or we ignore it //if template is selectedPlayers' it must be a CYBORG or we ignore it
if (!bMultiPlayer &&
if (!bMultiPlayer) player == selectedPlayer &&
{
//if (player == selectedPlayer && psCurr->droidType != DROID_CYBORG)
if (player == selectedPlayer &&
!(psCurr->droidType == DROID_CYBORG || !(psCurr->droidType == DROID_CYBORG ||
psCurr->droidType == DROID_CYBORG_SUPER || psCurr->droidType == DROID_CYBORG_SUPER ||
psCurr->droidType == DROID_CYBORG_CONSTRUCT || psCurr->droidType == DROID_CYBORG_CONSTRUCT ||
@ -3847,7 +3809,6 @@ DROID_TEMPLATE * getTemplateFromName(char *pName)
{ {
//ignore //ignore
continue; continue;
}
} }
return psCurr; return psCurr;
} }
@ -4595,7 +4556,7 @@ void setUpBuildModule(DROID *psDroid)
} }
} }
char *getDroidName(DROID *psDroid) const char *getDroidName(const DROID *psDroid)
{ {
DROID_TEMPLATE sTemplate; DROID_TEMPLATE sTemplate;
@ -4608,30 +4569,25 @@ char *getDroidName(DROID *psDroid)
/*return the name to display for the interface - we don't know if this is /*return the name to display for the interface - we don't know if this is
a string ID or something the user types in*/ a string ID or something the user types in*/
char* getTemplateName(DROID_TEMPLATE *psTemplate) const char* getTemplateName(const DROID_TEMPLATE *psTemplate)
{ {
char *pNameID = psTemplate->aName; const char *pNameID = psTemplate->aName;
UDWORD id; unsigned int id;
char *pName = NULL;
/*see if the name has a resource associated with it by trying to get /*see if the name has a resource associated with it by trying to get
the ID for the string*/ the ID for the string*/
if (strresGetIDNum(psStringRes, pNameID, &id)) if (strresGetIDNum(psStringRes, pNameID, &id))
{ {
//get the string from the id //get the string from the id
pName = strresGetString(psStringRes, id); const char *pName = strresGetString(psStringRes, id);
if (pName) if (pName)
{ {
return pName; return pName;
} }
} }
//if haven't found a resource, return the name passed in //if haven't found a resource, return the name passed in
if (!pName)
{
return pNameID; return pNameID;
} }
return NULL;
}
/* Just returns true if the droid's present body points aren't as high as the original*/ /* Just returns true if the droid's present body points aren't as high as the original*/
BOOL droidIsDamaged(DROID *psDroid) BOOL droidIsDamaged(DROID *psDroid)
@ -4649,7 +4605,7 @@ BOOL droidIsDamaged(DROID *psDroid)
BOOL getDroidResourceName(char *pName) BOOL getDroidResourceName(char *pName)
{ {
UDWORD id; unsigned int id;
//see if the name has a resource associated with it by trying to get the ID for the string //see if the name has a resource associated with it by trying to get the ID for the string
if (!strresGetIDNum(psStringRes, pName, &id)) if (!strresGetIDNum(psStringRes, pName, &id))

View File

@ -235,7 +235,9 @@ extern BOOL activateGroupAndMove(UDWORD playerNumber, UDWORD groupNumber);
extern BOOL calcDroidMuzzleLocation(DROID *psDroid, Vector3i *muzzle, int weapon_slot); extern BOOL calcDroidMuzzleLocation(DROID *psDroid, Vector3i *muzzle, int weapon_slot);
/* gets a template from its name - relies on the name being unique */ /* gets a template from its name - relies on the name being unique */
extern DROID_TEMPLATE* getTemplateFromName(char *pName); extern DROID_TEMPLATE * getTemplateFromUniqueName(const char *pName, unsigned int player);
/* gets a template from its name - relies on the name being unique */
extern DROID_TEMPLATE* getTemplateFromTranslatedNameNoPlayer(char *pName);
/*getTemplateFromSinglePlayerID gets template for unique ID searching one players list */ /*getTemplateFromSinglePlayerID gets template for unique ID searching one players list */
extern DROID_TEMPLATE* getTemplateFromSinglePlayerID(UDWORD multiPlayerID, UDWORD player); extern DROID_TEMPLATE* getTemplateFromSinglePlayerID(UDWORD multiPlayerID, UDWORD player);
/*getTemplateFromMultiPlayerID gets template for unique ID searching all lists */ /*getTemplateFromMultiPlayerID gets template for unique ID searching all lists */
@ -294,11 +296,11 @@ extern BOOL buildModule(STRUCTURE *psStruct);
extern void setUpBuildModule(DROID *psDroid); extern void setUpBuildModule(DROID *psDroid);
/*return the name to display for the interface given a DROID structure*/ /*return the name to display for the interface given a DROID structure*/
extern char* getDroidName(DROID *psDroid); extern const char* getDroidName(const DROID *psDroid) WZ_DECL_UNUSED;
/*return the name to display for the interface - we don't know if this is /*return the name to display for the interface - we don't know if this is
a string ID or something the user types in*/ a string ID or something the user types in*/
extern char* getTemplateName(DROID_TEMPLATE *psTemplate); extern const char* getTemplateName(const DROID_TEMPLATE *psTemplate);
/* Just returns true if the droid's present body points aren't as high as the original*/ /* Just returns true if the droid's present body points aren't as high as the original*/
extern BOOL droidIsDamaged(DROID *psDroid); extern BOOL droidIsDamaged(DROID *psDroid);

View File

@ -35,7 +35,7 @@
#define DROID_MAXCOMP (COMP_NUMCOMPONENTS - 1)//(COMP_NUMCOMPONENTS - 2) #define DROID_MAXCOMP (COMP_NUMCOMPONENTS - 1)//(COMP_NUMCOMPONENTS - 2)
/* The maximum number of droid weapons */ /* The maximum number of droid weapons */
#define DROID_MAXWEAPS 3//Watermelon:its 3 again now #define DROID_MAXWEAPS 3
#define DROID_DAMAGE_SCALING 400 #define DROID_DAMAGE_SCALING 400
// This should really be logarithmic // This should really be logarithmic
#define CALC_DROID_SMOKE_INTERVAL(x) ((((100-x)+10)/10) * DROID_DAMAGE_SCALING) #define CALC_DROID_SMOKE_INTERVAL(x) ((((100-x)+10)/10) * DROID_DAMAGE_SCALING)

View File

@ -394,9 +394,6 @@ BASE_OBJECT **apsListToOrder;
#define ORDERED_LIST_SIZE (NUM_FACTORY_TYPES * MAX_FACTORY) #define ORDERED_LIST_SIZE (NUM_FACTORY_TYPES * MAX_FACTORY)
/* default droid design template */
extern DROID_TEMPLATE sDefaultDesignTemplate;
/* The current design being edited on the design screen */ /* The current design being edited on the design screen */
extern DROID_TEMPLATE sCurrDesign; extern DROID_TEMPLATE sCurrDesign;

View File

@ -507,7 +507,7 @@ var_init: var_entry TYPE var_value
scrv_error("Typemismatch for variable %d", $1); scrv_error("Typemismatch for variable %d", $1);
YYABORT; YYABORT;
} }
data.v.oval = getTemplateFromName($3.pString); /* store pointer to the template */ data.v.oval = getTemplateFromTranslatedNameNoPlayer($3.pString); /* store pointer to the template */
if (data.v.oval == NULL) if (data.v.oval == NULL)
{ {
scrv_error("Template %s not found", $3.pString); scrv_error("Template %s not found", $3.pString);