Fix crystal ball use after being destroyed

Crystal ball can be destroyed when used, so pass the object parameter
back as null in that case.
This commit is contained in:
Pasi Kallinen
2015-11-01 18:49:38 +02:00
parent 07e2d6175f
commit 9181f06dab
4 changed files with 8 additions and 7 deletions

View File

@@ -243,7 +243,7 @@ E int FDECL(object_detect, (struct obj *, int));
E int FDECL(monster_detect, (struct obj *, int));
E int FDECL(trap_detect, (struct obj *));
E const char *FDECL(level_distance, (d_level *));
E void FDECL(use_crystal_ball, (struct obj *));
E void FDECL(use_crystal_ball, (struct obj **));
E void NDECL(do_mapping);
E void NDECL(do_vicinity_map);
E void FDECL(cvt_sdoor_to_door, (struct rm *));

View File

@@ -3486,7 +3486,7 @@ doapply()
res = use_towel(obj);
break;
case CRYSTAL_BALL:
use_crystal_ball(obj);
use_crystal_ball(&obj);
break;
case MAGIC_MARKER:
res = dowrite(obj);

View File

@@ -1401,13 +1401,13 @@ doinvoke()
STATIC_OVL int
arti_invoke(obj)
register struct obj *obj;
struct obj *obj;
{
register const struct artifact *oart = get_artifact(obj);
if (!oart || !oart->inv_prop) {
if (obj->otyp == CRYSTAL_BALL)
use_crystal_ball(obj);
use_crystal_ball(&obj);
else
pline1(nothing_happens);
return 1;

View File

@@ -891,11 +891,12 @@ static const struct {
};
void
use_crystal_ball(obj)
struct obj *obj;
use_crystal_ball(optr)
struct obj **optr;
{
char ch;
int oops;
struct obj *obj = *optr;
if (Blind) {
pline("Too bad you can't see %s.", the(xname(obj)));
@@ -930,7 +931,7 @@ struct obj *obj;
case 5:
pline("%s!", Tobjnam(obj, "explode"));
useup(obj);
obj = 0; /* it's gone */
*optr = obj = 0; /* it's gone */
/* physical damage cause by the shards and force */
losehp(Maybe_Half_Phys(rnd(30)), "exploding crystal ball",
KILLED_BY_AN);