Announcement: Be excellent to each other.


Caravel Forum : DROD Boards : Bugs : Player can be pushed across a diagonal gentryii chain.
New Topic New Poll Post Reply
Poster Message
Insoluble
Level: Smitemaster
Avatar
Rank Points: 976
Registered: 09-04-2014
IP: Logged

File: Bad times with mimic sticks.hold (1.3 KB)
Downloaded 2 times.
License: Public Domain
icon Player can be pushed across a diagonal gentryii chain. (+1)  
As the topic states, the player can be pushed across a diagonal gentryii chain. This happened for me in build 5.1.0.6501, but uncopy2002 was able to verify that it's still a problem in 6512. Bomber50 did some further testing and it doesn't seem to matter who is doing the pushing or what the weapon is, but a short hold is attached with a mimic and a stick. I think we can all agree that this is horrible and should be fixed in the next build. Meanwhile, please no one make an actual puzzle based on this.

____________________________
Links to neat forum tools that I always have trouble finding:
Click here to view the secret text

06-13-2016 at 02:31 AM
View Profile Send Private Message to User Send Email to User Show all user's posts High Scores This architect's holds Quote Reply
uncopy2002
Level: Smiter
Rank Points: 356
Registered: 07-28-2014
IP: Logged
icon Re: Player can be pushed across a diagonal gentryii chain. (+5)  
Two example uses of this bug:

Click here to view the secret text


Click here to view the secret text

06-13-2016 at 02:48 AM
View Profile Send Private Message to User Show all user's posts High Scores Quote Reply
hyperme
Level: Smiter
Avatar
Rank Points: 436
Registered: 06-23-2006
IP: Logged
icon Re: Player can be pushed across a diagonal gentryii chain. (+2)  
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]
12-06-2016 at 07:16 PM
View Profile Send Private Message to User Show all user's posts High Scores This architect's holds Quote Reply
New Topic New Poll Post Reply
Caravel Forum : DROD Boards : Bugs : Player can be pushed across a diagonal gentryii chain.
Surf To:


Forum Rules:
Can I post a new topic? No
Can I reply? No
Can I read? Yes
HTML Enabled? No
UBBC Enabled? Yes
Words Filter Enable? No

Contact Us | CaravelGames.com

Powered by: tForum tForumHacks Edition b0.98.8
Originally created by Toan Huynh (Copyright © 2000)
Enhanced by the tForumHacks team and the Caravel team.