mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-10 09:42:26 +00:00
114 lines
3.2 KiB
Plaintext
114 lines
3.2 KiB
Plaintext
|
/***** unido:net.games.hack / ab / 7:23 pm Sep 13, 1985*/
|
||
|
|
||
|
Recently hack (1.0.3) crashed with core dumps during some good games.
|
||
|
The crashes occured in the onbill-routine. After investigating the core
|
||
|
dump I found that the shopkeeper's bill was still to be paid. Normaly
|
||
|
if you leave a shop the bill will be cleared and onbill() would not
|
||
|
check it. But under certain conditions you can leave a shop without
|
||
|
clearing the bill. The conditions are:
|
||
|
|
||
|
1. You have to rob a shop in order to make the shopkeeper
|
||
|
follow you.
|
||
|
|
||
|
2. After leaving the shop being followed by the shopkeeper
|
||
|
you must return to the shop...
|
||
|
|
||
|
3. ...and then leave the unguarded shop again.
|
||
|
- The shopkeeper mustn't be present!
|
||
|
|
||
|
If you climb the stairs to the previous level, chances are that your
|
||
|
bill now contains much more items than allowed. If so the next call to
|
||
|
onbill() will dump the core.
|
||
|
|
||
|
Following is a context diff to fix the bug. Actually just the last hunk
|
||
|
does the fix [it deletes two lines which have been inserted in 1.0.3],
|
||
|
but I think the other fix was intended by the now deleted lines.
|
||
|
|
||
|
Andreas
|
||
|
|
||
|
--
|
||
|
Andreas Bormann ab@unido.UUCP
|
||
|
University of Dortmund N 51 29' 05" E 07 24' 42"
|
||
|
West Germany
|
||
|
|
||
|
------ the diff follows:
|
||
|
|
||
|
*** hack.shk.c.orig Sun Aug 4 12:07:51 1985
|
||
|
--- hack.shk.c Fri Sep 13 14:29:52 1985
|
||
|
***************
|
||
|
*** 133,139
|
||
|
/* Did we just leave a shop? */
|
||
|
if(u.uinshop &&
|
||
|
(u.uinshop != roomno + 1 || shlevel != dlevel || !shopkeeper)) {
|
||
|
- u.uinshop = 0;
|
||
|
if(shopkeeper) {
|
||
|
if(ESHK(shopkeeper)->billct) {
|
||
|
pline("Somehow you escaped the shop without paying!");
|
||
|
|
||
|
--- 133,138 -----
|
||
|
/* Did we just leave a shop? */
|
||
|
if(u.uinshop &&
|
||
|
(u.uinshop != roomno + 1 || shlevel != dlevel || !shopkeeper)) {
|
||
|
if(shopkeeper) {
|
||
|
if(ESHK(shopkeeper)->billct) {
|
||
|
if(inroom(shopkeeper->mx, shopkeeper->my)
|
||
|
***************
|
||
|
*** 136,142
|
||
|
u.uinshop = 0;
|
||
|
if(shopkeeper) {
|
||
|
if(ESHK(shopkeeper)->billct) {
|
||
|
! pline("Somehow you escaped the shop without paying!");
|
||
|
addupbill();
|
||
|
pline("You stole for a total worth of %ld zorkmids.",
|
||
|
total);
|
||
|
|
||
|
--- 135,143 -----
|
||
|
(u.uinshop != roomno + 1 || shlevel != dlevel || !shopkeeper)) {
|
||
|
if(shopkeeper) {
|
||
|
if(ESHK(shopkeeper)->billct) {
|
||
|
! if(inroom(shopkeeper->mx, shopkeeper->my)
|
||
|
! == u.uinshop - 1) /* ab@unido */
|
||
|
! pline("Somehow you escaped the shop without paying!");
|
||
|
addupbill();
|
||
|
pline("You stole for a total worth of %ld zorkmids.",
|
||
|
total);
|
||
|
***************
|
||
|
*** 149,154
|
||
|
shopkeeper = 0;
|
||
|
shlevel = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Did we just enter a zoo of some kind? */
|
||
|
|
||
|
--- 150,156 -----
|
||
|
shopkeeper = 0;
|
||
|
shlevel = 0;
|
||
|
}
|
||
|
+ u.uinshop = 0;
|
||
|
}
|
||
|
|
||
|
/* Did we just enter a zoo of some kind? */
|
||
|
***************
|
||
|
*** 183,190
|
||
|
findshk(roomno);
|
||
|
if(!shopkeeper) {
|
||
|
rooms[roomno].rtype = 0;
|
||
|
- u.uinshop = 0;
|
||
|
- } else if(inroom(shopkeeper->mx, shopkeeper->my) != roomno) {
|
||
|
u.uinshop = 0;
|
||
|
} else if(!u.uinshop){
|
||
|
if(!ESHK(shopkeeper)->visitct ||
|
||
|
|
||
|
--- 185,190 -----
|
||
|
findshk(roomno);
|
||
|
if(!shopkeeper) {
|
||
|
rooms[roomno].rtype = 0;
|
||
|
u.uinshop = 0;
|
||
|
} else if(!u.uinshop){
|
||
|
if(!ESHK(shopkeeper)->visitct ||
|
||
|
/* ---------- */
|
||
|
|
||
|
|
||
|
|