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