OSDN Git Service

[Fix] #37285 ティボルトのUNIQUE属性付加忘れを修正。
[hengband/hengband.git] / src / files.c
index 057c5bf..49b6dd0 100644 (file)
 #include "world.h"
 #include "player-status.h"
 #include "sort.h"
+#include "mutation.h"
+#include "quest.h"
+#include "store.h"
+#include "artifact.h"
+#include "avatar.h"
+#include "shoot.h"
+#include "player-move.h"
+#include "patron.h"
+#include "monster.h"
+#include "monster-status.h"
 
 
 /*
@@ -558,8 +568,8 @@ errr process_pref_file_command(char *buf)
                        }
                        break;
 
-               /* Process "X:<str>" -- turn option off */
-               /* Process "Y:<str>" -- turn option on */
+               /* Process "X:<str>" -- current_world_ptr->game_turn option off */
+               /* Process "Y:<str>" -- current_world_ptr->game_turn option on */
                case 'X':
                case 'Y':
                        for (i = 0; option_info[i].o_desc; i++)
@@ -617,7 +627,7 @@ errr process_pref_file_command(char *buf)
                                if (streq(gf_desc[i].name, buf + 2))
                                {
                                        /* Remember this color set */
-                                       gf_color[gf_desc[i].num] = quark_add(t);
+                                       gf_color[gf_desc[i].num] = (TERM_COLOR)quark_add(t);
 
                                        /* Success */
                                        return 0;
@@ -1329,8 +1339,6 @@ errr check_time_init(void)
                if (prefix(buf, "FRI:")) strcpy(days[5], buf);
                if (prefix(buf, "SAT:")) strcpy(days[6], buf);
        }
-
-       /* Close it */
        my_fclose(fp);
 
 #endif
@@ -1690,7 +1698,7 @@ static void display_player_melee_bonus(int hand, int hand_entry)
        sprintf(buf, "(%+d,%+d)", (int)show_tohit, (int)show_todam);
 
        /* Dump the bonuses to hit/dam */
-       if (!buki_motteruka(INVEN_RARM) && !buki_motteruka(INVEN_LARM))
+       if (!has_melee_weapon(INVEN_RARM) && !has_melee_weapon(INVEN_LARM))
                display_player_one_line(ENTRY_BARE_HAND, buf, TERM_L_BLUE);
        else if (p_ptr->ryoute)
                display_player_one_line(ENTRY_TWO_HANDS, buf, TERM_L_BLUE);
@@ -1814,8 +1822,8 @@ static void display_player_middle(void)
                }
                else
                {
-                       if (MON_FAST(&m_list[p_ptr->riding])) tmp_speed += 10;
-                       if (MON_SLOW(&m_list[p_ptr->riding])) tmp_speed -= 10;
+                       if (MON_FAST(&current_floor_ptr->m_list[p_ptr->riding])) tmp_speed += 10;
+                       if (MON_SLOW(&current_floor_ptr->m_list[p_ptr->riding])) tmp_speed -= 10;
                }
 
                if (tmp_speed)
@@ -1900,7 +1908,7 @@ static void display_player_middle(void)
                display_player_one_line(ENTRY_SP, format("%4d/%4d", p_ptr->csp , p_ptr->msp), TERM_RED);
 
        /* Dump play time */
-       display_player_one_line(ENTRY_PLAY_TIME, format("%.2lu:%.2lu:%.2lu", playtime/(60*60), (playtime/60)%60, playtime%60), TERM_L_GREEN);
+       display_player_one_line(ENTRY_PLAY_TIME, format("%.2lu:%.2lu:%.2lu", current_world_ptr->play_time/(60*60), (current_world_ptr->play_time/60)%60, current_world_ptr->play_time%60), TERM_L_GREEN);
 }
 
 
@@ -1922,8 +1930,6 @@ static concptr likert(int x, int y)
        static char dummy[20] = "", dummy2[20] = "";
        memset(dummy, 0, strlen(dummy));
        memset(dummy2, 0, strlen(dummy2));
