diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/info.cc | 38 | ||||
| -rw-r--r-- | src/map.cc | 2 |
2 files changed, 28 insertions, 12 deletions
diff --git a/src/info.cc b/src/info.cc index ac467a9..8102801 100644 --- a/src/info.cc +++ b/src/info.cc @@ -1053,17 +1053,33 @@ bool SearchFlightField(uint32 FugitiveID, uint32 PursuerID, int *x, int *y, int return false; } - int Dir[8]; - Dir[0] = (Fugitive->posy <= Pursuer->posy) ? DIRECTION_NORTH : DIRECTION_NONE; - Dir[1] = (Fugitive->posx >= Pursuer->posx) ? DIRECTION_EAST : DIRECTION_NONE; - Dir[2] = (Fugitive->posy >= Pursuer->posy) ? DIRECTION_SOUTH : DIRECTION_NONE; - Dir[3] = (Fugitive->posx <= Pursuer->posx) ? DIRECTION_WEST : DIRECTION_NONE; - Dir[4] = (Fugitive->posx <= Pursuer->posx && Fugitive->posy >= Pursuer->posy) ? DIRECTION_SOUTHWEST : DIRECTION_NONE; - Dir[5] = (Fugitive->posx >= Pursuer->posx && Fugitive->posy >= Pursuer->posy) ? DIRECTION_SOUTHEAST : DIRECTION_NONE; - Dir[6] = (Fugitive->posx >= Pursuer->posx && Fugitive->posy <= Pursuer->posy) ? DIRECTION_NORTHEAST : DIRECTION_NONE; - Dir[7] = (Fugitive->posx <= Pursuer->posx && Fugitive->posy <= Pursuer->posy) ? DIRECTION_NORTHWEST : DIRECTION_NONE; - RandomShuffle(&Dir[0], 4); - RandomShuffle(&Dir[4], 4); + int Dir[9]; + + // NOTE(fusion): Prefer axial direction away from the pursuer. + int DistX = std::abs(Fugitive->posx - Pursuer->posx); + int DistY = std::abs(Fugitive->posy - Pursuer->posy); + if(DistY > DistX){ + Dir[0] = (Fugitive->posy < Pursuer->posy) ? DIRECTION_NORTH : DIRECTION_SOUTH; + }else if (DistX > DistY){ + Dir[0] = (Fugitive->posx < Pursuer->posx) ? DIRECTION_WEST : DIRECTION_EAST; + }else{ + Dir[0] = DIRECTION_NONE; + } + + // NOTE(fusion): Fallback to random axial direction away from the pursuer. + Dir[1] = (Fugitive->posy <= Pursuer->posy) ? DIRECTION_NORTH : DIRECTION_NONE; + Dir[2] = (Fugitive->posx >= Pursuer->posx) ? DIRECTION_EAST : DIRECTION_NONE; + Dir[3] = (Fugitive->posy >= Pursuer->posy) ? DIRECTION_SOUTH : DIRECTION_NONE; + Dir[4] = (Fugitive->posx <= Pursuer->posx) ? DIRECTION_WEST : DIRECTION_NONE; + RandomShuffle(&Dir[1], 4); + + // NOTE(fusion): Fallback to diagonal direction away from the pursuer. + Dir[5] = (Fugitive->posx <= Pursuer->posx && Fugitive->posy >= Pursuer->posy) ? DIRECTION_SOUTHWEST : DIRECTION_NONE; + Dir[6] = (Fugitive->posx >= Pursuer->posx && Fugitive->posy >= Pursuer->posy) ? DIRECTION_SOUTHEAST : DIRECTION_NONE; + Dir[7] = (Fugitive->posx >= Pursuer->posx && Fugitive->posy <= Pursuer->posy) ? DIRECTION_NORTHEAST : DIRECTION_NONE; + Dir[8] = (Fugitive->posx <= Pursuer->posx && Fugitive->posy <= Pursuer->posy) ? DIRECTION_NORTHWEST : DIRECTION_NONE; + RandomShuffle(&Dir[5], 4); + for(int i = 0; i < NARRAY(Dir); i += 1){ if(Dir[i] == DIRECTION_NONE){ continue; @@ -542,7 +542,7 @@ static void ResizeHashTable(void){ NewType[0] = STATUS_PERMANENT; NewData[0] = HashTableData[0]; - for(uint32 i = 1; i < NewSize; i += 1){ + for(uint32 i = 1; i < OldSize; i += 1){ if(HashTableType[i] != STATUS_FREE){ if(HashTableType[i] == STATUS_SWAPPED){ UnswapSector((uintptr)HashTableData[i]); |
