X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fcmd1.c;h=977bfa258d1581eee02c85ac63d199d39d250460;hb=1e842d47aef480bb02e2da43d1cd7d30322afd65;hp=49362cddade30274bb849b03f6c74d68bede77d4;hpb=071c0e79869b0953c754ab8a19e8e5b5a0d72bc4;p=hengband%2Fhengband.git diff --git a/src/cmd1.c b/src/cmd1.c index 49362cdda..977bfa258 100644 --- a/src/cmd1.c +++ b/src/cmd1.c @@ -251,11 +251,11 @@ static int mult_slaying(int mult, const u32b* flgs, const monster_type* m_ptr) const struct slay_table_t* p = &slay_table[i]; if ((have_flag(flgs, p->slay_flag)) && - (*(u32b*)(((char*)r_ptr) + p->flag_offset) & p->affect_race_flag)) + (atoffset(u32b, r_ptr, p->flag_offset) & p->affect_race_flag)) { if (is_original_ap_and_seen(m_ptr)) { - *(u32b*)(((char*)r_ptr) + p->r_flag_offset) |= p->affect_race_flag; + atoffset(u32b, r_ptr, p->r_flag_offset) |= p->affect_race_flag; } mult = MAX(mult, p->slay_mult); @@ -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; } @@ -1060,9 +1014,9 @@ static void hit_trap(bool break_trap) dam = damroll(4, 6); #ifdef JP - (void)fire_dam(dam, "±ê¤Î¥È¥é¥Ã¥×", -1); + (void)fire_dam(dam, "±ê¤Î¥È¥é¥Ã¥×", -1, FALSE); #else - (void)fire_dam(dam, "a fire trap", -1); + (void)fire_dam(dam, "a fire trap", -1, FALSE); #endif break; @@ -1078,9 +1032,9 @@ static void hit_trap(bool break_trap) dam = damroll(4, 6); #ifdef JP - (void)acid_dam(dam, "»À¤Î¥È¥é¥Ã¥×", -1); + (void)acid_dam(dam, "»À¤Î¥È¥é¥Ã¥×", -1, FALSE); #else - (void)acid_dam(dam, "an acid trap", -1); + (void)acid_dam(dam, "an acid trap", -1, FALSE); #endif 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; } @@ -1420,92 +1256,42 @@ msg_print(" } -static void touch_zap_player(monster_type *m_ptr) +static void touch_zap_player_aux(monster_type *m_ptr, bool immune, int flags_offset, int r_flags_offset, u32b aura_flag, + int (*dam_func)(int dam, cptr kb_str, int monspell, bool aura), cptr message) { - int aura_damage = 0; monster_race *r_ptr = &r_info[m_ptr->r_idx]; - if (r_ptr->flags2 & RF2_AURA_FIRE) + if ((atoffset(u32b, r_ptr, flags_offset) & aura_flag) && !immune) { - if (!p_ptr->immune_fire) - { - char aura_dam[80]; + char mon_name[80]; + int aura_damage = damroll(1 + (r_ptr->level / 26), 1 + (r_ptr->level / 17)); - aura_damage = damroll(1 + (r_ptr->level / 26), 1 + (r_ptr->level / 17)); + /* Hack -- Get the "died from" name */ + monster_desc(mon_name, m_ptr, MD_IGNORE_HALLU | MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE); - /* Hack -- Get the "died from" name */ - monster_desc(aura_dam, m_ptr, MD_IGNORE_HALLU | MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE); + msg_print(message); -#ifdef JP - msg_print("ÆÍÁ³¤È¤Æ¤âÇ®¤¯¤Ê¤Ã¤¿¡ª"); -#else - msg_print("You are suddenly very hot!"); -#endif - - if (prace_is_(RACE_ENT)) aura_damage += aura_damage / 3; - if (IS_OPPOSE_FIRE()) aura_damage = (aura_damage + 2) / 3; - if (p_ptr->resist_fire) aura_damage = (aura_damage + 2) / 3; - - take_hit(DAMAGE_NOESCAPE, aura_damage, aura_dam, -1); - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= RF2_AURA_FIRE; - handle_stuff(); - } - } + dam_func(aura_damage, mon_name, -1, TRUE); - if (r_ptr->flags3 & RF3_AURA_COLD) - { - if (!p_ptr->immune_cold) + if (is_original_ap_and_seen(m_ptr)) { - char aura_dam[80]; - - aura_damage = damroll(1 + (r_ptr->level / 26), 1 + (r_ptr->level / 17)); - - /* Hack -- Get the "died from" name */ - monster_desc(aura_dam, m_ptr, MD_IGNORE_HALLU | MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE); - -#ifdef JP - msg_print("ÆÍÁ³¤È¤Æ¤â´¨¤¯¤Ê¤Ã¤¿¡ª"); -#else - msg_print("You are suddenly very cold!"); -#endif - - if (IS_OPPOSE_COLD()) aura_damage = (aura_damage + 2) / 3; - if (p_ptr->resist_cold) aura_damage = (aura_damage + 2) / 3; - - take_hit(DAMAGE_NOESCAPE, aura_damage, aura_dam, -1); - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_AURA_COLD; - handle_stuff(); + atoffset(u32b, r_ptr, r_flags_offset) |= aura_flag; } - } - - if (r_ptr->flags2 & RF2_AURA_ELEC) - { - if (!p_ptr->immune_elec) - { - char aura_dam[80]; - - aura_damage = damroll(1 + (r_ptr->level / 26), 1 + (r_ptr->level / 17)); - - /* Hack -- Get the "died from" name */ - monster_desc(aura_dam, m_ptr, MD_IGNORE_HALLU | MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE); - - if (prace_is_(RACE_ANDROID)) aura_damage += aura_damage / 3; - if (IS_OPPOSE_ELEC()) aura_damage = (aura_damage + 2) / 3; - if (p_ptr->resist_elec) aura_damage = (aura_damage + 2) / 3; - -#ifdef JP - msg_print("ÅÅ·â¤ò¤¯¤é¤Ã¤¿¡ª"); -#else - msg_print("You get zapped!"); -#endif - take_hit(DAMAGE_NOESCAPE, aura_damage, aura_dam, -1); - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= RF2_AURA_ELEC; - handle_stuff(); - } + handle_stuff(); } } +static void touch_zap_player(monster_type *m_ptr) +{ + touch_zap_player_aux(m_ptr, p_ptr->immune_fire, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_FIRE, + fire_dam, _("ÆÍÁ³¤È¤Æ¤âÇ®¤¯¤Ê¤Ã¤¿¡ª", "You are suddenly very hot!")); + touch_zap_player_aux(m_ptr, p_ptr->immune_cold, offsetof(monster_race, flags3), offsetof(monster_race, r_flags3), RF3_AURA_COLD, + cold_dam, _("ÆÍÁ³¤È¤Æ¤â´¨¤¯¤Ê¤Ã¤¿¡ª", "You are suddenly very cold!")); + touch_zap_player_aux(m_ptr, p_ptr->immune_elec, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_ELEC, + elec_dam, _("ÅÅ·â¤ò¤¯¤é¤Ã¤¿¡ª", "You get zapped!")); +} + static void natural_attack(s16b m_idx, int attack, bool *fear, bool *mdeath) { @@ -4817,6 +4603,7 @@ void travel_step(void) #else msg_print("No route is found!"); #endif + travel.y = travel.x = 0; } disturb(0, 1); return; @@ -4827,7 +4614,10 @@ void travel_step(void) move_player(travel.dir, always_pickup, FALSE); if ((py == travel.y) && (px == travel.x)) + { travel.run = 0; + travel.y = travel.x = 0; + } else if (travel.run > 0) travel.run--;