// add a droid to a command group void cmdDroidAddDroid(DROID *psCommander, DROID *psDroid) { DROID_GROUP *psGroup; if (psCommander->psGroup == NULL) { if (!grpCreate(&psGroup)) { return; } grpJoin(psGroup, psCommander); psDroid->group = UBYTE_MAX; } if (grpNumMembers(psCommander->psGroup) < cmdDroidMaxGroup(psCommander)) { grpJoin(psCommander->psGroup, psDroid); psDroid->group = UBYTE_MAX; // set the secondary states for the unit secondarySetState(psDroid, DSO_ATTACK_RANGE, (SECONDARY_STATE)(psCommander->secondaryOrder & DSS_ARANGE_MASK)); secondarySetState(psDroid, DSO_REPAIR_LEVEL, (SECONDARY_STATE)(psCommander->secondaryOrder & DSS_REPLEV_MASK)); secondarySetState(psDroid, DSO_ATTACK_LEVEL, (SECONDARY_STATE)(psCommander->secondaryOrder & DSS_ALEV_MASK)); secondarySetState(psDroid, DSO_HALTTYPE, (SECONDARY_STATE)(psCommander->secondaryOrder & DSS_HALT_MASK)); orderDroidObj(psDroid, DORDER_GUARD, (BASE_OBJECT *)psCommander, ModeQueue); } }
/** Receive droid and transporter loading information * * \sa sendDroidEmbark(),sendDroidDisEmbark(),recvDroidDisEmbark() */ BOOL recvDroidEmbark(NETQUEUE queue) { DROID* psDroid; DROID* psTransporterDroid; BOOL bDroidRemoved; NETbeginDecode(queue, GAME_DROIDEMBARK); { uint8_t player; uint32_t droidID; uint32_t transporterID; NETuint8_t(&player); NETuint32_t(&droidID); NETuint32_t(&transporterID); // we have to find the droid on our (local) list first. if (!IdToDroid(droidID, player, &psDroid)) { NETend(); // Possible it already died? (sync error?) debug(LOG_WARNING, "player's %d droid %d wasn't found?", player,droidID); return false; } if (!IdToDroid(transporterID, player, &psTransporterDroid)) { NETend(); // Possible it already died? (sync error?) debug(LOG_WARNING, "player's %d transport droid %d wasn't found?", player,transporterID); return false; } if (psDroid == NULL) { // how can this happen? return true; } // Take it out of the world without destroying it (just removes it from the droid list) bDroidRemoved = droidRemove(psDroid, apsDroidLists); // Init the order for when disembark psDroid->order = DORDER_NONE; setDroidTarget(psDroid, NULL); psDroid->psTarStats = NULL; if (bDroidRemoved) { // and now we need to add it to their transporter group! grpJoin(psTransporterDroid->psGroup, psDroid); } else { // possible sync error? debug(LOG_WARNING, "Eh? Where did unit %d go? Couldn't load droid onto transporter.", droidID); } } NETend(); return true; }
// Add a droid to a group BOOL scrGroupAddDroid(void) { DROID_GROUP *psGroup; DROID *psDroid; if (!stackPopParams(2, ST_GROUP, &psGroup, ST_DROID, &psDroid)) { return FALSE; } ASSERT((PTRVALID(psGroup, sizeof(DROID_GROUP)), "scrGroupAdd: Invalid group pointer")); ASSERT((PTRVALID(psDroid, sizeof(DROID)), "scrGroupAdd: Invalid droid pointer")); if (psDroid == NULL) { return FALSE; } if (psDroid->droidType == DROID_COMMAND) { ASSERT((FALSE, "scrGroupAdd: cannot add a command droid to a group")); return FALSE; } if (psDroid->droidType == DROID_TRANSPORTER) { ASSERT((FALSE, "scrGroupAdd: cannot add a transporter to a group")); return FALSE; } grpJoin(psGroup, psDroid); return TRUE; }
// Add groupless droids in an area to a group BOOL scrGroupAddAreaNoGroup(void) { DROID_GROUP *psGroup; DROID *psDroid; SDWORD x1,y1,x2,y2, player; if (!stackPopParams(6, ST_GROUP, &psGroup, VAL_INT, &player, VAL_INT,&x1,VAL_INT,&y1, VAL_INT,&x2,VAL_INT,&y2)) { return FALSE; } ASSERT((PTRVALID(psGroup, sizeof(DROID_GROUP)), "scrGroupAddNoGroup: Invalid group pointer")); if (player < 0 || player >= MAX_PLAYERS) { ASSERT((FALSE, "scrGroupAddAreaNoGroup: invalid player")); return FALSE; } for(psDroid=apsDroidLists[player]; psDroid; psDroid=psDroid->psNext) { if (((SDWORD)psDroid->x >= x1) && ((SDWORD)psDroid->x <= x2) && ((SDWORD)psDroid->y >= y1) && ((SDWORD)psDroid->y <= y2) && psDroid->droidType != DROID_COMMAND && psDroid->droidType != DROID_TRANSPORTER && psDroid->psGroup == NULL) { grpJoin(psGroup, psDroid); } } return TRUE; }
BOOL scrCBTransporterLandedB( void ) { SDWORD player; DROID_GROUP *psGroup; DROID *psTransporter, *psDroid, *psNext; BOOL retval; DROID **ppsTransp; if (!stackPopParams(3, ST_GROUP, &psGroup, VAL_INT, &player, VAL_REF|ST_DROID, &ppsTransp)) { debug(LOG_ERROR, "scrCBTransporterLandedB(): stack failed"); return false; } psTransporter = transporterGetScriptCurrent(); if ( (psTransporter == NULL) || (psTransporter->player != (UDWORD)player) ) { retval = false; } else { *ppsTransp = psTransporter; //return landed transporter /* if not selectedPlayer unload droids */ //if ( (UDWORD)player != selectedPlayer ) //{ /* transfer droids from transporter group to current group */ for(psDroid=psTransporter->psGroup->psList; psDroid; psDroid=psNext) { psNext = psDroid->psGrpNext; if ( psDroid != psTransporter ) { grpLeave( psTransporter->psGroup, psDroid ); grpJoin(psGroup, psDroid); } } //} retval = true; } scrFunctionResult.v.bval = retval; if (!stackPushResult(VAL_BOOL, &scrFunctionResult)) { debug(LOG_ERROR, "scrCBTransporterLandedB: push landed"); return false; } return true; }
// create a group structure for a ST_GROUP variable BOOL scrvNewGroup(INTERP_VAL *psVal) { DROID_GROUP *psGroup; if (!grpCreate(&psGroup)) { return false; } // increment the refcount so the group doesn't get automatically freed when empty grpJoin(psGroup, NULL); psVal->v.oval = psGroup; return true; }
BOOL scrCBTransporterLanded( void ) { SDWORD player; DROID_GROUP *psGroup; DROID *psTransporter, *psDroid, *psNext; BOOL retval; if (!stackPopParams(2, ST_GROUP, &psGroup, VAL_INT, &player)) { return false; } psTransporter = transporterGetScriptCurrent(); if ( (psTransporter == NULL) || (psTransporter->player != (UDWORD)player) ) { retval = false; } else { /* if not selectedPlayer unload droids */ if ( (UDWORD)player != selectedPlayer ) { /* transfer droids from transporter group to current group */ for(psDroid=psTransporter->psGroup->psList; psDroid; psDroid=psNext) { psNext = psDroid->psGrpNext; if ( psDroid != psTransporter ) { grpLeave( psTransporter->psGroup, psDroid ); grpJoin(psGroup, psDroid); } } } retval = true; } scrFunctionResult.v.bval = retval; if (!stackPushResult(VAL_BOOL, &scrFunctionResult)) { return false; } return true; }
// Move the droids from one group to another BOOL scrGroupAddGroup(void) { DROID_GROUP *psTo, *psFrom; DROID *psDroid, *psNext; if (!stackPopParams(2, ST_GROUP, &psTo, ST_GROUP, &psFrom)) { return FALSE; } ASSERT((PTRVALID(psTo, sizeof(DROID_GROUP)), "scrGroupAddGroup: Invalid group pointer")); ASSERT((PTRVALID(psFrom, sizeof(DROID_GROUP)), "scrGroupAddGroup: Invalid group pointer")); for(psDroid=psFrom->psList; psDroid; psDroid=psNext) { psNext = psDroid->psGrpNext; grpJoin(psTo, psDroid); } return TRUE; }