/* File: cmd1.c */
-/* Purpose: Movement commands (part 1) */
-
/*
- * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke
+ * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
*
- * This software may be copied and distributed for educational, research, and
- * not for profit purposes provided that this copyright and statement are
- * included in all such copies.
+ * This software may be copied and distributed for educational, research,
+ * and not for profit purposes provided that this copyright and statement
+ * are included in all such copies. Other copyrights may also apply.
*/
+/* Purpose: Movement commands (part 1) */
+
#include "angband.h"
#define MAX_VAMPIRIC_DRAIN 50
* 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;
}
/* 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->flags3 & RF3_EFF_IM_ACID_MASK)
{
if (m_ptr->ml)
{
- r_ptr->r_flags3 |= RF3_IM_ACID;
+ r_ptr->r_flags3 |= (r_ptr->flags3 & RF3_EFF_IM_ACID_MASK);
}
}
}
/* 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->flags3 & RF3_EFF_IM_ELEC_MASK)
{
if (m_ptr->ml)
{
- r_ptr->r_flags3 |= RF3_IM_ELEC;
+ r_ptr->r_flags3 |= (r_ptr->flags3 & RF3_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;
}
}
/* 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->flags3 & RF3_EFF_IM_FIRE_MASK)
{
if (m_ptr->ml)
{
- r_ptr->r_flags3 |= RF3_IM_FIRE;
+ r_ptr->r_flags3 |= (r_ptr->flags3 & RF3_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)
{
}
/* 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->flags3 & RF3_EFF_IM_COLD_MASK)
{
if (m_ptr->ml)
{
- r_ptr->r_flags3 |= RF3_IM_COLD;
+ r_ptr->r_flags3 |= (r_ptr->flags3 & RF3_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)
{
}
/* 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->flags3 & RF3_EFF_IM_POIS_MASK)
{
if (m_ptr->ml)
{
- r_ptr->r_flags3 |= RF3_IM_POIS;
+ r_ptr->r_flags3 |= (r_ptr->flags3 & RF3_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;
}
{
p_ptr->csp -= (1+(o_ptr->dd * o_ptr->ds / 5));
p_ptr->redraw |= (PR_MANA);
- mult = MIN(60, mult * 7 / 2);
+ mult = mult * 3 / 2 + 20;
}
break;
}
c_ptr = &cave[y][x];
/* Invisible trap */
- if (c_ptr->info & CAVE_TRAP)
+ if (c_ptr->mimic && is_trap(c_ptr->feat))
{
/* Pick a trap */
- pick_trap(y, x);
+ disclose_grid(y, x);
/* Message */
#ifdef JP
disturb(0, 0);
}
- /* Invisible wall opening trap */
- if (c_ptr->feat == FEAT_INVIS)
- {
- /* Activate the trap */
- cave_set_feat(y, x, FEAT_TRAP_OPEN);
-
- /* Message */
-#ifdef JP
- msg_print("¥È¥é¥Ã¥×¤òȯ¸«¤·¤¿¡£");
-#else
- msg_print("You have found a trap.");
-#endif
-
- /* Disturb */
- disturb(0, 0);
- }
-
/* Secret door */
- if (c_ptr->feat == FEAT_SECRET)
+ if (is_hidden_door(c_ptr))
{
/* Message */
#ifdef JP
msg_print("You have found a secret door.");
#endif
-
- /* Pick a door */
- place_closed_door(y, x);
+ /* Disclose */
+ disclose_grid(y, x);
/* Disturb */
disturb(0, 0);
/* Message */
#ifdef JP
msg_format(" $%ld ¤Î²ÁÃͤ¬¤¢¤ë%s¤ò¸«¤Ä¤±¤¿¡£",
- (long)value, o_name);
+ (long)value, o_name);
#else
msg_format("You collect %ld gold pieces worth of %s.",
(long)value, o_name);
do_cmd_save_game(TRUE);
#ifdef JP
- do_cmd_write_nikki(NIKKI_STAIR, 1, "Í¸Í¤ËÍî¤Á¤¿");
+ do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "Í¸Í¤ËÍî¤Á¤¿");
#else
- do_cmd_write_nikki(NIKKI_STAIR, 1, "You have fallen through a trap door!");
+ do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "You have fallen through a trap door!");
#endif
- dun_level++;
+ prepare_change_floor_mode(CFM_DOWN | CFM_RAND_PLACE | CFM_RAND_CONNECT);
/* Leaving */
p_ptr->leaving = TRUE;
dam = dam * 2;
(void)set_cut(p_ptr->cut + randint1(dam));
- if (p_ptr->resist_pois || p_ptr->oppose_pois)
+ if (p_ptr->resist_pois || IS_OPPOSE_POIS())
{
#ifdef JP
msg_print("¤·¤«¤·ÆǤαƶÁ¤Ï¤Ê¤«¤Ã¤¿¡ª");
msg_print("A pungent green gas surrounds you!");
#endif
- if (!p_ptr->resist_pois && !p_ptr->oppose_pois)
+ if (!p_ptr->resist_pois && !IS_OPPOSE_POIS())
{
(void)set_poisoned(p_ptr->poisoned + randint0(20) + 10);
}
break;
}
- case FEAT_TRAP_OPEN:
- {
+ case FEAT_TRAP_OPEN:
+ {
+#ifdef JP
+ msg_print("Âç²»¶Á¤È¶¦¤Ë¤Þ¤ï¤ê¤ÎÊɤ¬Êø¤ì¤¿¡ª");
+#else
+ msg_print("Suddenly, surrounding walls are opened!");
+#endif
+ (void)project(0, 3, y, x, 0, GF_DISINTEGRATE, PROJECT_GRID | PROJECT_HIDE, -1);
+ (void)project(0, 3, y, x - 4, 0, GF_DISINTEGRATE, PROJECT_GRID | PROJECT_HIDE, -1);
+ (void)project(0, 3, y, x + 4, 0, GF_DISINTEGRATE, PROJECT_GRID | PROJECT_HIDE, -1);
+ aggravate_monsters(0);
+
+ break;
+ }
+
+ case FEAT_TRAP_ARMAGEDDON:
+ {
+ static int levs[10] = {0, 0, 20, 10, 5, 3, 2, 1, 1, 1};
+ int evil_idx = 0, good_idx = 0;
+
+ int lev;
+#ifdef JP
+ msg_print("ÆÍÁ³Å·³¦¤ÎÀïÁè¤Ë´¬¤¹þ¤Þ¤ì¤¿¡ª");
+#else
+ msg_print("Suddenly, you are surrounded by immotal beings!");
+#endif
+
+ /* Destroy this trap */
+ cave_set_feat(y, x, floor_type[randint0(100)]);
+
+ /* Summon Demons and Angels */
+ for (lev = dun_level; lev >= 20; lev -= 1 + lev/16)
+ {
+ num = levs[MIN(lev/10, 9)];
+ for (i = 0; i < num; i++)
+ {
+ int x1 = rand_spread(x, 7);
+ int y1 = rand_spread(y, 5);
+
+ /* Skip illegal grids */
+ if (!in_bounds(y1, x1)) continue;
+
+ /* Require line of sight */
+ if (!player_has_los_bold(y1, x1)) continue;
+
+ if (summon_specific(0, y1, x1, lev, SUMMON_ARMAGE_EVIL, (PM_NO_PET)))
+ evil_idx = hack_m_idx_ii;
+
+ if (summon_specific(0, y1, x1, lev, SUMMON_ARMAGE_GOOD, (PM_NO_PET)))
+ {
+ good_idx = hack_m_idx_ii;
+ }
+
+ /* Let them fight each other */
+ if (evil_idx && good_idx)
+ {
+ monster_type *evil_ptr = &m_list[evil_idx];
+ monster_type *good_ptr = &m_list[good_idx];
+ evil_ptr->target_y = good_ptr->fy;
+ evil_ptr->target_x = good_ptr->fx;
+ good_ptr->target_y = evil_ptr->fy;
+ good_ptr->target_x = evil_ptr->fx;
+ }
+ }
+ }
+ break;
+ }
+
+ case FEAT_TRAP_PIRANHA:
+ {
#ifdef JP
- msg_print("Âç²»¶Á¤È¶¦¤Ë¤Þ¤ï¤ê¤ÎÊɤ¬Êø¤ì¤¿¡ª");
+ msg_print("ÆÍÁ³Êɤ«¤é¿å¤¬°î¤ì½Ð¤·¤¿¡ª¥Ô¥é¥Ë¥¢¤¬¤¤¤ë¡ª");
#else
- msg_print("Suddenly, surrounding walls are opened!");
+ msg_print("Suddenly, the room is filled with water with piranhas!");
#endif
- (void)project(0, 3, y, x, 0, GF_DISINTEGRATE, PROJECT_GRID | PROJECT_HIDE, -1);
- (void)project(0, 3, y, x - 4, 0, GF_DISINTEGRATE, PROJECT_GRID | PROJECT_HIDE, -1);
- (void)project(0, 3, y, x + 4, 0, GF_DISINTEGRATE, PROJECT_GRID | PROJECT_HIDE, -1);
- aggravate_monsters(0);
- break;
- }
+ /* Destroy this trap */
+ cave_set_feat(y, x, floor_type[randint0(100)]);
+
+ /* Water fills room */
+ fire_ball_hide(GF_WATER_FLOW, 0, 1, 10);
+
+ /* Summon Piranhas */
+ num = 1 + dun_level/20;
+ for (i = 0; i < num; i++)
+ {
+ (void)summon_specific(0, y, x, dun_level, SUMMON_PIRANHAS, (PM_ALLOW_GROUP | PM_NO_PET));
+ }
+ break;
+ }
}
if (break_trap && is_trap(c_ptr->feat))
{
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("ÆÍÁ³¤È¤Æ¤âÇ®¤¯¤Ê¤Ã¤¿¡ª");
#endif
- if (p_ptr->oppose_fire) aura_damage = (aura_damage + 2) / 3;
+ 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);
- r_ptr->r_flags2 |= RF2_AURA_FIRE;
+ if (m_ptr->ml) r_ptr->r_flags2 |= RF2_AURA_FIRE;
handle_stuff();
}
}
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("ÆÍÁ³¤È¤Æ¤â´¨¤¯¤Ê¤Ã¤¿¡ª");
#endif
- if (p_ptr->oppose_cold) aura_damage = (aura_damage + 2) / 3;
+ 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);
- r_ptr->r_flags3 |= RF3_AURA_COLD;
+ if (m_ptr->ml) r_ptr->r_flags3 |= RF3_AURA_COLD;
handle_stuff();
}
}
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 (p_ptr->oppose_elec) aura_damage = (aura_damage + 2) / 3;
+ 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
#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();
}
}
{
if (p_ptr->skill_exp[GINOU_SUDE] < s_info[p_ptr->pclass].s_max[GINOU_SUDE])
{
- if (p_ptr->skill_exp[GINOU_SUDE] < 4000)
- p_ptr->skill_exp[GINOU_SUDE]+=40;
- else if((p_ptr->skill_exp[GINOU_SUDE] < 6000))
- p_ptr->skill_exp[GINOU_SUDE]+=5;
- else if((p_ptr->skill_exp[GINOU_SUDE] < 7000) && (p_ptr->lev > 19))
- p_ptr->skill_exp[GINOU_SUDE]+=1;
- else if((p_ptr->skill_exp[GINOU_SUDE] < 8000) && (p_ptr->lev > 34))
- if (one_in_(3)) p_ptr->skill_exp[GINOU_SUDE]+=1;
+ if (p_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_BEGINNER)
+ p_ptr->skill_exp[GINOU_SUDE] += 40;
+ else if ((p_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_SKILLED))
+ p_ptr->skill_exp[GINOU_SUDE] += 5;
+ else if ((p_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_EXPERT) && (p_ptr->lev > 19))
+ p_ptr->skill_exp[GINOU_SUDE] += 1;
+ else if ((p_ptr->lev > 34))
+ if (one_in_(3)) p_ptr->skill_exp[GINOU_SUDE] += 1;
p_ptr->update |= (PU_BONUS);
}
}
if (now_exp < s_info[p_ptr->pclass].w_max[tval][sval])
{
int amount = 0;
- if (now_exp < 4000) amount = 80;
- else if(now_exp < 6000) amount = 10;
- else if((now_exp < 7000) && (p_ptr->lev > 19)) amount = 1;
- else if((p_ptr->lev > 34) && one_in_(2)) amount = 1;
+ if (now_exp < WEAPON_EXP_BEGINNER) amount = 80;
+ else if (now_exp < WEAPON_EXP_SKILLED) amount = 10;
+ else if ((now_exp < WEAPON_EXP_EXPERT) && (p_ptr->lev > 19)) amount = 1;
+ else if ((p_ptr->lev > 34) && one_in_(2)) amount = 1;
p_ptr->weapon_exp[tval][sval] += amount;
p_ptr->update |= (PU_BONUS);
}
/* 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)
{
if (o_ptr->name1 == ART_VORPAL_BLADE)
{
#ifdef JP
- msg_print("Ìܤˤâ»ß¤Þ¤é¤Ì¥Ü¡¼¥Ñ¥ë¡¦¥Ö¥ì¡¼¥É¡¢¼êÏ£¤ÎÁá¶È¡ª");
+ msg_print("Ìܤˤâ»ß¤Þ¤é¤Ì¥ô¥©¡¼¥Ñ¥ë¥Ö¥ì¡¼¥É¡¢¼êÏ£¤ÎÁá¶È¡ª");
#else
msg_print("Your Vorpal Blade goes snicker-snack!");
#endif
if (k <= 0) can_drain = FALSE;
if (drain_result > m_ptr->hp)
- drain_result = m_ptr->hp;
+ drain_result = m_ptr->hp;
/* Damage, check for fear and death */
if (mon_take_hit(c_ptr->m_idx, k, fear, NULL))
{
if (m_ptr->ml) r_ptr->r_flags3 |= RF3_RES_TELE;
#ifdef JP
- msg_format("%^s¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£", m_name);
+ msg_format("%^s¤Ë¤Ï¸ú²Ì¤¬¤Ê¤«¤Ã¤¿¡£", m_name);
#else
msg_format("%^s is unaffected!", m_name);
#endif
#endif
teleport_away(c_ptr->m_idx, 50, FALSE);
- num = p_ptr->num_blow[hand] + 1; /* Can't hit it anymore! */
+ num = num_blow + 1; /* Can't hit it anymore! */
*mdeath = TRUE;
}
}
else if ((chaos_effect == 5) && cave_floor_bold(y, x) &&
- (randint1(90) > r_ptr->level))
+ (randint1(90) > r_ptr->level))
{
if (!(r_ptr->flags1 & RF1_UNIQUE) &&
!(r_ptr->flags4 & RF4_BR_CHAO) &&
if (p_ptr->align < 0 && mult < 20)
mult = 20;
- if (!(p_ptr->resist_acid || p_ptr->oppose_acid) && (mult < 25))
+ if (!(p_ptr->resist_acid || IS_OPPOSE_ACID() || p_ptr->immune_acid) && (mult < 25))
mult = 25;
- if (!(p_ptr->resist_elec || p_ptr->oppose_elec) && (mult < 25))
+ if (!(p_ptr->resist_elec || IS_OPPOSE_ELEC() || p_ptr->immune_elec) && (mult < 25))
mult = 25;
- if (!(p_ptr->resist_fire || p_ptr->oppose_fire) && (mult < 25))
+ if (!(p_ptr->resist_fire || IS_OPPOSE_FIRE() || p_ptr->immune_fire) && (mult < 25))
mult = 25;
- if (!(p_ptr->resist_cold || p_ptr->oppose_cold) && (mult < 25))
+ if (!(p_ptr->resist_cold || IS_OPPOSE_COLD() || p_ptr->immune_cold) && (mult < 25))
mult = 25;
- if (!(p_ptr->resist_pois || p_ptr->oppose_pois) && (mult < 25))
+ if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()) && (mult < 25))
mult = 25;
if ((p_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs, TR_FORCE_WEAPON)) && (p_ptr->csp > (p_ptr->msp / 30)))
{
p_ptr->csp -= (1+(p_ptr->msp / 30));
p_ptr->redraw |= (PR_MANA);
- mult = mult * 35;
+ mult = mult * 3 / 2 + 20;
}
k *= mult;
k /= 10;
}
k += (p_ptr->to_d[hand] + o_ptr->to_d);
- if (k < 0) k = 0;
+ if (k < 0) k = 0;
#ifdef JP
take_hit(DAMAGE_FORCE, k, "»à¤ÎÂç³ù", -1);
{
if ((p_ptr->skill_exp[GINOU_NITOURYU] < s_info[p_ptr->pclass].s_max[GINOU_NITOURYU]) && ((p_ptr->skill_exp[GINOU_NITOURYU] - 1000) / 200 < r_info[m_ptr->r_idx].level))
{
- if (p_ptr->skill_exp[GINOU_NITOURYU] < 4000)
- p_ptr->skill_exp[GINOU_NITOURYU]+=80;
- else if(p_ptr->skill_exp[GINOU_NITOURYU] < 6000)
- p_ptr->skill_exp[GINOU_NITOURYU]+=4;
- else if(p_ptr->skill_exp[GINOU_NITOURYU] < 7000)
- p_ptr->skill_exp[GINOU_NITOURYU]+=1;
- else if(p_ptr->skill_exp[GINOU_NITOURYU] < 8000)
- if (one_in_(3)) p_ptr->skill_exp[GINOU_NITOURYU]+=1;
+ if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_BEGINNER)
+ p_ptr->skill_exp[GINOU_NITOURYU] += 80;
+ else if(p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_SKILLED)
+ p_ptr->skill_exp[GINOU_NITOURYU] += 4;
+ else if(p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_EXPERT)
+ p_ptr->skill_exp[GINOU_NITOURYU] += 1;
+ else if(p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_MASTER)
+ if (one_in_(3)) p_ptr->skill_exp[GINOU_NITOURYU] += 1;
p_ptr->update |= (PU_BONUS);
}
}
+ /* Gain riding experience */
if (p_ptr->riding)
{
- int ridinglevel = r_info[m_list[p_ptr->riding].r_idx].level;
- if ((p_ptr->skill_exp[GINOU_RIDING] < s_info[p_ptr->pclass].s_max[GINOU_RIDING]) && ((p_ptr->skill_exp[GINOU_RIDING] - 1000) / 200 < r_info[m_ptr->r_idx].level) && (p_ptr->skill_exp[GINOU_RIDING]/100 - 2000 < ridinglevel))
- p_ptr->skill_exp[GINOU_RIDING]++;
- if ((p_ptr->skill_exp[GINOU_RIDING] < s_info[p_ptr->pclass].s_max[GINOU_RIDING]) && (p_ptr->skill_exp[GINOU_RIDING]/100 < ridinglevel))
+ int cur = p_ptr->skill_exp[GINOU_RIDING];
+ int max = s_info[p_ptr->pclass].s_max[GINOU_RIDING];
+
+ if (cur < max)
{
- if (ridinglevel*100 > (p_ptr->skill_exp[GINOU_RIDING] + 1500))
- p_ptr->skill_exp[GINOU_RIDING] += (1+(ridinglevel - p_ptr->skill_exp[GINOU_RIDING]/100 - 15));
- else 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 ((cur / 100) < ridinglevel)
+ {
+ 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);
}
- p_ptr->update |= (PU_BONUS);
}
riding_t_m_idx = c_ptr->m_idx;
return TRUE;
}
else if ((cave[n_y][n_x].feat == FEAT_PATTERN_OLD) ||
- (cave[n_y][n_x].feat == FEAT_PATTERN_END) ||
- (cave[n_y][n_x].feat == FEAT_PATTERN_XTRA2))
+ (cave[n_y][n_x].feat == FEAT_PATTERN_END) ||
+ (cave[n_y][n_x].feat == FEAT_PATTERN_XTRA2))
{
if (pattern_tile(c_y, c_x))
{
}
}
else if ((cave[n_y][n_x].feat == FEAT_PATTERN_XTRA1) ||
- (cave[c_y][c_x].feat == FEAT_PATTERN_XTRA1))
+ (cave[c_y][c_x].feat == FEAT_PATTERN_XTRA1))
{
return TRUE;
}
}
}
else if ((cave[c_y][c_x].feat == FEAT_PATTERN_OLD) ||
- (cave[c_y][c_x].feat == FEAT_PATTERN_END) ||
- (cave[c_y][c_x].feat == FEAT_PATTERN_XTRA2))
+ (cave[c_y][c_x].feat == FEAT_PATTERN_END) ||
+ (cave[c_y][c_x].feat == FEAT_PATTERN_XTRA2))
{
if (!pattern_tile(n_y, n_x))
{
default:
if (p_ptr->wizard)
#ifdef JP
- msg_format("¤ª¤«¤·¤Ê¥Ñ¥¿¡¼¥óÊâ¹Ô¡¢%d¡£", cave[c_y][c_x]);
+ msg_format("¤ª¤«¤·¤Ê¥Ñ¥¿¡¼¥óÊâ¹Ô¡¢%d¡£", cave[c_y][c_x].feat);
#else
- msg_format("Funny Pattern walking, %d.", cave[c_y][c_x]);
+ msg_format("Funny Pattern walking, %d.", cave[c_y][c_x].feat);
#endif
return TRUE; /* Goof-up */
case FEAT_PERM_INNER:
case FEAT_PERM_OUTER:
case FEAT_PERM_SOLID:
+ case FEAT_PATTERN_START:
+ case FEAT_PATTERN_1:
+ case FEAT_PATTERN_2:
+ case FEAT_PATTERN_3:
+ case FEAT_PATTERN_4:
+ case FEAT_PATTERN_END:
+ case FEAT_PATTERN_OLD:
+ case FEAT_PATTERN_XTRA1:
+ case FEAT_PATTERN_XTRA2:
{
return (FALSE);
}
/* Examine the destination */
c_ptr = &cave[y][x];
-
/* Exit the area */
if (!dun_level && !p_ptr->wild_mode &&
((x == 0) || (x == MAX_WID - 1) ||
p_ptr->wilderness_x--;
p_ptr->oldpy = cur_hgt - 2;
p_ptr->oldpx = cur_wid - 2;
- ambush_flag = FALSE;
+ ambush_flag = FALSE;
}
else if ((y == 0) && (x == MAX_WID - 1))
p_ptr->wilderness_x++;
p_ptr->oldpy = cur_hgt - 2;
p_ptr->oldpx = 1;
- ambush_flag = FALSE;
+ ambush_flag = FALSE;
}
else if ((y == MAX_HGT - 1) && (x == 0))
p_ptr->wilderness_x--;
p_ptr->oldpy = 1;
p_ptr->oldpx = cur_wid - 2;
- ambush_flag = FALSE;
+ ambush_flag = FALSE;
}
else if ((y == MAX_HGT - 1) && (x == MAX_WID - 1))
p_ptr->wilderness_x++;
p_ptr->oldpy = 1;
p_ptr->oldpx = 1;
- ambush_flag = FALSE;
+ ambush_flag = FALSE;
}
else if (y == 0)
p_ptr->wilderness_y--;
p_ptr->oldpy = cur_hgt - 2;
p_ptr->oldpx = x;
- ambush_flag = FALSE;
+ ambush_flag = FALSE;
}
else if (y == MAX_HGT - 1)
p_ptr->wilderness_y++;
p_ptr->oldpy = 1;
p_ptr->oldpx = x;
- ambush_flag = FALSE;
+ ambush_flag = FALSE;
}
else if (x == 0)
p_ptr->wilderness_x--;
p_ptr->oldpx = cur_wid - 2;
p_ptr->oldpy = y;
- ambush_flag = FALSE;
+ ambush_flag = FALSE;
}
else if (x == MAX_WID - 1)
p_ptr->wilderness_x++;
p_ptr->oldpx = 1;
p_ptr->oldpy = y;
- ambush_flag = FALSE;
+ ambush_flag = FALSE;
}
p_ptr->leftbldg = TRUE;
#ifdef ALLOW_EASY_DISARM /* TNB */
/* Disarm a visible trap */
- else if ((do_pickup != easy_disarm) && is_trap(c_ptr->feat))
+ else if ((do_pickup != easy_disarm) && is_known_trap(c_ptr))
{
bool ignore = FALSE;
switch (c_ptr->feat)
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].flags3 & RF3_EFF_IM_FIRE_MASK)) && ((c_ptr->feat == FEAT_SHAL_LAVA) || (c_ptr->feat == FEAT_DEEP_LAVA)))
{
#ifdef JP
msg_print("ÍÏ´ä¤Î¾å¤Ë¹Ô¤±¤Ê¤¤¡£");
else if ((!cave_floor_bold(y, x)) &&
(!p_can_pass_walls))
{
+ byte feat;
+
oktomove = FALSE;
+ /* Feature code (applying "mimic" field) */
+ feat = c_ptr->mimic ? c_ptr->mimic : f_info[c_ptr->feat].mimic;
+
/* Disturb the player */
disturb(0, 0);
(p_ptr->blind || !(c_ptr->info & (CAVE_LITE))))
{
/* Rubble */
- if (c_ptr->feat == FEAT_RUBBLE)
+ if (feat == FEAT_RUBBLE)
{
#ifdef JP
- msg_print("´äÀФ¬¹Ô¤¯¼ê¤ò¤Ï¤Ð¤ó¤Ç¤¤¤ë¤è¤¦¤À¡£");
+ msg_print("´äÀФ¬¹Ô¤¯¼ê¤ò¤Ï¤Ð¤ó¤Ç¤¤¤ë¤è¤¦¤À¡£");
#else
msg_print("You feel some rubble blocking your way.");
#endif
}
/* Closed door */
- else if (c_ptr->feat < FEAT_SECRET)
+ else if (is_closed_door(feat))
{
#ifdef JP
- msg_print("¥É¥¢¤¬¹Ô¤¯¼ê¤ò¤Ï¤Ð¤ó¤Ç¤¤¤ë¤è¤¦¤À¡£");
+ msg_print("¥É¥¢¤¬¹Ô¤¯¼ê¤ò¤Ï¤Ð¤ó¤Ç¤¤¤ë¤è¤¦¤À¡£");
#else
msg_print("You feel a closed door blocking your way.");
#endif
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);
else
{
/* Rubble */
- if (c_ptr->feat == FEAT_RUBBLE)
+ if (feat == FEAT_RUBBLE)
{
#ifdef JP
msg_print("´äÀФ¬¹Ô¤¯¼ê¤ò¤Ï¤Ð¤ó¤Ç¤¤¤ë¡£");
msg_print("There is rubble blocking your way.");
#endif
-
if (!(p_ptr->confused || p_ptr->stun || p_ptr->image))
energy_use = 0;
*/
}
/* Closed doors */
- else if (c_ptr->feat < FEAT_SECRET)
+ else if (is_closed_door(feat))
{
#ifdef ALLOW_EASY_OPEN
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;
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 */
if (p_ptr->warning)
{
- if(!process_frakir(x,y))
+ if(!process_warning(x, y))
{
energy_use = 25;
return;
if (p_ptr->riding && (r_info[m_list[p_ptr->riding].r_idx].flags2 & RF2_KILL_WALL))
{
- if (cave[py][px].feat > FEAT_SECRET && cave[py][px].feat < FEAT_PERM_SOLID)
+ if (cave[py][px].feat >= FEAT_RUBBLE && cave[py][px].feat < FEAT_PERM_SOLID)
{
/* Forget the wall */
cave[py][px].info &= ~(CAVE_MARK);
if (cave[py][px].feat == FEAT_TREES)
cave_set_feat(py, px, FEAT_GRASS);
else
- {
- cave[py][px].feat = floor_type[randint0(100)];
- }
+ cave_set_feat(py, px, floor_type[randint0(100)]);
}
/* Update some things -- similar to GF_KILL_WALL */
p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MONSTERS | PU_MON_LITE);
}
+ /* Remove "unsafe" flag */
+ if ((!p_ptr->blind && !no_lite()) || !is_trap(c_ptr->feat)) c_ptr->info &= ~(CAVE_UNSAFE);
+
/* Redraw new spot */
lite_spot(py, px);
/* Check for new panel (redraw map) */
verify_panel();
- /* For get everything when requested hehe I'm *NASTY* */
- if (dun_level && (d_info[dungeon_type].flags1 & DF1_FORGET))
- {
- wiz_dark();
- }
+ /* For get everything when requested hehe I'm *NASTY* */
+ if (dun_level && (d_info[dungeon_type].flags1 & DF1_FORGET))
+ {
+ wiz_dark();
+ }
if ((p_ptr->pclass == CLASS_NINJA))
{
p_ptr->leaving = TRUE;
}
- /* Discover invisible traps */
- else if (c_ptr->info & CAVE_TRAP)
+ /* Set off a trap */
+ else if (is_trap(c_ptr->feat))
{
/* Disturb */
disturb(0, 0);
- /* Message */
-#ifdef JP
- msg_print("¥È¥é¥Ã¥×¤À¡ª");
-#else
- msg_print("You found a trap!");
-#endif
-
-
- /* Pick a trap */
- pick_trap(py, px);
-
- /* Hit the trap */
- hit_trap(break_trap);
- }
-
- /* Discover invisible wall opening trap */
- else if (c_ptr->feat == FEAT_INVIS)
- {
- c_ptr->feat = FEAT_TRAP_OPEN;
-
- /* Disturb */
- disturb(0, 0);
-
- /* Message */
+ /* Hidden trap */
+ if (c_ptr->mimic)
+ {
+ /* Message */
#ifdef JP
- msg_print("¥È¥é¥Ã¥×¤À¡ª");
+ msg_print("¥È¥é¥Ã¥×¤À¡ª");
#else
- msg_print("You found a trap!");
+ msg_print("You found a trap!");
#endif
- /* Hit the trap */
- hit_trap(break_trap);
- }
-
- /* Set off an visible trap */
- else if (is_trap(c_ptr->feat))
- {
- /* Disturb */
- disturb(0, 0);
+ /* Pick a trap */
+ disclose_grid(py, px);
+ }
/* Hit the trap */
hit_trap(break_trap);
*/
static int see_wall(int dir, int y, int x)
{
+ cave_type *c_ptr;
+ byte feat;
+
/* Get the new location */
y += ddy[dir];
x += ddx[dir];
/* Illegal grids are not known walls */
if (!in_bounds2(y, x)) return (FALSE);
- /* Non-wall grids are not known walls */
- if (cave[y][x].feat < FEAT_SECRET) return (FALSE);
-
- if ((cave[y][x].feat >= FEAT_DEEP_WATER) &&
- (cave[y][x].feat <= FEAT_GRASS)) return (FALSE);
-
- if ((cave[y][x].feat >= FEAT_SHOP_HEAD) &&
- (cave[y][x].feat <= FEAT_SHOP_TAIL)) return (FALSE);
-
- if (cave[y][x].feat == FEAT_DEEP_GRASS) return (FALSE);
- if (cave[y][x].feat == FEAT_FLOWER) return (FALSE);
-
- if (cave[y][x].feat == FEAT_MUSEUM) return (FALSE);
-
- if ((cave[y][x].feat >= FEAT_BLDG_HEAD) &&
- (cave[y][x].feat <= FEAT_BLDG_TAIL)) return (FALSE);
+ /* Access grid */
+ c_ptr = &cave[y][x];
-/* if (cave[y][x].feat == FEAT_TREES) return (FALSE); */
+ /* Feature code (applying "mimic" field) */
+ feat = c_ptr->mimic ? c_ptr->mimic : f_info[c_ptr->feat].mimic;
/* Must be known to the player */
- if (!(cave[y][x].info & (CAVE_MARK))) return (FALSE);
+ if (c_ptr->info & (CAVE_MARK))
+ {
+ /* Rubble, Magma, Quartz, Wall, Perm wall */
+ if (feat >= FEAT_RUBBLE && feat <= FEAT_PERM_SOLID) return TRUE;
- if (cave[y][x].feat >= FEAT_TOWN) return (FALSE);
+ /* Tree */
+ if (feat == FEAT_TREES) return TRUE;
- /* Default */
- return (TRUE);
+ /* Mountain */
+ if (feat == FEAT_MOUNTAIN) return TRUE;
+ }
+
+ return FALSE;
}
int i, max, inv;
int option = 0, option2 = 0;
cave_type *c_ptr;
+ byte feat;
/* Where we came from */
prev_dir = find_prevdir;
/* Access grid */
c_ptr = &cave[row][col];
+ /* Feature code (applying "mimic" field) */
+ feat = c_ptr->mimic ? c_ptr->mimic : f_info[c_ptr->feat].mimic;
/* Visible monsters abort running */
if (c_ptr->m_idx)
bool notice = TRUE;
/* Examine the terrain */
- switch (c_ptr->feat)
+ switch (feat)
{
/* Floors */
case FEAT_FLOOR:
/* Invis traps */
case FEAT_INVIS:
- /* Secret doors */
- case FEAT_SECRET:
-
/* Normal veins */
case FEAT_MAGMA:
case FEAT_QUARTZ:
case FEAT_SHAL_LAVA:
{
/* Ignore */
- if (p_ptr->invuln || p_ptr->immune_fire) notice = FALSE;
+ if (IS_INVULN() || p_ptr->immune_fire) notice = FALSE;
/* Done */
break;
inv = FALSE;
}
- /* Analyze unknown grids and floors */
-/* if (inv || cave_floor_bold(row, col) || */
-/* (cave[row][col].feat == FEAT_TREES)) */
- if (inv || cave_floor_bold(row, col))
+ /* Analyze unknown grids and floors considering mimic */
+ if (inv || (!(feat & 0x20)))
{
/* Looking for open area */
if (find_openarea)
/* Access grid */
c_ptr = &cave[row][col];
+ /* Feature code (applying "mimic" field) */
+ feat = c_ptr->mimic ? c_ptr->mimic : f_info[c_ptr->feat].mimic;
+
/* Unknown grid or non-wall XXX XXX XXX cave_floor_grid(c_ptr)) */
if (!(c_ptr->info & (CAVE_MARK)) ||
- ((c_ptr->feat < FEAT_SECRET) ||
- (c_ptr->feat == FEAT_FLOWER) ||
- (c_ptr->feat == FEAT_DEEP_GRASS) ||
- ((c_ptr->feat >= FEAT_DEEP_WATER) &&
- (c_ptr->feat <= FEAT_GRASS))))
+ ((feat <= FEAT_DOOR_TAIL) ||
+ (feat == FEAT_FLOWER) ||
+ (feat == FEAT_DEEP_GRASS) ||
+ ((feat >= FEAT_DEEP_WATER) &&
+ (feat <= FEAT_GRASS))))
{
/* Looking to break right */
/* Access grid */
c_ptr = &cave[row][col];
+ /* Feature code (applying "mimic" field) */
+ feat = c_ptr->mimic ? c_ptr->mimic : f_info[c_ptr->feat].mimic;
+
/* Unknown grid or non-wall XXX XXX XXX cave_floor_grid(c_ptr)) */
if (!(c_ptr->info & (CAVE_MARK)) ||
- ((c_ptr->feat < FEAT_SECRET) ||
- (c_ptr->feat == FEAT_FLOWER) ||
- (c_ptr->feat == FEAT_DEEP_GRASS) ||
- ((c_ptr->feat >= FEAT_DEEP_WATER) &&
- (c_ptr->feat <= FEAT_GRASS))))
+ ((feat <= FEAT_DOOR_TAIL) ||
+ (feat == FEAT_FLOWER) ||
+ (feat == FEAT_DEEP_GRASS) ||
+ ((feat >= FEAT_DEEP_WATER) &&
+ (feat <= FEAT_GRASS))))
{
/* Looking to break left */
/* Start running */
if (dir)
{
+ cave_type *c_ptr;
+ byte feat;
+
+ /* Access grid */
+ c_ptr = &cave[py+ddy[dir]][px+ddx[dir]];
+
+ /* Feature code (applying "mimic" field) */
+ feat = c_ptr->mimic ? c_ptr->mimic : f_info[c_ptr->feat].mimic;
+
/* Hack -- do not start silly run */
if (see_wall(dir, py, px) &&
- (cave[py+ddy[dir]][px+ddx[dir]].feat != FEAT_TREES))
+ (feat != FEAT_TREES))
{
/* Message */
#ifdef JP
#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;