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