From 967496e8a6aec2ffb499cbef435380919654be3d Mon Sep 17 00:00:00 2001 From: habu Date: Sat, 9 Mar 2013 03:02:52 +0000 Subject: [PATCH 1/1] Refactor hit_trap() function --- src/cmd1.c | 410 +++++++++++++++++++------------------------------------------ 1 file changed, 123 insertions(+), 287 deletions(-) diff --git a/src/cmd1.c b/src/cmd1.c index 473b395e5..12c558f99 100644 --- a/src/cmd1.c +++ b/src/cmd1.c @@ -775,6 +775,112 @@ static int check_hit(int power) +static void hit_trap_pit(int trap_feat_type) +{ + int dam; + cptr trap_name = ""; + cptr spike_name = ""; + + switch (trap_feat_type) + { + case TRAP_PIT: + trap_name = _("Íî¤È¤··ê", "a pit trap"); + break; + case TRAP_SPIKED_PIT: + trap_name = _("¥¹¥Ñ¥¤¥¯¤¬Éߤ«¤ì¤¿Íî¤È¤··ê", "a spiked pit"); + spike_name = _("¥¹¥Ñ¥¤¥¯", "spikes"); + break; + case TRAP_POISON_PIT: + trap_name = _("¥¹¥Ñ¥¤¥¯¤¬Éߤ«¤ì¤¿Íî¤È¤··ê", "a spiked pit"); + spike_name = _("ÆǤòÅɤé¤ì¤¿¥¹¥Ñ¥¤¥¯", "poisonous spikes"); + break; + default: + return; + } + + if (p_ptr->levitation) + { + msg_format(_("%s¤òÈô¤Ó±Û¤¨¤¿¡£", "You fly over %s."), trap_name); + return; + } + + msg_format(_("%s¤ËÍî¤Á¤Æ¤·¤Þ¤Ã¤¿¡ª", "You have fallen into %s!"), trap_name); + + /* Base damage */ + dam = damroll(2, 6); + + /* Extra spike damage */ + if ((trap_feat_type == TRAP_SPIKED_PIT || trap_feat_type == TRAP_POISON_PIT) && + one_in_(2)) + { + msg_format(_("%s¤¬»É¤µ¤Ã¤¿¡ª", "You are impaled on %s!"), spike_name); + + dam = dam * 2; + (void)set_cut(p_ptr->cut + randint1(dam)); + + if (trap_feat_type == TRAP_POISON_PIT) { + if (p_ptr->resist_pois || IS_OPPOSE_POIS()) + { + msg_print(_("¤·¤«¤·ÆǤαƶÁ¤Ï¤Ê¤«¤Ã¤¿¡ª", "The poison does not affect you!")); + } + else + { + dam = dam * 2; + (void)set_poisoned(p_ptr->poisoned + randint1(dam)); + } + } + } + + /* Take the damage */ + take_hit(DAMAGE_NOESCAPE, dam, trap_name, -1); +} + +static bool hit_trap_dart(void) +{ + bool hit = FALSE; + + if (check_hit(125)) + { + msg_print(_("¾®¤µ¤Ê¥À¡¼¥Ä¤¬Èô¤ó¤Ç¤­¤Æ»É¤µ¤Ã¤¿¡ª", "A small dart hits you!")); + + take_hit(DAMAGE_ATTACK, damroll(1, 4), _("¥À¡¼¥Ä¤Îæ«", "a dart trap"), -1); + + if (!CHECK_MULTISHADOW()) hit = TRUE; + } + else + { + msg_print(_("¾®¤µ¤Ê¥À¡¼¥Ä¤¬Èô¤ó¤Ç¤­¤¿¡ª¤¬¡¢±¿Îɤ¯Åö¤¿¤é¤Ê¤«¤Ã¤¿¡£", "A small dart barely misses you.")); + } + + return hit; +} + +static void hit_trap_lose_stat(int stat) +{ + if (hit_trap_dart()) + { + do_dec_stat(stat); + } +} + +static void hit_trap_slow(void) +{ + if (hit_trap_dart()) + { + set_slow(p_ptr->slow + randint0(20) + 20, FALSE); + } +} + +static void hit_trap_set_abnormal_status(cptr trap_message, bool resist, bool (*set_status)(int turn), int turn) +{ + msg_print(trap_message); + + if (!resist) + { + set_status(turn); + } +} + /* * Handle player hitting a real trap */ @@ -851,162 +957,10 @@ static void hit_trap(bool break_trap) } case TRAP_PIT: - { - if (p_ptr->levitation) - { -#ifdef JP - msg_print("Íî¤È¤··ê¤òÈô¤Ó±Û¤¨¤¿¡£"); -#else - msg_print("You fly over a pit trap."); -#endif - - } - else - { -#ifdef JP - msg_print("Íî¤È¤··ê¤ËÍî¤Á¤Æ¤·¤Þ¤Ã¤¿¡ª"); -#else - msg_print("You have fallen into a pit!"); -#endif - - dam = damroll(2, 6); -#ifdef JP - name = "Íî¤È¤··ê"; -#else - name = "a pit trap"; -#endif - - take_hit(DAMAGE_NOESCAPE, dam, name, -1); - } - break; - } - case TRAP_SPIKED_PIT: - { - if (p_ptr->levitation) - { -#ifdef JP - msg_print("¥È¥²¤Î¤¢¤ëÍî¤È¤··ê¤òÈô¤Ó±Û¤¨¤¿¡£"); -#else - msg_print("You fly over a spiked pit."); -#endif - - } - else - { -#ifdef JP - msg_print("¥¹¥Ñ¥¤¥¯¤¬Éߤ«¤ì¤¿Íî¤È¤··ê¤ËÍî¤Á¤Æ¤·¤Þ¤Ã¤¿¡ª"); -#else - msg_print("You fall into a spiked pit!"); -#endif - - - /* Base damage */ -#ifdef JP - name = "Íî¤È¤··ê"; -#else - name = "a pit trap"; -#endif - - dam = damroll(2, 6); - - /* Extra spike damage */ - if (randint0(100) < 50) - { -#ifdef JP - msg_print("¥¹¥Ñ¥¤¥¯¤¬»É¤µ¤Ã¤¿¡ª"); -#else - msg_print("You are impaled!"); -#endif - - -#ifdef JP - name = "¥È¥²¤Î¤¢¤ëÍî¤È¤··ê"; -#else - name = "a spiked pit"; -#endif - - dam = dam * 2; - (void)set_cut(p_ptr->cut + randint1(dam)); - } - - /* Take the damage */ - take_hit(DAMAGE_NOESCAPE, dam, name, -1); - } - break; - } - case TRAP_POISON_PIT: { - if (p_ptr->levitation) - { -#ifdef JP - msg_print("¥È¥²¤Î¤¢¤ëÍî¤È¤··ê¤òÈô¤Ó±Û¤¨¤¿¡£"); -#else - msg_print("You fly over a spiked pit."); -#endif - - } - else - { -#ifdef JP - msg_print("¥¹¥Ñ¥¤¥¯¤¬Éߤ«¤ì¤¿Íî¤È¤··ê¤ËÍî¤Á¤Æ¤·¤Þ¤Ã¤¿¡ª"); -#else - msg_print("You fall into a spiked pit!"); -#endif - - - /* Base damage */ - dam = damroll(2, 6); - -#ifdef JP - name = "Íî¤È¤··ê"; -#else - name = "a pit trap"; -#endif - - - /* Extra spike damage */ - if (randint0(100) < 50) - { -#ifdef JP - msg_print("ÆǤòÅɤé¤ì¤¿¥¹¥Ñ¥¤¥¯¤¬»É¤µ¤Ã¤¿¡ª"); -#else - msg_print("You are impaled on poisonous spikes!"); -#endif - - -#ifdef JP - name = "¥È¥²¤Î¤¢¤ëÍî¤È¤··ê"; -#else - name = "a spiked pit"; -#endif - - - dam = dam * 2; - (void)set_cut(p_ptr->cut + randint1(dam)); - - if (p_ptr->resist_pois || IS_OPPOSE_POIS()) - { -#ifdef JP - msg_print("¤·¤«¤·ÆǤαƶÁ¤Ï¤Ê¤«¤Ã¤¿¡ª"); -#else - msg_print("The poison does not affect you!"); -#endif - - } - - else - { - dam = dam * 2; - (void)set_poisoned(p_ptr->poisoned + randint1(dam)); - } - } - - /* Take the damage */ - take_hit(DAMAGE_NOESCAPE, dam, name, -1); - } - + hit_trap_pit(trap_feat_type); break; } @@ -1088,170 +1042,52 @@ static void hit_trap(bool break_trap) case TRAP_SLOW: { - if (check_hit(125)) - { -#ifdef JP - msg_print("¾®¤µ¤Ê¥À¡¼¥Ä¤¬Èô¤ó¤Ç¤­¤Æ»É¤µ¤Ã¤¿¡ª"); -#else - msg_print("A small dart hits you!"); -#endif - - dam = damroll(1, 4); -#ifdef JP - take_hit(DAMAGE_ATTACK, dam, "¥À¡¼¥Ä¤Îæ«", -1); -#else - take_hit(DAMAGE_ATTACK, dam, "a dart trap", -1); -#endif - - if (!CHECK_MULTISHADOW()) (void)set_slow(p_ptr->slow + randint0(20) + 20, FALSE); - } - else - { -#ifdef JP - msg_print("¾®¤µ¤Ê¥À¡¼¥Ä¤¬Èô¤ó¤Ç¤­¤¿¡ª¤¬¡¢±¿Îɤ¯Åö¤¿¤é¤Ê¤«¤Ã¤¿¡£"); -#else - msg_print("A small dart barely misses you."); -#endif - - } + hit_trap_slow(); break; } case TRAP_LOSE_STR: { - if (check_hit(125)) - { -#ifdef JP - msg_print("¾®¤µ¤Ê¥À¡¼¥Ä¤¬Èô¤ó¤Ç¤­¤Æ»É¤µ¤Ã¤¿¡ª"); -#else - msg_print("A small dart hits you!"); -#endif - - dam = damroll(1, 4); -#ifdef JP - take_hit(DAMAGE_ATTACK, dam, "¥À¡¼¥Ä¤Îæ«", -1); -#else - take_hit(DAMAGE_ATTACK, dam, "a dart trap", -1); -#endif - - if (!CHECK_MULTISHADOW()) (void)do_dec_stat(A_STR); - } - else - { -#ifdef JP - msg_print("¾®¤µ¤Ê¥À¡¼¥Ä¤¬Èô¤ó¤Ç¤­¤¿¡ª¤¬¡¢±¿Îɤ¯Åö¤¿¤é¤Ê¤«¤Ã¤¿¡£"); -#else - msg_print("A small dart barely misses you."); -#endif - - } + hit_trap_lose_stat(A_STR); break; } case TRAP_LOSE_DEX: { - if (check_hit(125)) - { -#ifdef JP - msg_print("¾®¤µ¤Ê¥À¡¼¥Ä¤¬Èô¤ó¤Ç¤­¤Æ»É¤µ¤Ã¤¿¡ª"); -#else - msg_print("A small dart hits you!"); -#endif - - dam = damroll(1, 4); -#ifdef JP - take_hit(DAMAGE_ATTACK, dam, "¥À¡¼¥Ä¤Îæ«", -1); -#else - take_hit(DAMAGE_ATTACK, dam, "a dart trap", -1); -#endif - - if (!CHECK_MULTISHADOW()) (void)do_dec_stat(A_DEX); - } - else - { -#ifdef JP - msg_print("¾®¤µ¤Ê¥À¡¼¥Ä¤¬Èô¤ó¤Ç¤­¤¿¡ª¤¬¡¢±¿Îɤ¯Åö¤¿¤é¤Ê¤«¤Ã¤¿¡£"); -#else - msg_print("A small dart barely misses you."); -#endif - - } + hit_trap_lose_stat(A_DEX); break; } case TRAP_LOSE_CON: { - if (check_hit(125)) - { -#ifdef JP - msg_print("¾®¤µ¤Ê¥À¡¼¥Ä¤¬Èô¤ó¤Ç¤­¤Æ»É¤µ¤Ã¤¿¡ª"); -#else - msg_print("A small dart hits you!"); -#endif - - dam = damroll(1, 4); -#ifdef JP - take_hit(DAMAGE_ATTACK, dam, "¥À¡¼¥Ä¤Îæ«", -1); -#else - take_hit(DAMAGE_ATTACK, dam, "a dart trap", -1); -#endif - - if (!CHECK_MULTISHADOW()) (void)do_dec_stat(A_CON); - } - else - { -#ifdef JP - msg_print("¾®¤µ¤Ê¥À¡¼¥Ä¤¬Èô¤ó¤Ç¤­¤¿¡ª¤¬¡¢±¿Îɤ¯Åö¤¿¤é¤Ê¤«¤Ã¤¿¡£"); -#else - msg_print("A small dart barely misses you."); -#endif - - } + hit_trap_lose_stat(A_CON); break; } case TRAP_BLIND: { -#ifdef JP - msg_print("¹õ¤¤¥¬¥¹¤ËÊñ¤ß¹þ¤Þ¤ì¤¿¡ª"); -#else - msg_print("A black gas surrounds you!"); -#endif - - if (!p_ptr->resist_blind) - { - (void)set_blind(p_ptr->blind + randint0(50) + 25); - } + hit_trap_set_abnormal_status( + _("¹õ¤¤¥¬¥¹¤ËÊñ¤ß¹þ¤Þ¤ì¤¿¡ª", "A black gas surrounds you!"), + p_ptr->resist_blind, + set_blind, p_ptr->blind + randint0(50) + 25); break; } case TRAP_CONFUSE: { -#ifdef JP - msg_print("¤­¤é¤á¤¯¥¬¥¹¤ËÊñ¤ß¹þ¤Þ¤ì¤¿¡ª"); -#else - msg_print("A gas of scintillating colors surrounds you!"); -#endif - - if (!p_ptr->resist_conf) - { - (void)set_confused(p_ptr->confused + randint0(20) + 10); - } + hit_trap_set_abnormal_status( + _("¤­¤é¤á¤¯¥¬¥¹¤ËÊñ¤ß¹þ¤Þ¤ì¤¿¡ª", "A gas of scintillating colors surrounds you!"), + p_ptr->resist_conf, + set_confused, p_ptr->confused + randint0(20) + 10); break; } case TRAP_POISON: { -#ifdef JP - msg_print("»É·ãŪ¤ÊÎп§¤Î¥¬¥¹¤ËÊñ¤ß¹þ¤Þ¤ì¤¿¡ª"); -#else - msg_print("A pungent green gas surrounds you!"); -#endif - - if (!p_ptr->resist_pois && !IS_OPPOSE_POIS()) - { - (void)set_poisoned(p_ptr->poisoned + randint0(20) + 10); - } + hit_trap_set_abnormal_status( + _("»É·ãŪ¤ÊÎп§¤Î¥¬¥¹¤ËÊñ¤ß¹þ¤Þ¤ì¤¿¡ª", "A pungent green gas surrounds you!"), + p_ptr->resist_pois || IS_OPPOSE_POIS(), + set_poisoned, p_ptr->poisoned + randint0(20) + 10); break; } -- 2.11.0