X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fcmd5.c;h=ea9ca33253586b84809265958aaee697f8d4683f;hb=68fbe51bccdceba8a1713b1824a00cfc37726111;hp=d979e1248b5d4b0b050d389e32a217e3f156fd12;hpb=f86985767c41ac298fec13c69bcbdea8e81b05d3;p=hengband%2Fhengband.git diff --git a/src/cmd5.c b/src/cmd5.c index d979e1248..ea9ca3325 100644 --- a/src/cmd5.c +++ b/src/cmd5.c @@ -1,6 +1,8 @@ -/* File: cmd5.c */ - -/* +/*! + * @file cmd5.c + * @brief プレイヤーの魔法に関するコマンドの実装 / Spell/Prayer commands + * @date 2014/01/02 + * @author * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * * This software may be copied and distributed for educational, research, @@ -8,28 +10,30 @@ * are included in all such copies. Other copyrights may also apply. */ -/* Purpose: Spell/Prayer commands */ #include "angband.h" -#include "spellstips.h" - -cptr spell_categoly_name(int tval) +/*! + * @brief 領域魔法に応じて技能の名称を返す。 + * @param tval 魔法書のtval + * @return 領域魔法の技能名称を保管した文字列ポインタ + */ +cptr spell_category_name(int tval) { switch (tval) { #ifdef JP case TV_HISSATSU_BOOK: - return "ɬ»¦µ»"; + return "必殺技"; case TV_LIFE_BOOK: - return "µ§¤ê"; + return "祈り"; case TV_MUSIC_BOOK: - return "²Î"; + return "歌"; default: - return "¼öʸ"; + return "呪文"; #else case TV_HISSATSU_BOOK: - return "arts"; + return "art"; case TV_LIFE_BOOK: return "prayer"; case TV_MUSIC_BOOK: @@ -40,19 +44,26 @@ cptr spell_categoly_name(int tval) } } -/* + +bool select_the_force = FALSE; + +/*! + * @brief 領域魔法の閲覧、学習、使用選択するインターフェイス処理 * Allow user to choose a spell/prayer from the given book. - * + * @param sn 選択した魔法IDを返す参照ポインタ + * @param prompt 魔法を利用する際の動詞表記 + * @param sval 魔道書のsval + * @param learned 閲覧/使用選択ならばTRUE、学習処理ならFALSE + * @param use_realm 魔法領域ID + * @return + *
  * If a valid spell is chosen, saves it in '*sn' and returns TRUE
  * If the user hits escape, returns FALSE, and set '*sn' to -1
  * If there are no legal choices, returns FALSE, and sets '*sn' to -2
- *
  * The "prompt" should be "cast", "recite", or "study"
  * The "known" should be TRUE for cast/pray, FALSE for study
