// 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); } }
// Give a group an order to a location BOOL scrOrderGroupLoc(void) { DROID_GROUP *psGroup; SDWORD order, x,y; if (!stackPopParams(4, ST_GROUP, &psGroup, VAL_INT, &order, VAL_INT, &x, VAL_INT, &y)) { return FALSE; } ASSERT((PTRVALID(psGroup, sizeof(DROID_GROUP)), "scrOrderGroupLoc: Invalid group pointer")); if (order != DORDER_MOVE && order != DORDER_SCOUT) { ASSERT((FALSE, "scrOrderGroupLoc: Invalid order")); return FALSE; } if (x < 0 || x > (SDWORD)(mapWidth << TILE_SHIFT) || y < 0 || y > (SDWORD)(mapHeight << TILE_SHIFT)) { ASSERT((FALSE, "scrOrderGroupLoc: Invalid location")); return FALSE; } DBP1(("scrOrderGroupLoc: group %p (%d) order %d (%d,%d)\n", psGroup, grpNumMembers(psGroup), order, x,y)); orderGroupLoc(psGroup, order, (UDWORD)x,(UDWORD)y); return TRUE; }
// Give a group an order to an object BOOL scrOrderGroupObj(void) { DROID_GROUP *psGroup; SDWORD order; BASE_OBJECT *psObj; if (!stackPopParams(3, ST_GROUP, &psGroup, VAL_INT, &order, ST_BASEOBJECT, &psObj)) { return FALSE; } ASSERT((PTRVALID(psGroup, sizeof(DROID_GROUP)), "scrOrderGroupObj: Invalid group pointer")); ASSERT((PTRVALID(psObj, sizeof(BASE_OBJECT)), "scrOrderGroupObj: Invalid object pointer")); if (order != DORDER_ATTACK && order != DORDER_HELPBUILD && order != DORDER_DEMOLISH && order != DORDER_REPAIR && order != DORDER_OBSERVE && order != DORDER_EMBARK && order != DORDER_FIRESUPPORT) { ASSERT((FALSE, "scrOrderGroupObj: Invalid order")); return FALSE; } DBP1(("scrOrderGroupObj: group %p (%d) order %d, obj type %d player %d id %d\n", psGroup, grpNumMembers(psGroup), order, psObj->type, psObj->player, psObj->id)); orderGroupObj(psGroup, order, psObj); return TRUE; }
// Give a group an order BOOL scrOrderGroup(void) { DROID_GROUP *psGroup; SDWORD order; if (!stackPopParams(2, ST_GROUP, &psGroup, VAL_INT, &order)) { return FALSE; } ASSERT((PTRVALID(psGroup, sizeof(DROID_GROUP)), "scrOrderGroup: Invalid group pointer")); if (order != DORDER_STOP && order != DORDER_RETREAT && order != DORDER_DESTRUCT && order != DORDER_RTR && order != DORDER_RTB && order != DORDER_RUN) { ASSERT((FALSE, "scrOrderGroup: Invalid order")); return FALSE; } DBP1(("scrOrderGroup: group %p (%d) order %d\n", psGroup, grpNumMembers(psGroup), order)); orderGroup(psGroup, order); return TRUE; }