X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fcmd1.c;h=754d37ebd8fe97058eb2e01fdb4c069dac1e9ab0;hb=370586c64fa3e8ee696b3204225e230a338f96fb;hp=09cfe58c0e175b24160db52cb7a9210f8fc96ff1;hpb=5a5b176a69a8ed7b2126f859711a64368b7d8e60;p=hengband%2Fhengband.git diff --git a/src/cmd1.c b/src/cmd1.c index 09cfe58c0..754d37ebd 100644 --- a/src/cmd1.c +++ b/src/cmd1.c @@ -216,7 +216,7 @@ s16b critical_norm(int weight, int plus, int dam, s16b meichuu, int mode) * Note that most brands and slays are x3, except Slay Animal (x2), * Slay Evil (x2), and Kill dragon (x5). */ -s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, int mode) +s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, int mode, bool thrown) { int mult = 10; @@ -460,14 +460,14 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, int mode) } /* Brand (Acid) */ - if ((have_flag(flgs, TR_BRAND_ACID)) || (p_ptr->special_attack & (ATTACK_ACID))) + if (have_flag(flgs, TR_BRAND_ACID) || ((p_ptr->special_attack & (ATTACK_ACID)) && !thrown)) { /* Notice immunity */ - if (r_ptr->flags3 & RF3_IM_ACID) + if (r_ptr->flagsr & RFR_EFF_IM_ACID_MASK) { if (m_ptr->ml) { - r_ptr->r_flags3 |= RF3_IM_ACID; + r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ACID_MASK); } } @@ -479,19 +479,19 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, int mode) } /* Brand (Elec) */ - if ((have_flag(flgs, TR_BRAND_ELEC)) || (p_ptr->special_attack & (ATTACK_ELEC)) || (mode == HISSATSU_ELEC)) + if (have_flag(flgs, TR_BRAND_ELEC) || ((p_ptr->special_attack & (ATTACK_ELEC)) && !thrown) || (mode == HISSATSU_ELEC)) { /* Notice immunity */ - if (r_ptr->flags3 & RF3_IM_ELEC) + if (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK) { if (m_ptr->ml) { - r_ptr->r_flags3 |= RF3_IM_ELEC; + r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK); } } /* Otherwise, take the damage */ - else if (((have_flag(flgs, TR_BRAND_ELEC)) || (p_ptr->special_attack & (ATTACK_ELEC))) && (mode == HISSATSU_ELEC)) + else if ((have_flag(flgs, TR_BRAND_ELEC) || ((p_ptr->special_attack & (ATTACK_ELEC)) && !thrown)) && (mode == HISSATSU_ELEC)) { if (mult < 70) mult = 70; } @@ -507,19 +507,19 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, int mode) } /* Brand (Fire) */ - if ((have_flag(flgs, TR_BRAND_FIRE)) || (p_ptr->special_attack & (ATTACK_FIRE)) || (mode == HISSATSU_FIRE)) + if (have_flag(flgs, TR_BRAND_FIRE) || ((p_ptr->special_attack & (ATTACK_FIRE)) && !thrown) || (mode == HISSATSU_FIRE)) { /* Notice immunity */ - if (r_ptr->flags3 & RF3_IM_FIRE) + if (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK) { if (m_ptr->ml) { - r_ptr->r_flags3 |= RF3_IM_FIRE; + r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK); } } /* Otherwise, take the damage */ - else if (((have_flag(flgs, TR_BRAND_FIRE)) || (p_ptr->special_attack & (ATTACK_FIRE))) && (mode == HISSATSU_FIRE)) + else if ((have_flag(flgs, TR_BRAND_FIRE) || ((p_ptr->special_attack & (ATTACK_FIRE)) && !thrown)) && (mode == HISSATSU_FIRE)) { if (r_ptr->flags3 & RF3_HURT_FIRE) { @@ -546,18 +546,18 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, int mode) } /* Brand (Cold) */ - if ((have_flag(flgs, TR_BRAND_COLD)) || (p_ptr->special_attack & (ATTACK_COLD)) || (mode == HISSATSU_COLD)) + if (have_flag(flgs, TR_BRAND_COLD) || ((p_ptr->special_attack & (ATTACK_COLD)) && !thrown) || (mode == HISSATSU_COLD)) { /* Notice immunity */ - if (r_ptr->flags3 & RF3_IM_COLD) + if (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK) { if (m_ptr->ml) { - r_ptr->r_flags3 |= RF3_IM_COLD; + r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK); } } /* Otherwise, take the damage */ - else if (((have_flag(flgs, TR_BRAND_COLD)) || (p_ptr->special_attack & (ATTACK_COLD))) && (mode == HISSATSU_COLD)) + else if ((have_flag(flgs, TR_BRAND_COLD) || ((p_ptr->special_attack & (ATTACK_COLD)) && !thrown)) && (mode == HISSATSU_COLD)) { if (r_ptr->flags3 & RF3_HURT_COLD) { @@ -584,19 +584,19 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, int mode) } /* Brand (Poison) */ - if ((have_flag(flgs, TR_BRAND_POIS)) || (p_ptr->special_attack & (ATTACK_POIS)) || (mode == HISSATSU_POISON)) + if (have_flag(flgs, TR_BRAND_POIS) || ((p_ptr->special_attack & (ATTACK_POIS)) && !thrown) || (mode == HISSATSU_POISON)) { /* Notice immunity */ - if (r_ptr->flags3 & RF3_IM_POIS) + if (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK) { if (m_ptr->ml) { - r_ptr->r_flags3 |= RF3_IM_POIS; + r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK); } } /* Otherwise, take the damage */ - else if (((have_flag(flgs, TR_BRAND_POIS)) || (p_ptr->special_attack & (ATTACK_POIS))) && (mode == HISSATSU_POISON)) + else if ((have_flag(flgs, TR_BRAND_POIS) || ((p_ptr->special_attack & (ATTACK_POIS)) && !thrown)) && (mode == HISSATSU_POISON)) { if (mult < 35) mult = 35; } @@ -605,7 +605,7 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, int mode) if (mult < 25) mult = 25; } } - if ((mode == HISSATSU_ZANMA) && (r_ptr->flags3 & (RF3_DEMON | RF3_UNDEAD | RF3_NONLIVING)) && (r_ptr->flags3 & RF3_EVIL)) + if ((mode == HISSATSU_ZANMA) && !monster_living(r_ptr) && (r_ptr->flags3 & RF3_EVIL)) { if (mult < 15) mult = 25; else if (mult < 50) mult = MIN(50, mult+20); @@ -624,7 +624,7 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, int mode) if (mult == 10) mult = 40; else if (mult < 60) mult = MIN(60, mult+30); } - if ((mode == HISSATSU_SEKIRYUKA) && p_ptr->cut && !(r_ptr->flags3 & (RF3_DEMON | RF3_UNDEAD | RF3_NONLIVING))) + if ((mode == HISSATSU_SEKIRYUKA) && p_ptr->cut && monster_living(r_ptr)) { int tmp = MIN(100, MAX(10, p_ptr->cut / 10)); if (mult < tmp) mult = tmp; @@ -1725,7 +1725,7 @@ static void touch_zap_player(monster_type *m_ptr) 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, 0x288); + monster_desc(aura_dam, m_ptr, MD_IGNORE_HALLU | MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE); #ifdef JP msg_print("ÆÍÁ³¤È¤Æ¤âÇ®¤¯¤Ê¤Ã¤¿¡ª"); @@ -1739,7 +1739,7 @@ static void touch_zap_player(monster_type *m_ptr) if (p_ptr->resist_fire) aura_damage = (aura_damage + 2) / 3; take_hit(DAMAGE_NOESCAPE, aura_damage, aura_dam, -1); - r_ptr->r_flags2 |= RF2_AURA_FIRE; + if (m_ptr->ml) r_ptr->r_flags2 |= RF2_AURA_FIRE; handle_stuff(); } } @@ -1753,7 +1753,7 @@ static void touch_zap_player(monster_type *m_ptr) 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, 0x288); + monster_desc(aura_dam, m_ptr, MD_IGNORE_HALLU | MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE); #ifdef JP msg_print("ÆÍÁ³¤È¤Æ¤â´¨¤¯¤Ê¤Ã¤¿¡ª"); @@ -1766,7 +1766,7 @@ static void touch_zap_player(monster_type *m_ptr) if (p_ptr->resist_cold) aura_damage = (aura_damage + 2) / 3; take_hit(DAMAGE_NOESCAPE, aura_damage, aura_dam, -1); - r_ptr->r_flags3 |= RF3_AURA_COLD; + if (m_ptr->ml) r_ptr->r_flags3 |= RF3_AURA_COLD; handle_stuff(); } } @@ -1780,7 +1780,7 @@ static void touch_zap_player(monster_type *m_ptr) 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, 0x288); + 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; @@ -1793,7 +1793,7 @@ static void touch_zap_player(monster_type *m_ptr) #endif take_hit(DAMAGE_NOESCAPE, aura_damage, aura_dam, -1); - r_ptr->r_flags2 |= RF2_AURA_ELEC; + if (m_ptr->ml) r_ptr->r_flags2 |= RF2_AURA_ELEC; handle_stuff(); } } @@ -2020,7 +2020,7 @@ static void py_attack_aux(int y, int x, bool *fear, bool *mdeath, s16b hand, int /* Can't backstab creatures that we can't see, right? */ backstab = TRUE; } - else if ((p_ptr->special_defense & NINJA_S_STEALTH) && (randint0(tmp) > (r_ptr->level+20)) && m_ptr->ml && !(r_ptr->flags3 & RF3_RES_ALL)) + else if ((p_ptr->special_defense & NINJA_S_STEALTH) && (randint0(tmp) > (r_ptr->level+20)) && m_ptr->ml && !(r_ptr->flagsr & RFR_RES_ALL)) { fuiuchi = TRUE; } @@ -2070,7 +2070,7 @@ static void py_attack_aux(int y, int x, bool *fear, bool *mdeath, s16b hand, int /* Disturb the monster */ m_ptr->csleep = 0; - if (r_ptr->flags7 & (RF7_HAS_LITE_1 | RF7_HAS_LITE_2)) + if (r_ptr->flags7 & RF7_HAS_LD_MASK) p_ptr->update |= (PU_MON_LITE); /* Extract monster name (or "it") */ @@ -2121,7 +2121,7 @@ static void py_attack_aux(int y, int x, bool *fear, bool *mdeath, s16b hand, int } else success_hit = old_success_hit; } - else if ((p_ptr->pclass == CLASS_NINJA) && ((backstab || fuiuchi) && !(r_ptr->flags3 & RF3_RES_ALL))) success_hit = TRUE; + else if ((p_ptr->pclass == CLASS_NINJA) && ((backstab || fuiuchi) && !(r_ptr->flagsr & RFR_RES_ALL))) success_hit = TRUE; else success_hit = test_hit_norm(chance, r_ptr->ac, m_ptr->ml); /* Test for hit */ @@ -2388,16 +2388,8 @@ static void py_attack_aux(int y, int x, bool *fear, bool *mdeath, s16b hand, int /* Handle normal weapon */ else if (o_ptr->k_idx) { - k = damroll(o_ptr->dd, o_ptr->ds); - if (p_ptr->riding) - { - if((o_ptr->tval == TV_POLEARM) && ((o_ptr->sval == SV_LANCE) || (o_ptr->sval == SV_HEAVY_LANCE))) - { - k += damroll(2, o_ptr->ds); - } - } - - k = tot_dam_aux(o_ptr, k, m_ptr, mode); + k = damroll(o_ptr->dd + p_ptr->to_dd[hand], o_ptr->ds + p_ptr->to_ds[hand]); + k = tot_dam_aux(o_ptr, k, m_ptr, mode, FALSE); if (backstab) { @@ -2469,7 +2461,7 @@ static void py_attack_aux(int y, int x, bool *fear, bool *mdeath, s16b hand, int k *= mult; /* Ouch! */ - if (((r_ptr->flags3 & RF3_RES_ALL) ? k/100 : k) > m_ptr->hp) + if (((r_ptr->flagsr & RFR_RES_ALL) ? k/100 : k) > m_ptr->hp) { #ifdef JP msg_format("%s¤ò¿¿¤ÃÆó¤Ä¤Ë¤·¤¿¡ª", m_name); @@ -2538,13 +2530,13 @@ default: msg_format("%s drain_result += p_ptr->to_d[hand]; if ((mode == HISSATSU_SUTEMI) || (mode == HISSATSU_3DAN)) k *= 2; - if ((mode == HISSATSU_SEKIRYUKA) && (r_ptr->flags3 & (RF3_UNDEAD | RF3_DEMON | RF3_NONLIVING))) k = 0; + if ((mode == HISSATSU_SEKIRYUKA) && !monster_living(r_ptr)) k = 0; if ((mode == HISSATSU_SEKIRYUKA) && !p_ptr->cut) k /= 2; /* No negative damage */ if (k < 0) k = 0; - if ((mode == HISSATSU_ZANMA) && !((r_ptr->flags3 & (RF3_DEMON | RF3_UNDEAD | RF3_NONLIVING)) && (r_ptr->flags3 & RF3_EVIL))) + if ((mode == HISSATSU_ZANMA) && !(!monster_living(r_ptr) && (r_ptr->flags3 & RF3_EVIL))) { k = 0; } @@ -2851,11 +2843,11 @@ msg_format(" { bool resists_tele = FALSE; - if (r_ptr->flags3 & RF3_RES_TELE) + if (r_ptr->flagsr & RFR_RES_TELE) { if (r_ptr->flags1 & RF1_UNIQUE) { - if (m_ptr->ml) r_ptr->r_flags3 |= RF3_RES_TELE; + if (m_ptr->ml) r_ptr->r_flagsr |= RFR_RES_TELE; #ifdef JP msg_format("%^s¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£", m_name); #else @@ -2866,7 +2858,7 @@ msg_format(" } else if (r_ptr->level > randint1(100)) { - if (m_ptr->ml) r_ptr->r_flags3 |= RF3_RES_TELE; + if (m_ptr->ml) r_ptr->r_flagsr |= RFR_RES_TELE; #ifdef JP msg_format("%^s¤ÏÄñ¹³ÎϤò»ý¤Ã¤Æ¤¤¤ë¡ª", m_name); #else @@ -2894,9 +2886,8 @@ msg_format(" else if ((chaos_effect == 5) && cave_floor_bold(y, x) && (randint1(90) > r_ptr->level)) { - if (!(r_ptr->flags1 & RF1_UNIQUE) && - !(r_ptr->flags4 & RF4_BR_CHAO) && - !(r_ptr->flags1 & RF1_QUESTOR)) + if (!(r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) && + !(r_ptr->flagsr & RFR_EFF_RES_CHAO_MASK)) { if (polymorph_monster(y, x)) { @@ -2922,7 +2913,7 @@ msg_format(" else { #ifdef JP - msg_format("%^s¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£", m_name); + msg_format("%^s¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£", m_name); #else msg_format("%^s is unaffected.", m_name); #endif @@ -3260,21 +3251,29 @@ bool py_attack(int y, int x, int mode) /* Gain riding experience */ if (p_ptr->riding) { - int ridinglevel = r_info[m_list[p_ptr->riding].r_idx].level; + int cur = p_ptr->skill_exp[GINOU_RIDING]; + int max = s_info[p_ptr->pclass].s_max[GINOU_RIDING]; - if (p_ptr->skill_exp[GINOU_RIDING] < s_info[p_ptr->pclass].s_max[GINOU_RIDING]) + if (cur < max) { - if (((p_ptr->skill_exp[GINOU_RIDING] - (RIDING_EXP_BEGINNER * 2)) / 200) < r_info[m_ptr->r_idx].level) - p_ptr->skill_exp[GINOU_RIDING]++; + int ridinglevel = r_info[m_list[p_ptr->riding].r_idx].level; + int targetlevel = r_info[m_ptr->r_idx].level; + int inc = 0; + + if ((cur / 200 - 5) < targetlevel) + inc += 1; /* Extra experience */ - if ((p_ptr->skill_exp[GINOU_RIDING] / 100) < ridinglevel) + if ((cur / 100) < ridinglevel) { - if (((p_ptr->skill_exp[GINOU_RIDING] + (RIDING_EXP_SKILLED - RIDING_EXP_BEGINNER)) / 100) < ridinglevel) - p_ptr->skill_exp[GINOU_RIDING] += (1 + (ridinglevel - (p_ptr->skill_exp[GINOU_RIDING] / 100 + 15))); - else p_ptr->skill_exp[GINOU_RIDING]++; + if ((cur / 100 + 15) < ridinglevel) + inc += 1 + (ridinglevel - (cur / 100 + 15)); + else + inc += 1; } + p_ptr->skill_exp[GINOU_RIDING] = MIN(max, cur + inc); + p_ptr->update |= (PU_BONUS); } } @@ -3903,7 +3902,7 @@ msg_format("%s disturb(0, 0); } - else if ((p_ptr->riding && !(r_info[m_list[p_ptr->riding].r_idx].flags7 & (RF7_CAN_FLY)) && !(r_info[m_list[p_ptr->riding].r_idx].flags3 & (RF3_IM_FIRE))) && ((c_ptr->feat == FEAT_SHAL_LAVA) || (c_ptr->feat == FEAT_DEEP_LAVA))) + else if ((p_ptr->riding && !(r_info[m_list[p_ptr->riding].r_idx].flags7 & (RF7_CAN_FLY)) && !(r_info[m_list[p_ptr->riding].r_idx].flagsr & RFR_EFF_IM_FIRE_MASK)) && ((c_ptr->feat == FEAT_SHAL_LAVA) || (c_ptr->feat == FEAT_DEEP_LAVA))) { #ifdef JP msg_print("ÍÏ´ä¤Î¾å¤Ë¹Ô¤±¤Ê¤¤¡£"); @@ -3972,13 +3971,23 @@ msg_format("%s lite_spot(y, x); } + /* Boundary floor mimic */ + else if (boundary_floor_grid(c_ptr)) + { +#ifdef JP + msg_print("¤½¤ì°Ê¾åÀè¤Ë¤Ï¿Ê¤á¤Ê¤¤¤è¤¦¤À¡£"); +#else + msg_print("You feel you cannot go any more."); +#endif + } + /* Wall (or secret door) */ else { #ifdef JP - msg_print("Êɤ¬¹Ô¤¯¼ê¤ò¤Ï¤Ð¤ó¤Ç¤¤¤ë¤è¤¦¤À¡£"); + msg_format("%s¤¬¹Ô¤¯¼ê¤ò¤Ï¤Ð¤ó¤Ç¤¤¤ë¤è¤¦¤À¡£", (feat == FEAT_TREES) ? "ÌÚ" : "ÊÉ"); #else - msg_print("You feel a wall blocking your way."); + msg_format("You feel a %s blocking your way.", (feat == FEAT_TREES) ? "tree" : "wall"); #endif c_ptr->info |= (CAVE_MARK); @@ -3998,7 +4007,6 @@ msg_format("%s msg_print("There is rubble blocking your way."); #endif - if (!(p_ptr->confused || p_ptr->stun || p_ptr->image)) energy_use = 0; @@ -4023,6 +4031,18 @@ msg_format("%s msg_print("There is a closed door blocking your way."); #endif + if (!(p_ptr->confused || p_ptr->stun || p_ptr->image)) + energy_use = 0; + } + + /* Boundary floor mimic */ + else if (boundary_floor_grid(c_ptr)) + { +#ifdef JP + msg_print("¤½¤ì°Ê¾åÀè¤Ë¤Ï¿Ê¤á¤Ê¤¤¡£"); +#else + msg_print("You cannot go any more."); +#endif if (!(p_ptr->confused || p_ptr->stun || p_ptr->image)) energy_use = 0; @@ -4032,19 +4052,18 @@ msg_format("%s else { #ifdef JP - msg_print("Êɤ¬¹Ô¤¯¼ê¤ò¤Ï¤Ð¤ó¤Ç¤¤¤ë¡£"); + msg_format("%s¤¬¹Ô¤¯¼ê¤ò¤Ï¤Ð¤ó¤Ç¤¤¤ë¡£", (feat == FEAT_TREES) ? "ÌÚ" : "ÊÉ"); #else - msg_print("There is a wall blocking your way."); + msg_format("There is a %s blocking your way.", (feat == FEAT_TREES) ? "tree" : "wall"); #endif - if (!(p_ptr->confused || p_ptr->stun || p_ptr->image)) energy_use = 0; } } /* Sound */ - sound(SOUND_HITWALL); + if (!boundary_floor_grid(c_ptr)) sound(SOUND_HITWALL); } /* Normal movement */ @@ -5199,7 +5218,7 @@ void run_step(int dir) #endif /* ALLOW_EASY_DISARM -- TNB */ - if ((py == p_ptr->run_py) && (px == p_ptr->run_px)) + if (player_bold(p_ptr->run_py, p_ptr->run_px)) { p_ptr->run_py = 0; p_ptr->run_px = 0;