OSDN Git Service

Merge branch 'master' of https://github.com/hengband/hengband
[hengbandforosx/hengbandosx.git] / src / specific-object / death-crimson.cpp
1 #include "specific-object/death-crimson.h"
2 #include "artifact/fixed-art-types.h"
3 #include "effect/attribute-types.h"
4 #include "effect/effect-characteristics.h"
5 #include "effect/effect-processor.h"
6 #include "floor/geometry.h"
7 #include "player-base/player-class.h"
8 #include "system/item-entity.h"
9 #include "system/player-type-definition.h"
10 #include "target/target-checker.h"
11 #include "target/target-getter.h"
12 #include "view/display-messages.h"
13
14 /*!
15  * @brief クリムゾンを発射する / Fire Crimson, evoluting gun.
16  @ @param player_ptr プレイヤーへの参照ポインタ
17  * @return キャンセルした場合 false.
18  * @details
19  * Need to analyze size of the window.
20  * Need more color coding.
21  */
22 static bool fire_crimson(PlayerType *player_ptr)
23 {
24     DIRECTION dir;
25     if (!get_aim_dir(player_ptr, &dir)) {
26         return false;
27     }
28
29     POSITION tx = player_ptr->x + 99 * ddx[dir];
30     POSITION ty = player_ptr->y + 99 * ddy[dir];
31     if ((dir == 5) && target_okay(player_ptr)) {
32         tx = target_col;
33         ty = target_row;
34     }
35
36     int num = 1;
37     if (PlayerClass(player_ptr).equals(PlayerClassType::ARCHER)) {
38         if (player_ptr->lev >= 10) {
39             num++;
40         }
41
42         if (player_ptr->lev >= 30) {
43             num++;
44         }
45
46         if (player_ptr->lev >= 45) {
47             num++;
48         }
49     }
50
51     BIT_FLAGS flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
52     for (int i = 0; i < num; i++) {
53         (void)project(player_ptr, 0, player_ptr->lev / 20 + 1, ty, tx, player_ptr->lev * player_ptr->lev * 6 / 50, AttributeType::ROCKET, flg);
54     }
55
56     return true;
57 }
58
59 bool activate_crimson(PlayerType *player_ptr, ItemEntity *o_ptr)
60 {
61     if (!o_ptr->is_specific_artifact(FixedArtifactId::CRIMSON)) {
62         return false;
63     }
64
65     msg_print(_("せっかくだから『クリムゾン』をぶっぱなすぜ!", "I'll fire CRIMSON! SEKKAKUDAKARA!"));
66     return fire_crimson(player_ptr);
67 }