• R/O
  • HTTP
  • SSH
  • HTTPS

hengband: Commit

変愚蛮怒のメインリポジトリです


Commit MetaInfo

Révisionc2705e92113225230e7a858e767f3eafd57d512f (tree)
l'heure2020-05-23 20:35:40
AuteurHourier <hourier@user...>
CommiterHourier

Message de Log

[Refactor] #40416 Separated attack-chaos-effect.c/h from player-attack.c

Change Summary

Modification

--- a/Hengband/Hengband/Hengband.vcxproj
+++ b/Hengband/Hengband/Hengband.vcxproj
@@ -168,6 +168,7 @@
168168 <ClCompile Include="..\..\src\birth\inventory-initializer.c" />
169169 <ClCompile Include="..\..\src\birth\quick-start.c" />
170170 <ClCompile Include="..\..\src\cmd\cmd-menu-content-table.c" />
171+ <ClCompile Include="..\..\src\combat\attack-chaos-effect.c" />
171172 <ClCompile Include="..\..\src\combat\attack-criticality.c" />
172173 <ClCompile Include="..\..\src\combat\attack-power-table.c" />
173174 <ClCompile Include="..\..\src\combat\hallucination-attacks-table.c" />
@@ -428,6 +429,7 @@
428429 <ClInclude Include="..\..\src\birth\inventory-initializer.h" />
429430 <ClInclude Include="..\..\src\birth\quick-start.h" />
430431 <ClInclude Include="..\..\src\cmd\cmd-menu-content-table.h" />
432+ <ClInclude Include="..\..\src\combat\attack-chaos-effect.h" />
431433 <ClInclude Include="..\..\src\combat\attack-criticality.h" />
432434 <ClInclude Include="..\..\src\combat\attack-power-table.h" />
433435 <ClInclude Include="..\..\src\combat\blood-sucking-processor.h" />
--- a/Hengband/Hengband/Hengband.vcxproj.filters
+++ b/Hengband/Hengband/Hengband.vcxproj.filters
@@ -1022,6 +1022,9 @@
10221022 <ClCompile Include="..\..\src\combat\vorpal-weapon.c">
10231023 <Filter>combat</Filter>
10241024 </ClCompile>
1025+ <ClCompile Include="..\..\src\combat\attack-chaos-effect.c">
1026+ <Filter>combat</Filter>
1027+ </ClCompile>
10251028 </ItemGroup>
10261029 <ItemGroup>
10271030 <ClInclude Include="..\..\src\cmd\cmd-activate.h">
@@ -2116,6 +2119,9 @@
21162119 <ClInclude Include="..\..\src\combat\vorpal-weapon.h">
21172120 <Filter>combat</Filter>
21182121 </ClInclude>
2122+ <ClInclude Include="..\..\src\combat\attack-chaos-effect.h">
2123+ <Filter>combat</Filter>
2124+ </ClInclude>
21192125 </ItemGroup>
21202126 <ItemGroup>
21212127 <None Include="..\..\src\wall.bmp" />
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -354,6 +354,7 @@ hengband_SOURCES = \
354354 combat/player-attack.c combat/player-attack.h \
355355 combat/blood-sucking-processor.c combat/blood-sucking-processor.h \
356356 combat/vorpal-weapon.c combat/vorpal-weapon.h \
357+ combat/attack-chaos-effect.c combat/attack-chaos-effect.h \
357358 combat/shoot.c combat/shoot.h \
358359 combat/snipe.c combat/snipe.h \
359360 \
--- /dev/null
+++ b/src/combat/attack-chaos-effect.c
@@ -0,0 +1,164 @@
1+/*!
2+ * @brief カオス武器で攻撃した際の追加効果処理
3+ * @date 2020/05/23
4+ * @author Hourier
5+ * @details 不可分な処理であるゴールデンハンマーによるアイテム奪取処理も入っている
6+ */
7+
8+#include "combat/attack-chaos-effect.h"
9+#include "monster/monster-status.h"
10+#include "object/artifact.h"
11+#include "object/object-flavor.h"
12+#include "realm/realm-hex.h"
13+#include "spell/spells3.h"
14+
15+/*!
16+ * @brief カオス武器か混乱の手でモンスターを混乱させる処理
17+ * @param attacker_ptr プレーヤーへの参照ポインタ
18+ * @param pa_ptr 直接攻撃構造体への参照ポインタ
19+ * @return 死んだらTRUE、生きていたらFALSE
20+ * @return なし
21+ */
22+static void attack_confuse(player_type *attacker_ptr, player_attack_type *pa_ptr)
23+{
24+ if (attacker_ptr->special_attack & ATTACK_CONFUSE) {
25+ attacker_ptr->special_attack &= ~(ATTACK_CONFUSE);
26+ msg_print(_("手の輝きがなくなった。", "Your hands stop glowing."));
27+ attacker_ptr->redraw |= (PR_STATUS);
28+ }
29+
30+ monster_race *r_ptr = &r_info[pa_ptr->m_ptr->r_idx];
31+ if (r_ptr->flags3 & RF3_NO_CONF) {
32+ if (is_original_ap_and_seen(attacker_ptr, pa_ptr->m_ptr))
33+ r_ptr->r_flags3 |= RF3_NO_CONF;
34+ msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), pa_ptr->m_name);
35+
36+ } else if (randint0(100) < r_ptr->level) {
37+ msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), pa_ptr->m_name);
38+ } else {
39+ msg_format(_("%^sは混乱したようだ。", "%^s appears confused."), pa_ptr->m_name);
40+ (void)set_monster_confused(attacker_ptr, pa_ptr->g_ptr->m_idx, MON_CONFUSED(pa_ptr->m_ptr) + 10 + randint0(attacker_ptr->lev) / 5);
41+ }
42+}
43+
44+/*!
45+ * @breif カオス武器でのテレポート・アウェイを行うか判定する (抵抗されたら無効)
46+ * @param attacker_ptr プレーヤーへの参照ポインタ
47+ * @param pa_ptr 直接攻撃構造体への参照ポインタ
48+ * @return 抵抗されたらTRUE、アウェイされるならFALSE
49+ */
50+static bool judge_tereprt_resistance(player_type *attacker_ptr, player_attack_type *pa_ptr)
51+{
52+ monster_race *r_ptr = &r_info[pa_ptr->m_ptr->r_idx];
53+ if ((r_ptr->flagsr & RFR_RES_TELE) == 0)
54+ return FALSE;
55+
56+ if (r_ptr->flags1 & RF1_UNIQUE) {
57+ if (is_original_ap_and_seen(attacker_ptr, pa_ptr->m_ptr))
58+ r_ptr->r_flagsr |= RFR_RES_TELE;
59+
60+ msg_format(_("%^sには効果がなかった。", "%^s is unaffected!"), pa_ptr->m_name);
61+ return TRUE;
62+ }
63+
64+ if (r_ptr->level > randint1(100)) {
65+ if (is_original_ap_and_seen(attacker_ptr, pa_ptr->m_ptr))
66+ r_ptr->r_flagsr |= RFR_RES_TELE;
67+
68+ msg_format(_("%^sは抵抗力を持っている!", "%^s resists!"), pa_ptr->m_name);
69+ return TRUE;
70+ }
71+
72+ return FALSE;
73+}
74+
75+/*!
76+ * @brief カオス武器でのテレポート・アウェイを実行する
77+ * @param attacker_ptr プレーヤーへの参照ポインタ
78+ * @param pa_ptr 直接攻撃構造体への参照ポインタ
79+ * @param num 現在の攻撃回数 (テレポートしてしまったら追加攻撃できないのでその補正)
80+ * @return なし
81+ */
82+static void attack_teleport_away(player_type *attacker_ptr, player_attack_type *pa_ptr, int *num)
83+{
84+ if (judge_tereprt_resistance(attacker_ptr, pa_ptr))
85+ return;
86+
87+ msg_format(_("%^sは消えた!", "%^s disappears!"), pa_ptr->m_name);
88+ teleport_away(attacker_ptr, pa_ptr->g_ptr->m_idx, 50, TELEPORT_PASSIVE);
89+ *num = pa_ptr->num_blow + 1;
90+ *(pa_ptr->mdeath) = TRUE;
91+}
92+
93+/*!
94+ * @brief カオス武器でのテレポート・アウェイを実行する
95+ * @param attacker_ptr プレーヤーへの参照ポインタ
96+ * @param pa_ptr 直接攻撃構造体への参照ポインタ
97+ * @param y モンスターのY座標
98+ * @param x モンスターのX座標
99+ * @return なし
100+ */
101+static void attack_polymorph(player_type *attacker_ptr, player_attack_type *pa_ptr, POSITION y, POSITION x)
102+{
103+ monster_race *r_ptr = &r_info[pa_ptr->m_ptr->r_idx];
104+ if (((r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) != 0) || ((r_ptr->flagsr & RFR_EFF_RES_CHAO_MASK) != 0))
105+ return;
106+
107+ if (polymorph_monster(attacker_ptr, y, x)) {
108+ msg_format(_("%^sは変化した!", "%^s changes!"), pa_ptr->m_name);
109+ *(pa_ptr->fear) = FALSE;
110+ pa_ptr->weak = FALSE;
111+ } else
112+ msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), pa_ptr->m_name);
113+
114+ pa_ptr->m_ptr = &attacker_ptr->current_floor_ptr->m_list[pa_ptr->g_ptr->m_idx];
115+ monster_desc(attacker_ptr, pa_ptr->m_name, pa_ptr->m_ptr, 0);
116+}
117+
118+/*!
119+ * @brief ゴールデンハンマーによるアイテム奪取処理
120+ * @param attacker_ptr プレーヤーへの参照ポインタ
121+ * @param pa_ptr 直接攻撃構造体への参照ポインタ
122+ * @return なし
123+ */
124+static void attack_golden_hammer(player_type *attacker_ptr, player_attack_type *pa_ptr)
125+{
126+ floor_type *floor_ptr = attacker_ptr->current_floor_ptr;
127+ monster_type *target_ptr = &floor_ptr->m_list[pa_ptr->g_ptr->m_idx];
128+ if (target_ptr->hold_o_idx == 0)
129+ return;
130+
131+ object_type *q_ptr = &floor_ptr->o_list[target_ptr->hold_o_idx];
132+ GAME_TEXT o_name[MAX_NLEN];
133+ object_desc(attacker_ptr, o_name, q_ptr, OD_NAME_ONLY);
134+ q_ptr->held_m_idx = 0;
135+ q_ptr->marked = OM_TOUCHED;
136+ target_ptr->hold_o_idx = q_ptr->next_o_idx;
137+ q_ptr->next_o_idx = 0;
138+ msg_format(_("%sを奪った。", "You snatched %s."), o_name);
139+ inven_carry(attacker_ptr, q_ptr);
140+}
141+
142+/*!
143+ * @brief カオス武器その他でモンスターのステータスを変化させる
144+ * @param attacker_ptr プレーヤーへの参照ポインタ
145+ * @param pa_ptr 直接攻撃構造体への参照ポインタ
146+ * @param y モンスターのY座標
147+ * @param x モンスターのX座標
148+ * @param num 現在の攻撃回数
149+ * @return なし
150+ */
151+void change_monster_stat(player_type *attacker_ptr, player_attack_type *pa_ptr, const POSITION y, const POSITION x, int *num)
152+{
153+ monster_race *r_ptr = &r_info[pa_ptr->m_ptr->r_idx];
154+ object_type *o_ptr = &attacker_ptr->inventory_list[INVEN_RARM + pa_ptr->hand];
155+ if ((attacker_ptr->special_attack & ATTACK_CONFUSE) || (pa_ptr->chaos_effect == CE_CONFUSION) || (pa_ptr->mode == HISSATSU_CONF)
156+ || hex_spelling(attacker_ptr, HEX_CONFUSION))
157+ attack_confuse(attacker_ptr, pa_ptr);
158+ else if (pa_ptr->chaos_effect == CE_TELE_AWAY)
159+ attack_teleport_away(attacker_ptr, pa_ptr, num);
160+ else if ((pa_ptr->chaos_effect == CE_POLYMORPH) && (randint1(90) > r_ptr->level))
161+ attack_polymorph(attacker_ptr, pa_ptr, y, x);
162+ else if (o_ptr->name1 == ART_G_HAMMER)
163+ attack_golden_hammer(attacker_ptr, pa_ptr);
164+}
--- /dev/null
+++ b/src/combat/attack-chaos-effect.h
@@ -0,0 +1,6 @@
1+#pragma once
2+
3+#include "system/angband.h"
4+#include "combat/player-attack-util.h"
5+
6+void change_monster_stat(player_type *attacker_ptr, player_attack_type *pa_ptr, const POSITION y, const POSITION x, int *num);
--- a/src/combat/player-attack.c
+++ b/src/combat/player-attack.c
@@ -6,6 +6,7 @@
66
77 #include "combat/player-attack.h"
88 #include "combat/attack-accuracy.h"
9+#include "combat/attack-chaos-effect.h"
910 #include "combat/attack-criticality.h"
1011 #include "combat/blood-sucking-processor.h"
1112 #include "combat/martial-arts-table.h"
@@ -26,7 +27,6 @@
2627 #include "player/player-skill.h"
2728 #include "realm/realm-hex.h"
2829 #include "spell/spells-floor.h"
29-#include "spell/spells3.h"
3030 #include "world/world.h"
3131
3232 static player_attack_type *initialize_player_attack_type(
@@ -336,157 +336,6 @@ static bool check_fear_death(player_type *attacker_ptr, player_attack_type *pa_p
336336 }
337337
338338 /*!
339- * @brief カオス武器か混乱の手でモンスターを混乱させる処理
340- * @param attacker_ptr プレーヤーへの参照ポインタ
341- * @param pa_ptr 直接攻撃構造体への参照ポインタ
342- * @return 死んだらTRUE、生きていたらFALSE
343- * @return なし
344- */
345-static void attack_confuse(player_type *attacker_ptr, player_attack_type *pa_ptr)
346-{
347- if (attacker_ptr->special_attack & ATTACK_CONFUSE) {
348- attacker_ptr->special_attack &= ~(ATTACK_CONFUSE);
349- msg_print(_("手の輝きがなくなった。", "Your hands stop glowing."));
350- attacker_ptr->redraw |= (PR_STATUS);
351- }
352-
353- monster_race *r_ptr = &r_info[pa_ptr->m_ptr->r_idx];
354- if (r_ptr->flags3 & RF3_NO_CONF) {
355- if (is_original_ap_and_seen(attacker_ptr, pa_ptr->m_ptr))
356- r_ptr->r_flags3 |= RF3_NO_CONF;
357- msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), pa_ptr->m_name);
358-
359- } else if (randint0(100) < r_ptr->level) {
360- msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), pa_ptr->m_name);
361- } else {
362- msg_format(_("%^sは混乱したようだ。", "%^s appears confused."), pa_ptr->m_name);
363- (void)set_monster_confused(attacker_ptr, pa_ptr->g_ptr->m_idx, MON_CONFUSED(pa_ptr->m_ptr) + 10 + randint0(attacker_ptr->lev) / 5);
364- }
365-}
366-
367-/*!
368- * @breif カオス武器でのテレポート・アウェイを行うか判定する (抵抗されたら無効)
369- * @param attacker_ptr プレーヤーへの参照ポインタ
370- * @param pa_ptr 直接攻撃構造体への参照ポインタ
371- * @return 抵抗されたらTRUE、アウェイされるならFALSE
372- */
373-static bool judge_tereprt_resistance(player_type *attacker_ptr, player_attack_type *pa_ptr)
374-{
375- monster_race *r_ptr = &r_info[pa_ptr->m_ptr->r_idx];
376- if ((r_ptr->flagsr & RFR_RES_TELE) == 0)
377- return FALSE;
378-
379- if (r_ptr->flags1 & RF1_UNIQUE) {
380- if (is_original_ap_and_seen(attacker_ptr, pa_ptr->m_ptr))
381- r_ptr->r_flagsr |= RFR_RES_TELE;
382-
383- msg_format(_("%^sには効果がなかった。", "%^s is unaffected!"), pa_ptr->m_name);
384- return TRUE;
385- }
386-
387- if (r_ptr->level > randint1(100)) {
388- if (is_original_ap_and_seen(attacker_ptr, pa_ptr->m_ptr))
389- r_ptr->r_flagsr |= RFR_RES_TELE;
390-
391- msg_format(_("%^sは抵抗力を持っている!", "%^s resists!"), pa_ptr->m_name);
392- return TRUE;
393- }
394-
395- return FALSE;
396-}
397-
398-/*!
399- * @brief カオス武器でのテレポート・アウェイを実行する
400- * @param attacker_ptr プレーヤーへの参照ポインタ
401- * @param pa_ptr 直接攻撃構造体への参照ポインタ
402- * @param num 現在の攻撃回数 (テレポートしてしまったら追加攻撃できないのでその補正)
403- * @return なし
404- */
405-static void attack_teleport_away(player_type *attacker_ptr, player_attack_type *pa_ptr, int *num)
406-{
407- if (judge_tereprt_resistance(attacker_ptr, pa_ptr))
408- return;
409-
410- msg_format(_("%^sは消えた!", "%^s disappears!"), pa_ptr->m_name);
411- teleport_away(attacker_ptr, pa_ptr->g_ptr->m_idx, 50, TELEPORT_PASSIVE);
412- *num = pa_ptr->num_blow + 1;
413- *(pa_ptr->mdeath) = TRUE;
414-}
415-
416-/*!
417- * @brief カオス武器でのテレポート・アウェイを実行する
418- * @param attacker_ptr プレーヤーへの参照ポインタ
419- * @param pa_ptr 直接攻撃構造体への参照ポインタ
420- * @param y モンスターのY座標
421- * @param x モンスターのX座標
422- * @return なし
423- */
424-static void attack_polymorph(player_type *attacker_ptr, player_attack_type *pa_ptr, POSITION y, POSITION x)
425-{
426- monster_race *r_ptr = &r_info[pa_ptr->m_ptr->r_idx];
427- if (((r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) != 0) || ((r_ptr->flagsr & RFR_EFF_RES_CHAO_MASK) != 0))
428- return;
429-
430- if (polymorph_monster(attacker_ptr, y, x)) {
431- msg_format(_("%^sは変化した!", "%^s changes!"), pa_ptr->m_name);
432- *(pa_ptr->fear) = FALSE;
433- pa_ptr->weak = FALSE;
434- } else
435- msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), pa_ptr->m_name);
436-
437- pa_ptr->m_ptr = &attacker_ptr->current_floor_ptr->m_list[pa_ptr->g_ptr->m_idx];
438- monster_desc(attacker_ptr, pa_ptr->m_name, pa_ptr->m_ptr, 0);
439-}
440-
441-/*!
442- * @brief ゴールデンハンマーによるアイテム奪取処理
443- * @param attacker_ptr プレーヤーへの参照ポインタ
444- * @param pa_ptr 直接攻撃構造体への参照ポインタ
445- * @return なし
446- */
447-static void attack_golden_hammer(player_type *attacker_ptr, player_attack_type *pa_ptr)
448-{
449- floor_type *floor_ptr = attacker_ptr->current_floor_ptr;
450- monster_type *target_ptr = &floor_ptr->m_list[pa_ptr->g_ptr->m_idx];
451- if (target_ptr->hold_o_idx == 0)
452- return;
453-
454- object_type *q_ptr = &floor_ptr->o_list[target_ptr->hold_o_idx];
455- GAME_TEXT o_name[MAX_NLEN];
456- object_desc(attacker_ptr, o_name, q_ptr, OD_NAME_ONLY);
457- q_ptr->held_m_idx = 0;
458- q_ptr->marked = OM_TOUCHED;
459- target_ptr->hold_o_idx = q_ptr->next_o_idx;
460- q_ptr->next_o_idx = 0;
461- msg_format(_("%sを奪った。", "You snatched %s."), o_name);
462- inven_carry(attacker_ptr, q_ptr);
463-}
464-
465-/*!
466- * @brief カオス武器その他でモンスターのステータスを変化させる
467- * @param attacker_ptr プレーヤーへの参照ポインタ
468- * @param pa_ptr 直接攻撃構造体への参照ポインタ
469- * @param y モンスターのY座標
470- * @param x モンスターのX座標
471- * @param num 現在の攻撃回数
472- * @return なし
473- */
474-static void change_monster_stat(player_type *attacker_ptr, player_attack_type *pa_ptr, const POSITION y, const POSITION x, int *num)
475-{
476- monster_race *r_ptr = &r_info[pa_ptr->m_ptr->r_idx];
477- object_type *o_ptr = &attacker_ptr->inventory_list[INVEN_RARM + pa_ptr->hand];
478- if ((attacker_ptr->special_attack & ATTACK_CONFUSE) || (pa_ptr->chaos_effect == CE_CONFUSION) || (pa_ptr->mode == HISSATSU_CONF)
479- || hex_spelling(attacker_ptr, HEX_CONFUSION))
480- attack_confuse(attacker_ptr, pa_ptr);
481- else if (pa_ptr->chaos_effect == CE_TELE_AWAY)
482- attack_teleport_away(attacker_ptr, pa_ptr, num);
483- else if ((pa_ptr->chaos_effect == CE_POLYMORPH) && (randint1(90) > r_ptr->level))
484- attack_polymorph(attacker_ptr, pa_ptr, y, x);
485- else if (o_ptr->name1 == ART_G_HAMMER)
486- attack_golden_hammer(attacker_ptr, pa_ptr);
487-}
488-
489-/*!
490339 * @brief 直接攻撃が当たった時の処理
491340 * @param attacker_ptr プレーヤーへの参照ポインタ
492341 * @param pa_ptr 直接攻撃構造体への参照ポインタ
Afficher sur ancien navigateur de dépôt.