* @param rad Ⱦ·Â
* @param breath TRUE¤Ê¤é¤Ð¥Ö¥ì¥¹ / FALSE¤Ê¤é¤Ð¥Ü¡¼¥ë
* @param monspell Æü칶·â¤ÎID
- * @param learnable ¥é¡¼¥Ë¥ó¥°²Äǽ¤ÊÁ°Äó¤¬Â·¤Ã¤Æ¤¤¤ë¤Ê¤é¤ÐTRUE
* @return ¤Ê¤·
* @details
* Pass over any monsters that may be in the way
* Affect grids, objects, monsters, and the player
*/
-void monst_breath_monst(int m_idx, int y, int x, int typ, int dam_hp, int rad, bool breath, int monspell, bool learnable)
+void monst_breath_monst(int m_idx, int y, int x, int typ, int dam_hp, int rad, bool breath, int monspell)
{
int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
+ bool learnable = spell_learnable(m_idx);
monster_type *m_ptr = &m_list[m_idx];
monster_race *r_ptr = &r_info[m_ptr->r_idx];
* Stop if we hit a monster
* Affect monsters and the player
*/
-static void monst_bolt_monst(int m_idx, int y, int x, int typ, int dam_hp, int monspell, bool learnable)
+static void monst_bolt_monst(int m_idx, int y, int x, int typ, int dam_hp, int monspell)
{
int flg = PROJECT_STOP | PROJECT_KILL;
+ bool learnable = spell_learnable(m_idx);
+
if (typ != GF_ARROW) flg |= PROJECT_REFLECTABLE;
(void)project(m_idx, 0, y, x, dam_hp, typ, flg, (learnable ? monspell : -1));
}
* @param learnable ¥é¡¼¥Ë¥ó¥°²Äǽ¤ÊÁ°Äó¤¬Â·¤Ã¤Æ¤¤¤ë¤Ê¤é¤ÐTRUE
* @return ¤Ê¤·
*/
-static void monst_beam_monst(int m_idx, int y, int x, int typ, int dam_hp, int monspell, bool learnable)
+static void monst_beam_monst(int m_idx, int y, int x, int typ, int dam_hp, int monspell)
{
int flg = PROJECT_BEAM | PROJECT_KILL | PROJECT_THRU;
+ bool learnable = spell_learnable(m_idx);
(void)project(m_idx, 0, y, x, dam_hp, typ, flg, (learnable ? monspell : -1));
}
bool see_m = is_seen(m_ptr);
bool maneable = player_has_los_bold(m_ptr->fy, m_ptr->fx);
- bool learnable = (m_ptr->ml && maneable && !world_monster);
bool see_t;
bool see_either;
bool known;
}
dam = damroll(r_ptr->blow[0].d_dice, r_ptr->blow[0].d_side);
- monst_bolt_monst(m_idx, y, x, GF_ARROW, dam, MS_SHOOT, learnable);
+ monst_bolt_monst(m_idx, y, x, GF_ARROW, dam, MS_SHOOT);
break;
dam = ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3));
monst_breath_monst(m_idx, y, x, GF_ACID,
- dam,0, TRUE, MS_BR_ACID, learnable);
+ dam,0, TRUE, MS_BR_ACID);
break;
dam = ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3));
monst_breath_monst(m_idx, y, x, GF_ELEC,
- dam,0, TRUE, MS_BR_ELEC, learnable);
+ dam,0, TRUE, MS_BR_ELEC);
break;
dam = ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3));
monst_breath_monst(m_idx, y, x, GF_FIRE,
- dam,0, TRUE, MS_BR_FIRE, learnable);
+ dam,0, TRUE, MS_BR_FIRE);
break;
dam = ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3));
monst_breath_monst(m_idx, y, x, GF_COLD,
- dam,0, TRUE, MS_BR_COLD, learnable);
+ dam,0, TRUE, MS_BR_COLD);
break;
/* RF4_BR_POIS */
dam = ((m_ptr->hp / 3) > 800 ? 800 : (m_ptr->hp / 3));
monst_breath_monst(m_idx, y, x, GF_POIS,
- dam,0, TRUE, MS_BR_POIS, learnable);
+ dam,0, TRUE, MS_BR_POIS);
break;
dam = ((m_ptr->hp / 6) > 550 ? 550 : (m_ptr->hp / 6));
monst_breath_monst(m_idx, y, x, GF_NETHER,
- dam,0, TRUE, MS_BR_NETHER, learnable);
+ dam,0, TRUE, MS_BR_NETHER);
break;
dam = ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6));
monst_breath_monst(m_idx, y, x, GF_LITE,
- dam,0, TRUE, MS_BR_LITE, learnable);
+ dam,0, TRUE, MS_BR_LITE);
break;
dam = ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6));
monst_breath_monst(m_idx, y, x, GF_DARK,
- dam,0, TRUE, MS_BR_DARK, learnable);
+ dam,0, TRUE, MS_BR_DARK);
break;
dam = ((m_ptr->hp / 6) > 450 ? 450 : (m_ptr->hp / 6));
monst_breath_monst(m_idx, y, x, GF_CONFUSION,
- dam,0, TRUE, MS_BR_CONF, learnable);
+ dam,0, TRUE, MS_BR_CONF);
break;
dam = ((m_ptr->hp / 6) > 450 ? 450 : (m_ptr->hp / 6));
monst_breath_monst(m_idx, y, x, GF_SOUND,
- dam,0, TRUE, MS_BR_SOUND, learnable);
+ dam,0, TRUE, MS_BR_SOUND);
break;
dam = ((m_ptr->hp / 6) > 600 ? 600 : (m_ptr->hp / 6));
monst_breath_monst(m_idx, y, x, GF_CHAOS,
- dam,0, TRUE, MS_BR_CHAOS, learnable);
+ dam,0, TRUE, MS_BR_CHAOS);
break;
dam = ((m_ptr->hp / 6) > 500 ? 500 : (m_ptr->hp / 6));
monst_breath_monst(m_idx, y, x, GF_DISENCHANT,
- dam,0, TRUE, MS_BR_DISEN, learnable);
+ dam,0, TRUE, MS_BR_DISEN);
break;
dam = ((m_ptr->hp / 3) > 250 ? 250 : (m_ptr->hp / 3));
monst_breath_monst(m_idx, y, x, GF_NEXUS,
- dam,0, TRUE, MS_BR_NEXUS, learnable);
+ dam,0, TRUE, MS_BR_NEXUS);
break;
dam = ((m_ptr->hp / 3) > 150 ? 150 : (m_ptr->hp / 3));
monst_breath_monst(m_idx, y, x, GF_TIME,
- dam,0, TRUE, MS_BR_TIME, learnable);
+ dam,0, TRUE, MS_BR_TIME);
break;
dam = ((m_ptr->hp / 6) > 200 ? 200 : (m_ptr->hp / 6));
monst_breath_monst(m_idx, y, x, GF_INERTIA,
- dam,0, TRUE, MS_BR_INERTIA, learnable);
+ dam,0, TRUE, MS_BR_INERTIA);
break;
dam = ((m_ptr->hp / 3) > 200 ? 200 : (m_ptr->hp / 3));
monst_breath_monst(m_idx, y, x, GF_GRAVITY,
- dam,0, TRUE, MS_BR_GRAVITY, learnable);
+ dam,0, TRUE, MS_BR_GRAVITY);
break;
dam = ((m_ptr->hp / 6) > 500 ? 500 : (m_ptr->hp / 6));
monst_breath_monst(m_idx, y, x, GF_SHARDS,
- dam,0, TRUE, MS_BR_SHARDS, learnable);
+ dam,0, TRUE, MS_BR_SHARDS);
break;
dam = ((m_ptr->hp / 6) > 150 ? 150 : (m_ptr->hp / 6));
monst_breath_monst(m_idx, y, x, GF_PLASMA,
- dam,0, TRUE, MS_BR_PLASMA, learnable);
+ dam,0, TRUE, MS_BR_PLASMA);
break;
dam = ((m_ptr->hp / 6) > 200 ? 200 : (m_ptr->hp / 6));
monst_breath_monst(m_idx, y, x, GF_FORCE,
- dam,0, TRUE, MS_BR_FORCE, learnable);
+ dam,0, TRUE, MS_BR_FORCE);
break;
/* RF4_BR_MANA */
dam = ((m_ptr->hp / 3) > 250 ? 250 : (m_ptr->hp / 3));
monst_breath_monst(m_idx, y, x, GF_MANA,
- dam,0, TRUE, MS_BR_MANA, learnable);
+ dam,0, TRUE, MS_BR_MANA);
break;
dam = (rlev + damroll(10, 6));
monst_breath_monst(m_idx, y, x, GF_NUKE,
- dam, 2, FALSE, MS_BALL_NUKE, learnable);
+ dam, 2, FALSE, MS_BALL_NUKE);
break;
dam = ((m_ptr->hp / 3) > 800 ? 800 : (m_ptr->hp / 3));
monst_breath_monst(m_idx, y, x, GF_NUKE,
- dam,0, TRUE, MS_BR_NUKE, learnable);
+ dam,0, TRUE, MS_BR_NUKE);
break;
/* RF4_BA_CHAO */
dam = (rlev * 2) + damroll(10, 10);
monst_breath_monst(m_idx, y, x, GF_CHAOS,
- dam, 4, FALSE, MS_BALL_CHAOS, learnable);
+ dam, 4, FALSE, MS_BALL_CHAOS);
break;
dam = ((m_ptr->hp / 6) > 150 ? 150 : (m_ptr->hp / 6));
monst_breath_monst(m_idx, y, x, GF_DISINTEGRATE,
- dam,0, TRUE, MS_BR_DISI, learnable);
+ dam,0, TRUE, MS_BR_DISI);
break;
/* RF5_BA_ACID */
rad = 2;
dam = (randint1(rlev * 3) + 15);
}
- monst_breath_monst(m_idx, y, x, GF_ACID, dam, rad, FALSE, MS_BALL_ACID, learnable);
+ monst_breath_monst(m_idx, y, x, GF_ACID, dam, rad, FALSE, MS_BALL_ACID);
break;
/* RF5_BA_ELEC */
rad = 2;
dam = (randint1(rlev * 3 / 2) + 8);
}
- monst_breath_monst(m_idx, y, x, GF_ELEC, dam, rad, FALSE, MS_BALL_ELEC, learnable);
+ monst_breath_monst(m_idx, y, x, GF_ELEC, dam, rad, FALSE, MS_BALL_ELEC);
break;
/* RF5_BA_FIRE */
rad = 2;
dam = (randint1(rlev * 7 / 2) + 10);
}
- monst_breath_monst(m_idx, y, x, GF_FIRE, dam, rad, FALSE, MS_BALL_FIRE, learnable);
+ monst_breath_monst(m_idx, y, x, GF_FIRE, dam, rad, FALSE, MS_BALL_FIRE);
break;
/* RF5_BA_COLD */
rad = 2;
dam = (randint1(rlev * 3 / 2) + 10);
}
- monst_breath_monst(m_idx, y, x, GF_COLD, dam, rad, FALSE, MS_BALL_COLD, learnable);
+ monst_breath_monst(m_idx, y, x, GF_COLD, dam, rad, FALSE, MS_BALL_COLD);
break;
/* RF5_BA_POIS */
}
dam = damroll(12, 2) * ((r_ptr->flags2 & RF2_POWERFUL) ? 2 : 1);
- monst_breath_monst(m_idx, y, x, GF_POIS, dam, 2, FALSE, MS_BALL_POIS, learnable);
+ monst_breath_monst(m_idx, y, x, GF_POIS, dam, 2, FALSE, MS_BALL_POIS);
break;
}
dam = 50 + damroll(10, 10) + (rlev * ((r_ptr->flags2 & RF2_POWERFUL) ? 2 : 1));
- monst_breath_monst(m_idx, y, x, GF_NETHER, dam, 2, FALSE, MS_BALL_NETHER, learnable);
+ monst_breath_monst(m_idx, y, x, GF_NETHER, dam, 2, FALSE, MS_BALL_NETHER);
break;
}
dam = ((r_ptr->flags2 & RF2_POWERFUL) ? randint1(rlev * 3) : randint1(rlev * 2)) + 50;
- monst_breath_monst(m_idx, y, x, GF_WATER, dam, 4, FALSE, MS_BALL_WATER, learnable);
+ monst_breath_monst(m_idx, y, x, GF_WATER, dam, 4, FALSE, MS_BALL_WATER);
break;
}
dam = (rlev * 4) + 50 + damroll(10, 10);
- monst_breath_monst(m_idx, y, x, GF_MANA, dam, 4, FALSE, MS_BALL_MANA, learnable);
+ monst_breath_monst(m_idx, y, x, GF_MANA, dam, 4, FALSE, MS_BALL_MANA);
break;
}
dam = (rlev * 4) + 50 + damroll(10, 10);
- monst_breath_monst(m_idx, y, x, GF_DARK, dam, 4, FALSE, MS_BALL_DARK, learnable);
+ monst_breath_monst(m_idx, y, x, GF_DARK, dam, 4, FALSE, MS_BALL_DARK);
break;
}
dam = ((randint1(rlev) / 2) + 1);
- monst_breath_monst(m_idx, y, x, GF_DRAIN_MANA, dam, 0, FALSE, MS_DRAIN_MANA, learnable);
+ monst_breath_monst(m_idx, y, x, GF_DRAIN_MANA, dam, 0, FALSE, MS_DRAIN_MANA);
break;
}
dam = damroll(7, 7);
- monst_breath_monst(m_idx, y, x, GF_MIND_BLAST, dam, 0, FALSE, MS_MIND_BLAST, learnable);
+ monst_breath_monst(m_idx, y, x, GF_MIND_BLAST, dam, 0, FALSE, MS_MIND_BLAST);
break;
}
dam = damroll(12, 12);
- monst_breath_monst(m_idx, y, x, GF_BRAIN_SMASH, dam, 0, FALSE, MS_BRAIN_SMASH, learnable);
+ monst_breath_monst(m_idx, y, x, GF_BRAIN_SMASH, dam, 0, FALSE, MS_BRAIN_SMASH);
break;
}
dam = damroll(3, 8);
- monst_breath_monst(m_idx, y, x, GF_CAUSE_1, dam, 0, FALSE, MS_CAUSE_1, learnable);
+ monst_breath_monst(m_idx, y, x, GF_CAUSE_1, dam, 0, FALSE, MS_CAUSE_1);
break;
}
dam = damroll(8, 8);
- monst_breath_monst(m_idx, y, x, GF_CAUSE_2, dam, 0, FALSE, MS_CAUSE_2, learnable);
+ monst_breath_monst(m_idx, y, x, GF_CAUSE_2, dam, 0, FALSE, MS_CAUSE_2);
break;
}
dam = damroll(10, 15);
- monst_breath_monst(m_idx, y, x, GF_CAUSE_3, dam, 0, FALSE, MS_CAUSE_3, learnable);
+ monst_breath_monst(m_idx, y, x, GF_CAUSE_3, dam, 0, FALSE, MS_CAUSE_3);
break;
}
dam = damroll(15, 15);
- monst_breath_monst(m_idx, y, x, GF_CAUSE_4, dam, 0, FALSE, MS_CAUSE_4, learnable);
+ monst_breath_monst(m_idx, y, x, GF_CAUSE_4, dam, 0, FALSE, MS_CAUSE_4);
break;
}
dam = (damroll(7, 8) + (rlev / 3)) * ((r_ptr->flags2 & RF2_POWERFUL) ? 2 : 1);
- monst_bolt_monst(m_idx, y, x, GF_ACID,
- dam, MS_BOLT_ACID, learnable);
+ monst_bolt_monst(m_idx, y, x, GF_ACID, dam, MS_BOLT_ACID);
break;
}
dam = (damroll(4, 8) + (rlev / 3)) * ((r_ptr->flags2 & RF2_POWERFUL) ? 2 : 1);
- monst_bolt_monst(m_idx, y, x, GF_ELEC,
- dam, MS_BOLT_ELEC, learnable);
+ monst_bolt_monst(m_idx, y, x, GF_ELEC, dam, MS_BOLT_ELEC);
break;
}
dam = (damroll(9, 8) + (rlev / 3)) * ((r_ptr->flags2 & RF2_POWERFUL) ? 2 : 1);
- monst_bolt_monst(m_idx, y, x, GF_FIRE,
- dam, MS_BOLT_FIRE, learnable);
+ monst_bolt_monst(m_idx, y, x, GF_FIRE, dam, MS_BOLT_FIRE);
break;
}
dam = (damroll(6, 8) + (rlev / 3)) * ((r_ptr->flags2 & RF2_POWERFUL) ? 2 : 1);
- monst_bolt_monst(m_idx, y, x, GF_COLD,
- dam, MS_BOLT_COLD, learnable);
+ monst_bolt_monst(m_idx, y, x, GF_COLD, dam, MS_BOLT_COLD);
break;
}
dam = (rlev * 4) + 50 + damroll(10, 10);
- monst_breath_monst(m_idx, y, x, GF_LITE, dam, 4, FALSE, MS_STARBURST, learnable);
+ monst_breath_monst(m_idx, y, x, GF_LITE, dam, 4, FALSE, MS_STARBURST);
break;
}
dam = 30 + damroll(5, 5) + (rlev * 4) / ((r_ptr->flags2 & RF2_POWERFUL) ? 2 : 3);
- monst_bolt_monst(m_idx, y, x, GF_NETHER,
- dam, MS_BOLT_NETHER, learnable);
+ monst_bolt_monst(m_idx, y, x, GF_NETHER, dam, MS_BOLT_NETHER);
break;
}
dam = damroll(10, 10) + (rlev * 3 / ((r_ptr->flags2 & RF2_POWERFUL) ? 2 : 3));
- monst_bolt_monst(m_idx, y, x, GF_WATER,
- dam, MS_BOLT_WATER, learnable);
+ monst_bolt_monst(m_idx, y, x, GF_WATER, dam, MS_BOLT_WATER);
break;
}
dam = randint1(rlev * 7 / 2) + 50;
- monst_bolt_monst(m_idx, y, x, GF_MANA,
- dam, MS_BOLT_MANA, learnable);
+ monst_bolt_monst(m_idx, y, x, GF_MANA, dam, MS_BOLT_MANA);
break;
}
dam = 10 + damroll(8, 7) + (rlev * 3 / ((r_ptr->flags2 & RF2_POWERFUL) ? 2 : 3));
- monst_bolt_monst(m_idx, y, x, GF_PLASMA,
- dam, MS_BOLT_PLASMA, learnable);
+ monst_bolt_monst(m_idx, y, x, GF_PLASMA, dam, MS_BOLT_PLASMA);
break;
}
dam = damroll(6, 6) + (rlev * 3 / ((r_ptr->flags2 & RF2_POWERFUL) ? 2 : 3));
- monst_bolt_monst(m_idx, y, x, GF_ICE,
- dam, MS_BOLT_ICE, learnable);
+ monst_bolt_monst(m_idx, y, x, GF_ICE, dam, MS_BOLT_ICE);
break;
}
dam = damroll(2, 6) + (rlev / 3);
- monst_bolt_monst(m_idx, y, x, GF_MISSILE,
- dam, MS_MAGIC_MISSILE, learnable);
+ monst_bolt_monst(m_idx, y, x, GF_MISSILE, dam, MS_MAGIC_MISSILE);
break;
}
dam = 20; /* Dummy power */
- monst_breath_monst(m_idx, y, x, GF_HAND_DOOM, dam, 0, FALSE, MS_HAND_DOOM, learnable);
+ monst_breath_monst(m_idx, y, x, GF_HAND_DOOM, dam, 0, FALSE, MS_HAND_DOOM);
break;
}
dam = (r_ptr->flags2 & RF2_POWERFUL) ? (randint1(rlev * 2) + 180) : (randint1(rlev * 3 / 2) + 120);
- monst_beam_monst(m_idx, y, x, GF_PSY_SPEAR,
- dam, MS_PSY_SPEAR, learnable);
+ monst_beam_monst(m_idx, y, x, GF_PSY_SPEAR, dam, MS_PSY_SPEAR);
break;
/* RF6_DARKNESS */