Added a script function to perform up to 8 (instead of just 1) structure iterations at the same time;

initEnumStructB() - to initialize iteration, enumStructB() - to iterate.

git-svn-id: svn+ssh://svn.gna.org/svn/warzone/trunk@959 4a71c877-e1ca-e34f-864e-861f7616d084
master
Roman C 2007-01-04 21:47:12 +00:00
parent e2de942f02
commit c89cadfb97
3 changed files with 117 additions and 10 deletions

View File

@ -2040,27 +2040,34 @@ static UDWORD enumStructCount;
static BOOL structfindany;
static SDWORD playerVisibleStruct; //player whose structures must be visible
//for the bucket version
static STRUCTURE_STATS *psStructStatToFindB[MAX_PLAYERS];
static UDWORD playerToEnumStructB[MAX_PLAYERS];
static UDWORD enumStructCountB[MAX_PLAYERS];
static BOOL structfindanyB[MAX_PLAYERS];
static SDWORD playerVisibleStructB[MAX_PLAYERS]; //player whose structures must be visible
// init enum visible structures.
BOOL scrInitEnumStruct(void)
{
SDWORD lookingPlayer,iStat,targetPlayer,any;
SDWORD lookingPlayer,iStat,targetPlayer;
BOOL any;
if ( !stackPopParams(4,VAL_BOOL,&any, ST_STRUCTURESTAT, &iStat, VAL_INT, &targetPlayer, VAL_INT, &lookingPlayer) )
{
return FALSE;
}
if(any == 1)
{
structfindany = TRUE;
}
else
{
structfindany = FALSE;
}
ASSERT(targetPlayer >= 0 && targetPlayer < MAX_PLAYERS,
"scrInitEnumStructB: targetPlayer out of bounds: %d", targetPlayer);
ASSERT(lookingPlayer >= 0 && lookingPlayer < MAX_PLAYERS,
"scrInitEnumStructB: lookingPlayer out of bounds: %d", lookingPlayer);
structfindany = any;
psStructStatToFind = (STRUCTURE_STATS *)(asStructureStats + iStat);
playerToEnumStruct = (UDWORD)targetPlayer;
playerVisibleStruct = lookingPlayer; //fix: remember who must be able to see the structure
playerVisibleStruct = lookingPlayer; //remember who must be able to see the structure
enumStructCount = 0;
return TRUE;
}
@ -2117,7 +2124,97 @@ BOOL scrEnumStruct(void)
return TRUE;
}
// init enum visible structures - takes bucket as additional parameter
BOOL scrInitEnumStructB(void)
{
SDWORD lookingPlayer,iStat,targetPlayer,bucket;
BOOL any;
if ( !stackPopParams(5,VAL_BOOL,&any, ST_STRUCTURESTAT, &iStat,
VAL_INT, &targetPlayer, VAL_INT, &lookingPlayer, VAL_INT, &bucket) )
{
return FALSE;
}
ASSERT(targetPlayer >= 0 && targetPlayer < MAX_PLAYERS,
"scrInitEnumStructB: targetPlayer out of bounds: %d", targetPlayer);
ASSERT(lookingPlayer >= 0 && lookingPlayer < MAX_PLAYERS,
"scrInitEnumStructB: lookingPlayer out of bounds: %d", lookingPlayer);
ASSERT(bucket >= 0 && bucket < MAX_PLAYERS,
"scrInitEnumStructB: bucket out of bounds: %d", bucket);
/* Any structure type regardless of the passed type? */
structfindanyB[bucket] = any;
psStructStatToFindB[bucket] = (STRUCTURE_STATS *)(asStructureStats + iStat);
playerToEnumStructB[bucket] = (UDWORD)targetPlayer;
playerVisibleStructB[bucket] = lookingPlayer; //remember who must be able to see the structure
enumStructCountB[bucket] = 0;
return TRUE;
}
// Similar to scrEnumStruct, but uses bucket
BOOL scrEnumStructB(void)
{
SDWORD bucket;
UDWORD count;
STRUCTURE *psStruct;
if ( !stackPopParams(1, VAL_INT, &bucket) )
{
return FALSE;
}
ASSERT(bucket >= 0 && bucket < MAX_PLAYERS,
"scrEnumStructB: bucket out of bounds: %d", bucket);
// go to the correct start point in the structure list.
count = 0;
for(psStruct=apsStructLists[playerToEnumStructB[bucket]];psStruct && count<enumStructCountB[bucket];count++)
{
psStruct = psStruct->psNext;
}
if(psStruct == NULL) // no more to find.
{
scrFunctionResult.v.oval = NULL;
if (!stackPushResult((INTERP_TYPE)ST_STRUCTURE, &scrFunctionResult))
{
return FALSE;
}
return TRUE;
}
while(psStruct) // find a visible structure of required type.
{
if( (structfindanyB[bucket] || (psStruct->pStructureType->ref == psStructStatToFindB[bucket]->ref))
&&
((playerVisibleStructB[bucket] < 0) || (psStruct->visible[playerVisibleStructB[bucket]])) //perform visibility test
)
{
scrFunctionResult.v.oval = psStruct;
if (!stackPushResult((INTERP_TYPE)ST_STRUCTURE, &scrFunctionResult)) // push scrFunctionResult
{
return FALSE;
}
enumStructCountB[bucket]++;
return TRUE;
}
enumStructCountB[bucket]++;
psStruct = psStruct->psNext;
}
// push NULL, none found;
scrFunctionResult.v.oval = NULL;
if (!stackPushResult((INTERP_TYPE)ST_STRUCTURE, &scrFunctionResult))
{
return FALSE;
}
return TRUE;
}
// -----------------------------------------------------------------------------------------
/*looks to see if a structure (specified by type) exists and is being built*/

View File

@ -125,6 +125,8 @@ extern BOOL scrDestroyStructure(void);
// enumerate structures
extern BOOL scrInitEnumStruct(void);
extern BOOL scrEnumStruct(void);
extern BOOL scrInitEnumStructB(void);
extern BOOL scrEnumStructB(void);
/*looks to see if a structure (specified by type) exists */
extern BOOL scrStructureBeingBuilt(void);

View File

@ -201,6 +201,14 @@ FUNC_SYMBOL asFuncTable[] =
0, { VAL_VOID },
0, 0, NULL, 0, 0, NULL, NULL },
{ "initEnumStructB", scrInitEnumStructB, VAL_VOID,
5, { VAL_BOOL, (INTERP_TYPE)ST_STRUCTURESTAT, VAL_INT,VAL_INT, VAL_INT },
0, 0, NULL, 0, 0, NULL, NULL },
{ "enumStructB", scrEnumStructB, (INTERP_TYPE)ST_STRUCTURE,
1, { VAL_INT },
0, 0, NULL, 0, 0, NULL, NULL },
{ "structureBeingBuilt",scrStructureBeingBuilt, VAL_BOOL,
2, { (INTERP_TYPE)ST_STRUCTURESTAT, VAL_INT },
0, 0, NULL, 0, 0, NULL, NULL },