Use the return codes of pathfinder, improved use of pathfinder.

This commit is contained in:
johns 2001-02-19 17:24:31 +00:00
parent 20574be43e
commit aeaae26210
2 changed files with 370 additions and 284 deletions

View file

@ -49,99 +49,98 @@
*/
local int MoveToWood(Unit* unit)
{
int i;
int x;
int y;
int dx;
int dy;
if( HandleActionMove(unit)>=0 ) { // reached end-point?
if( (i=HandleActionMove(unit))>=0 ) { // reached end-point?
return 0;
}
#ifdef NEW_ORDERS
// FIXME: JOHNS: rewrite this complete sh*t (I have written it :)
//
// reached nearly? and is there wood?
// FIXME: use return value of pathfinder.
//
if( unit->Orders[0].RangeX ) {
++unit->Orders[0].X;
++unit->Orders[0].Y;
}
x=unit->Orders[0].X;
y=unit->Orders[0].Y;
#else
//
// reached nearly? and is there wood?
// FIXME: use return value of pathfinder.
//
if( unit->Command.Data.Move.Range ) {
// FIXME: not correct on map border :(
++unit->Command.Data.Move.DX;
++unit->Command.Data.Move.DY;
}
x=unit->Command.Data.Move.DX;
y=unit->Command.Data.Move.DY;
#endif
dx=x-unit->X;
dy=y-unit->Y;
DebugLevel3Fn("Why %d,%d = %d\n",dx,dy,ForestOnMap(x,y));
if( dx<-1 || dx>1 || dy<-1 || dy>1 || !ForestOnMap(x,y) ) {
#ifdef NEW_ORDERS
if( i==PF_UNREACHABLE ) {
newtry:
if( FindWoodInSight(unit,&unit->Orders[0].X,&unit->Orders[0].Y) ) {
// Move to new wood position
ResetPath(unit->Orders[0]);
unit->Orders[0].Goal=NoUnitP;
unit->Orders[0].RangeX=2;
unit->Orders[0].RangeY=2;
unit->Orders[0].RangeX=unit->Orders[0].RangeY=2;
unit->Orders[0].Action=UnitActionHarvest;
if( unit->Orders[0].X ) {
unit->Orders[0].X--;
}
if( unit->Orders[0].Y ) {
unit->Orders[0].Y--;
}
unit->Orders[0].X--;
unit->Orders[0].Y--;
}
return 0;
}
unit->Orders[0].Action=UnitActionHarvest;
x=unit->Orders[0].X+1;
y=unit->Orders[0].Y+1;
#else
if( i==PF_UNREACHABLE ) {
newtry:
if( FindWoodInSight(unit
,&unit->Command.Data.Move.DX
,&unit->Command.Data.Move.DY) ) {
,&unit->Command.Data.Move.DX,&unit->Command.Data.Move.DY) ) {
// Move to new wood position
ResetPath(unit->Command);
unit->Command.Data.Move.Goal=NoUnitP;
unit->Command.Data.Move.Range=2;
unit->Command.Action=UnitActionHarvest;
if( unit->Command.Data.Move.DX ) {
unit->Command.Data.Move.DX--;
}
if( unit->Command.Data.Move.DY ) {
unit->Command.Data.Move.DY--;
}
unit->Command.Data.Move.DX--;
unit->Command.Data.Move.DY--;
}
return 0;
}
unit->Command.Action=UnitActionHarvest;
x=unit->Command.Data.Move.DX+1;
y=unit->Command.Data.Move.DY+1;
#endif
// turn to wood
UnitHeadingFromDeltaXY(unit,dx,dy);
if( !CheckedForestOnMap(x,y) ) {
//
// Check surrounding for forest
//
x=unit->X;
y=unit->Y;
if( CheckedForestOnMap(x-1,y-1) ) {
--x;
--y;
} else if( CheckedForestOnMap(x-1,y+0) ) {
--x;
} else if( CheckedForestOnMap(x-1,y+1) ) {
--x;
++y;
} else if( CheckedForestOnMap(x+0,y-1) ) {
--y;
} else if( CheckedForestOnMap(x+0,y+1) ) {
++y;
} else if( CheckedForestOnMap(x+1,y-1) ) {
++x;
--y;
} else if( CheckedForestOnMap(x+1,y+0) ) {
++x;
} else if( CheckedForestOnMap(x+1,y+1) ) {
++x;
++y;
} else {
goto newtry;
}
}
// FIXME: don't chop the same wood!
#ifdef NEW_ORDERS
unit->Orders[0].X=x;
unit->Orders[0].Y=y;
unit->Orders[0].Action=UnitActionHarvest;
// turn to wood
UnitHeadingFromDeltaXY(unit,x-unit->X,y-unit->Y);
unit->Value=unit->Data.Harvest.WoodToHarvest;
#else
// FIXME: looks wired wrong
if( unit->WoodToHarvest != CHOP_FOR_WOOD ) {
unit->Value=unit->WoodToHarvest;
} else {
unit->Value=CHOP_FOR_WOOD;
}
unit->Command.Data.Move.DX=x;
unit->Command.Data.Move.DY=y;
unit->Command.Action=UnitActionHarvest;
// turn to wood
UnitHeadingFromDeltaXY(unit,x-unit->X,y-unit->Y);
unit->Value=unit->WoodToHarvest;
#endif
DebugCheck( unit->Wait!=1 );
@ -152,10 +151,9 @@ local int MoveToWood(Unit* unit)
/**
** Chop the wood.
**
** @param unit Unit pointer chopping wood.
** @param unit Pointer to worker unit.
**
**
** Return TRUE if ready, otherwise FALSE.
** @return TRUE if ready, otherwise FALSE.
*/
local int ChopWood(Unit* unit)
{
@ -190,17 +188,14 @@ local int ChopWood(Unit* unit)
//
// Wood gone while chopping?
//
if( !ForestOnMap(unit->Orders[0].X
,unit->Orders[0].Y) ) {
if( FindWoodInSight(unit
,&unit->Orders[0].X
,&unit->Orders[0].Y) ) {
if( !ForestOnMap(unit->Orders[0].X,unit->Orders[0].Y) ) {
if( FindWoodInSight(unit,&unit->Orders[0].X,&unit->Orders[0].Y) ) {
ResetPath(unit->Orders[0]);
unit->Orders[0].Goal=NoUnitP;
unit->Orders[0].RangeX=0;
unit->Orders[0].RangeY=0;
// FIXME: shouldn't it be range=1 ??
unit->Orders[0].RangeX=unit->Orders[0].RangeY=2;
DebugCheck( unit->Orders[0].Action!=UnitActionHarvest );
unit->Orders[0].X--;
unit->Orders[0].Y--;
unit->SubAction=0;
} else {
unit->Orders[0].Action=UnitActionStill;
@ -220,8 +215,9 @@ local int ChopWood(Unit* unit)
,&unit->Command.Data.Move.DY) ) {
ResetPath(unit->Command);
unit->Command.Data.Move.Goal=NoUnitP;
unit->Command.Data.Move.Range=0;
// FIXME: shouldn't it be range=1 ??
unit->Command.Data.Move.Range=2;
unit->Command.Data.Move.DX--;
unit->Command.Data.Move.DY--;
DebugCheck( unit->Command.Action!=UnitActionHarvest );
unit->SubAction=0;
} else {
@ -278,27 +274,17 @@ local int ChopWood(Unit* unit)
unit->SubAction=0;
} else {
ResetPath(unit->Orders[0]);
unit->Orders[0].RangeX=1;
unit->Orders[0].RangeY=1;
unit->Orders[0].RangeX=unit->Orders[0].RangeY=1;
unit->Orders[0].Goal=destu;
RefsDebugCheck( !destu->Refs );
destu->Refs++;
#if 1
// Fast movement need this??
NearestOfUnit(destu,unit->X,unit->Y
,&unit->Orders[0].X
,&unit->Orders[0].Y);
#else
unit->Orders[0].X=destu->X;
unit->Orders[0].Y=destu->Y;
#endif
unit->Orders[0].X=-1;
unit->Orders[0].Y=-1;
DebugLevel3Fn("Return to %Zd=%d,%d\n"
,UnitNumber(destu)
,unit->Orders[0].Data.Move.DX
,unit->Orders[0].Data.Move.DY);
,UnitNumber(destu),unit->Orders[0].X,unit->Orders[0].Y);
DebugCheck( unit->Orders[0].Action!=UnitActionHarvest );
return 1;
}
#else
MapRemoveWood(unit->Command.Data.Move.DX
,unit->Command.Data.Move.DY);
@ -315,24 +301,17 @@ local int ChopWood(Unit* unit)
ResetPath(unit->Command);
unit->Command.Data.Move.Range=1;
unit->Command.Data.Move.Goal=destu;
RefsDebugCheck( !destu->Refs );
destu->Refs++;
#if 1
// Fast movement need this??
NearestOfUnit(destu,unit->X,unit->Y
,&unit->Command.Data.Move.DX
,&unit->Command.Data.Move.DY);
#else
unit->Command.Data.Move.DX=destu->X;
unit->Command.Data.Move.DY=destu->Y;
#endif
unit->Command.Data.Move.DX=-1;
unit->Command.Data.Move.DY=-1;
DebugLevel3Fn("Return to %Zd=%d,%d\n"
,UnitNumber(destu)
,unit->Command.Data.Move.DX
,unit->Command.Data.Move.DY);
,UnitNumber(destu)
,unit->Command.Data.Move.DX
,unit->Command.Data.Move.DY);
DebugCheck( unit->Command.Action!=UnitActionHarvest );
return 1;
}
#endif
}
}
@ -341,109 +320,120 @@ local int ChopWood(Unit* unit)
/**
** Return with the wood.
** Return TRUE if reached, otherwise FALSE.
**
** @param unit unit pointer.
**
** @return TRUE if reached, otherwise FALSE.
*/
local int ReturnWithWood(Unit* unit)
{
int x;
int y;
Unit* destu;
int i;
if( HandleActionMove(unit)>=0 ) { // reached end-point?
if( (i=HandleActionMove(unit))>=0 ) { // reached end-point?
return 0;
}
DebugCheck( unit->Wait!=1 );
#ifdef NEW_ORDERS
destu=unit->Orders[0].Goal;
//
// Target is dead, stop harvest
//
if( destu ) {
if( destu->Destroyed ) {
DebugLevel0Fn("Destroyed unit\n");
RefsDebugCheck( !destu->Refs );
if( !--destu->Refs ) {
ReleaseUnit(destu);
}
unit->Orders[0].Goal=NoUnitP;
// FIXME: perhaps I should choose an alternative
unit->Orders[0].Action=UnitActionStill;
return 0;
} else if( destu->Removed || !destu->HP
|| destu->Orders[0].Action==UnitActionDie ) {
RefsDebugCheck( !destu->Refs );
--destu->Refs;
RefsDebugCheck( !destu->Refs );
unit->Orders[0].Goal=NoUnitP;
// FIXME: perhaps I should choose an alternative
unit->Orders[0].Action=UnitActionStill;
return 0;
}
unit->Orders[0].Goal=NoUnitP;
#else
destu=unit->Command.Data.Move.Goal;
DebugCheck( !destu );
//
// Target is dead, stop harvest
//
if( destu ) {
if( destu->Destroyed ) {
DebugLevel0Fn("Destroyed unit\n");
RefsDebugCheck( !destu->Refs );
if( !--destu->Refs ) {
ReleaseUnit(destu);
}
unit->Command.Data.Move.Goal=NoUnitP;
// FIXME: perhaps I should choose an alternative
unit->Command.Action=UnitActionStill;
return 0;
} else if( destu->Removed || !destu->HP
|| destu->Command.Action==UnitActionDie ) {
RefsDebugCheck( !destu->Refs );
--destu->Refs;
RefsDebugCheck( !destu->Refs );
unit->Command.Data.Move.Goal=NoUnitP;
// FIXME: perhaps I should choose an alternative
unit->Command.Action=UnitActionStill;
return 0;
if( destu->Destroyed ) {
DebugLevel0Fn("Destroyed unit\n");
RefsDebugCheck( !destu->Refs );
if( !--destu->Refs ) {
ReleaseUnit(destu);
}
unit->Command.Data.Move.Goal=NoUnitP;
#endif
unit->Orders[0].Goal=NoUnitP;
// FIXME: perhaps we should choose an alternative
unit->Orders[0].Action=UnitActionStill;
unit->SubAction=0;
return 0;
} else if( destu->Removed || !destu->HP
|| destu->Orders[0].Action==UnitActionDie ) {
RefsDebugCheck( !destu->Refs );
--destu->Refs;
RefsDebugCheck( !destu->Refs );
unit->Orders[0].Goal=NoUnitP;
// FIXME: perhaps we should choose an alternative
unit->Orders[0].Action=UnitActionStill;
unit->SubAction=0;
return 0;
}
unit->Orders[0].Goal=NoUnitP;
#ifdef NEW_ORDERS
x=unit->Orders[0].X;
y=unit->Orders[0].Y;
#else
x=unit->Command.Data.Move.DX;
y=unit->Command.Data.Move.DY;
#endif
destu=WoodDepositOnMap(x,y);
RefsDebugCheck( !destu->Refs );
--destu->Refs;
RefsDebugCheck( !destu->Refs );
// FIXME: could use the return value of the pathfinder
if( !destu || MapDistanceToUnit(unit->X,unit->Y,destu)!=1 ) {
DebugLevel2Fn("WOOD-DEPOSIT NOT REACHED %Zd=%d,%d ? %d\n"
if( i==PF_UNREACHABLE ) {
// FIXME: could try another depot, or retry later.
DebugLevel2Fn("WOOD-DEPOSIT NOT REACHED %Zd=%d,%d ? %d\n"
,UnitNumber(destu),x,y
,MapDistanceToUnit(unit->X,unit->Y,destu));
#ifdef NEW_ORDERS
unit->Orders[0].Action=UnitActionStill;
#else
unit->Command.Action=UnitActionStill;
#endif
unit->SubAction=0;
return 0;
}
#ifdef NEW_ORDERS
unit->Orders[0].Action=UnitActionHarvest;
#else
destu=unit->Command.Data.Move.Goal;
DebugCheck( !destu );
//
// Target is dead, stop harvest
//
if( destu->Destroyed ) {
DebugLevel0Fn("Destroyed unit\n");
RefsDebugCheck( !destu->Refs );
if( !--destu->Refs ) {
ReleaseUnit(destu);
}
unit->Command.Data.Move.Goal=NoUnitP;
// FIXME: perhaps we should choose an alternative
unit->Command.Action=UnitActionStill;
unit->SubAction=0;
return 0;
} else if( destu->Removed || !destu->HP
|| destu->Command.Action==UnitActionDie ) {
RefsDebugCheck( !destu->Refs );
--destu->Refs;
RefsDebugCheck( !destu->Refs );
unit->Command.Data.Move.Goal=NoUnitP;
// FIXME: perhaps we should choose an alternative
unit->Command.Action=UnitActionStill;
unit->SubAction=0;
return 0;
}
unit->Command.Data.Move.Goal=NoUnitP;
RefsDebugCheck( !destu->Refs );
--destu->Refs;
RefsDebugCheck( !destu->Refs );
if( i==PF_UNREACHABLE ) {
// FIXME: could try another depot, or retry later.
DebugLevel2Fn("WOOD-DEPOSIT NOT REACHED %Zd=%d,%d ? %d\n"
,UnitNumber(destu),destu->X,destu->Y
,MapDistanceToUnit(unit->X,unit->Y,destu));
unit->Command.Action=UnitActionStill;
unit->SubAction=0;
return 0;
}
unit->Command.Action=UnitActionHarvest;
#endif
RemoveUnit(unit);
@ -463,8 +453,7 @@ local int ReturnWithWood(Unit* unit)
} else if( unit->Type==UnitTypeHumanWorkerWithWood ) {
unit->Type=UnitTypeHumanWorker;
} else {
DebugLevel0Fn("Wrong unit for returning wood %d\n"
,unit->Type->Type);
DebugLevel0Fn("Wrong unit for returning wood %d\n",unit->Type->Type);
}
if( WAIT_FOR_WOOD<MAX_UNIT_WAIT ) {
@ -477,8 +466,10 @@ local int ReturnWithWood(Unit* unit)
return 1;
}
/*
/**
** Wait in wood deposit.
**
** @param unit Pointer to worker unit.
*/
local int WaitInWoodDeposit(Unit* unit)
{
@ -502,7 +493,7 @@ local int WaitInWoodDeposit(Unit* unit)
unit->Orders[0].Action=UnitActionHarvest;
ResetPath(unit->Orders[0]);
unit->Orders[0].Goal=NoUnitP;
unit->Orders[0].RangeX=unit->Orders[0].RangeY=0;
unit->Orders[0].RangeX=unit->Orders[0].RangeY=1;
// FIXME: works this? where store I the return point?
CheckUnitToBeDrawn(unit);
@ -521,7 +512,7 @@ local int WaitInWoodDeposit(Unit* unit)
unit->Command.Action=UnitActionHarvest;
ResetPath(unit->Command);
unit->Command.Data.Move.Goal=NoUnitP;
unit->Command.Data.Move.Range=0;
unit->Command.Data.Move.Range=1;
unit->Command.Data.Move.DX=unit->Command.Data.Move.SX;
unit->Command.Data.Move.DY=unit->Command.Data.Move.SY;
@ -542,13 +533,17 @@ local int WaitInWoodDeposit(Unit* unit)
return 0;
}
/*
/**
** Unit Harvest:
** Move into forest.
** Chop the tree.
** Return to wood store.
** Deliver wood.
** Restart from beginning.
**
** FIXME: we should write a generic resource function
**
** @param unit Pointer to worker unit.
*/
global void HandleActionHarvest(Unit* unit)
{

View file

@ -47,77 +47,130 @@
local int MoveToGoldMine(Unit* unit)
{
Unit* destu;
int i;
if( HandleActionMove(unit)>=0 ) { // reached end-point?
if( (i=HandleActionMove(unit))>=0 ) { // reached end-point?
return 0;
}
// FIXME: HandleActionMove return this: reached nearly, use it!
#ifdef NEW_ORDERS
unit->Orders[0].Action=UnitActionMineGold;
destu=unit->Orders[0].Goal;
if( destu && (destu->Destroyed || !destu->HP) ) {
DebugLevel1Fn("WAIT after goldmine destroyed %d\n",unit->Wait);
DebugCheck( !destu );
DebugCheck( unit->Wait!=1 );
//
// Target is dead, stop mining.
//
if( destu->Destroyed ) {
DebugLevel0Fn("Destroyed unit\n");
RefsDebugCheck( !destu->Refs );
if( !--destu->Refs ) {
ReleaseUnit(destu);
}
unit->Orders[0].Goal=NoUnitP;
// FIXME: perhaps we should choose an alternative
unit->Orders[0].Action=UnitActionStill;
unit->SubAction=0;
return 0;
} else if( destu->Removed || !destu->HP
|| destu->Orders[0].Action==UnitActionDie ) {
RefsDebugCheck( !destu->Refs );
--destu->Refs;
RefsDebugCheck( !destu->Refs );
unit->Orders[0].Goal=NoUnitP;
// FIXME: perhaps we should choose an alternative
unit->Orders[0].Action=UnitActionStill;
unit->SubAction=0;
return 0;
}
if( !destu || MapDistanceToUnit(unit->X,unit->Y,destu)!=1 ) {
DebugLevel3Fn("GOLD-MINE NOT REACHED %d,%d\n",dx,dy);
unit->Orders[0].Action=UnitActionMineGold;
//
// Check if mine could be reached.
/
if( i==PF_UNREACHABLE ) {
// FIXME: could try another mine, or retry later.
DebugLevel3Fn("GOLD-MINE NOT REACHED %Zd=%d,%d ? %d\n"
,UnitNumber(destu),x,y,MapDistanceToUnit(unit->X,unit->Y,destu));
return -1;
}
//
// Activate gold-mine
//
// FIXME: hmmm... we're in trouble here.
// we should check if there's still some gold left in the mine instead.
RefsDebugCheck( !destu->Refs );
--destu->Refs;
RefsDebugCheck( !destu->Refs );
unit->Orders[0].Goal=NoUnitP;
//
// Activate gold-mine
//
// FIXME: hmmm... we're in trouble here.
// we should check if there's still some gold left in the mine instead.
destu->Data.Resource.Active++;
#else
unit->Command.Action=UnitActionMineGold;
destu=unit->Command.Data.Move.Goal;
if( destu && (destu->Destroyed || !destu->HP) ) {
DebugLevel1Fn("WAIT after goldmine destroyed %d\n",unit->Wait);
DebugCheck( !destu );
DebugCheck( unit->Wait!=1 );
//
// Target is dead, stop mining.
//
if( destu->Destroyed ) {
DebugLevel0Fn("Destroyed unit\n");
RefsDebugCheck( !destu->Refs );
if( !--destu->Refs ) {
ReleaseUnit(destu);
}
unit->Command.Data.Move.Goal=NoUnitP;
// FIXME: perhaps we should choose an alternative
unit->Command.Action=UnitActionStill;
unit->SubAction=0;
return 0;
} else if( destu->Removed || !destu->HP
|| destu->Command.Action==UnitActionDie ) {
RefsDebugCheck( !destu->Refs );
--destu->Refs;
RefsDebugCheck( !destu->Refs );
unit->Command.Data.Move.Goal=NoUnitP;
// FIXME: perhaps we should choose an alternative
unit->Command.Action=UnitActionStill;
unit->SubAction=0;
return 0;
}
if( !destu || MapDistanceToUnit(unit->X,unit->Y,destu)!=1 ) {
DebugLevel3Fn("GOLD-MINE NOT REACHED %d,%d\n",dx,dy);
unit->Command.Action=UnitActionMineGold;
//
// Check if mine could be reached.
//
if( i==PF_UNREACHABLE ) {
// FIXME: could try another mine, or retry later.
DebugLevel3Fn("GOLD-MINE NOT REACHED %Zd=%d,%d ? %d\n"
,UnitNumber(destu),destu->X,destu->Y
,MapDistanceToUnit(unit->X,unit->Y,destu));
return -1;
}
RefsDebugCheck( !destu->Refs );
--destu->Refs;
RefsDebugCheck( !destu->Refs );
unit->Command.Data.Move.Goal=NoUnitP;
//
// Activate gold-mine
//
// FIXME: hmmm... we're in trouble here.
// we should check if there's still some gold left in the mine instead.
RefsDebugCheck( !destu->Refs );
--destu->Refs;
RefsDebugCheck( !destu->Refs );
unit->Command.Data.Move.Goal=NoUnitP;
destu->Command.Data.GoldMine.Active++;
#endif
destu->Frame=1; // FIXME: should be configurable
if( !destu->Frame ) {
destu->Frame=1; // FIXME: should be configurable
CheckUnitToBeDrawn(destu);
}
RemoveUnit(unit);
unit->X=destu->X;
@ -165,10 +218,12 @@ local int MineInGoldmine(Unit* unit)
#ifdef NEW_ORDERS
if( !--mine->Data.Resource.Active ) {
mine->Frame=0;
CheckUnitToBeDrawn(mine);
}
#else
if( !--mine->Command.Data.GoldMine.Active ) {
mine->Frame=0;
CheckUnitToBeDrawn(mine);
}
#endif
if( IsSelected(mine) ) {
@ -190,6 +245,9 @@ local int MineInGoldmine(Unit* unit)
}
// FIXME: I use goldmine after destory!!!
//
// Find gold depot
//
#ifdef NEW_ORDERS
if( !(destu=FindGoldDeposit(unit,unit->X,unit->Y)) ) {
DropOutOnSide(unit,LookingW
@ -203,18 +261,11 @@ local int MineInGoldmine(Unit* unit)
,mine->Type->TileWidth,mine->Type->TileHeight);
ResetPath(unit->Orders[0]);
unit->Orders[0].Goal=destu;
RefsDebugCheck( !destu->Refs );
++destu->Refs;
unit->Orders[0].RangeX=unit->Orders[0].RangeY=1;
#if 1
// FIXME: old pathfinder didn't found the path to the nearest
// FIXME: point of the unit
NearestOfUnit(destu,unit->X,unit->Y
,&unit->Orders[0].X
,&unit->Orders[0].Y);
#else
unit->Orders[0].X=destu->X;
unit->Orders[0].Y=destu->Y;
#endif
unit->Orders[0].X=-1;
unit->Orders[0].Y=-1;
unit->Orders[0].Action=UnitActionMineGold;
DebugLevel3Fn("Mine with deposit %d,%d\n",destu->X,destu->Y);
}
@ -231,31 +282,26 @@ local int MineInGoldmine(Unit* unit)
,mine->Type->TileWidth,mine->Type->TileHeight);
ResetPath(unit->Command);
unit->Command.Data.Move.Goal=destu;
RefsDebugCheck( !destu->Refs );
++destu->Refs;
unit->Command.Data.Move.Range=1;
#if 1
// FIXME: old pathfinder didn't found the path to the nearest
// FIXME: point of the unit
NearestOfUnit(destu,unit->X,unit->Y
,&unit->Command.Data.Move.DX
,&unit->Command.Data.Move.DY);
#else
unit->Command.Data.Move.DX=destu->X;
unit->Command.Data.Move.DY=destu->Y;
#endif
unit->Command.Data.Move.DX=-1;
unit->Command.Data.Move.DY=-1;
unit->Command.Action=UnitActionMineGold;
DebugLevel3Fn("Mine with deposit %d,%d\n",destu->X,destu->Y);
}
#endif
//
// Change unit outfit. (Unit type is used for this.)
//
if( unit->Type==UnitTypeOrcWorker ) {
unit->Type=UnitTypeOrcWorkerWithGold;
} else if( unit->Type==UnitTypeHumanWorker ) {
unit->Type=UnitTypeHumanWorkerWithGold;
} else {
DebugLevel0Fn("Wrong unit (%d,%d) for mining gold %d (%s)\n"
,unit->X,unit->Y
,unit->Type->Type,unit->Type->Name);
,unit->X,unit->Y,unit->Type->Type,unit->Type->Name);
}
CheckUnitToBeDrawn(unit);
if( IsSelected(unit) ) {
@ -287,61 +333,114 @@ local int MineInGoldmine(Unit* unit)
*/
local int MoveToGoldDeposit(Unit* unit)
{
int x;
int y;
int i;
Unit* destu;
if( HandleActionMove(unit)>=0 ) { // reached end-point?
if( (i=HandleActionMove(unit))>=0 ) { // reached end-point?
return 0;
}
// FIXME: HandleActionMove return this: reached nearly, use it!
#ifdef NEW_ORDERS
unit->Orders[0].Action=UnitActionMineGold;
destu=unit->Orders[0].Goal;
if( destu && (destu->Destroyed || !destu->HP) ) {
DebugCheck( !destu );
DebugCheck( unit->Wait!=1 );
//
// Target is dead, stop mining.
//
if( destu->Destroyed ) {
DebugLevel0Fn("Destroyed unit\n");
RefsDebugCheck( !destu->Refs );
if( !--destu->Refs ) {
ReleaseUnit(destu);
}
unit->Orders[0].Goal=NoUnitP;
// FIXME: perhaps we should choose an alternative
unit->Orders[0].Action=UnitActionStill;
unit->SubAction=0;
return 0;
} else if( destu->Removed || !destu->HP
|| destu->Orders[0].Action==UnitActionDie ) {
RefsDebugCheck( !destu->Refs );
--destu->Refs;
RefsDebugCheck( !destu->Refs );
unit->Orders[0].Goal=NoUnitP;
// FIXME: perhaps we should choose an alternative
unit->Orders[0].Action=UnitActionStill;
unit->SubAction=0;
return 0;
}
x=unit->Orders[0].X;
y=unit->Orders[0].Y;
#else
unit->Command.Action=UnitActionMineGold;
unit->Orders[0].Action=UnitActionMineGold;
destu=unit->Command.Data.Move.Goal;
if( destu && (destu->Destroyed || !destu->HP) ) {
RefsDebugCheck( !destu->Refs );
if( !--destu->Refs ) {
ReleaseUnit(destu);
}
unit->Command.Action=UnitActionStill;
unit->SubAction=0;
return 0;
}
x=unit->Command.Data.Move.DX;
y=unit->Command.Data.Move.DY;
#endif
DebugCheck( destu!=GoldDepositOnMap(x,y) );
if( !destu || MapDistanceToUnit(unit->X,unit->Y,destu)!=1 ) {
DebugLevel3Fn("GOLD-DEPOSIT NOT REACHED %Zd=%d,%d ? %d\n"
,UnitNumber(destu),x,y
,MapDistanceToUnit(unit->X,unit->Y,destu));
//
// Check if depot could be reached.
/
if( i==PF_UNREACHABLE ) {
// FIXME: could try another mine, or retry later.
DebugLevel3Fn("GOLD-DEPOT NOT REACHED %Zd=%d,%d ? %d\n"
,UnitNumber(destu),x,y,MapDistanceToUnit(unit->X,unit->Y,destu));
return -1;
}
RefsDebugCheck( !destu->Refs );
--destu->Refs;
RefsDebugCheck( !destu->Refs );
unit->Orders[0].Goal=NoUnitP;
#else
destu=unit->Command.Data.Move.Goal;
DebugCheck( !destu );
DebugCheck( unit->Wait!=1 );
//
// Target is dead, stop mining.
//
if( destu->Destroyed ) {
DebugLevel0Fn("Destroyed unit\n");
RefsDebugCheck( !destu->Refs );
if( !--destu->Refs ) {
ReleaseUnit(destu);
}
unit->Command.Data.Move.Goal=NoUnitP;
// FIXME: perhaps we should choose an alternative
unit->Command.Action=UnitActionStill;
unit->SubAction=0;
return 0;
} else if( destu->Removed || !destu->HP
|| destu->Command.Action==UnitActionDie ) {
RefsDebugCheck( !destu->Refs );
--destu->Refs;
RefsDebugCheck( !destu->Refs );
unit->Command.Data.Move.Goal=NoUnitP;
// FIXME: perhaps we should choose an alternative
unit->Command.Action=UnitActionStill;
unit->SubAction=0;
return 0;
}
unit->Command.Action=UnitActionMineGold;
//
// Check if mine could be reached.
//
if( i==PF_UNREACHABLE ) {
// FIXME: could try another mine, or retry later.
DebugLevel3Fn("GOLD-MINE NOT REACHED %Zd=%d,%d ? %d\n"
,UnitNumber(destu),destu->X,destu->Y
,MapDistanceToUnit(unit->X,unit->Y,destu));
return -1;
}
RefsDebugCheck( !destu->Refs );
--destu->Refs;
RefsDebugCheck( !destu->Refs );
unit->Command.Data.Move.Goal=NoUnitP;
#endif
RemoveUnit(unit);
unit->X=destu->X;
@ -361,8 +460,7 @@ local int MoveToGoldDeposit(Unit* unit)
unit->Type=UnitTypeHumanWorker;
} else {
DebugLevel0Fn("Wrong unit (%d,%d) for returning gold %d (%s)\n"
,unit->X,unit->Y
,unit->Type->Type,unit->Type->Name);
,unit->X,unit->Y,unit->Type->Type,unit->Type->Name);
}
if( WAIT_FOR_GOLD<MAX_UNIT_WAIT ) {
@ -376,6 +474,7 @@ local int MoveToGoldDeposit(Unit* unit)
}
/**
** Store the gold in the gold depot.
**
** @param unit Pointer to worker unit.
**
@ -389,7 +488,8 @@ local int StoreGoldInDeposit(Unit* unit)
DebugLevel3Fn("Waiting\n");
if( !unit->Value ) {
#ifdef NEW_ORDERS
depot=unit->Orders[0].Goal;
depot=GoldDepositOnMap(unit->X,unit->Y);
DebugCheck( !depot );
// Could be destroyed, but than we couldn't be in?
// FIXME: return to last position!
@ -404,20 +504,15 @@ local int StoreGoldInDeposit(Unit* unit)
,depot->Type->TileWidth,depot->Type->TileHeight);
ResetPath(unit->Command);
unit->Orders[0].Goal=destu;
RefsDebugCheck( !destu->Refs );
++destu->Refs;
unit->Orders[0].RangeX=unit->Orders[0].RangeY=1;
#if 1
// FIXME: old pathfinder didn't found the path to the nearest
// FIXME: point of the unit
NearestOfUnit(destu,unit->X,unit->Y
,&unit->Orders[0].X,&unit->Orders[0].Y);
#else
unit->Orders[0].X=destu->X;
unit->Orders[0].Y=destu->Y;
#endif
unit->Orders[0].X=-1;
unit->Orders[0].Y=-1;
unit->Orders[0].Action=UnitActionMineGold;
#else
depot=unit->Command.Data.Move.Goal;
depot=GoldDepositOnMap(unit->X,unit->Y);
DebugCheck( !depot );
// Could be destroyed, but than we couldn't be in?
// FIXME: return to last position!
@ -432,17 +527,11 @@ local int StoreGoldInDeposit(Unit* unit)
,depot->Type->TileWidth,depot->Type->TileHeight);
ResetPath(unit->Command);
unit->Command.Data.Move.Goal=destu;
RefsDebugCheck( !destu->Refs );
++destu->Refs;
unit->Command.Data.Move.Range=1;
#if 1
// FIXME: old pathfinder didn't found the path to the nearest
// FIXME: point of the unit
NearestOfUnit(destu,unit->X,unit->Y
,&unit->Command.Data.Move.DX,&unit->Command.Data.Move.DY);
#else
unit->Command.Data.Move.DX=destu->X;
unit->Command.Data.Move.DY=destu->Y;
#endif
unit->Command.Data.Move.DX=-1;
unit->Command.Data.Move.DY=-1;
unit->Command.Action=UnitActionMineGold;
#endif
}
@ -493,16 +582,17 @@ global void HandleActionMineGold(Unit* unit)
--unit->Orders[0].Goal->Refs;
RefsDebugCheck( !unit->Orders[0].Goal->Refs );
unit->Orders[0].Goal=NoUnitP;
}
#else
unit->Command.Action=UnitActionStill;
unit->SubAction=0;
if( unit->Command.Data.Move.Goal ) {
RefsDebugCheck( !unit->Command.Data.Move.Goal->Refs );
RefsDebugCheck(!unit->Command.Data.Move.Goal->Refs);
--unit->Command.Data.Move.Goal->Refs;
RefsDebugCheck( !unit->Command.Data.Move.Goal->Refs );
RefsDebugCheck(!unit->Command.Data.Move.Goal->Refs);
unit->Command.Data.Move.Goal=NoUnitP;
#endif
}
#endif
}
} else {
unit->SubAction=64;
@ -525,10 +615,11 @@ global void HandleActionMineGold(Unit* unit)
case 65:
case 66:
case 67:
case 68: // 4 tries to reach depot
case 68:
case 69: // 4 tries to reach depot
if( (ret=MoveToGoldDeposit(unit)) ) {
if( ret==-1 ) {
if( ++unit->SubAction==69 ) {
if( ++unit->SubAction==70 ) {
#ifdef NEW_ORDERS
unit->Orders[0].Action=UnitActionStill;
unit->SubAction=0;
@ -542,9 +633,9 @@ global void HandleActionMineGold(Unit* unit)
unit->Command.Action=UnitActionStill;
unit->SubAction=0;
if( unit->Command.Data.Move.Goal ) {
RefsDebugCheck( !unit->Command.Data.Move.Goal->Refs );
RefsDebugCheck(!unit->Command.Data.Move.Goal->Refs);
--unit->Command.Data.Move.Goal->Refs;
RefsDebugCheck( !unit->Command.Data.Move.Goal->Refs );
RefsDebugCheck(!unit->Command.Data.Move.Goal->Refs);
unit->Command.Data.Move.Goal=NoUnitP;
}
#endif