-
-       /* Paranoia */
        if (y <= 0) y = 1;
 
        if(show_actual_value)
@@ -2025,7 +2031,7 @@ static void display_player_various(void)
        int             shots, shot_frac;
        bool dokubari;
 
-       object_type             *o_ptr;
+       object_type *o_ptr;
 
        if (p_ptr->muta2 & MUT2_HORNS)     muta_att++;
        if (p_ptr->muta2 & MUT2_SCOR_TAIL) muta_att++;
@@ -2787,7 +2793,7 @@ static void tim_player_flags(BIT_FLAGS flgs[TR_FLAG_SIZE])
  * @param mode オプション
  * @return なし
  */
-static void display_player_equippy(TERM_LEN y, TERM_LEN x, BIT_FLAGS16 mode)
+void display_player_equippy(TERM_LEN y, TERM_LEN x, BIT_FLAGS16 mode)
 {
        int i, max_i;
 
@@ -2823,15 +2829,6 @@ static void display_player_equippy(TERM_LEN y, TERM_LEN x, BIT_FLAGS16 mode)
 
 
 /*!
- * @brief プレイヤーの装備一覧シンボルを固定位置に表示する
- * @return なし
- */
-void print_equippy(void)
-{
-       display_player_equippy(ROW_EQUIPPY, COL_EQUIPPY, 0);
-}
-
-/*!
  * @brief プレイヤーの装備による免疫フラグを返す
  * @param flgs フラグを保管する配列
  * @return なし
@@ -3924,7 +3921,7 @@ void display_player(int mode)
                                        sprintf(statmsg, "...You %s after the winning.", streq(p_ptr->died_from, "Seppuku") ? "did Seppuku" : "retired from the adventure");
 #endif
                                }
-                               else if (!dun_level)
+                               else if (!current_floor_ptr->dun_level)
                                {
 #ifdef JP
                                        sprintf(statmsg, "…あなたは%sで%sに殺された。", map_name(), p_ptr->died_from);
@@ -3949,15 +3946,15 @@ void display_player(int mode)
                                else
                                {
 #ifdef JP
-                                       sprintf(statmsg, "…あなたは、%sの%d階で%sに殺された。", map_name(), (int)dun_level, p_ptr->died_from);
+                                       sprintf(statmsg, "…あなたは、%sの%d階で%sに殺された。", map_name(), (int)current_floor_ptr->dun_level, p_ptr->died_from);
 #else
-                                       sprintf(statmsg, "...You were killed by %s on level %d of %s.", p_ptr->died_from, dun_level, map_name());
+                                       sprintf(statmsg, "...You were killed by %s on level %d of %s.", p_ptr->died_from, current_floor_ptr->dun_level, map_name());
 #endif
                                }
                        }
                        else if (character_dungeon)
                        {
-                               if (!dun_level)
+                               if (!current_floor_ptr->dun_level)
                                {
                                        sprintf(statmsg, _("…あなたは現在、 %s にいる。", "...Now, you are in %s."), map_name());
                                }
@@ -3981,9 +3978,9 @@ void display_player(int mode)
                                else
                                {
 #ifdef JP
-                                       sprintf(statmsg, "…あなたは現在、 %s の %d 階で探索している。", map_name(), (int)dun_level);
+                                       sprintf(statmsg, "…あなたは現在、 %s の %d 階で探索している。", map_name(), (int)current_floor_ptr->dun_level);
 #else
-                                       sprintf(statmsg, "...Now, you are exploring level %d of %s.", dun_level, map_name());
+                                       sprintf(statmsg, "...Now, you are exploring level %d of %s.", current_floor_ptr->dun_level, map_name());
 #endif
                                }
                        }
@@ -4181,9 +4178,9 @@ static void dump_aux_pet(FILE *fff)
 
        for (i = m_max - 1; i >= 1; i--)
        {
-               monster_type *m_ptr = &m_list[i];
+               monster_type *m_ptr = &current_floor_ptr->m_list[i];
 
-               if (!m_ptr->r_idx) continue;
+               if (!monster_is_valid(m_ptr)) continue;
                if (!is_pet(m_ptr)) continue;
                pet_settings = TRUE;
                if (!m_ptr->nickname && (p_ptr->riding != i)) continue;
@@ -4446,9 +4443,7 @@ static void dump_aux_quest(FILE *fff)
 
        /* Sort by compete level */
        for (i = 1; i < max_q_idx; i++) quest_num[i] = i;
-       ang_sort_comp = ang_sort_comp_quest_num;
-       ang_sort_swap = ang_sort_swap_quest_num;
-       ang_sort(quest_num, &dummy, max_q_idx);
+       ang_sort(quest_num, &dummy, max_q_idx, ang_sort_comp_quest_num, ang_sort_swap_quest_num);
 
        /* Dump Quest Information */
        fputc('\n', fff);
@@ -4708,13 +4703,8 @@ static void dump_aux_monsters(FILE *fff)
                fprintf(fff, "You have defeated %ld %s including %ld unique monster%s in total.\n", norm_total, norm_total == 1 ? "enemy" : "enemies", uniq_total, (uniq_total == 1 ? "" : "s"));
 #endif
 
-
-               /* Select the sort method */
-               ang_sort_comp = ang_sort_comp_hook;
-               ang_sort_swap = ang_sort_swap_hook;
-
                /* Sort the array by dungeon depth of monsters */
-               ang_sort(who, &why, uniq_total);
+               ang_sort(who, &why, uniq_total, ang_sort_comp_hook, ang_sort_swap_hook);
                fprintf(fff, _("\n《上位%ld体のユニーク・モンスター》\n", "\n< Unique monsters top %ld >\n"), MIN(uniq_total, 10));
 
                /* Print top 10 */
@@ -4890,10 +4880,10 @@ static void dump_aux_home_museum(FILE *fff)
        store_type  *st_ptr;
 
        /* Do we need it?? */
-       /* process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x); */
+       /* process_dungeon_file("w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x); */
 
        /* Print the home */
-       st_ptr = &town[1].store[STORE_HOME];
+       st_ptr = &town_info[1].store[STORE_HOME];
 
        /* Home -- if anything there */
        if (st_ptr->stock_num)
@@ -4918,7 +4908,7 @@ static void dump_aux_home_museum(FILE *fff)
 
 
        /* Print the home */
-       st_ptr = &town[1].store[STORE_MUSEUM];
+       st_ptr = &town_info[1].store[STORE_MUSEUM];
 
        /* Home -- if anything there */
        if (st_ptr->stock_num)
@@ -5040,8 +5030,6 @@ errr file_character(concptr name)
        }
 
        (void)make_character_dump(fff);
