OSDN Git Service

[Refactor] #1372 AngbandWorld の乱数に関するフィールド変数をAngbandSystem へ移した
[hengbandforosx/hengbandosx.git] / src / load / info-loader.cpp
1 #include "load/info-loader.h"
2 #include "game-option/runtime-arguments.h"
3 #include "load/angband-version-comparer.h"
4 #include "load/load-util.h"
5 #include "load/option-loader.h"
6 #include "system/angband-system.h"
7 #include "system/angband-version.h"
8 #include "system/angband.h"
9 #include "view/display-messages.h"
10 #include "world/world.h"
11
12 /*!
13  * @brief セーブファイルからバージョン情報及びセーブ情報を取得する
14  * @details
15  * バージョン0.x.x時代のバージョン情報である場合、サポート対象外
16  * (FAKE_VERもH_VERも10台の数字のはず)
17  */
18 void rd_version_info(void)
19 {
20     auto tmp_major = rd_byte();
21     auto is_old_ver = (10 <= tmp_major) && (tmp_major <= 13);
22     constexpr auto variant_length = VARIANT_NAME.length();
23     auto &system = AngbandSystem::get_instance();
24     if (tmp_major == variant_length) {
25         strip_bytes(variant_length);
26         load_xor_byte = 0;
27         system.version_major = rd_byte();
28         system.version_minor = rd_byte();
29         system.version_patch = rd_byte();
30         system.version_extra = rd_byte();
31         strip_bytes(1);
32     } else if (is_old_ver) {
33         strip_bytes(3);
34     } else {
35         throw("Invalid version is detected!");
36     }
37
38     load_xor_byte = system.savefile_key;
39     v_check = 0L;
40     x_check = 0L;
41
42     if (is_old_ver) {
43         /* Old savefile will be version 0.0.0.3 */
44         system.version_extra = rd_byte();
45         system.version_patch = rd_byte();
46         system.version_minor = rd_byte();
47         system.version_major = rd_byte();
48     }
49
50     w_ptr->sf_system = rd_u32b();
51     w_ptr->sf_when = rd_u32b();
52     w_ptr->sf_lives = rd_u16b();
53     w_ptr->sf_saves = rd_u16b();
54
55     loading_savefile_version = rd_u32b();
56
57     /* h_ver_majorがfake_ver_majorと同じだったころへの対策 */
58     if (loading_savefile_version_is_older_than(10)) {
59         constexpr auto fake_ver_plus = 10;
60         if (tmp_major - system.version_major < fake_ver_plus) {
61             system.version_major -= fake_ver_plus;
62         }
63     }
64
65     constexpr auto fmt = _("バージョン %d.%d.%d のセーブデータ(SAVE%u形式)をロード中...", "Loading a version %d.%d.%d savefile (SAVE%u format)...");
66     load_note(format(fmt, system.version_major, system.version_minor, system.version_patch, loading_savefile_version));
67 }
68
69 /*!
70  * @brief 乱数状態を読み込む / Read RNG state (added in 2.8.0)
71  */
72 void rd_randomizer(void)
73 {
74     strip_bytes(4);
75     Xoshiro128StarStar::state_type state{};
76     for (auto &s : state) {
77         s = rd_u32b();
78     }
79
80     AngbandSystem::get_instance().rng.set_state(state);
81     strip_bytes(4 * (RAND_DEG - state.size()));
82 }
83
84 /*!
85  * @brief メッセージログを読み込む / Read the saved messages
86  */
87 void rd_messages(void)
88 {
89     if (h_older_than(2, 2, 0, 75)) {
90         auto num = rd_u16b();
91         int message_max;
92         message_max = (int)num;
93
94         for (int i = 0; i < message_max; i++) {
95             char buf[128];
96             rd_string(buf, sizeof(buf));
97             message_add(buf);
98         }
99     }
100
101     auto num = rd_u32b();
102     int message_max = (int)num;
103     for (int i = 0; i < message_max; i++) {
104         char buf[128];
105         rd_string(buf, sizeof(buf));
106         message_add(buf);
107     }
108 }
109
110 void rd_system_info(void)
111 {
112     kanji_code = rd_byte();
113     rd_randomizer();
114     load_note(_("乱数情報をロードしました", "Loaded Randomizer Info"));
115     rd_options();
116     load_note(_("オプションをロードしました", "Loaded Option Flags"));
117     rd_messages();
118     load_note(_("メッセージをロードしました", "Loaded Messages"));
119 }