OSDN Git Service

0f5118a57575b38fad2ca2abfdf81817decd84c0
[hengbandforosx/hengbandosx.git] / src / load / inventory-loader.cpp
1 #include "load/inventory-loader.h"
2 #include "inventory/inventory-slot-types.h"
3 #include "load/load-util.h"
4 #include "load/old/item-loader-savefile10.h"
5 #include "object/object-mark-types.h"
6 #include "system/object-type-definition.h"
7 #include "system/player-type-definition.h"
8
9 /*!
10  * @brief プレイヤーの所持品情報を読み込む / Read the player inventory
11  * @param player_ptr プレイヤーへの参照ポインタ
12  * @details
13  * Note that the inventory changed in Angband 2.7.4.  Two extra
14  * pack slots were added and the equipment was rearranged.  Note
15  * that these two features combine when parsing old save-files, in
16  * which items from the old "aux" slot are "carried", perhaps into
17  * one of the two new "inventory" slots.
18  *
19  * Note that the inventory is "re-sorted" later by "dungeon()".
20  */
21 static errr rd_inventory(player_type *player_ptr)
22 {
23     player_ptr->inven_cnt = 0;
24     player_ptr->equip_cnt = 0;
25
26     //! @todo std::make_shared の配列対応版は C++20 から
27     player_ptr->inventory_list = std::shared_ptr<object_type[]>{ new object_type[INVEN_TOTAL] };
28
29     int slot = 0;
30     while (true) {
31         auto n = rd_u16b();
32
33         if (n == 0xFFFF)
34             break;
35         object_type forge;
36         object_type *q_ptr;
37         q_ptr = &forge;
38         q_ptr->wipe();
39
40         rd_item(q_ptr);
41         if (!q_ptr->k_idx)
42             return (53);
43
44         if (n >= INVEN_MAIN_HAND) {
45             q_ptr->marked |= OM_TOUCHED;
46             (&player_ptr->inventory_list[n])->copy_from(q_ptr);
47             player_ptr->equip_cnt++;
48             continue;
49         }
50
51         if (player_ptr->inven_cnt == INVEN_PACK) {
52             load_note(_("持ち物の中のアイテムが多すぎる!", "Too many items in the inventory"));
53             return (54);
54         }
55
56         n = slot++;
57         q_ptr->marked |= OM_TOUCHED;
58         (&player_ptr->inventory_list[n])->copy_from(q_ptr);
59         player_ptr->inven_cnt++;
60     }
61
62     return 0;
63 }
64
65 errr load_inventory(player_type *player_ptr)
66 {
67     for (int i = 0; i < 64; i++) {
68         player_ptr->spell_order[i] = rd_byte();
69     }
70
71     if (!rd_inventory(player_ptr))
72         return 0;
73
74     load_note(_("持ち物情報を読み込むことができません", "Unable to read inventory"));
75     return 21;
76 }