+/*!
+ * @file snipe.c
+ * @brief スナイパー技能の実装 / Sniping
+ * @date 2014/01/18
+ * @author
+ * 2014 Deskull rearranged comment for Doxygen.\n
+ */
+
#include "angband.h"
+#include "player-status.h"
+#include "cmd-basic.h"
#define MAX_SNIPE_POWERS 16
+/*! スナイパー技能情報のtypedef */
typedef struct snipe_power snipe_power;
+
+/*! スナイパー技能情報の構造体 */
struct snipe_power
{
- int min_lev;
- int mana_cost;
- const char *name;
+ PLAYER_LEVEL min_lev;
+ MANA_POINT mana_cost;
+ concptr name;
};
-static const char *snipe_tips[MAX_SNIPE_POWERS] =
+/*! スナイパー技能の解説メッセージ */
+static concptr const snipe_tips[MAX_SNIPE_POWERS] =
{
#ifdef JP
- "Àº¿À¤ò½¸Ã椹¤ë¡£¼Í·â¤Î°ÒÎÏ¡¢ÀºÅÙ¤¬¾å¤¬¤ê¡¢¹âÅ٤ʼͷâ½Ñ¤¬»ÈÍѤǤ¤ë¤è¤¦¤Ë¤Ê¤ë¡£",
- "¸÷¤ëÌð¤òÊü¤Ä¡£¸÷¤Ë¼å¤¤¥â¥ó¥¹¥¿¡¼¤Ë°ÒÎϤòȯ´ø¤¹¤ë¡£",
- "¼Í·â¤ò¹Ô¤Ã¤¿¸å¡¢Ã»µ÷Î¥¤Î½Ö´Ö°ÜÆ°¤ò¹Ô¤¦¡£",
- "µ°Æ»¾å¤Î櫤ò¤¹¤Ù¤Æ̵¸ú¤Ë¤¹¤ëÄã¶õÈô¹Ô¤ÎÌð¤òÊü¤Ä¡£",
- "²Ð±ê°À¤ÎÌð¤òÊü¤Ä¡£",
- "ÊɤòÊ´ºÕ¤¹¤ëÌð¤òÊü¤Ä¡£´ä¤Ç¤Ç¤¤¿¥â¥ó¥¹¥¿¡¼¤È̵À¸Êª¤Î¥â¥ó¥¹¥¿¡¼¤Ë°ÒÎϤòȯ´ø¤¹¤ë¡£",
- "Î䵤°À¤ÎÌð¤òÊü¤Ä¡£",
- "Ũ¤òÆͤÈô¤Ð¤¹Ìð¤òÊü¤Ä¡£",
- "Ê£¿ô¤ÎŨ¤ò´ÓÄ̤¹¤ëÌð¤òÊü¤Ä¡£",
- "Á±Îɤʥâ¥ó¥¹¥¿¡¼¤Ë°ÒÎϤòȯ´ø¤¹¤ëÌð¤òÊü¤Ä¡£",
- "¼Ù°¤Ê¥â¥ó¥¹¥¿¡¼¤Ë°ÒÎϤòȯ´ø¤¹¤ëÌð¤òÊü¤Ä¡£",
- "Åö¤¿¤ë¤ÈÇúȯ¤¹¤ëÌð¤òÊü¤Ä¡£",
- "2²ó¼Í·â¤ò¹Ô¤¦¡£",
- "ÅÅ·â°À¤ÎÌð¤òÊü¤Ä¡£",
- "Ũ¤ÎµÞ½ê¤Ë¤á¤¬¤±¤ÆÌð¤òÊü¤Ä¡£À®¸ù¤¹¤ë¤ÈŨ¤ò°ì·â»à¤µ¤»¤ë¡£¼ºÇÔ¤¹¤ë¤È1¥À¥á¡¼¥¸¡£",
- "Á´¤Æ¤Î¥â¥ó¥¹¥¿¡¼¤Ë¹â°ÒÎϤòȯ´ø¤¹¤ëÌð¤òÊü¤Ä¡£È¿Æ°¤Ë¤è¤ëÉû¼¡¸ú²Ì¤ò¼õ¤±¤ë¡£",
+ "精神を集中する。射撃の威力、精度が上がり、高度な射撃術が使用できるようになる。",
+ "光る矢を放つ。光に弱いモンスターに威力を発揮する。",
+ "射撃を行った後、短距離の瞬間移動を行う。",
+ "軌道上の罠をすべて無効にする低空飛行の矢を放つ。",
+ "火炎属性の矢を放つ。",
+ "壁を粉砕する矢を放つ。岩でできたモンスターと無生物のモンスターに威力を発揮する。",
+ "冷気属性の矢を放つ。",
+ "敵を突き飛ばす矢を放つ。",
+ "複数の敵を貫通する矢を放つ。",
+ "善良なモンスターに威力を発揮する矢を放つ。",
+ "邪悪なモンスターに威力を発揮する矢を放つ。",
+ "当たると爆発する矢を放つ。",
+ "2回射撃を行う。",
+ "電撃属性の矢を放つ。",
+ "敵の急所にめがけて矢を放つ。成功すると敵を一撃死させる。失敗すると1ダメージ。",
+ "全てのモンスターに高威力を発揮する矢を放つ。反動による副次効果を受ける。",
#else
"Concentrate your mind fot shooting.",
"Shot an allow with brightness.",
#endif
};
-snipe_power snipe_powers[MAX_SNIPE_POWERS] =
+/*! スナイパー技能テーブル */
+static snipe_power const snipe_powers[MAX_SNIPE_POWERS] =
{
/* Level gained, cost, name */
#ifdef JP
- { 1, 0, "Àº¿À½¸Ãæ" },
- { 2, 1, "¥Õ¥é¥Ã¥·¥å¥¢¥í¡¼" },
- { 3, 1, "¥·¥å¡¼¥È¡õ¥¢¥¦¥§¥¤" },
- { 5, 1, "²ò½ü¤ÎÌð" },
- { 8, 2, "²Ð±ê¤ÎÌð" },
- { 10, 2, "´äºÕ¤" },
- { 13, 2, "Î䵤¤ÎÌð" },
- { 18, 2, "ÎõÉ÷ÃÆ"},
- { 22, 3, "´ÓÄÌÃÆ" },
- { 25, 4, "¼ÙÇ°ÃÆ"},
- { 26, 4, "ÇËËâÌð" },
- { 30, 3, "Çúȯ¤ÎÌð"},
- { 32, 4, "¥À¥Ö¥ë¥·¥ç¥Ã¥È" },
- { 36, 3, "¥×¥é¥º¥Þ¥Ü¥ë¥È" },
- { 40, 3, "¥Ë¡¼¥É¥ë¥·¥ç¥Ã¥È" },
- { 48, 7, "¥»¥¤¥ó¥È¥¹¥¿¡¼¥¢¥í¡¼" },
+ { 1, 0, "精神集中" },
+ { 2, 1, "ã\83\95ã\83©ã\83\83ã\82·ã\83¥ã\82¢ã\83ã\83¼" },
+ { 3, 1, "ã\82·ã\83¥ã\83¼ã\83\88ï¼\86ã\82¢ã\82¦ã\82§ã\82¤" },
+ { 5, 1, "解除の矢" },
+ { 8, 2, "火炎の矢" },
+ { 10, 2, "岩砕き" },
+ { 13, 2, "冷気の矢" },
+ { 18, 2, "烈風弾"},
+ { 22, 3, "貫通弾" },
+ { 25, 4, "邪念弾"},
+ { 26, 4, "破魔矢" },
+ { 30, 3, "爆発の矢"},
+ { 32, 4, "ダブルショット" },
+ { 36, 3, "プラズマボルト" },
+ { 40, 3, "ニードルショット" },
+ { 48, 7, "ã\82»ã\82¤ã\83³ã\83\88ã\82¹ã\82¿ã\83¼ã\82¢ã\83ã\83¼" },
#else
{ 1, 0, "Concentration" },
{ 2, 1, "Flush Arrow" },
#endif
};
-
+/*!
+ * @brief スナイパーの集中度加算
+ * @return 常にTRUEを返す
+ */
static bool snipe_concentrate(void)
{
if ((int)p_ptr->concent < (2 + (p_ptr->lev + 5) / 10)) p_ptr->concent++;
-#ifdef JP
- msg_format("½¸Ã椷¤¿¡£(½¸ÃæÅÙ %d)", p_ptr->concent);
-#else
- msg_format("You concentrate deeply. (lvl %d)", p_ptr->concent);
-#endif
-
+ msg_format(_("集中した。(集中度 %d)", "You concentrate deeply. (lvl %d)"), p_ptr->concent);
reset_concent = FALSE;
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
+ p_ptr->update |= (PU_BONUS | PU_MONSTERS);
p_ptr->redraw |= (PR_STATUS);
-
- /* Update the monsters */
- p_ptr->update |= (PU_MONSTERS);
-
return (TRUE);
}
+/*!
+ * @brief スナイパーの集中度リセット
+ * @param msg TRUEならばメッセージを表示する
+ * @return なし
+ */
void reset_concentration(bool msg)
{
if (msg)
{
-#ifdef JP
- msg_print("½¸ÃæÎϤ¬ÅÓÀÚ¤ì¤Æ¤·¤Þ¤Ã¤¿¡£");
-#else
- msg_print("Stop concentrating.");
-#endif
+ msg_print(_("集中力が途切れてしまった。", "Stop concentrating."));
}
p_ptr->concent = 0;
reset_concent = FALSE;
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
+ p_ptr->update |= (PU_BONUS | PU_MONSTERS);
p_ptr->redraw |= (PR_STATUS);
-
- /* Update the monsters */
- p_ptr->update |= (PU_MONSTERS);
}
+/*!
+ * @brief スナイパーの集中度によるダメージボーナスを加算する
+ * @param tdam 算出中のダメージ
+ * @return 集中度修正を加えたダメージ
+ */
int boost_concentration_damage(int tdam)
{
tdam *= (10 + p_ptr->concent);
return (tdam);
}
+/*!
+ * @brief スナイパーの技能リストを表示する
+ * @return なし
+ */
void display_snipe_list(void)
{
- int i;
- int y = 1;
- int x = 1;
- int plev = p_ptr->lev;
+ int i;
+ TERM_LEN y = 1;
+ TERM_LEN x = 1;
+ PLAYER_LEVEL plev = p_ptr->lev;
snipe_power spell;
char psi_desc[80];
/* Display a list of spells */
prt("", y, x);
-#ifdef JP
- put_str("̾Á°", y, x + 5);
- put_str("Lv MP", y, x + 35);
-#else
- put_str("Name", y, x + 5);
- put_str("Lv Mana", y, x + 35);
-#endif
+ put_str(_("名前", "Name"), y, x + 5);
+ put_str(_("Lv MP", "Lv Mana"), y, x + 35);
- /* Dump the spells */
for (i = 0; i < MAX_SNIPE_POWERS; i++)
{
/* Access the available spell */
if (spell.min_lev > plev) continue;
if (spell.mana_cost > (int)p_ptr->concent) continue;
- /* Dump the spell */
sprintf(psi_desc, " %c) %-30s%2d %4d",
I2A(i), spell.name, spell.min_lev, spell.mana_cost);
}
-/*
- * Allow user to choose a mindcrafter power.
- *
- * 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
- *
- * nb: This function has a (trivial) display bug which will be obvious
- * when you run it. It's probably easy to fix but I haven't tried,
- * sorry.
+/*!
+ * @brief スナイパー技能を選択する
+ * @param sn 選択した特殊技能ID、キャンセルの場合-1、不正な選択の場合-2を返す
+ * @param only_browse 一覧を見るだけの場合TRUEを返す
+ * @return 発動可能な魔法を選択した場合TRUE、キャンセル処理か不正な選択が行われた場合FALSEを返す。
+ * Allow user to choose a mindcrafter power.\n
+ *\n
+ * If a valid spell is chosen, saves it in '*sn' and returns TRUE\n
+ * If the user hits escape, returns FALSE, and set '*sn' to -1\n
+ * If there are no legal choices, returns FALSE, and sets '*sn' to -2\n
+ *\n
+ * The "prompt" should be "cast", "recite", or "study"\n
+ * The "known" should be TRUE for cast/pray, FALSE for study\n
+ *\n
+ * nb: This function has a (trivial) display bug which will be obvious\n
+ * when you run it. It's probably easy to fix but I haven't tried,\n
+ * sorry.\n
*/
-static int get_snipe_power(int *sn, bool only_browse)
+static int get_snipe_power(COMMAND_CODE *sn, bool only_browse)
{
- int i;
+ COMMAND_CODE i;
int num = 0;
- int y = 1;
- int x = 20;
- int plev = p_ptr->lev;
+ TERM_LEN y = 1;
+ TERM_LEN x = 20;
+ PLAYER_LEVEL plev = p_ptr->lev;
int ask;
char choice;
char out_val[160];
-#ifdef JP
- cptr p = "¼Í·â½Ñ";
-#else
- cptr p = "power";
-#endif
+ concptr p = _("射撃術", "power");
snipe_power spell;
bool flag, redraw;
-#ifdef ALLOW_REPEAT /* TNB */
-
repeat_push(*sn);
/* Assume cancelled */
}
}
-#endif /* ALLOW_REPEAT -- TNB */
-
/* Nothing chosen yet */
flag = FALSE;
/* Build a prompt (accept all spells) */
if (only_browse)
{
-#ifdef JP
- (void)strnfmt(out_val, 78, "(%^s %c-%c, '*'¤Ç°ìÍ÷, ESC) ¤É¤Î%s¤Ë¤Ä¤¤¤ÆÃΤê¤Þ¤¹¤«¡©",
-#else
- (void)strnfmt(out_val, 78, "(%^ss %c-%c, *=List, ESC=exit) Use which %s? ",
-#endif
- p, I2A(0), I2A(num), p);
+ (void)strnfmt(out_val, 78,
+ _("(%^s %c-%c, '*'で一覧, ESC) どの%sについて知りますか?", "(%^ss %c-%c, *=List, ESC=exit) Use which %s? "),
+ p, I2A(0), I2A(num), p);
}
else
{
-#ifdef JP
- (void)strnfmt(out_val, 78, "(%^s %c-%c, '*'¤Ç°ìÍ÷, ESC) ¤É¤Î%s¤ò»È¤¤¤Þ¤¹¤«¡©",
-#else
- (void)strnfmt(out_val, 78, "(%^ss %c-%c, *=List, ESC=exit) Use which %s? ",
-#endif
- p, I2A(0), I2A(num), p);
+ (void)strnfmt(out_val, 78,
+ _("(%^s %c-%c, '*'で一覧, ESC) どの%sを使いますか?", "(%^ss %c-%c, *=List, ESC=exit) Use which %s? "),
+ p, I2A(0), I2A(num), p);
}
- /* Get a spell from the user */
choice = always_show_list ? ESCAPE : 1;
while (!flag)
{
if (!redraw)
{
char psi_desc[80];
-
- /* Show list */
redraw = TRUE;
-
- /* Save the screen */
if (!only_browse) screen_save();
/* Display a list of spells */
prt("", y, x);
-#ifdef JP
- put_str("̾Á°", y, x + 5);
- if (only_browse) put_str("Lv ½¸ÃæÅÙ", y, x + 35);
-#else
- put_str("Name", y, x + 5);
- if (only_browse) put_str("Lv Pow", y, x + 35);
-#endif
+ put_str(_("名前", "Name"), y, x + 5);
+ if (only_browse) put_str(_("Lv 集中度", "Lv Pow"), y, x + 35);
/* Dump the spells */
for (i = 0; i < MAX_SNIPE_POWERS; i++)
{
/* Hide list */
redraw = FALSE;
-
- /* Restore the screen */
if (!only_browse) screen_load();
}
ask = isupper(choice);
/* Lowercase */
- if (ask) choice = tolower(choice);
+ if (ask) choice = (char)tolower(choice);
/* Extract request */
i = (islower(choice) ? A2I(choice) : -1);
char tmp_val[160];
/* Prompt */
-#ifdef JP
- (void) strnfmt(tmp_val, 78, "%s¤ò»È¤¤¤Þ¤¹¤«¡©", snipe_powers[i].name);
-#else
- (void)strnfmt(tmp_val, 78, "Use %s? ", snipe_powers[i].name);
-#endif
+ (void) strnfmt(tmp_val, 78, _("%sを使いますか?", "Use %s? "), snipe_powers[i].name);
/* Belay that order */
if (!get_check(tmp_val)) continue;
/* Stop the loop */
flag = TRUE;
}
-
- /* Restore the screen */
if (redraw && !only_browse) screen_load();
- /* Show choices */
p_ptr->window |= (PW_SPELL);
-
- /* Window stuff */
- window_stuff();
+ handle_stuff();
/* Abort if needed */
if (!flag) return (FALSE);
/* Save the choice */
(*sn) = i;
-#ifdef ALLOW_REPEAT /* TNB */
-
repeat_push(*sn);
-#endif /* ALLOW_REPEAT -- TNB */
-
/* Success */
return (TRUE);
}
-
-int tot_dam_aux_snipe (int mult, monster_type *m_ptr)
+/*!
+ * @brief スナイバー技能のスレイ倍率計算を行う /
+ * Calcurate magnification of snipe technics
+ * @param mult スナイバー技能のスレイ効果以前に算出している多要素の倍率(/10倍)
+ * @param m_ptr 目標となるモンスターの構造体参照ポインタ
+ * @return スレイの倍率(/10倍)
+ */
+MULTIPLY tot_dam_aux_snipe(MULTIPLY mult, monster_type *m_ptr, SPELL_IDX snipe_type)
{
monster_race *r_ptr = &r_info[m_ptr->r_idx];
bool seen = is_seen(m_ptr);
case SP_LITE:
if (r_ptr->flags3 & (RF3_HURT_LITE))
{
- int n = 20 + p_ptr->concent;
+ MULTIPLY n = 20 + p_ptr->concent;
if (seen) r_ptr->r_flags3 |= (RF3_HURT_LITE);
if (mult < n) mult = n;
}
}
else
{
- int n = 15 + (p_ptr->concent * 3);
+ MULTIPLY n = 15 + (p_ptr->concent * 3);
if (mult < n) mult = n;
}
break;
}
else
{
- int n = 15 + (p_ptr->concent * 3);
+ MULTIPLY n = 15 + (p_ptr->concent * 3);
if (mult < n) mult = n;
}
break;
}
else
{
- int n = 18 + (p_ptr->concent * 4);
+ MULTIPLY n = 18 + (p_ptr->concent * 4);
if (mult < n) mult = n;
}
break;
case SP_KILL_WALL:
if (r_ptr->flags3 & RF3_HURT_ROCK)
{
- int n = 15 + (p_ptr->concent * 2);
+ MULTIPLY n = 15 + (p_ptr->concent * 2);
if (seen) r_ptr->r_flags3 |= RF3_HURT_ROCK;
if (mult < n) mult = n;
}
else if (r_ptr->flags3 & RF3_NONLIVING)
{
- int n = 15 + (p_ptr->concent * 2);
+ MULTIPLY n = 15 + (p_ptr->concent * 2);
if (seen) r_ptr->r_flags3 |= RF3_NONLIVING;
if (mult < n) mult = n;
}
case SP_EVILNESS:
if (r_ptr->flags3 & RF3_GOOD)
{
- int n = 15 + (p_ptr->concent * 4);
+ MULTIPLY n = 15 + (p_ptr->concent * 4);
if (seen) r_ptr->r_flags3 |= RF3_GOOD;
if (mult < n) mult = n;
}
case SP_HOLYNESS:
if (r_ptr->flags3 & RF3_EVIL)
{
- int n = 12 + (p_ptr->concent * 3);
+ MULTIPLY n = 12 + (p_ptr->concent * 3);
if (seen) r_ptr->r_flags3 |= RF3_EVIL;
if (r_ptr->flags3 & (RF3_HURT_LITE))
{
return (mult);
}
-/*
- * do_cmd_cast calls this function if the player's class
- * is 'mindcrafter'.
+
+/*!
+ * @brief スナイパー技能の発動 /
+ * do_cmd_cast calls this function if the player's class is 'snipe'.
+ * @param spell 発動する特殊技能のID
+ * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
*/
static bool cast_sniper_spell(int spell)
{
- bool flag = FALSE;
object_type *o_ptr = &inventory[INVEN_BOW];
+ SPELL_IDX snipe_type = SP_NONE;
if (o_ptr->tval != TV_BOW)
{
-#ifdef JP
- msg_print("µÝ¤òÁõÈ÷¤·¤Æ¤¤¤Ê¤¤¡ª");
-#else
- msg_print("You wield no bow!");
-#endif
+ msg_print(_("弓を装備していない!", "You wield no bow!"));
return (FALSE);
}
{
case 0: /* Concentration */
if (!snipe_concentrate()) return (FALSE);
- energy_use = 100;
+ take_turn(p_ptr, 100);
return (TRUE);
case 1: snipe_type = SP_LITE; break;
case 2: snipe_type = SP_AWAY; break;
case 14: snipe_type = SP_NEEDLE; break;
case 15: snipe_type = SP_FINAL; break;
default:
-#ifdef JP
- msg_print("¤Ê¤Ë¡©");
-#else
- msg_print("Zap?");
-#endif
+ msg_print(_("なに?", "Zap?"));
}
command_cmd = 'f';
- do_cmd_fire();
- snipe_type = 0;
+ do_cmd_fire(snipe_type);
return (is_fired);
}
-
-/*
- * do_cmd_cast calls this function if the player's class
- * is 'mindcrafter'.
+/*!
+ * @brief スナイパー技能コマンドのメインルーチン /
+ * @return なし
*/
void do_cmd_snipe(void)
{
- int n = 0;
- int plev = p_ptr->lev;
- int old_chp = p_ptr->chp;
- snipe_power spell;
- bool cast;
-
-
- /* not if confused */
- if (p_ptr->confused)
- {
-#ifdef JP
- msg_print("º®Í𤷤Ƥ¤¤Æ½¸Ãæ¤Ç¤¤Ê¤¤¡ª");
-#else
- msg_print("You are too confused!");
-#endif
- return;
- }
-
- /* not if hullucinated */
- if (p_ptr->image)
- {
-#ifdef JP
- msg_print("¸¸³Ð¤¬¸«¤¨¤Æ½¸Ãæ¤Ç¤¤Ê¤¤¡ª");
-#else
- msg_print("You are too hallucinated!");
-#endif
- return;
- }
+ COMMAND_CODE n = 0;
+ bool cast;
- /* not if stuned */
- if (p_ptr->stun)
- {
-#ifdef JP
- msg_print("Ƭ¤¬Û¯Û°¤È¤·¤Æ¤¤¤Æ½¸Ãæ¤Ç¤¤Ê¤¤¡ª");
-#else
- msg_print("You are too stuned!");
-#endif
- return;
- }
+ if(cmd_limit_confused(p_ptr)) return;
+ if(cmd_limit_image(p_ptr)) return;
+ if(cmd_limit_stun(p_ptr)) return;
- /* get power */
if (!get_snipe_power(&n, FALSE)) return;
- spell = snipe_powers[n];
-
sound(SOUND_SHOOT);
-
- /* Cast the spell */
cast = cast_sniper_spell(n);
if (!cast) return;
-#if 0
- /* Take a turn */
- energy_use = 100;
-#endif
- /* Redraw mana */
p_ptr->redraw |= (PR_HP | PR_MANA);
-
- /* Window stuff */
p_ptr->window |= (PW_PLAYER);
p_ptr->window |= (PW_SPELL);
}
-/*
- * do_cmd_cast calls this function if the player's class
- * is 'mindcrafter'.
+/*!
+ * @brief スナイパー技能コマンドの表示 /
+ * @return なし
*/
void do_cmd_snipe_browse(void)
{
- int n = 0;
+ COMMAND_CODE n = 0;
int j, line;
char temp[62 * 4];
while(1)
{
- /* get power */
if (!get_snipe_power(&n, TRUE))
{
screen_load();