X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fdungeon.c;h=197d098930e83612fdefb427a4a5c441448ea515;hb=2c751de0350284cf64edd6a478436c11a3dfa243;hp=eaa5e3b4742046cd192f0de1deb81d212c14c24b;hpb=fa66387e7e62d508fb7f41bc7fb0d78575acef08;p=hengbandforosx%2Fhengbandosx.git diff --git a/src/dungeon.c b/src/dungeon.c index eaa5e3b47..197d09893 100644 --- a/src/dungeon.c +++ b/src/dungeon.c @@ -13,10 +13,13 @@ #include "angband.h" #include "cmd-activate.h" #include "cmd-eat.h" +#include "cmd-hissatsu.h" #include "cmd-item.h" #include "cmd-magiceat.h" +#include "cmd-mane.h" #include "cmd-quaff.h" #include "cmd-read.h" +#include "cmd-smith.h" #include "cmd-usestaff.h" #include "cmd-zaprod.h" #include "cmd-zapwand.h" @@ -41,6 +44,8 @@ #include "realm-hex.h" #include "object-hook.h" #include "wild.h" +#include "monster-status.h" +#include "floor-save.h" static bool load = TRUE; /*!<ロード処理中の分岐フラグ*/ @@ -578,11 +583,7 @@ static void pattern_teleport(void) { return; } - - /* Paranoia */ if (command_arg < min_level) command_arg = (COMMAND_ARG)min_level; - - /* Paranoia */ if (command_arg > max_level) command_arg = (COMMAND_ARG)max_level; /* Accept request */ @@ -605,8 +606,6 @@ static void pattern_teleport(void) * and create a first saved floor */ prepare_change_floor_mode(CFM_FIRST_FLOOR); - - /* Leaving */ p_ptr->leaving = TRUE; } @@ -870,9 +869,7 @@ static void regen_monsters(void) monster_type *m_ptr = ¤t_floor_ptr->m_list[i]; monster_race *r_ptr = &r_info[m_ptr->r_idx]; - - /* Skip dead monsters */ - if (!m_ptr->r_idx) continue; + if (!monster_is_valid(m_ptr)) continue; /* Allow regeneration (if needed) */ if (m_ptr->hp < m_ptr->maxhp) @@ -1458,7 +1455,7 @@ static void process_world_aux_hp_and_sp(void) if (p_ptr->levitation) { - msg_print(_("電撃を受けた!", "The electric shocks you!")); + msg_print(_("電撃を受けた!", "The electricity shocks you!")); take_hit(DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"), f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1); } @@ -1496,7 +1493,7 @@ static void process_world_aux_hp_and_sp(void) if (p_ptr->levitation) { - msg_print(_("酸が飛び散った!", "The acid melt you!")); + msg_print(_("酸が飛び散った!", "The acid melts you!")); take_hit(DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"), f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1); } @@ -2136,7 +2133,7 @@ static void process_world_aux_mutation(void) (void)teleport_player_aux(100, TELEPORT_NONMAGICAL | TELEPORT_PASSIVE); wiz_dark(); msg_print(_("あなたは見知らぬ場所で目が醒めた...頭が痛い。", "You wake up somewhere with a sore head...")); - msg_print(_("何も覚えていない。どうやってここに来たかも分からない!", "You can't remember a thing, or how you got here!")); + msg_print(_("何も覚えていない。どうやってここに来たかも分からない!", "You can't remember a thing or how you got here!")); } else { @@ -2419,9 +2416,7 @@ static void process_world_aux_mutation(void) { monster_type *m_ptr = ¤t_floor_ptr->m_list[monster]; monster_race *r_ptr = &r_info[m_ptr->r_idx]; - - /* Paranoia -- Skip dead monsters */ - if (!m_ptr->r_idx) continue; + if (!monster_is_valid(m_ptr)) continue; if (r_ptr->level >= p_ptr->lev) { @@ -2649,7 +2644,7 @@ static void process_world_aux_curse(void) GAME_TEXT o_name[MAX_NLEN]; object_desc(o_name, choose_cursed_obj_name(TRC_CALL_ANIMAL), (OD_OMIT_PREFIX | OD_NAME_ONLY)); - msg_format(_("%sが動物を引き寄せた!", "Your %s have attracted an animal!"), o_name); + msg_format(_("%sが動物を引き寄せた!", "Your %s has attracted an animal!"), o_name); disturb(FALSE, TRUE); } } @@ -2661,7 +2656,7 @@ static void process_world_aux_curse(void) GAME_TEXT o_name[MAX_NLEN]; object_desc(o_name, choose_cursed_obj_name(TRC_CALL_DEMON), (OD_OMIT_PREFIX | OD_NAME_ONLY)); - msg_format(_("%sが悪魔を引き寄せた!", "Your %s have attracted a demon!"), o_name); + msg_format(_("%sが悪魔を引き寄せた!", "Your %s has attracted a demon!"), o_name); disturb(FALSE, TRUE); } } @@ -2674,7 +2669,7 @@ static void process_world_aux_curse(void) GAME_TEXT o_name[MAX_NLEN]; object_desc(o_name, choose_cursed_obj_name(TRC_CALL_DRAGON), (OD_OMIT_PREFIX | OD_NAME_ONLY)); - msg_format(_("%sがドラゴンを引き寄せた!", "Your %s have attracted an dragon!"), o_name); + msg_format(_("%sがドラゴンを引き寄せた!", "Your %s has attracted an dragon!"), o_name); disturb(FALSE, TRUE); } } @@ -2687,7 +2682,7 @@ static void process_world_aux_curse(void) GAME_TEXT o_name[MAX_NLEN]; object_desc(o_name, choose_cursed_obj_name(TRC_CALL_UNDEAD), (OD_OMIT_PREFIX | OD_NAME_ONLY)); - msg_format(_("%sが死霊を引き寄せた!", "Your %s have attracted an undead!"), o_name); + msg_format(_("%sが死霊を引き寄せた!", "Your %s has attracted an undead!"), o_name); disturb(FALSE, TRUE); } } @@ -2795,7 +2790,7 @@ static void process_world_aux_recharge(void) /* * Recharge rods. Rods now use timeout to control charging status, * and each charging rod in a stack decreases the stack's timeout by - * one per current_world_ptr->game_turn. -LM- + * one per turn. -LM- */ for (changed = FALSE, i = 0; i < INVEN_PACK; i++) { @@ -2957,8 +2952,6 @@ static void process_world_aux_movement(void) * and create a first saved floor */ prepare_change_floor_mode(CFM_FIRST_FLOOR); - - /* Leaving */ p_ptr->leaving = TRUE; if (p_ptr->dungeon_idx == DUNGEON_ANGBAND) @@ -3016,8 +3009,6 @@ static void process_world_aux_movement(void) * and create a first saved floor */ prepare_change_floor_mode(CFM_FIRST_FLOOR); - - /* Leaving */ p_ptr->leaving = TRUE; } else @@ -3086,9 +3077,7 @@ static byte get_dungeon_feeling(void) monster_type *m_ptr = ¤t_floor_ptr->m_list[i]; monster_race *r_ptr; int delta = 0; - - /* Skip dead monsters */ - if (!m_ptr->r_idx) continue; + if (!monster_is_valid(m_ptr)) continue; /* Ignore pet */ if (is_pet(m_ptr)) continue; @@ -3310,7 +3299,7 @@ static void process_world(void) if (number_mon == 0) { - msg_print(_("相打ちに終わりました。", "They have kill each other at the same time.")); + msg_print(_("相打ちに終わりました。", "Nothing survived.")); msg_print(NULL); p_ptr->energy_need = 0; battle_monsters(); @@ -3323,7 +3312,7 @@ static void process_world(void) wm_ptr = ¤t_floor_ptr->m_list[win_m_idx]; monster_desc(m_name, wm_ptr, 0); - msg_format(_("%sが勝利した!", "%s is winner!"), m_name); + msg_format(_("%sが勝利した!", "%s won!"), m_name); msg_print(NULL); if (win_m_idx == (sel_monster+1)) @@ -3342,7 +3331,7 @@ static void process_world(void) } else if (current_world_ptr->game_turn - current_floor_ptr->generated_turn == 150 * TURNS_PER_TICK) { - msg_print(_("申し分けありませんが、この勝負は引き分けとさせていただきます。", "This battle have ended in a draw.")); + msg_print(_("申し分けありませんが、この勝負は引き分けとさせていただきます。", "This battle ended in a draw.")); p_ptr->au += kakekin; msg_print(NULL); p_ptr->energy_need = 0; @@ -3380,8 +3369,6 @@ static void process_world(void) /* Stop playing */ p_ptr->playing = FALSE; - - /* Leaving */ p_ptr->leaving = TRUE; } } @@ -3442,7 +3429,6 @@ static void process_world(void) /* Check every feature */ for (i = 1; i < max_f_idx; i++) { - /* Access the index */ feature_type *f_ptr = &f_info[i]; /* Skip empty index */ @@ -3514,7 +3500,6 @@ static void process_world(void) /* Every 15 minutes after 11:00 pm */ if ((hour == 23) && !(min % 15)) { - /* Disturbing */ disturb(FALSE, TRUE); switch (min / 15) @@ -3983,7 +3968,7 @@ static void process_command(void) { if (vanilla_town) break; - if (ambush_flag) + if (p_ptr->ambush_flag) { msg_print(_("襲撃から逃げるにはマップの端まで移動しなければならない。", "To flee the ambush you have to reach the edge of the map.")); break; @@ -4553,7 +4538,6 @@ static void pack_overflow(void) /* Access the slot to be dropped */ o_ptr = &inventory[INVEN_PACK]; - /* Disturbing */ disturb(FALSE, TRUE); /* Warning */ @@ -4586,7 +4570,7 @@ static void process_upkeep_with_speed(void) p_ptr->enchant_energy_need -= SPEED_TO_ENERGY(p_ptr->pspeed); } - /* No current_world_ptr->game_turn yet */ + /* No turn yet */ if (p_ptr->enchant_energy_need > 0) return; while (p_ptr->enchant_energy_need <= 0) @@ -4613,7 +4597,7 @@ static void process_upkeep_with_speed(void) */ static void process_player(void) { - IDX i; + MONSTER_IDX m_idx; /*** Apply energy ***/ @@ -4634,14 +4618,14 @@ static void process_player(void) if (p_ptr->inside_battle) { - for(i = 1; i < m_max; i++) + for(m_idx = 1; m_idx < m_max; m_idx++) { - monster_type *m_ptr = ¤t_floor_ptr->m_list[i]; + monster_type *m_ptr = ¤t_floor_ptr->m_list[m_idx]; - if (!m_ptr->r_idx) continue; + if (!monster_is_valid(m_ptr)) continue; m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW); - update_monster(i, FALSE); + update_monster(m_idx, FALSE); } prt_time(); } @@ -4652,7 +4636,7 @@ static void process_player(void) p_ptr->energy_need -= SPEED_TO_ENERGY(p_ptr->pspeed); } - /* No current_world_ptr->game_turn yet */ + /* No turn yet */ if (p_ptr->energy_need > 0) return; if (!command_rep) prt_time(); @@ -4755,7 +4739,7 @@ static void process_player(void) /* Recover fully */ (void)set_monster_csleep(p_ptr->riding, 0); monster_desc(m_name, m_ptr, 0); - msg_format(_("%^sを起こした。", "You have waked %s up."), m_name); + msg_format(_("%^sを起こした。", "You have woken %s up."), m_name); } if (MON_STUNNED(m_ptr)) @@ -4790,11 +4774,10 @@ static void process_player(void) { GAME_TEXT m_name[MAX_NLEN]; monster_desc(m_name, m_ptr, 0); - msg_format(_("%^sを恐怖から立ち直らせた。", "%^s is no longer fear."), m_name); + msg_format(_("%^sを恐怖から立ち直らせた。", "%^s is no longer afraid."), m_name); } } - /* Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window" */ handle_stuff(); } @@ -4874,7 +4857,7 @@ static void process_player(void) /* Hack -- cancel "lurking browse mode" */ if (!command_new) command_see = FALSE; - /* Assume free current_world_ptr->game_turn */ + /* Assume free turn */ free_turn(p_ptr); if (p_ptr->inside_battle) @@ -4957,6 +4940,12 @@ static void process_player(void) /* Place the cursor on the player */ move_cursor_relative(p_ptr->y, p_ptr->x); + if(refresh_mon_list) + { + p_ptr->window |= PW_MONSTER_LIST; + update_output(); + } + can_save = TRUE; /* Get a command (normal) */ request_command(FALSE); @@ -4966,11 +4955,9 @@ static void process_player(void) process_command(); } - /* Hack -- Pack Overflow */ pack_overflow(); - /*** Clean up ***/ /* Significant */ @@ -4999,16 +4986,13 @@ static void process_player(void) shimmer_monsters = FALSE; /* Shimmer multi-hued monsters */ - for (i = 1; i < m_max; i++) + for (m_idx = 1; m_idx < m_max; m_idx++) { monster_type *m_ptr; monster_race *r_ptr; - /* Access monster */ - m_ptr = ¤t_floor_ptr->m_list[i]; - - /* Skip dead monsters */ - if (!m_ptr->r_idx) continue; + m_ptr = ¤t_floor_ptr->m_list[m_idx]; + if (!monster_is_valid(m_ptr)) continue; /* Skip unseen monsters */ if (!m_ptr->ml) continue; @@ -5036,15 +5020,11 @@ static void process_player(void) repair_monsters = FALSE; /* Rotate detection flags */ - for (i = 1; i < m_max; i++) + for (m_idx = 1; m_idx < m_max; m_idx++) { monster_type *m_ptr; - - /* Access monster */ - m_ptr = ¤t_floor_ptr->m_list[i]; - - /* Skip dead monsters */ - if (!m_ptr->r_idx) continue; + m_ptr = ¤t_floor_ptr->m_list[m_idx]; + if (!monster_is_valid(m_ptr)) continue; /* Nice monsters get mean */ if (m_ptr->mflag & MFLAG_NICE) @@ -5074,10 +5054,10 @@ static void process_player(void) /* Assume invisible */ m_ptr->ml = FALSE; - update_monster(i, FALSE); + update_monster(m_idx, FALSE); - if (p_ptr->health_who == i) p_ptr->redraw |= (PR_HEALTH); - if (p_ptr->riding == i) p_ptr->redraw |= (PR_UHEALTH); + if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH); + if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH); /* Redraw regardless */ lite_spot(m_ptr->fy, m_ptr->fx); @@ -5087,13 +5067,14 @@ static void process_player(void) } if (p_ptr->pclass == CLASS_IMITATOR) { + int j; if (p_ptr->mane_num > (p_ptr->lev > 44 ? 3 : p_ptr->lev > 29 ? 2 : 1)) { p_ptr->mane_num--; - for (i = 0; i < p_ptr->mane_num; i++) + for (j = 0; j < p_ptr->mane_num; j++) { - p_ptr->mane_spell[i] = p_ptr->mane_spell[i+1]; - p_ptr->mane_dam[i] = p_ptr->mane_dam[i+1]; + p_ptr->mane_spell[j] = p_ptr->mane_spell[j + 1]; + p_ptr->mane_dam[j] = p_ptr->mane_dam[j + 1]; } } new_mane = FALSE; @@ -5110,7 +5091,6 @@ static void process_player(void) p_ptr->redraw |= (PR_MAP); p_ptr->update |= (PU_MONSTERS); - p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); msg_print(_("「時は動きだす…」", "You feel time flowing around you once more.")); @@ -5118,7 +5098,6 @@ static void process_player(void) p_ptr->timewalk = FALSE; p_ptr->energy_need = ENERGY_NEED(); - /* Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window" */ handle_stuff(); } } @@ -5183,7 +5162,7 @@ static void dungeon(bool load_game) target_who = 0; pet_t_m_idx = 0; riding_t_m_idx = 0; - ambush_flag = FALSE; + p_ptr->ambush_flag = FALSE; /* Cancel the health bar */ health_track(0); @@ -5236,19 +5215,9 @@ static void dungeon(bool load_game) character_xtra = TRUE; p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER | PW_MONSTER | PW_OVERHEAD | PW_DUNGEON); + p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_EQUIPPY | PR_MAP); + p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS | PU_VIEW | PU_LITE | PU_MON_LITE | PU_TORCH | PU_MONSTERS | PU_DISTANCE | PU_FLOW); - /* Redraw dungeon */ - p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_EQUIPPY); - - p_ptr->redraw |= (PR_MAP); - - p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS); - - /* Update lite/view */ - p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE | PU_TORCH); - p_ptr->update |= (PU_MONSTERS | PU_DISTANCE | PU_FLOW); - - /* Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window" */ handle_stuff(); /* Leave "xtra" mode */ @@ -5345,7 +5314,6 @@ static void dungeon(bool load_game) process_player(); process_upkeep_with_speed(); - /* Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window" */ handle_stuff(); /* Hack -- Hilite the player */ @@ -5673,7 +5641,7 @@ void play_game(bool new_game) } } - /* Hack -- current_world_ptr->game_turn off the cursor */ + /* Hack -- turn off the cursor */ (void)Term_set_cursor(0); @@ -5927,7 +5895,7 @@ void play_game(bool new_game) /* No player? -- Try to regenerate floor */ if (!p_ptr->y || !p_ptr->x) { - msg_print(_("プレイヤーの位置がおかしい。フロアを再生成します。", "What a strange player location. Regenerate the dungeon floor.")); + msg_print(_("プレイヤーの位置がおかしい。フロアを再生成します。", "What a strange player location, regenerate the dungeon floor.")); change_floor(); } @@ -6124,7 +6092,7 @@ void prevent_turn_overflow(void) rollback_turns = TURNS_PER_TICK * TOWN_DAWN * rollback_days; if (current_world_ptr->game_turn > rollback_turns) current_world_ptr->game_turn -= rollback_turns; - else current_world_ptr->game_turn = 1; /* Paranoia */ + else current_world_ptr->game_turn = 1; if (current_floor_ptr->generated_turn > rollback_turns) current_floor_ptr->generated_turn -= rollback_turns; else current_floor_ptr->generated_turn = 1; if (old_battle > rollback_turns) old_battle -= rollback_turns; @@ -6152,3 +6120,122 @@ void prevent_turn_overflow(void) } } } + +/*! + * @brief ゲーム終了処理 / + * Close up the current game (player may or may not be dead) + * @return なし + * @details + *
+ * This function is called only from "main.c" and "signals.c".
+ * 
+ */ +void close_game(void) +{ + char buf[1024]; + bool do_send = TRUE; + + /* concptr p = "[i:キャラクタの情報, f:ファイル書き出し, t:スコア, x:*鑑定*, ESC:ゲーム終了]"; */ + handle_stuff(); + + /* Flush the messages */ + msg_print(NULL); + + /* Flush the input */ + flush(); + + + /* No suspending now */ + signals_ignore_tstp(); + + + /* Hack -- Character is now "icky" */ + character_icky = TRUE; + + + /* Build the filename */ + path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw"); + + /* Grab permissions */ + safe_setuid_grab(); + + /* Open the high score file, for reading/writing */ + highscore_fd = fd_open(buf, O_RDWR); + + /* Drop permissions */ + safe_setuid_drop(); + + /* Handle death */ + if (p_ptr->is_dead) + { + /* Handle retirement */ + if (p_ptr->total_winner) kingly(); + + /* Save memories */ + if (!cheat_save || get_check(_("死んだデータをセーブしますか? ", "Save death? "))) + { + if (!save_player()) msg_print(_("セーブ失敗!", "death save failed!")); + } + else do_send = FALSE; + + /* You are dead */ + print_tomb(); + + flush(); + + /* Show more info */ + show_info(); + Term_clear(); + + if (check_score()) + { + if ((!send_world_score(do_send))) + { + if (get_check_strict(_("後でスコアを登録するために待機しますか?", "Stand by for later score registration? "), + (CHECK_NO_ESCAPE | CHECK_NO_HISTORY))) + { + p_ptr->wait_report_score = TRUE; + p_ptr->is_dead = FALSE; + if (!save_player()) msg_print(_("セーブ失敗!", "death save failed!")); + } + } + if (!p_ptr->wait_report_score) + (void)top_twenty(); + } + else if (highscore_fd >= 0) + { + display_scores_aux(0, 10, -1, NULL); + } +#if 0 + /* Dump bones file */ + make_bones(); +#endif + } + + /* Still alive */ + else + { + /* Save the game */ + do_cmd_save_game(FALSE); + + /* Prompt for scores */ + prt(_("リターンキーか ESC キーを押して下さい。", "Press Return (or Escape)."), 0, 40); + play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_EXIT); + + /* Predict score (or ESCAPE) */ + if (inkey() != ESCAPE) predict_score(); + } + + + /* Shut the high score file */ + (void)fd_close(highscore_fd); + + /* Forget the high score fd */ + highscore_fd = -1; + + /* Kill all temporary files */ + clear_saved_floor_files(); + + /* Allow suspending now */ + signals_handle_tstp(); +}