Simple cleanup of actionX|Y droid fields. Patch reviewed by stiv.

master
Per Inge Mathisen 2011-06-12 16:24:48 +02:00
parent b401d3e6a2
commit 94c94304fb
6 changed files with 49 additions and 59 deletions

View File

@ -29,10 +29,12 @@
#include "math_ext.h"
struct Rotation;
struct Vector3i;
struct Vector2i
{
Vector2i() {}
Vector2i(int x, int y) : x(x), y(y) {}
Vector2i(Vector3i const &r); // discards the z value
int x, y;
};
@ -72,6 +74,7 @@ struct Rotation
typedef Vector3i Position; ///< Map position in world coordinates
inline Vector3i::Vector3i(Rotation const &r) : x(r.direction), y(r.pitch), z(r.roll) {}
inline Vector2i::Vector2i(Vector3i const &r) : x(r.x), y(r.y) {}
// removeZ(3d_vector) -> 2d_vector
static inline WZ_DECL_PURE Vector2i removeZ(Vector3i const &a) { return Vector2i(a.x, a.y); }

View File

@ -1720,7 +1720,7 @@ void actionUpdateDroid(DROID *psDroid)
else
{
objTrace(psDroid->id, "DACTION_MOVETOBUILD: Starting to drive toward construction site - move status was %d", (int)psDroid->sMove.Status);
moveDroidToNoFormation(psDroid, psDroid->actionX,psDroid->actionY);
moveDroidToNoFormation(psDroid, psDroid->actionPos.x, psDroid->actionPos.y);
}
}
break;
@ -1768,10 +1768,8 @@ void actionUpdateDroid(DROID *psDroid)
break;
}
// see if the droid is at the edge of what it is moving to
if (actionReachedBuildPos(psDroid,
(SDWORD)psDroid->actionX,(SDWORD)psDroid->actionY, psDroid->psTarStats) &&
!actionDroidOnBuildPos(psDroid,
(SDWORD)psDroid->actionX,(SDWORD)psDroid->actionY, psDroid->psTarStats))
if (actionReachedBuildPos(psDroid, psDroid->actionPos.x, psDroid->actionPos.y, psDroid->psTarStats) &&
!actionDroidOnBuildPos(psDroid, psDroid->actionPos.x, psDroid->actionPos.y, psDroid->psTarStats))
{
moveStopDroid(psDroid);
@ -1796,8 +1794,7 @@ void actionUpdateDroid(DROID *psDroid)
}
else if (DROID_STOPPED(psDroid))
{
if (actionDroidOnBuildPos(psDroid,
(SDWORD)psDroid->actionX,(SDWORD)psDroid->actionY, psDroid->psTarStats))
if (actionDroidOnBuildPos(psDroid, psDroid->actionPos.x, psDroid->actionPos.y, psDroid->psTarStats))
{
SDWORD pbx = 0, pby = 0;
@ -1812,7 +1809,7 @@ void actionUpdateDroid(DROID *psDroid)
}
else
{
moveDroidToNoFormation(psDroid, psDroid->actionX,psDroid->actionY);
moveDroidToNoFormation(psDroid, psDroid->actionPos.x, psDroid->actionPos.y);
}
}
break;
@ -1850,15 +1847,13 @@ void actionUpdateDroid(DROID *psDroid)
}
// now do the action update
if (DROID_STOPPED(psDroid) &&
!actionReachedBuildPos(psDroid,
(SDWORD)psDroid->actionX,(SDWORD)psDroid->actionY, psDroid->psTarStats))
if (DROID_STOPPED(psDroid) && !actionReachedBuildPos(psDroid, psDroid->actionPos.x, psDroid->actionPos.y, psDroid->psTarStats))
{
if (secondaryGetState(psDroid, DSO_HALTTYPE) != DSS_HALT_HOLD ||
(psDroid->order != DORDER_NONE && psDroid->order != DORDER_TEMP_HOLD))
{
objTrace(psDroid->id, "Secondary order: Go to construction site");
moveDroidToNoFormation(psDroid, psDroid->actionX,psDroid->actionY);
moveDroidToNoFormation(psDroid, psDroid->actionPos.x, psDroid->actionPos.y);
}
else
{
@ -1868,8 +1863,7 @@ void actionUpdateDroid(DROID *psDroid)
else if (!DROID_STOPPED(psDroid) &&
psDroid->sMove.Status != MOVETURNTOTARGET &&
psDroid->sMove.Status != MOVESHUFFLE &&
actionReachedBuildPos(psDroid,
(SDWORD)psDroid->actionX,(SDWORD)psDroid->actionY, psDroid->psTarStats))
actionReachedBuildPos(psDroid, psDroid->actionPos.x, psDroid->actionPos.y, psDroid->psTarStats))
{
objTrace(psDroid->id, "Stopped - reached build position");
moveStopDroid(psDroid);
@ -2123,9 +2117,8 @@ void actionUpdateDroid(DROID *psDroid)
if (DROID_STOPPED(psDroid))
{
// Couldn't reach destination - try and find a new one
psDroid->actionX = psDroid->psActionTarget[0]->pos.x;
psDroid->actionY = psDroid->psActionTarget[0]->pos.y;
moveDroidTo(psDroid, psDroid->actionX, psDroid->actionY);
psDroid->actionPos = psDroid->psActionTarget[0]->pos;
moveDroidTo(psDroid, psDroid->actionPos.x, psDroid->actionPos.y);
}
break;
}
@ -2185,10 +2178,9 @@ void actionUpdateDroid(DROID *psDroid)
}
}*/
// damaged droid has moved off - follow if we're not holding position!
psDroid->actionX = psDroid->psActionTarget[0]->pos.x;
psDroid->actionY = psDroid->psActionTarget[0]->pos.y;
psDroid->actionPos = psDroid->psActionTarget[0]->pos;
psDroid->action = DACTION_MOVETODROIDREPAIR;
moveDroidTo(psDroid, psDroid->actionX, psDroid->actionY);
moveDroidTo(psDroid, psDroid->actionPos.x, psDroid->actionPos.y);
}
else
{
@ -2345,8 +2337,7 @@ static void actionDroidBase(DROID *psDroid, DROID_ACTION_DATA *psAction)
moveStopDroid(psDroid);
}
psDroid->action = DACTION_NONE;
psDroid->actionX = 0;
psDroid->actionY = 0;
psDroid->actionPos = Vector2i(0, 0);
psDroid->actionStarted = 0;
psDroid->actionPoints = 0;
if (psDroid->numWeaps > 0)
@ -2401,8 +2392,7 @@ static void actionDroidBase(DROID *psDroid, DROID_ACTION_DATA *psAction)
// note the droid's current pos so that scout & patrol orders know how far the
// droid has gone during an attack
// slightly strange place to store this I know, but I didn't want to add any more to the droid
psDroid->actionX = psDroid->pos.x;
psDroid->actionY = psDroid->pos.y;
psDroid->actionPos = psDroid->pos;
setDroidActionTarget(psDroid, psAction->psObj, 0);
if (((psDroid->order == DORDER_ATTACKTARGET
@ -2452,8 +2442,7 @@ static void actionDroidBase(DROID *psDroid, DROID_ACTION_DATA *psAction)
case DACTION_MOVETOREARM:
psDroid->action = DACTION_MOVETOREARM;
psDroid->actionX = psAction->psObj->pos.x;
psDroid->actionY = psAction->psObj->pos.y;
psDroid->actionPos = psAction->psObj->pos;
psDroid->actionStarted = gameTime;
setDroidActionTarget(psDroid, psAction->psObj, 0);
droidX = psDroid->psActionTarget[0]->pos.x;
@ -2486,8 +2475,8 @@ static void actionDroidBase(DROID *psDroid, DROID_ACTION_DATA *psAction)
case DACTION_RETURNTOPOS:
case DACTION_FIRESUPPORT_RETREAT:
psDroid->action = psAction->action;
psDroid->actionX = psAction->x;
psDroid->actionY = psAction->y;
psDroid->actionPos.x = psAction->x;
psDroid->actionPos.y = psAction->y;
psDroid->actionStarted = gameTime;
setDroidActionTarget(psDroid, psAction->psObj, 0);
moveDroidTo(psDroid, psAction->x, psAction->y);
@ -2504,8 +2493,8 @@ static void actionDroidBase(DROID *psDroid, DROID_ACTION_DATA *psAction)
"cannot start build action without a build order");
ASSERT_OR_RETURN( , psAction->x > 0 && psAction->y > 0, "Bad build order position");
psDroid->action = DACTION_MOVETOBUILD;
psDroid->actionX = psAction->x;
psDroid->actionY = psAction->y;
psDroid->actionPos.x = psAction->x;
psDroid->actionPos.y = psAction->y;
if (actionDroidOnBuildPos(psDroid, psDroid->orderX, psDroid->orderY, psDroid->psTarStats))
{
actionHomeBasePos(psDroid->player, &pbx,&pby);
@ -2519,15 +2508,15 @@ static void actionDroidBase(DROID *psDroid, DROID_ACTION_DATA *psAction)
}
else
{
moveDroidToNoFormation(psDroid, psDroid->actionX,psDroid->actionY);
moveDroidToNoFormation(psDroid, psDroid->actionPos.x, psDroid->actionPos.y);
}
break;
case DACTION_DEMOLISH:
ASSERT(psDroid->order == DORDER_DEMOLISH,
"cannot start demolish action without a demolish order");
psDroid->action = DACTION_MOVETODEMOLISH;
psDroid->actionX = psAction->x;
psDroid->actionY = psAction->y;
psDroid->actionPos.x = psAction->x;
psDroid->actionPos.y = psAction->y;
ASSERT((psDroid->psTarget != NULL) && (psDroid->psTarget->type == OBJ_STRUCTURE),
"invalid target for demolish order" );
psDroid->psTarStats = ((STRUCTURE *)psDroid->psTarget)->pStructureType;
@ -2538,8 +2527,8 @@ static void actionDroidBase(DROID *psDroid, DROID_ACTION_DATA *psAction)
//ASSERT( psDroid->order == DORDER_REPAIR,
// "actionDroidBase: cannot start repair action without a repair order" );
psDroid->action = DACTION_MOVETOREPAIR;
psDroid->actionX = psAction->x;
psDroid->actionY = psAction->y;
psDroid->actionPos.x = psAction->x;
psDroid->actionPos.y = psAction->y;
//this needs setting so that automatic repair works
setDroidActionTarget(psDroid, psAction->psObj, 0);
ASSERT((psDroid->psActionTarget[0] != NULL) && (psDroid->psActionTarget[0]->type == OBJ_STRUCTURE),
@ -2558,8 +2547,8 @@ static void actionDroidBase(DROID *psDroid, DROID_ACTION_DATA *psAction)
break;
case DACTION_OBSERVE:
setDroidActionTarget(psDroid, psAction->psObj, 0);
psDroid->actionX = psDroid->pos.x;
psDroid->actionY = psDroid->pos.y;
psDroid->actionPos.x = psDroid->pos.x;
psDroid->actionPos.y = psDroid->pos.y;
if ((secondaryGetState(psDroid, DSO_HALTTYPE) == DSS_HALT_HOLD &&
(psDroid->order == DORDER_NONE || psDroid->order == DORDER_TEMP_HOLD)) ||
cbSensorDroid(psDroid) || objRadarDetector(psDroid))
@ -2599,8 +2588,8 @@ static void actionDroidBase(DROID *psDroid, DROID_ACTION_DATA *psAction)
break;
case DACTION_MOVETOREPAIRPOINT:
psDroid->action = psAction->action;
psDroid->actionX = psAction->x;
psDroid->actionY = psAction->y;
psDroid->actionPos.x = psAction->x;
psDroid->actionPos.y = psAction->y;
psDroid->actionStarted = gameTime;
setDroidActionTarget(psDroid, psAction->psObj, 0);
moveDroidToNoFormation( psDroid, psAction->x, psAction->y );
@ -2611,8 +2600,8 @@ static void actionDroidBase(DROID *psDroid, DROID_ACTION_DATA *psAction)
case DACTION_MOVETOREARMPOINT:
debug( LOG_NEVER, "Unit %d moving to rearm point", psDroid->id);
psDroid->action = psAction->action;
psDroid->actionX = psAction->x;
psDroid->actionY = psAction->y;
psDroid->actionPos.x = psAction->x;
psDroid->actionPos.y = psAction->y;
psDroid->actionStarted = gameTime;
setDroidActionTarget(psDroid, psAction->psObj, 0);
moveDroidToDirect( psDroid, psAction->x, psAction->y );
@ -2624,8 +2613,8 @@ static void actionDroidBase(DROID *psDroid, DROID_ACTION_DATA *psAction)
// ASSERT( psDroid->order == DORDER_DROIDREPAIR,
// "actionDroidBase: cannot start droid repair action without a repair order" );
psDroid->action = DACTION_MOVETODROIDREPAIR;
psDroid->actionX = psAction->x;
psDroid->actionY = psAction->y;
psDroid->actionPos.x = psAction->x;
psDroid->actionPos.y = psAction->y;
setDroidActionTarget(psDroid, psAction->psObj, 0);
//initialise the action points
psDroid->actionPoints = 0;
@ -2645,8 +2634,8 @@ static void actionDroidBase(DROID *psDroid, DROID_ACTION_DATA *psAction)
ASSERT( psDroid->order == DORDER_RESTORE,
"cannot start restore action without a restore order" );
psDroid->action = DACTION_MOVETORESTORE;
psDroid->actionX = psAction->x;
psDroid->actionY = psAction->y;
psDroid->actionPos.x = psAction->x;
psDroid->actionPos.y = psAction->y;
ASSERT( (psDroid->psTarget != NULL) && (psDroid->psTarget->type == OBJ_STRUCTURE),
"invalid target for restore order" );
psDroid->psTarStats = ((STRUCTURE *)psDroid->psTarget)->pStructureType;
@ -2657,8 +2646,8 @@ static void actionDroidBase(DROID *psDroid, DROID_ACTION_DATA *psAction)
ASSERT( psDroid->order == DORDER_CLEARWRECK,
"cannot start clear action without a clear order" );
psDroid->action = DACTION_MOVETOCLEAR;
psDroid->actionX = psAction->x;
psDroid->actionY = psAction->y;
psDroid->actionPos.x = psAction->x;
psDroid->actionPos.y = psAction->y;
ASSERT( (psDroid->psTarget != NULL) && (psDroid->psTarget->type == OBJ_FEATURE),
"invalid target for demolish order" );
psDroid->psTarStats = (BASE_STATS *)((FEATURE *)psDroid->psTarget)->psStats;

View File

@ -300,7 +300,7 @@ DROID::DROID(uint32_t id, unsigned player)
, psTarStats(NULL)
, secondaryOrder(DSS_ARANGE_DEFAULT | DSS_REPLEV_NEVER | DSS_ALEV_ALWAYS | DSS_HALT_GUARD)
, action(DACTION_NONE)
, actionX(0), actionY(0)
, actionPos(0, 0)
, psCurAnim(NULL)
, gameCheckDroid(NULL)
{

View File

@ -195,7 +195,7 @@ struct DROID : public BASE_OBJECT
/* Action data */
DROID_ACTION action;
UDWORD actionX, actionY;
Vector2i actionPos;
BASE_OBJECT* psActionTarget[DROID_MAXWEAPS]; ///< Action target object
UDWORD actionStarted; ///< Game time action started
UDWORD actionPoints; ///< number of points done by action since start

View File

@ -4485,9 +4485,7 @@ static bool loadSaveDroid(const char *pFileName, DROID **ppsCurrentDroidLists)
psDroid->timeLastHit = ini.value("timeLastHit", 0).toInt();
psDroid->secondaryOrder = ini.value("secondaryOrder", DSS_NONE).toInt();
psDroid->action = (DROID_ACTION)ini.value("action", DACTION_NONE).toInt();
tmp = ini.vector2i("action/pos");
psDroid->actionX = tmp.x;
psDroid->actionY = tmp.y;
psDroid->actionPos = ini.vector2i("action/pos");
psDroid->actionStarted = ini.value("actionStarted", 0).toInt();
psDroid->actionPoints = ini.value("actionPoints", 0).toInt();
psDroid->resistance = ini.value("resistance", droidResistance(psDroid)).toInt();
@ -4641,7 +4639,7 @@ static bool writeDroid(WzConfig &ini, DROID *psCurr, bool onMission)
}
ini.setValue("secondaryOrder", psCurr->secondaryOrder);
ini.setValue("action", psCurr->action);
ini.setVector2i("action/pos", Vector2i(psCurr->actionX, psCurr->actionX));
ini.setVector2i("action/pos", psCurr->actionPos);
ini.setValue("actionStarted", psCurr->actionStarted);
ini.setValue("actionPoints", psCurr->actionPoints);
if (psCurr->psTarStats != NULL)

View File

@ -587,9 +587,9 @@ void orderUpdateDroid(DROID *psDroid)
(psDroid->action == DACTION_MOVETOOBSERVE))
{
// attacking something - see if the droid has gone too far, go up to twice the distance we want to go, so that we don't repeatedly turn back when the target is almost in range.
if (objPosDiffSq(psDroid->pos, Vector3i(psDroid->actionX, psDroid->actionY, 0)) > (SCOUT_ATTACK_DIST*2 * SCOUT_ATTACK_DIST*2))
if (objPosDiffSq(psDroid->pos, Vector3i(psDroid->actionPos, 0)) > (SCOUT_ATTACK_DIST*2 * SCOUT_ATTACK_DIST*2))
{
actionDroid(psDroid, DACTION_RETURNTOPOS, psDroid->actionX,psDroid->actionY);
actionDroid(psDroid, DACTION_RETURNTOPOS, psDroid->actionPos.x, psDroid->actionPos.y);
}
}
break;
@ -628,7 +628,7 @@ void orderUpdateDroid(DROID *psDroid)
}
}
Vector2i edgeDiff = removeZ(psDroid->pos) - Vector2i(psDroid->actionX, psDroid->actionY);
Vector2i edgeDiff = removeZ(psDroid->pos) - psDroid->actionPos;
if (psDroid->action != DACTION_MOVE || edgeDiff*edgeDiff <= TILE_UNITS*4 * TILE_UNITS*4)
{
//Watermelon:use orderX,orderY as local space origin and calculate droid direction in local space
@ -650,8 +650,8 @@ void orderUpdateDroid(DROID *psDroid)
(psDroid->action == DACTION_MOVETOOBSERVE))
{
// attacking something - see if the droid has gone too far
xdiff = (SDWORD)psDroid->pos.x - (SDWORD)psDroid->actionX;
ydiff = (SDWORD)psDroid->pos.y - (SDWORD)psDroid->actionY;
xdiff = psDroid->pos.x - psDroid->actionPos.x;
ydiff = psDroid->pos.y - psDroid->actionPos.y;
//if (xdiff*xdiff + ydiff*ydiff > psDroid->sMove.iGuardRadius * psDroid->sMove.iGuardRadius)
if (xdiff*xdiff + ydiff*ydiff > 2000 * 2000)
{
@ -3447,7 +3447,7 @@ bool secondarySetState(DROID *psDroid, SECONDARY_ORDER sec, SECONDARY_STATE Stat
else if ( orderState(psDroid, DORDER_PATROL) )
{
// send the unit back to the patrol
actionDroid(psDroid, DACTION_RETURNTOPOS, psDroid->actionX, psDroid->actionY);
actionDroid(psDroid, DACTION_RETURNTOPOS, psDroid->actionPos.x, psDroid->actionPos.y);
}
}
break;