-
-       /* Close it */
        my_fclose(fff);
 
 
@@ -5418,7 +5406,6 @@ bool show_file(bool show_version, concptr name, concptr what, int line, BIT_FLAG
                /* Re-open the file if needed */
                if (next > line)
                {
-                       /* Close it */
                        my_fclose(fff);
 
                        /* Hack -- Re-Open the file */
@@ -5697,8 +5684,6 @@ bool show_file(bool show_version, concptr name, concptr what, int line, BIT_FLAG
                        strcpy (xtmp, "");
 
                        if (!get_string(_("ファイル名: ", "File name: "), xtmp, 80)) continue;
-
-                       /* Close it */
                        my_fclose(fff);
 
                        /* Build the filename */
@@ -5722,8 +5707,6 @@ bool show_file(bool show_version, concptr name, concptr what, int line, BIT_FLAG
 
                        while (!my_fgets(fff, buff, sizeof(buff)))
                                my_fputs(ffp, buff, 80);
-
-                       /* Close it */
                        my_fclose(fff);
                        my_fclose(ffp);
 
@@ -5976,90 +5959,6 @@ void get_name(void)
 
 
 /*!
- * @brief 自殺するコマンドのメインルーチン
- * Hack -- commit suicide
- * @return なし
- * @details
- */
-void do_cmd_suicide(void)
-{
-       int i;
-
-       /* Flush input */
-       flush();
-
-       /* Verify Retirement */
-       if (p_ptr->total_winner)
-       {
-               /* Verify */
-               if (!get_check_strict(_("引退しますか? ", "Do you want to retire? "), CHECK_NO_HISTORY)) return;
-       }
-
-       /* Verify Suicide */
-       else
-       {
-               /* Verify */
-               if (!get_check(_("本当に自殺しますか?", "Do you really want to commit suicide? "))) return;
-       }
-
-
-       if (!p_ptr->noscore)
-       {
-               /* Special Verification for suicide */
-               prt(_("確認のため '@' を押して下さい。", "Please verify SUICIDE by typing the '@' sign: "), 0, 0);
-
-               flush();
-               i = inkey();
-               prt("", 0, 0);
-               if (i != '@') return;
-
-               play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_GAMEOVER);
-       }
-
-       /* Initialize "last message" buffer */
-       if (p_ptr->last_message) string_free(p_ptr->last_message);
-       p_ptr->last_message = NULL;
-
-       /* Hack -- Note *winning* message */
-       if (p_ptr->total_winner && last_words)
-       {
-               char buf[1024] = "";
-               play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_WINNER);
-               do
-               {
-                       while (!get_string(_("*勝利*メッセージ: ", "*Winning* message: "), buf, sizeof buf)) ;
-               }
-               while (!get_check_strict(_("よろしいですか?", "Are you sure? "), CHECK_NO_HISTORY));
-
-               if (buf[0])
-               {
-                       p_ptr->last_message = string_make(buf);
-                       msg_print(p_ptr->last_message);
-               }
-       }
-
-       /* Stop playing */
-       p_ptr->playing = FALSE;
-
-       /* Kill the player */
-       p_ptr->is_dead = TRUE;
-
-       /* Leaving */
-       p_ptr->leaving = TRUE;
-
-       if (!p_ptr->total_winner)
-       {
-               do_cmd_write_nikki(NIKKI_BUNSHOU, 0, _("ダンジョンの探索に絶望して自殺した。", "give up all hope to commit suicide."));
-               do_cmd_write_nikki(NIKKI_GAMESTART, 1, _("-------- ゲームオーバー --------", "--------   Game  Over   --------"));
-               do_cmd_write_nikki(NIKKI_BUNSHOU, 1, "\n\n\n\n");
-       }
-
-       /* Cause of death */
-       (void)strcpy(p_ptr->died_from, _("途中終了", "Quitting"));
-}
-
-
-/*!
  * @brief セーブするコマンドのメインルーチン
  * Save the game
  * @param is_autosave オートセーブ中の処理ならばTRUE
@@ -6134,8 +6033,6 @@ void do_cmd_save_game(int is_autosave)
 void do_cmd_save_and_exit(void)
 {
        p_ptr->playing = FALSE;
-
-       /* Leaving */
        p_ptr->leaving = TRUE;
        do_cmd_write_nikki(NIKKI_GAMESTART, 0, _("----ゲーム中断----", "---- Save and Exit Game ----"));
 }
@@ -6250,12 +6147,12 @@ static void make_bones(void)
        if (!(p_ptr->noscore & 0x00FF))
        {
                /* Ignore people who die in town */
-               if (dun_level)
+               if (current_floor_ptr->dun_level)
                {
                        char tmp[128];
 
                        /* "Bones" name */
-                       sprintf(tmp, "bone.%03d", dun_level);
+                       sprintf(tmp, "bone.%03d", current_floor_ptr->dun_level);
 
                        /* Build the filename */
                        path_build(str, sizeof(str), ANGBAND_DIR_BONE, tmp);
@@ -6309,7 +6206,7 @@ bool (*tombstone_aux)(void) = NULL;
  * Display a "tomb-stone"
  * @return なし
  */
-static void print_tomb(void)
+void print_tomb(void)
 {
        bool done = FALSE;
 
@@ -6458,7 +6355,7 @@ static void print_tomb(void)
 
                if (!streq(p_ptr->died_from, "ripe") && !streq(p_ptr->died_from, "Seppuku"))
                {
-                       if (dun_level == 0)
+                       if (current_floor_ptr->dun_level == 0)
                        {
                                concptr field_name = p_ptr->town_num ? "街" : "荒野";
                                if (streq(p_ptr->died_from, "途中終了"))
@@ -6474,18 +6371,18 @@ static void print_tomb(void)
                        {
                                if (streq(p_ptr->died_from, "途中終了"))
                                {
-                                       sprintf(tmp, "地下 %d 階で死んだ", (int)dun_level);
+                                       sprintf(tmp, "地下 %d 階で死んだ", (int)current_floor_ptr->dun_level);
                                }
                                else
                                {
-                                       sprintf(tmp, "に地下 %d 階で殺された", (int)dun_level);
+                                       sprintf(tmp, "に地下 %d 階で殺された", (int)current_floor_ptr->dun_level);
                                }
                        }
                        center_string(buf, tmp);
                        put_str(buf, 15 + extra_line, 11);
                }
 #else
-               (void)sprintf(tmp, "Killed on Level %d", dun_level);
+               (void)sprintf(tmp, "Killed on Level %d", current_floor_ptr->dun_level);
                center_string(buf, tmp);
                put_str(buf, 14, 11);
 
@@ -6519,10 +6416,10 @@ static void print_tomb(void)
  * Display some character info
  * @return なし
  */
-static void show_info(void)
+void show_info(void)
 {
        int             i, j, k, l;
-       object_type             *o_ptr;
+       object_type *o_ptr;
        store_type              *st_ptr;
 
        /* Hack -- Know everything in the inven/equip */
@@ -6540,7 +6437,7 @@ static void show_info(void)
 
        for (i = 1; i < max_towns; i++)
        {
-               st_ptr = &town[i].store[STORE_HOME];
+               st_ptr = &town_info[i].store[STORE_HOME];
 
                /* Hack -- Know everything in the home */
                for (j = 0; j < st_ptr->stock_num; j++)
@@ -6628,7 +6525,7 @@ static void show_info(void)
        /* Homes in the different towns */
        for (l = 1; l < max_towns; l++)
        {
-               st_ptr = &town[l].store[STORE_HOME];
+               st_ptr = &town_info[l].store[STORE_HOME];
 
                /* Home -- if anything there */
                if (st_ptr->stock_num)
@@ -6671,7 +6568,7 @@ static void show_info(void)
  * Display some character info
  * @return なし
  */
-static bool check_score(void)
+bool check_score(void)
 {
        Term_clear();
 
@@ -6731,125 +6628,6 @@ static bool check_score(void)
        return TRUE;
 }
 
-/*!
- * @brief ゲーム終了処理 /
- * Close up the current game (player may or may not be dead)
- * @return なし
- * @details
- * <pre>
- * This function is called only from "main.c" and "signals.c".
- * </pre>
- */
-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 temporal files */
-       clear_saved_floor_files();
-
-       /* Allow suspending now */
-       signals_handle_tstp();
-}
-
 
 /*!
  * @brief 異常発生時のゲーム緊急終了処理 /
@@ -6874,7 +6652,7 @@ void exit_game_panic(void)
        /* Clear the top line */
        prt("", 0, 0);
 
-       /* Hack -- turn off some things */
+       /* Hack -- current_world_ptr->game_turn off some things */
        disturb(TRUE, TRUE);
 
        /* Mega-Hack -- Delay death */
@@ -7325,8 +7103,6 @@ static void handle_signal_simple(int sig)
 
                /* Suicide */
                p_ptr->is_dead = TRUE;
-
-               /* Leaving */
                p_ptr->leaving = TRUE;
 
                /* Close stuff */