So I looked deep into the DROD source code and found the problem.
In CCurrentGame:: PushPlayerInDirection() we have this:
CMonster *pMonster = this->pRoom->GetMonsterAtSquare(wDestX, wDestY);
if (pMonster != NULL && pMonster->wType != M_FLUFFBABY)
return false;
if (!this->pRoom->CanPushOntoOTile(wDestX, wDestY))
return false;
if (!this->pRoom->CanPushOntoTTile(wDestX, wDestY))
return false;
if (!this->pRoom->CanPushOntoFTile(this->swordsman.wX, this->swordsman.wY, wDestX, wDestY))
return false;
if (!this->swordsman.Move(wDestX, wDestY))
return false;
This checks to see if the destination tile is free of anything that blocks the push. What it doesn't do, however, is check for blocking Gentryii chains. By adding an extra check, to get this:
CMonster *pMonster = this->pRoom->GetMonsterAtSquare(wDestX, wDestY);
if (pMonster != NULL && pMonster->wType != M_FLUFFBABY)
return false;
if (!this->pRoom->CanPushOntoOTile(wDestX, wDestY))
return false;
if (!this->pRoom->CanPushOntoTTile(wDestX, wDestY))
return false;
if (!this->pRoom->CanPushOntoFTile(this->swordsman.wX, this->swordsman.wY, wDestX, wDestY))
return false;
if (this->pRoom->DoesGentryiiPreventDiagonal(this->swordsman.wX, this->swordsman.wY, wDestX, wDestY))
return false;
if (!this->swordsman.Move(wDestX, wDestY))
return false;
It is no longer possible to push the player past Gentryii chains, as the call to CDbRoom:: DoesGentryiiPreventDiagonal() allows the function to end correctly when a blocking Gentryii is present.
____________________________
[Insert witty comment here]
Qzvlkx?
[Last edited by hyperme at 12-06-2016 07:16 PM]