/** * Rest (restores hit points and mana and such) */ void do_cmd_rest(struct command *cmd) { int n; /* XXX-AS need to insert UI here */ if (cmd_get_arg_choice(cmd, "choice", &n) != CMD_OK) return; /* * A little sanity checking on the input - only the specified negative * values are valid. */ if (n < 0 && !player_resting_is_special(n)) return; /* Do some upkeep on the first turn of rest */ if (!player_is_resting(player)) { player->searching = false; player->upkeep->update |= (PU_BONUS); /* If a number of turns was entered, remember it */ if (n > 1) player_set_resting_repeat_count(player, n); else if (n == 1) /* If we're repeating the command, use the same count */ n = player_get_resting_repeat_count(player); } /* Set the counter, and stop if told to */ player_resting_set_count(player, n); if (!player_is_resting(player)) return; /* Take a turn */ player_resting_step_turn(player); /* Redraw the state if requested */ handle_stuff(player); /* Prepare to continue, or cancel and clean up */ if (player_resting_count(player) > 0) { cmdq_push(CMD_REST); cmd_set_arg_choice(cmdq_peek(), "choice", n - 1); } else if (player_resting_is_special(n)) { cmdq_push(CMD_REST); cmd_set_arg_choice(cmdq_peek(), "choice", n); player_set_resting_repeat_count(player, 0); } else { player_resting_cancel(player, false); } }
/** * Allow for user abort during repeated commands, running and resting. * * This will only check during every 128th game turn while resting. */ void check_for_player_interrupt(game_event_type type, game_event_data *data, void *user) { /* Check for "player abort" */ if (player->upkeep->running || cmd_get_nrepeats() > 0 || (player_is_resting(player) && !(turn & 0x7F))) { ui_event e; /* Do not wait */ inkey_scan = SCAN_INSTANT; /* Check for a key */ e = inkey_ex(); if (e.type != EVT_NONE) { /* Flush and disturb */ event_signal(EVENT_INPUT_FLUSH); disturb(player, 0); msg("Cancelled."); } } }