OSDN Git Service

v3.0.0 Alpha5 OSDN最終版
[hengband/hengband.git] / src / cmd-magiceat.c
diff --git a/src/cmd-magiceat.c b/src/cmd-magiceat.c
deleted file mode 100644 (file)
index d35f6b9..0000000
+++ /dev/null
@@ -1,594 +0,0 @@
-/*!
- * @file cmd6.c
- * @brief プレイヤーのアイテムに関するコマンドの実装2 / Spell/Prayer commands
- * @date 2014/01/27
- * @author
- * <pre>
- * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
- * This software may be copied and distributed for educational, research,
- * and not for profit purposes provided that this copyright and statement
- * are included in all such copies.  Other copyrights may also apply.
- * 2014 Deskull rearranged comment for Doxygen.\n
- * </pre>
- * @details
- * <pre>
- * This file includes code for eating food, drinking potions,
- * reading scrolls, aiming wands, using staffs, zapping rods,
- * and activating artifacts.
- *
- * In all cases, if the player becomes "aware" of the item's use
- * by testing it, mark it as "aware" and reward some experience
- * based on the object's level, always rounding up.  If the player
- * remains "unaware", mark that object "kind" as "tried".
- *
- * This code now correctly handles the unstacking of wands, staffs,
- * and rods.  Note the overly paranoid warning about potential pack
- * overflow, which allows the player to use and drop a stacked item.
- *
- * In all "unstacking" scenarios, the "used" object is "carried" as if
- * the player had just picked it up.  In particular, this means that if
- * the use of an item induces pack overflow, that item will be dropped.
- *
- * For simplicity, these routines induce a full "pack reorganization"
- * which not only combines similar items, but also reorganizes various
- * items to obey the current "sorting" method.  This may require about
- * 400 item comparisons, but only occasionally.
- *
- * There may be a BIG problem with any "effect" that can cause "changes"
- * to the p_ptr->inventory_list.  For example, a "scroll of recharging" can cause
- * a wand/staff to "disappear", moving the p_ptr->inventory_list up.  Luckily, the
- * scrolls all appear BEFORE the staffs/wands, so this is not a problem.
- * But, for example, a "staff of recharging" could cause MAJOR problems.
- * In such a case, it will be best to either (1) "postpone" the effect
- * until the end of the function, or (2) "change" the effect, say, into
- * giving a staff "negative" charges, or "turning a staff into a stick".
- * It seems as though a "rod of recharging" might in fact cause problems.
- * The basic problem is that the act of recharging (and destroying) an
- * item causes the inducer of that action to "move", causing "o_ptr" to
- * no longer point at the correct item, with horrifying results.
- *
- * Note that food/potions/scrolls no longer use bit-flags for effects,
- * but instead use the "sval" (which is also used to sort the objects).
- * </pre>
- */
-
-#include "angband.h"
-#include "util.h"
-#include "term.h"
-
-#include "cmd-basic.h"
-#include "cmd-usestaff.h"
-#include "cmd-zaprod.h"
-#include "cmd-zapwand.h"
-#include "cmd-magiceat.h"
-#include "avatar.h"
-#include "player-status.h"
-#include "spells.h"
-#include "player-class.h"
-#include "objectkind.h"
-#include "targeting.h"
-
-/*!
- * @brief 魔道具術師の取り込んだ魔力一覧から選択/閲覧する /
- * @param only_browse 閲覧するだけならばTRUE
- * @return 選択した魔力のID、キャンセルならば-1を返す
- */
-static OBJECT_SUBTYPE_VALUE select_magic_eater(bool only_browse)
-{
-       OBJECT_SUBTYPE_VALUE ext = 0;
-       char choice;
-       bool flag, request_list;
-       OBJECT_TYPE_VALUE tval = 0;
-       int             ask = TRUE;
-       OBJECT_SUBTYPE_VALUE i = 0;
-       char            out_val[160];
-
-       int menu_line = (use_menu ? 1 : 0);
-
-       COMMAND_CODE sn;
-       if (repeat_pull(&sn))
-       {
-               /* Verify the spell */
-               if (sn >= EATER_EXT*2 && !(p_ptr->magic_num1[sn] > k_info[lookup_kind(TV_ROD, sn-EATER_EXT*2)].pval * (p_ptr->magic_num2[sn] - 1) * EATER_ROD_CHARGE))
-                       return sn;
-               else if (sn < EATER_EXT*2 && !(p_ptr->magic_num1[sn] < EATER_CHARGE))
-                       return sn;
-       }
-       
-       for (i = 0; i < 108; i++)
-       {
-               if (p_ptr->magic_num2[i]) break;
-       }
-       if (i == 108)
-       {
-               msg_print(_("魔法を覚えていない!", "You don't have any magic!"));
-               return -1;
-       }
-
-       if (use_menu)
-       {
-               screen_save();
-
-               while(!tval)
-               {
-#ifdef JP
-                       prt(format(" %s 杖", (menu_line == 1) ? "》" : "  "), 2, 14);
-                       prt(format(" %s 魔法棒", (menu_line == 2) ? "》" : "  "), 3, 14);
-                       prt(format(" %s ロッド", (menu_line == 3) ? "》" : "  "), 4, 14);
-#else
-                       prt(format(" %s staff", (menu_line == 1) ? "> " : "  "), 2, 14);
-                       prt(format(" %s wand", (menu_line == 2) ? "> " : "  "), 3, 14);
-                       prt(format(" %s rod", (menu_line == 3) ? "> " : "  "), 4, 14);
-#endif
-
-                       if (only_browse) prt(_("どの種類の魔法を見ますか?", "Which type of magic do you browse?"), 0, 0);
-                       else prt(_("どの種類の魔法を使いますか?", "Which type of magic do you use?"), 0, 0);
-
-                       choice = inkey();
-                       switch(choice)
-                       {
-                       case ESCAPE:
-                       case 'z':
-                       case 'Z':
-                               screen_load();
-                               return -1;
-                       case '2':
-                       case 'j':
-                       case 'J':
-                               menu_line++;
-                               break;
-                       case '8':
-                       case 'k':
-                       case 'K':
-                               menu_line+= 2;
-                               break;
-                       case '\r':
-                       case 'x':
-                       case 'X':
-                               ext = (menu_line-1)*EATER_EXT;
-                               if (menu_line == 1) tval = TV_STAFF;
-                               else if (menu_line == 2) tval = TV_WAND;
-                               else tval = TV_ROD;
-                               break;
-                       }
-                       if (menu_line > 3) menu_line -= 3;
-               }
-               screen_load();
-       }
-       else
-       {
-       while (TRUE)
-       {
-               if (!get_com(_("[A] 杖, [B] 魔法棒, [C] ロッド:", "[A] staff, [B] wand, [C] rod:"), &choice, TRUE))
-               {
-                       return -1;
-               }
-               if (choice == 'A' || choice == 'a')
-               {
-                       ext = 0;
-                       tval = TV_STAFF;
-                       break;
-               }
-               if (choice == 'B' || choice == 'b')
-               {
-                       ext = EATER_EXT;
-                       tval = TV_WAND;
-                       break;
-               }
-               if (choice == 'C' || choice == 'c')
-               {
-                       ext = EATER_EXT*2;
-                       tval = TV_ROD;
-                       break;
-               }
-       }
-       }
-       for (i = ext; i < ext + EATER_EXT; i++)
-       {
-               if (p_ptr->magic_num2[i])
-               {
-                       if (use_menu) menu_line = i-ext+1;
-                       break;
-               }
-       }
-       if (i == ext+EATER_EXT)
-       {
-               msg_print(_("その種類の魔法は覚えていない!", "You don't have that type of magic!"));
-               return -1;
-       }
-
-       /* Nothing chosen yet */
-       flag = FALSE;
-
-       if (only_browse) strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの魔力を見ますか?",
-                                                                                       "(*=List, ESC=exit) Browse which power? "));
-       else strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの魔力を使いますか?",
-                                                               "(*=List, ESC=exit) Use which power? "));
-       screen_save();
-
-       request_list = always_show_list;
-
-       while (!flag)
-       {
-               /* Show the list */
-               if (request_list || use_menu)
-               {
-                       byte y, x = 0;
-                       OBJECT_SUBTYPE_VALUE ctr;
-                       PERCENTAGE chance;
-                       KIND_OBJECT_IDX k_idx;
-                       char dummy[80];
-                       POSITION x1, y1;
-                       DEPTH level;
-                       byte col;
-
-                       strcpy(dummy, "");
-
-                       for (y = 1; y < 20; y++)
-                               prt("", y, x);
-
-                       y = 1;
-
-                       /* Print header(s) */
-#ifdef JP
-                       prt(format("                           %s 失率                           %s 失率", (tval == TV_ROD ? "  状態  " : "使用回数"), (tval == TV_ROD ? "  状態  " : "使用回数")), y++, x);
-#else
-                       prt(format("                           %s Fail                           %s Fail", (tval == TV_ROD ? "  Stat  " : " Charges"), (tval == TV_ROD ? "  Stat  " : " Charges")), y++, x);
-#endif
-
-                       /* Print list */
-                       for (ctr = 0; ctr < EATER_EXT; ctr++)
-                       {
-                               if (!p_ptr->magic_num2[ctr+ext]) continue;
-
-                               k_idx = lookup_kind(tval, ctr);
-
-                               if (use_menu)
-                               {
-                                       if (ctr == (menu_line-1))
-                                               strcpy(dummy, _("》", "> "));
-                                       else
-                                               strcpy(dummy, "  ");
-                               }
-                               /* letter/number for power selection */
-                               else
-                               {
-                                       char letter;
-                                       if (ctr < 26)
-                                               letter = I2A(ctr);
-                                       else
-                                               letter = '0' + ctr - 26;
-                                       sprintf(dummy, "%c)",letter);
-                               }
-                               x1 = ((ctr < EATER_EXT/2) ? x : x + 40);
-                               y1 = ((ctr < EATER_EXT/2) ? y + ctr : y + ctr - EATER_EXT/2);
-                               level = (tval == TV_ROD ? k_info[k_idx].level * 5 / 6 - 5 : k_info[k_idx].level);
-                               chance = level * 4 / 5 + 20;
-                               chance -= 3 * (adj_mag_stat[p_ptr->stat_ind[mp_ptr->spell_stat]] - 1);
-                               level /= 2;
-                               if (p_ptr->lev > level)
-                               {
-                                       chance -= 3 * (p_ptr->lev - level);
-                               }
-                               chance = mod_spell_chance_1(chance);
-                               chance = MAX(chance, adj_mag_fail[p_ptr->stat_ind[mp_ptr->spell_stat]]);
-                               /* Stunning makes spells harder */
-                               if (p_ptr->stun > 50) chance += 25;
-                               else if (p_ptr->stun) chance += 15;
-
-                               if (chance > 95) chance = 95;
-
-                               chance = mod_spell_chance_2(chance);
-
-                               col = TERM_WHITE;
-
-                               if (k_idx)
-                               {
-                                       if (tval == TV_ROD)
-                                       {
-                                               strcat(dummy, format(
-                                                              _(" %-22.22s 充填:%2d/%2d%3d%%", " %-22.22s   (%2d/%2d) %3d%%"),
-                                                              k_name + k_info[k_idx].name, 
-                                                              p_ptr->magic_num1[ctr+ext] ? 
-                                                              (p_ptr->magic_num1[ctr+ext] - 1) / (EATER_ROD_CHARGE * k_info[k_idx].pval) +1 : 0, 
-                                                              p_ptr->magic_num2[ctr+ext], chance));
-                                               if (p_ptr->magic_num1[ctr+ext] > k_info[k_idx].pval * (p_ptr->magic_num2[ctr+ext]-1) * EATER_ROD_CHARGE) col = TERM_RED;
-                                       }
-                                       else
-                                       {
-                                               strcat(dummy, format(" %-22.22s    %2d/%2d %3d%%", k_name + k_info[k_idx].name, (s16b)(p_ptr->magic_num1[ctr+ext]/EATER_CHARGE), p_ptr->magic_num2[ctr+ext], chance));
-                                               if (p_ptr->magic_num1[ctr+ext] < EATER_CHARGE) col = TERM_RED;
-                                       }
-                               }
-                               else
-                                       strcpy(dummy, "");
-                               c_prt(col, dummy, y1, x1);
-                       }
-               }
-
-               if (!get_com(out_val, &choice, FALSE)) break;
-
-               if (use_menu && choice != ' ')
-               {
-                       switch (choice)
-                       {
-                               case '0':
-                               {
-                                       screen_load();
-                                       return 0;
-                               }
-
-                               case '8':
-                               case 'k':
-                               case 'K':
-                               {
-                                       do
-                                       {
-                                               menu_line += EATER_EXT - 1;
-                                               if (menu_line > EATER_EXT) menu_line -= EATER_EXT;
-                                       } while(!p_ptr->magic_num2[menu_line+ext-1]);
-                                       break;
-                               }
-
-                               case '2':
-                               case 'j':
-                               case 'J':
-                               {
-                                       do
-                                       {
-                                               menu_line++;
-                                               if (menu_line > EATER_EXT) menu_line -= EATER_EXT;
-                                       } while(!p_ptr->magic_num2[menu_line+ext-1]);
-                                       break;
-                               }
-
-                               case '4':
-                               case 'h':
-                               case 'H':
-                               case '6':
-                               case 'l':
-                               case 'L':
-                               {
-                                       bool reverse = FALSE;
-                                       if ((choice == '4') || (choice == 'h') || (choice == 'H')) reverse = TRUE;
-                                       if (menu_line > EATER_EXT/2)
-                                       {
-                                               menu_line -= EATER_EXT/2;
-                                               reverse = TRUE;
-                                       }
-                                       else menu_line+=EATER_EXT/2;
-                                       while(!p_ptr->magic_num2[menu_line+ext-1])
-                                       {
-                                               if (reverse)
-                                               {
-                                                       menu_line--;
-                                                       if (menu_line < 2) reverse = FALSE;
-                                               }
-                                               else
-                                               {
-                                                       menu_line++;
-                                                       if (menu_line > EATER_EXT-1) reverse = TRUE;
-                                               }
-                                       }
-                                       break;
-                               }
-
-                               case 'x':
-                               case 'X':
-                               case '\r':
-                               {
-                                       i = menu_line - 1;
-                                       ask = FALSE;
-                                       break;
-                               }
-                       }
-               }
-
-               /* Request redraw */
-               if (use_menu && ask) continue;
-
-               /* Request redraw */
-               if (!use_menu && ((choice == ' ') || (choice == '*') || (choice == '?')))
-               {
-                       /* Hide the list */
-                       if (request_list)
-                       {
-                               /* Hide list */
-                               request_list = FALSE;
-                                                               screen_load();
-                               screen_save();
-                       }
-                       else
-                               request_list = TRUE;
-
-                       /* Redo asking */
-                       continue;
-               }
-
-               if (!use_menu)
-               {
-                       if (isalpha(choice))
-                       {
-                               /* Note verify */
-                               ask = (isupper(choice));
-
-                               /* Lowercase */
-                               if (ask) choice = (char)tolower(choice);
-
-                               /* 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 > EATER_EXT) || !p_ptr->magic_num2[i+ext])
-               {
-                       bell();
-                       continue;
-               }
-
-               if (!only_browse)
-               {
-                       /* Verify it */
-                       if (ask)
-                       {
-                               char tmp_val[160];
-
-                               /* Prompt */
-                               (void) strnfmt(tmp_val, 78, _("%sを使いますか? ", "Use %s?"), k_name + k_info[lookup_kind(tval ,i)].name);
-
-                               /* Belay that order */
-                               if (!get_check(tmp_val)) continue;
-                       }
-                       if (tval == TV_ROD)
-                       {
-                               if (p_ptr->magic_num1[ext+i]  > k_info[lookup_kind(tval, i)].pval * (p_ptr->magic_num2[ext+i] - 1) * EATER_ROD_CHARGE)
-                               {
-                                       msg_print(_("その魔法はまだ充填している最中だ。", "The magic are still charging."));
-                                       msg_print(NULL);
-                                       if (use_menu) ask = TRUE;
-                                       continue;
-                               }
-                       }
-                       else
-                       {
-                               if (p_ptr->magic_num1[ext+i] < EATER_CHARGE)
-                               {
-                                       msg_print(_("その魔法は使用回数が切れている。", "The magic has no charges left."));
-                                       msg_print(NULL);
-                                       if (use_menu) ask = TRUE;
-                                       continue;
-                               }
-                       }
-               }
-
-               /* Browse */
-               else
-               {
-                       int line, j;
-                       char temp[70 * 20];
-
-                       /* Clear lines, position cursor  (really should use strlen here) */
-                       Term_erase(7, 23, 255);
-                       Term_erase(7, 22, 255);
-                       Term_erase(7, 21, 255);
-                       Term_erase(7, 20, 255);
-
-                       roff_to_buf(k_text + k_info[lookup_kind(tval, i)].text, 62, temp, sizeof(temp));
-                       for (j = 0, line = 21; temp[j]; j += 1 + strlen(&temp[j]))
-                       {
-                               prt(&temp[j], line, 10);
-                               line++;
-                       }
-
-                       continue;
-               }
-
-               /* Stop the loop */
-               flag = TRUE;
-       }
-       screen_load();
-
-       if (!flag) return -1;
-
-       repeat_push(ext+i);
-       return ext+i;
-}
-
-
-/*!
- * @brief 取り込んだ魔力を利用するコマンドのメインルーチン /
- * Use eaten rod, wand or staff
- * @param only_browse 閲覧するだけならばTRUE
- * @param powerful 強力発動中の処理ならばTRUE
- * @return 実際にコマンドを実行したならばTRUEを返す。
- */
-bool do_cmd_magic_eater(bool only_browse, bool powerful)
-{
-       OBJECT_SUBTYPE_VALUE item;
-       PERCENTAGE chance;
-       DEPTH level;
-       KIND_OBJECT_IDX k_idx;
-       OBJECT_TYPE_VALUE tval;
-       OBJECT_SUBTYPE_VALUE sval;
-       bool use_charge = TRUE;
-
-       if (cmd_limit_confused(p_ptr)) return FALSE;
-
-       item = select_magic_eater(only_browse);
-       if (item == -1)
-       {
-               free_turn(p_ptr);
-               return FALSE;
-       }
-       if (item >= EATER_EXT*2) {tval = TV_ROD;sval = item - EATER_EXT*2;}
-       else if (item >= EATER_EXT) {tval = TV_WAND;sval = item - EATER_EXT;}
-       else {tval = TV_STAFF; sval = item;}
-       k_idx = lookup_kind(tval, sval);
-
-       level = (tval == TV_ROD ? k_info[k_idx].level * 5 / 6 - 5 : k_info[k_idx].level);
-       chance = level * 4 / 5 + 20;
-       chance -= 3 * (adj_mag_stat[p_ptr->stat_ind[mp_ptr->spell_stat]] - 1);
-       level /= 2;
-       if (p_ptr->lev > level)
-       {
-               chance -= 3 * (p_ptr->lev - level);
-       }
-       chance = mod_spell_chance_1(chance);
-       chance = MAX(chance, adj_mag_fail[p_ptr->stat_ind[mp_ptr->spell_stat]]);
-       /* Stunning makes spells harder */
-       if (p_ptr->stun > 50) chance += 25;
-       else if (p_ptr->stun) chance += 15;
-
-       if (chance > 95) chance = 95;
-
-       chance = mod_spell_chance_2(chance);
-
-       if (randint0(100) < chance)
-       {
-               if (flush_failure) flush();
-               
-               msg_print(_("呪文をうまく唱えられなかった!", "You failed to get the magic off!"));
-               sound(SOUND_FAIL);
-               if (randint1(100) >= chance)
-                       chg_virtue(p_ptr, V_CHANCE,-1);
-               take_turn(p_ptr, 100);
-
-               return TRUE;
-       }
-       else
-       {
-               DIRECTION dir = 0;
-
-               if (tval == TV_ROD)
-               {
-                       if ((sval >= SV_ROD_MIN_DIRECTION) && (sval != SV_ROD_HAVOC) && (sval != SV_ROD_AGGRAVATE) && (sval != SV_ROD_PESTICIDE))
-                               if (!get_aim_dir(&dir)) return FALSE;
-                       rod_effect(p_ptr, sval, dir, &use_charge, powerful, TRUE);
-                       if (!use_charge) return FALSE;
-               }
-               else if (tval == TV_WAND)
-               {
-                       if (!get_aim_dir(&dir)) return FALSE;
-                       wand_effect(sval, dir, powerful, TRUE);
-               }
-               else
-               {
-                       staff_effect(p_ptr, sval, &use_charge, powerful, TRUE, TRUE);
-                       if (!use_charge) return FALSE;
-               }
-               if (randint1(100) < chance)
-                       chg_virtue(p_ptr, V_CHANCE,1);
-       }
-       take_turn(p_ptr, 100);
-       if (tval == TV_ROD) p_ptr->magic_num1[item] += k_info[k_idx].pval * EATER_ROD_CHARGE;
-       else p_ptr->magic_num1[item] -= EATER_CHARGE;
-
-        return TRUE;
-}