OSDN Git Service

Merge pull request #3532 from sikabane-works/release/3.0.0.87-alpha
[hengbandforosx/hengbandosx.git] / src / grid / object-placer.cpp
1 #include "grid/object-placer.h"
2 #include "floor/cave.h"
3 #include "floor/floor-object.h"
4 #include "grid/grid.h"
5 #include "system/artifact-type-definition.h"
6 #include "system/floor-type-definition.h"
7 #include "system/grid-type-definition.h"
8 #include "system/item-entity.h"
9 #include "system/player-type-definition.h"
10 #include "world/world-object.h"
11
12 /*!
13  * @brief フロアの指定位置に生成階に応じた財宝オブジェクトの生成を行う。
14  * Places a treasure (Gold or Gems) at given location
15  * @param player_ptr プレイヤーへの参照ポインタ
16  * @param y 配置したいフロアのY座標
17  * @param x 配置したいフロアのX座標
18  * @return 生成に成功したらTRUEを返す。
19  * @details
20  * The location must be a legal, clean, floor grid.
21  */
22 void place_gold(PlayerType *player_ptr, POSITION y, POSITION x)
23 {
24     auto *floor_ptr = player_ptr->current_floor_ptr;
25     auto *g_ptr = &floor_ptr->grid_array[y][x];
26     if (!in_bounds(floor_ptr, y, x)) {
27         return;
28     }
29     if (!cave_drop_bold(floor_ptr, y, x)) {
30         return;
31     }
32     if (!g_ptr->o_idx_list.empty()) {
33         return;
34     }
35
36     ItemEntity forge;
37     ItemEntity *q_ptr;
38     q_ptr = &forge;
39     q_ptr->wipe();
40     if (!make_gold(player_ptr, q_ptr)) {
41         return;
42     }
43
44     OBJECT_IDX o_idx = o_pop(floor_ptr);
45     if (o_idx == 0) {
46         return;
47     }
48
49     ItemEntity *o_ptr;
50     o_ptr = &floor_ptr->o_list[o_idx];
51     o_ptr->copy_from(q_ptr);
52
53     o_ptr->iy = y;
54     o_ptr->ix = x;
55     g_ptr->o_idx_list.add(floor_ptr, o_idx);
56
57     note_spot(player_ptr, y, x);
58     lite_spot(player_ptr, y, x);
59 }
60
61 /*!
62  * @brief フロアの指定位置に生成階に応じたベースアイテムの生成を行う。
63  * Attempt to place an object (normal or good/great) at the given location.
64  * @param player_ptr プレイヤーへの参照ポインタ
65  * @param y 配置したいフロアのY座標
66  * @param x 配置したいフロアのX座標
67  * @param mode オプションフラグ
68  * @return 生成に成功したらTRUEを返す。
69  * @details
70  * This routine plays nasty games to generate the "special artifacts".\n
71  * This routine uses "object_level" for the "generation level".\n
72  * This routine requires a clean floor grid destination.\n
73  */
74 void place_object(PlayerType *player_ptr, POSITION y, POSITION x, BIT_FLAGS mode)
75 {
76     auto *floor_ptr = player_ptr->current_floor_ptr;
77     auto *g_ptr = &floor_ptr->grid_array[y][x];
78     ItemEntity forge;
79     ItemEntity *q_ptr;
80     if (!in_bounds(floor_ptr, y, x) || !cave_drop_bold(floor_ptr, y, x) || !g_ptr->o_idx_list.empty()) {
81         return;
82     }
83
84     q_ptr = &forge;
85     q_ptr->wipe();
86     if (!make_object(player_ptr, q_ptr, mode)) {
87         return;
88     }
89
90     OBJECT_IDX o_idx = o_pop(floor_ptr);
91     if (o_idx == 0) {
92         if (q_ptr->is_fixed_artifact()) {
93             q_ptr->get_fixed_artifact().is_generated = false;
94         }
95
96         return;
97     }
98
99     ItemEntity *o_ptr;
100     o_ptr = &floor_ptr->o_list[o_idx];
101     o_ptr->copy_from(q_ptr);
102
103     o_ptr->iy = y;
104     o_ptr->ix = x;
105     g_ptr->o_idx_list.add(floor_ptr, o_idx);
106
107     note_spot(player_ptr, y, x);
108     lite_spot(player_ptr, y, x);
109 }