+ * 
*/ - -bool select_the_force=FALSE; - static int get_spell(int *sn, cptr prompt, int sval, bool learned, int use_realm) { int i; @@ -63,7 +74,7 @@ static int get_spell(int *sn, cptr prompt, int sval, bool learned, int use_realm byte spells[64]; bool flag, redraw, okay; char choice; - magic_type *s_ptr; + const magic_type *s_ptr; char out_val[160]; cptr p; #ifdef JP @@ -86,7 +97,7 @@ static int get_spell(int *sn, cptr prompt, int sval, bool learned, int use_realm #endif /* ALLOW_REPEAT -- TNB */ - p = spell_categoly_name(mp_ptr->spell_book); + p = spell_category_name(mp_ptr->spell_book); /* Extract spells */ for (spell = 0; spell < 32; spell++) @@ -128,19 +139,15 @@ static int get_spell(int *sn, cptr prompt, int sval, bool learned, int use_realm redraw = FALSE; /* Show choices */ - if (show_choices) - { - /* Update */ - p_ptr->window |= (PW_SPELL); + p_ptr->window |= (PW_SPELL); - /* Window stuff */ - window_stuff(); - } + /* Window stuff */ + window_stuff(); /* Build a prompt (accept all spells) */ #ifdef JP - jverb1( prompt, jverb_buf ); - (void) strnfmt(out_val, 78, "(%^s:%c-%c, '*'¤Ç°ìÍ÷, ESC¤ÇÃæÃÇ) ¤É¤Î%s¤ò%^s¤Þ¤¹¤«? ", + jverb( prompt, jverb_buf, JVERB_AND ); + (void) strnfmt(out_val, 78, "(%^s:%c-%c, '*'で一覧, ESCで中断) どの%sを%^sますか? ", p, I2A(0), I2A(num - 1), p, jverb_buf ); #else (void)strnfmt(out_val, 78, "(%^ss %c-%c, *=List, ESC=exit) %^s which %s? ", @@ -149,21 +156,20 @@ static int get_spell(int *sn, cptr prompt, int sval, bool learned, int use_realm /* Get a spell from the user */ - choice = (always_show_list || use_menu) ? ESCAPE:1; + choice = (always_show_list || use_menu) ? ESCAPE : 1; while (!flag) { - if( choice==ESCAPE ) choice = ' '; - else if( !get_com(out_val, &choice, TRUE) )break; + if (choice == ESCAPE) choice = ' '; + else if (!get_com(out_val, &choice, TRUE))break; if (use_menu && choice != ' ') { - switch(choice) + switch (choice) { case '0': { screen_load(); - return (FALSE); - break; + return FALSE; } case '8': @@ -257,7 +263,7 @@ static int get_spell(int *sn, cptr prompt, int sval, bool learned, int use_realm { bell(); #ifdef JP - msg_format("¤½¤Î%s¤ò%s¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£", p, prompt); + msg_format("その%sを%sことはできません。", p, prompt); #else msg_format("You may not %s that %s.", prompt, p); #endif @@ -292,14 +298,14 @@ static int get_spell(int *sn, cptr prompt, int sval, bool learned, int use_realm /* Prompt */ #ifdef JP - jverb1( prompt, jverb_buf ); - /* ±ÑÆüÀÚ¤êÂؤ¨µ¡Ç½¤ËÂбþ */ - (void) strnfmt(tmp_val, 78, "%s(MP%d, ¼ºÇÔΨ%d%%)¤ò%s¤Þ¤¹¤«? ", - spell_names[technic2magic(use_realm)-1][spell], need_mana, + jverb( prompt, jverb_buf, JVERB_AND ); + /* 英日切り替え機能に対応 */ + (void) strnfmt(tmp_val, 78, "%s(MP%d, 失敗率%d%%)を%sますか? ", + do_spell(use_realm, spell, SPELL_NAME), need_mana, spell_chance(spell, use_realm),jverb_buf); #else (void)strnfmt(tmp_val, 78, "%^s %s (%d mana, %d%% fail)? ", - prompt, spell_names[technic2magic(use_realm)-1][spell], need_mana, + prompt, do_spell(use_realm, spell, SPELL_NAME), need_mana, spell_chance(spell, use_realm)); #endif @@ -318,18 +324,14 @@ static int get_spell(int *sn, cptr prompt, int sval, bool learned, int use_realm /* Show choices */ - if (show_choices) - { - /* Update */ - p_ptr->window |= (PW_SPELL); + p_ptr->window |= (PW_SPELL); - /* Window stuff */ - window_stuff(); - } + /* Window stuff */ + window_stuff(); /* Abort if needed */ - if (!flag) return (FALSE); + if (!flag) return FALSE; /* Save the choice */ (*sn) = spell; @@ -341,10 +343,14 @@ static int get_spell(int *sn, cptr prompt, int sval, bool learned, int use_realm #endif /* ALLOW_REPEAT -- TNB */ /* Success */ - return (TRUE); + return TRUE; } - +/*! + * @brief オブジェクトがプレイヤーが使用可能な魔道書かどうかを判定する + * @param o_ptr 判定したいオブ会ジェクトの構造体参照ポインタ + * @return 学習できる魔道書ならばTRUEを返す + */ static bool item_tester_learn_spell(object_type *o_ptr) { s32b choices = realm_choices2[p_ptr->pclass]; @@ -369,39 +375,112 @@ static bool item_tester_learn_spell(object_type *o_ptr) return (FALSE); } +/*! + * @brief プレイヤーが魔道書を一冊も持っていないかを判定する + * @return 魔道書を一冊も持っていないならTRUEを返す + */ +static bool player_has_no_spellbooks(void) +{ + int i; + object_type *o_ptr; + + for (i = 0; i < INVEN_PACK; i++) + { + o_ptr = &inventory[i]; + if (o_ptr->k_idx && check_book_realm(o_ptr->tval, o_ptr->sval)) return FALSE; + } + + for (i = cave[p_ptr->y][p_ptr->x].o_idx; i; i = o_ptr->next_o_idx) + { + o_ptr = &o_list[i]; + if (o_ptr->k_idx && (o_ptr->marked & OM_FOUND) && check_book_realm(o_ptr->tval, o_ptr->sval)) return FALSE; + } + + return TRUE; +} + +/*! + * @brief プレイヤーの職業が練気術師の時、領域魔法と練気術を切り換える処理のインターフェイス + * @param browse_only 魔法と技能の閲覧を行うならばTRUE + * @return 魔道書を一冊も持っていないならTRUEを返す + */ +static void confirm_use_force(bool browse_only) +{ + int item; + char which; + +#ifdef ALLOW_REPEAT + + /* Get the item index */ + if (repeat_pull(&item) && (item == INVEN_FORCE)) + { + browse_only ? do_cmd_mind_browse() : do_cmd_mind(); + return; + } + +#endif /* ALLOW_REPEAT */ + + /* Show the prompt */ + prt(_("('w'練気術, ESC) 'w'かESCを押してください。 ", "(w for the Force, ESC) Hit 'w' or ESC. "), 0, 0); + + while (1) + { + /* Get a key */ + which = inkey(); + + if (which == ESCAPE) break; + else if (which == 'w') + { + +#ifdef ALLOW_REPEAT + + repeat_push(INVEN_FORCE); + +#endif /* ALLOW_REPEAT */ + + break; + } + } + + /* Clear the prompt line */ + prt("", 0, 0); + + if (which == 'w') + { + browse_only ? do_cmd_mind_browse() : do_cmd_mind(); + } +} + -/* +/*! + * @brief プレイヤーの魔法と技能を閲覧するコマンドのメインルーチン / * Peruse the spells/prayers in a book - * + * @return なし + * @details + *
  * Note that *all* spells in the book are listed
  *
  * Note that browsing is allowed while confused or blind,
  * and in the dark, primarily to allow browsing in stores.
+ * 
*/ void do_cmd_browse(void) { int item, sval, use_realm = 0, j, line; int spell = -1; int num = 0; - int increment = 0; byte spells[64]; char temp[62*4]; object_type *o_ptr; - magic_type *s_ptr; cptr q, s; /* Warriors are illiterate */ if (!(p_ptr->realm1 || p_ptr->realm2) && (p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) { -#ifdef JP -msg_print("ËܤòÆɤळ¤È¤¬¤Ç¤­¤Ê¤¤¡ª"); -#else - msg_print("You cannot read books!"); -#endif - + msg_print(_("本を読むことができない!", "You cannot read books!")); return; } @@ -410,37 +489,39 @@ msg_print(" set_action(ACTION_NONE); } + if (p_ptr->pclass == CLASS_FORCETRAINER) + { + if (player_has_no_spellbooks()) + { + confirm_use_force(TRUE); + return; + } + select_the_force = TRUE; + } + /* Restrict choices to "useful" books */ if (p_ptr->realm2 == REALM_NONE) item_tester_tval = mp_ptr->spell_book; else item_tester_hook = item_tester_learn_spell; /* Get an item */ -#ifdef JP -q = "¤É¤ÎËܤòÆɤߤޤ¹¤«? "; -#else - q = "Browse which book? "; -#endif - -#ifdef JP -s = "Æɤá¤ëËܤ¬¤Ê¤¤¡£"; -#else - s = "You have no books that you can read."; -#endif + q = _("どの本を読みますか? ", "Browse which book? "); + s = _("読める本がない。", "You have no books that you can read."); - if (p_ptr->pclass == CLASS_FORCETRAINER) - select_the_force = TRUE; - if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))){ - select_the_force = FALSE; - return; + if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) + { + select_the_force = FALSE; + return; } select_the_force = FALSE; - if (item == INVEN_FORCE) { /* the_force */ - do_cmd_mind_browse(); - return; - } else + if (item == INVEN_FORCE) /* the_force */ + { + do_cmd_mind_browse(); + return; + } + /* Get the item (in the pack) */ - if (item >= 0) + else if (item >= 0) { o_ptr = &inventory[item]; } @@ -455,11 +536,6 @@ s = " sval = o_ptr->sval; use_realm = tval2realm(o_ptr->tval); - if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE) && is_magic(use_realm)) - { - if (o_ptr->tval == REALM2_BOOK) increment = 32; - else if (o_ptr->tval != REALM1_BOOK) increment = 64; - } /* Track the object kind */ object_kind_track(o_ptr->k_idx); @@ -490,11 +566,7 @@ s = " while(TRUE) { /* Ask for a spell, allow cancel */ -#ifdef JP - if (!get_spell(&spell, "Æɤà", o_ptr->sval, TRUE, use_realm)) -#else - if (!get_spell(&spell, "browse", o_ptr->sval, TRUE, use_realm)) -#endif + if (!get_spell(&spell, _("読む", "browse"), o_ptr->sval, TRUE, use_realm)) { /* If cancelled, leave immediately. */ if (spell == -1) break; @@ -504,25 +576,17 @@ s = " /* Notify that there's nothing to see, and wait. */ if (use_realm == REALM_HISSATSU) -#ifdef JP - prt("Æɤá¤ëµ»¤¬¤Ê¤¤¡£", 0, 0); -#else - prt("No techniques to browse.", 0, 0); -#endif + prt(_("読める技がない。", "No techniques to browse."), 0, 0); else -#ifdef JP - prt("Æɤá¤ë¼öʸ¤¬¤Ê¤¤¡£", 0, 0); -#else - prt("No spells to browse.", 0, 0); -#endif + prt(_("読める呪文がない。", "No spells to browse."), 0, 0); (void)inkey(); - + /* Restore the screen */ screen_load(); return; - } + } /* Clear lines, position cursor (really should use strlen here) */ Term_erase(14, 14, 255); @@ -530,18 +594,9 @@ s = " Term_erase(14, 12, 255); Term_erase(14, 11, 255); - /* Access the spell */ - if (!is_magic(use_realm)) - { - s_ptr = &technic_info[use_realm - MIN_TECHNIC][spell]; - } - else - { - s_ptr = &mp_ptr->info[use_realm - 1][spell]; - } + roff_to_buf(do_spell(use_realm, spell, SPELL_DESC), 62, temp, sizeof(temp)); - roff_to_buf(spell_tips[technic2magic(use_realm)-1][spell] ,62, temp, sizeof(temp)); - for(j=0, line = 11;temp[j];j+=(1+strlen(&temp[j]))) + for (j = 0, line = 11; temp[j]; j += 1 + strlen(&temp[j])) { prt(&temp[j], line, 15); line++; @@ -552,33 +607,33 @@ s = " screen_load(); } - +/*! + * @brief プレイヤーの第二魔法領域を変更する / + * @param next_realm 変更先の魔法領域ID + * @return なし + */ static void change_realm2(int next_realm) { - int i, j=0; + int i, j = 0; char tmp[80]; for (i = 0; i < 64; i++) { p_ptr->spell_order[j] = p_ptr->spell_order[i]; - if(p_ptr->spell_order[i] < 32) j++; + if (p_ptr->spell_order[i] < 32) j++; } for (; j < 64; j++) p_ptr->spell_order[j] = 99; for (i = 32; i < 64; i++) { - p_ptr->spell_exp[i] = 0; + p_ptr->spell_exp[i] = SPELL_EXP_UNSKILLED; } p_ptr->spell_learned2 = 0L; p_ptr->spell_worked2 = 0L; - p_ptr->spell_forgotten2 = 0L; + p_ptr->spell_forgotten2 = 0L; -#ifdef JP - sprintf(tmp,"ËâË¡¤ÎÎΰè¤ò%s¤«¤é%s¤ËÊѹ¹¤·¤¿¡£", realm_names[p_ptr->realm2], realm_names[next_realm]); -#else - sprintf(tmp,"change magic realm from %s to %s.", realm_names[p_ptr->realm2], realm_names[next_realm]); -#endif + sprintf(tmp,_("魔法の領域を%sから%sに変更した。", "change magic realm from %s to %s."), realm_names[p_ptr->realm2], realm_names[next_realm]); do_cmd_write_nikki(NIKKI_BUNSHOU, 0, tmp); p_ptr->old_realm |= 1 << (p_ptr->realm2-1); p_ptr->realm2 = next_realm; @@ -586,11 +641,16 @@ static void change_realm2(int next_realm) p_ptr->notice |= (PN_REORDER); p_ptr->update |= (PU_SPELLS); handle_stuff(); + + /* Load an autopick preference file */ + autopick_load_pref(FALSE); } -/* +/*! + * @brief 魔法を学習するコマンドのメインルーチン / * Study a book to gain a new spell/prayer + * @return なし */ void do_cmd_study(void) { @@ -601,7 +661,7 @@ void do_cmd_study(void) /* Spells of realm2 will have an increment of +32 */ int spell = -1; - cptr p = spell_categoly_name(mp_ptr->spell_book); + cptr p = spell_category_name(mp_ptr->spell_book); object_type *o_ptr; @@ -609,45 +669,25 @@ void do_cmd_study(void) if (!p_ptr->realm1) { -#ifdef JP -msg_print("ËܤòÆɤळ¤È¤¬¤Ç¤­¤Ê¤¤¡ª"); -#else - msg_print("You cannot read books!"); -#endif - + msg_print(_("本を読むことができない!", "You cannot read books!")); return; } if (p_ptr->blind || no_lite()) { -#ifdef JP -msg_print("Ìܤ¬¸«¤¨¤Ê¤¤¡ª"); -#else - msg_print("You cannot see!"); -#endif - + msg_print(_("目が見えない!", "You cannot see!")); return; } if (p_ptr->confused) { -#ifdef JP -msg_print("º®Í𤷤Ƥ¤¤ÆÆɤá¤Ê¤¤¡ª"); -#else - msg_print("You are too confused!"); -#endif - + msg_print(_("混乱していて読めない!", "You are too confused!")); return; } if (!(p_ptr->new_spells)) { -#ifdef JP -msg_format("¿·¤·¤¤%s¤ò³Ð¤¨¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡ª", p); -#else - msg_format("You cannot learn any new %ss!", p); -#endif - + msg_format(_("新しい%sを覚えることはできない!", "You cannot learn any new %ss!"), p); return; } @@ -656,13 +696,11 @@ msg_format(" set_action(ACTION_NONE); } - p = spell_categoly_name(mp_ptr->spell_book); - #ifdef JP if( p_ptr->new_spells < 10 ){ - msg_format("¤¢¤È %d ¤Ä¤Î%s¤ò³Ø¤Ù¤ë¡£", p_ptr->new_spells, p); + msg_format("あと %d つの%sを学べる。", p_ptr->new_spells, p); }else{ - msg_format("¤¢¤È %d ¸Ä¤Î%s¤ò³Ø¤Ù¤ë¡£", p_ptr->new_spells, p); + msg_format("あと %d 個の%sを学べる。", p_ptr->new_spells, p); } #else msg_format("You can learn %d new %s%s.", p_ptr->new_spells, p, @@ -677,17 +715,8 @@ msg_format(" else item_tester_hook = item_tester_learn_spell; /* Get an item */ -#ifdef JP -q = "¤É¤ÎËܤ«¤é³Ø¤Ó¤Þ¤¹¤«? "; -#else - q = "Study which book? "; -#endif - -#ifdef JP -s = "Æɤá¤ëËܤ¬¤Ê¤¤¡£"; -#else - s = "You have no books that you can read."; -#endif + q = _("どの本から学びますか? ", "Study which book? "); + s = _("読める本がない。", "You have no books that you can read."); if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return; @@ -709,11 +738,7 @@ s = " if (o_ptr->tval == REALM2_BOOK) increment = 32; else if (o_ptr->tval != REALM1_BOOK) { -#ifdef JP - if (!get_check("ËÜÅö¤ËËâË¡¤ÎÎΰè¤òÊѹ¹¤·¤Þ¤¹¤«¡©")) return; -#else - if (!get_check("Really, change magic realm? ")) return; -#endif + if (!get_check(_("本当に魔法の領域を変更しますか?", "Really, change magic realm? "))) return; change_realm2(tval2realm(o_ptr->tval)); increment = 32; } @@ -729,7 +754,7 @@ s = " { /* Ask for a spell, allow cancel */ #ifdef JP - if (!get_spell(&spell, "³Ø¤Ö", sval, FALSE, o_ptr->tval - TV_LIFE_BOOK + 1) + if (!get_spell(&spell, "学ぶ", sval, FALSE, o_ptr->tval - TV_LIFE_BOOK + 1) && (spell == -1)) return; #else if (!get_spell(&spell, "study", sval, FALSE, o_ptr->tval - TV_LIFE_BOOK + 1) @@ -771,12 +796,7 @@ s = " if (spell < 0) { /* Message */ -#ifdef JP -msg_format("¤½¤ÎËܤˤϳؤ֤٤­%s¤¬¤Ê¤¤¡£", p); -#else - msg_format("You cannot learn any %ss in that book.", p); -#endif - + msg_format(_("その本には学ぶべき%sがない。", "You cannot learn any %ss in that book."), p); /* Abort */ return; @@ -799,54 +819,46 @@ msg_format(" if (learned) { - int max_exp = (spell < 32) ? 1600 : 1400; + int max_exp = (spell < 32) ? SPELL_EXP_MASTER : SPELL_EXP_EXPERT; int old_exp = p_ptr->spell_exp[spell]; - int new_rank = 0; - cptr name = spell_names[technic2magic(increment ? p_ptr->realm2 : p_ptr->realm1)-1][spell%32]; + int new_rank = EXP_LEVEL_UNSKILLED; + cptr name = do_spell(increment ? p_ptr->realm2 : p_ptr->realm1, spell%32, SPELL_NAME); if (old_exp >= max_exp) { -#ifdef JP - msg_format("¤½¤Î%s¤Ï´°Á´¤Ë»È¤¤¤³¤Ê¤»¤ë¤Î¤Ç³Ø¤ÖɬÍפϤʤ¤¡£", spell_categoly_name(mp_ptr->spell_book)); -#else - msg_format("You don't need to study this %s anymore.", spell_categoly_name(mp_ptr->spell_book)); -#endif + msg_format(_("その%sは完全に使いこなせるので学ぶ必要はない。", "You don't need to study this %s anymore."), p); return; } #ifdef JP - if (!get_check(format("%s¤Î%s¤ò¤µ¤é¤Ë³Ø¤Ó¤Þ¤¹¡£¤è¤í¤·¤¤¤Ç¤¹¤«¡©", name, spell_categoly_name(mp_ptr->spell_book)))) + if (!get_check(format("%sの%sをさらに学びます。よろしいですか?", name, p))) #else - if (!get_check(format("You will study a %s of %s again. Are you sure? ", spell_categoly_name(mp_ptr->spell_book), name))) + if (!get_check(format("You will study a %s of %s again. Are you sure? ", p, name))) #endif { return; } - else if (old_exp >= 1400) + else if (old_exp >= SPELL_EXP_EXPERT) { - p_ptr->spell_exp[spell] = 1600; - new_rank = 4; + p_ptr->spell_exp[spell] = SPELL_EXP_MASTER; + new_rank = EXP_LEVEL_MASTER; } - else if (old_exp >= 1200) + else if (old_exp >= SPELL_EXP_SKILLED) { - if (spell >= 32) p_ptr->spell_exp[spell] = 1400; - else p_ptr->spell_exp[spell] += 200; - new_rank = 3; + if (spell >= 32) p_ptr->spell_exp[spell] = SPELL_EXP_EXPERT; + else p_ptr->spell_exp[spell] += SPELL_EXP_EXPERT - SPELL_EXP_SKILLED; + new_rank = EXP_LEVEL_EXPERT; } - else if (old_exp >= 900) + else if (old_exp >= SPELL_EXP_BEGINNER) { - p_ptr->spell_exp[spell] = 1200+(old_exp-900)*2/3; - new_rank = 2; + p_ptr->spell_exp[spell] = SPELL_EXP_SKILLED + (old_exp - SPELL_EXP_BEGINNER) * 2 / 3; + new_rank = EXP_LEVEL_SKILLED; } else { - p_ptr->spell_exp[spell] = 900+(old_exp)/3; - new_rank = 1; + p_ptr->spell_exp[spell] = SPELL_EXP_BEGINNER + old_exp / 3; + new_rank = EXP_LEVEL_BEGINNER; } -#ifdef JP - msg_format("%s¤Î½ÏÎýÅÙ¤¬%s¤Ë¾å¤¬¤Ã¤¿¡£", name, shougou_moji[new_rank]); -#else - msg_format("Your proficiency of %s is now %s rank.", name, shougou_moji[new_rank]); -#endif + msg_format(_("%sの熟練度が%sに上がった。", "Your proficiency of %s is now %s rank."), name, exp_level_str[new_rank]); } else { @@ -862,34 +874,41 @@ msg_format(" /* Mention the result */ #ifdef JP - /* ±ÑÆüÀÚ¤êÂؤ¨µ¡Ç½¤ËÂбþ */ + /* 英日切り替え機能に対応 */ if (mp_ptr->spell_book == TV_MUSIC_BOOK) { - msg_format("%s¤ò³Ø¤ó¤À¡£", - spell_names[technic2magic(increment ? p_ptr->realm2 : p_ptr->realm1)-1][spell % 32]); + msg_format("%sを学んだ。", + do_spell(increment ? p_ptr->realm2 : p_ptr->realm1, spell % 32, SPELL_NAME)); } else { - msg_format("%s¤Î%s¤ò³Ø¤ó¤À¡£", - spell_names[technic2magic(increment ? p_ptr->realm2 : p_ptr->realm1)-1][spell % 32] ,p); + msg_format("%sの%sを学んだ。", + do_spell(increment ? p_ptr->realm2 : p_ptr->realm1, spell % 32, SPELL_NAME) ,p); } #else msg_format("You have learned the %s of %s.", - p, spell_names[technic2magic(increment ? p_ptr->realm2 : p_ptr->realm1)-1][spell % 32]); + p, do_spell(increment ? p_ptr->realm2 : p_ptr->realm1, spell % 32, SPELL_NAME)); #endif } /* Take a turn */ - energy_use = 100; + p_ptr->energy_use = 100; - if (mp_ptr->spell_book == TV_LIFE_BOOK) + switch (mp_ptr->spell_book) + { + case TV_LIFE_BOOK: chg_virtue(V_FAITH, 1); - else if (mp_ptr->spell_book == TV_DEATH_BOOK) + break; + case TV_DEATH_BOOK: chg_virtue(V_UNLIFE, 1); - else if (mp_ptr->spell_book == TV_NATURE_BOOK) + break; + case TV_NATURE_BOOK: chg_virtue(V_NATURE, 1); - else + break; + default: chg_virtue(V_KNOWLEDGE, 1); + break; + } /* Sound */ sound(SOUND_STUDY); @@ -902,17 +921,12 @@ msg_format(" { /* Message */ #ifdef JP - if( p_ptr->new_spells < 10 ){ - msg_format("¤¢¤È %d ¤Ä¤Î%s¤ò³Ø¤Ù¤ë¡£", p_ptr->new_spells, p); - }else{ - msg_format("¤¢¤È %d ¸Ä¤Î%s¤ò³Ø¤Ù¤ë¡£", p_ptr->new_spells, p); - } + if (p_ptr->new_spells < 10) msg_format("あと %d つの%sを学べる。", p_ptr->new_spells, p); + else msg_format("あと %d 個の%sを学べる。", p_ptr->new_spells, p); #else - msg_format("You can learn %d more %s%s.", - p_ptr->new_spells, p, - (p_ptr->new_spells != 1) ? "s" : ""); + msg_format("You can learn %d more %s%s.", p_ptr->new_spells, p, + (p_ptr->new_spells != 1) ? "s" : ""); #endif - } #endif @@ -924,30 +938,34 @@ msg_format(" p_ptr->window |= (PW_OBJECT); } - +/*! + * @brief 運命の輪、並びにカオス的な効果の発動 + * @param spell ランダムな効果を選択するための基準ID + * @return なし + */ static void wild_magic(int spell) { int counter = 0; - int type = SUMMON_BIZARRE1 + randint0(6); + int type = SUMMON_MOLD + randint0(6); - if (type < SUMMON_BIZARRE1) type = SUMMON_BIZARRE1; - else if (type > SUMMON_BIZARRE6) type = SUMMON_BIZARRE6; + 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_player(10, TELEPORT_PASSIVE); break; case 4: case 5: case 6: - teleport_player(100); + teleport_player(100, TELEPORT_PASSIVE); break; case 7: case 8: - teleport_player(200); + teleport_player(200, TELEPORT_PASSIVE); break; case 9: case 10: @@ -969,7 +987,7 @@ static void wild_magic(int spell) break; case 19: case 20: - trap_creation(py, px); + trap_creation(p_ptr->y, p_ptr->x); break; case 21: case 22: @@ -981,7 +999,7 @@ static void wild_magic(int spell) aggravate_monsters(0); break; case 26: - earthquake(py, px, 5); + earthquake(p_ptr->y, p_ptr->x, 5); break; case 27: case 28: @@ -1004,15 +1022,15 @@ static void wild_magic(int spell) case 35: while (counter++ < 8) { - (void)summon_specific(0, py, px, (dun_level * 3) / 2, type, (PM_ALLOW_GROUP | PM_NO_PET)); + (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(py, px, FALSE); + activate_hi_summon(p_ptr->y, p_ptr->x, FALSE); break; case 38: - (void)summon_cyber(-1, py, px); + (void)summon_cyber(-1, p_ptr->y, p_ptr->x); break; default: { @@ -1026,3766 +1044,103 @@ static void wild_magic(int spell) } -static bool cast_life_spell(int spell) +/*! + * @brief 魔法を詠唱するコマンドのメインルーチン / + * Cast a spell + * @return なし + */ +void do_cmd_cast(void) { - int dir; - int plev = p_ptr->lev; - - switch (spell) - { - case 0: /* Cure Light Wounds */ - (void)hp_player(damroll(2, 10)); - (void)set_cut(p_ptr->cut - 10); - break; - case 1: /* Bless */ - (void)set_blessed(randint1(12) + 12, FALSE); - break; - case 2: /* Make Light Wounds */ - if (!get_aim_dir(&dir)) return FALSE; - fire_ball_hide(GF_WOUNDS, dir, damroll(3 + ((plev - 1) / 5), 4), 0); - break; - case 3: /* Call Light */ - (void)lite_area(damroll(2, (plev / 2)), (plev / 10) + 1); - break; - case 4: /* Detect Traps + Secret Doors */ - (void)detect_traps(DETECT_RAD_DEFAULT, TRUE); - (void)detect_doors(DETECT_RAD_DEFAULT); - (void)detect_stairs(DETECT_RAD_DEFAULT); - break; - case 5: /* Cure Medium Wounds */ - (void)hp_player(damroll(4, 10)); - (void)set_cut((p_ptr->cut / 2) - 20); - break; - case 6: /* Cure Poison */ - (void)set_poisoned(0); - break; - case 7: /* Satisfy Hunger */ - (void)set_food(PY_FOOD_MAX - 1); - break; - case 8: /* Remove Curse */ - if (remove_curse()) - { -#ifdef JP - msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£"); -#else - msg_print("You feel as if someone is watching over you."); -#endif - } - break; - case 9: /* Make Medium Wounds */ - if (!get_aim_dir(&dir)) return FALSE; - fire_ball_hide(GF_WOUNDS, dir, damroll(8 + ((plev - 5) / 4), 8), 0); - break; - case 10: /* Cure Critical Wounds */ - (void)hp_player(damroll(8, 10)); - (void)set_stun(0); - (void)set_cut(0); - break; - case 11: - (void)set_oppose_cold(randint1(20) + 20, FALSE); - (void)set_oppose_fire(randint1(20) + 20, FALSE); - break; - case 12: - map_area(DETECT_RAD_MAP); - break; - case 13: - (void)turn_undead(); - break; - case 14: /* Healing */ - (void)hp_player(300); - (void)set_stun(0); - (void)set_cut(0); - break; - case 15: /* Glyph of Warding */ - warding_glyph(); - break; - case 16: /* Dispel Curse */ - if (remove_all_curse()) - { -#ifdef JP - msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£"); -#else - msg_print("You feel as if someone is watching over you."); -#endif - } - break; - case 17: /* Perception */ - return ident_spell(FALSE); - case 18: /* Dispel Undead */ - (void)dispel_undead(randint1(plev * 5)); - break; - case 19: /* 'Day of the Dove' */ - charm_monsters(plev * 2); - break; - case 20: /* Make Critical Wounds */ - if (!get_aim_dir(&dir)) return FALSE; - fire_ball_hide(GF_WOUNDS, dir, damroll(5+((plev - 5) / 3), 15), 0); - break; - case 21: /* Word of Recall */ - if (!word_of_recall()) return FALSE; - break; - case 22: /* Alter Reality */ - alter_reality(); - break; - case 23: /* Warding True */ - warding_glyph(); - glyph_creation(); - break; - case 24: - num_repro += MAX_REPRO; - break; - case 25: /* Detection True */ - (void)detect_all(DETECT_RAD_DEFAULT); - break; - case 26: /* Genocide Undead */ - (void)mass_genocide_undead(plev+50,TRUE); - break; - case 27: /* Clairvoyance */ - wiz_lite(FALSE); - break; - case 28: /* Restoration */ - (void)do_res_stat(A_STR); - (void)do_res_stat(A_INT); - (void)do_res_stat(A_WIS); - (void)do_res_stat(A_DEX); - (void)do_res_stat(A_CON); - (void)do_res_stat(A_CHR); - (void)restore_level(); - break; - case 29: /* Healing True */ - (void)hp_player(2000); - (void)set_stun(0); - (void)set_cut(0); - break; - case 30: /* Holy Vision */ - return identify_fully(FALSE); - case 31: /* Ultimate resistance */ - { - int v = randint1(plev/2)+plev/2; - (void)set_fast(v, FALSE); - set_oppose_acid(v, FALSE); - set_oppose_elec(v, FALSE); - set_oppose_fire(v, FALSE); - set_oppose_cold(v, FALSE); - set_oppose_pois(v, FALSE); - set_ultimate_res(v, FALSE); - break; - } - default: -#ifdef JP -msg_format("¤¢¤Ê¤¿¤ÏÉÔÌÀ¤Ê¥é¥¤¥Õ¤Î¼öʸ %d ¤ò¾§¤¨¤¿¡£", spell); -#else - msg_format("You cast an unknown Life spell: %d.", spell); -#endif + int item, sval, spell, realm; + int chance; + int increment = 0; + int use_realm; + int need_mana; - msg_print(NULL); - } + cptr prayer; - return TRUE; -} + object_type *o_ptr; + const magic_type *s_ptr; + cptr q, s; -static bool cast_sorcery_spell(int spell) -{ - int dir; - int plev = p_ptr->lev; + bool over_exerted = FALSE; - switch (spell) + /* Require spell ability */ + if (!p_ptr->realm1 && (p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) { - case 0: /* Detect Monsters */ - (void)detect_monsters_normal(DETECT_RAD_DEFAULT); - break; - case 1: /* Phase Door */ - teleport_player(10); - break; - case 2: /* Detect Doors and Traps */ - (void)detect_traps(DETECT_RAD_DEFAULT, TRUE); - (void)detect_doors(DETECT_RAD_DEFAULT); - (void)detect_stairs(DETECT_RAD_DEFAULT); - break; - case 3: /* Light Area */ - (void)lite_area(damroll(2, (plev / 2)), (plev / 10) + 1); - break; - case 4: /* Confuse Monster */ - if (!get_aim_dir(&dir)) return FALSE; + msg_print(_("呪文を唱えられない!", "You cannot cast spells!")); + return; + } - (void)confuse_monster(dir, (plev * 3) / 2); - break; - case 5: /* Teleport */ - teleport_player(plev * 5); - break; - case 6: /* Sleep Monster */ - if (!get_aim_dir(&dir)) return FALSE; - - (void)sleep_monster(dir); - break; - case 7: /* Recharging */ - return recharge(plev * 4); - case 8: /* Magic Mapping */ - map_area(DETECT_RAD_MAP); - break; - case 9: /* Identify */ - return ident_spell(FALSE); - case 10: /* Slow Monster */ - if (!get_aim_dir(&dir)) return FALSE; - - (void)slow_monster(dir); - break; - case 11: /* Mass Sleep */ - (void)sleep_monsters(); - break; - case 12: /* Teleport Away */ - if (!get_aim_dir(&dir)) return FALSE; - - (void)fire_beam(GF_AWAY_ALL, dir, plev); - break; - case 13: /* Haste Self */ - (void)set_fast(randint1(20 + plev) + plev, FALSE); - break; - case 14: /* Detection True */ - (void)detect_all(DETECT_RAD_DEFAULT); - break; - case 15: /* Identify True */ - return identify_fully(FALSE); - case 16: /* Detect Objects and Treasure*/ - (void)detect_objects_normal(DETECT_RAD_DEFAULT); - (void)detect_treasure(DETECT_RAD_DEFAULT); - (void)detect_objects_gold(DETECT_RAD_DEFAULT); - break; - case 17: /* Charm Monster */ - if (!get_aim_dir(&dir)) return FALSE; - - (void)charm_monster(dir, plev); - break; - case 18: /* Sense Minds */ - (void)set_tim_esp(randint1(30) + 25, FALSE); - break; - case 19: /* Teleport to town */ - return tele_town(); - break; - case 20: /* Self knowledge */ - (void)self_knowledge(); - break; - case 21: /* Teleport Level */ -#ifdef JP - if (!get_check("ËÜÅö¤Ë¾¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©")) return FALSE; -#else - if (!get_check("Are you sure? (Teleport Level)")) return FALSE; -#endif - (void)teleport_player_level(); - break; - case 22: /* Word of Recall */ - if (!word_of_recall()) return FALSE; - break; - case 23: /* Dimension Door */ -#ifdef JP -msg_print("¼¡¸µ¤ÎÈ⤬³«¤¤¤¿¡£ÌÜŪÃϤòÁª¤ó¤Ç²¼¤µ¤¤¡£"); -#else - msg_print("You open a dimensional gate. Choose a destination."); -#endif - - return dimension_door(); - case 24: /* Probing */ - (void)probing(); - break; - case 25: /* Explosive Rune */ - explosive_rune(); - break; - case 26: /* Telekinesis */ - if (!get_aim_dir(&dir)) return FALSE; - - fetch(dir, plev * 15, FALSE); - break; - case 27: /* Clairvoyance */ - chg_virtue(V_KNOWLEDGE, 1); - chg_virtue(V_ENLIGHTEN, 1); - - wiz_lite(FALSE); - if (!(p_ptr->telepathy)) - { - (void)set_tim_esp(randint1(30) + 25, FALSE); - } - break; - case 28: /* Charm Monsters */ - charm_monsters(plev * 2); - break; - case 29: /* Alchemy */ - return alchemy(); - case 30: /* Banish */ - banish_monsters(plev * 4); - break; - case 31: /* Globe of Invulnerability */ - (void)set_invuln(randint1(4) + 4, FALSE); - break; - default: -#ifdef JP -msg_format("¤¢¤Ê¤¿¤ÏÉÔÌÀ¤Ê¥½¡¼¥µ¥ê¡¼¤Î¼öʸ %d ¤ò¾§¤¨¤¿¡£", spell); -#else - msg_format("You cast an unknown Sorcery spell: %d.", spell); -#endif - - msg_print(NULL); - } - - return TRUE; -} - - -static bool cast_nature_spell(int spell) -{ - int dir; - int beam; - int plev = p_ptr->lev; - bool no_trump = FALSE; - - if (p_ptr->pclass == CLASS_MAGE) beam = plev; - else if (p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER) beam = plev + 10; - else beam = plev / 2; - - switch (spell) - { - case 0: /* Detect Creatures */ - (void)detect_monsters_normal(DETECT_RAD_DEFAULT); - break; - case 1: /* Lightning Bolt */ - project_length = plev / 6 + 2; - if (!get_aim_dir(&dir)) return FALSE; - - fire_beam(GF_ELEC, dir, - damroll(3 + ((plev - 1) / 5), 4)); - break; - case 2: /* Detect Doors & Traps */ - (void)detect_traps(DETECT_RAD_DEFAULT, TRUE); - (void)detect_doors(DETECT_RAD_DEFAULT); - (void)detect_stairs(DETECT_RAD_DEFAULT); - break; - case 3: /* Produce Food */ - { - object_type forge, *q_ptr = &forge; - -#ifdef JP - msg_print("¿©ÎÁ¤òÀ¸À®¤·¤¿¡£"); -#else - msg_print("A food ration is produced."); -#endif - - /* Create the food ration */ - object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION)); - - /* Drop the object from heaven */ - (void)drop_near(q_ptr, -1, py, px); - break; - - } - case 4: /* Daylight */ - (void)lite_area(damroll(2, (plev / 2)), (plev / 10) + 1); - if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite) - { -#ifdef JP -msg_print("Æü¤Î¸÷¤¬¤¢¤Ê¤¿¤ÎÆùÂΤò¾Ç¤¬¤·¤¿¡ª"); -#else - msg_print("The daylight scorches your flesh!"); -#endif - -#ifdef JP -take_hit(DAMAGE_NOESCAPE, damroll(2, 2), "Æü¤Î¸÷", -1); -#else - take_hit(DAMAGE_NOESCAPE, damroll(2, 2), "daylight", -1); -#endif - - } - break; - case 5: /* Animal Taming */ - if (!get_aim_dir(&dir)) return FALSE; - - (void)charm_animal(dir, plev); - break; - case 6: /* Resist Environment */ - (void)set_oppose_cold(randint1(20) + 20, FALSE); - (void)set_oppose_fire(randint1(20) + 20, FALSE); - (void)set_oppose_elec(randint1(20) + 20, FALSE); - break; - case 7: /* Cure Wounds & Poison */ - (void)hp_player(damroll(2, 8)); - (void)set_cut(0); - (void)set_poisoned(0); - break; - case 8: /* Stone to Mud */ - if (!get_aim_dir(&dir)) return FALSE; - - (void)wall_to_mud(dir); - break; - case 9: /* Frost Bolt */ - if (!get_aim_dir(&dir)) return FALSE; - fire_bolt_or_beam(beam - 10, GF_COLD, dir, - damroll(3 + ((plev - 5) / 4), 8)); - break; - case 10: /* Nature Awareness -- downgraded */ - map_area(DETECT_RAD_MAP); - (void)detect_traps(DETECT_RAD_DEFAULT, TRUE); - (void)detect_doors(DETECT_RAD_DEFAULT); - (void)detect_stairs(DETECT_RAD_DEFAULT); - (void)detect_monsters_normal(DETECT_RAD_DEFAULT); - break; - case 11: /* Fire Bolt */ - if (!get_aim_dir(&dir)) return FALSE; - fire_bolt_or_beam(beam - 10, GF_FIRE, dir, - damroll(5 + ((plev - 5) / 4), 8)); - break; - case 12: /* Ray of Sunlight */ - if (!get_aim_dir(&dir)) return FALSE; -#ifdef JP -msg_print("ÂÀÍÛ¸÷Àþ¤¬¸½¤ì¤¿¡£"); -#else - msg_print("A line of sunlight appears."); -#endif - - (void)lite_line(dir); - break; - case 13: /* Entangle */ - slow_monsters(); - break; - case 14: /* Summon Animals */ - if (!(summon_specific(-1, py, px, plev, SUMMON_ANIMAL_RANGER, (PM_ALLOW_GROUP | PM_FORCE_PET)))) - no_trump = TRUE; - break; - case 15: /* Herbal Healing */ - (void)hp_player(500); - (void)set_stun(0); - (void)set_cut(0); - (void)set_poisoned(0); - break; - case 16: /* Stair Building */ - (void)stair_creation(); - break; - case 17: /* Stone Skin */ - (void)set_shield(randint1(20) + 30, FALSE); - break; - case 18: /* Resistance True */ - (void)set_oppose_acid(randint1(20) + 20, FALSE); - (void)set_oppose_elec(randint1(20) + 20, FALSE); - (void)set_oppose_fire(randint1(20) + 20, FALSE); - (void)set_oppose_cold(randint1(20) + 20, FALSE); - (void)set_oppose_pois(randint1(20) + 20, FALSE); - break; - case 19: /* Tree Creation */ - (void)tree_creation(); - break; - case 20: /* Animal Friendship */ - (void)charm_animals(plev * 2); - break; - case 21: /* Stone Tell */ - return identify_fully(FALSE); - case 22: /* Wall of Stone */ - (void)wall_stone(); - break; - case 23: /* Protection from Corrosion */ - return rustproof(); - case 24: /* Earthquake */ - earthquake(py, px, 10); - break; - case 25: /* Whirlwind Attack */ - { - int y = 0, x = 0; - cave_type *c_ptr; - monster_type *m_ptr; - - for (dir = 0; dir < 8; dir++) - { - y = py + ddy_ddd[dir]; - x = px + ddx_ddd[dir]; - c_ptr = &cave[y][x]; - - /* Get the monster */ - m_ptr = &m_list[c_ptr->m_idx]; - - /* Hack -- attack monsters */ - if (c_ptr->m_idx && (m_ptr->ml || cave_floor_bold(y, x))) - py_attack(y, x, 0); - } - } - break; - case 26: /* Blizzard */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_ball(GF_COLD, dir, 70 + plev * 3 / 2, (plev / 12) + 1); - break; - case 27: /* Lightning Storm */ - if (!get_aim_dir(&dir)) return FALSE; - fire_ball(GF_ELEC, dir, 90 + plev * 3 / 2, (plev / 12) + 1); - break; - case 28: /* Whirlpool */ - if (!get_aim_dir(&dir)) return FALSE; - fire_ball(GF_WATER, dir, 100 + plev * 3 / 2, (plev / 12) + 1); - break; - case 29: /* Call Sunlight */ - fire_ball(GF_LITE, 0, 150, 8); - chg_virtue(V_KNOWLEDGE, 1); - chg_virtue(V_ENLIGHTEN, 1); - wiz_lite(FALSE); - if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite) - { -#ifdef JP -msg_print("Æü¸÷¤¬¤¢¤Ê¤¿¤ÎÆùÂΤò¾Ç¤¬¤·¤¿¡ª"); -#else - msg_print("The sunlight scorches your flesh!"); -#endif - -#ifdef JP -take_hit(DAMAGE_NOESCAPE, 50, "Æü¸÷", -1); -#else - take_hit(DAMAGE_NOESCAPE, 50, "sunlight", -1); -#endif - - } - break; - case 30: /* Elemental Branding */ - brand_weapon(randint0(2)); - break; - case 31: /* Nature's Wrath */ - (void)dispel_monsters(plev * 4); - earthquake(py, px, 20 + (plev / 2)); - project(0, 1 + plev / 12, py, px, - (100 + plev) * 2, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM, -1); - break; - default: -#ifdef JP -msg_format("¤¢¤Ê¤¿¤ÏÉÔÌÀ¤Ê¥Í¥¤¥Á¥ã¡¼¤Î¼öʸ %d ¤ò¾§¤¨¤¿¡£", spell); -#else - msg_format("You cast an unknown Nature spell: %d.", spell); -#endif - - msg_print(NULL); - } - - if (no_trump) -#ifdef JP -msg_print("ưʪ¤Ï¸½¤ì¤Ê¤«¤Ã¤¿¡£"); -#else - msg_print("No animals arrive."); -#endif - - - return TRUE; -} - - -static bool cast_chaos_spell(int spell) -{ - int dir, i, beam; - int plev = p_ptr->lev; - - if (p_ptr->pclass == CLASS_MAGE) beam = plev; - else if (p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER) beam = plev + 10; - else beam = plev / 2; - - switch (spell) - { - case 0: /* Magic Missile */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_bolt_or_beam(beam - 10, GF_MISSILE, dir, - damroll(3 + ((plev - 1) / 5), 4)); - break; - case 1: /* Trap / Door destruction */ - (void)destroy_doors_touch(); - break; - case 2: /* Flash of Light == Light Area */ - (void)lite_area(damroll(2, (plev / 2)), (plev / 10) + 1); - break; - case 3: /* Touch of Confusion */ - if (!(p_ptr->special_attack & ATTACK_CONFUSE)) - { -#ifdef JP -msg_print("¤¢¤Ê¤¿¤Î¼ê¤Ï¸÷¤ê»Ï¤á¤¿¡£"); -#else - msg_print("Your hands start glowing."); -#endif - - p_ptr->special_attack |= ATTACK_CONFUSE; - p_ptr->redraw |= (PR_STATUS); - } - break; - case 4: /* Mana Burst */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_ball(GF_MISSILE, dir, - (damroll(3, 5) + plev + - (plev / (((p_ptr->pclass == CLASS_MAGE) - || (p_ptr->pclass == CLASS_HIGH_MAGE) - || (p_ptr->pclass == CLASS_SORCERER)) ? 2 : 4))), - ((plev < 30) ? 2 : 3)); - /* Shouldn't actually use GF_MANA, as it will destroy all - * items on the floor */ - break; - case 5: /* Fire Bolt */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_bolt_or_beam(beam, GF_FIRE, dir, - damroll(8 + ((plev - 5) / 4), 8)); - break; - case 6: /* Fist of Force ("Fist of Fun") */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_ball(GF_DISINTEGRATE, dir, - damroll(8 + ((plev - 5) / 4), 8), 0); - break; - case 7: /* Teleport Self */ - teleport_player(plev * 5); - break; - case 8: /* Wonder */ - { - /* This spell should become more useful (more - controlled) as the player gains experience levels. - Thus, add 1/5 of the player's level to the die roll. - This eliminates the worst effects later on, while - keeping the results quite random. It also allows - some potent effects only at high level. */ - - 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 (die < 26) - chg_virtue(V_CHANCE, 1); - - if (!get_aim_dir(&dir)) return FALSE; - if (die > 100) -#ifdef JP -msg_print("¤¢¤Ê¤¿¤ÏÎϤ¬¤ß¤Ê¤®¤ë¤Î¤ò´¶¤¸¤¿¡ª"); -#else - msg_print("You feel a surge of power!"); -#endif - - if (die < 8) clone_monster(dir); - else if (die < 14) speed_monster(dir); - else if (die < 26) heal_monster(dir, damroll(4, 6)); - else if (die < 31) poly_monster(dir); - else if (die < 36) - fire_bolt_or_beam(beam - 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); - else if (die < 56) - fire_bolt_or_beam(beam - 10, GF_ELEC, dir, - damroll(3 + ((plev - 5) / 4), 8)); - else if (die < 61) - fire_bolt_or_beam(beam - 10, GF_COLD, dir, - damroll(5 + ((plev - 5) / 4), 8)); - else if (die < 66) - fire_bolt_or_beam(beam, GF_ACID, dir, - damroll(6 + ((plev - 5) / 4), 8)); - else if (die < 71) - fire_bolt_or_beam(beam, GF_FIRE, dir, - damroll(8 + ((plev - 5) / 4), 8)); - else if (die < 76) drain_life(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) drain_life(dir, 100 + plev); - else if (die < 104) - { - earthquake(py, px, 12); - } - else if (die < 106) - { - destroy_area(py, px, 13+randint0(5)); - } - else if (die < 108) - { - symbol_genocide(plev+50, TRUE); - } - else if (die < 110) dispel_monsters(120); - else /* RARE */ - { - dispel_monsters(150); - slow_monsters(); - sleep_monsters(); - hp_player(300); - } - break; - } - break; - case 9: /* Chaos Bolt */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_bolt_or_beam(beam, GF_CHAOS, dir, - damroll(10 + ((plev - 5) / 4), 8)); - break; - case 10: /* Sonic Boom */ -#ifdef JP -msg_print("¥É¡¼¥ó¡ªÉô²°¤¬Íɤ줿¡ª"); -#else - msg_print("BOOM! Shake the room!"); -#endif - - project(0, plev / 10 + 2, py, px, - (60 + plev), GF_SOUND, PROJECT_KILL | PROJECT_ITEM, -1); - break; - case 11: /* Doom Bolt -- always beam in 2.0.7 or later */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_beam(GF_MANA, dir, damroll(11 + ((plev - 5) / 4), 8)); - break; - case 12: /* Fire Ball */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_ball(GF_FIRE, dir, plev + 55, 2); - break; - case 13: /* Teleport Other */ - if (!get_aim_dir(&dir)) return FALSE; - - (void)fire_beam(GF_AWAY_ALL, dir, plev); - break; - case 14: /* Word of Destruction */ - destroy_area(py, px, 13+randint0(5)); - break; - case 15: /* Invoke Logrus */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_ball(GF_CHAOS, dir, plev*2 + 99, plev / 5); - break; - case 16: /* Polymorph Other */ - if (!get_aim_dir(&dir)) return FALSE; - - (void)poly_monster(dir); - break; - case 17: /* Chain Lightning */ - for (dir = 0; dir <= 9; dir++) - fire_beam(GF_ELEC, dir, damroll(5 + (plev / 10), 8)); - break; - case 18: /* Arcane Binding == Charging */ - return recharge(90); - case 19: /* Disintegration */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_ball(GF_DISINTEGRATE, dir, plev + 70, 3 + plev / 40); - break; - case 20: /* Alter Reality */ - alter_reality(); - break; - case 21: /* Magic Rocket */ - if (!get_aim_dir(&dir)) return FALSE; - -#ifdef JP -msg_print("¥í¥±¥Ã¥Èȯ¼Í¡ª"); -#else - msg_print("You launch a rocket!"); -#endif - - fire_rocket(GF_ROCKET, dir, 120 + plev*2, 2); - break; - case 22: /* Chaos Branding */ - brand_weapon(2); - break; - case 23: /* Summon monster, demon */ - { - u32b mode = 0L; - bool pet = !one_in_(3); - - if (pet) mode |= PM_FORCE_PET; - else mode |= PM_NO_PET; - if (!(pet && (plev < 50))) mode |= PM_ALLOW_GROUP; - - if (summon_specific((pet ? -1 : 0), py, px, (plev * 3) / 2, SUMMON_DEMON, mode)) - { -#ifdef JP -msg_print("ⲫ¤Î°­½­¤¬½¼Ëþ¤·¤¿¡£"); -#else - msg_print("The area fills with a stench of sulphur and brimstone."); -#endif - - - if (pet) -#ifdef JP -msg_print("¡Ö¤´ÍѤǤ´¤¶¤¤¤Þ¤¹¤«¡¢¤´¼ç¿ÍÍÍ¡×"); -#else - msg_print("'What is thy bidding... Master?'"); -#endif - - else -#ifdef JP -msg_print("¡ÖÈܤ·¤­¼Ô¤è¡¢²æ¤ÏÆò¤Î²¼Ëͤˤ¢¤é¤º¡ª ¤ªÁ°¤Îº²¤òĺ¤¯¤¾¡ª¡×"); -#else - msg_print("'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"); -#endif - - } - break; - } - case 24: /* Beam of Gravity */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_beam(GF_GRAVITY, dir, damroll(9 + ((plev - 5) / 4), 8)); - break; - case 25: /* Meteor Swarm */ - { - int x, y, dx, dy; - int b = 10 + randint1(10); - for (i = 0; i < b; i++) - { - int count = 0, d = 0; - - while (1) - { - count++; - if (count > 20) break; - x = px - 8 + randint0(17); - y = py - 8 + randint0(17); - - if (!in_bounds(y,x) || (!cave_floor_bold(y,x) && (cave[y][x].feat != FEAT_TREES)) || !player_has_los_bold(y, x)) continue; - - dx = (px > x) ? (px - x) : (x - px); - dy = (py > y) ? (py - y) : (y - py); - - /* Approximate distance */ - d = (dy > dx) ? (dy + (dx >> 1)) : (dx + (dy >> 1)); - if (d < 9) break; - } - - if (count > 20) continue; - - project(0, 2, y, x, plev * 2, GF_METEOR, PROJECT_KILL | PROJECT_JUMP | PROJECT_ITEM, -1); - } - } - break; - case 26: /* Flame Strike */ - fire_ball(GF_FIRE, 0, 300 + (3 * plev), 8); - break; - case 27: /* Call Chaos */ - call_chaos(); - break; - case 28: /* Polymorph Self */ -#ifdef JP - if (!get_check("ÊѿȤ·¤Þ¤¹¡£¤è¤í¤·¤¤¤Ç¤¹¤«¡©")) return FALSE; -#else - if (!get_check("You will polymorph yourself. Are you sure? ")) return FALSE; -#endif - do_poly_self(); - break; - case 29: /* Mana Storm */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_ball(GF_MANA, dir, 300 + (plev * 4), 4); - break; - case 30: /* Breathe Logrus */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_ball(GF_CHAOS, dir, p_ptr->chp, 2); - break; - case 31: /* Call the Void */ - call_the_(); - break; - default: -#ifdef JP -msg_format("¤¢¤Ê¤¿¤ÏÉÔÌÀ¤Ê¥«¥ª¥¹¤Î¼öʸ %d ¤ò¾§¤¨¤¿¡£", spell); -#else - msg_format("You cast an unknown Chaos spell: %d.", spell); -#endif - - msg_print(NULL); - } - - return TRUE; -} - - -static bool cast_death_spell(int spell) -{ - int dir; - int beam; - int plev = p_ptr->lev; - int dummy = 0; - - if (p_ptr->pclass == CLASS_MAGE) beam = plev; - else if (p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER) beam = plev + 10; - else beam = plev / 2; - - switch (spell) - { - case 0: /* Detect Undead & Demons -> Unlife */ - (void)detect_monsters_nonliving(DETECT_RAD_DEFAULT); - break; - case 1: /* Malediction */ - if (!get_aim_dir(&dir)) return FALSE; - /* A radius-0 ball may (1) be aimed at objects etc., - * and will affect them; (2) may be aimed at ANY - * visible monster, unlike a 'bolt' which must travel - * to the monster. */ - - fire_ball(GF_HELL_FIRE, dir, - damroll(3 + ((plev - 1) / 5), 4), 0); - - if (one_in_(5)) - { /* Special effect first */ - dummy = randint1(1000); - if (dummy == 666) - fire_ball_hide(GF_DEATH_RAY, dir, plev * 200, 0); - else if (dummy < 500) - fire_ball_hide(GF_TURN_ALL, dir, plev, 0); - else if (dummy < 800) - fire_ball_hide(GF_OLD_CONF, dir, plev, 0); - else - fire_ball_hide(GF_STUN, dir, plev, 0); - } - break; - case 2: /* Detect Evil */ - (void)detect_monsters_evil(DETECT_RAD_DEFAULT); - break; - case 3: /* Stinking Cloud */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_ball(GF_POIS, dir, 10 + (plev / 2), 2); - break; - case 4: /* Black Sleep */ - if (!get_aim_dir(&dir)) return FALSE; - - (void)sleep_monster(dir); - break; - case 5: /* Resist Poison */ - (void)set_oppose_pois(randint1(20) + 20, FALSE); - break; - case 6: /* Horrify */ - if (!get_aim_dir(&dir)) return FALSE; - - (void)fear_monster(dir, plev); - (void)stun_monster(dir, plev); - break; - case 7: /* Enslave Undead */ - if (!get_aim_dir(&dir)) return FALSE; - - (void)control_one_undead(dir, plev); - break; - case 8: /* Orb of Entropy */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_ball(GF_OLD_DRAIN, dir, - (damroll(3, 6) + plev + - (plev / (((p_ptr->pclass == CLASS_MAGE) || - (p_ptr->pclass == CLASS_HIGH_MAGE) || - (p_ptr->pclass == CLASS_SORCERER)) ? 2 : 4))), - ((plev < 30) ? 2 : 3)); - break; - case 9: /* Nether Bolt */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_bolt_or_beam(beam, GF_NETHER, dir, - damroll(8 + ((plev - 5) / 4), 8)); - break; - case 10: /* Cloud kill */ - project(0, plev / 10 + 2, py, px, - (30 + plev) * 2, GF_POIS, PROJECT_KILL | PROJECT_ITEM, -1); - break; - case 11: /* Genocide One */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_ball_hide(GF_GENOCIDE, dir, plev + 50, 0); - break; - case 12: /* Poison Branding */ - brand_weapon(3); - break; - case 13: /* Vampiric Drain */ - if (!get_aim_dir(&dir)) return FALSE; - - dummy = plev * 2 + randint1(plev * 2); /* Dmg */ - if (drain_life(dir, dummy)) - { - chg_virtue(V_SACRIFICE, -1); - chg_virtue(V_VITALITY, -1); - - (void)hp_player(dummy); - /* Gain nutritional sustenance: 150/hp drained */ - /* A Food ration gives 5000 food points (by contrast) */ - /* Don't ever get more than "Full" this way */ - /* But if we ARE Gorged, it won't cure us */ - dummy = p_ptr->food + MIN(5000, 100 * dummy); - if (p_ptr->food < PY_FOOD_MAX) /* Not gorged already */ - (void)set_food(dummy >= PY_FOOD_MAX ? PY_FOOD_MAX - 1 : dummy); - } - break; - case 14: /* Animate Dead */ - animate_dead(0, py, px); - break; - case 15: /* Genocide */ - (void)symbol_genocide(plev+50, TRUE); - break; - case 16: /* Berserk */ - (void)set_shero(randint1(25) + 25, FALSE); - (void)hp_player(30); - (void)set_afraid(0); - break; - case 17: /* Invoke Spirits */ - { - 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 (!get_aim_dir(&dir)) return FALSE; - -#ifdef JP -msg_print("¤¢¤Ê¤¿¤Ï»à¼Ô¤¿¤Á¤ÎÎϤò¾·½¸¤·¤¿..."); -#else - msg_print("You call on the power of the dead..."); -#endif - if (die < 26) - chg_virtue(V_CHANCE, 1); - - if (die > 100) -#ifdef JP -msg_print("¤¢¤Ê¤¿¤Ï¤ª¤É¤í¤ª¤É¤í¤·¤¤ÎϤΤ¦¤Í¤ê¤ò´¶¤¸¤¿¡ª"); -#else - msg_print("You feel a surge of eldritch force!"); -#endif - - - if (die < 8) - { -#ifdef JP -msg_print("¤Ê¤ó¤Æ¤³¤Ã¤¿¡ª¤¢¤Ê¤¿¤Î¼þ¤ê¤ÎÃÏÌ̤«¤éµà¤Á¤¿¿Í±Æ¤¬Î©¤Á¾å¤¬¤Ã¤Æ¤­¤¿¡ª"); -#else - msg_print("Oh no! Mouldering forms rise from the earth around you!"); -#endif - - (void)summon_specific(0, py, px, dun_level, SUMMON_UNDEAD, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)); - chg_virtue(V_UNLIFE, 1); - } - else if (die < 14) - { -#ifdef JP -msg_print("̾¾õ¤·Æñ¤¤¼Ù°­¤Ê¸ºß¤¬¤¢¤Ê¤¿¤Î¿´¤òÄ̤ê²á¤®¤Æ¹Ô¤Ã¤¿..."); -#else - msg_print("An unnamable evil brushes against your mind..."); -#endif - - set_afraid(p_ptr->afraid + randint1(4) + 4); - } - else if (die < 26) - { -#ifdef JP -msg_print("¤¢¤Ê¤¿¤ÎƬ¤ËÂçÎ̤ÎÍ©Î¤Á¤ÎÁû¡¹¤·¤¤À¼¤¬²¡¤·´ó¤»¤Æ¤­¤¿..."); -#else - msg_print("Your head is invaded by a horde of gibbering spectral voices..."); -#endif - - set_confused(p_ptr->confused + randint1(4) + 4); - } - else if (die < 31) - { - poly_monster(dir); - } - else if (die < 36) - { - fire_bolt_or_beam(beam - 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); - } - else if (die < 56) - { - fire_bolt_or_beam(beam - 10, GF_ELEC, dir, - damroll(3+((plev-5)/4),8)); - } - else if (die < 61) - { - fire_bolt_or_beam(beam - 10, GF_COLD, dir, - damroll(5+((plev-5)/4),8)); - } - else if (die < 66) - { - fire_bolt_or_beam(beam, GF_ACID, dir, - damroll(6+((plev-5)/4),8)); - } - else if (die < 71) - { - fire_bolt_or_beam(beam, GF_FIRE, dir, - damroll(8+((plev-5)/4),8)); - } - else if (die < 76) - { - drain_life(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) - { - drain_life(dir, 100 + plev); - } - else if (die < 104) - { - earthquake(py, px, 12); - } - else if (die < 106) - { - destroy_area(py, px, 13+randint0(5)); - } - else if (die < 108) - { - symbol_genocide(plev+50, TRUE); - } - else if (die < 110) - { - dispel_monsters(120); - } - else - { /* RARE */ - dispel_monsters(150); - slow_monsters(); - sleep_monsters(); - hp_player(300); - } - - if (die < 31) -#ifdef JP -msg_print("±¢±µ¤ÊÀ¼¤¬¥¯¥¹¥¯¥¹¾Ð¤¦¡£¡Ö¤â¤¦¤¹¤°¤ª¤Þ¤¨¤Ï²æ¡¹¤ÎÃç´Ö¤Ë¤Ê¤ë¤À¤í¤¦¡£¼å¤­¼Ô¤è¡£¡×"); -#else - msg_print("Sepulchral voices chuckle. 'Soon you will join us, mortal.'"); -#endif - - break; - } - case 18: /* Dark Bolt */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_bolt_or_beam(beam, GF_DARK, dir, - damroll(4 + ((plev - 5) / 4), 8)); - break; - case 19: /* Battle Frenzy */ - (void)set_shero(randint1(25) + 25, FALSE); - (void)hp_player(30); - (void)set_afraid(0); - (void)set_fast(randint1(20 + (plev / 2)) + (plev / 2), FALSE); - break; - case 20: /* Vampiric Branding */ - brand_weapon(4); - break; - case 21: /* Vampirism True */ - if (!get_aim_dir(&dir)) return FALSE; - - chg_virtue(V_SACRIFICE, -1); - chg_virtue(V_VITALITY, -1); - - for (dummy = 0; dummy < 3; dummy++) - { - if (drain_life(dir, 100)) - hp_player(100); - } - break; - case 22: /* Word of Death */ - (void)dispel_living(randint1(plev * 3)); - break; - case 23: /* Darkness Storm */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_ball(GF_DARK, dir, 100+plev*2, 4); - break; - case 24: /* Death Ray */ - if (!get_aim_dir(&dir)) return FALSE; - - (void)death_ray(dir, plev); - break; - case 25: /* Raise the Dead */ - { - int type; - bool pet = one_in_(3); - u32b mode = 0L; - - type = (plev > 47 ? SUMMON_HI_UNDEAD : SUMMON_UNDEAD); - - if (!pet || (pet && (plev > 24) && one_in_(3))) - mode |= PM_ALLOW_GROUP; - - if (pet) mode |= PM_FORCE_PET; - else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET); - - if (summon_specific((pet ? -1 : 0), py, px, (plev * 3) / 2, type, mode)) - { -#ifdef JP -msg_print("Î䤿¤¤É÷¤¬¤¢¤Ê¤¿¤Î¼þ¤ê¤Ë¿á¤­»Ï¤á¤¿¡£¤½¤ì¤ÏÉåÇÔ½­¤ò±¿¤ó¤Ç¤¤¤ë..."); -#else - msg_print("Cold winds begin to blow around you, carrying with them the stench of decay..."); -#endif - - - if (pet) -#ifdef JP -msg_print("¸Å¤¨¤Î»à¤»¤ë¼Ô¶¦¤¬¤¢¤Ê¤¿¤Ë»Å¤¨¤ë¤¿¤áÅÚ¤«¤éᴤä¿¡ª"); -#else - msg_print("Ancient, long-dead forms arise from the ground to serve you!"); -#endif - - else -#ifdef JP -msg_print("»à¼Ô¤¬á´¤Ã¤¿¡£Ì²¤ê¤ò˸¤²¤ë¤¢¤Ê¤¿¤òȳ¤¹¤ë¤¿¤á¤Ë¡ª"); -#else - msg_print("'The dead arise... to punish you for disturbing them!'"); -#endif - - chg_virtue(V_UNLIFE, 1); - } - - break; - } - case 26: /* Esoteria */ - if (randint1(50) > plev) - return ident_spell(FALSE); - else - return identify_fully(FALSE); - break; - case 27: /* Mimic vampire */ - (void)set_mimic(10+plev/2 + randint1(10+plev/2), MIMIC_VAMPIRE, FALSE); - break; - case 28: /* Restore Life */ - (void)restore_level(); - break; - case 29: /* Mass Genocide */ - (void)mass_genocide(plev+50, TRUE); - break; - case 30: /* Hellfire */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_ball(GF_HELL_FIRE, dir, 666, 3); -#ifdef JP -take_hit(DAMAGE_USELIFE, 20 + randint1(30), "ÃϹö¤Î¹å²Ð¤Î¼öʸ¤ò¾§¤¨¤¿ÈèÏ«", -1); -#else - take_hit(DAMAGE_USELIFE, 20 + randint1(30), "the strain of casting Hellfire", -1); -#endif - - break; - case 31: /* Wraithform */ - set_wraith_form(randint1(plev / 2) + (plev / 2), FALSE); - break; - default: - msg_format("You cast an unknown Death spell: %d.", spell); - msg_print(NULL); - } - - return TRUE; -} - - -static bool cast_trump_spell(int spell, bool success) -{ - int dir; - int beam; - int plev = p_ptr->lev; - int summon_lev = plev * 2 / 3 + randint1(plev/2); - int dummy = 0; - bool no_trump = FALSE; - bool unique_okay = FALSE; - - - if (p_ptr->pclass == CLASS_MAGE) beam = plev; - else if (p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER) beam = plev + 10; - else beam = plev / 2; - - if (summon_lev < 1) summon_lev = 1; - if (!success || (randint1(50+plev) < plev/10)) unique_okay = TRUE; - switch (spell) - { - case 0: /* Phase Door */ - if (success) - { - teleport_player(10); - } - break; - case 1: /* Trump Spiders */ - { - bool pet = success; /* (randint1(5) > 2) */ - u32b mode = PM_ALLOW_GROUP; - - if (pet) mode |= PM_FORCE_PET; - else mode |= PM_NO_PET; - -#ifdef JP -msg_print("¤¢¤Ê¤¿¤ÏÃØéá¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë..."); -#else - msg_print("You concentrate on the trump of an spider..."); -#endif - - if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_SPIDER, mode)) - { - if (!pet) -#ifdef JP -msg_print("¾¤´­¤µ¤ì¤¿ÃØéá¤ÏÅܤäƤ¤¤ë¡ª"); -#else - msg_print("The summoned spiders get angry!"); -#endif - } - else - { - no_trump = TRUE; - } - - break; - } - case 2: /* Shuffle */ - if (success) - { - /* A limited power 'wonder' spell */ - int die = randint1(120); - int vir = virtue_number(V_CHANCE); - - if ((p_ptr->pclass == CLASS_ROGUE) || - (p_ptr->pclass == CLASS_HIGH_MAGE) || - (p_ptr->pclass == CLASS_SORCERER)) - die = (randint1(110)) + plev / 5; - /* Card sharks and high mages get a level bonus */ - - 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--; - } - } - -#ifdef JP -msg_print("¤¢¤Ê¤¿¤Ï¥«¡¼¥É¤òÀڤäưìËç°ú¤¤¤¿..."); -#else - msg_print("You shuffle the deck and draw a card..."); -#endif - - if (die < 30) - chg_virtue(V_CHANCE, 1); - - if (die < 7) - { -#ifdef JP -msg_print("¤Ê¤ó¤Æ¤³¤Ã¤¿¡ª¡Ô»à¡Õ¤À¡ª"); -#else - msg_print("Oh no! It's Death!"); -#endif - - for (dummy = 0; dummy < randint1(3); dummy++) - (void)activate_hi_summon(py, px, FALSE); - } - else if (die < 14) - { -#ifdef JP -msg_print("¤Ê¤ó¤Æ¤³¤Ã¤¿¡ª¡Ô°­Ëâ¡Õ¤À¡ª"); -#else - msg_print("Oh no! It's the Devil!"); -#endif - - (void)summon_specific(0, py, px, dun_level, SUMMON_DEMON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)); - } - else if (die < 18) - { - int count = 0; -#ifdef JP -msg_print("¤Ê¤ó¤Æ¤³¤Ã¤¿¡ª¡ÔÄߤé¤ì¤¿ÃË¡Õ¤À¡ª"); -#else - msg_print("Oh no! It's the Hanged Man."); -#endif - - (void)activate_ty_curse(FALSE, &count); - } - else if (die < 22) - { -#ifdef JP -msg_print("¡ÔÉÔĴϤηõ¡Õ¤À¡£"); -#else - msg_print("It's the swords of discord."); -#endif - - aggravate_monsters(0); - } - else if (die < 26) - { -#ifdef JP -msg_print("¡Ô¶ò¼Ô¡Õ¤À¡£"); -#else - msg_print("It's the Fool."); -#endif - - (void)do_dec_stat(A_INT); - (void)do_dec_stat(A_WIS); - } - else if (die < 30) - { -#ifdef JP -msg_print("´ñ̯¤Ê¥â¥ó¥¹¥¿¡¼¤Î³¨¤À¡£"); -#else - msg_print("It's the picture of a strange monster."); -#endif - - if (!(summon_specific(0, py, px, (dun_level * 3) / 2, 32 + randint1(6), (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))) - no_trump = TRUE; - } - else if (die < 33) - { -#ifdef JP -msg_print("¡Ô·î¡Õ¤À¡£"); -#else - msg_print("It's the Moon."); -#endif - - unlite_area(10, 3); - } - else if (die < 38) - { -#ifdef JP -msg_print("¡Ô±¿Ì¿¤ÎÎØ¡Õ¤À¡£"); -#else - msg_print("It's the Wheel of Fortune."); -#endif - - wild_magic(randint0(32)); - } - else if (die < 40) - { -#ifdef JP -msg_print("¥Æ¥ì¥Ý¡¼¥È¡¦¥«¡¼¥É¤À¡£"); -#else - msg_print("It's a teleport trump card."); -#endif - - teleport_player(10); - } - else if (die < 42) - { -#ifdef JP -msg_print("¡ÔÀµµÁ¡Õ¤À¡£"); -#else - msg_print("It's Justice."); -#endif - - set_blessed(p_ptr->lev, FALSE); - } - else if (die < 47) - { -#ifdef JP -msg_print("¥Æ¥ì¥Ý¡¼¥È¡¦¥«¡¼¥É¤À¡£"); -#else - msg_print("It's a teleport trump card."); -#endif - - teleport_player(100); - } - else if (die < 52) - { -#ifdef JP -msg_print("¥Æ¥ì¥Ý¡¼¥È¡¦¥«¡¼¥É¤À¡£"); -#else - msg_print("It's a teleport trump card."); -#endif - - teleport_player(200); - } - else if (die < 60) - { -#ifdef JP -msg_print("¡ÔÅã¡Õ¤À¡£"); -#else - msg_print("It's the Tower."); -#endif - - wall_breaker(); - } - else if (die < 72) - { -#ifdef JP -msg_print("¡ÔÀáÀ©¡Õ¤À¡£"); -#else - msg_print("It's Temperance."); -#endif - - sleep_monsters_touch(); - } - else if (die < 80) - { -#ifdef JP -msg_print("¡ÔÅã¡Õ¤À¡£"); -#else - msg_print("It's the Tower."); -#endif - - earthquake(py, px, 5); - } - else if (die < 82) - { -#ifdef JP -msg_print("ͧ¹¥Åª¤Ê¥â¥ó¥¹¥¿¡¼¤Î³¨¤À¡£"); -#else - msg_print("It's the picture of a friendly monster."); -#endif - - if (!(summon_specific(-1, py, px, (dun_level * 3) / 2, SUMMON_BIZARRE1, PM_FORCE_PET))) - no_trump = TRUE; - } - else if (die < 84) - { -#ifdef JP -msg_print("ͧ¹¥Åª¤Ê¥â¥ó¥¹¥¿¡¼¤Î³¨¤À¡£"); -#else - msg_print("It's the picture of a friendly monster."); -#endif - - if (!(summon_specific(-1, py, px, (dun_level * 3) / 2, SUMMON_BIZARRE2, PM_FORCE_PET))) - no_trump = TRUE; - } - else if (die < 86) - { -#ifdef JP -msg_print("ͧ¹¥Åª¤Ê¥â¥ó¥¹¥¿¡¼¤Î³¨¤À¡£"); -#else - msg_print("It's the picture of a friendly monster."); -#endif - - if (!(summon_specific(-1, py, px, (dun_level * 3) / 2, SUMMON_BIZARRE4, PM_FORCE_PET))) - no_trump = TRUE; - } - else if (die < 88) - { -#ifdef JP -msg_print("ͧ¹¥Åª¤Ê¥â¥ó¥¹¥¿¡¼¤Î³¨¤À¡£"); -#else - msg_print("It's the picture of a friendly monster."); -#endif - - if (!(summon_specific(-1, py, px, (dun_level * 3) / 2, SUMMON_BIZARRE5, PM_FORCE_PET))) - no_trump = TRUE; - } - else if (die < 96) - { -#ifdef JP -msg_print("¡ÔÎø¿Í¡Õ¤À¡£"); -#else - msg_print("It's the Lovers."); -#endif - - if (get_aim_dir(&dir)) - (void)charm_monster(dir, MIN(p_ptr->lev, 20)); - } - else if (die < 101) - { -#ifdef JP -msg_print("¡Ô±£¼Ô¡Õ¤À¡£"); -#else - msg_print("It's the Hermit."); -#endif - - wall_stone(); - } - else if (die < 111) - { -#ifdef JP -msg_print("¡Ô¿³È½¡Õ¤À¡£"); -#else - msg_print("It's the Judgement."); -#endif - - do_cmd_rerate(FALSE); - if (p_ptr->muta1 || p_ptr->muta2 || p_ptr->muta3) - { -#ifdef JP -msg_print("Á´¤Æ¤ÎÆÍÁ³ÊÑ°Û¤¬¼£¤Ã¤¿¡£"); -#else - msg_print("You are cured of all mutations."); -#endif - - p_ptr->muta1 = p_ptr->muta2 = p_ptr->muta3 = 0; - p_ptr->update |= PU_BONUS; - handle_stuff(); - } - } - else if (die < 120) - { -#ifdef JP -msg_print("¡ÔÂÀÍÛ¡Õ¤À¡£"); -#else - msg_print("It's the Sun."); -#endif - - chg_virtue(V_KNOWLEDGE, 1); - chg_virtue(V_ENLIGHTEN, 1); - wiz_lite(FALSE); - } - else - { -#ifdef JP -msg_print("¡ÔÀ¤³¦¡Õ¤À¡£"); -#else - msg_print("It's the World."); -#endif - - if (p_ptr->exp < PY_MAX_EXP) - { - s32b ee = (p_ptr->exp / 25) + 1; - if (ee > 5000) ee = 5000; -#ifdef JP -msg_print("¹¹¤Ë·Ð¸³¤òÀѤó¤À¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£"); -#else - msg_print("You feel more experienced."); -#endif - - gain_exp(ee); - } - } - } - break; - case 3: /* Reset Recall */ - if (success) - { - if (!reset_recall()) return FALSE; - } - break; - case 4: /* Teleport Self */ - if (success) - { - teleport_player(plev * 4); - } - break; - case 5: /* Trump Spying */ - if (success) - { - (void)set_tim_esp(randint1(30) + 25, FALSE); - } - break; - case 6: /* Teleport Away */ - if (success) - { - if (!get_aim_dir(&dir)) return FALSE; - (void)fire_beam(GF_AWAY_ALL, dir, plev); - } - break; - case 7: /* Trump Animals */ - { - bool pet = success; /* was (randint1(5) > 2) */ - int type = (pet ? SUMMON_ANIMAL_RANGER : SUMMON_ANIMAL); - u32b mode = 0L; - - if (pet) mode |= PM_FORCE_PET; - else mode |= (PM_ALLOW_GROUP | PM_NO_PET); - -#ifdef JP -msg_print("¤¢¤Ê¤¿¤Ïưʪ¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë..."); -#else - msg_print("You concentrate on the trump of an animal..."); -#endif - - - if (summon_specific((pet ? -1 : 0), py, px, summon_lev, type, mode)) - { - if (!pet) -#ifdef JP -msg_print("¾¤´­¤µ¤ì¤¿Æ°Êª¤ÏÅܤäƤ¤¤ë¡ª"); -#else - msg_print("The summoned animal gets angry!"); -#endif - - } - else - { - no_trump = TRUE; - } - - break; - } - case 8: /* Trump Reach */ - if (success) - { - if (!get_aim_dir(&dir)) return FALSE; - fetch(dir, plev * 15, TRUE); - } - break; - case 9: /* Trump Kamikaze */ - { - int x = px, y = py; - if (success) - { - if (!target_set(TARGET_KILL)) return FALSE; - x = target_col; - y = target_row; - } - no_trump = TRUE; - -#ifdef JP -msg_print("¤¢¤Ê¤¿¤Ï¥«¥ß¥«¥¼¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë..."); -#else - msg_print("You concentrate on several trumps at once..."); -#endif - - - for (dummy = 2 + randint0(plev / 7); dummy > 0; dummy--) - { - bool pet = success; /* was (randint1(10) > 3) */ - u32b mode = 0L; - int type; - - if (pet) mode |= PM_FORCE_PET; - else mode |= (PM_ALLOW_GROUP | PM_NO_PET); - - if (p_ptr->pclass == CLASS_BEASTMASTER) - { - type = SUMMON_KAMIKAZE_LIVING; - } - else - { - type = SUMMON_KAMIKAZE; - } - - if (summon_specific((pet ? -1 : 0), y, x, summon_lev, type, mode)) - { - if (!pet) -#ifdef JP -msg_print("¾¤´­¤µ¤ì¤¿¥â¥ó¥¹¥¿¡¼¤ÏÅܤäƤ¤¤ë¡ª"); -#else - msg_print("The summoned creatures get angry!"); -#endif - - no_trump = FALSE; - } - } - break; - } - case 10: /* Phantasmal Servant */ - if (success) - { - if (summon_specific(-1, py, px, (summon_lev * 3) / 2, SUMMON_PHANTOM, PM_FORCE_PET)) - { -#ifdef JP -msg_print("¸æÍѤǤ´¤¶¤¤¤Þ¤¹¤«¡¢¸æ¼ç¿ÍÍÍ¡©"); -#else - msg_print("'Your wish, master?'"); -#endif - - } - else - { - no_trump = TRUE; - } - } - break; - case 11: /* Speed Monster */ - if (success) - { - bool old_target_pet = target_pet; - target_pet = TRUE; - if (!get_aim_dir(&dir)) - { - target_pet = old_target_pet; - return (FALSE); - } - target_pet = old_target_pet; - (void)speed_monster(dir); - } - break; - case 12: /* Teleport Level */ - if (success) - { -#ifdef JP - if (!get_check("ËÜÅö¤Ë¾¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©")) return FALSE; -#else - if (!get_check("Are you sure? (Teleport Level)")) return FALSE; -#endif - (void)teleport_player_level(); - } - break; - case 13: /* Dimension Door */ - if (success) - { -#ifdef JP -msg_print("¼¡¸µ¤ÎÈ⤬³«¤¤¤¿¡£ÌÜŪÃϤòÁª¤ó¤Ç²¼¤µ¤¤¡£"); -#else - msg_print("You open a dimensional gate. Choose a destination."); -#endif - - return dimension_door(); - } - break; - case 14: /* Word of Recall */ - if (success) - { - if (!word_of_recall()) return FALSE; - } - break; - case 15: /* Banish */ - if (success) - { - banish_monsters(plev * 4); - } - break; - case 16: /* Swap Position */ - { - if (success) - { - project_length = -1; - if (!get_aim_dir(&dir)) - { - project_length = 0; - return FALSE; - } - project_length = 0; - - (void)teleport_swap(dir); - } - break; - } - case 17: /* Trump Undead */ - { - bool pet = success; /* (randint1(10) > 3) */ - u32b mode = 0L; - - if (pet) mode |= PM_FORCE_PET; - else mode |= (PM_ALLOW_GROUP | PM_NO_PET); - -#ifdef JP -msg_print("¤¢¤Ê¤¿¤Ï¥¢¥ó¥Ç¥Ã¥É¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë..."); -#else - msg_print("You concentrate on the trump of an undead creature..."); -#endif - - - if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_UNDEAD, mode)) - { - if (!pet) -#ifdef JP -msg_print("¾¤´­¤µ¤ì¤¿¥¢¥ó¥Ç¥Ã¥É¤ÏÅܤäƤ¤¤ë¡ª"); -#else - msg_print("The summoned undead creature gets angry!"); -#endif - - } - else - { - no_trump = TRUE; - } - - break; - } - case 18: /* Trump Reptiles */ - { - bool pet = success; /* was (randint1(5) > 2) */ - u32b mode = 0L; - - if (pet) mode |= PM_FORCE_PET; - else mode |= (PM_ALLOW_GROUP | PM_NO_PET); - -#ifdef JP -msg_print("¤¢¤Ê¤¿¤Ïà¨ÃîÎà¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë..."); -#else - msg_print("You concentrate on the trump of a reptile..."); -#endif - - - if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HYDRA, mode)) - { - if (!pet) -#ifdef JP -msg_print("¾¤´­¤µ¤ì¤¿à¨ÃîÎà¤ÏÅܤäƤ¤¤ë¡ª"); -#else - msg_print("The summoned reptile gets angry!"); -#endif - - } - else - { - no_trump = TRUE; - } - - break; - } - case 19: /* Trump Monsters */ - { - no_trump = TRUE; - -#ifdef JP -msg_print("¤¢¤Ê¤¿¤Ï¥â¥ó¥¹¥¿¡¼¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë..."); -#else - msg_print("You concentrate on several trumps at once..."); -#endif - - - for (dummy = 0; dummy < 1 + ((plev - 15)/ 10); dummy++) - { - bool pet = success; /* was (randint1(10) > 3) */ - int type; - u32b mode = 0L; - - if (pet) mode |= PM_FORCE_PET; - else mode |= (PM_ALLOW_GROUP | PM_NO_PET); - - if (unique_okay) mode |= PM_ALLOW_UNIQUE; - - if (p_ptr->pclass == CLASS_BEASTMASTER) - { - type = SUMMON_LIVING; - } - else - { - type = 0; - } - - if (summon_specific((pet ? -1 : 0), py, px, summon_lev, type, mode)) - { - if (!pet) -#ifdef JP -msg_print("¾¤´­¤µ¤ì¤¿¥â¥ó¥¹¥¿¡¼¤ÏÅܤäƤ¤¤ë¡ª"); -#else - msg_print("The summoned creatures get angry!"); -#endif - - no_trump = FALSE; - } - } - break; - } - case 20: /* Trump Hounds */ - { - bool pet = success; /* was (randint1(5) > 2) */ - u32b mode = PM_ALLOW_GROUP; - - if (pet) mode |= PM_FORCE_PET; - else mode |= PM_NO_PET; - -#ifdef JP -msg_print("¤¢¤Ê¤¿¤Ï¥Ï¥¦¥ó¥É¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë..."); -#else - msg_print("You concentrate on the trump of a hound..."); -#endif - - - if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HOUND, mode)) - { - if (!pet) -#ifdef JP -msg_print("¾¤´­¤µ¤ì¤¿¥Ï¥¦¥ó¥É¤ÏÅܤäƤ¤¤ë¡ª"); -#else - msg_print("The summoned hounds get angry!"); -#endif - - } - else - { - no_trump = TRUE; - } - - break; - } - case 21: /* Trump Branding */ - if (success) - { - brand_weapon(5); - } - break; - case 22: /* Living Trump */ - if (success) - { - if (one_in_(7)) - /* Teleport control */ - dummy = 12; - else - /* Random teleportation (uncontrolled) */ - dummy = 77; - /* Gain the mutation */ - if (gain_random_mutation(dummy)) -#ifdef JP -msg_print("¤¢¤Ê¤¿¤ÏÀ¸¤­¤Æ¤¤¤ë¥«¡¼¥É¤ËÊѤï¤Ã¤¿¡£"); -#else - msg_print("You have turned into a Living Trump."); -#endif - - } - break; - case 23: /* Trump Cyberdemon */ - { - bool pet = success; /* was (randint1(10) > 3) */ - u32b mode = 0L; - - if (pet) mode |= PM_FORCE_PET; - else mode |= PM_NO_PET; - -#ifdef JP -msg_print("¤¢¤Ê¤¿¤Ï¥µ¥¤¥Ð¡¼¥Ç¡¼¥â¥ó¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë..."); -#else - msg_print("You concentrate on the trump of a Cyberdemon..."); -#endif - - - if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_CYBER, mode)) - { - if (!pet) -#ifdef JP -msg_print("¾¤´­¤µ¤ì¤¿¥µ¥¤¥Ð¡¼¥Ç¡¼¥â¥ó¤ÏÅܤäƤ¤¤ë¡ª"); -#else - msg_print("The summoned Cyberdemon gets angry!"); -#endif - - } - else - { - no_trump = TRUE; - } - - break; - } - case 24: /* Trump Divination */ - if (success) - { - (void)detect_all(DETECT_RAD_DEFAULT); - } - break; - case 25: /* Trump Lore */ - if (success) - { - return identify_fully(FALSE); - } - break; - case 26: /* Heal Monster */ - if (success) - { - bool old_target_pet = target_pet; - target_pet = TRUE; - if (!get_aim_dir(&dir)) - { - target_pet = old_target_pet; - return (FALSE); - } - target_pet = old_target_pet; - - (void)heal_monster(dir, p_ptr->lev * 10 + 200); - } - break; - case 27: /* Trump Dragon */ - { - bool pet = success; /* was (randint1(10) > 3) */ - u32b mode = 0L; - - if (pet) mode |= PM_FORCE_PET; - else mode |= (PM_ALLOW_GROUP | PM_NO_PET); - -#ifdef JP -msg_print("¤¢¤Ê¤¿¤Ï¥É¥é¥´¥ó¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë..."); -#else - msg_print("You concentrate on the trump of a dragon..."); -#endif - - - if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_DRAGON, mode)) - { - if (!pet) -#ifdef JP -msg_print("¾¤´­¤µ¤ì¤¿¥É¥é¥´¥ó¤ÏÅܤäƤ¤¤ë¡ª"); -#else - msg_print("The summoned dragon gets angry!"); -#endif - - } - else - { - no_trump = TRUE; - } - - break; - } - case 28: /* Trump Meteor */ - if (success) - { - int x, y, dx, dy, i; - int b = 10 + randint1(10); - for (i = 0; i < b; i++) - { - int count = 0, d = 0; - - while (1) - { - count++; - if (count > 20) break; - x = px - 8 + randint0(17); - y = py - 8 + randint0(17); - - if (!in_bounds(y,x) || (!cave_floor_bold(y,x) && (cave[y][x].feat != FEAT_TREES)) || !player_has_los_bold(y, x)) continue; - - dx = (px > x) ? (px - x) : (x - px); - dy = (py > y) ? (py - y) : (y - py); - - /* Approximate distance */ - d = (dy > dx) ? (dy + (dx >> 1)) : (dx + (dy >> 1)); - if (d < 9) break; - } - - if (count > 20) continue; - - project(0, 2, y, x, plev * 2, GF_METEOR, PROJECT_KILL | PROJECT_JUMP | PROJECT_ITEM, -1); - } - } - break; - case 29: /* Trump Demon */ - { - bool pet = success; /* was (randint1(10) > 3) */ - u32b mode = 0L; - - if (pet) mode |= PM_FORCE_PET; - else mode |= (PM_ALLOW_GROUP | PM_NO_PET); - -#ifdef JP -msg_print("¤¢¤Ê¤¿¤Ï¥Ç¡¼¥â¥ó¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë..."); -#else - msg_print("You concentrate on the trump of a demon..."); -#endif - - - if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_DEMON, mode)) - { - if (!pet) -#ifdef JP -msg_print("¾¤´­¤µ¤ì¤¿¥Ç¡¼¥â¥ó¤ÏÅܤäƤ¤¤ë¡ª"); -#else - msg_print("The summoned demon gets angry!"); -#endif - - } - else - { - no_trump = TRUE; - } - - break; - } - case 30: /* Trump Greater Undead */ - { - bool pet = success; /* was (randint1(10) > 3) */ - u32b mode = 0L; - - if (pet) mode |= PM_FORCE_PET; - else mode |= (PM_ALLOW_GROUP | PM_NO_PET); - - if (unique_okay) mode |= PM_ALLOW_UNIQUE; - -#ifdef JP -msg_print("¤¢¤Ê¤¿¤Ï¶¯ÎϤʥ¢¥ó¥Ç¥Ã¥É¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë..."); -#else - msg_print("You concentrate on the trump of a greater undead being..."); -#endif - - - if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HI_UNDEAD, mode)) - { - if (!pet) -#ifdef JP -msg_print("¾¤´­¤µ¤ì¤¿¾åµé¥¢¥ó¥Ç¥Ã¥É¤ÏÅܤäƤ¤¤ë¡ª"); -#else - msg_print("The summoned greater undead creature gets angry!"); -#endif - - } - else - { - no_trump = TRUE; - } - - break; - } - case 31: /* Trump Ancient Dragon */ - { - bool pet = success; /* was (randint1(10) > 3) */ - int type; - u32b mode = 0L; - - if (pet) mode |= PM_FORCE_PET; - else mode |= (PM_ALLOW_GROUP | PM_NO_PET); - - if (unique_okay) mode |= PM_ALLOW_UNIQUE; - - if (p_ptr->pclass == CLASS_BEASTMASTER) - { - type = SUMMON_HI_DRAGON_LIVING; - } - else - { - type = SUMMON_HI_DRAGON; - } - -#ifdef JP -msg_print("¤¢¤Ê¤¿¤Ï¸ÅÂå¥É¥é¥´¥ó¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë..."); -#else - msg_print("You concentrate on the trump of an ancient dragon..."); -#endif - - - if (summon_specific((pet ? -1 : 0), py, px, summon_lev, type, mode)) - { - if (!pet) -#ifdef JP -msg_print("¾¤´­¤µ¤ì¤¿¸ÅÂå¥É¥é¥´¥ó¤ÏÅܤäƤ¤¤ë¡ª"); -#else - msg_print("The summoned ancient dragon gets angry!"); -#endif - - } - else - { - no_trump = TRUE; - } - - break; - } - default: -#ifdef JP -msg_format("̤ÃΤΥ«¡¼¥É¤Î¼öʸ¤Ç¤¹: %d", spell); -#else - msg_format("You cast an unknown Trump spell: %d.", spell); -#endif - - msg_print(NULL); - } - - if (no_trump) - { -#ifdef JP -msg_print("ï¤â¤¢¤Ê¤¿¤Î¥«¡¼¥É¤Î¸Æ¤ÓÀ¼¤ËÅú¤¨¤Ê¤¤¡£"); -#else - msg_print("Nobody answers to your Trump call."); -#endif - - } - - return TRUE; -} - - -static bool cast_arcane_spell(int spell) -{ - int dir; - int beam; - int plev = p_ptr->lev; - int dummy = 0; - bool no_trump = FALSE; - - if (p_ptr->pclass == CLASS_MAGE) beam = plev; - else if (p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER) beam = plev + 10; - else beam = plev / 2; - - switch (spell) - { - case 0: /* Zap */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_bolt_or_beam(beam - 10, GF_ELEC, dir, - damroll(3 + ((plev - 1) / 5), 3)); - break; - case 1: /* Wizard Lock */ - if (!get_aim_dir(&dir)) return FALSE; - - (void)wizard_lock(dir); - break; - case 2: /* Detect Invisibility */ - (void)detect_monsters_invis(DETECT_RAD_DEFAULT); - break; - case 3: /* Detect Monsters */ - (void)detect_monsters_normal(DETECT_RAD_DEFAULT); - break; - case 4: /* Blink */ - teleport_player(10); - break; - case 5: /* Light Area */ - (void)lite_area(damroll(2, (plev / 2)), (plev / 10) + 1); - break; - case 6: /* Trap & Door Destruction */ - if (!get_aim_dir(&dir)) return FALSE; - - (void)destroy_door(dir); - break; - case 7: /* Cure Light Wounds */ - (void)hp_player(damroll(2, 8)); - (void)set_cut(p_ptr->cut - 10); - break; - case 8: /* Detect Doors & Traps */ - (void)detect_traps(DETECT_RAD_DEFAULT, TRUE); - (void)detect_doors(DETECT_RAD_DEFAULT); - (void)detect_stairs(DETECT_RAD_DEFAULT); - break; - case 9: /* Phlogiston */ - phlogiston(); - break; - case 10: /* Detect Treasure */ - (void)detect_treasure(DETECT_RAD_DEFAULT); - (void)detect_objects_gold(DETECT_RAD_DEFAULT); - break; - case 11: /* Detect Enchantment */ - (void)detect_objects_magic(DETECT_RAD_DEFAULT); - break; - case 12: /* Detect Objects */ - (void)detect_objects_normal(DETECT_RAD_DEFAULT); - break; - case 13: /* Cure Poison */ - (void)set_poisoned(0); - break; - case 14: /* Resist Cold */ - (void)set_oppose_cold(randint1(20) + 20, FALSE); - break; - case 15: /* Resist Fire */ - (void)set_oppose_fire(randint1(20) + 20, FALSE); - break; - case 16: /* Resist Lightning */ - (void)set_oppose_elec(randint1(20) + 20, FALSE); - break; - case 17: /* Resist Acid */ - (void)set_oppose_acid(randint1(20) + 20, FALSE); - break; - case 18: /* Cure Medium Wounds */ - (void)hp_player(damroll(4, 8)); - (void)set_cut((p_ptr->cut / 2) - 50); - break; - case 19: /* Teleport */ - teleport_player(plev * 5); - break; - case 20: /* Identify */ - return ident_spell(FALSE); - case 21: /* Stone to Mud */ - if (!get_aim_dir(&dir)) return FALSE; - - (void)wall_to_mud(dir); - break; - case 22: /* Ray of Light */ - if (!get_aim_dir(&dir)) return FALSE; - -#ifdef JP -msg_print("¸÷Àþ¤¬Êü¤¿¤ì¤¿¡£"); -#else - msg_print("A line of light appears."); -#endif - - (void)lite_line(dir); - break; - case 23: /* Satisfy Hunger */ - (void)set_food(PY_FOOD_MAX - 1); - break; - case 24: /* See Invisible */ - (void)set_tim_invis(randint1(24) + 24, FALSE); - break; - case 25: /* Conjure Elemental */ - if (!summon_specific(-1, py, px, plev, SUMMON_ELEMENTAL, (PM_ALLOW_GROUP | PM_FORCE_PET))) - no_trump = TRUE; - break; - case 26: /* Teleport Level */ -#ifdef JP - if (!get_check("ËÜÅö¤Ë¾¤Î³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©")) return FALSE; -#else - if (!get_check("Are you sure? (Teleport Level)")) return FALSE; -#endif - (void)teleport_player_level(); - break; - case 27: /* Teleport Away */ - if (!get_aim_dir(&dir)) return FALSE; - - (void)fire_beam(GF_AWAY_ALL, dir, plev); - break; - case 28: /* Elemental Ball */ - if (!get_aim_dir(&dir)) return FALSE; - - switch (randint1(4)) - { - case 1: dummy = GF_FIRE;break; - case 2: dummy = GF_ELEC;break; - case 3: dummy = GF_COLD;break; - default: dummy = GF_ACID;break; - } - fire_ball(dummy, dir, 75 + (plev), 2); - break; - case 29: /* Detection */ - (void)detect_all(DETECT_RAD_DEFAULT); - break; - case 30: /* Word of Recall */ - if (!word_of_recall()) return FALSE; - break; - case 31: /* Clairvoyance */ - chg_virtue(V_KNOWLEDGE, 1); - chg_virtue(V_ENLIGHTEN, 1); - wiz_lite(FALSE); - if (!p_ptr->telepathy) - { - (void)set_tim_esp(randint1(30) + 25, FALSE); - } - break; - default: - msg_format("You cast an unknown Arcane spell: %d.", spell); - msg_print(NULL); - } - - if (no_trump) -#ifdef JP -msg_print("¥¨¥ì¥á¥ó¥¿¥ë¤Ï¸½¤ì¤Ê¤«¤Ã¤¿¡£"); -#else - msg_print("No Elementals arrive."); -#endif - - return TRUE; -} - - -static bool cast_enchant_spell(int spell) -{ - int plev = p_ptr->lev; - int dummy = 0; - bool no_trump = FALSE; - - switch (spell) - { - case 0: /* Infravision */ - set_tim_infra(100 + randint1(100), FALSE); - break; - case 1: /* Regeneration */ - set_tim_regen(80 + randint1(80), FALSE); - break; - case 2: /* Satisfy Hunger */ - (void)set_food(PY_FOOD_MAX - 1); - break; - case 3: /* Resist Cold */ - (void)set_oppose_cold(randint1(20) + 20, FALSE); - break; - case 4: /* Resist Fire */ - (void)set_oppose_fire(randint1(20) + 20, FALSE); - break; - case 5: /* Heroism */ - (void)set_hero(randint1(25) + 25, FALSE); - (void)hp_player(10); - (void)set_afraid(0); - break; - case 6: /* Resist Lightning */ - (void)set_oppose_elec(randint1(20) + 20, FALSE); - break; - case 7: /* Resist Acid */ - (void)set_oppose_acid(randint1(20) + 20, FALSE); - break; - case 8: /* See Invisibility */ - (void)set_tim_invis(randint1(24) + 24, FALSE); - break; - case 9: /* Remove Curse */ - if (remove_curse()) - { -#ifdef JP - msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£"); -#else - msg_print("You feel as if someone is watching over you."); -#endif - } - break; - case 10: /* Resist Poison */ - (void)set_oppose_pois(randint1(20) + 20, FALSE); - break; - case 11: /* Berserk */ - (void)set_shero(randint1(25) + 25, FALSE); - (void)hp_player(30); - (void)set_afraid(0); - break; - case 12: /* Self Knowledge */ - (void)self_knowledge(); - break; - case 13: /* Protection from Evil */ - (void)set_protevil(randint1(25) + 3 * p_ptr->lev, FALSE); - break; - case 14: /* Healing */ - set_poisoned(0); - set_stun(0); - set_cut(0); - set_image(0); - break; - case 15: /* Mana Branding */ - return choose_ele_attack(); - break; - case 16: /* Telepathy */ - (void)set_tim_esp(randint1(30) + 25, FALSE); - break; - case 17: /* Stone Skin */ - (void)set_shield(randint1(20) + 30, FALSE); - break; - case 18: /* Resistance */ - (void)set_oppose_acid(randint1(20) + 20, FALSE); - (void)set_oppose_elec(randint1(20) + 20, FALSE); - (void)set_oppose_fire(randint1(20) + 20, FALSE); - (void)set_oppose_cold(randint1(20) + 20, FALSE); - (void)set_oppose_pois(randint1(20) + 20, FALSE); - break; - case 19: /* Haste */ - (void)set_fast(randint1(20 + plev) + plev, FALSE); - break; - case 20: /* Walk through Wall */ - (void)set_kabenuke(randint1(plev/2) + plev/2, FALSE); - break; - case 21: /* Pulish Shield */ - (void)pulish_shield(); - break; - case 22: /* Create Golem */ - if (summon_specific(-1, py, px, plev, SUMMON_GOLEM, PM_FORCE_PET)) - { -#ifdef JP -msg_print("¥´¡¼¥ì¥à¤òºî¤Ã¤¿¡£"); -#else - msg_print("You make a golem."); -#endif - } - else - { - no_trump = TRUE; - } - break; - case 23: /* Magic armor */ - (void)set_magicdef(randint1(20) + 20, FALSE); - break; - case 24: /* Remove Enchantment */ - if (!mundane_spell(TRUE)) return FALSE; - break; - case 25: /* Remove All Curse */ - if (remove_all_curse()) - { -#ifdef JP - msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£"); -#else - msg_print("You feel as if someone is watching over you."); -#endif - } - break; - case 26: /* Total Knowledge */ - return identify_fully(FALSE); - break; - case 27: /* Enchant Weapon */ - return enchant_spell(randint0(4) + 1, randint0(4) + 1, 0); - break; - case 28: /* Enchant Armor */ - return enchant_spell(0, 0, randint0(3) + 2); - break; - case 29: /* Brand Weapon */ - brand_weapon(randint0(18)); - break; - case 30: /* Living Trump */ - if (one_in_(7)) - /* Teleport control */ - dummy = 12; - else - /* Random teleportation (uncontrolled) */ - dummy = 77; - /* Gain the mutation */ - if (gain_random_mutation(dummy)) -#ifdef JP -msg_print("¤¢¤Ê¤¿¤ÏÀ¸¤­¤Æ¤¤¤ë¥«¡¼¥É¤ËÊѤï¤Ã¤¿¡£"); -#else - msg_print("You have turned into a Living Trump."); -#endif - break; - case 31: /* Immune */ - return (choose_ele_immune(13 + randint1(13))); - break; - default: - msg_format("You cast an unknown Craft spell: %d.", spell); - msg_print(NULL); - } - - if (no_trump) -#ifdef JP -msg_print("¤¦¤Þ¤¯¥´¡¼¥ì¥à¤òºî¤ì¤Ê¤«¤Ã¤¿¡£"); -#else - msg_print("No Golems arrive."); -#endif - - return TRUE; -} - - -/* - * An "item_tester_hook" for offer - */ -static bool item_tester_offer(object_type *o_ptr) -{ - /* Flasks of oil are okay */ - if (o_ptr->tval != TV_CORPSE) return (FALSE); - - if (o_ptr->sval != SV_CORPSE) return (FALSE); - - if (strchr("pht", r_info[o_ptr->pval].d_char)) return (TRUE); - - /* Assume not okay */ - return (FALSE); -} - - -static bool cast_daemon_spell(int spell) -{ - int dir, beam; - int plev = p_ptr->lev; - - if (p_ptr->pclass == CLASS_MAGE) beam = plev; - else if (p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER) beam = plev + 10; - else beam = plev / 2; - - switch (spell) - { - case 0: /* Magic Missile */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_bolt_or_beam(beam - 10, GF_MISSILE, dir, - damroll(3 + ((plev - 1) / 5), 4)); - break; - case 1: /* Detect Undead & Demons -> Unlife */ - (void)detect_monsters_nonliving(DETECT_RAD_DEFAULT); - break; - case 2: /* Bless */ - (void)set_blessed(randint1(12) + 12, FALSE); - break; - case 3: /* Resist Fire */ - (void)set_oppose_fire(randint1(20) + 20, FALSE); - break; - case 4: /* Horrify */ - if (!get_aim_dir(&dir)) return FALSE; - - (void)fear_monster(dir, plev); - (void)stun_monster(dir, plev); - break; - case 5: /* Nether Bolt */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_bolt_or_beam(beam, GF_NETHER, dir, - damroll(6 + ((plev - 5) / 4), 8)); - break; - case 6: /* Summon monster, demon */ - if (!summon_specific(-1, py, px, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET))) - { -#ifdef JP -msg_print("¸ÅÂå¤Î»àÎî¤Ï¸½¤ì¤Ê¤«¤Ã¤¿¡£"); -#else - msg_print("No Manes arrive."); -#endif - } - break; - case 7: /* Mini Hellfire */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_ball(GF_HELL_FIRE, dir, - (damroll(3, 6) + plev + - (plev / (((p_ptr->pclass == CLASS_MAGE) || - (p_ptr->pclass == CLASS_HIGH_MAGE) || - (p_ptr->pclass == CLASS_SORCERER)) ? 2 : 4))), - ((plev < 30) ? 2 : 3)); - break; - case 8: /* Enslave Demon */ - if (!get_aim_dir(&dir)) return FALSE; - - (void)control_one_demon(dir, plev); - break; - case 9: /* Vision */ - map_area(DETECT_RAD_MAP); - break; - case 10: /* Resist Nether */ - (void)set_tim_res_nether(randint1(20) + 20, FALSE); - break; - case 11: /* Plasma Bolt */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_bolt_or_beam(beam, GF_PLASMA, dir, - damroll(11 + ((plev - 5) / 4), 8)); - break; - case 12: /* Fire Ball */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_ball(GF_FIRE, dir, plev + 55, 2); - break; - case 13: /* Fire Branding */ - brand_weapon(1); - break; - case 14: /* Nether Ball */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_ball(GF_NETHER, dir, plev*3/2 + 100, plev / 20+2); - break; - case 15: /* Summon monster, demon */ - { - bool pet = !one_in_(3); - u32b mode = 0L; - - if (pet) mode |= PM_FORCE_PET; - else mode |= PM_NO_PET; - if (!(pet && (plev < 50))) mode |= PM_ALLOW_GROUP; - - if (summon_specific((pet ? -1 : 0), py, px, plev*2/3+randint1(plev/2), SUMMON_DEMON, mode)) - { -#ifdef JP -msg_print("ⲫ¤Î°­½­¤¬½¼Ëþ¤·¤¿¡£"); -#else - msg_print("The area fills with a stench of sulphur and brimstone."); -#endif - - - if (pet) -#ifdef JP -msg_print("¡Ö¤´ÍѤǤ´¤¶¤¤¤Þ¤¹¤«¡¢¤´¼ç¿ÍÍÍ¡×"); -#else - msg_print("'What is thy bidding... Master?'"); -#endif - - else -#ifdef JP -msg_print("¡ÖÈܤ·¤­¼Ô¤è¡¢²æ¤ÏÆò¤Î²¼Ëͤˤ¢¤é¤º¡ª ¤ªÁ°¤Îº²¤òĺ¤¯¤¾¡ª¡×"); -#else - msg_print("'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"); -#endif - - } - else - { -#ifdef JP -msg_print("°­Ëâ¤Ï¸½¤ì¤Ê¤«¤Ã¤¿¡£"); -#else - msg_print("No demons arrive."); -#endif - } - break; - } - case 16: /* Telepathy */ - (void)set_tim_esp(randint1(30) + 25, FALSE); - break; - case 17: /* Demoncloak */ - { - int dur=randint1(20) + 20; - - set_oppose_fire(dur, FALSE); - set_oppose_cold(dur, FALSE); - set_tim_sh_fire(dur, FALSE); - set_afraid(0); - break; - } - case 18: /* Rain of Lava */ - fire_ball(GF_FIRE, 0, (55 + plev)*2, 3); - fire_ball_hide(GF_LAVA_FLOW, 0, 2+randint1(2), 3); - break; - case 19: /* Plasma ball */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_ball(GF_PLASMA, dir, plev*3/2 + 80, 2 + plev/40); - break; - case 20: /* Mimic demon */ - (void)set_mimic(10+plev/2 + randint1(10+plev/2), MIMIC_DEMON, FALSE); - break; - case 21: /* Nether Wave == Dispel Good */ - (void)dispel_monsters(randint1(plev * 2)); - (void)dispel_good(randint1(plev * 2)); - break; - case 22: /* */ - if (!get_aim_dir(&dir)) return FALSE; - fire_ball(GF_NEXUS, dir, 100 + plev*2, 4); - break; - case 23: /* Hand Doom */ - if (!get_aim_dir(&dir)) return FALSE; -#ifdef JP -else msg_print("<ÇËÌǤμê>¤òÊü¤Ã¤¿¡ª"); -#else - else msg_print("You invoke the Hand of Doom!"); -#endif - - fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0); - break; - case 24: /* Heroism */ - (void)set_hero(randint1(25) + 25, FALSE); - (void)hp_player(10); - (void)set_afraid(0); - break; - case 25: /* Tim resist time */ - (void)set_tim_res_time(randint1(20)+20, FALSE); - break; - case 26: /* Circle of Madness */ - fire_ball(GF_CHAOS, 0, 50+plev, 3+plev/20); - fire_ball(GF_CONFUSION, 0, 50+plev, 3+plev/20); - fire_ball(GF_CHARM, 0, 20+plev, 3+plev/20); - break; - case 27: /* True Discharge Minion */ - discharge_minion(); - break; - case 28: /* Summon Greater Demon */ - { - int item; - cptr q, s; - int summon_lev; - object_type *o_ptr; - - item_tester_hook = item_tester_offer; -#ifdef JP - q = "¤É¤Î»àÂΤòÊû¤²¤Þ¤¹¤«? "; - s = "Êû¤²¤é¤ì¤ë»àÂΤò»ý¤Ã¤Æ¤¤¤Ê¤¤¡£"; -#else - q = "Sacrifice which corpse? "; - s = "You have nothing to scrifice."; -#endif - if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return FALSE; - - /* Get the item (in the pack) */ - if (item >= 0) - { - o_ptr = &inventory[item]; - } - - /* Get the item (on the floor) */ - else - { - o_ptr = &o_list[0 - item]; - } - - summon_lev = p_ptr->lev * 2 / 3 + r_info[o_ptr->pval].level; - if (summon_specific(-1, py, px, summon_lev, SUMMON_HI_DEMON, (PM_ALLOW_GROUP | PM_FORCE_PET))) - { -#ifdef JP -msg_print("ⲫ¤Î°­½­¤¬½¼Ëþ¤·¤¿¡£"); -#else - msg_print("The area fills with a stench of sulphur and brimstone."); -#endif - - -#ifdef JP -msg_print("¡Ö¤´ÍѤǤ´¤¶¤¤¤Þ¤¹¤«¡¢¤´¼ç¿ÍÍÍ¡×"); -#else - msg_print("'What is thy bidding... Master?'"); -#endif - - /* Decrease the item (from the pack) */ - if (item >= 0) - { - inven_item_increase(item, -1); - inven_item_describe(item); - inven_item_optimize(item); - } - - /* Decrease the item (from the floor) */ - else - { - floor_item_increase(0 - item, -1); - floor_item_describe(0 - item); - floor_item_optimize(0 - item); - } - } - else - { -#ifdef JP -msg_print("°­Ëâ¤Ï¸½¤ì¤Ê¤«¤Ã¤¿¡£"); -#else - msg_print("No Greater Demon arrive."); -#endif - } - break; - } - case 29: /* Nether Storm */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_ball(GF_NETHER, dir, plev*15, plev / 5); - break; - case 30: /* Blood curse */ - { - if (!get_aim_dir(&dir)) return FALSE; - - fire_ball_hide(GF_BLOOD_CURSE, dir, 600, 0); -#ifdef JP -take_hit(DAMAGE_USELIFE, 20 + randint1(30), "·ì¤Î¼ö¤¤", -1); -#else - take_hit(DAMAGE_USELIFE, 20 + randint1(30), "Blood curse", -1); -#endif - break; - } - case 31: /* Mimic Demon lord */ - (void)set_mimic(15 + randint1(15), MIMIC_DEMON_LORD, FALSE); - break; - default: - msg_format("You cast an unknown Daemon spell: %d.", spell); - msg_print(NULL); - } - - return TRUE; -} - - -static bool cast_crusade_spell(int spell) -{ - int dir; - int beam; - int plev = p_ptr->lev; - - if (p_ptr->pclass == CLASS_MAGE) beam = plev; - else if (p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER) beam = plev + 10; - else beam = plev / 2; - - switch (spell) - { - case 0: - if (!get_aim_dir(&dir)) return FALSE; - - fire_bolt_or_beam(beam - 10, GF_ELEC, dir, - damroll(3 + ((plev - 1) / 5), 4)); - break; - case 1: - (void)detect_monsters_evil(DETECT_RAD_DEFAULT); - break; - case 2: /* Remove Fear */ - (void)set_afraid(0); - break; - case 3: - if (!get_aim_dir(&dir)) return FALSE; - - (void)fear_monster(dir, plev); - break; - case 4: - (void)sleep_monsters_touch(); - break; - case 5: - teleport_player(25+plev/2); - break; - case 6: - if (!get_aim_dir(&dir)) return FALSE; - fire_blast(GF_LITE, dir, 3+((plev-1)/9), 2, 10, 3); - break; - case 7: - (void)set_cut(0); - (void)set_poisoned(0); - (void)set_stun(0); - break; - case 8: - if (!get_aim_dir(&dir)) return FALSE; - (void)fire_ball(GF_AWAY_EVIL, dir, MAX_SIGHT*5, 0); - break; - case 9: /* Holy Orb */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_ball(GF_HOLY_FIRE, dir, - (damroll(3, 6) + plev + - (plev / ((p_ptr->pclass == CLASS_PRIEST || - p_ptr->pclass == CLASS_HIGH_MAGE || - p_ptr->pclass == CLASS_SORCERER) ? 2 : 4))), - ((plev < 30) ? 2 : 3)); - - break; - case 10: /* Exorcism */ - (void)dispel_undead(randint1(plev)); - (void)dispel_demons(randint1(plev)); - (void)turn_evil(plev); - break; - case 11: /* Remove Curse */ - if (remove_curse()) - { -#ifdef JP - msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£"); -#else - msg_print("You feel as if someone is watching over you."); -#endif - } - break; - case 12: /* Sense Unseen */ - (void)set_tim_invis(randint1(24) + 24, FALSE); - break; - case 13: /* Protection from Evil */ - (void)set_protevil(randint1(25) + 3 * p_ptr->lev, FALSE); - break; - case 14: - if (!get_aim_dir(&dir)) return FALSE; - (void)fire_bolt(GF_ELEC, dir, plev*5); - break; - case 15: /* Holy Word */ - (void)dispel_evil(randint1(plev * 6)); - (void)hp_player(100); - (void)set_afraid(0); - (void)set_poisoned(0); - (void)set_stun(0); - (void)set_cut(0); - break; - case 16: - if (!get_aim_dir(&dir)) return FALSE; - - (void)destroy_door(dir); - break; - case 17: - if (!get_aim_dir(&dir)) return FALSE; - (void)stasis_evil(dir); - break; - case 18: - set_tim_sh_holy(randint1(20)+20, FALSE); - break; - case 19: /* Dispel Undead + Demons */ - (void)dispel_undead(randint1(plev * 4)); - (void)dispel_demons(randint1(plev * 4)); - break; - case 20: /* Dispel Evil */ - (void)dispel_evil(randint1(plev * 4)); - break; - case 21: - brand_weapon(13); - break; - case 22: /* Star Burst */ - if (!get_aim_dir(&dir)) return FALSE; - - fire_ball(GF_LITE, dir, 100+plev*2, 4); - break; - case 23: /* Summon monster, angel */ - { - bool pet = !one_in_(3); - u32b mode = 0L; - - if (pet) mode |= PM_FORCE_PET; - else mode |= PM_NO_PET; - if (!(pet && (plev < 50))) mode |= PM_ALLOW_GROUP; - - if (summon_specific((pet ? -1 : 0), py, px, (plev * 3) / 2, SUMMON_ANGEL, mode)) - { - if (pet) -#ifdef JP -msg_print("¡Ö¤´ÍѤǤ´¤¶¤¤¤Þ¤¹¤«¡¢¤´¼ç¿ÍÍÍ¡×"); -#else - msg_print("'What is thy bidding... Master?'"); -#endif - - else -#ifdef JP -msg_print("¡Ö²æ¤ÏÆò¤Î²¼Ëͤˤ¢¤é¤º¡ª °­¹Ô¼Ô¤è¡¢²ù¤¤²þ¤á¤è¡ª¡×"); -#else - msg_print("Mortal! Repent of thy impiousness."); -#endif - - } - break; - } - case 24: /* Heroism */ - (void)set_hero(randint1(25) + 25, FALSE); - (void)hp_player(10); - (void)set_afraid(0); - break; - case 25: /* Remove All Curse */ - if (remove_all_curse()) - { -#ifdef JP - msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£"); -#else - msg_print("You feel as if someone is watching over you."); -#endif - } - break; - case 26: /* Banishment */ - if (banish_evil(100)) - { -#ifdef JP -msg_print("¿ÀÀ»¤ÊÎϤ¬¼Ù°­¤òÂǤÁʧ¤Ã¤¿¡ª"); -#else - msg_print("The holy power banishes evil!"); -#endif - - } - break; - case 27: /* Word of Destruction */ - destroy_area(py, px, 13+randint0(5)); - break; - case 28: /* Eye for an Eye */ - set_tim_eyeeye(randint1(10)+10, FALSE); - break; - case 29: - { - int x, y, tx, ty; - int nx, ny; - int dir, i; - int b = 10 + randint1(10); - - if (!get_aim_dir(&dir)) return FALSE; - - /* Use the given direction */ - tx = px + 99 * ddx[dir]; - ty = py + 99 * ddy[dir]; - - /* Hack -- Use an actual "target" */ - if ((dir == 5) && target_okay()) - { - tx = target_col; - ty = target_row; - } - - x = px; - y = py; - - while(1) - { - /* Hack -- Stop at the target */ - if ((y == ty) && (x == tx)) break; - - ny = y; - nx = x; - mmove2(&ny, &nx, py, px, ty, tx); - - /* Stop at maximum range */ - if (MAX_RANGE <= distance(py, px, ny, nx)) break; - - /* Stopped by walls/doors */ - if (!cave_floor_bold(ny, nx)) break; - - /* Stopped by monsters */ - if ((dir != 5) && cave[ny][nx].m_idx != 0) break; - - /* Save the new location */ - x = nx; - y = ny; - } - tx = x; - ty = y; - - for (i = 0; i < b; i++) - { - int count = 20, d = 0; - - while (count--) - { - int dx, dy; - - 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; - } - - if (count < 0) continue; - - /* Cannot penetrate perm walls */ - if (!in_bounds(y,x) || - cave_stop_disintegration(y,x) || - !in_disintegration_range(ty, tx, y, x)) - continue; - - project(0, 2, y, x, plev * 3+25, GF_DISINTEGRATE, PROJECT_JUMP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL, -1); - } - } - break; - case 30: /* Divine Intervention */ - project(0, 1, py, px, plev*11, GF_HOLY_FIRE, PROJECT_KILL, -1); - dispel_monsters(plev * 4); - slow_monsters(); - stun_monsters(plev * 4); - confuse_monsters(plev * 4); - turn_monsters(plev * 4); - stasis_monsters(plev * 4); - (void)hp_player(100); - break; - case 31: - { - int i; - (void)crusade(); - for (i = 0; i < 12; i++) - { - int attempt = 10; - int my, mx; - - while (attempt--) - { - scatter(&my, &mx, py, px, 4, 0); - - /* Require empty grids */ - if (cave_empty_bold2(my, mx)) break; - } - if (attempt < 0) continue; - summon_specific(-1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE)); - } - (void)set_hero(randint1(25) + 25, FALSE); - (void)set_blessed(randint1(25) + 25, FALSE); - (void)set_fast(randint1(20 + plev) + plev, FALSE); - (void)set_protevil(randint1(25) + 25, FALSE); - (void)set_afraid(0); - break; - } - default: -#ifdef JP -msg_format("¤¢¤Ê¤¿¤ÏÉÔÌÀ¤ÊÇ˼٤μöʸ %d ¤ò¾§¤¨¤¿¡£", spell); -#else - msg_format("You cast an unknown crusade spell: %d.", spell); -#endif - - msg_print(NULL); - } - - return TRUE; -} - - - -void stop_singing(void) -{ - if (p_ptr->pclass != CLASS_BARD) return; - - if (p_ptr->magic_num1[1]) - { - p_ptr->magic_num1[1] = 0; - return; - } - if (!p_ptr->magic_num1[0]) return; - - set_action(ACTION_NONE); - - switch(p_ptr->magic_num1[0]) - { - case MUSIC_BLESS: - if (!p_ptr->blessed) -#ifdef JP -msg_print("¹â·é¤Êµ¤Ê¬¤¬¾Ã¤¨¼º¤»¤¿¡£"); -#else - msg_print("The prayer has expired."); -#endif - break; - case MUSIC_HERO: - if (!p_ptr->hero) - { -#ifdef JP -msg_print("¥Ò¡¼¥í¡¼¤Îµ¤Ê¬¤¬¾Ã¤¨¼º¤»¤¿¡£"); -#else - msg_print("The heroism wears off."); -#endif - /* Recalculate hitpoints */ - p_ptr->update |= (PU_HP); - } - break; - case MUSIC_MIND: - if (!p_ptr->tim_esp) - { -#ifdef JP -msg_print("°Õ¼±¤Ï¸µ¤ËÌá¤Ã¤¿¡£"); -#else - msg_print("Your consciousness contracts again."); -#endif - /* Update the monsters */ - p_ptr->update |= (PU_MONSTERS); - } - break; - case MUSIC_STEALTH: - if (!p_ptr->tim_stealth) -#ifdef JP -msg_print("»Ñ¤¬¤Ï¤Ã¤­¤ê¤È¸«¤¨¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¡£"); -#else - msg_print("You are no longer hided."); -#endif - break; - case MUSIC_RESIST: - if (!p_ptr->oppose_acid) -#ifdef JP -msg_print("»À¤Ø¤ÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£"); -#else - msg_print("You feel less resistant to acid."); -#endif - if (!p_ptr->oppose_elec) -#ifdef JP -msg_print("ÅÅ·â¤Ø¤ÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£"); -#else - msg_print("You feel less resistant to elec."); -#endif - if (!p_ptr->oppose_fire) -#ifdef JP -msg_print("²Ð¤Ø¤ÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£"); -#else - msg_print("You feel less resistant to fire."); -#endif - if (!p_ptr->oppose_cold) -#ifdef JP -msg_print("Î䵤¤Ø¤ÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£"); -#else - msg_print("You feel less resistant to cold."); -#endif - if (!p_ptr->oppose_pois) -#ifdef JP -msg_print("ÆǤؤÎÂÑÀ­¤¬Çö¤ì¤¿µ¤¤¬¤¹¤ë¡£"); -#else - msg_print("You feel less resistant to pois."); -#endif - break; - case MUSIC_SPEED: - if (!p_ptr->fast) -#ifdef JP -msg_print("Æ°¤­¤ÎÁÇÁᤵ¤¬¤Ê¤¯¤Ê¤Ã¤¿¤è¤¦¤À¡£"); -#else - msg_print("You feel yourself slow down."); -#endif - break; - case MUSIC_SHERO: - if (!p_ptr->hero) - { -#ifdef JP -msg_print("¥Ò¡¼¥í¡¼¤Îµ¤Ê¬¤¬¾Ã¤¨¼º¤»¤¿¡£"); -#else - msg_print("The heroism wears off."); -#endif - /* Recalculate hitpoints */ - p_ptr->update |= (PU_HP); - } - - if (!p_ptr->fast) -#ifdef JP -msg_print("Æ°¤­¤ÎÁÇÁᤵ¤¬¤Ê¤¯¤Ê¤Ã¤¿¤è¤¦¤À¡£"); -#else - msg_print("You feel yourself slow down."); -#endif - break; - case MUSIC_INVULN: - if (!p_ptr->invuln) - { -#ifdef JP -msg_print("̵Ũ¤Ç¤Ï¤Ê¤¯¤Ê¤Ã¤¿¡£"); -#else - msg_print("The invulnerability wears off."); -#endif - /* Redraw map */ - p_ptr->redraw |= (PR_MAP); - - /* Update monsters */ - p_ptr->update |= (PU_MONSTERS); - - /* Window stuff */ - p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); - } - break; - } - p_ptr->magic_num1[0] = MUSIC_NONE; - p_ptr->magic_num2[0] = 0; - - /* Recalculate bonuses */ - p_ptr->update |= (PU_BONUS | PU_HP); - - /* Redraw status bar */ - p_ptr->redraw |= (PR_STATUS); -} - - -static bool cast_music_spell(int spell) -{ - int plev = p_ptr->lev; - int dir; - - if(p_ptr->magic_num1[0]) - { - stop_singing(); - } - - p_ptr->magic_num2[0] = spell; - - switch (spell) - { - case 0: /* Song of Holding ÃÙÆߤβΠ*/ -#ifdef JP - msg_print("¤æ¤Ã¤¯¤ê¤È¤·¤¿¥á¥í¥Ç¥£¤ò¸ý¤º¤µ¤ß»Ï¤á¤¿¡¥¡¥¡¥"); -#else - msg_print("You start humming a slow, steady melody..."); -#endif - p_ptr->magic_num1[0] = MUSIC_SLOW; - break; - case 1: /* Song of Blessing ½ËÊ¡¤Î²Î */ -#ifdef JP - msg_print("¸·¤«¤Ê¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥"); -#else - msg_print("The holy power of the Music of the Ainur enters you..."); -#endif - p_ptr->magic_num1[0] = MUSIC_BLESS; - break; - - case 2: /* Wrecking Note Êø²õ¤Î²»¿§ */ - if (!get_aim_dir(&dir)) return FALSE; - fire_bolt(GF_SOUND, dir, - damroll(4 + ((plev - 1) / 5), 4)); - break; - case 3: /* Stun Pattern Û¯Û°¤ÎÀûΧ */ -#ifdef JP - msg_print("âÁÏǤµ¤»¤ë¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥"); -#else - msg_print("You weave a pattern of sounds to bewilder and daze..."); -#endif - p_ptr->magic_num1[0] = MUSIC_STUN; - break; - case 4: /* Flow of life À¸Ì¿¤Îή¤ì */ -#ifdef JP - msg_print("²Î¤òÄ̤·¤ÆÂΤ˳赤¤¬Ìá¤Ã¤Æ¤­¤¿¡¥¡¥¡¥"); -#else - msg_print("Life flows through you as you sing a song of healing..."); -#endif - p_ptr->magic_num1[0] = MUSIC_L_LIFE; - break; - case 5: /* Song of the Sun ÂÀÍۤβΠ*/ -#ifdef JP - msg_print("¸÷¤êµ±¤¯²Î¤¬ÊÕ¤ê¤ò¾È¤é¤·¤¿¡£"); -#else - msg_print("Your uplifting song brings brightness to dark places..."); -#endif - (void)lite_area(damroll(2, (plev / 2)), (plev / 10) + 1); - break; - case 6: /* Song of fear ¶²ÉݤβΠ*/ -#ifdef JP - msg_print("¤ª¤É¤í¤ª¤É¤í¤·¤¤¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥"); -#else - msg_print("You start weaving a fearful pattern..."); -#endif - p_ptr->magic_num1[0] = MUSIC_FEAR; - break; - case 7: /* Heroic Ballad À襤¤Î²Î */ -#ifdef JP - msg_print("·ã¤·¤¤À襤¤Î²Î¤ò²Î¤Ã¤¿¡¥¡¥¡¥"); -#else - msg_print("You start singing a song of intense fighting..."); -#endif - p_ptr->magic_num1[0] = MUSIC_HERO; - break; - case 8: /* Clairaudience ÎîŪÃγР*/ -#ifdef JP - msg_print("ÀŤ«¤Ê²»³Ú¤¬´¶³Ð¤ò¸¦¤®À¡¤Þ¤µ¤»¤¿¡¥¡¥¡¥"); -#else - msg_print("Your quiet music sharpens your sense of hearing..."); -#endif - p_ptr->magic_num1[0] = MUSIC_DETECT; - break; - case 9: /* º²¤Î²Î */ -#ifdef JP - msg_print("Àº¿À¤òDZ¤¸¶Ê¤²¤ë²Î¤ò²Î¤Ã¤¿¡¥¡¥¡¥"); -#else - msg_print("You start singing a song of soul in pain..."); -#endif - p_ptr->magic_num1[0] = MUSIC_PSI; - break; - case 10: /* Song of Lore Ãμ±¤Î²Î */ -#ifdef JP - msg_print("¤³¤ÎÀ¤³¦¤ÎÃ챤¬Î®¤ì¹þ¤ó¤Ç¤­¤¿¡¥¡¥¡¥"); -#else - msg_print("You recall the rich lore of the world..."); -#endif - p_ptr->magic_num1[0] = MUSIC_ID; - break; - case 11: /* hidding song ±£ÆۤβΠ*/ -#ifdef JP - msg_print("¤¢¤Ê¤¿¤Î»Ñ¤¬·Ê¿§¤Ë¤È¤±¤³¤ó¤Ç¤¤¤Ã¤¿¡¥¡¥¡¥"); -#else - msg_print("Your song carries you beyond the sight of mortal eyes..."); -#endif - p_ptr->magic_num1[0] = MUSIC_STEALTH; - break; - case 12: /* Illusion Pattern ¸¸±Æ¤ÎÀûΧ */ -#ifdef JP - msg_print("ÊÕ¤ê°ìÌ̤˸¸±Æ¤¬¸½¤ì¤¿¡¥¡¥¡¥"); -#else - msg_print("You weave a pattern of sounds to beguile and confuse..."); -#endif - p_ptr->magic_num1[0] = MUSIC_CONF; - break; - case 13: /* Doomcall (vibration song) ÇËÌǤζ«¤Ó */ -#ifdef JP - msg_print("¹ì²»¤¬¶Á¤¤¤¿¡¥¡¥¡¥"); -#else - msg_print("The fury of the Downfall of Numenor lashes out..."); -#endif - p_ptr->magic_num1[0] = MUSIC_SOUND; - break; - case 14: /* Firiel's Song (song of the Undeads) ¥Õ¥£¥ê¥¨¥ë¤Î²Î */ -#ifdef JP - msg_print("À¸Ì¿¤ÈÉü³è¤Î¥Æ¡¼¥Þ¤òÁդǻϤ᤿¡¥¡¥¡¥"); -#else - msg_print("The themes of life and revival are woven into your song..."); -#endif - animate_dead(0, py, px); - break; - case 15: /* Fellowship Chant (charming song) ι¤ÎÃç´Ö */ -#ifdef JP - msg_print("°Â¤é¤«¤Ê¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥"); -#else - msg_print("You weave a slow, soothing melody of imploration..."); -#endif - p_ptr->magic_num1[0] = MUSIC_CHARM; - break; - case 16: /* (wall breaking song) ʬ²ò²»ÇÈ */ -#ifdef JP - msg_print("Ê´ºÕ¤¹¤ë¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥"); -#else - msg_print("You weave a violent pattern of sounds to break wall."); -#endif - p_ptr->magic_num1[0] = MUSIC_WALL; - project(0, 0, py, px, - 0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1); - break; - case 17: /* Finrod's Resistance (song of resistance) ¸µÁÇÂÑÀ­ */ -#ifdef JP - msg_print("¸µÁǤÎÎϤËÂФ¹¤ëǦÂѤβΤò²Î¤Ã¤¿¡£"); -#else - msg_print("You sing a song of perseverance against powers..."); -#endif - p_ptr->magic_num1[0] = MUSIC_RESIST; - break; - case 18: /* Hobbit Melodies (song of time) ¥Û¥Ó¥Ã¥È¤Î¥á¥í¥Ç¥£ */ -#ifdef JP - msg_print("·Ú²÷¤Ê²Î¤ò¸ý¤º¤µ¤ß»Ï¤á¤¿¡¥¡¥¡¥"); -#else - msg_print("You start singing joyful pop song..."); -#endif - p_ptr->magic_num1[0] = MUSIC_SPEED; - break; - case 19: /* World Contortion ÏĤó¤ÀÀ¤³¦ */ -#ifdef JP - msg_print("²Î¤¬¶õ´Ö¤òÏĤ᤿¡¥¡¥¡¥"); -#else - msg_print("Reality whirls wildly as you sing a dizzying melody..."); -#endif - project(0, plev/15 + 1, py, px, plev * 3 + 1, GF_AWAY_ALL , PROJECT_KILL, -1); - break; - case 20: /* Â໶¤Î²Î */ -#ifdef JP - msg_print("ÂѤ¨¤é¤ì¤Ê¤¤ÉÔ¶¨Ï²»¤¬Å¨¤òÀÕ¤áΩ¤Æ¤¿¡¥¡¥¡¥"); -#else - msg_print("You cry out in an ear-wracking voice..."); -#endif - p_ptr->magic_num1[0] = MUSIC_DISPEL; - break; - case 21: /* The Voice of Saruman ¥µ¥ë¥Þ¥ó¤Î´Å¸À */ -#ifdef JP - msg_print("Í¥¤·¤¯¡¢Ì¥ÎÏŪ¤Ê²Î¤ò¸ý¤º¤µ¤ß»Ï¤á¤¿¡¥¡¥¡¥"); -#else - msg_print("You start humming a gentle and attractive song..."); -#endif - p_ptr->magic_num1[0] = MUSIC_SARUMAN; - break; - case 22: /* Song of Tempest (song of death) Íò¤Î²»¿§ */ - if (!get_aim_dir(&dir)) return FALSE; - fire_beam(GF_SOUND, dir, - damroll(15 + ((plev - 1) / 2), 10)); - break; - case 23: /* (song of disruption) ¤â¤¦°ì¤Ä¤ÎÀ¤³¦ */ -#ifdef JP - msg_print("¼þ°Ï¤¬ÊѲ½¤·»Ï¤á¤¿¡¥¡¥¡¥"); -#else - msg_print("You sing of the primeval shaping of Middle-earth..."); -#endif - alter_reality(); - break; - case 24: /* Wrecking Pattern (destruction shriek) Ç˲õ¤ÎÀûΧ */ -#ifdef JP - msg_print("Ç˲õŪ¤Ê²Î¤¬¶Á¤­¤ï¤¿¤Ã¤¿¡¥¡¥¡¥"); -#else - msg_print("You weave a pattern of sounds to contort and shatter..."); -#endif - p_ptr->magic_num1[0] = MUSIC_QUAKE; - break; - case 25: /* ÄäÂڤβΠ*/ -#ifdef JP - msg_print("¤æ¤Ã¤¯¤ê¤È¤·¤¿¥á¥í¥Ç¥£¤òÁդǻϤ᤿¡¥¡¥¡¥"); -#else - msg_print("You weave a very slow pattern which is almost likely to stop..."); -#endif - p_ptr->magic_num1[0] = MUSIC_STASIS; - break; - case 26: /* ¼é¤ê¤Î²Î */ -#ifdef JP - msg_print("²Î¤¬¿ÀÀ»¤Ê¾ì¤òºî¤ê½Ð¤·¤¿¡¥¡¥¡¥"); -#else - msg_print("The holy power of the Music is creating sacred field..."); -#endif - warding_glyph(); - break; - case 27: /* ±Ñͺ¤Î»í */ -#ifdef JP - msg_print("±Ñͺ¤Î²Î¤ò¸ý¤º¤µ¤ó¤À¡¥¡¥¡¥"); -#else - msg_print("You chant a powerful, heroic call to arms..."); -#endif - p_ptr->magic_num1[0] = MUSIC_SHERO; - (void)hp_player(10); - (void)set_afraid(0); - break; - case 28: /* ¥ä¥ô¥¡¥ó¥Ê¤Î½õ¤± */ -#ifdef JP - msg_print("²Î¤òÄ̤·¤ÆÂΤ˳赤¤¬Ìá¤Ã¤Æ¤­¤¿¡¥¡¥¡¥"); -#else - msg_print("Life flows through you as you sing the song..."); -#endif - p_ptr->magic_num1[0] = MUSIC_H_LIFE; - break; - case 29: /* ºÆÀ¸¤Î²Î */ -#ifdef JP - msg_print("°Å¹õ¤ÎÃæ¤Ë¸÷¤ÈÈþ¤ò¤Õ¤ê¤Þ¤¤¤¿¡£ÂΤ¬¸µ¤Î³èÎϤò¼è¤êÌᤷ¤¿¡£"); -#else - msg_print("You strewed light and beauty in the dark as you sing. You feel refreshed."); -#endif - (void)do_res_stat(A_STR); - (void)do_res_stat(A_INT); - (void)do_res_stat(A_WIS); - (void)do_res_stat(A_DEX); - (void)do_res_stat(A_CON); - (void)do_res_stat(A_CHR); - (void)restore_level(); - break; - case 30: /* shriek of death ¥µ¥¦¥í¥ó¤ÎËâ½Ñ */ - if (!get_aim_dir(&dir)) return FALSE; - fire_ball(GF_SOUND, dir, damroll(50 + plev, 10), 0); - break; - case 31: /* song of liberty ¥Õ¥£¥ó¥´¥ë¥Õ¥£¥ó¤ÎÄ©Àï */ -#ifdef JP - msg_print("¥Õ¥£¥ó¥´¥ë¥Õ¥£¥ó¤Î̽²¦¤Ø¤ÎÄ©Àï¤ò²Î¤Ã¤¿¡¥¡¥¡¥"); -#else - msg_print("You recall the valor of Fingolfin's challenge to the Dark Lord..."); -#endif - p_ptr->magic_num1[0] = MUSIC_INVULN; - - /* Redraw map */ - p_ptr->redraw |= (PR_MAP); - - /* Update monsters */ - p_ptr->update |= (PU_MONSTERS); - - /* Window stuff */ - p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); - break; - default: -#ifdef JP - msg_format("̤ÃΤβÎ(%d)¤ò²Î¤Ã¤¿¡£", spell); -#else - msg_format("You sing an unknown song: %d.", spell); -#endif - msg_print(NULL); - } - - if (p_ptr->magic_num1[0]) set_action(ACTION_SING); - - /* Recalculate bonuses */ - p_ptr->update |= (PU_BONUS | PU_HP); - - /* Redraw status bar */ - p_ptr->redraw |= (PR_STATUS); - return TRUE; -} - - -/* - * Cast a spell - */ -void do_cmd_cast(void) -{ - int item, sval, spell, realm; - int chance; - int increment = 0; - int use_realm; - int need_mana; - bool cast; - - cptr prayer; - - object_type *o_ptr; - - magic_type *s_ptr; - - cptr q, s; - - /* Require spell ability */ - if (!p_ptr->realm1 && (p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) - { -#ifdef JP -msg_print("¼öʸ¤ò¾§¤¨¤é¤ì¤Ê¤¤¡ª"); -#else - msg_print("You cannot cast spells!"); -#endif - - return; - } - - /* Require lite */ - if (p_ptr->blind || no_lite()) - { -#ifdef JP -msg_print("Ìܤ¬¸«¤¨¤Ê¤¤¡ª"); -#else - msg_print("You cannot see!"); -#endif - if (p_ptr->pclass == CLASS_FORCETRAINER) - do_cmd_mind(); - else - flush(); - return; - } + /* Require lite */ + if (p_ptr->blind || no_lite()) + { + if (p_ptr->pclass == CLASS_FORCETRAINER) confirm_use_force(FALSE); + else + { + msg_print(_("目が見えない!", "You cannot see!")); + flush(); + } + return; + } /* Not when confused */ if (p_ptr->confused) { -#ifdef JP -msg_print("º®Í𤷤Ƥ¤¤Æ¾§¤¨¤é¤ì¤Ê¤¤¡ª"); -#else - msg_print("You are too confused!"); -#endif + msg_print(_("混乱していて唱えられない!", "You are too confused!")); flush(); return; } - prayer = spell_categoly_name(mp_ptr->spell_book); + /* Hex */ + if (p_ptr->realm1 == REALM_HEX) + { + if (hex_spell_fully()) + { + bool flag = FALSE; + msg_print(_("これ以上新しい呪文を詠唱することはできない。", "Can not spell new spells more.")); + flush(); + if (p_ptr->lev >= 35) flag = stop_hex_spell(); + if (!flag) return; + } + } + + if (p_ptr->pclass == CLASS_FORCETRAINER) + { + if (player_has_no_spellbooks()) + { + confirm_use_force(FALSE); + return; + } + select_the_force = TRUE; + } + + prayer = spell_category_name(mp_ptr->spell_book); /* Restrict choices to spell books */ item_tester_tval = mp_ptr->spell_book; /* Get an item */ -#ifdef JP -q = "¤É¤Î¼öʸ½ñ¤ò»È¤¤¤Þ¤¹¤«? "; -#else - q = "Use which book? "; -#endif - -#ifdef JP -s = "¼öʸ½ñ¤¬¤Ê¤¤¡ª"; -#else - s = "You have no spell books!"; -#endif + q = _("どの呪文書を使いますか? ", "Use which book? "); + s = _("呪文書がない!", "You have no spell books!"); - if (p_ptr->pclass == CLASS_FORCETRAINER) - select_the_force = TRUE; - if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))){ - select_the_force = FALSE; - return; + if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) + { + select_the_force = FALSE; + return; } select_the_force = FALSE; - if (item == INVEN_FORCE) { /* the_force */ - do_cmd_mind(); - return; - } else + if (item == INVEN_FORCE) /* the_force */ + { + do_cmd_mind(); + return; + } + /* Get the item (in the pack) */ - if (item >= 0) + else if (item >= 0) { o_ptr = &inventory[item]; } @@ -4816,10 +1171,10 @@ s = " /* Ask for a spell */ #ifdef JP if (!get_spell(&spell, - ((mp_ptr->spell_book == TV_LIFE_BOOK) ? "±Ó¾§¤¹¤ë" : (mp_ptr->spell_book == TV_MUSIC_BOOK) ? "²Î¤¦" : "¾§¤¨¤ë"), + ((mp_ptr->spell_book == TV_LIFE_BOOK) ? "詠唱する" : (mp_ptr->spell_book == TV_MUSIC_BOOK) ? "歌う" : "唱える"), sval, TRUE, realm)) { - if (spell == -2) msg_format("¤½¤ÎËܤˤÏÃΤäƤ¤¤ë%s¤¬¤Ê¤¤¡£", prayer); + if (spell == -2) msg_format("その本には知っている%sがない。", prayer); return; } #else @@ -4835,6 +1190,16 @@ s = " use_realm = tval2realm(o_ptr->tval); + /* Hex */ + if (use_realm == REALM_HEX) + { + if (hex_spelling(spell)) + { + msg_print(_("その呪文はすでに詠唱中だ。", "You are already casting it.")); + return; + } + } + if (!is_magic(use_realm)) { s_ptr = &technic_info[use_realm - MIN_TECHNIC][spell]; @@ -4854,8 +1219,8 @@ s = " /* Warning */ #ifdef JP -msg_format("¤½¤Î%s¤ò%s¤Î¤Ë½½Ê¬¤Ê¥Þ¥¸¥Ã¥¯¥Ý¥¤¥ó¥È¤¬¤Ê¤¤¡£",prayer, -((mp_ptr->spell_book == TV_LIFE_BOOK) ? "±Ó¾§¤¹¤ë" : (mp_ptr->spell_book == TV_LIFE_BOOK) ? "²Î¤¦" : "¾§¤¨¤ë")); +msg_format("その%sを%sのに十分なマジックポイントがない。",prayer, + ((mp_ptr->spell_book == TV_LIFE_BOOK) ? "詠唱する" : (mp_ptr->spell_book == TV_LIFE_BOOK) ? "歌う" : "唱える")); #else msg_format("You do not have enough mana to %s this %s.", ((mp_ptr->spell_book == TV_LIFE_BOOK) ? "recite" : "cast"), @@ -4866,29 +1231,29 @@ msg_format(" if (!over_exert) return; /* Verify */ -#ifdef JP - if (!get_check_strict("¤½¤ì¤Ç¤âÄ©À路¤Þ¤¹¤«? ", CHECK_OKAY_CANCEL)) return; -#else - if (!get_check_strict("Attempt it anyway? ", CHECK_OKAY_CANCEL)) return; -#endif - + if (!get_check_strict(_("それでも挑戦しますか? ", "Attempt it anyway? "), CHECK_OKAY_CANCEL)) return; } - /* Spell failure chance */ chance = spell_chance(spell, use_realm); + /* Sufficient mana */ + if (need_mana <= p_ptr->csp) + { + /* Use some mana */ + p_ptr->csp -= need_mana; + } + else over_exerted = TRUE; + + /* Redraw mana */ + p_ptr->redraw |= (PR_MANA); + /* Failed spell */ if (randint0(100) < chance) { if (flush_failure) flush(); - -#ifdef JP -msg_format("%s¤ò¤¦¤Þ¤¯¾§¤¨¤é¤ì¤Ê¤«¤Ã¤¿¡ª", prayer); -#else - msg_format("You failed to get the %s off!", prayer); -#endif - + + msg_format(_("%sをうまく唱えられなかった!", "You failed to get the %s off!"), prayer); sound(SOUND_FAIL); switch (realm) @@ -4908,23 +1273,21 @@ msg_format("%s case REALM_CRUSADE: if (randint1(100) < chance) chg_virtue(V_JUSTICE, -1); break; + case REALM_HEX: + if (randint1(100) < chance) chg_virtue(V_COMPASSION, -1); + break; default: if (randint1(100) < chance) chg_virtue(V_KNOWLEDGE, -1); break; } - if (realm == REALM_TRUMP) - { - cast_trump_spell(spell, FALSE); - } - else if ((o_ptr->tval == TV_CHAOS_BOOK) && (randint1(100) < spell)) - { -#ifdef JP -msg_print("¥«¥ª¥¹Åª¤Ê¸ú²Ì¤òȯÀ¸¤·¤¿¡ª"); -#else - msg_print("You produce a chaotic effect!"); -#endif + /* Failure casting may activate some side effect */ + do_spell(realm, spell, SPELL_FAIL); + + if ((o_ptr->tval == TV_CHAOS_BOOK) && (randint1(100) < spell)) + { + msg_print(_("カオス的な効果を発生した!", "You produce a chaotic effect!")); wild_magic(spell); } else if ((o_ptr->tval == TV_DEATH_BOOK) && (randint1(100) < spell)) @@ -4935,30 +1298,16 @@ msg_print(" } else { -#ifdef JP - msg_print("Äˤ¤¡ª"); -#else - msg_print("It hurts!"); -#endif + msg_print(_("痛い!", "It hurts!")); + take_hit(DAMAGE_LOSELIFE, damroll(o_ptr->sval + 1, 6), _("暗黒魔法の逆流", "a miscast Death spell"), -1); -#ifdef JP - take_hit(DAMAGE_LOSELIFE, damroll(o_ptr->sval + 1, 6), "°Å¹õËâË¡¤ÎµÕή", -1); -#else - take_hit(DAMAGE_LOSELIFE, damroll(o_ptr->sval + 1, 6), "a miscast Death spell", -1); -#endif - - if ((spell > 15) && one_in_(6) && !p_ptr->hold_life) + if ((spell > 15) && one_in_(6) && !p_ptr->hold_exp) lose_exp(spell * 250); } } else if ((o_ptr->tval == TV_MUSIC_BOOK) && (randint1(200) < spell)) { -#ifdef JP -msg_print("¤¤¤ä¤Ê²»¤¬¶Á¤¤¤¿"); -#else -msg_print("An infernal sound echoed."); -#endif - + msg_print(_("いやな音が響いた", "An infernal sound echoed.")); aggravate_monsters(0); } if (randint1(100) >= chance) @@ -4968,50 +1317,8 @@ msg_print("An infernal sound echoed."); /* Process spell */ else { - /* Spells. */ - switch (realm) - { - case REALM_LIFE: /* * LIFE * */ - cast = cast_life_spell(spell); - break; - case REALM_SORCERY: /* * SORCERY * */ - cast = cast_sorcery_spell(spell); - break; - case REALM_NATURE: /* * NATURE * */ - cast = cast_nature_spell(spell); - break; - case REALM_CHAOS: /* * CHAOS * */ - cast = cast_chaos_spell(spell); - break; - case REALM_DEATH: /* * DEATH * */ - cast = cast_death_spell(spell); - break; - case REALM_TRUMP: /* TRUMP */ - cast = cast_trump_spell(spell, TRUE); - break; - case REALM_ARCANE: /* ARCANE */ - cast = cast_arcane_spell(spell); - break; - case REALM_ENCHANT: /* ENCHANT */ - cast = cast_enchant_spell(spell); - break; - case REALM_DAEMON: /* DAEMON */ - cast = cast_daemon_spell(spell); - break; - case REALM_CRUSADE: /* CRUSADE */ - cast = cast_crusade_spell(spell); - break; - case REALM_MUSIC: /* MUSIC */ - cast = cast_music_spell(spell); - break; - default: - cast = FALSE; - msg_format("You cast a spell from an unknown realm: realm %d, spell %d.", realm, spell); - msg_print(NULL); - } - /* Canceled spells cost neither a turn nor mana */ - if (!cast) return; + if (!do_spell(realm, spell, SPELL_CAST)) return; if (randint1(100) < chance) chg_virtue(V_CHANCE,1); @@ -5071,6 +1378,12 @@ msg_print("An infernal sound echoed."); chg_virtue(V_NATURE, 1); chg_virtue(V_HARMONY, 1); break; + case REALM_HEX: + chg_virtue(V_JUSTICE, -1); + chg_virtue(V_FAITH, -1); + chg_virtue(V_HONOUR, -1); + chg_virtue(V_COMPASSION, -1); + break; default: chg_virtue(V_KNOWLEDGE, 1); break; @@ -5106,45 +1419,45 @@ msg_print("An infernal sound echoed."); if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_NATURE, 1); if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_HARMONY, 1); break; + case REALM_HEX: + if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_JUSTICE, -1); + if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_FAITH, -1); + if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_HONOUR, -1); + if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_COMPASSION, -1); + break; } if (mp_ptr->spell_xtra & MAGIC_GAIN_EXP) { s16b cur_exp = p_ptr->spell_exp[(increment ? 32 : 0)+spell]; s16b exp_gain = 0; - if (cur_exp < 900) - exp_gain+=60; - else if(cur_exp < 1200) + if (cur_exp < SPELL_EXP_BEGINNER) + exp_gain += 60; + else if (cur_exp < SPELL_EXP_SKILLED) { if ((dun_level > 4) && ((dun_level + 10) > p_ptr->lev)) exp_gain = 8; } - else if(cur_exp < 1400) + else if (cur_exp < SPELL_EXP_EXPERT) { if (((dun_level + 5) > p_ptr->lev) && ((dun_level + 5) > s_ptr->slevel)) exp_gain = 2; } - else if((cur_exp < 1600) && !increment) + else if ((cur_exp < SPELL_EXP_MASTER) && !increment) { if (((dun_level + 5) > p_ptr->lev) && (dun_level > s_ptr->slevel)) exp_gain = 1; } - p_ptr->spell_exp[(increment ? 32 : 0)+spell] += exp_gain; + p_ptr->spell_exp[(increment ? 32 : 0) + spell] += exp_gain; } } /* Take a turn */ - energy_use = 100; + p_ptr->energy_use = 100; - /* Sufficient mana */ - if (need_mana <= p_ptr->csp) - { - /* Use some mana */ - p_ptr->csp -= need_mana; - } /* Over-exert the player */ - else + if(over_exerted) { int oops = need_mana; @@ -5153,12 +1466,7 @@ msg_print("An infernal sound echoed."); p_ptr->csp_frac = 0; /* Message */ -#ifdef JP -msg_print("Àº¿À¤ò½¸Ã椷¤¹¤®¤Æµ¤¤ò¼º¤Ã¤Æ¤·¤Þ¤Ã¤¿¡ª"); -#else - msg_print("You faint from the effort!"); -#endif - + msg_print(_("精神を集中しすぎて気を失ってしまった!", "You faint from the effort!")); /* Hack -- Bypass free action */ (void)set_paralyzed(p_ptr->paralyzed + randint1(5 * oops + 1)); @@ -5180,6 +1488,9 @@ msg_print(" case REALM_CRUSADE: chg_virtue(V_JUSTICE, -10); break; + case REALM_HEX: + chg_virtue(V_COMPASSION, 10); + break; default: chg_virtue(V_KNOWLEDGE, -10); break; @@ -5191,35 +1502,26 @@ msg_print(" bool perm = (randint0(100) < 25); /* Message */ -#ifdef JP -msg_print("ÂΤò°­¤¯¤·¤Æ¤·¤Þ¤Ã¤¿¡ª"); -#else - msg_print("You have damaged your health!"); -#endif - + msg_print(_("体を悪くしてしまった!", "You have damaged your health!")); /* Reduce constitution */ (void)dec_stat(A_CON, 15 + randint1(10), perm); } } - /* Redraw mana */ - p_ptr->redraw |= (PR_MANA); - /* Window stuff */ p_ptr->window |= (PW_PLAYER); p_ptr->window |= (PW_SPELL); } - -/* - * Pray a prayer -- Unused in Hengband +/*! + * @brief ペットになっているモンスターをソートするための比較処理 + * @param u モンスターの構造体配列 + * @param v 未使用 + * @param a 比較対象のモンスターID1 + * @param b 比較対象のモンスターID2 + * @return 2番目が大ならばTRUEを返す */ -void do_cmd_pray(void) -{ - msg_print("Praying is not used in Hengband. Use magic spell casting instead."); -} - static bool ang_sort_comp_pet_dismiss(vptr u, vptr v, int a, int b) { u16b *who = (u16b*)(u); @@ -5241,6 +1543,9 @@ static bool ang_sort_comp_pet_dismiss(vptr u, vptr v, int a, int b) if (m_ptr1->nickname && !m_ptr2->nickname) return TRUE; if (m_ptr2->nickname && !m_ptr1->nickname) return FALSE; + if (!m_ptr1->parent_m_idx && m_ptr2->parent_m_idx) return TRUE; + if (!m_ptr2->parent_m_idx && m_ptr1->parent_m_idx) return FALSE; + if ((r_ptr1->flags1 & RF1_UNIQUE) && !(r_ptr2->flags1 & RF1_UNIQUE)) return TRUE; if ((r_ptr2->flags1 & RF1_UNIQUE) && !(r_ptr1->flags1 & RF1_UNIQUE)) return FALSE; @@ -5253,14 +1558,45 @@ static bool ang_sort_comp_pet_dismiss(vptr u, vptr v, int a, int b) return w1 <= w2; } +/*! + * @brief ペットの善悪属性に応じた維持コストの途中計算処理 + * @param m_ptr 計算基準となるモンスターの構造体参照ポインタ + * @param inc m_ptrで指定したモンスターを維持コスト計算に加えるならTRUE、外すならFALSEを指定 + * @return なし + */ +void check_pets_num_and_align(monster_type *m_ptr, bool inc) +{ + s32b old_friend_align = friend_align; + monster_race *r_ptr = &r_info[m_ptr->r_idx]; + + if (inc) + { + total_friends++; + if (r_ptr->flags3 & RF3_GOOD) friend_align += r_ptr->level; + if (r_ptr->flags3 & RF3_EVIL) friend_align -= r_ptr->level; + } + else + { + total_friends--; + if (r_ptr->flags3 & RF3_GOOD) friend_align -= r_ptr->level; + if (r_ptr->flags3 & RF3_EVIL) friend_align += r_ptr->level; + } + + if (old_friend_align != friend_align) p_ptr->update |= (PU_BONUS); +} + +/*! + * @brief ペットの維持コスト計算 + * @return 維持コスト(%) + */ int calculate_upkeep(void) { s32b old_friend_align = friend_align; int m_idx; bool have_a_unique = FALSE; + s32b total_friend_levels = 0; total_friends = 0; - total_friend_levels = 0; friend_align = 0; for (m_idx = m_max - 1; m_idx >=1; m_idx--) @@ -5292,16 +1628,10 @@ int calculate_upkeep(void) } else total_friend_levels += r_ptr->level; - + /* Determine pet alignment */ - if (r_ptr->flags3 & RF3_GOOD) - { - friend_align += r_ptr->level; - } - else if (r_ptr->flags3 & RF3_EVIL) - { - friend_align -= r_ptr->level; - } + if (r_ptr->flags3 & RF3_GOOD) friend_align += r_ptr->level; + if (r_ptr->flags3 & RF3_EVIL) friend_align -= r_ptr->level; } } if (old_friend_align != friend_align) p_ptr->update |= (PU_BONUS); @@ -5317,6 +1647,10 @@ int calculate_upkeep(void) return 0; } +/*! + * @brief ペットを開放するコマンドのメインルーチン + * @return なし + */ void do_cmd_pet_dismiss(void) { monster_type *m_ptr; @@ -5355,7 +1689,6 @@ void do_cmd_pet_dismiss(void) { bool delete_this; char friend_name[80]; - char buf[80]; bool kakunin; /* Access the monster */ @@ -5364,26 +1697,21 @@ void do_cmd_pet_dismiss(void) delete_this = FALSE; kakunin = ((pet_ctr == p_ptr->riding) || (m_ptr->nickname)); - monster_desc(friend_name, m_ptr, 0x80); - + monster_desc(friend_name, m_ptr, MD_ASSUME_VISIBLE); + if (!all_pets) { /* Hack -- health bar for this monster */ health_track(pet_ctr); - + /* Hack -- handle stuff */ handle_stuff(); -#ifdef JP - sprintf(buf, "%s¤òÊü¤·¤Þ¤¹¤«¡© [Yes/No/Unnamed (%dɤ)]", friend_name, max_pet-i); -#else - sprintf(buf, "Dismiss %s? [Yes/No/Unnamed (%d remain)]", friend_name, max_pet-i); -#endif - prt(buf, 0, 0); + msg_format(_("%sを放しますか? [Yes/No/Unnamed (%d体)]","Dismiss %s? [Yes/No/Unnamed (%d remain)]"), friend_name, max_pet - i); if (m_ptr->ml) move_cursor_relative(m_ptr->fy, m_ptr->fx); - + while (TRUE) { char ch = inkey(); @@ -5391,65 +1719,53 @@ void do_cmd_pet_dismiss(void) if (ch == 'Y' || ch == 'y') { delete_this = TRUE; - + if (kakunin) { -#ifdef JP - sprintf(buf, "ËÜÅö¤Ë¤è¤í¤·¤¤¤Ç¤¹¤«¡© (%s) ", friend_name); -#else - sprintf(buf, "Are you sure? (%s) ", friend_name); -#endif - if (!get_check(buf)) + msg_format(_("本当によろしいですか? (%s) ","Are you sure? (%s) "), friend_name); + ch = inkey(); + if (ch != 'Y' && ch != 'y') delete_this = FALSE; } break; } - + if (ch == 'U' || ch == 'u') { all_pets = TRUE; break; } - + if (ch == ESCAPE || ch == 'N' || ch == 'n') break; - + bell(); } } - + if ((all_pets && !kakunin) || (!all_pets && delete_this)) { if (record_named_pet && m_ptr->nickname) { char m_name[80]; - - monster_desc(m_name, m_ptr, 0x08); - do_cmd_write_nikki(NIKKI_NAMED_PET, 2, m_name); + + monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE); + do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_DISMISS, m_name); } - + if (pet_ctr == p_ptr->riding) { -#ifdef JP - msg_format("%s¤«¤é¹ß¤ê¤¿¡£", friend_name); -#else - msg_format("You have got off %s. ", friend_name); -#endif - + msg_format(_("%sから降りた。","You have got off %s. "), friend_name); + p_ptr->riding = 0; - + /* Update the monsters */ p_ptr->update |= (PU_BONUS | PU_MONSTERS); - p_ptr->redraw |= (PR_EXTRA); + p_ptr->redraw |= (PR_EXTRA | PR_UHEALTH); } /* HACK : Add the line to message buffer */ -#ifdef JP - sprintf(buf, "%s ¤òÊü¤·¤¿¡£", friend_name); -#else - sprintf(buf, "Dismissed %s.", friend_name); -#endif - message_add(buf); + msg_format(_("%s を放した。","Dismissed %s."), friend_name); p_ptr->window |= (PW_MESSAGE); window_stuff(); @@ -5457,7 +1773,7 @@ void do_cmd_pet_dismiss(void) Dismissed++; } } - + Term->scr->cu = cu; Term->scr->cv = cv; Term_fresh(); @@ -5465,21 +1781,64 @@ void do_cmd_pet_dismiss(void) C_KILL(who, max_m_idx, u16b); #ifdef JP - msg_format("%d ɤ¤Î¥Ú¥Ã¥È¤òÊü¤·¤Þ¤·¤¿¡£", Dismissed); + msg_format("%d 体のペットを放しました。", Dismissed); #else msg_format("You have dismissed %d pet%s.", Dismissed, (Dismissed == 1 ? "" : "s")); #endif if (Dismissed == 0 && all_pets) -#ifdef JP - msg_print("'U'nnamed ¤Ï¡¢¾èÇϰʳ°¤Î̾Á°¤Î¤Ê¤¤¥Ú¥Ã¥È¤À¤±¤òÁ´¤Æ²òÊü¤·¤Þ¤¹¡£"); -#else - msg_print("'U'nnamed means all your pets except named pets and your mount."); -#endif + msg_print(_("'U'nnamed は、乗馬以外の名前のないペットだけを全て解放します。", "'U'nnamed means all your pets except named pets and your mount.")); +} + +/*! + * @brief プレイヤーの騎乗/下馬処理判定 + * @param c_ptr プレイヤーの移動先マスの構造体参照ポインタ + * @param now_riding TRUEなら下馬処理、FALSEならば騎乗処理 + * @return 可能ならばTRUEを返す + */ +static bool player_can_ride_aux(cave_type *c_ptr, bool now_riding) +{ + bool p_can_enter; + bool old_character_xtra = character_xtra; + int old_riding = p_ptr->riding; + bool old_riding_ryoute = p_ptr->riding_ryoute; + bool old_old_riding_ryoute = p_ptr->old_riding_ryoute; + bool old_pf_ryoute = (p_ptr->pet_extra_flags & PF_RYOUTE) ? TRUE : FALSE; + + /* Hack -- prevent "icky" message */ + character_xtra = TRUE; + + if (now_riding) p_ptr->riding = c_ptr->m_idx; + else + { + p_ptr->riding = 0; + p_ptr->pet_extra_flags &= ~(PF_RYOUTE); + p_ptr->riding_ryoute = p_ptr->old_riding_ryoute = FALSE; + } + + calc_bonuses(); + + p_can_enter = player_can_enter(c_ptr->feat, CEM_P_CAN_ENTER_PATTERN); + + p_ptr->riding = old_riding; + if (old_pf_ryoute) p_ptr->pet_extra_flags |= (PF_RYOUTE); + else p_ptr->pet_extra_flags &= ~(PF_RYOUTE); + p_ptr->riding_ryoute = old_riding_ryoute; + p_ptr->old_riding_ryoute = old_old_riding_ryoute; - p_ptr->update |= (PU_MON_LITE); + calc_bonuses(); + + character_xtra = old_character_xtra; + + return p_can_enter; } +/*! + * @brief プレイヤーの落馬判定処理 + * @param dam 落馬判定を発した際に受けたダメージ量 + * @param force TRUEならば強制的に落馬する + * @return 実際に落馬したらTRUEを返す + */ bool rakuba(int dam, bool force) { int i, y, x, oy, ox; @@ -5487,6 +1846,7 @@ bool rakuba(int dam, bool force) char m_name[80]; monster_type *m_ptr = &m_list[p_ptr->riding]; monster_race *r_ptr = &r_info[m_ptr->r_idx]; + bool fall_dam = FALSE; if (!p_ptr->riding) return FALSE; if (p_ptr->wild_mode) return FALSE; @@ -5495,41 +1855,57 @@ bool rakuba(int dam, bool force) { if (!force) { - int level = r_ptr->level; - if (p_ptr->riding_ryoute) level += 20; - if ((dam/2 + r_ptr->level) > (p_ptr->skill_exp[GINOU_RIDING]/30+10)) + int cur = p_ptr->skill_exp[GINOU_RIDING]; + int max = s_info[p_ptr->pclass].s_max[GINOU_RIDING]; + int ridinglevel = r_ptr->level; + + /* 落馬のしやすさ */ + int rakubalevel = r_ptr->level; + if (p_ptr->riding_ryoute) rakubalevel += 20; + + if ((cur < max) && (max > 1000) && + (dam / 2 + ridinglevel) > (cur / 30 + 10)) { - if((p_ptr->skill_exp[GINOU_RIDING] < s_info[p_ptr->pclass].s_max[GINOU_RIDING]) && s_info[p_ptr->pclass].s_max[GINOU_RIDING] > 1000) - { - if (r_ptr->level*100 > (p_ptr->skill_exp[GINOU_RIDING] + 1500)) - p_ptr->skill_exp[GINOU_RIDING] += (1+(r_ptr->level - p_ptr->skill_exp[GINOU_RIDING]/100 - 15)); - else p_ptr->skill_exp[GINOU_RIDING]++; - } + int inc = 0; + + if (ridinglevel > (cur / 100 + 15)) + inc += 1 + (ridinglevel - cur / 100 - 15); + else + inc += 1; + + p_ptr->skill_exp[GINOU_RIDING] = MIN(max, cur + inc); } - if (randint0(dam/2 + level*2) < (p_ptr->skill_exp[GINOU_RIDING]/30+10)) + + /* レベルの低い乗馬からは落馬しにくい */ + if (randint0(dam / 2 + rakubalevel * 2) < cur / 30 + 10) { - if ((((p_ptr->pclass == CLASS_BEASTMASTER) || (p_ptr->pclass == CLASS_CAVALRY)) && !p_ptr->riding_ryoute) || !one_in_(p_ptr->lev*(p_ptr->riding_ryoute ? 2 : 3)+30)) + if ((((p_ptr->pclass == CLASS_BEASTMASTER) || (p_ptr->pclass == CLASS_CAVALRY)) && !p_ptr->riding_ryoute) || !one_in_(p_ptr->lev*(p_ptr->riding_ryoute ? 2 : 3) + 30)) { return FALSE; } } } + /* Check around the player */ for (i = 0; i < 8; i++) { cave_type *c_ptr; /* Access the location */ - y = py + ddy_ddd[i]; - x = px + ddx_ddd[i]; + y = p_ptr->y + ddy_ddd[i]; + x = p_ptr->x + ddx_ddd[i]; c_ptr = &cave[y][x]; + if (c_ptr->m_idx) continue; + /* Skip non-empty grids */ - if (cave_perma_grid(c_ptr)) continue; - if (!cave_empty_grid2(c_ptr)) continue; + if (!cave_have_flag_grid(c_ptr, FF_MOVE) && !cave_have_flag_grid(c_ptr, FF_CAN_FLY)) + { + if (!player_can_ride_aux(c_ptr, FALSE)) continue; + } - if (c_ptr->m_idx) continue; + if (cave_have_flag_grid(c_ptr, FF_PATTERN)) continue; /* Count "safe" grids */ sn++; @@ -5544,8 +1920,8 @@ bool rakuba(int dam, bool force) { monster_desc(m_name, m_ptr, 0); #ifdef JP -msg_format("%s¤«¤é¿¶¤êÍî¤È¤µ¤ì¤½¤¦¤Ë¤Ê¤Ã¤Æ¡¢Êɤˤ֤Ĥ«¤Ã¤¿¡£",m_name); - take_hit(DAMAGE_NOESCAPE, r_ptr->level+3, "Êɤؤξ×ÆÍ", -1); +msg_format("%sから振り落とされそうになって、壁にぶつかった。",m_name); + take_hit(DAMAGE_NOESCAPE, r_ptr->level+3, "壁への衝突", -1); #else msg_format("You have nearly fallen from %s, but bumped into wall.",m_name); take_hit(DAMAGE_NOESCAPE, r_ptr->level+3, "bumping into wall", -1); @@ -5553,17 +1929,17 @@ msg_format("%s return FALSE; } - oy = py; - ox = px; + oy = p_ptr->y; + ox = p_ptr->x; - py = sy; - px = sx; + p_ptr->y = sy; + p_ptr->x = sx; /* Redraw the old spot */ lite_spot(oy, ox); /* Redraw the new spot */ - lite_spot(py, px); + lite_spot(p_ptr->y, p_ptr->x); /* Check for new panel */ verify_panel(); @@ -5578,10 +1954,7 @@ msg_format("%s p_ptr->update |= (PU_BONUS); /* Update stuff */ - p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW); - - /* Update the monsters */ - p_ptr->update |= (PU_DISTANCE); + p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE | PU_MONSTERS); /* Window stuff */ p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); @@ -5591,48 +1964,65 @@ msg_format("%s /* Update health track of mount */ p_ptr->redraw |= (PR_UHEALTH); - if (p_ptr->ffall && !force) + if (p_ptr->levitation && !force) { monster_desc(m_name, m_ptr, 0); -#ifdef JP -msg_format("%s¤«¤éÍî¤Á¤¿¤¬¡¢¶õÃæ¤Ç¤¦¤Þ¤¯ÂÎÀª¤òΩ¤Æľ¤·¤ÆÃåÃϤ·¤¿¡£",m_name); -#else - msg_format("You are thrown from %s, but make a good landing.",m_name); -#endif - return FALSE; + msg_format(_("%sから落ちたが、空中でうまく体勢を立て直して着地した。", "You are thrown from %s, but make a good landing."),m_name); + } + else + { + take_hit(DAMAGE_NOESCAPE, r_ptr->level+3, _("落馬", "Falling from riding"), -1); + fall_dam = TRUE; } -#ifdef JP - take_hit(DAMAGE_NOESCAPE, r_ptr->level+3, "ÍîÇÏ", -1); -#else - take_hit(DAMAGE_NOESCAPE, r_ptr->level+3, "Falling from riding", -1); -#endif - return TRUE; + /* Move the player */ + if (sy && !p_ptr->is_dead) + (void)move_player_effect(p_ptr->y, p_ptr->x, MPE_DONT_PICKUP | MPE_DONT_SWAP_MON); + + return fall_dam; } +/*! + * @brief ペットから騎乗/下馬するコマンドのメインルーチン / + * @param force 強制的に騎乗/下馬するならばTRUE + * @return 騎乗/下馬できたらTRUE + */ bool do_riding(bool force) { - int oy, ox, x, y, dir = 0; + int x, y, dir = 0; cave_type *c_ptr; monster_type *m_ptr; if (!get_rep_dir2(&dir)) return FALSE; - y = py + ddy[dir]; - x = px + ddx[dir]; + y = p_ptr->y + ddy[dir]; + x = p_ptr->x + ddx[dir]; c_ptr = &cave[y][x]; + if (p_ptr->special_defense & KATA_MUSOU) set_action(ACTION_NONE); + if (p_ptr->riding) { /* Skip non-empty grids */ - if (!cave_empty_bold2(y, x) || c_ptr->m_idx) + if (!player_can_ride_aux(c_ptr, FALSE)) { -#ifdef JP -msg_print("¤½¤Á¤é¤Ë¤Ï¹ß¤ê¤é¤ì¤Þ¤»¤ó¡£"); -#else - msg_print("You cannot go to that direction."); -#endif + msg_print(_("そちらには降りられません。", "You cannot go to that direction.")); + return FALSE; + } + + if (!pattern_seq(p_ptr->y, p_ptr->x, y, x)) return FALSE; + + if (c_ptr->m_idx) + { + /* Take a turn */ + p_ptr->energy_use = 100; + + /* Message */ + msg_print(_("モンスターが立ちふさがっている!", "There is a monster in the way!")); + + py_attack(y, x, 0); return FALSE; } + p_ptr->riding = 0; p_ptr->pet_extra_flags &= ~(PF_RYOUTE); p_ptr->riding_ryoute = p_ptr->old_riding_ryoute = FALSE; @@ -5640,150 +2030,95 @@ msg_print(" else { if (p_ptr->confused) - { -#ifdef JP -msg_print("º®Í𤷤Ƥ¤¤Æ¾è¤ì¤Ê¤¤¡ª"); -#else - msg_print("You are too confused!"); -#endif - return FALSE; - } - if (!(c_ptr->m_idx)) - { -#ifdef JP -msg_print("¤½¤Î¾ì½ê¤Ë¤Ï¥â¥ó¥¹¥¿¡¼¤Ï¤¤¤Þ¤»¤ó¡£"); -#else - msg_print("Here is no pet."); -#endif - + { + msg_print(_("混乱していて乗れない!", "You are too confused!")); return FALSE; } m_ptr = &m_list[c_ptr->m_idx]; - if (!is_pet(m_ptr) && !force) + if (!c_ptr->m_idx || !m_ptr->ml) { -#ifdef JP -msg_print("¤½¤Î¥â¥ó¥¹¥¿¡¼¤Ï¥Ú¥Ã¥È¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£"); -#else - msg_print("That monster is not a pet."); -#endif - + msg_print(_("その場所にはモンスターはいません。", "Here is no monster.")); return FALSE; } - if (!(r_info[m_ptr->r_idx].flags7 & RF7_RIDING)) + if (!is_pet(m_ptr) && !force) { -#ifdef JP -msg_print("¤½¤Î¥â¥ó¥¹¥¿¡¼¤Ë¤Ï¾è¤ì¤Ê¤µ¤½¤¦¤À¡£"); -#else - msg_print("This monster doesn't seem suitable for riding."); -#endif - + msg_print(_("そのモンスターはペットではありません。", "That monster is not a pet.")); return FALSE; } - if (!(p_ptr->pass_wall) && (c_ptr->feat >= FEAT_RUBBLE) && (c_ptr->feat <= FEAT_PERM_SOLID)) + if (!(r_info[m_ptr->r_idx].flags7 & RF7_RIDING)) { -#ifdef JP -msg_print("¤½¤Î¥â¥ó¥¹¥¿¡¼¤ÏÊɤÎÃæ¤Ë¤¤¤ë¡£"); -#else - msg_print("This monster is in the wall."); -#endif - + msg_print(_("そのモンスターには乗れなさそうだ。", "This monster doesn't seem suitable for riding.")); return FALSE; } - if ((cave[py][px].feat >= FEAT_PATTERN_START) && (cave[py][px].feat <= FEAT_PATTERN_XTRA2) && ((cave[y][x].feat < FEAT_PATTERN_START) || (cave[y][x].feat > FEAT_PATTERN_XTRA2))) - { -#ifdef JP -msg_print("¥Ñ¥¿¡¼¥ó¤Î¾å¤«¤é¤Ï¾è¤ì¤Þ¤»¤ó¡£"); -#else - msg_print("You cannot ride from on Pattern."); -#endif - return FALSE; - } - if (!m_ptr->ml) + if (!pattern_seq(p_ptr->y, p_ptr->x, y, x)) return FALSE; + + if (!player_can_ride_aux(c_ptr, TRUE)) { + /* Feature code (applying "mimic" field) */ + feature_type *f_ptr = &f_info[get_feat_mimic(c_ptr)]; #ifdef JP -msg_print("¤½¤Î¾ì½ê¤Ë¤Ï¥â¥ó¥¹¥¿¡¼¤Ï¤¤¤Þ¤»¤ó¡£"); + msg_format("そのモンスターは%sの%sにいる。", f_name + f_ptr->name, + ((!have_flag(f_ptr->flags, FF_MOVE) && !have_flag(f_ptr->flags, FF_CAN_FLY)) || + (!have_flag(f_ptr->flags, FF_LOS) && !have_flag(f_ptr->flags, FF_TREE))) ? + "中" : "上"); #else - msg_print("Here is no monster."); + msg_format("This monster is %s the %s.", + ((!have_flag(f_ptr->flags, FF_MOVE) && !have_flag(f_ptr->flags, FF_CAN_FLY)) || + (!have_flag(f_ptr->flags, FF_LOS) && !have_flag(f_ptr->flags, FF_TREE))) ? + "in" : "on", f_name + f_ptr->name); #endif return FALSE; } - if (r_info[m_ptr->r_idx].level > randint1((p_ptr->skill_exp[GINOU_RIDING]/50 + p_ptr->lev/2 +20))) + if (r_info[m_ptr->r_idx].level > randint1((p_ptr->skill_exp[GINOU_RIDING] / 50 + p_ptr->lev / 2 + 20))) { -#ifdef JP -msg_print("¤¦¤Þ¤¯¾è¤ì¤Ê¤«¤Ã¤¿¡£"); -#else - msg_print("You failed to ride."); -#endif - - energy_use = 100; - + msg_print(_("うまく乗れなかった。", "You failed to ride.")); + p_ptr->energy_use = 100; return FALSE; } - if (m_ptr->csleep) + + if (MON_CSLEEP(m_ptr)) { char m_name[80]; monster_desc(m_name, m_ptr, 0); - m_ptr->csleep = 0; -#ifdef JP -msg_format("%s¤òµ¯¤³¤·¤¿¡£", m_name); -#else - msg_format("You have waked %s up.", m_name); -#endif + (void)set_monster_csleep(c_ptr->m_idx, 0); + msg_format(_("%sを起こした。", "You have waked %s up."), m_name); } + if (p_ptr->action == ACTION_KAMAE) set_action(ACTION_NONE); + p_ptr->riding = c_ptr->m_idx; /* Hack -- remove tracked monster */ if (p_ptr->riding == p_ptr->health_who) health_track(0); } - /* Save the old location */ - oy = py; - ox = px; - - /* Move the player to the safe location */ - py = y; - px = x; - - /* Redraw the old spot */ - lite_spot(oy, ox); - - /* Redraw the new spot */ - lite_spot(py, px); - - /* Check for new panel */ - verify_panel(); - - energy_use = 100; + p_ptr->energy_use = 100; /* Mega-Hack -- Forget the view and lite */ p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE); - /* Update stuff */ - p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW); - - /* Update the monsters */ - p_ptr->update |= (PU_DISTANCE); - /* Update the monsters */ p_ptr->update |= (PU_BONUS); /* Redraw map */ p_ptr->redraw |= (PR_MAP | PR_EXTRA); - /* Window stuff */ - p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); - p_ptr->redraw |= (PR_UHEALTH); - handle_stuff(); + /* Move the player */ + (void)move_player_effect(y, x, MPE_HANDLE_STUFF | MPE_ENERGY_USE | MPE_DONT_PICKUP | MPE_DONT_SWAP_MON); + return TRUE; } +/*! + * @brief ペットに名前をつけるコマンドのメインルーチン + * @return なし + */ static void do_name_pet(void) { monster_type *m_ptr; @@ -5807,31 +2142,18 @@ static void do_name_pet(void) if (!is_pet(m_ptr)) { /* Message */ -#ifdef JP - msg_print("¤½¤Î¥â¥ó¥¹¥¿¡¼¤Ï¥Ú¥Ã¥È¤Ç¤Ï¤Ê¤¤¡£"); -#else - msg_format("This monster is not a pet."); -#endif + msg_print(_("そのモンスターはペットではない。", "This monster is not a pet.")); return; } if (r_info[m_ptr->r_idx].flags1 & RF1_UNIQUE) { -#ifdef JP - msg_print("¤½¤Î¥â¥ó¥¹¥¿¡¼¤Î̾Á°¤ÏÊѤ¨¤é¤ì¤Ê¤¤¡ª"); -#else - msg_format("You cannot change name of this monster!"); -#endif + msg_print(_("そのモンスターの名前は変えられない!", "You cannot change name of this monster!")); return; } monster_desc(m_name, m_ptr, 0); /* Message */ -#ifdef JP - msg_format("%s¤Ë̾Á°¤ò¤Ä¤±¤ë¡£", m_name); -#else - msg_format("Name %s.", m_name); -#endif - + msg_format(_("%sに名前をつける。", "Name %s."), m_name); msg_print(NULL); /* Start with nothing */ @@ -5846,12 +2168,7 @@ static void do_name_pet(void) } /* Get a new inscription (possibly empty) */ -#ifdef JP - if (get_string("̾Á°: ", out_val, 15)) -#else - if (get_string("Name: ", out_val, 15)) -#endif - + if (get_string(_("名前: ", "Name: "), out_val, 15)) { if (out_val[0]) { @@ -5859,20 +2176,16 @@ static void do_name_pet(void) m_ptr->nickname = quark_add(out_val); if (record_named_pet) { - char m_name[80]; - - monster_desc(m_name, m_ptr, 0x08); - do_cmd_write_nikki(NIKKI_NAMED_PET, 0, m_name); + monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE); + do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_NAME, m_name); } } else { if (record_named_pet && old_name) { - char m_name[80]; - - monster_desc(m_name, m_ptr, 0x08); - do_cmd_write_nikki(NIKKI_NAMED_PET, 1, m_name); + monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE); + do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_UNNAME, m_name); } m_ptr->nickname = 0; } @@ -5880,8 +2193,11 @@ static void do_name_pet(void) } } -/* + +/*! + * @brief ペットに関するコマンドリストのメインルーチン / * Issue a pet command + * @return なし */ void do_cmd_pet(void) { @@ -5890,352 +2206,293 @@ void do_cmd_pet(void) int powers[36]; cptr power_desc[36]; bool flag, redraw; - int ask; char choice; char out_val[160]; - int pets = 0, pet_ctr; + int pet_ctr; monster_type *m_ptr; int mode = 0; - byte y = 1, x = 0; - int ctr = 0; char buf[160]; char target_buf[160]; - num = 0; - - /* Calculate pets */ - /* Process the monsters (backwards) */ - for (pet_ctr = m_max - 1; pet_ctr >= 1; pet_ctr--) - { - /* Access the monster */ - m_ptr = &m_list[pet_ctr]; - - if (is_pet(m_ptr)) pets++; - } + int menu_line = use_menu ? 1 : 0; -#ifdef JP - power_desc[num] = "¥Ú¥Ã¥È¤òÊü¤¹"; -#else - power_desc[num] = "dismiss pets"; -#endif + num = 0; + power_desc[num] = _("ペットを放す", "dismiss pets"); powers[num++] = PET_DISMISS; #ifdef JP - sprintf(target_buf,"¥Ú¥Ã¥È¤Î¥¿¡¼¥²¥Ã¥È¤ò»ØÄê (¸½ºß¡§%s)", - (pet_t_m_idx ? r_name + r_info[m_list[pet_t_m_idx].r_idx].name : "»ØÄê¤Ê¤·")); + sprintf(target_buf, "ペットのターゲットを指定 (現在:%s)", + (pet_t_m_idx ? (p_ptr->image ? "何か奇妙な物" : (r_name + r_info[m_list[pet_t_m_idx].ap_r_idx].name)) : "指定なし")); #else - sprintf(target_buf,"specify a targert of pet (now:%s)", - (pet_t_m_idx ? r_name + r_info[m_list[pet_t_m_idx].r_idx].name : "nothing")); + sprintf(target_buf, "specify a target of pet (now:%s)", + (pet_t_m_idx ? (p_ptr->image ? "something strange" : (r_name + r_info[m_list[pet_t_m_idx].ap_r_idx].name)) : "nothing")); #endif power_desc[num] = target_buf; - powers[num++] = PET_TARGET; - -#ifdef JP -power_desc[num] = "¶á¤¯¤Ë¤¤¤í"; -#else - power_desc[num] = "stay close"; -#endif + power_desc[num] = _("近くにいろ", "stay close"); if (p_ptr->pet_follow_distance == PET_CLOSE_DIST) mode = num; powers[num++] = PET_STAY_CLOSE; - -#ifdef JP - power_desc[num] = "¤Ä¤¤¤ÆÍ褤"; -#else - power_desc[num] = "follow me"; -#endif + power_desc[num] = _("ついて来い", "follow me"); if (p_ptr->pet_follow_distance == PET_FOLLOW_DIST) mode = num; powers[num++] = PET_FOLLOW_ME; - -#ifdef JP -power_desc[num] = "Ũ¤ò¸«¤Ä¤±¤ÆÅݤ»"; -#else - power_desc[num] = "seek and destroy"; -#endif + power_desc[num] = _("敵を見つけて倒せ", "seek and destroy"); if (p_ptr->pet_follow_distance == PET_DESTROY_DIST) mode = num; powers[num++] = PET_SEEK_AND_DESTROY; - -#ifdef JP -power_desc[num] = "¾¯¤·Î¥¤ì¤Æ¤¤¤í"; -#else - power_desc[num] = "give me space"; -#endif + power_desc[num] = _("少し離れていろ", "give me space"); if (p_ptr->pet_follow_distance == PET_SPACE_DIST) mode = num; powers[num++] = PET_ALLOW_SPACE; - -#ifdef JP -power_desc[num] = "Î¥¤ì¤Æ¤¤¤í"; -#else - power_desc[num] = "stay away"; -#endif + power_desc[num] = _("離れていろ", "stay away"); if (p_ptr->pet_follow_distance == PET_AWAY_DIST) mode = num; powers[num++] = PET_STAY_AWAY; if (p_ptr->pet_extra_flags & PF_OPEN_DOORS) { -#ifdef JP - power_desc[num] = "¥É¥¢¤ò³«¤±¤ë (¸½ºß:ON)"; -#else - power_desc[num] = "pets open doors (now On)"; -#endif - + power_desc[num] = _("ドアを開ける (現在:ON)", "pets open doors (now On)"); } else { -#ifdef JP - power_desc[num] = "¥É¥¢¤ò³«¤±¤ë (¸½ºß:OFF)"; -#else - power_desc[num] = "pets open doors (now Off)"; -#endif - + power_desc[num] = _("ドアを開ける (現在:OFF)", "pets open doors (now Off)"); } powers[num++] = PET_OPEN_DOORS; if (p_ptr->pet_extra_flags & PF_PICKUP_ITEMS) { -#ifdef JP - power_desc[num] = "¥¢¥¤¥Æ¥à¤ò½¦¤¦ (¸½ºß:ON)"; -#else - power_desc[num] = "pets pick up items (now On)"; -#endif - + power_desc[num] = _("アイテムを拾う (現在:ON)", "pets pick up items (now On)"); } else { -#ifdef JP - power_desc[num] = "¥¢¥¤¥Æ¥à¤ò½¦¤¦ (¸½ºß:OFF)"; -#else - power_desc[num] = "pets pick up items (now Off)"; -#endif - + power_desc[num] = _("アイテムを拾う (現在:OFF)", "pets pick up items (now Off)"); } powers[num++] = PET_TAKE_ITEMS; if (p_ptr->pet_extra_flags & PF_TELEPORT) { -#ifdef JP - power_desc[num] = "¥Æ¥ì¥Ý¡¼¥È·ÏËâË¡¤ò»È¤¦ (¸½ºß:ON)"; -#else - power_desc[num] = "allow teleport (now On)"; -#endif - + power_desc[num] = _("テレポート系魔法を使う (現在:ON)", "allow teleport (now On)"); } else { -#ifdef JP - power_desc[num] = "¥Æ¥ì¥Ý¡¼¥È·ÏËâË¡¤ò»È¤¦ (¸½ºß:OFF)"; -#else - power_desc[num] = "allow teleport (now Off)"; -#endif - + power_desc[num] = _("テレポート系魔法を使う (現在:OFF)", "allow teleport (now Off)"); } powers[num++] = PET_TELEPORT; if (p_ptr->pet_extra_flags & PF_ATTACK_SPELL) { -#ifdef JP - power_desc[num] = "¹¶·âËâË¡¤ò»È¤¦ (¸½ºß:ON)"; -#else - power_desc[num] = "allow cast attack spell (now On)"; -#endif - + power_desc[num] = _("攻撃魔法を使う (現在:ON)", "allow cast attack spell (now On)"); } else { -#ifdef JP - power_desc[num] = "¹¶·âËâË¡¤ò»È¤¦ (¸½ºß:OFF)"; -#else - power_desc[num] = "allow cast attack spell (now Off)"; -#endif - + power_desc[num] = _("攻撃魔法を使う (現在:OFF)", "allow cast attack spell (now Off)"); } powers[num++] = PET_ATTACK_SPELL; if (p_ptr->pet_extra_flags & PF_SUMMON_SPELL) { -#ifdef JP - power_desc[num] = "¾¤´­ËâË¡¤ò»È¤¦ (¸½ºß:ON)"; -#else - power_desc[num] = "allow cast summon spell (now On)"; -#endif - + power_desc[num] = _("召喚魔法を使う (現在:ON)", "allow cast summon spell (now On)"); } else { -#ifdef JP - power_desc[num] = "¾¤´­ËâË¡¤ò»È¤¦ (¸½ºß:OFF)"; -#else - power_desc[num] = "allow cast summon spell (now Off)"; -#endif - + power_desc[num] = _("召喚魔法を使う (現在:OFF)", "allow cast summon spell (now Off)"); } powers[num++] = PET_SUMMON_SPELL; if (p_ptr->pet_extra_flags & PF_BALL_SPELL) { -#ifdef JP - power_desc[num] = "¥×¥ì¥¤¥ä¡¼¤ò´¬¤­¹þ¤àÈÏ°ÏËâË¡¤ò»È¤¦ (¸½ºß:ON)"; -#else - power_desc[num] = "allow involve player in area spell (now On)"; -#endif - + power_desc[num] = _("プレイヤーを巻き込む範囲魔法を使う (現在:ON)", "allow involve player in area spell (now On)"); } else { -#ifdef JP - power_desc[num] = "¥×¥ì¥¤¥ä¡¼¤ò´¬¤­¹þ¤àÈÏ°ÏËâË¡¤ò»È¤¦ (¸½ºß:OFF)"; -#else - power_desc[num] = "allow involve player in area spell (now Off)"; -#endif - + power_desc[num] = _("プレイヤーを巻き込む範囲魔法を使う (現在:OFF)", "allow involve player in area spell (now Off)"); } powers[num++] = PET_BALL_SPELL; if (p_ptr->riding) { -#ifdef JP - power_desc[num] = "¥Ú¥Ã¥È¤«¤é¹ß¤ê¤ë"; -#else - power_desc[num] = "get off a pet"; -#endif - + power_desc[num] = _("ペットから降りる", "get off a pet"); } else { -#ifdef JP - power_desc[num] = "¥Ú¥Ã¥È¤Ë¾è¤ë"; -#else - power_desc[num] = "ride a pet"; -#endif - + power_desc[num] = _("ペットに乗る", "ride a pet"); } powers[num++] = PET_RIDING; - -#ifdef JP - power_desc[num] = "¥Ú¥Ã¥È¤Ë̾Á°¤ò¤Ä¤±¤ë¡£"; -#else - power_desc[num] = "name pets"; -#endif - + power_desc[num] = _("ペットに名前をつける", "name pets"); powers[num++] = PET_NAME; - if (p_ptr->riding && buki_motteruka(INVEN_RARM) && (empty_hands(FALSE) & 0x00000001) && ((inventory[INVEN_RARM].weight > 99) || (inventory[INVEN_RARM].tval == TV_POLEARM))) + if (p_ptr->riding) { - if (p_ptr->pet_extra_flags & PF_RYOUTE) + if ((p_ptr->migite && (empty_hands(FALSE) == EMPTY_HAND_LARM) && + object_allow_two_hands_wielding(&inventory[INVEN_RARM])) || + (p_ptr->hidarite && (empty_hands(FALSE) == EMPTY_HAND_RARM) && + object_allow_two_hands_wielding(&inventory[INVEN_LARM]))) { -#ifdef JP - power_desc[num] = "Éð´ï¤òÊÒ¼ê¤Ç»ý¤Ä"; -#else - power_desc[num] = "use one hand to control a riding pet"; -#endif + if (p_ptr->pet_extra_flags & PF_RYOUTE) + { + power_desc[num] = _("武器を片手で持つ", "use one hand to control a riding pet"); + } + else + { + power_desc[num] = _("武器を両手で持つ", "use both hands for a weapon"); + } + powers[num++] = PET_RYOUTE; } else { -#ifdef JP - power_desc[num] = "Éð´ï¤òξ¼ê¤Ç»ý¤Ä"; -#else - power_desc[num] = "use both hands for a weapon."; -#endif + switch (p_ptr->pclass) + { + case CLASS_MONK: + case CLASS_FORCETRAINER: + case CLASS_BERSERKER: + if (empty_hands(FALSE) == (EMPTY_HAND_RARM | EMPTY_HAND_LARM)) + { + if (p_ptr->pet_extra_flags & PF_RYOUTE) + { + power_desc[num] = _("片手で格闘する", "use one hand to control a riding pet"); + } + else + { + power_desc[num] = _("両手で格闘する", "use both hands for melee"); + } - } + powers[num++] = PET_RYOUTE; + } + else if ((empty_hands(FALSE) != EMPTY_HAND_NONE) && !buki_motteruka(INVEN_RARM) && !buki_motteruka(INVEN_LARM)) + { + if (p_ptr->pet_extra_flags & PF_RYOUTE) + { + power_desc[num] = _("格闘を行わない", "use one hand to control a riding pet"); + } + else + { + power_desc[num] = _("格闘を行う", "use one hand for melee"); + } - powers[num++] = PET_RYOUTE; + powers[num++] = PET_RYOUTE; + } + break; + } + } } +#ifdef ALLOW_REPEAT + if (!(repeat_pull(&i) && (i >= 0) && (i < num))) + { +#endif /* ALLOW_REPEAT */ + /* Nothing chosen yet */ flag = FALSE; - /* Build a prompt (accept all spells) */ - if (num <= 26) + /* No redraw yet */ + redraw = FALSE; + + if (use_menu) { - /* Build a prompt (accept all spells) */ -#ifdef JP -strnfmt(out_val, 78, "(¥³¥Þ¥ó¥É %c-%c¡¢'*'=°ìÍ÷¡¢ESC=½ªÎ») ¥³¥Þ¥ó¥É¤òÁª¤ó¤Ç¤¯¤À¤µ¤¤:", -#else - strnfmt(out_val, 78, "(Command %c-%c, *=List, ESC=exit) Select a command: ", -#endif + /* Save the screen */ + screen_save(); - I2A(0), I2A(num - 1)); + /* Build a prompt */ + strnfmt(out_val, 78, _("(コマンド、ESC=終了) コマンドを選んでください:", "(Command, ESC=exit) Choose command from menu.")); } else { -#ifdef JP -strnfmt(out_val, 78, "(¥³¥Þ¥ó¥É %c-%c¡¢'*'=°ìÍ÷¡¢ESC=½ªÎ») ¥³¥Þ¥ó¥É¤òÁª¤ó¤Ç¤¯¤À¤µ¤¤:", -#else - strnfmt(out_val, 78, "(Command %c-%c, *=List, ESC=exit) Select a command: ", -#endif - - I2A(0), '0' + num - 27); + /* Build a prompt */ + strnfmt(out_val, 78, + _("(コマンド %c-%c、'*'=一覧、ESC=終了) コマンドを選んでください:", "(Command %c-%c, *=List, ESC=exit) Select a command: "), + I2A(0), I2A(num - 1)); } - /* Show list */ - redraw = TRUE; + choice = (always_show_list || use_menu) ? ESCAPE : 1; - /* Save the screen */ - Term_save(); + /* Get a command from the user */ + while (!flag) + { + int ask = TRUE; - prt("", y++, x); + if (choice == ESCAPE) choice = ' '; + else if (!get_com(out_val, &choice, TRUE)) break; - while (ctr < num) - { - prt(format("%s%c) %s", (ctr == mode) ? "*" : " ", I2A(ctr), power_desc[ctr]), y + ctr, x); - ctr++; - } + if (use_menu && (choice != ' ')) + { + switch (choice) + { + case '0': + screen_load(); + return; - if (ctr < 17) - { - prt("", y + ctr, x); - } - else - { - prt("", y + 17, x); - } + case '8': + case 'k': + case 'K': + menu_line += (num - 1); + break; + + case '2': + case 'j': + case 'J': + menu_line++; + break; + + case '4': + case 'h': + case 'H': + menu_line = 1; + break; + + case '6': + case 'l': + case 'L': + menu_line = num; + break; + + case 'x': + case 'X': + case '\r': + case '\n': + i = menu_line - 1; + ask = FALSE; + break; + } + if (menu_line > num) menu_line -= num; + } - /* Get a command from the user */ - while (!flag && get_com(out_val, &choice, TRUE)) - { /* Request redraw */ - if ((choice == ' ') || (choice == '*') || (choice == '?')) + if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask)) { /* Show the list */ - if (!redraw) + if (!redraw || use_menu) { - y = 1; - x = 0; - ctr = 0; + byte y = 1, x = 0; + int ctr = 0; /* Show list */ redraw = TRUE; /* Save the screen */ - Term_save(); + if (!use_menu) screen_save(); prt("", y++, x); - while (ctr < num) + /* Print list */ + for (ctr = 0; ctr < num; ctr++) { - sprintf(buf, "%s%c) %s", (ctr == mode) ? "*" : " ", I2A(ctr), power_desc[ctr]); + /* Letter/number for power selection */ + if (use_menu) + sprintf(buf, "%c%s ", (ctr == mode) ? '*' : ' ', (ctr == (menu_line - 1)) ? _("》", "> ") : " "); + else + sprintf(buf, "%c%c) ", (ctr == mode) ? '*' : ' ', I2A(ctr)); + + strcat(buf, power_desc[ctr]); + prt(buf, y + ctr, x); - ctr++; } - if (ctr < 17) - { - prt("", y + ctr, x); - } - else - { - prt("", y + 17, x); - } + prt("", y + MIN(ctr, 17), x); } /* Hide the list */ @@ -6245,14 +2502,14 @@ strnfmt(out_val, 78, "( redraw = FALSE; /* Restore the screen */ - Term_load(); + screen_load(); } /* Redo asking */ continue; } - if (isalpha(choice)) + if (!use_menu) { /* Note verify */ ask = (isupper(choice)); @@ -6263,12 +2520,6 @@ strnfmt(out_val, 78, "( /* Extract request */ i = (islower(choice) ? A2I(choice) : -1); } - else - { - ask = FALSE; /* Can't uppercase digits */ - - i = choice - '0' + 26; - } /* Totally Illegal */ if ((i < 0) || (i >= num)) @@ -6281,12 +2532,7 @@ strnfmt(out_val, 78, "( if (ask) { /* Prompt */ -#ifdef JP - strnfmt(buf, 78, "%s¤ò»È¤¤¤Þ¤¹¤«¡© ", power_desc[i]); -#else - strnfmt(buf, 78, "Use %s? ", power_desc[i]); -#endif - + strnfmt(buf, 78, _("%sを使いますか? ", "Use %s? "), power_desc[i]); /* Belay that order */ if (!get_check(buf)) continue; @@ -6297,26 +2543,34 @@ strnfmt(out_val, 78, "( } /* Restore the screen */ - if (redraw) Term_load(); + if (redraw) screen_load(); /* Abort if needed */ if (!flag) { - energy_use = 0; + p_ptr->energy_use = 0; return; } +#ifdef ALLOW_REPEAT + repeat_push(i); + } +#endif /* ALLOW_REPEAT */ + switch (powers[i]) { case PET_DISMISS: /* Dismiss pets */ { - if (!pets) + /* Check pets (backwards) */ + for (pet_ctr = m_max - 1; pet_ctr >= 1; pet_ctr--) { -#ifdef JP - msg_print("¥Ú¥Ã¥È¤¬¤¤¤Ê¤¤¡ª"); -#else - msg_print("You have no pets!"); -#endif + /* Player has pet */ + if (is_pet(&m_list[pet_ctr])) break; + } + + if (!pet_ctr) + { + msg_print(_("ペットがいない!", "You have no pets!")); break; } do_cmd_pet_dismiss(); @@ -6432,7 +2686,7 @@ strnfmt(out_val, 78, "( case PET_RIDING: { - do_riding(FALSE); + (void)do_riding(FALSE); break; }