crash fix: shopkeeper re-entering shop

- when a shopkeeper leaves the shop to chase the player, and the player
enters the shop, bill_p is set to an unusual value.  bill_p needs to be set
back to a valid value if the shopkeeper re-enters the shop.
- Also, the u.ushops state needs to be updated when a shop becomes tended
again if the player is in the shop.
- introduce a new after_shk_move function to handle this
This commit is contained in:
cohrs
2002-04-15 06:43:55 +00:00
parent b6be8e8af1
commit 86f961ba3f
4 changed files with 24 additions and 2 deletions

View File

@@ -72,6 +72,7 @@ travel command should restrict its shortest paths to areas of the map the
non-altar prayer should limit god action, not maximize it
potions of acid explode, not dilute, so make water_damage behave this way
lookat monster notes if you see monster is trapped
don't crash when angry shopkeeper re-enters the shop and you pick up something
Platform- and/or Interface-Specific Fixes

View File

@@ -1761,6 +1761,7 @@ E struct monst *FDECL(shkcatch, (struct obj *,XCHAR_P,XCHAR_P));
E void FDECL(add_damage, (XCHAR_P,XCHAR_P,long));
E int FDECL(repair_damage, (struct monst *,struct damage *,BOOLEAN_P));
E int FDECL(shk_move, (struct monst *));
E void FDECL(after_shk_move, (struct monst *));
E boolean FDECL(is_fshk, (struct monst *));
E void FDECL(shopdig, (int));
E void FDECL(pay_for_damage, (const char *));

View File

@@ -1194,6 +1194,9 @@ postmov:
(is_pool(mtmp->mx, mtmp->my) && !Is_waterlevel(&u.uz));
newsym(mtmp->mx, mtmp->my);
}
if (mtmp->isshk) {
after_shk_move(mtmp);
}
}
return(mmoved);
}

View File

@@ -891,6 +891,7 @@ register boolean killkops;
#endif
pacify_guards();
}
after_shk_move(shkp);
}
STATIC_OVL boolean
@@ -3257,8 +3258,24 @@ register struct monst *shkp;
}
}
return(move_special(shkp,inhishop(shkp),
appr,uondoor,avoid,omx,omy,gx,gy));
z = move_special(shkp,inhishop(shkp),appr,uondoor,avoid,omx,omy,gx,gy);
if (z > 0) after_shk_move(shkp);
return z;
}
/* called after shopkeeper moves, in case the move causes re-entry into shop */
void
after_shk_move(shkp)
struct monst *shkp;
{
struct eshk *eshkp = ESHK(shkp);
if (eshkp->bill_p == (struct bill_x *) -1000 && inhishop(shkp)) {
/* reset bill_p, need to re-calc player's occupancy too */
eshkp->bill_p = &eshkp->bill[0];
check_special_room(FALSE);
}
}
#endif /*OVL3*/