bool explode = FALSE;
bool do_silly_attack = (one_in_(2) && target_ptr->image);
HIT_POINT get_damage = 0;
- int abbreviate = 0; // 2回目以降の省略表現フラグ
+ int abbreviate = 0; // 2回目以降の省略表現フラグ.
- /* Not allowed to attack */
if (r_ptr->flags1 & (RF1_NEVER_BLOW))
return FALSE;
if (d_info[target_ptr->dungeon_idx].flags1 & DF1_NO_MELEE)
return FALSE;
- /* ...nor if friendly */
if (!is_hostile(m_ptr))
return FALSE;
- /* Extract the effective monster level */
rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
-
- /* Get the monster name (or "it") */
monster_desc(target_ptr, m_name, m_ptr, 0);
-
monster_desc(target_ptr, ddesc, m_ptr, MD_WRONGDOER_NAME);
-
if (target_ptr->special_defense & KATA_IAI) {
msg_format(_("相手が襲いかかる前に素早く武器を振るった。", "You took sen, drew and cut in one motion before %s moved."), m_name);
if (do_cmd_attack(target_ptr, m_ptr->fy, m_ptr->fx, HISSATSU_IAI))
return TRUE;
}
- /* Assume no blink */
blinked = FALSE;
-
- /* Scan through all four blows */
for (int ap_cnt = 0; ap_cnt < 4; ap_cnt++) {
bool obvious = FALSE;
-
HIT_POINT power = 0;
HIT_POINT damage = 0;
-
concptr act = NULL;
- /* Extract the attack infomation */
int effect = r_ptr->blow[ap_cnt].effect;
rbm_type method = r_ptr->blow[ap_cnt].method;
int d_dice = r_ptr->blow[ap_cnt].d_dice;
if (!monster_is_valid(m_ptr))
break;
- /* Hack -- no more attacks */
if (!method)
break;
d_dice /= 10;
}
- /* Stop if player is dead or gone */
if (!target_ptr->playing || target_ptr->is_dead)
break;
+
if (distance(target_ptr->y, target_ptr->x, m_ptr->fy, m_ptr->fx) > 1)
break;
- /* Handle "leaving" */
if (target_ptr->leaving)
break;
if (method == RBM_SHOOT)
continue;
- /* Extract the attack "power" */
power = mbe_info[effect].power;
-
- /* Total armor */
ac = target_ptr->ac + target_ptr->to_a;
-
- /* Monster hits player */
if (!effect || check_hit_from_monster_to_player(target_ptr, power, rlev, MON_STUNNED(m_ptr))) {
- /* Always disturbing */
disturb(target_ptr, TRUE, TRUE);
-
- /* Hack -- Apply "protection from evil" */
if ((target_ptr->protevil > 0) && (r_ptr->flags3 & RF3_EVIL) && (target_ptr->lev >= rlev) && ((randint0(100) + target_ptr->lev) > 50)) {
- /* Remember the Evil-ness */
if (is_original_ap_and_seen(target_ptr, m_ptr))
r_ptr->r_flags3 |= RF3_EVIL;
msg_format("撃退した。");
else
msg_format("%^sは撃退された。", m_name);
+
abbreviate = 1; /*2回目以降は省略 */
#else
msg_format("%^s is repelled.", m_name);
continue;
}
- /* Assume no cut or stun */
do_cut = do_stun = 0;
-
- /* Describe the attack method */
switch (method) {
case RBM_HIT: {
act = _("殴られた。", "hits you.");
sound(SOUND_HIT);
break;
}
-
case RBM_TOUCH: {
act = _("触られた。", "touches you.");
touched = TRUE;
sound(SOUND_TOUCH);
break;
}
-
case RBM_PUNCH: {
act = _("パンチされた。", "punches you.");
touched = TRUE;
sound(SOUND_HIT);
break;
}
-
case RBM_KICK: {
act = _("蹴られた。", "kicks you.");
touched = TRUE;
sound(SOUND_HIT);
break;
}
-
case RBM_CLAW: {
act = _("ひっかかれた。", "claws you.");
touched = TRUE;
sound(SOUND_CLAW);
break;
}
-
case RBM_BITE: {
act = _("噛まれた。", "bites you.");
do_cut = 1;
sound(SOUND_BITE);
break;
}
-
case RBM_STING: {
act = _("刺された。", "stings you.");
touched = TRUE;
sound(SOUND_STING);
break;
}
-
case RBM_SLASH: {
act = _("斬られた。", "slashes you.");
touched = TRUE;
sound(SOUND_CLAW);
break;
}
-
case RBM_BUTT: {
act = _("角で突かれた。", "butts you.");
do_stun = 1;
sound(SOUND_HIT);
break;
}
-
case RBM_CRUSH: {
act = _("体当たりされた。", "crushes you.");
do_stun = 1;
sound(SOUND_CRUSH);
break;
}
-
case RBM_ENGULF: {
act = _("飲み込まれた。", "engulfs you.");
touched = TRUE;
sound(SOUND_CRUSH);
break;
}
-
case RBM_CHARGE: {
abbreviate = -1;
act = _("は請求書をよこした。", "charges you.");
touched = TRUE;
- sound(SOUND_BUY); /* Note! This is "charges", not "charges at". */
+
+ /* このコメントはジョークが効いているので残しておく / Note! This is "charges", not "charges at". */
+ sound(SOUND_BUY);
break;
}
-
case RBM_CRAWL: {
abbreviate = -1;
act = _("が体の上を這い回った。", "crawls on you.");
sound(SOUND_SLIME);
break;
}
-
case RBM_DROOL: {
act = _("よだれをたらされた。", "drools on you.");
sound(SOUND_SLIME);
break;
}
-
case RBM_SPIT: {
act = _("唾を吐かれた。", "spits on you.");
sound(SOUND_SLIME);
break;
}
-
case RBM_EXPLODE: {
abbreviate = -1;
act = _("は爆発した。", "explodes.");
explode = TRUE;
break;
}
-
case RBM_GAZE: {
act = _("にらまれた。", "gazes at you.");
break;
}
-
case RBM_WAIL: {
act = _("泣き叫ばれた。", "wails at you.");
sound(SOUND_WAIL);
break;
}
-
case RBM_SPORE: {
act = _("胞子を飛ばされた。", "releases spores at you.");
sound(SOUND_SLIME);
break;
}
-
case RBM_XXX4: {
abbreviate = -1;
act = _("が XXX4 を発射した。", "projects XXX4's at you.");
break;
}
-
case RBM_BEG: {
act = _("金をせがまれた。", "begs you for money.");
sound(SOUND_MOAN);
break;
}
-
case RBM_INSULT: {
#ifdef JP
abbreviate = -1;
sound(SOUND_MOAN);
break;
}
-
case RBM_MOAN: {
#ifdef JP
abbreviate = -1;
sound(SOUND_MOAN);
break;
}
-
case RBM_SHOW: {
#ifdef JP
abbreviate = -1;
msg_format("%s", act);
else /* if (abbreviate == -1) */
msg_format("%^s%s", m_name, act);
- abbreviate = 1; /*2回目以降は省略 */
+ abbreviate = 1; /*2回目以降は省略 */
#else
msg_format("%^s %s%s", m_name, act, do_silly_attack ? " you." : "");
#endif
}
- /* Hack -- assume all attacks are obvious */
obvious = TRUE;
-
- /* Roll out the damage */
damage = damroll(d_dice, d_side);
-
- /*
- * Skip the effect when exploding, since the explosion
- * already causes the effect.
- */
if (explode)
damage = 0;
- /* Apply appropriate damage */
+
switch (effect) {
case 0: {
obvious = TRUE;
damage = 0;
break;
}
-
case RBE_SUPERHURT: /* AC軽減あり / Player armor reduces total damage */
{
if (((randint1(rlev * 2 + 300) > (ac + 200)) || one_in_(13)) && !check_multishadow(target_ptr)) {
int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
msg_print(_("痛恨の一撃!", "It was a critical hit!"));
tmp_damage = MAX(damage, tmp_damage * 2);
-
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, tmp_damage, ddesc, -1);
break;
}
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
break;
}
-
case RBE_POISON: {
if (explode)
break;
- /* Take "poison" effect */
if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr)) && !check_multishadow(target_ptr)) {
if (set_poisoned(target_ptr, target_ptr->poisoned + randint1(rlev) + 5)) {
obvious = TRUE;
}
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
- /* Learn about the player */
update_smart_learn(target_ptr, m_idx, DRS_POIS);
-
break;
}
-
case RBE_UN_BONUS: {
if (explode)
break;
- /* Allow complete resist */
if (!target_ptr->resist_disen && !check_multishadow(target_ptr)) {
- /* Apply disenchantment */
if (apply_disenchant(target_ptr, 0)) {
- /* Hack -- Update AC */
update_creature(target_ptr);
obvious = TRUE;
}
}
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
- /* Learn about the player */
update_smart_learn(target_ptr, m_idx, DRS_DISEN);
-
break;
}
-
case RBE_UN_POWER: {
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
if (target_ptr->is_dead || check_multishadow(target_ptr))
break;
- /* Find an item */
for (k = 0; k < 10; k++) {
- /* Pick an item */
INVENTORY_IDX i = (INVENTORY_IDX)randint0(INVEN_PACK);
-
- /* Obtain the item */
o_ptr = &target_ptr->inventory_list[i];
if (!o_ptr->k_idx)
continue;
- /* Drain charged wands/staffs */
if (((o_ptr->tval == TV_STAFF) || (o_ptr->tval == TV_WAND)) && (o_ptr->pval)) {
- /* Calculate healed hitpoints */
int heal = rlev * o_ptr->pval;
if (o_ptr->tval == TV_STAFF)
heal *= o_ptr->number;
- /* Don't heal more than max hp */
heal = MIN(heal, m_ptr->maxhp - m_ptr->hp);
-
msg_print(_("ザックからエネルギーが吸い取られた!", "Energy drains from your pack!"));
-
obvious = TRUE;
-
- /* Heal the monster */
m_ptr->hp += (HIT_POINT)heal;
-
- /* Redraw (later) if needed */
if (target_ptr->health_who == m_idx)
target_ptr->redraw |= (PR_HEALTH);
+
if (target_ptr->riding == m_idx)
target_ptr->redraw |= (PR_UHEALTH);
- /* Uncharge */
o_ptr->pval = 0;
-
- /* Combine / Reorder the pack */
target_ptr->update |= (PU_COMBINE | PU_REORDER);
target_ptr->window |= (PW_INVEN);
-
break;
}
}
break;
}
-
case RBE_EAT_GOLD: {
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
- /* Confused monsters cannot steal successfully. -LM-*/
if (MON_CONFUSED(m_ptr))
break;
break;
obvious = TRUE;
-
- /* Saving throw (unless paralyzed) based on dex and level */
if (!target_ptr->paralyzed && (randint0(100) < (adj_dex_safe[target_ptr->stat_ind[A_DEX]] + target_ptr->lev))) {
- /* Saving throw message */
msg_print(_("しかし素早く財布を守った!", "You quickly protect your money pouch!"));
-
- /* Occasional blink anyway */
if (randint0(3))
blinked = TRUE;
}
-
- /* Eat gold */
else {
gold = (target_ptr->au / 10) + randint1(25);
if (gold < 2)
chg_virtue(target_ptr, V_SACRIFICE, 2);
}
- /* Redraw gold */
target_ptr->redraw |= (PR_GOLD);
-
target_ptr->window |= (PW_PLAYER);
-
- /* Blink away */
blinked = TRUE;
}
break;
}
-
case RBE_EAT_ITEM: {
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
- /* Confused monsters cannot steal successfully. -LM-*/
if (MON_CONFUSED(m_ptr))
break;
if (target_ptr->is_dead || check_multishadow(target_ptr))
break;
- /* Saving throw (unless paralyzed) based on dex and level */
if (!target_ptr->paralyzed && (randint0(100) < (adj_dex_safe[target_ptr->stat_ind[A_DEX]] + target_ptr->lev))) {
- /* Saving throw message */
msg_print(_("しかしあわててザックを取り返した!", "You grab hold of your backpack!"));
-
- /* Occasional "blink" anyway */
blinked = TRUE;
obvious = TRUE;
break;
}
- /* Find an item */
for (k = 0; k < 10; k++) {
OBJECT_IDX o_idx;
-
- /* Pick an item */
INVENTORY_IDX i = (INVENTORY_IDX)randint0(INVEN_PACK);
-
- /* Obtain the item */
o_ptr = &target_ptr->inventory_list[i];
if (!o_ptr->k_idx)
continue;
- /* Skip artifacts */
if (object_is_artifact(o_ptr))
continue;
object_desc(target_ptr, o_name, o_ptr, OD_OMIT_PREFIX);
-
#ifdef JP
msg_format("%s(%c)を%s盗まれた!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
#else
#endif
chg_virtue(target_ptr, V_SACRIFICE, 1);
o_idx = o_pop(floor_ptr);
-
- /* Success */
if (o_idx) {
object_type *j_ptr;
j_ptr = &floor_ptr->o_list[o_idx];
object_copy(j_ptr, o_ptr);
-
- /* Modify number */
j_ptr->number = 1;
-
- /* Hack -- If a rod or wand, allocate total
- * maximum timeouts or charges between those
- * stolen and those missed. -LM-
- */
if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND)) {
j_ptr->pval = o_ptr->pval / o_ptr->number;
o_ptr->pval -= j_ptr->pval;
}
- /* Forget mark */
j_ptr->marked = OM_TOUCHED;
-
- /* Memorize monster */
j_ptr->held_m_idx = m_idx;
-
- /* Build stack */
j_ptr->next_o_idx = m_ptr->hold_o_idx;
-
- /* Build stack */
m_ptr->hold_o_idx = o_idx;
}
- /* Steal the items */
inven_item_increase(target_ptr, i, -1);
inven_item_optimize(target_ptr, i);
-
obvious = TRUE;
-
- /* Blink away */
blinked = TRUE;
-
break;
}
case RBE_EAT_FOOD: {
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
if (target_ptr->is_dead || check_multishadow(target_ptr))
break;
- /* Steal some food */
for (k = 0; k < 10; k++) {
- /* Pick an item from the pack */
INVENTORY_IDX i = (INVENTORY_IDX)randint0(INVEN_PACK);
-
o_ptr = &target_ptr->inventory_list[i];
if (!o_ptr->k_idx)
continue;
- /* Skip non-food objects */
if ((o_ptr->tval != TV_FOOD) && !((o_ptr->tval == TV_CORPSE) && (o_ptr->sval)))
continue;
object_desc(target_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
-
#ifdef JP
msg_format("%s(%c)を%s食べられてしまった!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
#else
msg_format("%sour %s (%c) was eaten!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
#endif
-
- /* Steal the items */
inven_item_increase(target_ptr, i, -1);
inven_item_optimize(target_ptr, i);
-
obvious = TRUE;
-
break;
}
break;
}
-
case RBE_EAT_LITE: {
- /* Access the lite */
o_ptr = &target_ptr->inventory_list[INVEN_LITE];
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
if (target_ptr->is_dead || check_multishadow(target_ptr))
break;
- /* Drain fuel */
if ((o_ptr->xtra4 > 0) && (!object_is_fixed_artifact(o_ptr))) {
- /* Reduce fuel */
o_ptr->xtra4 -= (s16b)(250 + randint1(250));
if (o_ptr->xtra4 < 1)
o_ptr->xtra4 = 1;
break;
}
-
case RBE_ACID: {
if (explode)
break;
+
obvious = TRUE;
msg_print(_("酸を浴びせられた!", "You are covered in acid!"));
get_damage += acid_dam(target_ptr, damage, ddesc, -1, FALSE);
update_smart_learn(target_ptr, m_idx, DRS_ACID);
break;
}
-
case RBE_ELEC: {
if (explode)
break;
update_smart_learn(target_ptr, m_idx, DRS_ELEC);
break;
}
-
case RBE_FIRE: {
if (explode)
break;
update_smart_learn(target_ptr, m_idx, DRS_FIRE);
break;
}
-
case RBE_COLD: {
if (explode)
break;
update_smart_learn(target_ptr, m_idx, DRS_COLD);
break;
}
-
case RBE_BLIND: {
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
if (target_ptr->is_dead)
break;
- /* Increase "blind" */
if (!target_ptr->resist_blind && !check_multishadow(target_ptr)) {
if (set_blind(target_ptr, target_ptr->blind + 10 + randint1(rlev))) {
#ifdef JP
}
}
- /* Learn about the player */
update_smart_learn(target_ptr, m_idx, DRS_BLIND);
-
break;
}
-
case RBE_CONFUSE: {
if (explode)
break;
- get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
if (target_ptr->is_dead)
break;
- /* Increase "confused" */
if (!target_ptr->resist_conf && !check_multishadow(target_ptr)) {
if (set_confused(target_ptr, target_ptr->confused + 3 + randint1(rlev))) {
obvious = TRUE;
}
}
- /* Learn about the player */
update_smart_learn(target_ptr, m_idx, DRS_CONF);
-
break;
}
-
case RBE_TERRIFY: {
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
if (target_ptr->is_dead)
break;
- /* Increase "afraid" */
if (check_multishadow(target_ptr)) {
/* Do nothing */
} else if (target_ptr->resist_fear) {
}
}
- /* Learn about the player */
update_smart_learn(target_ptr, m_idx, DRS_FEAR);
-
break;
}
-
case RBE_PARALYZE: {
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
if (target_ptr->is_dead)
break;
- /* Increase "paralyzed" */
if (check_multishadow(target_ptr)) {
/* Do nothing */
} else if (target_ptr->free_act) {
}
}
- /* Learn about the player */
update_smart_learn(target_ptr, m_idx, DRS_FREE);
-
break;
}
-
case RBE_LOSE_STR: {
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
if (target_ptr->is_dead || check_multishadow(target_ptr))
break;
+
if (do_dec_stat(target_ptr, A_STR))
obvious = TRUE;
break;
}
-
case RBE_LOSE_INT: {
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
if (target_ptr->is_dead || check_multishadow(target_ptr))
break;
+
if (do_dec_stat(target_ptr, A_INT))
obvious = TRUE;
break;
}
-
case RBE_LOSE_WIS: {
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
if (target_ptr->is_dead || check_multishadow(target_ptr))
break;
+
if (do_dec_stat(target_ptr, A_WIS))
obvious = TRUE;
break;
}
-
case RBE_LOSE_DEX: {
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
if (target_ptr->is_dead || check_multishadow(target_ptr))
break;
+
if (do_dec_stat(target_ptr, A_DEX))
obvious = TRUE;
break;
}
-
case RBE_LOSE_CON: {
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
if (target_ptr->is_dead || check_multishadow(target_ptr))
break;
+
if (do_dec_stat(target_ptr, A_CON))
obvious = TRUE;
break;
}
-
case RBE_LOSE_CHR: {
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
if (target_ptr->is_dead || check_multishadow(target_ptr))
break;
+
if (do_dec_stat(target_ptr, A_CHR))
obvious = TRUE;
break;
}
-
case RBE_LOSE_ALL: {
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
if (target_ptr->is_dead || check_multishadow(target_ptr))
break;
- /* Damage (stats) */
if (do_dec_stat(target_ptr, A_STR))
obvious = TRUE;
+
if (do_dec_stat(target_ptr, A_DEX))
obvious = TRUE;
+
if (do_dec_stat(target_ptr, A_CON))
obvious = TRUE;
+
if (do_dec_stat(target_ptr, A_INT))
obvious = TRUE;
+
if (do_dec_stat(target_ptr, A_WIS))
obvious = TRUE;
+
if (do_dec_stat(target_ptr, A_CHR))
obvious = TRUE;
break;
}
-
case RBE_SHATTER: {
obvious = TRUE;
-
- /* Hack -- Reduce damage based on the player armor class */
damage -= (damage * ((ac < 150) ? ac : 150) / 250);
-
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
- /* Radius 8 earthquake centered at the monster */
- if (damage > 23 || explode) {
+ if (damage > 23 || explode)
earthquake(target_ptr, m_ptr->fy, m_ptr->fx, 8, m_idx);
- }
break;
}
-
case RBE_EXP_10: {
s32b d = damroll(10, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
-
obvious = TRUE;
-
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
if (target_ptr->is_dead || check_multishadow(target_ptr))
break;
(void)drain_exp(target_ptr, d, d / 10, 95);
break;
}
-
case RBE_EXP_20: {
s32b d = damroll(20, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
-
obvious = TRUE;
-
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
if (target_ptr->is_dead || check_multishadow(target_ptr))
break;
(void)drain_exp(target_ptr, d, d / 10, 90);
break;
}
-
case RBE_EXP_40: {
s32b d = damroll(40, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
-
obvious = TRUE;
-
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
if (target_ptr->is_dead || check_multishadow(target_ptr))
break;
(void)drain_exp(target_ptr, d, d / 10, 75);
break;
}
-
case RBE_EXP_80: {
s32b d = damroll(80, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
-
obvious = TRUE;
-
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
if (target_ptr->is_dead || check_multishadow(target_ptr))
break;
(void)drain_exp(target_ptr, d, d / 10, 50);
break;
}
-
case RBE_DISEASE: {
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
if (target_ptr->is_dead || check_multishadow(target_ptr))
break;
- /* Take "poison" effect */
if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr))) {
if (set_poisoned(target_ptr, target_ptr->poisoned + randint1(rlev) + 5)) {
obvious = TRUE;
}
}
- /* Damage CON (10% chance)*/
if ((randint1(100) < 11) && (target_ptr->prace != RACE_ANDROID)) {
- /* 1% chance for perm. damage */
bool perm = one_in_(10);
if (dec_stat(target_ptr, A_CON, randint1(10), perm)) {
msg_print(_("病があなたを蝕んでいる気がする。", "You feel sickly."));
case RBE_TIME: {
if (explode)
break;
+
if (!target_ptr->resist_time && !check_multishadow(target_ptr)) {
switch (randint1(10)) {
case 1:
lose_exp(target_ptr, 100 + (target_ptr->exp / 100) * MON_DRAIN_LIFE);
break;
}
-
case 6:
case 7:
case 8:
case 9: {
int stat = randint0(6);
-
switch (stat) {
#ifdef JP
case A_STR:
target_ptr->stat_cur[stat] = (target_ptr->stat_cur[stat] * 3) / 4;
if (target_ptr->stat_cur[stat] < 3)
target_ptr->stat_cur[stat] = 3;
+
target_ptr->update |= (PU_BONUS);
break;
}
-
case 10: {
msg_print(_("あなたは以前ほど力強くなくなってしまった...。", "You're not as powerful as you used to be..."));
-
for (k = 0; k < A_MAX; k++) {
target_ptr->stat_cur[k] = (target_ptr->stat_cur[k] * 7) / 8;
if (target_ptr->stat_cur[k] < 3)
target_ptr->stat_cur[k] = 3;
}
+
target_ptr->update |= (PU_BONUS);
break;
}
}
}
- get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
+ get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
break;
}
case RBE_DR_LIFE: {
s32b d = damroll(60, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
bool resist_drain;
-
obvious = TRUE;
-
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
if (target_ptr->is_dead || check_multishadow(target_ptr))
break;
resist_drain = !drain_exp(target_ptr, d, d / 10, 50);
-
- /* Heal the attacker? */
if (target_ptr->mimic_form) {
if (mimic_info[target_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
resist_drain = TRUE;
if ((damage > 5) && !resist_drain) {
bool did_heal = FALSE;
-
if (m_ptr->hp < m_ptr->maxhp)
did_heal = TRUE;
- /* Heal */
m_ptr->hp += damroll(4, damage / 6);
if (m_ptr->hp > m_ptr->maxhp)
m_ptr->hp = m_ptr->maxhp;
- /* Redraw (later) if needed */
if (target_ptr->health_who == m_idx)
target_ptr->redraw |= (PR_HEALTH);
+
if (target_ptr->riding == m_idx)
target_ptr->redraw |= (PR_UHEALTH);
- /* Special message */
if (m_ptr->ml && did_heal) {
msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), m_name);
}
}
case RBE_DR_MANA: {
obvious = TRUE;
-
if (check_multishadow(target_ptr)) {
msg_print(_("攻撃は幻影に命中し、あなたには届かなかった。", "The attack hits Shadow, but you are unharmed!"));
} else {
do_cut = 0;
-
target_ptr->csp -= damage;
if (target_ptr->csp < 0) {
target_ptr->csp = 0;
target_ptr->redraw |= (PR_MANA);
}
- /* Learn about the player */
update_smart_learn(target_ptr, m_idx, DRS_MANA);
-
break;
}
case RBE_INERTIA: {
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
if (target_ptr->is_dead)
break;
- /* Decrease speed */
if (check_multishadow(target_ptr)) {
/* Do nothing */
} else {
}
case RBE_STUN: {
get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
-
if (target_ptr->is_dead)
break;
- /* Decrease speed */
if (target_ptr->resist_sound || check_multishadow(target_ptr)) {
/* Do nothing */
} else {
}
}
- /* Hack -- only one of cut or stun */
+ // TODO 三項演算子に差し替え.
if (do_cut && do_stun) {
- /* Cancel cut */
if (randint0(100) < 50) {
do_cut = 0;
}
-
- /* Cancel stun */
else {
do_stun = 0;
}
}
- /* Handle cut */
if (do_cut) {
int cut_plus = 0;
-
- /* Critical hit (zero if non-critical) */
tmp = calc_monster_critical(d_dice, d_side, damage);
-
- /* Roll for damage */
switch (tmp) {
case 0:
cut_plus = 0;
break;
}
- /* Apply the cut */
if (cut_plus)
(void)set_cut(target_ptr, target_ptr->cut + cut_plus);
}
- /* Handle stun */
if (do_stun) {
int stun_plus = 0;
-
- /* Critical hit (zero if non-critical) */
tmp = calc_monster_critical(d_dice, d_side, damage);
-
- /* Roll for damage */
switch (tmp) {
case 0:
stun_plus = 0;
break;
}
- /* Apply the stun */
if (stun_plus)
(void)set_stun(target_ptr, target_ptr->stun + stun_plus);
}
if (target_ptr->sh_fire && alive && !target_ptr->is_dead) {
if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK)) {
HIT_POINT dam = damroll(2, 6);
-
- /* Modify the damage */
dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
-
msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), m_name);
-
if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は灰の山になった。", " turns into a pile of ash."))) {
blinked = FALSE;
alive = FALSE;
}
+
} else {
if (is_original_ap_and_seen(target_ptr, m_ptr))
r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
if (target_ptr->sh_elec && alive && !target_ptr->is_dead) {
if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK)) {
HIT_POINT dam = damroll(2, 6);
-
- /* Modify the damage */
dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
-
msg_format(_("%^sは電撃をくらった!", "%^s gets zapped!"), m_name);
if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は燃え殻の山になった。", " turns into a pile of cinder."))) {
blinked = FALSE;
if (target_ptr->sh_cold && alive && !target_ptr->is_dead) {
if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK)) {
HIT_POINT dam = damroll(2, 6);
-
- /* Modify the damage */
dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
-
msg_format(_("%^sは冷気をくらった!", "%^s is very cold!"), m_name);
if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は凍りついた。", " was frozen."))) {
blinked = FALSE;
}
}
- /* by henkma */
if (target_ptr->dustrobe && alive && !target_ptr->is_dead) {
if (!(r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK)) {
HIT_POINT dam = damroll(2, 6);
-
- /* Modify the damage */
dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
-
msg_format(_("%^sは鏡の破片をくらった!", "%^s gets zapped!"), m_name);
if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("はズタズタになった。", " had torn to pieces."))) {
blinked = FALSE;
if (r_ptr->flags3 & RF3_EVIL) {
if (!(r_ptr->flagsr & RFR_RES_ALL)) {
HIT_POINT dam = damroll(2, 6);
-
- /* Modify the damage */
dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
-
msg_format(_("%^sは聖なるオーラで傷ついた!", "%^s is injured by holy power!"), m_name);
if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed."))) {
blinked = FALSE;
if (target_ptr->tim_sh_touki && alive && !target_ptr->is_dead) {
if (!(r_ptr->flagsr & RFR_RES_ALL)) {
HIT_POINT dam = damroll(2, 6);
-
- /* Modify the damage */
dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
-
msg_format(_("%^sが鋭い闘気のオーラで傷ついた!", "%^s is injured by the Force"), m_name);
if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed."))) {
blinked = FALSE;
if (hex_spelling(target_ptr, HEX_SHADOW_CLOAK) && alive && !target_ptr->is_dead) {
HIT_POINT dam = 1;
object_type *o_armed_ptr = &target_ptr->inventory_list[INVEN_RARM];
-
if (!(r_ptr->flagsr & RFR_RES_ALL || r_ptr->flagsr & RFR_RES_DARK)) {
if (o_armed_ptr->k_idx) {
int basedam = ((o_armed_ptr->dd + target_ptr->to_dd[0]) * (o_armed_ptr->ds + target_ptr->to_ds[0] + 1));
dam = basedam / 2 + o_armed_ptr->to_d + target_ptr->to_d[0];
}
- /* Cursed armor makes damages doubled */
o_armed_ptr = &target_ptr->inventory_list[INVEN_BODY];
if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr))
dam *= 2;
- /* Modify the damage */
dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
-
msg_format(_("影のオーラが%^sに反撃した!", "Enveloping shadows attack %^s."), m_name);
if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed."))) {
blinked = FALSE;
}
}
}
-
- /* Monster missed player */
else {
- /* Analyze failed attacks */
switch (method) {
case RBM_HIT:
case RBM_TOUCH:
case RBM_CRUSH:
case RBM_ENGULF:
case RBM_CHARGE:
-
- /* Visible monsters */
if (m_ptr->ml) {
disturb(target_ptr, TRUE, TRUE);
-
#ifdef JP
if (abbreviate)
msg_format("%sかわした。", (target_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "");
else
msg_format("%s%^sの攻撃をかわした。", (target_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "", m_name);
- abbreviate = 1; /*2回目以降は省略 */
+
+ abbreviate = 1; /*2回目以降は省略 */
#else
msg_format("%^s misses you.", m_name);
#endif
}
- /* Gain shield experience */
if (object_is_armour(&target_ptr->inventory_list[INVEN_RARM]) || object_is_armour(&target_ptr->inventory_list[INVEN_LARM])) {
int cur = target_ptr->skill_exp[GINOU_SHIELD];
int max = s_info[target_ptr->pclass].s_max[GINOU_SHIELD];
-
if (cur < max) {
DEPTH targetlevel = r_ptr->level;
int inc = 0;
-
- /* Extra experience */
if ((cur / 100) < targetlevel) {
if ((cur / 100 + 15) < targetlevel)
inc += 1 + (targetlevel - (cur / 100 + 15));
}
damage = 0;
-
break;
}
}
- /* Analyze "visible" monsters only */
if (is_original_ap_and_seen(target_ptr, m_ptr) && !do_silly_attack) {
- /* Count "obvious" attacks (and ones that cause damage) */
if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10)) {
- /* Count attacks of this type */
if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR) {
r_ptr->r_blows[ap_cnt]++;
}
}
}
- /* Hex - revenge damage stored */
revenge_store(target_ptr, get_damage);
-
if ((target_ptr->tim_eyeeye || hex_spelling(target_ptr, HEX_EYE_FOR_EYE)) && get_damage > 0 && !target_ptr->is_dead) {
#ifdef JP
msg_format("攻撃が%s自身を傷つけた!", m_name);
#else
GAME_TEXT m_name_self[80];
-
- /* hisself */
monster_desc(target_ptr, m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE);
-
msg_format("The attack of %s has wounded %s!", m_name, m_name_self);
#endif
project(target_ptr, 0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1);
if ((target_ptr->counter || (target_ptr->special_defense & KATA_MUSOU)) && alive && !target_ptr->is_dead && m_ptr->ml && (target_ptr->csp > 7)) {
char m_target_name[MAX_NLEN];
monster_desc(target_ptr, m_target_name, m_ptr, 0);
-
target_ptr->csp -= 7;
msg_format(_("%^sに反撃した!", "You counterattacked %s!"), m_target_name);
do_cmd_attack(target_ptr, m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
target_ptr->redraw |= (PR_MANA);
}
- /* Blink away */
if (blinked && alive && !target_ptr->is_dead) {
if (teleport_barrier(target_ptr, m_idx)) {
msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But a magic barrier obstructs it."));
}
}
- /* Always notice cause of death */
- if (target_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !floor_ptr->inside_arena) {
+ if (target_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !floor_ptr->inside_arena)
r_ptr->r_deaths++;
- }
if (m_ptr->ml && fear && alive && !target_ptr->is_dead) {
sound(SOUND_FLEE);