X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fspells2.c;h=2d46fd58f52df2cac619ed7547c0014a1f317a55;hb=809f285c4a153afcad25d9462cd24f996ed54e6b;hp=894087c6d5c073098ec8b55bfe4ea0eaa7a4db81;hpb=00c6d24679113c3f334800c4e6be70670d781187;p=hengband%2Fhengband.git diff --git a/src/spells2.c b/src/spells2.c index 894087c6d..2d46fd58f 100644 --- a/src/spells2.c +++ b/src/spells2.c @@ -13,1807 +13,9 @@ #include "angband.h" #include "grid.h" - -/*! - * @brief 自己分析処理(Nethackからのアイデア) / self-knowledge... idea from nethack. - * @return なし - * @details - *
- * Useful for determining powers and
- * resistences of items.  It saves the screen, clears it, then starts listing
- * attributes, a screenful at a time.  (There are a LOT of attributes to
- * list.  It will probably take 2 or 3 screens for a powerful character whose
- * using several artifacts...) -CFT
- *
- * It is now a lot more efficient. -BEN-
- *
- * See also "identify_fully()".
- *
- * XXX XXX XXX Use the "show_file()" method, perhaps.
- * 
- */ -void self_knowledge(void) -{ - int i = 0, j, k; - - int v_nr = 0; - char v_string [8] [128]; - char s_string [6] [128]; - - u32b flgs[TR_FLAG_SIZE]; - - object_type *o_ptr; - - char Dummy[80]; - char buf[2][80]; - - cptr info[220]; - - int plev = p_ptr->lev; - - int percent; - - for (j = 0; j < TR_FLAG_SIZE; j++) - flgs[j] = 0L; - - p_ptr->knowledge |= (KNOW_STAT | KNOW_HPRATE); - - strcpy(Dummy, ""); - - percent = (int)(((long)p_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) / - (2 * p_ptr->hitdie + - ((PY_MAX_LEVEL - 1+3) * (p_ptr->hitdie + 1)))); - - sprintf(Dummy, _("現在の体力ランク : %d/100", "Your current Life Rating is %d/100."), percent); - strcpy(buf[0], Dummy); - info[i++] = buf[0]; - info[i++] = ""; - - chg_virtue(V_KNOWLEDGE, 1); - chg_virtue(V_ENLIGHTEN, 1); - - /* Acquire item flags from equipment */ - for (k = INVEN_RARM; k < INVEN_TOTAL; k++) - { - u32b tflgs[TR_FLAG_SIZE]; - - o_ptr = &inventory[k]; - - /* Skip non-objects */ - if (!o_ptr->k_idx) continue; - - /* Extract the flags */ - object_flags(o_ptr, tflgs); - - /* Extract flags */ - for (j = 0; j < TR_FLAG_SIZE; j++) - flgs[j] |= tflgs[j]; - } - - info[i++] = _("能力の最大値", "Limits of maximum stats"); - - for (v_nr = 0; v_nr < 6; v_nr++) - { - char stat_desc[80]; - - sprintf(stat_desc, "%s 18/%d", stat_names[v_nr], p_ptr->stat_max_max[v_nr]-18); - - strcpy(s_string[v_nr], stat_desc); - - info[i++] = s_string[v_nr]; - } - info[i++] = ""; - - sprintf(Dummy, _("現在の属性 : %s(%ld)", "Your alighnment : %s(%ld)"), your_alignment(), (long int)p_ptr->align); - strcpy(buf[1], Dummy); - info[i++] = buf[1]; - for (v_nr = 0; v_nr < 8; v_nr++) - { - char vir_name [20]; - char vir_desc[80]; - int tester = p_ptr->virtues[v_nr]; - - strcpy(vir_name, virtue[(p_ptr->vir_types[v_nr])-1]); - - sprintf(vir_desc, _("おっと。%sの情報なし。", "Oops. No info about %s."), vir_name); - if (tester < -100) - sprintf(vir_desc, _("[%s]の対極 (%d)", "You are the polar opposite of %s (%d)."), - vir_name, tester); - else if (tester < -80) - sprintf(vir_desc, _("[%s]の大敵 (%d)", "You are an arch-enemy of %s (%d)."), - vir_name, tester); - else if (tester < -60) - sprintf(vir_desc, _("[%s]の強敵 (%d)", "You are a bitter enemy of %s (%d)."), - vir_name, tester); - else if (tester < -40) - sprintf(vir_desc, _("[%s]の敵 (%d)", "You are an enemy of %s (%d)."), - vir_name, tester); - else if (tester < -20) - sprintf(vir_desc, _("[%s]の罪者 (%d)", "You have sinned against %s (%d)."), - vir_name, tester); - else if (tester < 0) - sprintf(vir_desc, _("[%s]の迷道者 (%d)", "You have strayed from the path of %s (%d)."), - vir_name, tester); - else if (tester == 0) - sprintf(vir_desc, _("[%s]の中立者 (%d)", "You are neutral to %s (%d)."), - vir_name, tester); - else if (tester < 20) - sprintf(vir_desc, _("[%s]の小徳者 (%d)", "You are somewhat virtuous in %s (%d)."), - vir_name, tester); - else if (tester < 40) - sprintf(vir_desc, _("[%s]の中徳者 (%d)", "You are virtuous in %s (%d)."), - vir_name, tester); - else if (tester < 60) - sprintf(vir_desc, _("[%s]の高徳者 (%d)", "You are very virtuous in %s (%d)."), - vir_name, tester); - else if (tester < 80) - sprintf(vir_desc, _("[%s]の覇者 (%d)", "You are a champion of %s (%d)."), - vir_name, tester); - else if (tester < 100) - sprintf(vir_desc, _("[%s]の偉大な覇者 (%d)", "You are a great champion of %s (%d)."), - vir_name, tester); - else - sprintf(vir_desc, _("[%s]の具現者 (%d)", "You are the living embodiment of %s (%d)."), - vir_name, tester); - - strcpy(v_string[v_nr], vir_desc); - - info[i++] = v_string[v_nr]; - } - info[i++] = ""; - - /* Racial powers... */ - if (p_ptr->mimic_form) - { - switch (p_ptr->mimic_form) - { - case MIMIC_DEMON: - case MIMIC_DEMON_LORD: - sprintf(Dummy, _("あなたは %d ダメージの地獄か火炎のブレスを吐くことができる。(%d MP)", - "You can nether breathe, dam. %d (cost %d)."), 3 * plev, 10+plev/3); - - info[i++] = Dummy; - break; - case MIMIC_VAMPIRE: - if (plev > 1) - { - sprintf(Dummy, _("あなたは敵から %d-%d HP の生命力を吸収できる。(%d MP)", - "You can steal life from a foe, dam. %d-%d (cost %d)."), - plev + MAX(1, plev / 10), plev + plev * MAX(1, plev / 10), 1 + (plev / 3)); - info[i++] = Dummy; - } - break; - } - } - else - { - switch (p_ptr->prace) - { - case RACE_NIBELUNG: - case RACE_DWARF: - if (plev > 4) - info[i++] = _("あなたは罠とドアと階段を感知できる。(5 MP)", "You can find traps, doors and stairs (cost 5)."); - break; - case RACE_HOBBIT: - if (plev > 14) - { - info[i++] = _("あなたは食料を生成できる。(10 MP)", "You can produce food (cost 10)."); - } - break; - case RACE_GNOME: - if (plev > 4) - { - sprintf(Dummy, _("あなたは範囲 %d 以内にテレポートできる。(%d MP)", "You can teleport, range %d (cost %d)."), - (1 + plev), (5 + (plev / 5))); - info[i++] = Dummy; - } - break; - case RACE_HALF_ORC: - if (plev > 2) - info[i++] = _("あなたは恐怖を除去できる。(5 MP)", "You can remove fear (cost 5)."); - break; - case RACE_HALF_TROLL: - if (plev > 9) - info[i++] = _("あなたは狂暴化することができる。(12 MP) ", "You enter berserk fury (cost 12)."); - break; - case RACE_AMBERITE: - if (plev > 29) - info[i++] = _("あなたはシャドウシフトすることができる。(50 MP)", "You can Shift Shadows (cost 50)."); - - if (plev > 39) - info[i++] = _("あなたは「パターン」を心に描いて歩くことができる。(75 MP)", "You can mentally Walk the Pattern (cost 75)."); - - break; - case RACE_BARBARIAN: - if (plev > 7) - info[i++] = _("あなたは狂暴化することができる。(10 MP) ", "You can enter berserk fury (cost 10)."); - - break; - case RACE_HALF_OGRE: - if (plev > 24) - info[i++] = _("あなたは爆発のルーンを仕掛けることができる。(35 MP)", "You can set an Explosive Rune (cost 35)."); - - break; - case RACE_HALF_GIANT: - if (plev > 19) - info[i++] = _("あなたは石の壁を壊すことができる。(10 MP)", "You can break stone walls (cost 10)."); - break; - case RACE_HALF_TITAN: - if (plev > 34) - info[i++] = _("あなたはモンスターをスキャンすることができる。(20 MP)", "You can probe monsters (cost 20)."); - break; - case RACE_CYCLOPS: - if (plev > 19) - { - sprintf(Dummy, _("あなたは %d ダメージの岩石を投げることができる。(15 MP)", - "You can throw a boulder, dam. %d (cost 15)."), 3 * plev); - info[i++] = Dummy; - } - break; - case RACE_YEEK: - if (plev > 14) - info[i++] = _("あなたは恐怖を呼び起こす叫び声を発することができる。(15 MP)", "You can make a terrifying scream (cost 15)."); - break; - case RACE_KLACKON: - if (plev > 8) - { - sprintf(Dummy, _("あなたは %d ダメージの酸を吹きかけることができる。(9 MP)", "You can spit acid, dam. %d (cost 9)."), plev); - info[i++] = Dummy; - } - break; - case RACE_KOBOLD: - if (plev > 11) - { - sprintf(Dummy, - _("あなたは %d ダメージの毒矢を投げることができる。(8 MP)", "You can throw a dart of poison, dam. %d (cost 8)."), plev); - info[i++] = Dummy; - } - break; - case RACE_DARK_ELF: - if (plev > 1) - { - sprintf(Dummy, _("あなたは %d ダメージのマジック・ミサイルの呪文を使える。(2 MP)", "You can cast a Magic Missile, dam %d (cost 2)."), - (3 + ((plev-1) / 5))); - info[i++] = Dummy; - } - break; - case RACE_DRACONIAN: - sprintf(Dummy, _("あなたは %d ダメージのブレスを吐くことができる。(%d MP)", "You can breathe, dam. %d (cost %d)."), 2 * plev, plev); - info[i++] = Dummy; - break; - case RACE_MIND_FLAYER: - if (plev > 14) - sprintf(Dummy, _("あなたは %d ダメージの精神攻撃をすることができる。(12 MP)", "You can mind blast your enemies, dam %d (cost 12)."), plev); - info[i++] = Dummy; - break; - case RACE_IMP: - if (plev > 29) - { - sprintf(Dummy, _("あなたは %d ダメージのファイア・ボールの呪文を使える。(15 MP)", "You can cast a Fire Ball, dam. %d (cost 15)."), plev); - info[i++] = Dummy; - } - else if (plev > 8) - { - sprintf(Dummy, _("あなたは %d ダメージのファイア・ボルトの呪文を使える。(15 MP)", "You can cast a Fire Bolt, dam. %d (cost 15)."), plev); - info[i++] = Dummy; - } - break; - case RACE_GOLEM: - if (plev > 19) - info[i++] = _("あなたは d20+30 ターンの間肌を石に変化させられる。(15 MP)", "You can turn your skin to stone, dur d20+30 (cost 15)."); - break; - case RACE_ZOMBIE: - case RACE_SKELETON: - if (plev > 29) - info[i++] = _("あなたは失った経験値を回復することができる。(30 MP)", "You can restore lost experience (cost 30)."); - break; - case RACE_VAMPIRE: - if (plev > 1) - { - sprintf(Dummy, _("あなたは敵から %d-%d HP の生命力を吸収できる。(%d MP)", "You can steal life from a foe, dam. %d-%d (cost %d)."), - plev + MAX(1, plev / 10), plev + plev * MAX(1, plev / 10), 1 + (plev / 3)); - info[i++] = Dummy; - } - break; - case RACE_SPECTRE: - if (plev > 3) - { - info[i++] = _("あなたは泣き叫んで敵を恐怖させることができる。(3 MP)", "You can wail to terrify your enemies (cost 3)."); - } - break; - case RACE_SPRITE: - if (plev > 11) - { - info[i++] = _("あなたは敵を眠らせる魔法の粉を投げることができる。(12 MP)", "You can throw magical dust which induces sleep (cost 12)."); - } - break; - case RACE_DEMON: - sprintf(Dummy, _("あなたは %d ダメージの地獄か火炎のブレスを吐くことができる。(%d MP)", - "You can breathe nether, dam. %d (cost %d)."), 3 * plev, 10+plev/3); - - info[i++] = Dummy; - break; - case RACE_KUTAR: - if (plev > 19) - info[i++] = _("あなたは d20+30 ターンの間横に伸びることができる。(15 MP)", "You can expand horizontally, dur d20+30 (cost 15)."); - break; - case RACE_ANDROID: - if (plev < 10) - sprintf(Dummy, _("あなたは %d ダメージのレイガンを撃つことができる。(7 MP)", "You can fire a ray gun with damage %d (cost 7)."), - (plev + 1) / 2); - else if (plev < 25) - sprintf(Dummy, _("あなたは %d ダメージのブラスターを撃つことができる。(13 MP)", "You can fire a blaster with damage %d (cost 13)."), plev); - else if (plev < 35) - sprintf(Dummy, _("あなたは %d ダメージのバズーカを撃つことができる。(26 MP)", "You can fire a bazooka with damage %d (cost 26)."), plev * 2); - else if (plev < 45) - sprintf(Dummy, _("あなたは %d ダメージのビームキャノンを撃つことができる。(40 MP)", - "You can fire a beam cannon with damage %d (cost 40)."), plev * 2); - else - sprintf(Dummy, _("あなたは %d ダメージのロケットを撃つことができる。(60 MP)", - "You can fire a rocket with damage %d (cost 60)."), plev * 5); - - info[i++] = Dummy; - break; - default: - break; - } - } - - switch(p_ptr->pclass) - { - case CLASS_WARRIOR: - if (plev > 39) - { - info[i++] = _("あなたはランダムな方向に対して数回攻撃することができる。(75 MP)", - "You can attack some random directions at a time (cost 75)."); - } - break; - case CLASS_HIGH_MAGE: - if (p_ptr->realm1 == REALM_HEX) break; - case CLASS_MAGE: - case CLASS_SORCERER: - if (plev > 24) - { - info[i++] = _("あなたはアイテムの魔力を吸収することができる。(1 MP)", - "You can absorb charges from an item (cost 1)."); - } - break; - case CLASS_PRIEST: - if (is_good_realm(p_ptr->realm1)) - { - if (plev > 34) - { - info[i++] = _("あなたは武器を祝福することができる。(70 MP)", "You can bless a weapon (cost 70)."); - } - } - else - { - if (plev > 41) - { - info[i++] = _("あなたは周りのすべてのモンスターを攻撃することができる。(40 MP)", "You can damages all monsters in sight (cost 40)."); - } - } - break; - case CLASS_ROGUE: - if (plev > 7) - { - info[i++] = _("あなたは攻撃して即座に逃げることができる。(12 MP)", "You can hit a monster and teleport at a time (cost 12)."); - } - break; - case CLASS_RANGER: - if (plev > 14) - { - info[i++] = _("あなたは怪物を調査することができる。(20 MP)", "You can prove monsters (cost 20)."); - } - break; - case CLASS_PALADIN: - if (is_good_realm(p_ptr->realm1)) - { - if (plev > 29) - { - info[i++] = _("あなたは聖なる槍を放つことができる。(30 MP)", "You can fires a holy spear (cost 30)."); - } - } - else - { - if (plev > 29) - { - info[i++] = _("あなたは生命力を減少させる槍を放つことができる。(30 MP)", "You can fires a spear which drains vitality (cost 30)."); - } - } - break; - case CLASS_WARRIOR_MAGE: - if (plev > 24) - { - info[i++] = _("あなたはHPをMPに変換することができる。(0 MP)", "You can convert HP to SP (cost 0)."); - info[i++] = _("あなたはMPをHPに変換することができる。(0 MP)", "You can convert SP to HP (cost 0)."); - } - break; - case CLASS_CHAOS_WARRIOR: - if (plev > 39) - { - info[i++] = _("あなたは周囲に怪物を惑わす光を発生させることができる。(50 MP)", - "You can radiate light which confuses nearby monsters (cost 50)."); - } - break; - case CLASS_MONK: - if (plev > 24) - { - info[i++] = _("あなたは構えることができる。(0 MP)", "You can assume a posture of special form (cost 0)."); - } - if (plev > 29) - { - info[i++] = _("あなたは通常の2倍の攻撃を行うことができる。(30 MP)", "You can perform double attacks in a time (cost 30)."); - } - break; - case CLASS_MINDCRAFTER: - case CLASS_FORCETRAINER: - if (plev > 14) - { - info[i++] = _("あなたは精神を集中してMPを回復させることができる。(0 MP)", "You can concentrate to regenerate your mana (cost 0)."); - } - break; - case CLASS_TOURIST: - info[i++] = _("あなたは写真を撮影することができる。(0 MP)", "You can take a photograph (cost 0)."); - if (plev > 24) - { - info[i++] = _("あなたはアイテムを完全に鑑定することができる。(20 MP)", "You can *identify* items (cost 20)."); - } - break; - case CLASS_IMITATOR: - if (plev > 29) - { - info[i++] = _("あなたは怪物の特殊攻撃をダメージ2倍でまねることができる。(100 MP)", - "You can imitate monster's special attacks with double damage (cost 100)."); - } - break; - case CLASS_BEASTMASTER: - info[i++] = _("あなたは1体の生命のあるモンスターを支配することができる。(レベル/4 MP)", "You can dominate a monster (cost level/4)."); - if (plev > 29) - { - info[i++] = _("あなたは視界内の生命のあるモンスターを支配することができる。((レベル+20)/2 MP)", - "You can dominate living monsters in sight (cost (level+20)/4)."); - } - break; - case CLASS_MAGIC_EATER: - info[i++] = _("あなたは杖/魔法棒/ロッドの魔力を自分のものにすることができる。", "You can absorb a staff, wand or rod itself."); - break; - case CLASS_RED_MAGE: - if (plev > 47) - { - info[i++] = _("あなたは1ターンに2回魔法を唱えることができる。(20 MP)", "You can cast two spells in one time (cost 20)."); - } - break; - case CLASS_SAMURAI: - { - info[i++] = _("あなたは精神を集中して気合いを溜めることができる。", "You can concentrate to regenerate your mana."); - } - if (plev > 24) - { - info[i++] = _("あなたは特殊な型で構えることができる。", "You can assume a posture of special form."); - } - break; - case CLASS_BLUE_MAGE: - info[i++] = _("あなたは相手に使われた魔法を学ぶことができる。", "You can study spells which your enemy casts on you."); - break; - case CLASS_CAVALRY: - if (plev > 9) - { - info[i++] = _("あなたはモンスターに乗って無理矢理ペットにすることができる。", "You can ride on a hostile monster forcibly to turn it into pet."); - } - break; - case CLASS_BERSERKER: - if (plev > 9) - { - info[i++] = _("あなたは街とダンジョンの間を行き来することができる。", "You can travel between town and the depths."); - } - break; - case CLASS_MIRROR_MASTER: - info[i++] = _("あなたは鏡を作り出すことができる。(2 MP)", "You can create a Mirror (cost 2)."); - info[i++] = _("あなたは鏡を割ることができる。(0 MP)", "You can break distant Mirrors (cost 0)."); - break; - case CLASS_NINJA: - if (plev > 19) - { - info[i++] = _("あなたは素早く移動することができる。", "You can walk extremery fast."); - } - break; - } - - if (p_ptr->muta1) - { - if (p_ptr->muta1 & MUT1_SPIT_ACID) - { - info[i++] = _("あなたは酸を吹きかけることができる。(ダメージ レベルX1)", "You can spit acid (dam lvl)."); - } - if (p_ptr->muta1 & MUT1_BR_FIRE) - { - info[i++] = _("あなたは炎のブレスを吐くことができる。(ダメージ レベルX2)", "You can breathe fire (dam lvl * 2)."); - } - if (p_ptr->muta1 & MUT1_HYPN_GAZE) - { - info[i++] = _("あなたの睨みは催眠効果をもつ。", "Your gaze is hypnotic."); - } - if (p_ptr->muta1 & MUT1_TELEKINES) - { - info[i++] = _("あなたは念動力をもっている。", "You are telekinetic."); - } - if (p_ptr->muta1 & MUT1_VTELEPORT) - { - info[i++] = _("あなたは自分の意思でテレポートできる。", "You can teleport at will."); - } - if (p_ptr->muta1 & MUT1_MIND_BLST) - { - info[i++] = _("あなたは精神攻撃を行える。(ダメージ 3~12d3)", "You can Mind Blast your enemies (3 to 12d3 dam)."); - } - if (p_ptr->muta1 & MUT1_RADIATION) - { - info[i++] = _("あなたは自分の意思で強い放射線を発生することができる。(ダメージ レベルX2)", "You can emit hard radiation at will (dam lvl * 2)."); - } - if (p_ptr->muta1 & MUT1_VAMPIRISM) - { - info[i++] = _("あなたは吸血鬼のように敵から生命力を吸収することができる。(ダメージ レベルX2)", - "You can drain life from a foe like a vampire (dam lvl * 2)."); - } - if (p_ptr->muta1 & MUT1_SMELL_MET) - { - info[i++] = _("あなたは近くにある貴金属をかぎ分けることができる。", "You can smell nearby precious metal."); - } - if (p_ptr->muta1 & MUT1_SMELL_MON) - { - info[i++] = _("あなたは近くのモンスターの存在をかぎ分けることができる。", "You can smell nearby monsters."); - } - if (p_ptr->muta1 & MUT1_BLINK) - { - info[i++] = _("あなたは短い距離をテレポートできる。", "You can teleport yourself short distances."); - } - if (p_ptr->muta1 & MUT1_EAT_ROCK) - { - info[i++] = _("あなたは硬い岩を食べることができる。", "You can consume solid rock."); - } - if (p_ptr->muta1 & MUT1_SWAP_POS) - { - info[i++] = _("あなたは他の者と場所を入れ替わることができる。", "You can switch locations with another being."); - } - if (p_ptr->muta1 & MUT1_SHRIEK) - { - info[i++] = _("あなたは身の毛もよだつ叫び声を発することができる。(ダメージ レベルX2)", "You can emit a horrible shriek (dam 2 * lvl)."); - } - if (p_ptr->muta1 & MUT1_ILLUMINE) - { - info[i++] = _("あなたは明るい光を放つことができる。", "You can emit bright light."); - } - if (p_ptr->muta1 & MUT1_DET_CURSE) - { - info[i++] = _("あなたは邪悪な魔法の危険を感じとることができる。", "You can feel the danger of evil magic."); - } - if (p_ptr->muta1 & MUT1_BERSERK) - { - info[i++] = _("あなたは自分の意思で狂乱戦闘状態になることができる。", "You can drive yourself into a berserk frenzy."); - } - if (p_ptr->muta1 & MUT1_POLYMORPH) - { - info[i++] = _("あなたは自分の意志で変化できる。", "You can polymorph yourself at will."); - } - if (p_ptr->muta1 & MUT1_MIDAS_TCH) - { - info[i++] = _("あなたは通常アイテムを金に変えることができる。", "You can turn ordinary items to gold."); - } - if (p_ptr->muta1 & MUT1_GROW_MOLD) - { - info[i++] = _("あなたは周囲にキノコを生やすことができる。", "You can cause mold to grow near you."); - } - if (p_ptr->muta1 & MUT1_RESIST) - { - info[i++] = _("あなたは元素の攻撃に対して身を硬くすることができる。", "You can harden yourself to the ravages of the elements."); - } - if (p_ptr->muta1 & MUT1_EARTHQUAKE) - { - info[i++] = _("あなたは周囲のダンジョンを崩壊させることができる。", "You can bring down the dungeon around your ears."); - } - if (p_ptr->muta1 & MUT1_EAT_MAGIC) - { - info[i++] = _("あなたは魔法のエネルギーを自分の物として使用できる。", "You can consume magic energy for your own use."); - } - if (p_ptr->muta1 & MUT1_WEIGH_MAG) - { - info[i++] = _("あなたは自分に影響を与える魔法の力を感じることができる。", "You can feel the strength of the magics affecting you."); - } - if (p_ptr->muta1 & MUT1_STERILITY) - { - info[i++] = _("あなたは集団的生殖不能を起こすことができる。", "You can cause mass impotence."); - } - if (p_ptr->muta1 & MUT1_PANIC_HIT) - { - info[i++] = _("あなたは攻撃した後身を守るため逃げることができる。", "You can run for your life after hitting something."); - } - if (p_ptr->muta1 & MUT1_DAZZLE) - { - info[i++] = _("あなたは混乱と盲目を引き起こす放射能を発生することができる。 ", "You can emit confusing, blinding radiation."); - } - if (p_ptr->muta1 & MUT1_LASER_EYE) - { - info[i++] = _("あなたは目からレーザー光線を発することができる。(ダメージ レベルX2)", "Your eyes can fire laser beams (dam 2 * lvl)."); - } - if (p_ptr->muta1 & MUT1_RECALL) - { - info[i++] = _("あなたは街とダンジョンの間を行き来することができる。", "You can travel between town and the depths."); - } - if (p_ptr->muta1 & MUT1_BANISH) - { - info[i++] = _("あなたは邪悪なモンスターを地獄に落とすことができる。", "You can send evil creatures directly to Hell."); - } - if (p_ptr->muta1 & MUT1_COLD_TOUCH) - { - info[i++] = _("あなたは敵を触って凍らせることができる。(ダメージ レベルX3)", "You can freeze things with a touch (dam 3 * lvl)."); - } - if (p_ptr->muta1 & MUT1_LAUNCHER) - { - info[i++] = _("あなたはアイテムを力強く投げることができる。", "You can hurl objects with great force."); - } - } - - if (p_ptr->muta2) - { - if (p_ptr->muta2 & MUT2_BERS_RAGE) - { - info[i++] = _("あなたは狂戦士化の発作を起こす。", "You are subject to berserker fits."); - } - if (p_ptr->muta2 & MUT2_COWARDICE) - { - info[i++] = _("あなたは時々臆病になる。", "You are subject to cowardice."); - } - if (p_ptr->muta2 & MUT2_RTELEPORT) - { - info[i++] = _("あなたはランダムにテレポートする。", "You are teleporting randomly."); - } - if (p_ptr->muta2 & MUT2_ALCOHOL) - { - info[i++] = _("あなたの体はアルコールを分泌する。", "Your body produces alcohol."); - } - if (p_ptr->muta2 & MUT2_HALLU) - { - info[i++] = _("あなたは幻覚を引き起こす精神錯乱に侵されている。", "You have a hallucinatory insanity."); - } - if (p_ptr->muta2 & MUT2_FLATULENT) - { - info[i++] = _("あなたは制御できない強烈な屁をこく。", "You are subject to uncontrollable flatulence."); - } - if (p_ptr->muta2 & MUT2_PROD_MANA) - { - info[i++] = _("あなたは制御不能な魔法のエネルギーを発している。", "You are producing magical energy uncontrollably."); - } - if (p_ptr->muta2 & MUT2_ATT_DEMON) - { - info[i++] = _("あなたはデーモンを引きつける。", "You attract demons."); - } - if (p_ptr->muta2 & MUT2_SCOR_TAIL) - { - info[i++] = _("あなたはサソリの尻尾が生えている。(毒、ダメージ 3d7)", "You have a scorpion tail (poison, 3d7)."); - } - if (p_ptr->muta2 & MUT2_HORNS) - { - info[i++] = _("あなたは角が生えている。(ダメージ 2d6)", "You have horns (dam. 2d6)."); - } - if (p_ptr->muta2 & MUT2_BEAK) - { - info[i++] = _("あなたはクチバシが生えている。(ダメージ 2d4)", "You have a beak (dam. 2d4)."); - } - if (p_ptr->muta2 & MUT2_SPEED_FLUX) - { - info[i++] = _("あなたはランダムに早く動いたり遅く動いたりする。", "You move faster or slower randomly."); - } - if (p_ptr->muta2 & MUT2_BANISH_ALL) - { - info[i++] = _("あなたは時々近くのモンスターを消滅させる。", "You sometimes cause nearby creatures to vanish."); - } - if (p_ptr->muta2 & MUT2_EAT_LIGHT) - { - info[i++] = _("あなたは時々周囲の光を吸収して栄養にする。", "You sometimes feed off of the light around you."); - } - if (p_ptr->muta2 & MUT2_TRUNK) - { - info[i++] = _("あなたは象のような鼻を持っている。(ダメージ 1d4)", "You have an elephantine trunk (dam 1d4)."); - } - if (p_ptr->muta2 & MUT2_ATT_ANIMAL) - { - info[i++] = _("あなたは動物を引きつける。", "You attract animals."); - } - if (p_ptr->muta2 & MUT2_TENTACLES) - { - info[i++] = _("あなたは邪悪な触手を持っている。(ダメージ 2d5)", "You have evil looking tentacles (dam 2d5)."); - } - if (p_ptr->muta2 & MUT2_RAW_CHAOS) - { - info[i++] = _("あなたはしばしば純カオスに包まれる。", "You occasionally are surrounded with raw chaos."); - } - if (p_ptr->muta2 & MUT2_NORMALITY) - { - info[i++] = _("あなたは変異していたが、回復してきている。", "You may be mutated, but you're recovering."); - } - if (p_ptr->muta2 & MUT2_WRAITH) - { - info[i++] = _("あなたの肉体は幽体化したり実体化したりする。", "You fade in and out of physical reality."); - } - if (p_ptr->muta2 & MUT2_POLY_WOUND) - { - info[i++] = _("あなたの健康はカオスの力に影響を受ける。", "Your health is subject to chaotic forces."); - } - if (p_ptr->muta2 & MUT2_WASTING) - { - info[i++] = _("あなたは衰弱する恐ろしい病気にかかっている。", "You have a horrible wasting disease."); - } - if (p_ptr->muta2 & MUT2_ATT_DRAGON) - { - info[i++] = _("あなたはドラゴンを引きつける。", "You attract dragons."); - } - if (p_ptr->muta2 & MUT2_WEIRD_MIND) - { - info[i++] = _("あなたの精神はランダムに拡大したり縮小したりしている。", "Your mind randomly expands and contracts."); - } - if (p_ptr->muta2 & MUT2_NAUSEA) - { - info[i++] = _("あなたの胃は非常に落ち着きがない。", "You have a seriously upset stomach."); - } - if (p_ptr->muta2 & MUT2_CHAOS_GIFT) - { - info[i++] = _("あなたはカオスの守護悪魔から褒美をうけとる。", "Chaos deities give you gifts."); - } - if (p_ptr->muta2 & MUT2_WALK_SHAD) - { - info[i++] = _("あなたはしばしば他の「影」に迷い込む。", "You occasionally stumble into other shadows."); - } - if (p_ptr->muta2 & MUT2_WARNING) - { - info[i++] = _("あなたは敵に関する警告を感じる。", "You receive warnings about your foes."); - } - if (p_ptr->muta2 & MUT2_INVULN) - { - info[i++] = _("あなたは時々負け知らずな気分になる。", "You occasionally feel invincible."); - } - if (p_ptr->muta2 & MUT2_SP_TO_HP) - { - info[i++] = _("あなたは時々血が筋肉にどっと流れる。", "Your blood sometimes rushes to your muscles."); - } - if (p_ptr->muta2 & MUT2_HP_TO_SP) - { - info[i++] = _("あなたは時々頭に血がどっと流れる。", "Your blood sometimes rushes to your head."); - } - if (p_ptr->muta2 & MUT2_DISARM) - { - info[i++] = _("あなたはよくつまづいて物を落とす。", "You occasionally stumble and drop things."); - } - } - - if (p_ptr->muta3) - { - if (p_ptr->muta3 & MUT3_HYPER_STR) - { - info[i++] = _("あなたは超人的に強い。(腕力+4)", "You are superhumanly strong (+4 STR)."); - } - if (p_ptr->muta3 & MUT3_PUNY) - { - info[i++] = _("あなたは虚弱だ。(腕力-4)", "You are puny (-4 STR)."); - } - if (p_ptr->muta3 & MUT3_HYPER_INT) - { - info[i++] = _("あなたの脳は生体コンピュータだ。(知能&賢さ+4)", "Your brain is a living computer (+4 INT/WIS)."); - } - if (p_ptr->muta3 & MUT3_MORONIC) - { - info[i++] = _("あなたは精神薄弱だ。(知能&賢さ-4)", "You are moronic (-4 INT/WIS)."); - } - if (p_ptr->muta3 & MUT3_RESILIENT) - { - info[i++] = _("あなたは非常にタフだ。(耐久+4)", "You are very resilient (+4 CON)."); - } - if (p_ptr->muta3 & MUT3_XTRA_FAT) - { - info[i++] = _("あなたは極端に太っている。(耐久+2,スピード-2)", "You are extremely fat (+2 CON, -2 speed)."); - } - if (p_ptr->muta3 & MUT3_ALBINO) - { - info[i++] = _("あなたはアルビノだ。(耐久-4)", "You are albino (-4 CON)."); - } - if (p_ptr->muta3 & MUT3_FLESH_ROT) - { - info[i++] = _("あなたの肉体は腐敗している。(耐久-2,魅力-1)", "Your flesh is rotting (-2 CON, -1 CHR)."); - } - if (p_ptr->muta3 & MUT3_SILLY_VOI) - { - info[i++] = _("あなたの声は間抜けなキーキー声だ。(魅力-4)", "Your voice is a silly squeak (-4 CHR)."); - } - if (p_ptr->muta3 & MUT3_BLANK_FAC) - { - info[i++] = _("あなたはのっぺらぼうだ。(魅力-1)", "Your face is featureless (-1 CHR)."); - } - if (p_ptr->muta3 & MUT3_ILL_NORM) - { - info[i++] = _("あなたは幻影に覆われている。", "Your appearance is masked with illusion."); - } - if (p_ptr->muta3 & MUT3_XTRA_EYES) - { - info[i++] = _("あなたは余分に二つの目を持っている。(探索+15)", "You have an extra pair of eyes (+15 search)."); - } - if (p_ptr->muta3 & MUT3_MAGIC_RES) - { - info[i++] = _("あなたは魔法への耐性をもっている。", "You are resistant to magic."); - } - if (p_ptr->muta3 & MUT3_XTRA_NOIS) - { - info[i++] = _("あなたは変な音を発している。(隠密-3)", "You make a lot of strange noise (-3 stealth)."); - } - if (p_ptr->muta3 & MUT3_INFRAVIS) - { - info[i++] = _("あなたは素晴らしい赤外線視力を持っている。(+3)", "You have remarkable infravision (+3)."); - } - if (p_ptr->muta3 & MUT3_XTRA_LEGS) - { - info[i++] = _("あなたは余分に二本の足が生えている。(加速+3)", "You have an extra pair of legs (+3 speed)."); - } - if (p_ptr->muta3 & MUT3_SHORT_LEG) - { - info[i++] = _("あなたの足は短い突起だ。(加速-3)", "Your legs are short stubs (-3 speed)."); - } - if (p_ptr->muta3 & MUT3_ELEC_TOUC) - { - info[i++] = _("あなたの血管には電流が流れている。", "Electricity is running through your veins."); - } - if (p_ptr->muta3 & MUT3_FIRE_BODY) - { - info[i++] = _("あなたの体は炎につつまれている。", "Your body is enveloped in flames."); - } - if (p_ptr->muta3 & MUT3_WART_SKIN) - { - info[i++] = _("あなたの肌はイボに被われている。(魅力-2, AC+5)", "Your skin is covered with warts (-2 CHR, +5 AC)."); - } - if (p_ptr->muta3 & MUT3_SCALES) - { - info[i++] = _("あなたの肌は鱗になっている。(魅力-1, AC+10)", "Your skin has turned into scales (-1 CHR, +10 AC)."); - } - if (p_ptr->muta3 & MUT3_IRON_SKIN) - { - info[i++] = _("あなたの肌は鉄でできている。(器用-1, AC+25)", "Your skin is made of steel (-1 DEX, +25 AC)."); - } - if (p_ptr->muta3 & MUT3_WINGS) - { - info[i++] = _("あなたは羽を持っている。", "You have wings."); - } - if (p_ptr->muta3 & MUT3_FEARLESS) - { - /* Unnecessary */ - } - if (p_ptr->muta3 & MUT3_REGEN) - { - /* Unnecessary */ - } - if (p_ptr->muta3 & MUT3_ESP) - { - /* Unnecessary */ - } - if (p_ptr->muta3 & MUT3_LIMBER) - { - info[i++] = _("あなたの体は非常にしなやかだ。(器用+3)", "Your body is very limber (+3 DEX)."); - } - if (p_ptr->muta3 & MUT3_ARTHRITIS) - { - info[i++] = _("あなたはいつも関節に痛みを感じている。(器用-3)", "Your joints ache constantly (-3 DEX)."); - } - if (p_ptr->muta3 & MUT3_VULN_ELEM) - { - info[i++] = _("あなたは元素の攻撃に弱い。", "You are susceptible to damage from the elements."); - } - if (p_ptr->muta3 & MUT3_MOTION) - { - info[i++] = _("あなたの動作は正確で力強い。(隠密+1)", "Your movements are precise and forceful (+1 STL)."); - } - if (p_ptr->muta3 & MUT3_GOOD_LUCK) - { - info[i++] = _("あなたは白いオーラにつつまれている。", "There is a white aura surrounding you."); - } - if (p_ptr->muta3 & MUT3_BAD_LUCK) - { - info[i++] = _("あなたは黒いオーラにつつまれている。", "There is a black aura surrounding you."); - } - } - - if (p_ptr->blind) - { - info[i++] = _("あなたは目が見えない。", "You cannot see."); - } - if (p_ptr->confused) - { - info[i++] = _("あなたは混乱している。", "You are confused."); - } - if (p_ptr->afraid) - { - info[i++] = _("あなたは恐怖に侵されている。", "You are terrified."); - } - if (p_ptr->cut) - { - info[i++] = _("あなたは出血している。", "You are bleeding."); - } - if (p_ptr->stun) - { - info[i++] = _("あなたはもうろうとしている。", "You are stunned."); - } - if (p_ptr->poisoned) - { - info[i++] = _("あなたは毒に侵されている。", "You are poisoned."); - } - if (p_ptr->image) - { - info[i++] = _("あなたは幻覚を見ている。", "You are hallucinating."); - } - if (p_ptr->cursed & TRC_TY_CURSE) - { - info[i++] = _("あなたは邪悪な怨念に包まれている。", "You carry an ancient foul curse."); - } - if (p_ptr->cursed & TRC_AGGRAVATE) - { - info[i++] = _("あなたはモンスターを怒らせている。", "You aggravate monsters."); - } - if (p_ptr->cursed & TRC_DRAIN_EXP) - { - info[i++] = _("あなたは経験値を吸われている。", "You are drained."); - } - if (p_ptr->cursed & TRC_SLOW_REGEN) - { - info[i++] = _("あなたの回復力は非常に遅い。", "You regenerate slowly."); - } - if (p_ptr->cursed & TRC_ADD_L_CURSE) - { - info[i++] = _("あなたの弱い呪いは増える。","Your weak curses multiply."); /* 暫定的 -- henkma */ - } - if (p_ptr->cursed & TRC_ADD_H_CURSE) - { - info[i++] = _("あなたの強い呪いは増える。","Your heavy curses multiply."); /* 暫定的 -- henkma */ - } - if (p_ptr->cursed & TRC_CALL_ANIMAL) - { - info[i++] = _("あなたは動物に狙われている。", "You attract animals."); - } - if (p_ptr->cursed & TRC_CALL_DEMON) - { - info[i++] = _("あなたは悪魔に狙われている。", "You attract demons."); - } - if (p_ptr->cursed & TRC_CALL_DRAGON) - { - info[i++] = _("あなたはドラゴンに狙われている。", "You attract dragons."); - } - if (p_ptr->cursed & TRC_COWARDICE) - { - info[i++] = _("あなたは時々臆病になる。", "You are subject to cowardice."); - } - if (p_ptr->cursed & TRC_TELEPORT) - { - info[i++] = _("あなたの位置はひじょうに不安定だ。", "Your position is very uncertain."); - } - if (p_ptr->cursed & TRC_LOW_MELEE) - { - info[i++] = _("あなたの武器は攻撃を外しやすい。", "Your weapon causes you to miss blows."); - } - if (p_ptr->cursed & TRC_LOW_AC) - { - info[i++] = _("あなたは攻撃を受けやすい。", "You are subject to be hit."); - } - if (p_ptr->cursed & TRC_LOW_MAGIC) - { - info[i++] = _("あなたは魔法を失敗しやすい。", "You are subject to fail spellcasting."); - } - if (p_ptr->cursed & TRC_FAST_DIGEST) - { - info[i++] = _("あなたはすぐお腹がへる。", "You have a good appetite."); - } - if (p_ptr->cursed & TRC_DRAIN_HP) - { - info[i++] = _("あなたは体力を吸われている。", "You are drained."); - } - if (p_ptr->cursed & TRC_DRAIN_MANA) - { - info[i++] = _("あなたは魔力を吸われている。", "You brain is drained."); - } - if (IS_BLESSED()) - { - info[i++] = _("あなたは高潔さを感じている。", "You feel rightous."); - } - if (IS_HERO()) - { - info[i++] = _("あなたはヒーロー気分だ。", "You feel heroic."); - } - if (p_ptr->shero) - { - info[i++] = _("あなたは戦闘狂だ。", "You are in a battle rage."); - } - if (p_ptr->protevil) - { - info[i++] = _("あなたは邪悪なる存在から守られている。", "You are protected from evil."); - } - if (p_ptr->shield) - { - info[i++] = _("あなたは神秘のシールドで守られている。", "You are protected by a mystic shield."); - } - if (IS_INVULN()) - { - info[i++] = _("あなたは現在傷つかない。", "You are temporarily invulnerable."); - } - if (p_ptr->wraith_form) - { - info[i++] = _("あなたは一時的に幽体化している。", "You are temporarily incorporeal."); - } - if (p_ptr->special_attack & ATTACK_CONFUSE) - { - info[i++] = _("あなたの手は赤く輝いている。", "Your hands are glowing dull red."); - } - if (p_ptr->special_attack & ATTACK_FIRE) - { - info[i++] = _("あなたの手は火炎に覆われている。", "You can strike the enemy with flame."); - } - if (p_ptr->special_attack & ATTACK_COLD) - { - info[i++] = _("あなたの手は冷気に覆われている。", "You can strike the enemy with cold."); - } - if (p_ptr->special_attack & ATTACK_ACID) - { - info[i++] = _("あなたの手は酸に覆われている。", "You can strike the enemy with acid."); - } - if (p_ptr->special_attack & ATTACK_ELEC) - { - info[i++] = _("あなたの手は電撃に覆われている。", "You can strike the enemy with electoric shock."); - } - if (p_ptr->special_attack & ATTACK_POIS) - { - info[i++] = _("あなたの手は毒に覆われている。", "You can strike the enemy with poison."); - } - switch (p_ptr->action) - { - case ACTION_SEARCH: - info[i++] = _("あなたはひじょうに注意深く周囲を見渡している。", "You are looking around very carefully."); - break; - } - if (p_ptr->new_spells) - { - info[i++] = _("あなたは呪文や祈りを学ぶことができる。", "You can learn some spells/prayers."); - } - if (p_ptr->word_recall) - { - info[i++] = _("あなたはすぐに帰還するだろう。", "You will soon be recalled."); - } - if (p_ptr->alter_reality) - { - info[i++] = _("あなたはすぐにこの世界を離れるだろう。", "You will soon be altered."); - } - if (p_ptr->see_infra) - { - info[i++] = _("あなたの瞳は赤外線に敏感である。", "Your eyes are sensitive to infrared light."); - } - if (p_ptr->see_inv) - { - info[i++] = _("あなたは透明なモンスターを見ることができる。", "You can see invisible creatures."); - } - if (p_ptr->levitation) - { - info[i++] = _("あなたは飛ぶことができる。", "You can fly."); - } - if (p_ptr->free_act) - { - info[i++] = _("あなたは麻痺知らずの効果を持っている。", "You have free action."); - } - if (p_ptr->regenerate) - { - info[i++] = _("あなたは素早く体力を回復する。", "You regenerate quickly."); - } - if (p_ptr->slow_digest) - { - info[i++] = _("あなたは食欲が少ない。", "Your appetite is small."); - } - if (p_ptr->telepathy) - { - info[i++] = _("あなたはテレパシー能力を持っている。", "You have ESP."); - } - if (p_ptr->esp_animal) - { - info[i++] = _("あなたは自然界の生物の存在を感じる能力を持っている。", "You sense natural creatures."); - } - if (p_ptr->esp_undead) - { - info[i++] = _("あなたはアンデッドの存在を感じる能力を持っている。", "You sense undead."); - } - if (p_ptr->esp_demon) - { - info[i++] = _("あなたは悪魔の存在を感じる能力を持っている。", "You sense demons."); - } - if (p_ptr->esp_orc) - { - info[i++] = _("あなたはオークの存在を感じる能力を持っている。", "You sense orcs."); - } - if (p_ptr->esp_troll) - { - info[i++] = _("あなたはトロルの存在を感じる能力を持っている。", "You sense trolls."); - } - if (p_ptr->esp_giant) - { - info[i++] = _("あなたは巨人の存在を感じる能力を持っている。", "You sense giants."); - } - if (p_ptr->esp_dragon) - { - info[i++] = _("あなたはドラゴンの存在を感じる能力を持っている。", "You sense dragons."); - } - if (p_ptr->esp_human) - { - info[i++] = _("あなたは人間の存在を感じる能力を持っている。", "You sense humans."); - } - if (p_ptr->esp_evil) - { - info[i++] = _("あなたは邪悪な生き物の存在を感じる能力を持っている。", "You sense evil creatures."); - } - if (p_ptr->esp_good) - { - info[i++] = _("あなたは善良な生き物の存在を感じる能力を持っている。", "You sense good creatures."); - } - if (p_ptr->esp_nonliving) - { - info[i++] = _("あなたは活動する無生物体の存在を感じる能力を持っている。", "You sense non-living creatures."); - } - if (p_ptr->esp_unique) - { - info[i++] = _("あなたは特別な強敵の存在を感じる能力を持っている。", "You sense unique monsters."); - } - if (p_ptr->hold_exp) - { - info[i++] = _("あなたは自己の経験値をしっかりと維持する。", "You have a firm hold on your experience."); - } - if (p_ptr->reflect) - { - info[i++] = _("あなたは矢の呪文を反射する。", "You reflect bolt spells."); - } - if (p_ptr->sh_fire) - { - info[i++] = _("あなたは炎のオーラに包まれている。", "You are surrounded with a fiery aura."); - } - if (p_ptr->sh_elec) - { - info[i++] = _("あなたは電気に包まれている。", "You are surrounded with electricity."); - } - if (p_ptr->sh_cold) - { - info[i++] = _("あなたは冷気のオーラに包まれている。", "You are surrounded with an aura of coldness."); - } - if (p_ptr->tim_sh_holy) - { - info[i++] = _("あなたは聖なるオーラに包まれている。", "You are surrounded with a holy aura."); - } - if (p_ptr->tim_sh_touki) - { - info[i++] = _("あなたは闘気のオーラに包まれている。", "You are surrounded with a energy aura."); - } - if (p_ptr->anti_magic) - { - info[i++] = _("あなたは反魔法シールドに包まれている。", "You are surrounded by an anti-magic shell."); - } - if (p_ptr->anti_tele) - { - info[i++] = _("あなたはテレポートできない。", "You cannot teleport."); - } - if (p_ptr->lite) - { - info[i++] = _("あなたの身体は光っている。", "You are carrying a permanent light."); - } - if (p_ptr->warning) - { - info[i++] = _("あなたは行動の前に危険を察知することができる。", "You will be warned before dangerous actions."); - } - if (p_ptr->dec_mana) - { - info[i++] = _("あなたは少ない消費魔力で魔法を唱えることができる。", "You can cast spells with fewer mana points."); - } - if (p_ptr->easy_spell) - { - info[i++] = _("あなたは低い失敗率で魔法を唱えることができる。", "Fail rate of your magic is decreased."); - } - if (p_ptr->heavy_spell) - { - info[i++] = _("あなたは高い失敗率で魔法を唱えなければいけない。", "Fail rate of your magic is increased."); - } - if (p_ptr->mighty_throw) - { - info[i++] = _("あなたは強く物を投げる。", "You can throw objects powerfully."); - } - - if (p_ptr->immune_acid) - { - info[i++] = _("あなたは酸に対する完全なる免疫を持っている。", "You are completely immune to acid."); - } - else if (p_ptr->resist_acid && IS_OPPOSE_ACID()) - { - info[i++] = _("あなたは酸への強力な耐性を持っている。", "You resist acid exceptionally well."); - } - else if (p_ptr->resist_acid || IS_OPPOSE_ACID()) - { - info[i++] = _("あなたは酸への耐性を持っている。", "You are resistant to acid."); - } - - if (p_ptr->immune_elec) - { - info[i++] = _("あなたは電撃に対する完全なる免疫を持っている。", "You are completely immune to lightning."); - } - else if (p_ptr->resist_elec && IS_OPPOSE_ELEC()) - { - info[i++] = _("あなたは電撃への強力な耐性を持っている。", "You resist lightning exceptionally well."); - } - else if (p_ptr->resist_elec || IS_OPPOSE_ELEC()) - { - info[i++] = _("あなたは電撃への耐性を持っている。", "You are resistant to lightning."); - } - - if (prace_is_(RACE_ANDROID) && !p_ptr->immune_elec) - { - info[i++] = _("あなたは電撃に弱い。", "You are susceptible to damage from lightning."); - } - - if (p_ptr->immune_fire) - { - info[i++] = _("あなたは火に対する完全なる免疫を持っている。", "You are completely immune to fire."); - } - else if (p_ptr->resist_fire && IS_OPPOSE_FIRE()) - { - info[i++] = _("あなたは火への強力な耐性を持っている。", "You resist fire exceptionally well."); - } - else if (p_ptr->resist_fire || IS_OPPOSE_FIRE()) - { - info[i++] = _("あなたは火への耐性を持っている。", "You are resistant to fire."); - } - - if (prace_is_(RACE_ENT) && !p_ptr->immune_fire) - { - info[i++] = _("あなたは火に弱い。", "You are susceptible to damage from fire."); - } - - if (p_ptr->immune_cold) - { - info[i++] = _("あなたは冷気に対する完全なる免疫を持っている。", "You are completely immune to cold."); - } - else if (p_ptr->resist_cold && IS_OPPOSE_COLD()) - { - info[i++] = _("あなたは冷気への強力な耐性を持っている。", "You resist cold exceptionally well."); - } - else if (p_ptr->resist_cold || IS_OPPOSE_COLD()) - { - info[i++] = _("あなたは冷気への耐性を持っている。", "You are resistant to cold."); - } - - if (p_ptr->resist_pois && IS_OPPOSE_POIS()) - { - info[i++] = _("あなたは毒への強力な耐性を持っている。", "You resist poison exceptionally well."); - } - else if (p_ptr->resist_pois || IS_OPPOSE_POIS()) - { - info[i++] = _("あなたは毒への耐性を持っている。", "You are resistant to poison."); - } - - if (p_ptr->resist_lite) - { - info[i++] = _("あなたは閃光への耐性を持っている。", "You are resistant to bright light."); - } - - if (prace_is_(RACE_VAMPIRE) || prace_is_(RACE_S_FAIRY) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) - { - info[i++] = _("あなたは閃光に弱い。", "You are susceptible to damage from bright light."); - } - - if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form) - { - info[i++] = _("あなたは暗黒に対する完全なる免疫を持っている。", "You are completely immune to darkness."); - } - - else if (p_ptr->resist_dark) - { - info[i++] = _("あなたは暗黒への耐性を持っている。", "You are resistant to darkness."); - } - if (p_ptr->resist_conf) - { - info[i++] = _("あなたは混乱への耐性を持っている。", "You are resistant to confusion."); - } - if (p_ptr->resist_sound) - { - info[i++] = _("あなたは音波の衝撃への耐性を持っている。", "You are resistant to sonic attacks."); - } - if (p_ptr->resist_disen) - { - info[i++] = _("あなたは劣化への耐性を持っている。", "You are resistant to disenchantment."); - } - if (p_ptr->resist_chaos) - { - info[i++] = _("あなたはカオスの力への耐性を持っている。", "You are resistant to chaos."); - } - if (p_ptr->resist_shard) - { - info[i++] = _("あなたは破片の攻撃への耐性を持っている。", "You are resistant to blasts of shards."); - } - if (p_ptr->resist_nexus) - { - info[i++] = _("あなたは因果混乱の攻撃への耐性を持っている。", "You are resistant to nexus attacks."); - } - - if (prace_is_(RACE_SPECTRE)) - { - info[i++] = _("あなたは地獄の力を吸収できる。", "You can drain nether forces."); - } - else if (p_ptr->resist_neth) - { - info[i++] = _("あなたは地獄の力への耐性を持っている。", "You are resistant to nether forces."); - } - if (p_ptr->resist_fear) - { - info[i++] = _("あなたは全く恐怖を感じない。", "You are completely fearless."); - } - if (p_ptr->resist_blind) - { - info[i++] = _("あなたの目は盲目への耐性を持っている。", "Your eyes are resistant to blindness."); - } - if (p_ptr->resist_time) - { - info[i++] = _("あなたは時間逆転への耐性を持っている。", "You are resistant to time."); - } - - if (p_ptr->sustain_str) - { - info[i++] = _("あなたの腕力は維持されている。", "Your strength is sustained."); - } - if (p_ptr->sustain_int) - { - info[i++] = _("あなたの知能は維持されている。", "Your intelligence is sustained."); - } - if (p_ptr->sustain_wis) - { - info[i++] = _("あなたの賢さは維持されている。", "Your wisdom is sustained."); - } - if (p_ptr->sustain_con) - { - info[i++] = _("あなたの耐久力は維持されている。", "Your constitution is sustained."); - } - if (p_ptr->sustain_dex) - { - info[i++] = _("あなたの器用さは維持されている。", "Your dexterity is sustained."); - } - if (p_ptr->sustain_chr) - { - info[i++] = _("あなたの魅力は維持されている。", "Your charisma is sustained."); - } - - if (have_flag(flgs, TR_STR)) - { - info[i++] = _("あなたの腕力は装備によって影響を受けている。", "Your strength is affected by your equipment."); - } - if (have_flag(flgs, TR_INT)) - { - info[i++] = _("あなたの知能は装備によって影響を受けている。", "Your intelligence is affected by your equipment."); - } - if (have_flag(flgs, TR_WIS)) - { - info[i++] = _("あなたの賢さは装備によって影響を受けている。", "Your wisdom is affected by your equipment."); - } - if (have_flag(flgs, TR_DEX)) - { - info[i++] = _("あなたの器用さは装備によって影響を受けている。", "Your dexterity is affected by your equipment."); - } - if (have_flag(flgs, TR_CON)) - { - info[i++] = _("あなたの耐久力は装備によって影響を受けている。", "Your constitution is affected by your equipment."); - } - if (have_flag(flgs, TR_CHR)) - { - info[i++] = _("あなたの魅力は装備によって影響を受けている。", "Your charisma is affected by your equipment."); - } - - if (have_flag(flgs, TR_STEALTH)) - { - info[i++] = _("あなたの隠密行動能力は装備によって影響を受けている。", "Your stealth is affected by your equipment."); - } - if (have_flag(flgs, TR_SEARCH)) - { - info[i++] = _("あなたの探索能力は装備によって影響を受けている。", "Your searching ability is affected by your equipment."); - } - if (have_flag(flgs, TR_INFRA)) - { - info[i++] = _("あなたの赤外線視力は装備によって影響を受けている。", "Your infravision is affected by your equipment."); - } - if (have_flag(flgs, TR_TUNNEL)) - { - info[i++] = _("あなたの採掘能力は装備によって影響を受けている。", "Your digging ability is affected by your equipment."); - } - if (have_flag(flgs, TR_SPEED)) - { - info[i++] = _("あなたのスピードは装備によって影響を受けている。", "Your speed is affected by your equipment."); - } - if (have_flag(flgs, TR_BLOWS)) - { - info[i++] = _("あなたの攻撃速度は装備によって影響を受けている。", "Your attack speed is affected by your equipment."); - } - - - /* Access the current weapon */ - o_ptr = &inventory[INVEN_RARM]; - - /* Analyze the weapon */ - if (o_ptr->k_idx) - { - /* Indicate Blessing */ - if (have_flag(flgs, TR_BLESSED)) - { - info[i++] = _("あなたの武器は神の祝福を受けている。", "Your weapon has been blessed by the gods."); - } - - if (have_flag(flgs, TR_CHAOTIC)) - { - info[i++] = _("あなたの武器はログルスの徴の属性をもつ。", "Your weapon is branded with the Sign of Logrus."); - } - - /* Hack */ - if (have_flag(flgs, TR_IMPACT)) - { - info[i++] = _("あなたの武器は打撃で地震を発生することができる。", "The impact of your weapon can cause earthquakes."); - } - - if (have_flag(flgs, TR_VORPAL)) - { - info[i++] = _("あなたの武器は非常に鋭い。", "Your weapon is very sharp."); - } - - if (have_flag(flgs, TR_VAMPIRIC)) - { - info[i++] = _("あなたの武器は敵から生命力を吸収する。", "Your weapon drains life from your foes."); - } - - /* Special "Attack Bonuses" */ - if (have_flag(flgs, TR_BRAND_ACID)) - { - info[i++] = _("あなたの武器は敵を溶かす。", "Your weapon melts your foes."); - } - if (have_flag(flgs, TR_BRAND_ELEC)) - { - info[i++] = _("あなたの武器は敵を感電させる。", "Your weapon shocks your foes."); - } - if (have_flag(flgs, TR_BRAND_FIRE)) - { - info[i++] = _("あなたの武器は敵を燃やす。", "Your weapon burns your foes."); - } - if (have_flag(flgs, TR_BRAND_COLD)) - { - info[i++] = _("あなたの武器は敵を凍らせる。", "Your weapon freezes your foes."); - } - if (have_flag(flgs, TR_BRAND_POIS)) - { - info[i++] = _("あなたの武器は敵を毒で侵す。", "Your weapon poisons your foes."); - } - - /* Special "slay" flags */ - if (have_flag(flgs, TR_KILL_ANIMAL)) - { - info[i++] = _("あなたの武器は動物の天敵である。", "Your weapon is a great bane of animals."); - } - else if (have_flag(flgs, TR_SLAY_ANIMAL)) - { - info[i++] = _("あなたの武器は動物に対して強い力を発揮する。", "Your weapon strikes at animals with extra force."); - } - if (have_flag(flgs, TR_KILL_EVIL)) - { - info[i++] = _("あなたの武器は邪悪なる存在の天敵である。", "Your weapon is a great bane of evil."); - } - else if (have_flag(flgs, TR_SLAY_EVIL)) - { - info[i++] = _("あなたの武器は邪悪なる存在に対して強い力を発揮する。", "Your weapon strikes at evil with extra force."); - } - if (have_flag(flgs, TR_KILL_HUMAN)) - { - info[i++] = _("あなたの武器は人間の天敵である。", "Your weapon is a great bane of humans."); - } - else if (have_flag(flgs, TR_SLAY_HUMAN)) - { - info[i++] = _("あなたの武器は人間に対して特に強い力を発揮する。", "Your weapon is especially deadly against humans."); - } - if (have_flag(flgs, TR_KILL_UNDEAD)) - { - info[i++] = _("あなたの武器はアンデッドの天敵である。", "Your weapon is a great bane of undead."); - } - else if (have_flag(flgs, TR_SLAY_UNDEAD)) - { - info[i++] = _("あなたの武器はアンデッドに対して神聖なる力を発揮する。", "Your weapon strikes at undead with holy wrath."); - } - if (have_flag(flgs, TR_KILL_DEMON)) - { - info[i++] = _("あなたの武器はデーモンの天敵である。", "Your weapon is a great bane of demons."); - } - else if (have_flag(flgs, TR_SLAY_DEMON)) - { - info[i++] = _("あなたの武器はデーモンに対して神聖なる力を発揮する。", "Your weapon strikes at demons with holy wrath."); - } - if (have_flag(flgs, TR_KILL_ORC)) - { - info[i++] = _("あなたの武器はオークの天敵である。", "Your weapon is a great bane of orcs."); - } - else if (have_flag(flgs, TR_SLAY_ORC)) - { - info[i++] = _("あなたの武器はオークに対して特に強い力を発揮する。", "Your weapon is especially deadly against orcs."); - } - if (have_flag(flgs, TR_KILL_TROLL)) - { - info[i++] = _("あなたの武器はトロルの天敵である。", "Your weapon is a great bane of trolls."); - } - else if (have_flag(flgs, TR_SLAY_TROLL)) - { - info[i++] = _("あなたの武器はトロルに対して特に強い力を発揮する。", "Your weapon is especially deadly against trolls."); - } - if (have_flag(flgs, TR_KILL_GIANT)) - { - info[i++] = _("あなたの武器はジャイアントの天敵である。", "Your weapon is a great bane of giants."); - } - else if (have_flag(flgs, TR_SLAY_GIANT)) - { - info[i++] = _("あなたの武器はジャイアントに対して特に強い力を発揮する。", "Your weapon is especially deadly against giants."); - } - /* Special "kill" flags */ - if (have_flag(flgs, TR_KILL_DRAGON)) - { - info[i++] = _("あなたの武器はドラゴンの天敵である。", "Your weapon is a great bane of dragons."); - } - else if (have_flag(flgs, TR_SLAY_DRAGON)) - { - info[i++] = _("あなたの武器はドラゴンに対して特に強い力を発揮する。", "Your weapon is especially deadly against dragons."); - } - - if (have_flag(flgs, TR_FORCE_WEAPON)) - { - info[i++] = _("あなたの武器はMPを使って攻撃する。", "Your weapon causes greate damages using your MP."); - } - if (have_flag(flgs, TR_THROW)) - { - info[i++] = _("あなたの武器は投げやすい。", "Your weapon can be thrown well."); - } - } - - - /* Save the screen */ - screen_save(); - - /* Erase the screen */ - for (k = 1; k < 24; k++) prt("", k, 13); - - /* Label the information */ - prt(_(" あなたの状態:", " Your Attributes:"), 1, 15); - - /* We will print on top of the map (column 13) */ - for (k = 2, j = 0; j < i; j++) - { - /* Show the info */ - prt(info[j], k++, 15); - - /* Every 20 entries (lines 2 to 21), start over */ - if ((k == 22) && (j+1 < i)) - { - prt(_("-- 続く --", "-- more --"), k, 15); - inkey(); - for (; k > 2; k--) prt("", k, 15); - } - } - - /* Pause */ - prt(_("[何かキーを押すとゲームに戻ります]", "[Press any key to continue]"), k, 13); - inkey(); - - /* Restore the screen */ - screen_load(); -} - -/*! - * @brief 魔法効果時間のターン数に基づいて表現IDを返す。 - * @param dur 効果ターン数 - * @return 効果時間の表現ID - */ -static int report_magics_aux(int dur) -{ - if (dur <= 5) - { - return 0; - } - else if (dur <= 10) - { - return 1; - } - else if (dur <= 20) - { - return 2; - } - else if (dur <= 50) - { - return 3; - } - else if (dur <= 100) - { - return 4; - } - else if (dur <= 200) - { - return 5; - } - else - { - return 6; - } -} - -static cptr report_magic_durations[] = -{ -#ifdef JP -"ごく短い間", -"少しの間", -"しばらくの間", -"多少長い間", -"長い間", -"非常に長い間", -"信じ難いほど長い間", -"モンスターを攻撃するまで" -#else - "for a short time", - "for a little while", - "for a while", - "for a long while", - "for a long time", - "for a very long time", - "for an incredibly long time", - "until you hit a monster" -#endif - -}; - -/*! - * @brief 現在の一時的効果一覧を返す / Report all currently active magical effects. - * @return なし - */ -void report_magics(void) -{ - int i = 0, j, k; - char Dummy[80]; - cptr info[128]; - int info2[128]; - - - if (p_ptr->blind) - { - info2[i] = report_magics_aux(p_ptr->blind); - info[i++] = _("あなたは目が見えない", "You cannot see"); - } - if (p_ptr->confused) - { - info2[i] = report_magics_aux(p_ptr->confused); - info[i++] = _("あなたは混乱している", "You are confused"); - } - if (p_ptr->afraid) - { - info2[i] = report_magics_aux(p_ptr->afraid); - info[i++] = _("あなたは恐怖に侵されている", "You are terrified"); - } - if (p_ptr->poisoned) - { - info2[i] = report_magics_aux(p_ptr->poisoned); - info[i++] = _("あなたは毒に侵されている", "You are poisoned"); - } - if (p_ptr->image) - { - info2[i] = report_magics_aux(p_ptr->image); - info[i++] = _("あなたは幻覚を見ている", "You are hallucinating"); - } - if (p_ptr->blessed) - { - info2[i] = report_magics_aux(p_ptr->blessed); - info[i++] = _("あなたは高潔さを感じている", "You feel rightous"); - } - if (p_ptr->hero) - { - info2[i] = report_magics_aux(p_ptr->hero); - info[i++] = _("あなたはヒーロー気分だ", "You feel heroic"); - } - if (p_ptr->shero) - { - info2[i] = report_magics_aux(p_ptr->shero); - info[i++] = _("あなたは戦闘狂だ", "You are in a battle rage"); - } - if (p_ptr->protevil) - { - info2[i] = report_magics_aux(p_ptr->protevil); - info[i++] = _("あなたは邪悪なる存在から守られている", "You are protected from evil"); - } - if (p_ptr->shield) - { - info2[i] = report_magics_aux(p_ptr->shield); - info[i++] = _("あなたは神秘のシールドで守られている", "You are protected by a mystic shield"); - } - if (p_ptr->invuln) - { - info2[i] = report_magics_aux(p_ptr->invuln); - info[i++] = _("あなたは無敵だ", "You are invulnerable"); - } - if (p_ptr->wraith_form) - { - info2[i] = report_magics_aux(p_ptr->wraith_form); - info[i++] = _("あなたは幽体化している", "You are incorporeal"); - } - if (p_ptr->special_attack & ATTACK_CONFUSE) - { - info2[i] = 7; - info[i++] = _("あなたの手は赤く輝いている", "Your hands are glowing dull red."); - } - if (p_ptr->word_recall) - { - info2[i] = report_magics_aux(p_ptr->word_recall); - info[i++] = _("この後帰還の詔が発動する", "You are waiting to be recalled"); - } - if (p_ptr->alter_reality) - { - info2[i] = report_magics_aux(p_ptr->alter_reality); - info[i++] = _("この後現実変容が発動する", "You waiting to be altered"); - } - if (p_ptr->oppose_acid) - { - info2[i] = report_magics_aux(p_ptr->oppose_acid); - info[i++] = _("あなたは酸への耐性を持っている", "You are resistant to acid"); - } - if (p_ptr->oppose_elec) - { - info2[i] = report_magics_aux(p_ptr->oppose_elec); - info[i++] = _("あなたは電撃への耐性を持っている", "You are resistant to lightning"); - } - if (p_ptr->oppose_fire) - { - info2[i] = report_magics_aux(p_ptr->oppose_fire); - info[i++] = _("あなたは火への耐性を持っている", "You are resistant to fire"); - } - if (p_ptr->oppose_cold) - { - info2[i] = report_magics_aux(p_ptr->oppose_cold); - info[i++] = _("あなたは冷気への耐性を持っている", "You are resistant to cold"); - } - if (p_ptr->oppose_pois) - { - info2[i] = report_magics_aux(p_ptr->oppose_pois); - info[i++] = _("あなたは毒への耐性を持っている", "You are resistant to poison"); - } - - /* Save the screen */ - screen_save(); - - /* Erase the screen */ - for (k = 1; k < 24; k++) prt("", k, 13); - - /* Label the information */ - prt(_(" 現在かかっている魔法 :", " Your Current Magic:"), 1, 15); +#include "trap.h" - /* We will print on top of the map (column 13) */ - for (k = 2, j = 0; j < i; j++) - { - /* Show the info */ - sprintf(Dummy, _("%-28s : 期間 - %s ", "%s %s."), info[j], - report_magic_durations[info2[j]]); - prt(Dummy, k++, 15); - - /* Every 20 entries (lines 2 to 21), start over */ - if ((k == 22) && (j + 1 < i)) - { - prt(_("-- 続く --", "-- more --"), k, 15); - inkey(); - for (; k > 2; k--) prt("", k, 15); - } - } - - /* Pause */ - prt(_("[何かキーを押すとゲームに戻ります]", "[Press any key to continue]"), k, 13); - inkey(); - - /* Restore the screen */ - screen_load(); -} - /*! * @brief プレイヤー周辺の地形を感知する * @param range 効果範囲 @@ -1821,7 +23,7 @@ void report_magics(void) * @param known 地形から危険フラグを外すならTRUE * @return 効力があった場合TRUEを返す */ -static bool detect_feat_flag(int range, int flag, bool known) +static bool detect_feat_flag(POSITION range, int flag, bool known) { int x, y; bool detect = FALSE; @@ -1884,13 +86,13 @@ static bool detect_feat_flag(int range, int flag, bool known) * @param known 感知外範囲を超える警告フラグを立てる場合TRUEを返す * @return 効力があった場合TRUEを返す */ -bool detect_traps(int range, bool known) +bool detect_traps(POSITION range, bool known) { bool detect = detect_feat_flag(range, FF_TRAP, known); if (known) p_ptr->dtrap = TRUE; - if (music_singing(MUSIC_DETECT) && p_ptr->magic_num1[2] > 0) detect = FALSE; + if (music_singing(MUSIC_DETECT) && SINGING_COUNT(p_ptr) > 0) detect = FALSE; /* Describe */ if (detect) @@ -1908,11 +110,11 @@ bool detect_traps(int range, bool known) * @param range 効果範囲 * @return 効力があった場合TRUEを返す */ -bool detect_doors(int range) +bool detect_doors(POSITION range) { bool detect = detect_feat_flag(range, FF_DOOR, TRUE); - if (music_singing(MUSIC_DETECT) && p_ptr->magic_num1[2] > 0) detect = FALSE; + if (music_singing(MUSIC_DETECT) && SINGING_COUNT(p_ptr) > 0) detect = FALSE; /* Describe */ if (detect) @@ -1930,11 +132,11 @@ bool detect_doors(int range) * @param range 効果範囲 * @return 効力があった場合TRUEを返す */ -bool detect_stairs(int range) +bool detect_stairs(POSITION range) { bool detect = detect_feat_flag(range, FF_STAIRS, TRUE); - if (music_singing(MUSIC_DETECT) && p_ptr->magic_num1[2] > 0) detect = FALSE; + if (music_singing(MUSIC_DETECT) && SINGING_COUNT(p_ptr) > 0) detect = FALSE; /* Describe */ if (detect) @@ -1952,11 +154,11 @@ bool detect_stairs(int range) * @param range 効果範囲 * @return 効力があった場合TRUEを返す */ -bool detect_treasure(int range) +bool detect_treasure(POSITION range) { bool detect = detect_feat_flag(range, FF_HAS_GOLD, TRUE); - if (music_singing(MUSIC_DETECT) && p_ptr->magic_num1[2] > 6) detect = FALSE; + if (music_singing(MUSIC_DETECT) && SINGING_COUNT(p_ptr) > 6) detect = FALSE; /* Describe */ if (detect) @@ -1974,10 +176,10 @@ bool detect_treasure(int range) * @param range 効果範囲 * @return 効力があった場合TRUEを返す */ -bool detect_objects_gold(int range) +bool detect_objects_gold(POSITION range) { int i, y, x; - int range2 = range; + POSITION range2 = range; bool detect = FALSE; @@ -2015,7 +217,7 @@ bool detect_objects_gold(int range) } } - if (music_singing(MUSIC_DETECT) && p_ptr->magic_num1[2] > 6) detect = FALSE; + if (music_singing(MUSIC_DETECT) && SINGING_COUNT(p_ptr) > 6) detect = FALSE; /* Describe */ if (detect) @@ -2038,10 +240,10 @@ bool detect_objects_gold(int range) * @param range 効果範囲 * @return 効力があった場合TRUEを返す */ -bool detect_objects_normal(int range) +bool detect_objects_normal(POSITION range) { int i, y, x; - int range2 = range; + POSITION range2 = range; bool detect = FALSE; @@ -2079,7 +281,7 @@ bool detect_objects_normal(int range) } } - if (music_singing(MUSIC_DETECT) && p_ptr->magic_num1[2] > 6) detect = FALSE; + if (music_singing(MUSIC_DETECT) && SINGING_COUNT(p_ptr) > 6) detect = FALSE; /* Describe */ if (detect) @@ -2110,7 +312,7 @@ bool detect_objects_normal(int range) * It can probably be argued that this function is now too powerful. * */ -bool detect_objects_magic(int range) +bool detect_objects_magic(POSITION range) { int i, y, x, tv; @@ -2192,9 +394,10 @@ bool detect_objects_magic(int range) * @param range 効果範囲 * @return 効力があった場合TRUEを返す */ -bool detect_monsters_normal(int range) +bool detect_monsters_normal(POSITION range) { - int i, y, x; + MONSTER_IDX i; + POSITION y, x; bool flag = FALSE; @@ -2233,7 +436,7 @@ bool detect_monsters_normal(int range) } } - if (music_singing(MUSIC_DETECT) && p_ptr->magic_num1[2] > 3) flag = FALSE; + if (music_singing(MUSIC_DETECT) && SINGING_COUNT(p_ptr) > 3) flag = FALSE; /* Describe */ if (flag) @@ -2252,9 +455,10 @@ bool detect_monsters_normal(int range) * @param range 効果範囲 * @return 効力があった場合TRUEを返す */ -bool detect_monsters_invis(int range) +bool detect_monsters_invis(POSITION range) { - int i, y, x; + MONSTER_IDX i; + POSITION y, x; bool flag = FALSE; if (d_info[dungeon_type].flags1 & DF1_DARKNESS) range /= 3; @@ -2299,7 +503,7 @@ bool detect_monsters_invis(int range) } } - if (music_singing(MUSIC_DETECT) && p_ptr->magic_num1[2] > 3) flag = FALSE; + if (music_singing(MUSIC_DETECT) && SINGING_COUNT(p_ptr) > 3) flag = FALSE; /* Describe */ if (flag) @@ -2317,9 +521,10 @@ bool detect_monsters_invis(int range) * @param range 効果範囲 * @return 効力があった場合TRUEを返す */ -bool detect_monsters_evil(int range) +bool detect_monsters_evil(POSITION range) { - int i, y, x; + MONSTER_IDX i; + POSITION y, x; bool flag = FALSE; if (d_info[dungeon_type].flags1 & DF1_DARKNESS) range /= 3; @@ -2386,10 +591,11 @@ bool detect_monsters_evil(int range) * @param range 効果範囲 * @return 効力があった場合TRUEを返す */ -bool detect_monsters_nonliving(int range) +bool detect_monsters_nonliving(POSITION range) { - int i, y, x; - bool flag = FALSE; + MONSTER_IDX i; + POSITION y, x; + bool flag = FALSE; if (d_info[dungeon_type].flags1 & DF1_DARKNESS) range /= 3; @@ -2449,9 +655,10 @@ bool detect_monsters_nonliving(int range) * @param range 効果範囲 * @return 効力があった場合TRUEを返す */ -bool detect_monsters_mind(int range) +bool detect_monsters_mind(POSITION range) { - int i, y, x; + MONSTER_IDX i; + POSITION y, x; bool flag = FALSE; if (d_info[dungeon_type].flags1 & DF1_DARKNESS) range /= 3; @@ -2514,9 +721,10 @@ bool detect_monsters_mind(int range) * @param Match 対応シンボルの混じったモンスター文字列(複数指定化) * @return 効力があった場合TRUEを返す */ -bool detect_monsters_string(int range, cptr Match) +bool detect_monsters_string(POSITION range, cptr Match) { - int i, y, x; + MONSTER_IDX i; + POSITION y, x; bool flag = FALSE; if (d_info[dungeon_type].flags1 & DF1_DARKNESS) range /= 3; @@ -2561,7 +769,7 @@ bool detect_monsters_string(int range, cptr Match) } } - if (music_singing(MUSIC_DETECT) && p_ptr->magic_num1[2] > 3) flag = FALSE; + if (music_singing(MUSIC_DETECT) && SINGING_COUNT(p_ptr) > 3) flag = FALSE; /* Describe */ if (flag) @@ -2580,9 +788,10 @@ bool detect_monsters_string(int range, cptr Match) * @param match_flag 感知フラグ * @return 効力があった場合TRUEを返す */ -bool detect_monsters_xxx(int range, u32b match_flag) +bool detect_monsters_xxx(POSITION range, u32b match_flag) { - int i, y, x; + MONSTER_IDX i; + POSITION y, x; bool flag = FALSE; cptr desc_monsters = _("変なモンスター", "weird monsters"); @@ -2662,7 +871,7 @@ bool detect_monsters_xxx(int range, u32b match_flag) * @param range 効果範囲 * @return 効力があった場合TRUEを返す */ -bool detect_all(int range) +bool detect_all(POSITION range) { bool detect = FALSE; @@ -2697,7 +906,7 @@ bool detect_all(int range) * this is done in two passes. -- JDL * */ -bool project_hack(int typ, int dam) +bool project_hack(int typ, HIT_POINT dam) { int i, x, y; int flg = PROJECT_JUMP | PROJECT_KILL | PROJECT_HIDE; @@ -2799,7 +1008,7 @@ bool turn_undead(void) * @brief 視界内のアンデッド・モンスターにダメージを与える処理 / Dispel undead monsters * @return 効力があった場合TRUEを返す */ -bool dispel_undead(int dam) +bool dispel_undead(HIT_POINT dam) { bool tester = (project_hack(GF_DISP_UNDEAD, dam)); if (tester) @@ -2811,7 +1020,7 @@ bool dispel_undead(int dam) * @brief 視界内の邪悪なモンスターにダメージを与える処理 / Dispel evil monsters * @return 効力があった場合TRUEを返す */ -bool dispel_evil(int dam) +bool dispel_evil(HIT_POINT dam) { return (project_hack(GF_DISP_EVIL, dam)); } @@ -2820,7 +1029,7 @@ bool dispel_evil(int dam) * @brief 視界内の善良なモンスターにダメージを与える処理 / Dispel good monsters * @return 効力があった場合TRUEを返す */ -bool dispel_good(int dam) +bool dispel_good(HIT_POINT dam) { return (project_hack(GF_DISP_GOOD, dam)); } @@ -2829,7 +1038,7 @@ bool dispel_good(int dam) * @brief 視界内のあらゆるモンスターにダメージを与える処理 / Dispel all monsters * @return 効力があった場合TRUEを返す */ -bool dispel_monsters(int dam) +bool dispel_monsters(HIT_POINT dam) { return (project_hack(GF_DISP_ALL, dam)); } @@ -2838,7 +1047,7 @@ bool dispel_monsters(int dam) * @brief 視界内の生命のあるモンスターにダメージを与える処理 / Dispel 'living' monsters * @return 効力があった場合TRUEを返す */ -bool dispel_living(int dam) +bool dispel_living(HIT_POINT dam) { return (project_hack(GF_DISP_LIVING, dam)); } @@ -2847,7 +1056,7 @@ bool dispel_living(int dam) * @brief 視界内の悪魔系モンスターにダメージを与える処理 / Dispel 'living' monsters * @return 効力があった場合TRUEを返す */ -bool dispel_demons(int dam) +bool dispel_demons(HIT_POINT dam) { return (project_hack(GF_DISP_DEMON, dam)); } @@ -2866,9 +1075,9 @@ bool crusade(void) * @param who 怒らせる原因を起こしたモンスター(0ならばプレイヤー) * @return なし */ -void aggravate_monsters(int who) +void aggravate_monsters(MONSTER_IDX who) { - int i; + MONSTER_IDX i; bool sleep = FALSE; bool speed = FALSE; @@ -2929,7 +1138,7 @@ void aggravate_monsters(int who) * @param spell_name 抹殺効果を起こした魔法の名前 * @return 効力があった場合TRUEを返す */ -bool genocide_aux(int m_idx, int power, bool player_cast, int dam_side, cptr spell_name) +bool genocide_aux(MONSTER_IDX m_idx, int power, bool player_cast, int dam_side, cptr spell_name) { int msec = delay_factor * delay_factor * delay_factor; monster_type *m_ptr = &m_list[m_idx]; @@ -3030,7 +1239,7 @@ bool genocide_aux(int m_idx, int power, bool player_cast, int dam_side, cptr spe */ bool symbol_genocide(int power, bool player_cast) { - int i; + MONSTER_IDX i; char typ; bool result = FALSE; @@ -3077,7 +1286,7 @@ bool symbol_genocide(int power, bool player_cast) */ bool mass_genocide(int power, bool player_cast) { - int i; + MONSTER_IDX i; bool result = FALSE; /* Prevent mass genocide in quest levels */ @@ -3119,7 +1328,7 @@ bool mass_genocide(int power, bool player_cast) */ bool mass_genocide_undead(int power, bool player_cast) { - int i; + MONSTER_IDX i; bool result = FALSE; /* Prevent mass genocide in quest levels */ @@ -3162,9 +1371,9 @@ bool mass_genocide_undead(int power, bool player_cast) */ bool probing(void) { - int i, speed; - int cu, cv; - bool probe = FALSE; + int i, speed; + bool_hack cu, cv; + bool probe = FALSE; char buf[256]; cptr align; @@ -3212,6 +1421,7 @@ bool probing(void) speed = m_ptr->mspeed - 110; if (MON_FAST(m_ptr)) speed += 10; if (MON_SLOW(m_ptr)) speed -= 10; + if (ironman_nightmare) speed += 5; /* Get the monster's alignment */ #ifdef JP @@ -3233,11 +1443,9 @@ bool probing(void) #endif /* Describe the monster */ -#ifdef JP -sprintf(buf,"%s ... 属性:%s HP:%d/%d AC:%d 速度:%s%d 経験:", m_name, align, m_ptr->hp, m_ptr->maxhp, r_ptr->ac, (speed > 0) ? "+" : "", speed); -#else -sprintf(buf, "%s ... align:%s HP:%d/%d AC:%d speed:%s%d exp:", m_name, align, m_ptr->hp, m_ptr->maxhp, r_ptr->ac, (speed > 0) ? "+" : "", speed); -#endif + sprintf(buf,_("%s ... 属性:%s HP:%d/%d AC:%d 速度:%s%d 経験:", "%s ... align:%s HP:%d/%d AC:%d speed:%s%d exp:"), + m_name, align, (int)m_ptr->hp, (int)m_ptr->maxhp, r_ptr->ac, (speed > 0) ? "+" : "", speed); + if (r_ptr->next_r_idx) { strcat(buf, format("%d/%d ", m_ptr->exp, r_ptr->next_exp)); @@ -3626,7 +1834,7 @@ bool destroy_area(int y1, int x1, int r, bool in_generate) * This has allowed massive simplification of the "monster" code. * */ -bool earthquake_aux(int cy, int cx, int r, int m_idx) +bool earthquake_aux(int cy, int cx, int r, MONSTER_IDX m_idx) { int i, t, y, x, yy, xx, dy, dx; int damage = 0; @@ -3929,7 +2137,7 @@ bool earthquake_aux(int cy, int cx, int r, int m_idx) /* Hack -- Escape from the rock */ if (sn) { - int m_idx_aux = cave[yy][xx].m_idx; + IDX m_idx_aux = cave[yy][xx].m_idx; /* Update the old location */ cave[yy][xx].m_idx = 0; @@ -4101,7 +2309,7 @@ bool earthquake(int cy, int cx, int r) */ void discharge_minion(void) { - int i; + MONSTER_IDX i; bool okay = TRUE; for (i = 1; i < m_max; i++) @@ -4117,7 +2325,7 @@ void discharge_minion(void) } for (i = 1; i < m_max; i++) { - int dam; + HIT_POINT dam; monster_type *m_ptr = &m_list[i]; monster_race *r_ptr; @@ -4587,9 +2795,9 @@ void unlite_room(int y1, int x1) * @param rad 効果半径 * @return 作用が実際にあった場合TRUEを返す */ -bool lite_area(int dam, int rad) +bool lite_area(HIT_POINT dam, int rad) { - int flg = PROJECT_GRID | PROJECT_KILL; + BIT_FLAGS flg = PROJECT_GRID | PROJECT_KILL; if (d_info[dungeon_type].flags1 & DF1_DARKNESS) { @@ -4620,9 +2828,9 @@ bool lite_area(int dam, int rad) * @param rad 効果半径 * @return 作用が実際にあった場合TRUEを返す */ -bool unlite_area(int dam, int rad) +bool unlite_area(HIT_POINT dam, int rad) { - int flg = PROJECT_GRID | PROJECT_KILL; + BIT_FLAGS flg = PROJECT_GRID | PROJECT_KILL; /* Hack -- Message */ if (!p_ptr->blind) @@ -4656,13 +2864,13 @@ bool unlite_area(int dam, int rad) * Affect grids, objects, and monsters * */ -bool fire_ball(int typ, int dir, int dam, int rad) +bool fire_ball(int typ, int dir, HIT_POINT dam, int rad) { int tx, ty; - int flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL; + BIT_FLAGS flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL; - if (typ == GF_CONTROL_LIVING) flg|= PROJECT_HIDE; + if (typ == GF_CHARM_LIVING) flg|= PROJECT_HIDE; /* Use the given direction */ tx = p_ptr->x + 99 * ddx[dir]; ty = p_ptr->y + 99 * ddy[dir]; @@ -4679,6 +2887,24 @@ bool fire_ball(int typ, int dir, int dam, int rad) return (project(0, rad, ty, tx, dam, typ, flg, -1)); } +/*! +* @brief ブレス系スペルの発動 / Cast a breath spell +* @param typ 効果属性 +* @param dir 方向(5ならばグローバル変数 target_col/target_row の座標を目標にする) +* @param dam 威力 +* @param rad 半径 +* @return 作用が実際にあった場合TRUEを返す +* @details +*
+* Stop if we hit a monster, act as a "ball"
+* Allow "target" mode to pass over monsters
+* Affect grids, objects, and monsters
+* 
+*/ +bool fire_breath(int typ, int dir, HIT_POINT dam, int rad) +{ + return fire_ball(typ, dir, dam, -rad); +} /*! @@ -4695,11 +2921,11 @@ bool fire_ball(int typ, int dir, int dam, int rad) * Affect grids, objects, and monsters * */ -bool fire_rocket(int typ, int dir, int dam, int rad) +bool fire_rocket(int typ, int dir, HIT_POINT dam, int rad) { int tx, ty; - int flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL; + BIT_FLAGS flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL; /* Use the given direction */ tx = p_ptr->x + 99 * ddx[dir]; @@ -4731,11 +2957,11 @@ bool fire_rocket(int typ, int dir, int dam, int rad) * Affect grids, objects, and monsters * */ -bool fire_ball_hide(int typ, int dir, int dam, int rad) +bool fire_ball_hide(int typ, int dir, HIT_POINT dam, int rad) { int tx, ty; - int flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_HIDE; + BIT_FLAGS flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_HIDE; /* Use the given direction */ tx = p_ptr->x + 99 * ddx[dir]; @@ -4772,9 +2998,9 @@ bool fire_ball_hide(int typ, int dir, int dam, int rad) * Option to hurt the player. * */ -bool fire_meteor(int who, int typ, int y, int x, int dam, int rad) +bool fire_meteor(MONSTER_IDX who, EFFECT_ID typ, POSITION y, POSITION x, HIT_POINT dam, POSITION rad) { - int flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL; + BIT_FLAGS flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL; /* Analyze the "target" and the caster. */ return (project(who, rad, y, x, dam, typ, flg, -1)); @@ -4797,7 +3023,7 @@ bool fire_blast(int typ, int dir, int dd, int ds, int num, int dev) int ty, tx, y, x; int i; - int flg = PROJECT_FAST | PROJECT_THRU | PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE | PROJECT_GRID; + BIT_FLAGS flg = PROJECT_FAST | PROJECT_THRU | PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE | PROJECT_GRID; /* Assume okay */ bool result = TRUE; @@ -4923,7 +3149,7 @@ bool teleport_swap(int dir) * @param flg フラグ * @return 作用が実際にあった場合TRUEを返す */ -bool project_hook(int typ, int dir, int dam, int flg) +bool project_hook(int typ, int dir, HIT_POINT dam, BIT_FLAGS flg) { int tx, ty; @@ -4958,9 +3184,9 @@ bool project_hook(int typ, int dir, int dam, int flg) * Affect monsters and grids (not objects). * */ -bool fire_bolt(int typ, int dir, int dam) +bool fire_bolt(int typ, int dir, HIT_POINT dam) { - int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_GRID; + BIT_FLAGS flg = PROJECT_STOP | PROJECT_KILL | PROJECT_GRID; if (typ != GF_ARROW) flg |= PROJECT_REFLECTABLE; return (project_hook(typ, dir, dam, flg)); } @@ -4978,9 +3204,9 @@ bool fire_bolt(int typ, int dir, int dam) * Affect monsters, grids and objects. * */ -bool fire_beam(int typ, int dir, int dam) +bool fire_beam(int typ, int dir, HIT_POINT dam) { - int flg = PROJECT_BEAM | PROJECT_KILL | PROJECT_GRID | PROJECT_ITEM; + BIT_FLAGS flg = PROJECT_BEAM | PROJECT_KILL | PROJECT_GRID | PROJECT_ITEM; return (project_hook(typ, dir, dam, flg)); } @@ -4998,7 +3224,7 @@ bool fire_beam(int typ, int dir, int dam) * Affect monsters, grids and objects. * */ -bool fire_bolt_or_beam(int prob, int typ, int dir, int dam) +bool fire_bolt_or_beam(int prob, int typ, int dir, HIT_POINT dam) { if (randint0(100) < prob) { @@ -5016,22 +3242,22 @@ bool fire_bolt_or_beam(int prob, int typ, int dir, int dam) * @param dam 威力 * @return 作用が実際にあった場合TRUEを返す */ -bool lite_line(int dir, int dam) +bool lite_line(int dir, HIT_POINT dam) { - int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_KILL; + BIT_FLAGS flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_KILL; return (project_hook(GF_LITE_WEAK, dir, dam, flg)); } /*! - * @brief 吸血ボルト処理 + * @brief 衰弱ボルト処理 * @param dir 方向(5ならばグローバル変数 target_col/target_row の座標を目標にする) * @param dam 威力 * @return 作用が実際にあった場合TRUEを返す */ -bool drain_life(int dir, int dam) +bool hypodynamic_bolt(int dir, HIT_POINT dam) { - int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE; - return (project_hook(GF_OLD_DRAIN, dir, dam, flg)); + BIT_FLAGS flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE; + return (project_hook(GF_HYPODYNAMIA, dir, dam, flg)); } /*! @@ -5040,9 +3266,9 @@ bool drain_life(int dir, int dam) * @param dam 威力 * @return 作用が実際にあった場合TRUEを返す */ -bool wall_to_mud(int dir, int dam) +bool wall_to_mud(int dir, HIT_POINT dam) { - int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL; + BIT_FLAGS flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL; return (project_hook(GF_KILL_WALL, dir, dam, flg)); } @@ -5053,7 +3279,7 @@ bool wall_to_mud(int dir, int dam) */ bool wizard_lock(int dir) { - int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL; + BIT_FLAGS flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL; return (project_hook(GF_JAM_DOOR, dir, 20 + randint1(30), flg)); } @@ -5064,7 +3290,7 @@ bool wizard_lock(int dir) */ bool destroy_door(int dir) { - int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM; + BIT_FLAGS flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM; return (project_hook(GF_KILL_DOOR, dir, 0, flg)); } @@ -5075,7 +3301,7 @@ bool destroy_door(int dir) */ bool disarm_trap(int dir) { - int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM; + BIT_FLAGS flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM; return (project_hook(GF_KILL_TRAP, dir, 0, flg)); } @@ -5085,9 +3311,9 @@ bool disarm_trap(int dir) * @param dam 威力 * @return 作用が実際にあった場合TRUEを返す */ -bool heal_monster(int dir, int dam) +bool heal_monster(int dir, HIT_POINT dam) { - int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE; + BIT_FLAGS flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE; return (project_hook(GF_OLD_HEAL, dir, dam, flg)); } @@ -5099,7 +3325,7 @@ bool heal_monster(int dir, int dam) */ bool speed_monster(int dir, int power) { - int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE; + BIT_FLAGS flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE; return (project_hook(GF_OLD_SPEED, dir, power, flg)); } @@ -5111,7 +3337,7 @@ bool speed_monster(int dir, int power) */ bool slow_monster(int dir, int power) { - int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE; + BIT_FLAGS flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE; return (project_hook(GF_OLD_SLOW, dir, power, flg)); } @@ -5123,7 +3349,7 @@ bool slow_monster(int dir, int power) */ bool sleep_monster(int dir, int power) { - int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE; + BIT_FLAGS flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE; return (project_hook(GF_OLD_SLEEP, dir, power, flg)); } @@ -5157,7 +3383,7 @@ bool stasis_evil(int dir) */ bool confuse_monster(int dir, int plev) { - int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE; + BIT_FLAGS flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE; return (project_hook(GF_OLD_CONF, dir, plev, flg)); } @@ -5169,7 +3395,7 @@ bool confuse_monster(int dir, int plev) */ bool stun_monster(int dir, int plev) { - int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE; + BIT_FLAGS flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE; return (project_hook(GF_STUN, dir, plev, flg)); } @@ -5181,7 +3407,7 @@ bool stun_monster(int dir, int plev) */ bool poly_monster(int dir, int power) { - int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE; + BIT_FLAGS flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE; bool tester = (project_hook(GF_OLD_POLY, dir, power, flg)); if (tester) chg_virtue(V_CHANCE, 1); @@ -5195,7 +3421,7 @@ bool poly_monster(int dir, int power) */ bool clone_monster(int dir) { - int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE; + BIT_FLAGS flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE; return (project_hook(GF_OLD_CLONE, dir, 0, flg)); } @@ -5207,7 +3433,7 @@ bool clone_monster(int dir) */ bool fear_monster(int dir, int plev) { - int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE; + BIT_FLAGS flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE; return (project_hook(GF_TURN_ALL, dir, plev, flg)); } @@ -5219,7 +3445,7 @@ bool fear_monster(int dir, int plev) */ bool death_ray(int dir, int plev) { - int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE; + BIT_FLAGS flg = PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE; return (project_hook(GF_DEATH_RAY, dir, plev * 200, flg)); } @@ -5231,7 +3457,7 @@ bool death_ray(int dir, int plev) */ bool teleport_monster(int dir, int distance) { - int flg = PROJECT_BEAM | PROJECT_KILL; + BIT_FLAGS flg = PROJECT_BEAM | PROJECT_KILL; return (project_hook(GF_AWAY_ALL, dir, distance, flg)); } @@ -5241,7 +3467,7 @@ bool teleport_monster(int dir, int distance) */ bool door_creation(void) { - int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE; + BIT_FLAGS flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE; return (project(0, 1, p_ptr->y, p_ptr->x, 0, GF_MAKE_DOOR, flg, -1)); } @@ -5253,7 +3479,7 @@ bool door_creation(void) */ bool trap_creation(int y, int x) { - int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE; + BIT_FLAGS flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE; return (project(0, 1, y, x, 0, GF_MAKE_TRAP, flg, -1)); } @@ -5263,7 +3489,7 @@ bool trap_creation(int y, int x) */ bool tree_creation(void) { - int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE; + BIT_FLAGS flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE; return (project(0, 1, p_ptr->y, p_ptr->x, 0, GF_MAKE_TREE, flg, -1)); } @@ -5273,7 +3499,7 @@ bool tree_creation(void) */ bool glyph_creation(void) { - int flg = PROJECT_GRID | PROJECT_ITEM; + BIT_FLAGS flg = PROJECT_GRID | PROJECT_ITEM; return (project(0, 1, p_ptr->y, p_ptr->x, 0, GF_MAKE_GLYPH, flg, -1)); } @@ -5283,7 +3509,7 @@ bool glyph_creation(void) */ bool wall_stone(void) { - int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE; + BIT_FLAGS flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE; bool dummy = (project(0, 1, p_ptr->y, p_ptr->x, 0, GF_STONE_WALL, flg, -1)); @@ -5302,7 +3528,7 @@ bool wall_stone(void) */ bool destroy_doors_touch(void) { - int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE; + BIT_FLAGS flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE; return (project(0, 1, p_ptr->y, p_ptr->x, 0, GF_KILL_DOOR, flg, -1)); } @@ -5312,7 +3538,7 @@ bool destroy_doors_touch(void) */ bool disarm_traps_touch(void) { - int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE; + BIT_FLAGS flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE; return (project(0, 1, p_ptr->y, p_ptr->x, 0, GF_KILL_TRAP, flg, -1)); } @@ -5322,7 +3548,7 @@ bool disarm_traps_touch(void) */ bool sleep_monsters_touch(void) { - int flg = PROJECT_KILL | PROJECT_HIDE; + BIT_FLAGS flg = PROJECT_KILL | PROJECT_HIDE; return (project(0, 1, p_ptr->y, p_ptr->x, p_ptr->lev, GF_OLD_SLEEP, flg, -1)); } @@ -5334,9 +3560,9 @@ bool sleep_monsters_touch(void) * @param x 起点X座標 * @return 作用が実際にあった場合TRUEを返す */ -bool animate_dead(int who, int y, int x) +bool animate_dead(MONSTER_IDX who, POSITION y, POSITION x) { - int flg = PROJECT_ITEM | PROJECT_HIDE; + BIT_FLAGS flg = PROJECT_ITEM | PROJECT_HIDE; return (project(who, 5, y, x, 0, GF_ANIM_DEAD, flg, -1)); } @@ -5407,7 +3633,7 @@ bool activate_ty_curse(bool stop_ty, int *count) { int i = 0; - int flg = (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP); + BIT_FLAGS flg = (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP); do { @@ -5423,7 +3649,7 @@ bool activate_ty_curse(bool stop_ty, int *count) case 30: case 31: if (!(*count)) { - int dam = damroll(10, 10); + HIT_POINT dam = damroll(10, 10); msg_print(_("純粋な魔力の次元への扉が開いた!", "A portal opens to a plane of raw mana!")); project(0, 8, p_ptr->y, p_ptr->x, dam, GF_MANA, flg, -1); take_hit(DAMAGE_NOESCAPE, dam, _("純粋な魔力の解放", "released pure mana"), -1); @@ -5517,12 +3743,12 @@ bool activate_ty_curse(bool stop_ty, int *count) * @param can_pet プレイヤーのペットとなる可能性があるならばTRUEにする * @return 作用が実際にあった場合TRUEを返す */ -int activate_hi_summon(int y, int x, bool can_pet) +int activate_hi_summon(POSITION y, POSITION x, bool can_pet) { int i; int count = 0; - int summon_lev; - u32b mode = PM_ALLOW_GROUP; + DEPTH summon_lev; + BIT_FLAGS mode = PM_ALLOW_GROUP; bool pet = FALSE; if (can_pet) @@ -5606,12 +3832,12 @@ int activate_hi_summon(int y, int x, bool can_pet) * @param x 召喚位置X座標 * @return 作用が実際にあった場合TRUEを返す */ -int summon_cyber(int who, int y, int x) +int summon_cyber(MONSTER_IDX who, POSITION y, POSITION x) { int i; int max_cyber = (easy_band ? 1 : (dun_level / 50) + randint1(2)); int count = 0; - u32b mode = PM_ALLOW_GROUP; + BIT_FLAGS mode = PM_ALLOW_GROUP; /* Summoned by a monster */ if (who > 0) @@ -5637,7 +3863,7 @@ int summon_cyber(int who, int y, int x) void wall_breaker(void) { int i; - int y = 0, x = 0; + POSITION y = 0, x = 0; int attempts = 1000; if (randint1(80 + p_ptr->lev) < 70) @@ -5683,7 +3909,7 @@ void wall_breaker(void) * @param dam 効力 * @return 作用が実際にあった場合TRUEを返す */ -bool confuse_monsters(int dam) +bool confuse_monsters(HIT_POINT dam) { return (project_hack(GF_OLD_CONF, dam)); } @@ -5694,7 +3920,7 @@ bool confuse_monsters(int dam) * @param dam 効力 * @return 作用が実際にあった場合TRUEを返す */ -bool charm_monsters(int dam) +bool charm_monsters(HIT_POINT dam) { return (project_hack(GF_CHARM, dam)); } @@ -5705,7 +3931,7 @@ bool charm_monsters(int dam) * @param dam 効力 * @return 作用が実際にあった場合TRUEを返す */ -bool charm_animals(int dam) +bool charm_animals(HIT_POINT dam) { return (project_hack(GF_CONTROL_ANIMAL, dam)); } @@ -5716,7 +3942,7 @@ bool charm_animals(int dam) * @param dam 効力 * @return 作用が実際にあった場合TRUEを返す */ -bool stun_monsters(int dam) +bool stun_monsters(HIT_POINT dam) { return (project_hack(GF_STUN, dam)); } @@ -5727,7 +3953,7 @@ bool stun_monsters(int dam) * @param dam 効力 * @return 作用が実際にあった場合TRUEを返す */ -bool stasis_monsters(int dam) +bool stasis_monsters(HIT_POINT dam) { return (project_hack(GF_STASIS, dam)); } @@ -5738,7 +3964,7 @@ bool stasis_monsters(int dam) * @param dam 効力 * @return 作用が実際にあった場合TRUEを返す */ -bool mindblast_monsters(int dam) +bool mindblast_monsters(HIT_POINT dam) { return (project_hack(GF_PSI, dam)); } @@ -5760,7 +3986,7 @@ bool banish_monsters(int dist) * @param dam 効力 * @return 作用が実際にあった場合TRUEを返す */ -bool turn_evil(int dam) +bool turn_evil(HIT_POINT dam) { return (project_hack(GF_TURN_EVIL, dam)); } @@ -5771,7 +3997,7 @@ bool turn_evil(int dam) * @param dam 効力 * @return 作用が実際にあった場合TRUEを返す */ -bool turn_monsters(int dam) +bool turn_monsters(HIT_POINT dam) { return (project_hack(GF_TURN_ALL, dam)); } @@ -5794,7 +4020,7 @@ bool deathray_monsters(void) */ bool charm_monster(int dir, int plev) { - int flg = PROJECT_STOP | PROJECT_KILL; + BIT_FLAGS flg = PROJECT_STOP | PROJECT_KILL; return (project_hook(GF_CHARM, dir, plev, flg)); } @@ -5806,7 +4032,7 @@ bool charm_monster(int dir, int plev) */ bool control_one_undead(int dir, int plev) { - int flg = PROJECT_STOP | PROJECT_KILL; + BIT_FLAGS flg = PROJECT_STOP | PROJECT_KILL; return (project_hook(GF_CONTROL_UNDEAD, dir, plev, flg)); } @@ -5818,7 +4044,7 @@ bool control_one_undead(int dir, int plev) */ bool control_one_demon(int dir, int plev) { - int flg = PROJECT_STOP | PROJECT_KILL; + BIT_FLAGS flg = PROJECT_STOP | PROJECT_KILL; return (project_hook(GF_CONTROL_DEMON, dir, plev, flg)); } @@ -5830,21 +4056,10 @@ bool control_one_demon(int dir, int plev) */ bool charm_animal(int dir, int plev) { - int flg = PROJECT_STOP | PROJECT_KILL; + BIT_FLAGS flg = PROJECT_STOP | PROJECT_KILL; return (project_hook(GF_CONTROL_ANIMAL, dir, plev, flg)); } -/*! - * @brief 生物支配(1体) - * @param dir 方向(5ならばグローバル変数 target_col/target_row の座標を目標にする) - * @param plev パワー - * @return 作用が実際にあった場合TRUEを返す - */ -bool charm_living(int dir, int plev) -{ - int flg = PROJECT_STOP | PROJECT_KILL; - return (project_hook(GF_CONTROL_LIVING, dir, plev, flg)); -} /*! * @brief 変わり身処理 @@ -5900,28 +4115,383 @@ bool kawarimi(bool success) /*! - * @brief 入身処理 / "Rush Attack" routine for Samurai or Ninja - * @param mdeath 目標モンスターが死亡したかを返す - * @return 作用が実際にあった場合TRUEを返す / Return value is for checking "done" - */ -bool rush_attack(bool *mdeath) + * @brief 入身処理 / "Rush Attack" routine for Samurai or Ninja + * @param mdeath 目標モンスターが死亡したかを返す + * @return 作用が実際にあった場合TRUEを返す / Return value is for checking "done" + */ +bool rush_attack(bool *mdeath) +{ + int dir; + int tx, ty; + int tm_idx = 0; + u16b path_g[32]; + int path_n, i; + bool tmp_mdeath = FALSE; + bool moved = FALSE; + + if (mdeath) *mdeath = FALSE; + + project_length = 5; + if (!get_aim_dir(&dir)) return FALSE; + + /* Use the given direction */ + tx = p_ptr->x + project_length * ddx[dir]; + ty = p_ptr->y + project_length * ddy[dir]; + + /* Hack -- Use an actual "target" */ + if ((dir == 5) && target_okay()) + { + tx = target_col; + ty = target_row; + } + + if (in_bounds(ty, tx)) tm_idx = cave[ty][tx].m_idx; + + path_n = project_path(path_g, project_length, p_ptr->y, p_ptr->x, ty, tx, PROJECT_STOP | PROJECT_KILL); + project_length = 0; + + /* No need to move */ + if (!path_n) return TRUE; + + /* Use ty and tx as to-move point */ + ty = p_ptr->y; + tx = p_ptr->x; + + /* Project along the path */ + for (i = 0; i < path_n; i++) + { + monster_type *m_ptr; + + int ny = GRID_Y(path_g[i]); + int nx = GRID_X(path_g[i]); + + if (cave_empty_bold(ny, nx) && player_can_enter(cave[ny][nx].feat, 0)) + { + ty = ny; + tx = nx; + + /* Go to next grid */ + continue; + } + + if (!cave[ny][nx].m_idx) + { + if (tm_idx) + { + msg_print(_("失敗!", "Failed!")); + } + else + { + msg_print(_("ここには入身では入れない。", "You can't move to that place.")); + } + + /* Exit loop */ + break; + } + + /* Move player before updating the monster */ + if (!player_bold(ty, tx)) teleport_player_to(ty, tx, TELEPORT_NONMAGICAL); + + /* Update the monster */ + update_mon(cave[ny][nx].m_idx, TRUE); + + /* Found a monster */ + m_ptr = &m_list[cave[ny][nx].m_idx]; + + if (tm_idx != cave[ny][nx].m_idx) + { +#ifdef JP + msg_format("%s%sが立ちふさがっている!", tm_idx ? "別の" : "", + m_ptr->ml ? "モンスター" : "何か"); +#else + msg_format("There is %s in the way!", m_ptr->ml ? (tm_idx ? "another monster" : "a monster") : "someone"); +#endif + } + else if (!player_bold(ty, tx)) + { + /* Hold the monster name */ + char m_name[80]; + + /* Get the monster name (BEFORE polymorphing) */ + monster_desc(m_name, m_ptr, 0); + msg_format(_("素早く%sの懐に入り込んだ!", "You quickly jump in and attack %s!"), m_name); + } + + if (!player_bold(ty, tx)) teleport_player_to(ty, tx, TELEPORT_NONMAGICAL); + moved = TRUE; + tmp_mdeath = py_attack(ny, nx, HISSATSU_NYUSIN); + + break; + } + + if (!moved && !player_bold(ty, tx)) teleport_player_to(ty, tx, TELEPORT_NONMAGICAL); + + if (mdeath) *mdeath = tmp_mdeath; + return TRUE; +} + + +/*! + * @brief 全鏡の消去 / Remove all mirrors in this floor + * @param explode 爆発処理を伴うならばTRUE + * @return なし + */ +void remove_all_mirrors(bool explode) +{ + int x, y; + + for (x = 0; x < cur_wid; x++) + { + for (y = 0; y < cur_hgt; y++) + { + if (is_mirror_grid(&cave[y][x])) + { + remove_mirror(y, x); + if (explode) + project(0, 2, y, x, p_ptr->lev / 2 + 5, GF_SHARDS, + (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP | PROJECT_NO_HANGEKI), -1); + } + } + } +} + +/*! + * @brief 『一つの指輪』の効果処理 / + * Hack -- activate the ring of power + * @param dir 発動の方向ID + * @return なし + */ +void ring_of_power(int dir) +{ + /* Pick a random effect */ + switch (randint1(10)) + { + case 1: + case 2: + { + /* Message */ + msg_print(_("あなたは悪性のオーラに包み込まれた。", "You are surrounded by a malignant aura.")); + sound(SOUND_EVIL); + + /* Decrease all stats (permanently) */ + (void)dec_stat(A_STR, 50, TRUE); + (void)dec_stat(A_INT, 50, TRUE); + (void)dec_stat(A_WIS, 50, TRUE); + (void)dec_stat(A_DEX, 50, TRUE); + (void)dec_stat(A_CON, 50, TRUE); + (void)dec_stat(A_CHR, 50, TRUE); + + /* Lose some experience (permanently) */ + p_ptr->exp -= (p_ptr->exp / 4); + p_ptr->max_exp -= (p_ptr->exp / 4); + check_experience(); + + break; + } + + case 3: + { + /* Message */ + msg_print(_("あなたは強力なオーラに包み込まれた。", "You are surrounded by a powerful aura.")); + + /* Dispel monsters */ + dispel_monsters(1000); + + break; + } + + case 4: + case 5: + case 6: + { + /* Mana Ball */ + fire_ball(GF_MANA, dir, 600, 3); + + break; + } + + case 7: + case 8: + case 9: + case 10: + { + /* Mana Bolt */ + fire_bolt(GF_MANA, dir, 500); + + break; + } + } +} + +/*! +* @brief 運命の輪、並びにカオス的な効果の発動 +* @param spell ランダムな効果を選択するための基準ID +* @return なし +*/ +void wild_magic(int spell) +{ + int counter = 0; + int type = SUMMON_MOLD + randint0(6); + + if (type < SUMMON_MOLD) type = SUMMON_MOLD; + else if (type > SUMMON_MIMIC) type = SUMMON_MIMIC; + + switch (randint1(spell) + randint1(8) + 1) + { + case 1: + case 2: + case 3: + teleport_player(10, TELEPORT_PASSIVE); + break; + case 4: + case 5: + case 6: + teleport_player(100, TELEPORT_PASSIVE); + break; + case 7: + case 8: + teleport_player(200, TELEPORT_PASSIVE); + break; + case 9: + case 10: + case 11: + unlite_area(10, 3); + break; + case 12: + case 13: + case 14: + lite_area(damroll(2, 3), 2); + break; + case 15: + destroy_doors_touch(); + break; + case 16: case 17: + wall_breaker(); + case 18: + sleep_monsters_touch(); + break; + case 19: + case 20: + trap_creation(p_ptr->y, p_ptr->x); + break; + case 21: + case 22: + door_creation(); + break; + case 23: + case 24: + case 25: + aggravate_monsters(0); + break; + case 26: + earthquake(p_ptr->y, p_ptr->x, 5); + break; + case 27: + case 28: + (void)gain_random_mutation(0); + break; + case 29: + case 30: + apply_disenchant(1); + break; + case 31: + lose_all_info(); + break; + case 32: + fire_ball(GF_CHAOS, 0, spell + 5, 1 + (spell / 10)); + break; + case 33: + wall_stone(); + break; + case 34: + case 35: + while (counter++ < 8) + { + (void)summon_specific(0, p_ptr->y, p_ptr->x, (dun_level * 3) / 2, type, (PM_ALLOW_GROUP | PM_NO_PET)); + } + break; + case 36: + case 37: + activate_hi_summon(p_ptr->y, p_ptr->x, FALSE); + break; + case 38: + (void)summon_cyber(-1, p_ptr->y, p_ptr->x); + break; + default: + { + int count = 0; + (void)activate_ty_curse(FALSE, &count); + break; + } + } + + return; +} + +/*! +* @brief カオス魔法「流星群」の処理としてプレイヤーを中心に隕石落下処理を10+1d10回繰り返す。 +* / Drop 10+1d10 meteor ball at random places near the player +* @param dam ダメージ +* @param rad 効力の半径 +* @return なし +*/ +void cast_meteor(HIT_POINT dam, int rad) +{ + int i; + int b = 10 + randint1(10); + + for (i = 0; i < b; i++) + { + POSITION y = 0, x = 0; + int count; + + for (count = 0; count <= 20; count++) + { + int dy, dx, d; + + x = p_ptr->x - 8 + randint0(17); + y = p_ptr->y - 8 + randint0(17); + + dx = (p_ptr->x > x) ? (p_ptr->x - x) : (x - p_ptr->x); + dy = (p_ptr->y > y) ? (p_ptr->y - y) : (y - p_ptr->y); + + /* Approximate distance */ + d = (dy > dx) ? (dy + (dx >> 1)) : (dx + (dy >> 1)); + + if (d >= 9) continue; + + if (!in_bounds(y, x) || !projectable(p_ptr->y, p_ptr->x, y, x) + || !cave_have_flag_bold(y, x, FF_PROJECT)) continue; + + /* Valid position */ + break; + } + + if (count > 20) continue; + + project(0, rad, y, x, dam, GF_METEOR, PROJECT_KILL | PROJECT_JUMP | PROJECT_ITEM, -1); + } +} + + +/*! +* @brief 破邪魔法「神の怒り」の処理としてターゲットを指定した後分解のボールを最大20回発生させる。 +* @param dam ダメージ +* @param rad 効力の半径 +* @return ターゲットを指定し、実行したならばTRUEを返す。 +*/ +bool cast_wrath_of_the_god(HIT_POINT dam, int rad) { - int dir; - int tx, ty; - int tm_idx = 0; - u16b path_g[32]; - int path_n, i; - bool tmp_mdeath = FALSE; - bool moved = FALSE; + int x, y, tx, ty; + int nx, ny; + int dir, i; + int b = 10 + randint1(10); - if (mdeath) *mdeath = FALSE; - - project_length = 5; if (!get_aim_dir(&dir)) return FALSE; /* Use the given direction */ - tx = p_ptr->x + project_length * ddx[dir]; - ty = p_ptr->y + project_length * ddy[dir]; + tx = p_ptr->x + 99 * ddx[dir]; + ty = p_ptr->y + 99 * ddy[dir]; /* Hack -- Use an actual "target" */ if ((dir == 5) && target_okay()) @@ -5930,112 +4500,509 @@ bool rush_attack(bool *mdeath) ty = target_row; } - if (in_bounds(ty, tx)) tm_idx = cave[ty][tx].m_idx; + x = p_ptr->x; + y = p_ptr->y; - path_n = project_path(path_g, project_length, p_ptr->y, p_ptr->x, ty, tx, PROJECT_STOP | PROJECT_KILL); - project_length = 0; + while (1) + { + /* Hack -- Stop at the target */ + if ((y == ty) && (x == tx)) break; - /* No need to move */ - if (!path_n) return TRUE; + ny = y; + nx = x; + mmove2(&ny, &nx, p_ptr->y, p_ptr->x, ty, tx); - /* Use ty and tx as to-move point */ - ty = p_ptr->y; - tx = p_ptr->x; + /* Stop at maximum range */ + if (MAX_RANGE <= distance(p_ptr->y, p_ptr->x, ny, nx)) break; - /* Project along the path */ - for (i = 0; i < path_n; i++) - { - monster_type *m_ptr; + /* Stopped by walls/doors */ + if (!cave_have_flag_bold(ny, nx, FF_PROJECT)) break; - int ny = GRID_Y(path_g[i]); - int nx = GRID_X(path_g[i]); + /* Stopped by monsters */ + if ((dir != 5) && cave[ny][nx].m_idx != 0) break; - if (cave_empty_bold(ny, nx) && player_can_enter(cave[ny][nx].feat, 0)) - { - ty = ny; - tx = nx; + /* Save the new location */ + x = nx; + y = ny; + } + tx = x; + ty = y; - /* Go to next grid */ - continue; - } + for (i = 0; i < b; i++) + { + int count = 20, d = 0; - if (!cave[ny][nx].m_idx) + while (count--) { - if (tm_idx) - { - msg_print(_("失敗!", "Failed!")); - } - else - { - msg_print(_("ここには入身では入れない。", "You can't move to that place.")); - } + int dx, dy; - /* Exit loop */ - break; + x = tx - 5 + randint0(11); + y = ty - 5 + randint0(11); + + dx = (tx > x) ? (tx - x) : (x - tx); + dy = (ty > y) ? (ty - y) : (y - ty); + + /* Approximate distance */ + d = (dy > dx) ? (dy + (dx >> 1)) : (dx + (dy >> 1)); + /* Within the radius */ + if (d < 5) break; } - /* Move player before updating the monster */ - if (!player_bold(ty, tx)) teleport_player_to(ty, tx, TELEPORT_NONMAGICAL); + if (count < 0) continue; - /* Update the monster */ - update_mon(cave[ny][nx].m_idx, TRUE); + /* Cannot penetrate perm walls */ + if (!in_bounds(y, x) || + cave_stop_disintegration(y, x) || + !in_disintegration_range(ty, tx, y, x)) + continue; - /* Found a monster */ - m_ptr = &m_list[cave[ny][nx].m_idx]; + project(0, rad, y, x, dam, GF_DISINTEGRATE, PROJECT_JUMP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL, -1); + } - if (tm_idx != cave[ny][nx].m_idx) + return TRUE; +} + +/*! +* @brief 「ワンダー」のランダムな効果を決定して処理する。 +* @param dir 方向ID +* @return なし +* @details +* This spell should become more useful (more controlled) as the\n +* player gains experience levels. Thus, add 1/5 of the player's\n +* level to the die roll. This eliminates the worst effects later on,\n +* while keeping the results quite random. It also allows some potent\n +* effects only at high level. +*/ +void cast_wonder(int dir) +{ + int plev = p_ptr->lev; + int die = randint1(100) + plev / 5; + int vir = virtue_number(V_CHANCE); + + if (vir) + { + if (p_ptr->virtues[vir - 1] > 0) { -#ifdef JP - msg_format("%s%sが立ちふさがっている!", tm_idx ? "別の" : "", - m_ptr->ml ? "モンスター" : "何か"); -#else - msg_format("There is %s in the way!", m_ptr->ml ? (tm_idx ? "another monster" : "a monster") : "someone"); -#endif + while (randint1(400) < p_ptr->virtues[vir - 1]) die++; } - else if (!player_bold(ty, tx)) + else { - /* Hold the monster name */ - char m_name[80]; + while (randint1(400) < (0 - p_ptr->virtues[vir - 1])) die--; + } + } - /* Get the monster name (BEFORE polymorphing) */ - monster_desc(m_name, m_ptr, 0); - msg_format(_("素早く%sの懐に入り込んだ!", "You quickly jump in and attack %s!"), m_name); + if (die < 26) + chg_virtue(V_CHANCE, 1); + + if (die > 100) + { + msg_print(_("あなたは力がみなぎるのを感じた!", "You feel a surge of power!")); + } + + if (die < 8) clone_monster(dir); + else if (die < 14) speed_monster(dir, plev); + else if (die < 26) heal_monster(dir, damroll(4, 6)); + else if (die < 31) poly_monster(dir, plev); + else if (die < 36) + fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, + damroll(3 + ((plev - 1) / 5), 4)); + else if (die < 41) confuse_monster(dir, plev); + else if (die < 46) fire_ball(GF_POIS, dir, 20 + (plev / 2), 3); + else if (die < 51) (void)lite_line(dir, damroll(6, 8)); + else if (die < 56) + fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, + damroll(3 + ((plev - 5) / 4), 8)); + else if (die < 61) + fire_bolt_or_beam(beam_chance() - 10, GF_COLD, dir, + damroll(5 + ((plev - 5) / 4), 8)); + else if (die < 66) + fire_bolt_or_beam(beam_chance(), GF_ACID, dir, + damroll(6 + ((plev - 5) / 4), 8)); + else if (die < 71) + fire_bolt_or_beam(beam_chance(), GF_FIRE, dir, + damroll(8 + ((plev - 5) / 4), 8)); + else if (die < 76) hypodynamic_bolt(dir, 75); + else if (die < 81) fire_ball(GF_ELEC, dir, 30 + plev / 2, 2); + else if (die < 86) fire_ball(GF_ACID, dir, 40 + plev, 2); + else if (die < 91) fire_ball(GF_ICE, dir, 70 + plev, 3); + else if (die < 96) fire_ball(GF_FIRE, dir, 80 + plev, 3); + else if (die < 101) hypodynamic_bolt(dir, 100 + plev); + else if (die < 104) + { + earthquake(p_ptr->y, p_ptr->x, 12); + } + else if (die < 106) + { + (void)destroy_area(p_ptr->y, p_ptr->x, 13 + randint0(5), FALSE); + } + else if (die < 108) + { + symbol_genocide(plev + 50, TRUE); + } + else if (die < 110) dispel_monsters(120); + else /* RARE */ + { + dispel_monsters(150); + slow_monsters(plev); + sleep_monsters(plev); + hp_player(300); + } +} + + +/*! +* @brief 「悪霊召喚」のランダムな効果を決定して処理する。 +* @param dir 方向ID +* @return なし +*/ +void cast_invoke_spirits(int dir) +{ + int plev = p_ptr->lev; + int die = randint1(100) + plev / 5; + int vir = virtue_number(V_CHANCE); + + if (vir) + { + if (p_ptr->virtues[vir - 1] > 0) + { + while (randint1(400) < p_ptr->virtues[vir - 1]) die++; + } + else + { + while (randint1(400) < (0 - p_ptr->virtues[vir - 1])) die--; } + } - if (!player_bold(ty, tx)) teleport_player_to(ty, tx, TELEPORT_NONMAGICAL); - moved = TRUE; - tmp_mdeath = py_attack(ny, nx, HISSATSU_NYUSIN); + msg_print(_("あなたは死者たちの力を招集した...", "You call on the power of the dead...")); + if (die < 26) + chg_virtue(V_CHANCE, 1); - break; + if (die > 100) + { + msg_print(_("あなたはおどろおどろしい力のうねりを感じた!", "You feel a surge of eldritch force!")); } - if (!moved && !player_bold(ty, tx)) teleport_player_to(ty, tx, TELEPORT_NONMAGICAL); + if (die < 8) + { + msg_print(_("なんてこった!あなたの周りの地面から朽ちた人影が立ち上がってきた!", + "Oh no! Mouldering forms rise from the earth around you!")); - if (mdeath) *mdeath = tmp_mdeath; - return TRUE; -} + (void)summon_specific(0, p_ptr->y, p_ptr->x, dun_level, SUMMON_UNDEAD, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)); + chg_virtue(V_UNLIFE, 1); + } + else if (die < 14) + { + msg_print(_("名状し難い邪悪な存在があなたの心を通り過ぎて行った...", "An unnamable evil brushes against your mind...")); + + set_afraid(p_ptr->afraid + randint1(4) + 4); + } + else if (die < 26) + { + msg_print(_("あなたの頭に大量の幽霊たちの騒々しい声が押し寄せてきた...", + "Your head is invaded by a horde of gibbering spectral voices...")); + + set_confused(p_ptr->confused + randint1(4) + 4); + } + else if (die < 31) + { + poly_monster(dir, plev); + } + else if (die < 36) + { + fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, + damroll(3 + ((plev - 1) / 5), 4)); + } + else if (die < 41) + { + confuse_monster(dir, plev); + } + else if (die < 46) + { + fire_ball(GF_POIS, dir, 20 + (plev / 2), 3); + } + else if (die < 51) + { + (void)lite_line(dir, damroll(6, 8)); + } + else if (die < 56) + { + fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, + damroll(3 + ((plev - 5) / 4), 8)); + } + else if (die < 61) + { + fire_bolt_or_beam(beam_chance() - 10, GF_COLD, dir, + damroll(5 + ((plev - 5) / 4), 8)); + } + else if (die < 66) + { + fire_bolt_or_beam(beam_chance(), GF_ACID, dir, + damroll(6 + ((plev - 5) / 4), 8)); + } + else if (die < 71) + { + fire_bolt_or_beam(beam_chance(), GF_FIRE, dir, + damroll(8 + ((plev - 5) / 4), 8)); + } + else if (die < 76) + { + hypodynamic_bolt(dir, 75); + } + else if (die < 81) + { + fire_ball(GF_ELEC, dir, 30 + plev / 2, 2); + } + else if (die < 86) + { + fire_ball(GF_ACID, dir, 40 + plev, 2); + } + else if (die < 91) + { + fire_ball(GF_ICE, dir, 70 + plev, 3); + } + else if (die < 96) + { + fire_ball(GF_FIRE, dir, 80 + plev, 3); + } + else if (die < 101) + { + hypodynamic_bolt(dir, 100 + plev); + } + else if (die < 104) + { + earthquake(p_ptr->y, p_ptr->x, 12); + } + else if (die < 106) + { + (void)destroy_area(p_ptr->y, p_ptr->x, 13 + randint0(5), FALSE); + } + else if (die < 108) + { + symbol_genocide(plev + 50, TRUE); + } + else if (die < 110) + { + dispel_monsters(120); + } + else + { /* RARE */ + dispel_monsters(150); + slow_monsters(plev); + sleep_monsters(plev); + hp_player(300); + } + if (die < 31) + { + msg_print(_("陰欝な声がクスクス笑う。「もうすぐおまえは我々の仲間になるだろう。弱き者よ。」", + "Sepulchral voices chuckle. 'Soon you will join us, mortal.'")); + } +} /*! - * @brief 全鏡の消去 / Remove all mirrors in this floor - * @param explode 爆発処理を伴うならばTRUE - * @return なし - */ -void remove_all_mirrors(bool explode) +* @brief トランプ領域の「シャッフル」の効果をランダムに決めて処理する。 +* @return なし +*/ +void cast_shuffle(void) { - int x, y; + int plev = p_ptr->lev; + int dir; + int die; + int vir = virtue_number(V_CHANCE); + int i; - for (x = 0; x < cur_wid; x++) + /* Card sharks and high mages get a level bonus */ + if ((p_ptr->pclass == CLASS_ROGUE) || + (p_ptr->pclass == CLASS_HIGH_MAGE) || + (p_ptr->pclass == CLASS_SORCERER)) + die = (randint1(110)) + plev / 5; + else + die = randint1(120); + + + if (vir) { - for (y = 0; y < cur_hgt; y++) + if (p_ptr->virtues[vir - 1] > 0) { - if (is_mirror_grid(&cave[y][x])) - { - remove_mirror(y, x); - if (explode) - project(0, 2, y, x, p_ptr->lev / 2 + 5, GF_SHARDS, - (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP | PROJECT_NO_HANGEKI), -1); - } + while (randint1(400) < p_ptr->virtues[vir - 1]) die++; + } + else + { + while (randint1(400) < (0 - p_ptr->virtues[vir - 1])) die--; + } + } + + msg_print(_("あなたはカードを切って一枚引いた...", "You shuffle the deck and draw a card...")); + + if (die < 30) + chg_virtue(V_CHANCE, 1); + + if (die < 7) + { + msg_print(_("なんてこった!《死》だ!", "Oh no! It's Death!")); + + for (i = 0; i < randint1(3); i++) + activate_hi_summon(p_ptr->y, p_ptr->x, FALSE); + } + else if (die < 14) + { + msg_print(_("なんてこった!《悪魔》だ!", "Oh no! It's the Devil!")); + summon_specific(0, p_ptr->y, p_ptr->x, dun_level, SUMMON_DEMON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)); + } + else if (die < 18) + { + int count = 0; + msg_print(_("なんてこった!《吊られた男》だ!", "Oh no! It's the Hanged Man.")); + activate_ty_curse(FALSE, &count); + } + else if (die < 22) + { + msg_print(_("《不調和の剣》だ。", "It's the swords of discord.")); + aggravate_monsters(0); + } + else if (die < 26) + { + msg_print(_("《愚者》だ。", "It's the Fool.")); + do_dec_stat(A_INT); + do_dec_stat(A_WIS); + } + else if (die < 30) + { + msg_print(_("奇妙なモンスターの絵だ。", "It's the picture of a strange monster.")); + trump_summoning(1, FALSE, p_ptr->y, p_ptr->x, (dun_level * 3 / 2), (32 + randint1(6)), PM_ALLOW_GROUP | PM_ALLOW_UNIQUE); + } + else if (die < 33) + { + msg_print(_("《月》だ。", "It's the Moon.")); + unlite_area(10, 3); + } + else if (die < 38) + { + msg_print(_("《運命の輪》だ。", "It's the Wheel of Fortune.")); + wild_magic(randint0(32)); + } + else if (die < 40) + { + msg_print(_("テレポート・カードだ。", "It's a teleport trump card.")); + teleport_player(10, TELEPORT_PASSIVE); + } + else if (die < 42) + { + msg_print(_("《正義》だ。", "It's Justice.")); + set_blessed(p_ptr->lev, FALSE); + } + else if (die < 47) + { + msg_print(_("テレポート・カードだ。", "It's a teleport trump card.")); + teleport_player(100, TELEPORT_PASSIVE); + } + else if (die < 52) + { + msg_print(_("テレポート・カードだ。", "It's a teleport trump card.")); + teleport_player(200, TELEPORT_PASSIVE); + } + else if (die < 60) + { + msg_print(_("《塔》だ。", "It's the Tower.")); + wall_breaker(); + } + else if (die < 72) + { + msg_print(_("《節制》だ。", "It's Temperance.")); + sleep_monsters_touch(); + } + else if (die < 80) + { + msg_print(_("《塔》だ。", "It's the Tower.")); + + earthquake(p_ptr->y, p_ptr->x, 5); + } + else if (die < 82) + { + msg_print(_("友好的なモンスターの絵だ。", "It's the picture of a friendly monster.")); + trump_summoning(1, TRUE, p_ptr->y, p_ptr->x, (dun_level * 3 / 2), SUMMON_MOLD, 0L); + } + else if (die < 84) + { + msg_print(_("友好的なモンスターの絵だ。", "It's the picture of a friendly monster.")); + trump_summoning(1, TRUE, p_ptr->y, p_ptr->x, (dun_level * 3 / 2), SUMMON_BAT, 0L); + } + else if (die < 86) + { + msg_print(_("友好的なモンスターの絵だ。", "It's the picture of a friendly monster.")); + trump_summoning(1, TRUE, p_ptr->y, p_ptr->x, (dun_level * 3 / 2), SUMMON_VORTEX, 0L); + } + else if (die < 88) + { + msg_print(_("友好的なモンスターの絵だ。", "It's the picture of a friendly monster.")); + trump_summoning(1, TRUE, p_ptr->y, p_ptr->x, (dun_level * 3 / 2), SUMMON_COIN_MIMIC, 0L); + } + else if (die < 96) + { + msg_print(_("《恋人》だ。", "It's the Lovers.")); + + if (get_aim_dir(&dir)) + charm_monster(dir, MIN(p_ptr->lev, 20)); + } + else if (die < 101) + { + msg_print(_("《隠者》だ。", "It's the Hermit.")); + wall_stone(); + } + else if (die < 111) + { + msg_print(_("《審判》だ。", "It's the Judgement.")); + do_cmd_rerate(FALSE); + lose_all_mutations(); + } + else if (die < 120) + { + msg_print(_("《太陽》だ。", "It's the Sun.")); + chg_virtue(V_KNOWLEDGE, 1); + chg_virtue(V_ENLIGHTEN, 1); + wiz_lite(FALSE); + } + else + { + msg_print(_("《世界》だ。", "It's the World.")); + if (p_ptr->exp < PY_MAX_EXP) + { + s32b ee = (p_ptr->exp / 25) + 1; + if (ee > 5000) ee = 5000; + msg_print(_("更に経験を積んだような気がする。", "You feel more experienced.")); + gain_exp(ee); } } } + +bool_hack life_stream(bool_hack message, bool_hack virtue) +{ + if(virtue) + { + chg_virtue(V_VITALITY, 1); + chg_virtue(V_UNLIFE, -5); + } + if(message) + { + msg_print(_("体中に生命力が満ちあふれてきた!", "You feel life flow through your body!")); + } + restore_level(); + (void)set_poisoned(0); + (void)set_blind(0); + (void)set_confused(0); + (void)set_image(0); + (void)set_stun(0); + (void)set_cut(0); + (void)do_res_stat(A_STR); + (void)do_res_stat(A_CON); + (void)do_res_stat(A_DEX); + (void)do_res_stat(A_WIS); + (void)do_res_stat(A_INT); + (void)do_res_stat(A_CHR); + (void)set_shero(0, TRUE); + update_stuff(); + hp_player(5000); + + return TRUE; +} +