static void adjust_level(struct player *p, bool verbose) { if (p->exp < 0) p->exp = 0; if (p->max_exp < 0) p->max_exp = 0; if (p->exp > PY_MAX_EXP) p->exp = PY_MAX_EXP; if (p->max_exp > PY_MAX_EXP) p->max_exp = PY_MAX_EXP; if (p->exp > p->max_exp) p->max_exp = p->exp; p->upkeep->redraw |= PR_EXP; handle_stuff(p); while ((p->lev > 1) && (p->exp < (player_exp[p->lev-2] * p->expfact / 100L))) p->lev--; while ((p->lev < PY_MAX_LEVEL) && (p->exp >= (player_exp[p->lev-1] * p->expfact / 100L))) { char buf[80]; p->lev++; /* Save the highest level */ if (p->lev > p->max_lev) p->max_lev = p->lev; if (verbose) { /* Log level updates */ strnfmt(buf, sizeof(buf), "Reached level %d", p->lev); history_add(p, buf, HIST_GAIN_LEVEL); /* Message */ msgt(MSG_LEVEL, "Welcome to level %d.", p->lev); } effect_simple(EF_RESTORE_STAT, "0", STAT_STR, 1, 0, NULL); effect_simple(EF_RESTORE_STAT, "0", STAT_INT, 1, 0, NULL); effect_simple(EF_RESTORE_STAT, "0", STAT_WIS, 1, 0, NULL); effect_simple(EF_RESTORE_STAT, "0", STAT_DEX, 1, 0, NULL); effect_simple(EF_RESTORE_STAT, "0", STAT_CON, 1, 0, NULL); } while ((p->max_lev < PY_MAX_LEVEL) && (p->max_exp >= (player_exp[p->max_lev-1] * p->expfact / 100L))) p->max_lev++; p->upkeep->update |= (PU_BONUS | PU_HP | PU_SPELLS); p->upkeep->redraw |= (PR_LEV | PR_TITLE | PR_EXP | PR_STATS); handle_stuff(p); }
/* ------------------------------------------------------------------------ * Final confirmation of character. * ------------------------------------------------------------------------ */ static enum birth_stage get_confirm_command(void) { const char *prompt = "['ESC' to step back, 'S' to start over, or any other key to continue]"; ui_event_data ke; enum birth_stage next; /* Prompt for it */ prt(prompt, Term->hgt - (mouse_buttons ? 2 : 1), Term->wid / 2 - strlen(prompt) / 2); /* Buttons */ button_kill_all(); button_add("[CONTINUE]", 'q'); button_add("[BACK]", ESCAPE); button_add("[START OVER]", 'S'); handle_stuff(); event_signal(EVENT_MOUSEBUTTONS); /* Get a key */ ke = inkey_ex(); /* Start over */ if (ke.key == 'S' || ke.key == 's') { next = BIRTH_RESET; } else if (ke.key == KTRL('X')) { cmd_insert(CMD_QUIT); next = BIRTH_COMPLETE; } else if (ke.key == ESCAPE) { next = BIRTH_BACK; } else { cmd_insert(CMD_ACCEPT_CHARACTER); next = BIRTH_COMPLETE; } /* Buttons */ button_kill_all(); handle_stuff(); event_signal(EVENT_MOUSEBUTTONS); /* Clear prompt */ clear_from(23); return next; }
/*! * @brief プレイヤーのヒットダイスを振り直した後明示を行う / Hack -- Rerate Hitpoints * @param display TRUEならば体力ランクを明示する * @return なし */ void do_cmd_rerate(bool display) { int percent; /* Rerate */ do_cmd_rerate_aux(); percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) / (2 * p_ptr->hitdie + ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1)))); /* Update and redraw hitpoints */ p_ptr->update |= (PU_HP); p_ptr->redraw |= (PR_HP); /* Window stuff */ p_ptr->window |= (PW_PLAYER); /* Handle stuff */ handle_stuff(); /* Message */ if (display) { msg_format(_("現在の体力ランクは %d/100 です。", "Your life rate is %d/100 now."), percent); p_ptr->knowledge |= KNOW_HPRATE; } else { msg_print(_("体力ランクが変わった。", "Life rate is changed.")); p_ptr->knowledge &= ~(KNOW_HPRATE); } }
/** * Study a book to gain a new spell */ void textui_obj_study(void) { int item; char q[80]; char s[80]; if (mp_ptr->spell_realm == REALM_NONE) { msg("You cannot read books!"); return; } strnfmt(q, sizeof(q), "Study which %s?", magic_desc[mp_ptr->spell_realm][BOOK_NOUN]); strnfmt(s, sizeof(s), " You have no %ss that you can study.", magic_desc[mp_ptr->spell_realm][BOOK_LACK]); item_tester_hook = obj_can_study; if (!get_item(&item, q, s, CMD_STUDY_BOOK, (USE_INVEN | USE_FLOOR))) return; track_object(item); handle_stuff(p_ptr); if (mp_ptr->spell_book != TV_PRAYER_BOOK) { int spell = get_spell(object_from_item_idx(item), "study", spell_okay_to_study); if (spell >= 0) { cmd_insert(CMD_STUDY_SPELL); cmd_set_arg_choice(cmd_get_top(), 0, spell); } } else { cmd_insert(CMD_STUDY_BOOK); cmd_set_arg_item(cmd_get_top(), 0, item); } }
/* * Show artifact lore */ static void desc_art_fake(int a_idx) { object_type *o_ptr; object_type object_type_body = { 0 }; char header[120]; textblock *tb; region area = { 0, 0, 0, 0 }; o_ptr = find_artifact(a_idx); /* If it's been lost, make a fake artifact for it */ if (!o_ptr) { o_ptr = &object_type_body; make_fake_artifact(o_ptr, a_idx); /* Check the history entry, to see if it was fully known * before it was lost */ if (history_is_artifact_known(a_idx)) { o_ptr->ident |= IDENT_KNOWN; } } /* Hack -- Handle stuff */ handle_stuff(p_ptr); tb = object_info(o_ptr, OINFO_NONE); object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_FULL | ODESC_CAPITAL); textui_textblock_show(tb, area, format("%s", header)); textblock_free(tb); }
/* * Know inventory and home items upon death */ static void death_knowledge(void) { store_type *st_ptr = &store[STORE_HOME]; object_type *o_ptr; int i; for (i = 0; i < ALL_INVEN_TOTAL; i++) { o_ptr = &p_ptr->inventory[i]; if (!o_ptr->kind) continue; object_flavor_aware(o_ptr); object_notice_everything(o_ptr); } for (i = 0; i < st_ptr->stock_num; i++) { o_ptr = &st_ptr->stock[i]; if (!o_ptr->kind) continue; object_flavor_aware(o_ptr); object_notice_everything(o_ptr); } history_unmask_unknown(); /* Hack -- Recalculate bonuses */ p_ptr->update |= (PU_BONUS); handle_stuff(p_ptr); }
/* * Know inventory and home items upon death */ static void death_knowledge(void) { store_type *st_ptr = &store[STORE_HOME]; object_type *o_ptr; int i; /* Know everything in the inven/equip */ for (i = 0; i < ALL_INVEN_TOTAL; i++) { o_ptr = &inventory[i]; if (!o_ptr->k_idx) continue; o_ptr->mark_fully_known(TRUE); } /* Know everything in the home */ for (i = 0; i < st_ptr->stock_num; i++) { o_ptr = &st_ptr->stock[i]; if (!o_ptr->k_idx) continue; o_ptr->mark_fully_known(TRUE); } /* Hack -- Recalculate bonuses */ p_ptr->update |= (PU_BONUS); handle_stuff(); }
// Summon one monster void WizardModeDialog::wiz_banish(void) { int i; /* Banish everyone nearby */ for (i = 1; i < mon_max; i++) { monster_type *m_ptr = &mon_list[i]; monster_race *r_ptr = &r_info[m_ptr->r_idx]; /* Skip dead monsters */ if (!m_ptr->r_idx) continue; /* Skip distant monsters */ if (m_ptr->cdis > (MAX_SIGHT+10)) continue; /* Hack -- Skip unique monsters */ if (r_ptr->flags1 & (RF1_UNIQUE)) continue; /* Quest monsters can only be "killed" by the player */ if (m_ptr->mflag & (MFLAG_QUEST)) continue; /* Delete the monster */ delete_monster_idx(i); } /* Update monster list window */ p_ptr->redraw |= PR_WIN_MONLIST | PR_SIDEBAR_MON; handle_stuff(); this->accept(); }
/** * Browse the given book. */ void textui_spell_browse(void) { int item; char q[80]; char s[80]; if (mp_ptr->spell_realm == REALM_NONE) { if (player_has(PF_PROBE)) warrior_probe_desc(); else msg("You cannot read books!"); return; } strnfmt(q, sizeof(q), "Browse which %s?", magic_desc[mp_ptr->spell_realm][BOOK_NOUN]); strnfmt(s, sizeof(s), " You have no %ss that you can read.", magic_desc[mp_ptr->spell_realm][BOOK_LACK]); item_tester_hook = obj_can_browse; if (!get_item(&item, q, s, CMD_BROWSE_SPELL, (USE_INVEN | USE_FLOOR | IS_HARMLESS))) return; /* Track the object kind */ track_object(item); handle_stuff(p_ptr); textui_book_browse(object_from_item_idx(item)); }
/* * Choose and create an instance of an object kind */ static void wiz_create_item(void) { int tvals[TV_MAX]; size_t i, n; menu_type *menu = menu_new(MN_SKIN_COLUMNS, &wiz_create_item_menu); menu->selections = all_letters; menu->title = "What kind of object?"; /* Make a list of all tvals for the filter */ for (i = 0, n = 0; i < TV_MAX; i++) { if (!kb_info[i].name) continue; tvals[n++] = i; } screen_save(); clear_from(0); menu_setpriv(menu, TV_MAX, kb_info); menu_set_filter(menu, tvals, n); menu_layout(menu, &wiz_create_item_area); menu_select(menu, 0, FALSE); screen_load(); /* Redraw map */ p_ptr->redraw |= (PR_MAP | PR_ITEMLIST); handle_stuff(p_ptr); }
/* * Describe fake object */ static void desc_obj_fake(int k_idx) { object_kind *k_ptr = &k_info[k_idx]; object_type object_type_body; object_type *o_ptr = &object_type_body; char header[120]; textblock *tb; region area = { 0, 0, 0, 0 }; /* Check for known artifacts, display them as artifacts */ if (kf_has(k_ptr->flags_kind, KF_INSTA_ART) && artifact_is_known(get_artifact_from_kind(k_ptr))) { desc_art_fake(get_artifact_from_kind(k_ptr)); return; } /* Update the object recall window */ track_object_kind(k_idx); handle_stuff(p_ptr); /* Wipe the object */ object_wipe(o_ptr); /* Create the artifact */ object_prep(o_ptr, k_idx, EXTREMIFY); /* Hack -- its in the store */ if (k_info[k_idx].aware) o_ptr->ident |= (IDENT_STORE); /* It's fully know */ if (!k_info[k_idx].flavor) object_known(o_ptr); /* Hack -- Handle stuff */ handle_stuff(p_ptr); /* Describe */ tb = object_info(o_ptr, OINFO_DUMMY); object_desc(header, sizeof(header), o_ptr, ODESC_PREFIX | ODESC_FULL | ODESC_CAPITAL); textui_textblock_show(tb, area, format("%s", header)); textblock_free(tb); }
/** * Redraw the screen * * This command performs various low level updates, clears all the "extra" * windows, does a total redraw of the main window, and requests all of the * interesting updates and redraws that I can think of. * * This command is also used to "instantiate" the results of the user * selecting various things, such as graphics mode, so it must call * the "TERM_XTRA_REACT" hook before redrawing the windows. * */ void do_cmd_redraw(void) { int j; term *old = Term; /* Low level flush */ Term_flush(); /* Reset "inkey()" */ event_signal(EVENT_INPUT_FLUSH); if (character_dungeon) verify_panel(); /* Hack -- React to changes */ Term_xtra(TERM_XTRA_REACT, 0); if (character_dungeon) { /* Combine the pack (later) */ player->upkeep->notice |= (PN_COMBINE); /* Update torch, gear */ player->upkeep->update |= (PU_TORCH | PU_INVEN); /* Update stuff */ player->upkeep->update |= (PU_BONUS | PU_HP | PU_SPELLS); /* Fully update the visuals */ player->upkeep->update |= (PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_MONSTERS); /* Redraw everything */ player->upkeep->redraw |= (PR_BASIC | PR_EXTRA | PR_MAP | PR_INVEN | PR_EQUIP | PR_MESSAGE | PR_MONSTER | PR_OBJECT | PR_MONLIST | PR_ITEMLIST); } /* Clear screen */ Term_clear(); if (character_dungeon) { /* Hack -- update */ handle_stuff(player); /* Place the cursor on the player */ if (0 != character_dungeon) move_cursor_relative(player->px, player->py); } /* Redraw every window */ for (j = 0; j < ANGBAND_TERM_MAX; j++) { if (!angband_term[j]) continue; Term_activate(angband_term[j]); Term_redraw(); Term_fresh(); Term_activate(old); } }
// Completely cure the player void WizardModeDialog::wiz_cure_all(void) { /* * Cure everything instantly */ /* Remove curses */ (void)remove_all_curse(); /* Restore stats */ (void)res_stat(A_STR); (void)res_stat(A_INT); (void)res_stat(A_WIS); (void)res_stat(A_CON); (void)res_stat(A_DEX); (void)res_stat(A_CHR); /* Restore the level */ (void)restore_level(); /* Heal the player */ p_ptr->chp = p_ptr->mhp; p_ptr->chp_frac = 0; /* Restore mana */ p_ptr->csp = p_ptr->msp; p_ptr->csp_frac = 0; /* Cure stuff */ (void)clear_timed(TMD_BLIND, TRUE); (void)clear_timed(TMD_CONFUSED, TRUE); (void)clear_timed(TMD_POISONED, TRUE); (void)clear_timed(TMD_AFRAID, TRUE); (void)clear_timed(TMD_PARALYZED, TRUE); (void)clear_timed(TMD_IMAGE, TRUE); (void)clear_timed(TMD_STUN, TRUE); (void)clear_timed(TMD_CUT, TRUE); (void)clear_timed(TMD_SLOW, TRUE); /* No longer hungry */ (void)set_food(PY_FOOD_MAX - 1); this->accept(); /* Combine and Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER | PN_SORT_QUIVER); /* Update stuff */ p_ptr->update |= (PU_TORCH | PU_BONUS | PU_HP | PU_MANA | PU_SPELLS); /* Fully update the visuals */ p_ptr->update |= (PU_FORGET_VIEW | PU_UPDATE_VIEW | PU_MONSTERS); /* Redraw everything */ p_ptr->redraw |= (PR_STATUSBAR | PR_SIDEBAR_PL | PR_MAP | PR_WIN_INVENTORY | PR_WIN_EQUIPMENT | PR_MESSAGES | PR_WIN_MON_RECALL | PR_WIN_OBJ_RECALL | PR_WIN_MESSAGES | PR_WIN_OBJLIST | PR_WIN_FEAT_RECALL); handle_stuff(); }
/** * Label an item as an ego item if it has the required flags */ void label_as_ego(object_type * o_ptr, int item) { char o_name[120]; int j; int temp_flag; ego_item_type *e_ptr = &e_info[o_ptr->name2]; /* All ego object flags now known */ of_union(o_ptr->id_obj, e_ptr->flags_obj); /* All shown curses are now known */ if (of_has(e_ptr->flags_obj, OF_SHOW_CURSE)) cf_union(o_ptr->id_curse, e_ptr->flags_curse); /* Know all ego resists */ for (j = 0; j < MAX_P_RES; j++) { temp_flag = OBJECT_ID_BASE_RESIST + j; if (e_ptr->percent_res[j] != RES_LEVEL_BASE) if_on(o_ptr->id_other, temp_flag); } /* Know all ego slays */ for (j = 0; j < MAX_P_SLAY; j++) { temp_flag = OBJECT_ID_BASE_SLAY + j; if (e_ptr->multiple_slay[j] != MULTIPLE_BASE) if_on(o_ptr->id_other, temp_flag); } /* Know all ego brands */ for (j = 0; j < MAX_P_BRAND; j++) { temp_flag = OBJECT_ID_BASE_BRAND + j; if (e_ptr->multiple_brand[j] != MULTIPLE_BASE) if_on(o_ptr->id_other, temp_flag); } /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER); /* Redraw stuff */ p_ptr->redraw |= (PR_INVEN | PR_EQUIP | PR_BASIC | PR_EXTRA); /* Handle stuff */ handle_stuff(p_ptr); /* Description */ object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_FULL); /* Describe */ if (item - 1 >= INVEN_WIELD) { char *m = format("%s: %s (%c).", describe_use(item - 1), o_name, index_to_label(item - 1)); my_strcap(m); msg(m); } else if (item - 1 >= 0) { msg("In your pack: %s (%c).", o_name, index_to_label(item)); } }
void _mut_refresh(void) { mutant_regenerate_mod = mut_regenerate_mod(); p_ptr->update |= PU_BONUS; p_ptr->update |= PU_HP; p_ptr->update |= PU_MANA; p_ptr->update |= PU_SPELLS; handle_stuff(); }
/** * Close up the current game (player may or may not be dead) * * Note that the savefile is not saved until the tombstone is * actually displayed and the player has a chance to examine * the inventory and such. This allows cheating if the game * is equipped with a "quit without save" method. XXX XXX XXX */ void close_game(void) { /* Tell the UI we're done with the game state */ event_signal(EVENT_LEAVE_GAME); /* Handle stuff */ handle_stuff(player->upkeep); /* Flush the messages */ event_signal(EVENT_MESSAGE_FLUSH); /* Flush the input */ event_signal(EVENT_INPUT_FLUSH); /* No suspending now */ signals_ignore_tstp(); /* Hack -- Increase "icky" depth */ screen_save_depth++; /* Save monster memory to user directory */ if (!lore_save("lore.txt")) { msg("lore save failed!"); event_signal(EVENT_MESSAGE_FLUSH); } /* Handle death or life */ if (player->is_dead) { death_knowledge(); death_screen(); /* Save dead player */ if (!savefile_save(savefile)) { msg("death save failed!"); event_signal(EVENT_MESSAGE_FLUSH); } } else { /* Save the game */ save_game(); if (Term->mapped_flag) { struct keypress ch; prt("Press Return (or Escape).", 0, 40); ch = inkey(); if (ch.code != ESCAPE) predict_score(); } } /* Hack -- Decrease "icky" depth */ screen_save_depth--; /* Allow suspending now */ signals_handle_tstp(); }
/* ------------------------------------------------------------------------ * Quickstart? screen. * ------------------------------------------------------------------------ */ static enum birth_stage get_quickstart_command(void) { const char *prompt = "['Y' to use this character, 'N' to start afresh, 'C' to change name]"; ui_event_data ke; enum birth_stage next = BIRTH_QUICKSTART; /* Prompt for it */ prt("New character based on previous one:", 0, 0); prt(prompt, Term->hgt - (mouse_buttons ? 2 : 1), Term->wid / 2 - strlen(prompt) / 2); /* Buttons */ button_kill_all(); button_add("[YES]", 'y'); button_add("[START_OVER]", 'n'); button_add("[CHANGE_NAME]", 'c'); redraw_stuff(); event_signal(EVENT_MOUSEBUTTONS); do { /* Get a key */ ke = inkey_ex(); if (ke.key == 'N' || ke.key == 'n') { cmd_insert(CMD_BIRTH_RESET, TRUE); next = BIRTH_SEX_CHOICE; } else if (ke.key == KTRL('X')) { cmd_insert(CMD_QUIT); next = BIRTH_COMPLETE; } else if (ke.key == 'C' || ke.key == 'c') { next = BIRTH_NAME_CHOICE; } else if (ke.key == 'Y' || ke.key == 'y') { cmd_insert(CMD_ACCEPT_CHARACTER); next = BIRTH_COMPLETE; } } while (next == BIRTH_QUICKSTART); /* Buttons */ button_kill_all(); handle_stuff(); event_signal(EVENT_MOUSEBUTTONS); /* Clear prompt */ clear_from(23); return next; }
static void _set_mimic_form(int which) { p_ptr->mimic_form = which; equip_on_change_race(); if (p_ptr->action == ACTION_QUICK_WALK || p_ptr->action == ACTION_STALK) /* Wolf form ... */ set_action(ACTION_NONE); p_ptr->redraw |= PR_BASIC | PR_STATUS | PR_MAP | PR_EQUIPPY; p_ptr->update |= PU_BONUS | PU_HP; handle_stuff(); }
/** * 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); } }
/* * Hack -- Rerate Hitpoints */ void do_cmd_rerate(void) { int min_value, max_value, i, j, percent; min_value = (PY_MAX_LEVEL * 3 * (p_ptr->hitdie - 1)) / 8; min_value += PY_MAX_LEVEL; max_value = (PY_MAX_LEVEL * 5 * (p_ptr->hitdie - 1)) / 8; max_value += PY_MAX_LEVEL; p_ptr->player_hp[0] = p_ptr->hitdie; /* Rerate */ while (1) { /* Collect values */ for (i = 1; i < PY_MAX_LEVEL; i++) { /* Add in racial hit dice */ j = randint1(rp_ptr->r_mhp); p_ptr->player_hp[i] = p_ptr->player_hp[i - 1] + j; /* If class hit dice is non zero - add it on */ if (cp_ptr->c_mhp) { p_ptr->player_hp[i] += randint1(cp_ptr->c_mhp); } } /* Legal values */ if ((p_ptr->player_hp[PY_MAX_LEVEL - 1] >= min_value) && (p_ptr->player_hp[PY_MAX_LEVEL - 1] <= max_value)) break; } percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) / (2 * p_ptr->hitdie + ((PY_MAX_LEVEL - 1) * (p_ptr->hitdie + 1)))); /* Update and redraw hitpoints */ p_ptr->update |= (PU_HP); p_ptr->redraw |= (PR_HP); /* Window stuff */ p_ptr->window |= (PW_PLAYER); /* Handle stuff */ handle_stuff(); /* Message */ msg_format("Current Life Rating is %d/100.", percent); }
/* * Close up the current game (player may or may not be dead) * * Note that the savefile is not saved until the tombstone is * actually displayed and the player has a chance to examine * the inventory and such. This allows cheating if the game * is equipped with a "quit without save" method. XXX XXX XXX */ void close_game(void) { /* Handle stuff */ handle_stuff(p_ptr); /* Flush the messages */ message_flush(); /* Flush the input */ flush(); /* No suspending now */ signals_ignore_tstp(); /* Hack -- Increase "icky" depth */ character_icky++; /* Handle death */ if (p_ptr->is_dead) { death_screen(); } /* Still alive */ else { /* Save the game */ save_game(); if (Term->mapped_flag) { struct keypress ch; prt("Press Return (or Escape).", 0, 40); ch = inkey(); if (ch.code != ESCAPE) predict_score(); } } /* Hack -- Decrease "icky" depth */ character_icky--; /* Allow suspending now */ signals_handle_tstp(); }
bool fear_set_p(int v) { int old_lvl, new_lvl; bool notice = FALSE; /* Hack -- Force good values */ v = (v > 10000) ? 10000 : (v < 0) ? 0 : v; if (p_ptr->is_dead) return FALSE; old_lvl = _get_level(p_ptr->afraid); new_lvl = _get_level(v); if (new_lvl > old_lvl) { msg_format("You feel <color:%c>%s</color>.", _get_level_color(new_lvl), _get_level_name(new_lvl)); if (old_lvl <= FEAR_SCARED && one_in_(6) && !fear_save_p(v/5)) do_dec_stat(A_CHR); if (p_ptr->special_defense & KATA_MASK) { msg_print("Your posture gets loose."); p_ptr->special_defense &= ~KATA_MASK; p_ptr->update |= PU_BONUS; p_ptr->update |= PU_MONSTERS; p_ptr->redraw |= PR_STATE; p_ptr->redraw |= PR_STATUS; p_ptr->action = ACTION_NONE; } notice = TRUE; p_ptr->counter = FALSE; virtue_add(VIRTUE_VALOUR, -1); } else if (new_lvl < old_lvl) { if (new_lvl == FEAR_BOLD) msg_print("Your fears finally subside."); else { msg_format("You are no longer %s, but you still feel %s.", _get_level_name(old_lvl), _get_level_name(new_lvl)); } notice = TRUE; } p_ptr->afraid = v; p_ptr->redraw |= PR_EFFECTS; if (!notice) return FALSE; if (disturb_state) disturb(0, 0); handle_stuff(); return TRUE; }
/** * Save the game */ void save_game(void) { char name[80]; char path[1024]; /* Disturb the player */ disturb(player, 1); /* Clear messages */ event_signal(EVENT_MESSAGE_FLUSH); /* Handle stuff */ handle_stuff(player); /* Message */ prt("Saving game...", 0, 0); /* Refresh */ Term_fresh(); /* The player is not dead */ my_strcpy(player->died_from, "(saved)", sizeof(player->died_from)); /* Forbid suspend */ signals_ignore_tstp(); /* Save the player */ if (savefile_save(savefile)) prt("Saving game... done.", 0, 0); else prt("Saving game... failed!", 0, 0); /* Refresh */ Term_fresh(); /* Save the window prefs */ strnfmt(name, sizeof(name), "%s.prf", player_safe_name(player, TRUE)); path_build(path, sizeof(path), ANGBAND_DIR_USER, name); if (!prefs_save(path, option_dump, "Dump window settings")) prt("Failed to save subwindow preferences", 0, 0); /* Allow suspend again */ signals_handle_tstp(); /* Refresh */ Term_fresh(); /* Note that the player is not dead */ my_strcpy(player->died_from, "(alive and well)", sizeof(player->died_from)); }
static int _set_toggle(s32b toggle) { int result = p_ptr->magic_num1[0]; if (toggle == result) return result; p_ptr->magic_num1[0] = toggle; p_ptr->redraw |= PR_STATUS; p_ptr->update |= PU_BONUS; handle_stuff(); return result; }
void monk_double_attack_spell(int cmd, variant *res) { switch (cmd) { case SPELL_NAME: var_set_string(res, "Double Attack"); break; case SPELL_DESC: var_set_string(res, "Attack twice at an adjacent enemy. This action consumes double the normal energy."); break; case SPELL_CAST: var_set_bool(res, FALSE); if (_monk_check_spell()) { int x, y, dir = 0; if (!get_rep_dir(&dir, FALSE)) return; y = py + ddy[dir]; x = px + ddx[dir]; if (cave[y][x].m_idx) { if (one_in_(2)) msg_print("Ahhhtatatatatatatatatatatatatatataatatatatattaaaaa!!!!"); else msg_print("Oraoraoraoraoraoraoraoraoraoraoraoraoraoraoraoraora!!!!"); py_attack(y, x, 0); if (cave[y][x].m_idx) { handle_stuff(); py_attack(y, x, 0); } } else { msg_print("You don't see any monster in this direction"); msg_print(NULL); } var_set_bool(res, TRUE); } break; case SPELL_ENERGY: var_set_int(res, 100 + ENERGY_NEED()); break; default: default_spell(cmd, res); break; } }
/** * Browse the given book. */ void textui_spell_browse(void) { struct object *obj; if (!get_item(&obj, "Browse which book? ", "You have no books that you can read.", CMD_BROWSE_SPELL, obj_can_browse, (USE_INVEN | USE_FLOOR | IS_HARMLESS))) return; /* Track the object kind */ track_object(player->upkeep, obj); handle_stuff(player); textui_book_browse(obj); }
/* * Create the artifact with the specified number */ static void wiz_create_artifact(int a_idx) { object_type *i_ptr; object_type object_type_body; object_kind *kind; artifact_type *a_ptr = &a_info[a_idx]; /* Ignore "empty" artifacts */ if (!a_ptr->name) return; /* Get local object */ i_ptr = &object_type_body; /* Wipe the object */ object_wipe(i_ptr); /* Acquire the "kind" index */ kind = lookup_kind(a_ptr->tval, a_ptr->sval); if (!kind) return; /* Create the artifact */ object_prep(i_ptr, kind, a_ptr->alloc_min, RANDOMISE); /* Save the name */ i_ptr->artifact = a_ptr; /* Extract the fields */ copy_artifact_data(i_ptr, a_ptr); /* Mark that the artifact has been created. */ a_ptr->created = TRUE; /* Mark as cheat */ i_ptr->origin = ORIGIN_CHEAT; /* Drop the artifact from heaven */ drop_near(cave, i_ptr, 0, p_ptr->py, p_ptr->px, TRUE); /* All done */ msg("Allocated."); /* Redraw map */ p_ptr->redraw |= (PR_MAP | PR_ITEMLIST); handle_stuff(p_ptr); }
void _reset_counter(int i) { int j; if (p_ptr->wild_counters[i].type == 0) return; j = _find_type(p_ptr->wild_counters[i].type); p_ptr->wild_counters[i].type = 0; p_ptr->wild_counters[i].counter = 0; if (j >= 0) { _types[j].off_fn(); p_ptr->redraw |= _types[j].redraw_flags; p_ptr->update |= _types[j].update_flags; if (disturb_state) disturb(0, 0); handle_stuff(); } }
/* * Save the game */ void save_game(void) { /* Disturb the player */ disturb(1, 0); /* Clear messages */ message_flush(); /* Handle stuff */ handle_stuff(); /* Message */ prt("Saving game...", 0, 0); /* Refresh */ Term_fresh(); /* The player is not dead */ my_strcpy(p_ptr->died_from, "(saved)", sizeof(p_ptr->died_from)); /* Forbid suspend */ signals_ignore_tstp(); /* Save the player */ if (old_save()) { prt("Saving game... done.", 0, 0); } /* Save failed (oops) */ else { prt("Saving game... failed!", 0, 0); } /* Allow suspend again */ signals_handle_tstp(); /* Refresh */ Term_fresh(); /* Note that the player is not dead */ my_strcpy(p_ptr->died_from, "(alive and well)", sizeof(p_ptr->died_from)); }
/* * Display a monster */ static void display_monster(int col, int row, bool cursor, int oid) { /* HACK Get the race index. (Should be a wrapper function) */ int r_idx = default_join[oid].oid; /* Access the race */ monster_race *r_ptr = &r_info[r_idx]; monster_lore *l_ptr = &l_list[r_idx]; /* Choose colors */ byte attr = curs_attrs[CURS_KNOWN][(int) cursor]; byte a = r_ptr->x_attr; wchar_t c = r_ptr->x_char; if ((tile_height != 1) && (a & 0x80)) { a = r_ptr->d_attr; c = r_ptr->d_char; } /* Display the name */ c_prt(attr, r_ptr->name, row, col); /* Monster recall window */ if (cursor) { character_icky--; character_icky--; p_ptr->monster_race_idx = r_idx; p_ptr->redraw |= PR_MONSTER; handle_stuff(p_ptr); character_icky++; character_icky++; } /* Display symbol */ big_pad(66, row, a, c); /* Display kills */ if (rf_has(r_ptr->flags, RF_UNIQUE)) put_str(format("%s", (r_ptr->max_num == 0) ? " dead" : "alive"), row, 70); else put_str(format("%5d", l_ptr->pkills), row, 70); }