118 changes: 13 additions & 105 deletions src/order.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -216,8 +216,7 @@ BASE_OBJECT * checkForRepairRange(DROID *psDroid,DROID *psTarget)
if (droidIsDamaged(psCurr) && visibleObject(psDroid, psCurr, false)
&& (unsigned)droidSqDist(psDroid, psCurr) < // Cast to unsigned, since droidSqDist returns -1 if psCurr is unreachable, which should compare greater than the maximum range.
// Hold position? Repair range, else repair max dist
unsigned((psDroid->order.type == DORDER_NONE && secondaryGetState(psDroid, DSO_HALTTYPE) == DSS_HALT_HOLD) ?
REPAIR_RANGE : REPAIR_MAXDIST*REPAIR_MAXDIST) )
unsigned(psDroid->order.type == DORDER_HOLD ? REPAIR_RANGE : REPAIR_MAXDIST*REPAIR_MAXDIST))
{
return psCurr;
}
Expand Down Expand Up @@ -259,8 +258,7 @@ BASE_OBJECT * checkForDamagedStruct(DROID *psDroid, STRUCTURE *psTarget)
&& visibleObject(psDroid, psCurr, false)
&& (unsigned)droidSqDist(psDroid, psCurr) < // Cast to unsigned, since droidSqDist returns -1 if psCurr is unreachable, which should compare greater than the maximum range.
// Hold position? Repair range, else repair max dist
(unsigned)((psDroid->order.type == DORDER_NONE && secondaryGetState(psDroid, DSO_HALTTYPE) == DSS_HALT_HOLD) ?
REPAIR_RANGE : REPAIR_MAXDIST*REPAIR_MAXDIST) )
(unsigned)(psDroid->order.type == DORDER_HOLD ? REPAIR_RANGE : REPAIR_MAXDIST*REPAIR_MAXDIST))
{
return psCurr;
}
Expand Down Expand Up @@ -374,15 +372,11 @@ void orderUpdateDroid(DROID *psDroid)
actionDroid(psDroid, DACTION_REPAIR, psObj);
}
}

// default to guarding if the correct secondary order is set
else if (psDroid->order.psStats != structGetDemolishStat() && // stop the constructor auto repairing when it is about to demolish
secondaryGetState(psDroid, DSO_HALTTYPE) == DSS_HALT_GUARD &&
!isVtolDroid(psDroid))
// default to guarding
else if (psDroid->order.psStats != structGetDemolishStat() && !isVtolDroid(psDroid))
{
orderDroidLoc(psDroid, DORDER_GUARD, psDroid->pos.x, psDroid->pos.y, ModeImmediate);
}

break;
case DORDER_TRANSPORTRETURN:
if (psDroid->action == DACTION_NONE)
Expand Down Expand Up @@ -758,15 +752,7 @@ void orderUpdateDroid(DROID *psDroid)
else if ((psDroid->action == DACTION_NONE) ||
(psDroid->action == DACTION_CLEARREARMPAD))
{
if (psDroid->order.type == DORDER_ATTACKTARGET &&
secondaryGetState(psDroid, DSO_HALTTYPE) == DSS_HALT_HOLD &&
!actionInRange(psDroid, psDroid->order.psObj, 0) )
{
// on hold orders give up
psDroid->order = DroidOrder(DORDER_NONE);
}
else if (!isVtolDroid(psDroid) ||
allVtolsRearmed(psDroid))
if (!isVtolDroid(psDroid) || allVtolsRearmed(psDroid))
{
actionDroid(psDroid, DACTION_ATTACK, psDroid->order.psObj);
}
Expand Down Expand Up @@ -1492,10 +1478,7 @@ void orderDroidBase(DROID *psDroid, DROID_ORDER_DATA *psOrder)
}
psDroid->order = *psOrder;

if (isVtolDroid(psDroid)
|| actionInRange(psDroid, psOrder->psObj, 0)
|| (psOrder->type == DORDER_ATTACKTARGET
&& secondaryGetState(psDroid, DSO_HALTTYPE) == DSS_HALT_HOLD))
if (isVtolDroid(psDroid) || actionInRange(psDroid, psOrder->psObj, 0))
{
actionDroid(psDroid, DACTION_ATTACK, psOrder->psObj);
}
Expand Down Expand Up @@ -3047,7 +3030,6 @@ bool secondarySupported(DROID *psDroid, SECONDARY_ORDER sec)

case DSO_REPAIR_LEVEL:
case DSO_PATROL:
case DSO_HALTTYPE:
case DSO_RETURN_TO_LOC:
break;

