split discarding broken wand into separate function

This commit is contained in:
SHIRAKATA Kentaro
2023-11-10 02:44:13 +09:00
parent 394fa24666
commit 3db06f4c6d

View File

@@ -37,6 +37,7 @@ static int use_royal_jelly(struct obj **);
static int grapple_range(void); static int grapple_range(void);
static boolean can_grapple_location(coordxy, coordxy); static boolean can_grapple_location(coordxy, coordxy);
static int use_grapple(struct obj *); static int use_grapple(struct obj *);
static void discard_broken_wand(void);
static int do_break_wand(struct obj *); static int do_break_wand(struct obj *);
static int apply_ok(struct obj *); static int apply_ok(struct obj *);
static int flip_through_book(struct obj *); static int flip_through_book(struct obj *);
@@ -3713,6 +3714,18 @@ use_grapple(struct obj *obj)
return ECMD_TIME; return ECMD_TIME;
} }
static void
discard_broken_wand(void)
{
struct obj *obj;
obj = gc.current_wand; /* [see dozap() and destroy_item()] */
gc.current_wand = 0;
if (obj)
delobj(obj);
nomul(0);
}
/* return 1 if the wand is broken, hence some time elapsed */ /* return 1 if the wand is broken, hence some time elapsed */
static int static int
do_break_wand(struct obj *obj) do_break_wand(struct obj *obj)
@@ -3763,7 +3776,8 @@ do_break_wand(struct obj *obj)
if (!zappable(obj)) { if (!zappable(obj)) {
pline(nothing_else_happens); pline(nothing_else_happens);
goto discard_broken_wand; discard_broken_wand();
return ECMD_TIME;
} }
/* successful call to zappable() consumes a charge; put it back */ /* successful call to zappable() consumes a charge; put it back */
obj->spe++; obj->spe++;
@@ -3786,7 +3800,8 @@ do_break_wand(struct obj *obj)
release_hold(); release_hold();
if (obj->dknown) if (obj->dknown)
makeknown(WAN_OPENING); makeknown(WAN_OPENING);
goto discard_broken_wand; discard_broken_wand();
return ECMD_TIME;
} }
/*FALLTHRU*/ /*FALLTHRU*/
case WAN_WISHING: case WAN_WISHING:
@@ -3796,7 +3811,8 @@ do_break_wand(struct obj *obj)
case WAN_ENLIGHTENMENT: case WAN_ENLIGHTENMENT:
case WAN_SECRET_DOOR_DETECTION: case WAN_SECRET_DOOR_DETECTION:
pline(nothing_else_happens); pline(nothing_else_happens);
goto discard_broken_wand; discard_broken_wand();
return ECMD_TIME;
case WAN_DEATH: case WAN_DEATH:
case WAN_LIGHTNING: case WAN_LIGHTNING:
dmg *= 4; dmg *= 4;
@@ -3813,7 +3829,8 @@ do_break_wand(struct obj *obj)
wanexpl: wanexpl:
explode(u.ux, u.uy, -(obj->otyp), dmg, WAND_CLASS, expltype); explode(u.ux, u.uy, -(obj->otyp), dmg, WAND_CLASS, expltype);
makeknown(obj->otyp); /* explode describes the effect */ makeknown(obj->otyp); /* explode describes the effect */
goto discard_broken_wand; discard_broken_wand();
return ECMD_TIME;
case WAN_STRIKING: case WAN_STRIKING:
/* we want this before the explosion instead of at the very end */ /* we want this before the explosion instead of at the very end */
Soundeffect(se_wall_of_force, 65); Soundeffect(se_wall_of_force, 65);
@@ -3942,12 +3959,7 @@ do_break_wand(struct obj *obj)
if (obj->otyp == WAN_LIGHT) if (obj->otyp == WAN_LIGHT)
litroom(TRUE, obj); /* only needs to be done once */ litroom(TRUE, obj); /* only needs to be done once */
discard_broken_wand: discard_broken_wand();
obj = gc.current_wand; /* [see dozap() and destroy_item()] */
gc.current_wand = 0;
if (obj)
delobj(obj);
nomul(0);
return ECMD_TIME; return ECMD_TIME;
#undef BY_OBJECT #undef BY_OBJECT
} }