OSDN Git Service

c5b9da5c47c3f7dba1117ff2d50d079fca443629
[hengbandforosx/hengbandosx.git] / src / racial / racial-draconian.cpp
1 #include "racial/racial-draconian.h"
2 #include "mind/mind-elementalist.h"
3 #include "player/player-status.h"
4 #include "spell-kind/spells-launcher.h"
5 #include "spell/spell-types.h"
6 #include "system/player-type-definition.h"
7 #include "target/target-getter.h"
8 #include "view/display-messages.h"
9
10 static void decide_breath_kind(player_type *player_ptr, int *breath_type, concptr *breath_type_description)
11 {
12     if (randint1(100) >= player_ptr->lev)
13         return;
14
15     switch (player_ptr->pclass) {
16     case PlayerClassType::WARRIOR:
17     case PlayerClassType::BERSERKER:
18     case PlayerClassType::RANGER:
19     case PlayerClassType::TOURIST:
20     case PlayerClassType::IMITATOR:
21     case PlayerClassType::ARCHER:
22     case PlayerClassType::SMITH:
23         if (one_in_(3)) {
24             *breath_type = GF_MISSILE;
25             *breath_type_description = _("エレメント", "the elements");
26         } else {
27             *breath_type = GF_SHARDS;
28             *breath_type_description = _("破片", "shards");
29         }
30
31         break;
32     case PlayerClassType::MAGE:
33     case PlayerClassType::WARRIOR_MAGE:
34     case PlayerClassType::HIGH_MAGE:
35     case PlayerClassType::SORCERER:
36     case PlayerClassType::MAGIC_EATER:
37     case PlayerClassType::RED_MAGE:
38     case PlayerClassType::BLUE_MAGE:
39     case PlayerClassType::MIRROR_MASTER:
40         if (one_in_(3)) {
41             *breath_type = GF_MANA;
42             *breath_type_description = _("魔力", "mana");
43         } else {
44             *breath_type = GF_DISENCHANT;
45             *breath_type_description = _("劣化", "disenchantment");
46         }
47
48         break;
49     case PlayerClassType::CHAOS_WARRIOR:
50         if (!one_in_(3)) {
51             *breath_type = GF_CONFUSION;
52             *breath_type_description = _("混乱", "confusion");
53         } else {
54             *breath_type = GF_CHAOS;
55             *breath_type_description = _("カオス", "chaos");
56         }
57
58         break;
59     case PlayerClassType::MONK:
60     case PlayerClassType::SAMURAI:
61     case PlayerClassType::FORCETRAINER:
62         if (!one_in_(3)) {
63             *breath_type = GF_CONFUSION;
64             *breath_type_description = _("混乱", "confusion");
65         } else {
66             *breath_type = GF_SOUND;
67             *breath_type_description = _("轟音", "sound");
68         }
69
70         break;
71     case PlayerClassType::MINDCRAFTER:
72         if (!one_in_(3)) {
73             *breath_type = GF_CONFUSION;
74             *breath_type_description = _("混乱", "confusion");
75         } else {
76             *breath_type = GF_PSI;
77             *breath_type_description = _("精神エネルギー", "mental energy");
78         }
79
80         break;
81     case PlayerClassType::PRIEST:
82     case PlayerClassType::PALADIN:
83         if (one_in_(3)) {
84             *breath_type = GF_HELL_FIRE;
85             *breath_type_description = _("地獄の劫火", "hellfire");
86         } else {
87             *breath_type = GF_HOLY_FIRE;
88             *breath_type_description = _("聖なる炎", "holy fire");
89         }
90
91         break;
92     case PlayerClassType::ROGUE:
93     case PlayerClassType::NINJA:
94         if (one_in_(3)) {
95             *breath_type = GF_DARK;
96             *breath_type_description = _("暗黒", "darkness");
97         } else {
98             *breath_type = GF_POIS;
99             *breath_type_description = _("毒", "poison");
100         }
101
102         break;
103     case PlayerClassType::BARD:
104         if (!one_in_(3)) {
105             *breath_type = GF_SOUND;
106             *breath_type_description = _("轟音", "sound");
107         } else {
108             *breath_type = GF_CONFUSION;
109             *breath_type_description = _("混乱", "confusion");
110         }
111
112         break;
113     case PlayerClassType::ELEMENTALIST:
114         *breath_type = get_element_type(player_ptr->element, 0);
115         *breath_type_description = get_element_name(player_ptr->element, 0);
116         break;
117     default:
118         break;
119     }
120 }
121
122 bool draconian_breath(player_type *player_ptr)
123 {
124     int breath_type = (one_in_(3) ? GF_COLD : GF_FIRE);
125     concptr breath_type_description = ((breath_type == GF_COLD) ? _("冷気", "cold") : _("炎", "fire"));
126     DIRECTION dir;
127     if (!get_aim_dir(player_ptr, &dir))
128         return false;
129
130     decide_breath_kind(player_ptr, &breath_type, &breath_type_description);
131     stop_mouth(player_ptr);
132     msg_format(_("あなたは%sのブレスを吐いた。", "You breathe %s."), breath_type_description);
133
134     fire_breath(player_ptr, breath_type, dir, player_ptr->lev * 2, (player_ptr->lev / 15) + 1);
135     return true;
136 }