used in domove to block diagonal shop-exit */ x,y should always be a door */
| 5788 | /* used in domove to block diagonal shop-exit */ |
| 5789 | /* x,y should always be a door */ |
| 5790 | boolean |
| 5791 | block_door(coordxy x, coordxy y) |
| 5792 | { |
| 5793 | int roomno = *in_rooms(x, y, SHOPBASE); |
| 5794 | struct monst *shkp; |
| 5795 | |
| 5796 | if (roomno < 0 || !IS_SHOP(roomno)) |
| 5797 | return FALSE; |
| 5798 | if (!IS_DOOR(levl[x][y].typ)) |
| 5799 | return FALSE; |
| 5800 | if (roomno != *u.ushops) |
| 5801 | return FALSE; |
| 5802 | |
| 5803 | shkp = shop_keeper((char) roomno); |
| 5804 | if (!shkp || !inhishop(shkp)) |
| 5805 | return FALSE; |
| 5806 | |
| 5807 | if (shkp->mx == ESHK(shkp)->shk.x && shkp->my == ESHK(shkp)->shk.y |
| 5808 | /* Actually, the shk should be made to block _any_ |
| 5809 | * door, including a door the player digs, if the |
| 5810 | * shk is within a 'jumping' distance. |
| 5811 | */ |
| 5812 | && ESHK(shkp)->shd.x == x |
| 5813 | && ESHK(shkp)->shd.y == y |
| 5814 | && !helpless(shkp) |
| 5815 | && (ESHK(shkp)->debit || ESHK(shkp)->billct || ESHK(shkp)->robbed)) { |
| 5816 | pline("%s%s blocks your way!", Shknam(shkp), |
| 5817 | Invis ? " senses your motion and" : ""); |
| 5818 | return TRUE; |
| 5819 | } |
| 5820 | return FALSE; |
| 5821 | } |
| 5822 | |
| 5823 | /* used in domove to block diagonal shop-entry; |
| 5824 | u.ux, u.uy should always be a door */ |