OSDN Git Service

Merge branch 'master' of https://github.com/hengband/hengband
[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 "player-attack/player-attack.h"
10 #include "player/player-move.h"
11 #include "spell-kind/earthquake.h"
12 #include "spell-kind/spells-detection.h"
13 #include "system/floor-type-definition.h"
14 #include "system/grid-type-definition.h"
15 #include "system/player-type-definition.h"
16 #include "target/target-getter.h"
17 #include "view/display-messages.h"
18
19 /*!
20  * @brief 怒りの発動 /
21  * do_cmd_cast calls this function if the player's class is 'berserker'.
22  * @param spell 発動する特殊技能のID
23  * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
24  */
25 bool cast_berserk_spell(PlayerType *player_ptr, MindBerserkerType spell)
26 {
27     switch (spell) {
28     case MindBerserkerType::DETECT_MANACE:
29         detect_monsters_mind(player_ptr, DETECT_RAD_DEFAULT);
30         return true;
31     case MindBerserkerType::CHARGE: {
32         if (player_ptr->riding) {
33             msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
34             return false;
35         }
36
37         const auto dir = get_direction(player_ptr);
38         if (!dir || (dir == 5)) {
39             return false;
40         }
41
42         const auto pos = player_ptr->get_neighbor(*dir);
43         const auto &floor = *player_ptr->current_floor_ptr;
44         const auto &grid = floor.get_grid(pos);
45         if (!grid.has_monster()) {
46             msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
47             return false;
48         }
49
50         do_cmd_attack(player_ptr, pos.y, pos.x, HISSATSU_NONE);
51         if (!player_can_enter(player_ptr, grid.feat, 0) || is_trap(player_ptr, grid.feat)) {
52             return true;
53         }
54
55         const Pos2D pos_new(pos.y + ddy[*dir], pos.x + ddx[*dir]);
56         const auto &grid_new = floor.get_grid(pos_new);
57         if (player_can_enter(player_ptr, grid_new.feat, 0) && !is_trap(player_ptr, grid_new.feat) && !grid_new.has_monster()) {
58             msg_print(nullptr);
59             (void)move_player_effect(player_ptr, pos_new.y, pos_new.x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
60         }
61
62         return true;
63     }
64     case MindBerserkerType::SMASH_TRAP: {
65         const auto dir = get_direction(player_ptr);
66         if (!dir) {
67             return false;
68         }
69
70         exe_movement(player_ptr, *dir, easy_disarm, true);
71         return true;
72     }
73     case MindBerserkerType::QUAKE:
74         earthquake(player_ptr, player_ptr->y, player_ptr->x, 8 + randint0(5), 0);
75         return true;
76     case MindBerserkerType::MASSACRE:
77         massacre(player_ptr);
78         return true;
79     default:
80         msg_print(_("なに?", "Zap?"));
81         return true;
82     }
83 }