Expand Down Expand Up @@ -3103,13 +3085,6 @@ SECONDARY_STATE secondaryGetState(DROID *psDroid, SECONDARY_ORDER sec, QUEUE_MOD
case DSO_CIRCLE:
return (SECONDARY_STATE)(state & DSS_CIRCLE_MASK);
break;
case DSO_HALTTYPE:
if (psDroid->order.type == DORDER_HOLD)
{
return DSS_HALT_HOLD;
}
return (SECONDARY_STATE)(state & DSS_HALT_MASK);
break;
case DSO_RETURN_TO_LOC:
return (SECONDARY_STATE)(state & DSS_RTL_MASK);
break;
Expand Down Expand Up @@ -3286,8 +3261,8 @@ bool secondarySetState(DROID *psDroid, SECONDARY_ORDER sec, SECONDARY_STATE Stat
case DSO_RECYCLE:
if (State & DSS_RECYCLE_MASK)
{
secondaryMask = DSS_RTL_MASK | DSS_RECYCLE_MASK | DSS_HALT_MASK;
secondarySet = DSS_RECYCLE_SET | DSS_HALT_GUARD;
secondaryMask = DSS_RTL_MASK | DSS_RECYCLE_MASK;
secondarySet = DSS_RECYCLE_SET;
}
else
{
Expand All @@ -3302,17 +3277,6 @@ bool secondarySetState(DROID *psDroid, SECONDARY_ORDER sec, SECONDARY_STATE Stat
secondaryMask = DSS_PATROL_MASK;
secondarySet = (State & DSS_PATROL_SET)? DSS_PATROL_SET : 0;
break;
case DSO_HALTTYPE:
switch (State & DSS_HALT_MASK)
{
case DSS_HALT_PURSUE:
case DSS_HALT_GUARD:
case DSS_HALT_HOLD:
secondaryMask = DSS_HALT_MASK;
secondarySet = State;
break;
}
break;
case DSO_RETURN_TO_LOC:
secondaryMask = DSS_RTL_MASK;
switch (State & DSS_RTL_MASK)
Expand All @@ -3329,13 +3293,9 @@ bool secondarySetState(DROID *psDroid, SECONDARY_ORDER sec, SECONDARY_STATE Stat
}
break;
}
if ((CurrState & DSS_HALT_MASK) == DSS_HALT_HOLD)
{
secondaryMask |= DSS_HALT_MASK;
secondarySet |= DSS_HALT_GUARD;
}
break;
case DSO_UNUSED:
case DSO_UNUSED2:
case DSO_FIRE_DESIGNATOR:
// Do nothing.
break;
Expand Down Expand Up @@ -3494,8 +3454,8 @@ bool secondarySetState(DROID *psDroid, SECONDARY_ORDER sec, SECONDARY_STATE Stat
{
orderDroid(psDroid, DORDER_RECYCLE, ModeImmediate);
}
CurrState &= ~(DSS_RTL_MASK|DSS_RECYCLE_MASK|DSS_HALT_MASK);
CurrState |= DSS_RECYCLE_SET|DSS_HALT_GUARD;
CurrState &= ~(DSS_RTL_MASK|DSS_RECYCLE_MASK);
CurrState |= DSS_RECYCLE_SET;
psDroid->group = UBYTE_MAX;
if (psDroid->psGroup != NULL)
{
Expand Down Expand Up @@ -3544,32 +3504,6 @@ bool secondarySetState(DROID *psDroid, SECONDARY_ORDER sec, SECONDARY_STATE Stat
CurrState &= ~DSS_PATROL_MASK;
}
break;
case DSO_HALTTYPE:
switch (State & DSS_HALT_MASK)
{
case DSS_HALT_PURSUE:
CurrState &= ~ DSS_HALT_MASK;
CurrState |= DSS_HALT_PURSUE;
if (orderState(psDroid, DORDER_GUARD))
{
orderDroid(psDroid, DORDER_STOP, ModeImmediate);
}
break;
case DSS_HALT_GUARD:
CurrState &= ~ DSS_HALT_MASK;
CurrState |= DSS_HALT_GUARD;
orderDroidLoc(psDroid, DORDER_GUARD, psDroid->pos.x, psDroid->pos.y, ModeImmediate);
break;
case DSS_HALT_HOLD:
CurrState &= ~ DSS_HALT_MASK;
CurrState |= DSS_HALT_HOLD;
if (!orderState(psDroid, DORDER_FIRESUPPORT))
{
orderDroid(psDroid, DORDER_STOP, ModeImmediate);
}
break;
}
break;
case DSO_RETURN_TO_LOC:
if ((State & DSS_RTL_MASK) == 0)
{
Expand All @@ -3585,11 +3519,6 @@ bool secondarySetState(DROID *psDroid, SECONDARY_ORDER sec, SECONDARY_STATE Stat
{
order = DORDER_NONE;
CurrState &= ~DSS_RTL_MASK;
if ((CurrState & DSS_HALT_MASK) == DSS_HALT_HOLD)
{
CurrState &= ~DSS_HALT_MASK;
CurrState |= DSS_HALT_GUARD;
}
switch (State & DSS_RTL_MASK)
{
case DSS_RTL_REPAIR:
Expand Down Expand Up @@ -3768,12 +3697,11 @@ static SECONDARY_STATE secondaryGetAverageGroupState(UDWORD player, UDWORD group
void secondarySetAverageGroupState(UDWORD player, UDWORD group)
{
// lookup table for orders and masks
#define MAX_ORDERS 4
#define MAX_ORDERS 2
struct { SECONDARY_ORDER order; UDWORD mask; } aOrders[MAX_ORDERS] =
{
{ DSO_REPAIR_LEVEL, DSS_REPLEV_MASK },
{ DSO_ATTACK_LEVEL, DSS_ALEV_MASK },
{ DSO_HALTTYPE, DSS_HALT_MASK }
};
SDWORD i, state;

Expand Down Expand Up @@ -4033,23 +3961,6 @@ bool setFactoryState(STRUCTURE *psStruct, SECONDARY_ORDER sec, SECONDARY_STATE S
CurrState &= ~DSS_PATROL_MASK;
}
break;
case DSO_HALTTYPE:
switch (State & DSS_HALT_MASK)
{
case DSS_HALT_PURSUE:
CurrState &= ~ DSS_HALT_MASK;
CurrState |= DSS_HALT_PURSUE;
break;
case DSS_HALT_GUARD:
CurrState &= ~ DSS_HALT_MASK;
CurrState |= DSS_HALT_GUARD;
break;
case DSS_HALT_HOLD:
CurrState &= ~ DSS_HALT_MASK;
CurrState |= DSS_HALT_HOLD;
break;
}
break;
default:
break;
}
Expand Down Expand Up @@ -4082,9 +3993,6 @@ bool getFactoryState(STRUCTURE *psStruct, SECONDARY_ORDER sec, SECONDARY_STATE *
case DSO_PATROL:
*pState = (SECONDARY_STATE)(state & DSS_PATROL_MASK);
break;
case DSO_HALTTYPE:
*pState = (SECONDARY_STATE)(state & DSS_HALT_MASK);
break;
default:
*pState = (SECONDARY_STATE)0;
break;
Expand Down Expand Up @@ -4158,7 +4066,7 @@ const char* getDroidOrderName(DROID_ORDER order)
case DORDER_LEAVEMAP: return "DORDER_LEAVEMAP";
case DORDER_RTR_SPECIFIED: return "DORDER_RTR_SPECIFIED";
case DORDER_CIRCLE: return "DORDER_CIRCLE";
case DORDER_HOLD: return "DORDER_HOLD";
case DORDER_HOLD: return "DORDER_HOLD";
};

ASSERT(false, "DROID_ORDER out of range: %u", order);
Expand Down
6 changes: 1 addition & 5 deletions src/orderdef.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ enum SECONDARY_ORDER
DSO_CLEAR_PRODUCTION, /**< Removes the production from a command droid. */
DSO_RECYCLE, /**< If can be recicled or not. */
DSO_PATROL, /**< If it is assigned to patrol between current pos and next move target. */
DSO_HALTTYPE, /**< The type of halt. It can be hold, guard or pursue. Used with DSS_HALT_HOLD, DSS_HALT_GUARD, DSS_HALT_PURSUE. */
DSO_UNUSED2, /**< The type of halt. It can be hold, guard or pursue. Used with DSS_HALT_HOLD, DSS_HALT_GUARD, DSS_HALT_PURSUE. */
DSO_RETURN_TO_LOC, /**< Generic secondary order to return to a location. Will depend on the secondary state DSS_RTL* to be specific. */
DSO_FIRE_DESIGNATOR, /**< Assigns a droid to be a target designator. */
DSO_ASSIGN_VTOL_PRODUCTION, /**< Assigns a vtol factory to a command droid - the state is given by the factory number. */
Expand All @@ -106,9 +106,6 @@ enum SECONDARY_STATE
DSS_ALEV_ALWAYS = 0x000010, /**< state referred to secondary order DSO_ATTACK_LEVEL. Droid attacks by its free will everytime. */
DSS_ALEV_ATTACKED = 0x000020, /**< state referred to secondary order DSO_ATTACK_LEVEL. Droid attacks if it is attacked. */
DSS_ALEV_NEVER = 0x000030, /**< state referred to secondary order DSO_ATTACK_LEVEL. Droid never attacks. */
DSS_HALT_HOLD = 0x000040, /**< state referred to secondary order DSO_HALTTYPE. If halted, droid never moves by its free will. */
DSS_HALT_GUARD = 0x000080, /**< state referred to secondary order DSO_HALTTYPE. If halted, droid moves on a given region by its free will. */
DSS_HALT_PURSUE = 0x0000c0, /**< state referred to secondary order DSO_HALTTYPE. If halted, droid pursues the target by its free will. */
DSS_RECYCLE_SET = 0x000100, /**< state referred to secondary order DSO_RECYCLE. If set, the droid can be recycled. */
DSS_ASSPROD_START = 0x000200, /**< @todo this state is not called on the code. Consider removing it. */
DSS_ASSPROD_MID = 0x002000, /**< @todo this state is not called on the code. Consider removing it. */
Expand All @@ -124,7 +121,6 @@ enum SECONDARY_STATE
/** masks for the secondary order state. */
#define DSS_REPLEV_MASK 0x00000c
#define DSS_ALEV_MASK 0x000030
#define DSS_HALT_MASK 0x0000c0
#define DSS_RECYCLE_MASK 0x000100
#define DSS_ASSPROD_MASK 0x1f07fe00
#define DSS_ASSPROD_FACT_MASK 0x003e00
Expand Down
4 changes: 0 additions & 4 deletions src/scripttabs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1842,7 +1842,6 @@ CONST_SYMBOL asConstantTable[] =
{ "DSO_ATTACK_LEVEL", VAL_INT, false, DSO_ATTACK_LEVEL, NULL, NULL, 0.0f },
{ "DSO_RECYCLE", VAL_INT, false, DSO_RECYCLE, NULL, NULL, 0.0f },
{ "DSO_PATROL", VAL_INT, false, DSO_PATROL, NULL, NULL, 0.0f },
{ "DSO_HALTTYPE", VAL_INT, false, DSO_HALTTYPE, NULL, NULL, 0.0f },
{ "DSO_RETURN_TO_LOC", VAL_INT, false, DSO_RETURN_TO_LOC, NULL, NULL, 0.0f },

// secondary order stats
Expand All @@ -1852,9 +1851,6 @@ CONST_SYMBOL asConstantTable[] =
{ "DSS_ALEV_ALWAYS", VAL_INT, false, DSS_ALEV_ALWAYS, NULL, NULL, 0.0f },
{ "DSS_ALEV_ATTACKED", VAL_INT, false, DSS_ALEV_ATTACKED, NULL, NULL, 0.0f },
{ "DSS_ALEV_NEVER", VAL_INT, false, DSS_ALEV_NEVER, NULL, NULL, 0.0f },
{ "DSS_HALT_HOLD", VAL_INT, false, DSS_HALT_HOLD, NULL, NULL, 0.0f },
{ "DSS_HALT_GUARD", VAL_INT, false, DSS_HALT_GUARD, NULL, NULL, 0.0f },
{ "DSS_HALT_PERSUE", VAL_INT, false, DSS_HALT_PURSUE, NULL, NULL, 0.0f },
{ "DSS_RECYCLE_SET", VAL_INT, false, DSS_RECYCLE_SET, NULL, NULL, 0.0f },
{ "DSS_ASSPROD_START", VAL_INT, false, DSS_ASSPROD_START, NULL, NULL, 0.0f },
{ "DSS_ASSPROD_END ", VAL_INT, false, DSS_ASSPROD_END , NULL, NULL, 0.0f },
Expand Down
2 changes: 1 addition & 1 deletion src/structure.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1978,7 +1978,7 @@ static bool setFunctionality(STRUCTURE *psBuilding, STRUCTURE_TYPE functionType)
psFactory->psSubject = NULL;

// Default the secondary order - AB 22/04/99
psFactory->secondaryOrder = DSS_REPLEV_NEVER | DSS_ALEV_ALWAYS | DSS_HALT_GUARD;
psFactory->secondaryOrder = DSS_REPLEV_NEVER | DSS_ALEV_ALWAYS;

// Create the assembly point for the factory
if (!createFlagPosition(&psFactory->psAssemblyPoint, psBuilding->player))
Expand Down