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