xref: /dragonfly/games/hack/hack.fix (revision a4da4a90)
1$NetBSD: hack.fix,v 1.3 2001/09/16 16:34:25 wiz Exp $
2
3/***** unido:net.games.hack / ab /  7:23 pm  Sep 13, 1985*/
4
5Recently hack (1.0.3) crashed with core dumps during some good games.
6The crashes occurred in the onbill-routine. After investigating the core
7dump I found that the shopkeeper's bill was still to be paid.  Normaly
8if you leave a shop the bill will be cleared and onbill() would not
9check it. But under certain conditions you can leave a shop without
10clearing the bill. The conditions are:
11
12     1. You have to rob a shop in order to make the shopkeeper
13	follow you.
14
15     2. After leaving the shop being followed by the shopkeeper
16	you must return to the shop...
17
18     3. ...and then leave the unguarded shop again.
19	- The shopkeeper mustn't be present!
20
21If you climb the stairs to the previous level, chances are that your
22bill now contains much more items than allowed. If so the next call to
23onbill() will dump the core.
24
25Following is a context diff to fix the bug. Actually just the last hunk
26does the fix [it deletes two lines which have been inserted in 1.0.3],
27but I think the other fix was intended by the now deleted lines.
28
29	Andreas
30
31--
32Andreas Bormann                 ab@unido.UUCP
33University of Dortmund          N 51 29' 05"   E 07 24' 42"
34West Germany
35
36------ the diff follows:
37
38*** hack.shk.c.orig	Sun Aug  4 12:07:51 1985
39--- hack.shk.c	Fri Sep 13 14:29:52 1985
40***************
41*** 133,139
42  	/* Did we just leave a shop? */
43  	if(u.uinshop &&
44  	    (u.uinshop != roomno + 1 || shlevel != dlevel || !shopkeeper)) {
45- 		u.uinshop = 0;
46  		if(shopkeeper) {
47  		    if(ESHK(shopkeeper)->billct) {
48  			pline("Somehow you escaped the shop without paying!");
49
50--- 133,138 -----
51  	/* Did we just leave a shop? */
52  	if(u.uinshop &&
53  	    (u.uinshop != roomno + 1 || shlevel != dlevel || !shopkeeper)) {
54  		if(shopkeeper) {
55  		    if(ESHK(shopkeeper)->billct) {
56  			if(inroom(shopkeeper->mx, shopkeeper->my)
57***************
58*** 136,142
59  		u.uinshop = 0;
60  		if(shopkeeper) {
61  		    if(ESHK(shopkeeper)->billct) {
62! 			pline("Somehow you escaped the shop without paying!");
63  			addupbill();
64  			pline("You stole for a total worth of %ld zorkmids.",
65  				total);
66
67--- 135,143 -----
68  	    (u.uinshop != roomno + 1 || shlevel != dlevel || !shopkeeper)) {
69  		if(shopkeeper) {
70  		    if(ESHK(shopkeeper)->billct) {
71! 			if(inroom(shopkeeper->mx, shopkeeper->my)
72! 			    == u.uinshop - 1)	/* ab@unido */
73! 			    pline("Somehow you escaped the shop without paying!");
74  			addupbill();
75  			pline("You stole for a total worth of %ld zorkmids.",
76  				total);
77***************
78*** 149,154
79  		    shopkeeper = 0;
80  		    shlevel = 0;
81  		}
82  	}
83
84  	/* Did we just enter a zoo of some kind? */
85
86--- 150,156 -----
87  		    shopkeeper = 0;
88  		    shlevel = 0;
89  		}
90+ 		u.uinshop = 0;
91  	}
92
93  	/* Did we just enter a zoo of some kind? */
94***************
95*** 183,190
96  		findshk(roomno);
97  	    if(!shopkeeper) {
98  		rooms[roomno].rtype = 0;
99- 		u.uinshop = 0;
100- 	    } else if(inroom(shopkeeper->mx, shopkeeper->my) != roomno) {
101  		u.uinshop = 0;
102  	    } else if(!u.uinshop){
103  		if(!ESHK(shopkeeper)->visitct ||
104
105--- 185,190 -----
106  		findshk(roomno);
107  	    if(!shopkeeper) {
108  		rooms[roomno].rtype = 0;
109  		u.uinshop = 0;
110  	    } else if(!u.uinshop){
111  		if(!ESHK(shopkeeper)->visitct ||
112/* ---------- */
113
114
115
116