Use a menu to pick a container to tip
If there is more than one container, the #tip command will show a menu; if there's just one container, prompt for tipping. As per Boudewijn's suggestion, remove the superfluous "There is a container here" message.
This commit is contained in:
62
src/pickup.c
62
src/pickup.c
@@ -2688,27 +2688,59 @@ dotip()
|
||||
|
||||
/* check floor container(s) first; at most one will be accessed */
|
||||
if ((boxes = container_at(cc.x, cc.y, TRUE)) > 0) {
|
||||
if (flags.verbose)
|
||||
pline("There %s here.",
|
||||
(boxes > 1) ? "are containers" : "is a container");
|
||||
Sprintf(buf, "You can't tip %s while carrying so much.",
|
||||
!flags.verbose ? "a container" : (boxes > 1) ? "one" : "it");
|
||||
if (!check_capacity(buf) && able_to_loot(cc.x, cc.y, FALSE)) {
|
||||
for (cobj = level.objects[cc.x][cc.y]; cobj; cobj = nobj) {
|
||||
nobj = cobj->nexthere;
|
||||
if (!Is_container(cobj))
|
||||
continue;
|
||||
|
||||
c = ynq(safe_qbuf(qbuf, "There is ", " here, tip it?", cobj,
|
||||
doname, ansimpleoname, "container"));
|
||||
if (c == 'q')
|
||||
if (boxes > 1) {
|
||||
/* use menu to pick a container to tip */
|
||||
int n, i;
|
||||
winid win;
|
||||
anything any;
|
||||
menu_item *pick_list = NULL;
|
||||
any = zeroany;
|
||||
win = create_nhwindow(NHW_MENU);
|
||||
start_menu(win);
|
||||
|
||||
for (cobj = level.objects[cc.x][cc.y]; cobj;
|
||||
cobj = cobj->nexthere)
|
||||
if (Is_container(cobj)) {
|
||||
any.a_obj = cobj;
|
||||
add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE,
|
||||
doname(cobj), MENU_UNSELECTED);
|
||||
}
|
||||
end_menu(win, "Tip which container?");
|
||||
n = select_menu(win, PICK_ONE, &pick_list);
|
||||
destroy_nhwindow(win);
|
||||
|
||||
if (n > 0) {
|
||||
for (i = 0; i < n; i++) {
|
||||
tipcontainer(pick_list[i].item.a_obj);
|
||||
free((genericptr_t) pick_list);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if (pick_list)
|
||||
free((genericptr_t) pick_list);
|
||||
if (n == -1)
|
||||
return 0;
|
||||
if (c == 'n')
|
||||
continue;
|
||||
} else {
|
||||
for (cobj = level.objects[cc.x][cc.y]; cobj; cobj = nobj) {
|
||||
nobj = cobj->nexthere;
|
||||
if (!Is_container(cobj))
|
||||
continue;
|
||||
|
||||
tipcontainer(cobj);
|
||||
return 1;
|
||||
} /* next cobj */
|
||||
c = ynq(safe_qbuf(qbuf, "There is ", " here, tip it?", cobj,
|
||||
doname, ansimpleoname, "container"));
|
||||
if (c == 'q')
|
||||
return 0;
|
||||
if (c == 'n')
|
||||
continue;
|
||||
|
||||
tipcontainer(cobj);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user