OSDN Git Service

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