X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fmelee1.c;h=37449afb3c1f66d0867e0d15702e10c518a36257;hb=f9e0daf8b79c82c8de8e82bdbe6cd9f9c6cb7dfd;hp=2bd66f79b89dc0ba50ff4acae363ad9197594c7f;hpb=e7de0c8bfc4baa0841f937da4f81ed6ccb7b6dc4;p=hengband%2Fhengband.git diff --git a/src/melee1.c b/src/melee1.c index 2bd66f79b..37449afb3 100644 --- a/src/melee1.c +++ b/src/melee1.c @@ -200,8 +200,7 @@ bool make_attack_normal(int m_idx) if ((p_ptr->special_defense & NINJA_KAWARIMI) && (randint0(55) < (p_ptr->lev*3/5+20))) { - kawarimi(TRUE); - return TRUE; + if (kawarimi(TRUE)) return TRUE; } /* Assume no blink */ @@ -254,7 +253,7 @@ bool make_attack_normal(int m_idx) if (!effect || check_hit(power, rlev, MON_STUNNED(m_ptr))) { /* Always disturbing */ - disturb(1, 0); + disturb(1, 1); /* Hack -- Apply "protection from evil" */ @@ -710,8 +709,9 @@ bool make_attack_normal(int m_idx) case RBE_SUPERHURT: { - if ((randint1(rlev*2+300) > (ac+200)) || one_in_(13)) { - int tmp_damage = damage-(damage*((ac < 150) ? ac : 150)/250); + if (((randint1(rlev*2+300) > (ac+200)) || one_in_(13)) && !CHECK_MULTISHADOW()) + { + int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250); #ifdef JP msg_print("Ä˺¨¤Î°ì·â¡ª"); #else @@ -744,7 +744,7 @@ bool make_attack_normal(int m_idx) if (explode) break; /* Take "poison" effect */ - if (!(p_ptr->resist_pois || IS_OPPOSE_POIS())) + if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()) && !CHECK_MULTISHADOW()) { if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5)) { @@ -766,7 +766,7 @@ bool make_attack_normal(int m_idx) if (explode) break; /* Allow complete resist */ - if (!p_ptr->resist_disen) + if (!p_ptr->resist_disen && !CHECK_MULTISHADOW()) { /* Apply disenchantment */ if (apply_disenchant(0)) @@ -791,7 +791,7 @@ bool make_attack_normal(int m_idx) /* Take some damage */ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); - if (p_ptr->is_dead) break; + if (p_ptr->is_dead || CHECK_MULTISHADOW()) break; /* Find an item */ for (k = 0; k < 10; k++) @@ -861,7 +861,7 @@ bool make_attack_normal(int m_idx) /* Confused monsters cannot steal successfully. -LM-*/ if (MON_CONFUSED(m_ptr)) break; - if (p_ptr->is_dead) break; + if (p_ptr->is_dead || CHECK_MULTISHADOW()) break; /* Obvious */ obvious = TRUE; @@ -945,7 +945,7 @@ bool make_attack_normal(int m_idx) /* Confused monsters cannot steal successfully. -LM-*/ if (MON_CONFUSED(m_ptr)) break; - if (p_ptr->is_dead) break; + if (p_ptr->is_dead || CHECK_MULTISHADOW()) break; /* Saving throw (unless paralyzed) based on dex and level */ if (!p_ptr->paralyzed && @@ -1032,7 +1032,7 @@ bool make_attack_normal(int m_idx) } /* Forget mark */ - j_ptr->marked = 0; + j_ptr->marked = OM_TOUCHED; /* Memorize monster */ j_ptr->held_m_idx = m_idx; @@ -1066,7 +1066,7 @@ bool make_attack_normal(int m_idx) /* Take some damage */ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); - if (p_ptr->is_dead) break; + if (p_ptr->is_dead || CHECK_MULTISHADOW()) break; /* Steal some food */ for (k = 0; k < 10; k++) @@ -1120,13 +1120,13 @@ bool make_attack_normal(int m_idx) /* Take some damage */ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); - if (p_ptr->is_dead) break; + if (p_ptr->is_dead || CHECK_MULTISHADOW()) break; /* Drain fuel */ if ((o_ptr->xtra4 > 0) && (!object_is_fixed_artifact(o_ptr))) { /* Reduce fuel */ - o_ptr->xtra4 -= (250 + randint1(250)); + o_ptr->xtra4 -= (s16b)(250 + randint1(250)); if (o_ptr->xtra4 < 1) o_ptr->xtra4 = 1; /* Notice */ @@ -1163,7 +1163,7 @@ bool make_attack_normal(int m_idx) /* Special damage */ - get_damage += acid_dam(damage, ddesc, -1); + get_damage += acid_dam(damage, ddesc, -1, FALSE); /* Hack -- Update AC */ update_stuff(); @@ -1189,7 +1189,7 @@ bool make_attack_normal(int m_idx) /* Special damage */ - get_damage += elec_dam(damage, ddesc, -1); + get_damage += elec_dam(damage, ddesc, -1, FALSE); /* Learn about the player */ update_smart_learn(m_idx, DRS_ELEC); @@ -1212,7 +1212,7 @@ bool make_attack_normal(int m_idx) /* Special damage */ - get_damage += fire_dam(damage, ddesc, -1); + get_damage += fire_dam(damage, ddesc, -1, FALSE); /* Learn about the player */ update_smart_learn(m_idx, DRS_FIRE); @@ -1235,7 +1235,7 @@ bool make_attack_normal(int m_idx) /* Special damage */ - get_damage += cold_dam(damage, ddesc, -1); + get_damage += cold_dam(damage, ddesc, -1, FALSE); /* Learn about the player */ update_smart_learn(m_idx, DRS_COLD); @@ -1251,12 +1251,12 @@ bool make_attack_normal(int m_idx) if (p_ptr->is_dead) break; /* Increase "blind" */ - if (!p_ptr->resist_blind) + if (!p_ptr->resist_blind && !CHECK_MULTISHADOW()) { if (set_blind(p_ptr->blind + 10 + randint1(rlev))) { #ifdef JP - if(m_ptr->r_idx == MON_DIO) msg_print("¤É¤¦¤À¥Ã¡ª¤³¤Î·ì¤ÎÌÜÄÙ¤·¤Ï¥Ã¡ª"); + if (m_ptr->r_idx == MON_DIO) msg_print("¤É¤¦¤À¥Ã¡ª¤³¤Î·ì¤ÎÌÜÄÙ¤·¤Ï¥Ã¡ª"); #else /* nanka */ #endif @@ -1279,7 +1279,7 @@ bool make_attack_normal(int m_idx) if (p_ptr->is_dead) break; /* Increase "confused" */ - if (!p_ptr->resist_conf) + if (!p_ptr->resist_conf && !CHECK_MULTISHADOW()) { if (set_confused(p_ptr->confused + 3 + randint1(rlev))) { @@ -1301,7 +1301,11 @@ bool make_attack_normal(int m_idx) if (p_ptr->is_dead) break; /* Increase "afraid" */ - if (p_ptr->resist_fear) + if (CHECK_MULTISHADOW()) + { + /* Do nothing */ + } + else if (p_ptr->resist_fear) { #ifdef JP msg_print("¤·¤«¤·¶²Éݤ˿¯¤µ¤ì¤Ê¤«¤Ã¤¿¡ª"); @@ -1343,7 +1347,11 @@ bool make_attack_normal(int m_idx) if (p_ptr->is_dead) break; /* Increase "paralyzed" */ - if (p_ptr->free_act) + if (CHECK_MULTISHADOW()) + { + /* Do nothing */ + } + else if (p_ptr->free_act) { #ifdef JP msg_print("¤·¤«¤·¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡ª"); @@ -1385,7 +1393,7 @@ bool make_attack_normal(int m_idx) /* Damage (physical) */ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); - if (p_ptr->is_dead) break; + if (p_ptr->is_dead || CHECK_MULTISHADOW()) break; /* Damage (stat) */ if (do_dec_stat(A_STR)) obvious = TRUE; @@ -1398,7 +1406,7 @@ bool make_attack_normal(int m_idx) /* Damage (physical) */ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); - if (p_ptr->is_dead) break; + if (p_ptr->is_dead || CHECK_MULTISHADOW()) break; /* Damage (stat) */ if (do_dec_stat(A_INT)) obvious = TRUE; @@ -1411,7 +1419,7 @@ bool make_attack_normal(int m_idx) /* Damage (physical) */ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); - if (p_ptr->is_dead) break; + if (p_ptr->is_dead || CHECK_MULTISHADOW()) break; /* Damage (stat) */ if (do_dec_stat(A_WIS)) obvious = TRUE; @@ -1424,7 +1432,7 @@ bool make_attack_normal(int m_idx) /* Damage (physical) */ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); - if (p_ptr->is_dead) break; + if (p_ptr->is_dead || CHECK_MULTISHADOW()) break; /* Damage (stat) */ if (do_dec_stat(A_DEX)) obvious = TRUE; @@ -1437,7 +1445,7 @@ bool make_attack_normal(int m_idx) /* Damage (physical) */ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); - if (p_ptr->is_dead) break; + if (p_ptr->is_dead || CHECK_MULTISHADOW()) break; /* Damage (stat) */ if (do_dec_stat(A_CON)) obvious = TRUE; @@ -1450,7 +1458,7 @@ bool make_attack_normal(int m_idx) /* Damage (physical) */ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); - if (p_ptr->is_dead) break; + if (p_ptr->is_dead || CHECK_MULTISHADOW()) break; /* Damage (stat) */ if (do_dec_stat(A_CHR)) obvious = TRUE; @@ -1463,7 +1471,7 @@ bool make_attack_normal(int m_idx) /* Damage (physical) */ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); - if (p_ptr->is_dead) break; + if (p_ptr->is_dead || CHECK_MULTISHADOW()) break; /* Damage (stats) */ if (do_dec_stat(A_STR)) obvious = TRUE; @@ -1506,7 +1514,7 @@ bool make_attack_normal(int m_idx) /* Take damage */ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); - if (p_ptr->is_dead) break; + if (p_ptr->is_dead || CHECK_MULTISHADOW()) break; (void)drain_exp(d, d / 10, 95); break; @@ -1522,7 +1530,7 @@ bool make_attack_normal(int m_idx) /* Take damage */ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); - if (p_ptr->is_dead) break; + if (p_ptr->is_dead || CHECK_MULTISHADOW()) break; (void)drain_exp(d, d / 10, 90); break; @@ -1538,7 +1546,7 @@ bool make_attack_normal(int m_idx) /* Take damage */ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); - if (p_ptr->is_dead) break; + if (p_ptr->is_dead || CHECK_MULTISHADOW()) break; (void)drain_exp(d, d / 10, 75); break; @@ -1554,7 +1562,7 @@ bool make_attack_normal(int m_idx) /* Take damage */ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); - if (p_ptr->is_dead) break; + if (p_ptr->is_dead || CHECK_MULTISHADOW()) break; (void)drain_exp(d, d / 10, 50); break; @@ -1565,7 +1573,7 @@ bool make_attack_normal(int m_idx) /* Take some damage */ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); - if (p_ptr->is_dead) break; + if (p_ptr->is_dead || CHECK_MULTISHADOW()) break; /* Take "poison" effect */ if (!(p_ptr->resist_pois || IS_OPPOSE_POIS())) @@ -1598,7 +1606,7 @@ bool make_attack_normal(int m_idx) case RBE_TIME: { if (explode) break; - if (!p_ptr->resist_time) + if (!p_ptr->resist_time && !CHECK_MULTISHADOW()) { switch (randint1(10)) { @@ -1686,7 +1694,7 @@ bool make_attack_normal(int m_idx) /* Take damage */ get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); - if (p_ptr->is_dead) break; + if (p_ptr->is_dead || CHECK_MULTISHADOW()) break; resist_drain = !drain_exp(d, d / 10, 50); @@ -1745,17 +1753,75 @@ msg_format("%s /* Obvious */ obvious = TRUE; - do_cut = 0; + if (CHECK_MULTISHADOW()) + { +#ifdef JP + msg_print("¹¶·â¤Ï¸¸±Æ¤ËÌ¿Ã椷¡¢¤¢¤Ê¤¿¤Ë¤ÏÆϤ«¤Ê¤«¤Ã¤¿¡£"); +#else + msg_print("The attack hits Shadow, you are unharmed!"); +#endif + } + else + { + do_cut = 0; + + /* Take damage */ + p_ptr->csp -= damage; + if (p_ptr->csp < 0) + { + p_ptr->csp = 0; + p_ptr->csp_frac = 0; + } + + p_ptr->redraw |= (PR_MANA); + } + /* Learn about the player */ + update_smart_learn(m_idx, DRS_MANA); + + break; + } + case RBE_INERTIA: + { /* Take damage */ - p_ptr->csp -= damage; - if (p_ptr->csp < 0) + get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); + + if (p_ptr->is_dead) break; + + /* Decrease speed */ + if (CHECK_MULTISHADOW()) { - p_ptr->csp = 0; - p_ptr->csp_frac = 0; + /* Do nothing */ } + else + { + if (set_slow((p_ptr->slow + 4 + randint0(rlev / 10)), FALSE)) + { + obvious = TRUE; + } + } + + break; + } + case RBE_STUN: + { + /* Take damage */ + get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1); - p_ptr->redraw |= (PR_MANA); + if (p_ptr->is_dead) break; + + /* Decrease speed */ + if (p_ptr->resist_sound || CHECK_MULTISHADOW()) + { + /* Do nothing */ + } + else + { + if (set_stun(p_ptr->stun + 10 + randint1(r_ptr->level / 4))) + { + obvious = TRUE; + } + } break; } @@ -2040,6 +2106,65 @@ msg_format("%s r_ptr->r_flagsr |= RFR_RES_ALL; } } + + if (hex_spelling(HEX_SHADOW_CLOAK) && alive && !p_ptr->is_dead) + { + int dam = 1; + object_type *o_ptr = &inventory[INVEN_RARM]; + + if (!(r_ptr->flagsr & RFR_RES_ALL || r_ptr->flagsr & RFR_RES_DARK)) + { + if (o_ptr->k_idx) + { + int basedam = ((o_ptr->dd + p_ptr->to_dd[0]) * (o_ptr->ds + p_ptr->to_ds[0] + 1)); + dam = basedam / 2 + o_ptr->to_d + p_ptr->to_d[0]; + } + + /* Cursed armor makes damages doubled */ + o_ptr = &inventory[INVEN_BODY]; + if ((o_ptr->k_idx) && object_is_cursed(o_ptr)) dam *= 2; + + /* Modify the damage */ + dam = mon_damage_mod(m_ptr, dam, FALSE); + +#ifdef JP + msg_format("±Æ¤Î¥ª¡¼¥é¤¬%^s¤ËÈ¿·â¤·¤¿¡ª", m_name); + if (mon_take_hit(m_idx, dam, &fear, "¤ÏÅݤ줿¡£")) +#else + msg_format("Enveloped shadows attack %^s.", m_name); + + if (mon_take_hit(m_idx, dam, &fear, " is destroyed.")) +#endif + { + blinked = FALSE; + alive = FALSE; + } + else /* monster does not dead */ + { + int j; + int flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL; + int typ[4][2] = { + { INVEN_HEAD, GF_OLD_CONF }, + { INVEN_LARM, GF_OLD_SLEEP }, + { INVEN_HANDS, GF_TURN_ALL }, + { INVEN_FEET, GF_OLD_SLOW } + }; + + /* Some cursed armours gives an extra effect */ + for (j = 0; j < 4; j++) + { + o_ptr = &inventory[typ[j][0]]; + if ((o_ptr->k_idx) && object_is_cursed(o_ptr) && object_is_armour(o_ptr)) + project(0, 0, m_ptr->fy, m_ptr->fx, (p_ptr->lev * 2), typ[j][1], flg, -1); + } + } + } + else + { + if (is_original_ap_and_seen(m_ptr)) + r_ptr->r_flagsr |= (RFR_RES_ALL | RFR_RES_DARK); + } + } } } @@ -2066,7 +2191,7 @@ msg_format("%s if (m_ptr->ml) { /* Disturbing */ - disturb(1, 0); + disturb(1, 1); /* Message */ #ifdef JP @@ -2114,14 +2239,18 @@ msg_format("%^s #endif } } + if (p_ptr->special_defense & NINJA_KAWARIMI) { - kawarimi(FALSE); - return TRUE; + if (kawarimi(FALSE)) return TRUE; } } - if (p_ptr->tim_eyeeye && get_damage > 0 && !p_ptr->is_dead) + /* Hex - revenge damage stored */ + revenge_store(get_damage); + + if ((p_ptr->tim_eyeeye || hex_spelling(HEX_EYE_FOR_EYE)) + && get_damage > 0 && !p_ptr->is_dead) { #ifdef JP msg_format("¹¶·â¤¬%s¼«¿È¤ò½ý¤Ä¤±¤¿¡ª", m_name); @@ -2134,10 +2263,9 @@ msg_format("%^s msg_format("The attack of %s has wounded %s!", m_name, m_name_self); #endif project(0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1); - set_tim_eyeeye(p_ptr->tim_eyeeye-5, TRUE); + if (p_ptr->tim_eyeeye) set_tim_eyeeye(p_ptr->tim_eyeeye-5, TRUE); } - if ((p_ptr->counter || (p_ptr->special_defense & KATA_MUSOU)) && alive && !p_ptr->is_dead && m_ptr->ml && (p_ptr->csp > 7)) { char m_name[80]; @@ -2159,13 +2287,23 @@ msg_format("%^s /* Blink away */ if (blinked && alive && !p_ptr->is_dead) { + if (teleport_barrier(m_idx)) + { #ifdef JP - msg_print("Å¥ËÀ¤Ï¾Ð¤Ã¤Æƨ¤²¤¿¡ª"); + msg_print("Å¥ËÀ¤Ï¾Ð¤Ã¤Æƨ¤²...¤è¤¦¤È¤·¤¿¤¬¥Ð¥ê¥¢¤ËËɤ¬¤ì¤¿¡£"); #else - msg_print("The thief flees laughing!"); + msg_print("The thief flees laughing...? But magic barrier obstructs it."); #endif - - teleport_away(m_idx, MAX_SIGHT * 2 + 5, 0L); + } + else + { +#ifdef JP + msg_print("Å¥ËÀ¤Ï¾Ð¤Ã¤Æƨ¤²¤¿¡ª"); +#else + msg_print("The thief flees laughing!"); +#endif + teleport_away(m_idx, MAX_SIGHT * 2 + 5, 0L); + } }