OSDN Git Service

[Refactor] monster_idxと0との比較を関数化する
[hengbandforosx/hengbandosx.git] / src / mind / mind-berserker.cpp
1 #include "mind/mind-berserker.h"
2 #include "action/movement-execution.h"
3 #include "cmd-action/cmd-attack.h"
4 #include "floor/geometry.h"
5 #include "game-option/input-options.h"
6 #include "grid/feature.h"
7 #include "grid/grid.h"
8 #include "mind/mind-numbers.h"
9 #include "monster/monster-util.h"
10 #include "player-attack/player-attack.h"
11 #include "player/player-move.h"
12 #include "spell-kind/earthquake.h"
13 #include "spell-kind/spells-detection.h"
14 #include "system/floor-type-definition.h"
15 #include "system/grid-type-definition.h"
16 #include "system/player-type-definition.h"
17 #include "target/target-getter.h"
18 #include "view/display-messages.h"
19
20 /*!
21  * @brief 怒りの発動 /
22  * do_cmd_cast calls this function if the player's class is 'berserker'.
23  * @param spell 発動する特殊技能のID
24  * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
25  */
26 bool cast_berserk_spell(PlayerType *player_ptr, MindBerserkerType spell)
27 {
28     POSITION y, x;
29     DIRECTION dir;
30     switch (spell) {
31     case MindBerserkerType::DETECT_MANACE:
32         detect_monsters_mind(player_ptr, DETECT_RAD_DEFAULT);
33         break;
34     case MindBerserkerType::CHARGE: {
35         if (player_ptr->riding) {
36             msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
37             return false;
38         }
39
40         if (!get_direction(player_ptr, &dir) || (dir == 5)) {
41             return false;
42         }
43
44         y = player_ptr->y + ddy[dir];
45         x = player_ptr->x + ddx[dir];
46         if (!is_monster(player_ptr->current_floor_ptr->grid_array[y][x].m_idx)) {
47             msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
48             return false;
49         }
50
51         do_cmd_attack(player_ptr, y, x, HISSATSU_NONE);
52         if (!player_can_enter(player_ptr, player_ptr->current_floor_ptr->grid_array[y][x].feat, 0) || is_trap(player_ptr, player_ptr->current_floor_ptr->grid_array[y][x].feat)) {
53             break;
54         }
55
56         y += ddy[dir];
57         x += ddx[dir];
58         if (player_can_enter(player_ptr, player_ptr->current_floor_ptr->grid_array[y][x].feat, 0) && !is_trap(player_ptr, player_ptr->current_floor_ptr->grid_array[y][x].feat) && !is_monster(player_ptr->current_floor_ptr->grid_array[y][x].m_idx)) {
59             msg_print(nullptr);
60             (void)move_player_effect(player_ptr, y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
61         }
62
63         break;
64     }
65     case MindBerserkerType::SMASH_TRAP: {
66         if (!get_direction(player_ptr, &dir)) {
67             return false;
68         }
69
70         y = player_ptr->y + ddy[dir];
71         x = player_ptr->x + ddx[dir];
72         exe_movement(player_ptr, dir, easy_disarm, true);
73         break;
74     }
75     case MindBerserkerType::QUAKE:
76         earthquake(player_ptr, player_ptr->y, player_ptr->x, 8 + randint0(5), 0);
77         break;
78     case MindBerserkerType::MASSACRE:
79         massacre(player_ptr);
80         break;
81     default:
82         msg_print(_("なに?", "Zap?"));
83         break;
84     }
85
86     return true;
87 }