-/* File: racial.c */
-
-/*
- * 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.
+/*!
+ * @file racial.c
+ * @brief ¥ì¥¤¥·¥ã¥ë¤ÈÆÍÁ³ÊѰۤε»Ç½½èÍý / Racial powers (and mutations)
+ * @date 2014/01/08
+ * @author
+ * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n
+ * This software may be copied and distributed for educational, research,\n
+ * and not for profit purposes provided that this copyright and statement\n
+ * are included in all such copies. Other copyrights may also apply.\n
+ * 2014 Deskull rearranged comment for Doxygen. \n
*/
-/* Purpose: Racial powers (and mutations) */
-
#include "angband.h"
-/*
+/*!
+ * @brief ÂоݤΥ¢¥¤¥Æ¥à¤¬Ìð¤ä¥¯¥í¥¹¥Ü¥¦¤ÎÌð¤ÎºàÎÁ¤Ë¤Ê¤ë¤«¤òÊÖ¤¹¡£/
* Hook to determine if an object is contertible in an arrow/bolt
+ * @param o_ptr ¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤ÂΤλ²¾È¥Ý¥¤¥ó¥¿¡£
+ * @return ºàÎÁ¤Ë¤Ç¤¤ë¤Ê¤éTRUE¤òÊÖ¤¹
*/
static bool item_tester_hook_convertible(object_type *o_ptr)
{
return (FALSE);
}
-
-/*
- * do_cmd_cast calls this function if the player's class
- * is 'archer'.
+/*!
+ * @brief ¥ì¥¤¥·¥ã¥ë¡ÖÃÆ/Ìð¤ÎÀ½Â¤¡×½èÍý / do_cmd_cast calls this function if the player's class is 'archer'.
+ * Hook to determine if an object is contertible in an arrow/bolt
+ * @return À½Â¤¤ò¼ÂºÝ¤Ë¹Ô¤Ã¤¿¤éTRUE¡¢¥¥ã¥ó¥»¥ë¤·¤¿¤éFALSE¤òÊÖ¤¹
*/
static bool do_cmd_archer(void)
{
}
else
{
+ s16b slot;
+
/* Get local object */
q_ptr = &forge;
apply_magic(q_ptr, p_ptr->lev, AM_NO_FIXED_ART);
q_ptr->discount = 99;
- (void)inven_carry(q_ptr);
+ slot = inven_carry(q_ptr);
object_desc(o_name, q_ptr, 0);
#ifdef JP
msg_print("You make some ammo.");
#endif
+ /* Auto-inscription */
+ if (slot >= 0) autopick_alter_item(slot, FALSE);
+
/* Destroy the wall */
cave_alter_feat(y, x, FF_HURT_ROCK);
- p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MONSTERS | PU_MON_LITE);
- p_ptr->window |= (PW_OVERHEAD);
+ p_ptr->update |= (PU_FLOW);
}
}
/**********Create arrows*********/
else if (ext == 2)
{
int item;
-
cptr q, s;
+ s16b slot;
item_tester_hook = item_tester_hook_convertible;
else
{
q_ptr = &o_list[0 - item];
- }
+ }
/* Get local object */
q_ptr = &forge;
floor_item_describe(0 - item);
floor_item_optimize(0 - item);
}
- (void)inven_carry(q_ptr);
+
+ slot = inven_carry(q_ptr);
+
+ /* Auto-inscription */
+ if (slot >= 0) autopick_alter_item(slot, FALSE);
}
/**********Create bolts*********/
else if (ext == 3)
{
int item;
-
cptr q, s;
+ s16b slot;
item_tester_hook = item_tester_hook_convertible;
floor_item_optimize(0 - item);
}
- (void)inven_carry(q_ptr);
+ slot = inven_carry(q_ptr);
+
+ /* Auto-inscription */
+ if (slot >= 0) autopick_alter_item(slot, FALSE);
}
return TRUE;
}
+/*!
+ * @brief ËâÆ»¶ñ½Ñ»Õ¤ÎËâÎϼè¤ê¹þ¤ß½èÍý
+ * @return ¼è¤ê¹þ¤ß¤ò¼Â¹Ô¤·¤¿¤éTRUE¡¢¥¥ã¥ó¥»¥ë¤·¤¿¤éFALSE¤òÊÖ¤¹
+ */
bool gain_magic(void)
{
int item;
return TRUE;
}
+/*!
+ * @brief ËâË¡·Ï¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤Ç¤¤ë¤«¤ÎȽÄê¤òÊÖ¤¹
+ * @return ËâË¡·Ï¥³¥Þ¥ó¥É¤ò»ÈÍѲÄǽ¤Ê¤éTRUE¡¢ÉÔ²Äǽ¤Ê¤é¤ÐÍýͳ¤ò¥á¥Ã¥»¡¼¥¸É½¼¨¤·¤ÆFALSE¤òÊÖ¤¹¡£
+ */
+static bool can_do_cmd_cast(void)
+{
+ if (dun_level && (d_info[dungeon_type].flags1 & DF1_NO_MAGIC))
+ {
+#ifdef JP
+ msg_print("¥À¥ó¥¸¥ç¥ó¤¬ËâË¡¤òµÛ¼ý¤·¤¿¡ª");
+#else
+ msg_print("The dungeon absorbs all attempted magic!");
+#endif
+ msg_print(NULL);
+ return FALSE;
+ }
+ else if (p_ptr->anti_magic)
+ {
+#ifdef JP
+ msg_print("È¿ËâË¡¥Ð¥ê¥¢¤¬ËâË¡¤ò¼ÙË⤷¤¿¡ª");
+#else
+ msg_print("An anti-magic shell disrupts your magic!");
+#endif
+ return FALSE;
+ }
+ else if (p_ptr->shero)
+ {
+#ifdef JP
+ msg_format("¶¸Àï»Î²½¤·¤Æ¤¤¤ÆƬ¤¬²ó¤é¤Ê¤¤¡ª");
+#else
+ msg_format("You cannot think directly!");
+#endif
+ return FALSE;
+ }
+ else
+ return TRUE;
+}
+/*!
+ * @brief ½¤¹ÔÁΤ齤¨ÀßÄê½èÍý
+ * @return ¹½¤¨¤òÊѲ½¤µ¤»¤¿¤éTRUE¡¢¹½¤¨ÉÔǽ¤«¥¥ã¥ó¥»¥ë¤·¤¿¤éFALSE¤òÊÖ¤¹¡£
+ */
static bool choose_kamae(void)
{
char choice;
screen_load();
return FALSE;
}
- else if ((choice == 'a') || (choice == 'A') || (choice == ESCAPE))
+ else if ((choice == 'a') || (choice == 'A'))
{
if (p_ptr->action == ACTION_KAMAE)
{
return TRUE;
}
+/*!
+ * @brief ·õ½Ñ²È¤Î·¿ÀßÄê½èÍý
+ * @return ·¿¤òÊѲ½¤µ¤»¤¿¤éTRUE¡¢·¿¤Î¹½¤¨ÉÔǽ¤«¥¥ã¥ó¥»¥ë¤·¤¿¤éFALSE¤òÊÖ¤¹¡£
+ */
static bool choose_kata(void)
{
char choice;
screen_load();
return FALSE;
}
- else if ((choice == 'a') || (choice == 'A') || (choice == ESCAPE))
+ else if ((choice == 'a') || (choice == 'A'))
{
if (p_ptr->action == ACTION_KATA)
{
}
+/*!
+ * @brief ¥ì¥¤¥·¥ã¥ë¡¦¥Ñ¥ï¡¼¾ðÊó¤Îtypedef
+ */
typedef struct power_desc_type power_desc_type;
+/*!
+ * @brief ¥ì¥¤¥·¥ã¥ë¡¦¥Ñ¥ï¡¼¾ðÊó¤Î¹½Â¤ÂÎÄêµÁ
+ */
struct power_desc_type
{
char name[40];
};
-/*
- * Returns the chance to activate a racial power/mutation
+/*!
+ * @brief ¥ì¥¤¥·¥ã¥ë¡¦¥Ñ¥ï¡¼¤ÎȯưÀ®¸ùΨ¤ò·×»»¤¹¤ë / Returns the chance to activate a racial power/mutation
+ * @param pd_ptr ȯư¤·¤¿¤¤¥ì¥¤¥·¥ã¥ë¡¦¥Ñ¥ï¡¼¾ðÊó¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
+ * @return À®¸ùΨ(%)¤òÊÖ¤¹
*/
static int racial_chance(power_desc_type *pd_ptr)
{
static int racial_cost;
-/*
- * Note: return value indicates that we have succesfully used the power
- * 1: Succeeded, 0: Cancelled, -1: Failed
+/*!
+ * @brief ¥ì¥¤¥·¥ã¥ë¡¦¥Ñ¥ï¡¼¤Îȯư¤ÎȽÄê½èÍý
+ * @param pd_ptr ȯư¤·¤¿¤¤¥ì¥¤¥·¥ã¥ë¡¦¥Ñ¥ï¡¼¾ðÊó¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
+ * @return
+ * ȯưÀ®¸ù¤Ê¤é¤Ð1¡¢È¯Æ°¼ºÇԤʤé¤Ð-1¡¢¥¥ã¥ó¥»¥ë¤Ê¤é¤Ð0¤òÊÖ¤¹¡£
+ * return value indicates that we have succesfully used the power 1: Succeeded, 0: Cancelled, -1: Failed
*/
static int racial_aux(power_desc_type *pd_ptr)
{
return -1;
}
+/*!
+ * @brief ¥ì¥¤¥·¥ã¥ë¡¦¥Ñ¥ï¡¼È¯Æ°»þ¤Ë¸ý¤ò»È¤¦·Ñ³Ū¤Ê±Ó¾§½èÍý¤òÃæÃǤ¹¤ë
+ * @return ¤Ê¤·
+ */
+void ratial_stop_mouth()
+{
+ if (music_singing_any()) stop_singing();
+ if (hex_spelling_any()) stop_hex_spell_all();
+}
+/*!
+ * @brief ¥ì¥¤¥·¥ã¥ë¡¦¥Ñ¥ï¡¼È¯Æ°½èÍý
+ * @param command ȯư¤¹¤ë¥ì¥¤¥·¥ã¥ë¤ÎID
+ * @return ½èÍý¤ò¼ÂºÝ¤Ë¼Â¹Ô¤·¤¿¾ì¹ç¤ÏTRUE¡¢¥¥ã¥ó¥»¥ë¤·¤¿¾ì¹çFALSE¤òÊÖ¤¹¡£
+ */
static bool cmd_racial_power_aux(s32b command)
{
s16b plev = p_ptr->lev;
}
break;
}
- case CLASS_MAGE:
case CLASS_HIGH_MAGE:
+ if (p_ptr->realm1 == REALM_HEX)
+ {
+ bool retval = stop_hex_spell();
+ if (retval) energy_use = 10;
+ return (retval);
+ }
+ case CLASS_MAGE:
+ /* case CLASS_HIGH_MAGE: */
case CLASS_SORCERER:
{
if (!eat_magic(p_ptr->lev * 2)) return FALSE;
#else
msg_print("You are failed to run away.");
#endif
- else teleport_player(30, FALSE);
+ else teleport_player(30, 0L);
}
else
{
break;
}
case CLASS_RANGER:
+ case CLASS_SNIPER:
{
#ifdef JP
msg_print("Ũ¤òÄ´ºº¤·¤¿...");
#else
msg_print("You glare nearby monsters...");
#endif
- slow_monsters();
+ slow_monsters(p_ptr->lev);
stun_monsters(p_ptr->lev * 4);
confuse_monsters(p_ptr->lev * 4);
turn_monsters(p_ptr->lev * 4);
#endif
return FALSE;
}
+ if (p_ptr->riding)
+ {
+#ifdef JP
+ msg_print("¾èÇÏÃæ¤Ï¤Ç¤¤Þ¤»¤ó¡£");
+#else
+ msg_print("You need to get off a pet.");
+#endif
+ return FALSE;
+ }
if (command == -3)
{
- if (choose_kamae()) energy_use = 100;
- else energy_use = 0;
+ if (!choose_kamae()) return FALSE;
p_ptr->update |= (PU_BONUS);
- p_ptr->redraw |= (PR_ARMOR);
}
else if (command == -4)
{
}
case CLASS_MAGIC_EATER:
{
- if (!gain_magic()) return FALSE;
+ if (command == -3) {
+ if (!gain_magic()) return FALSE;
+ } else if (command == -4) {
+ if (!can_do_cmd_cast()) return FALSE;
+ if (!do_cmd_magic_eater(FALSE, TRUE)) return FALSE;
+ }
break;
}
case CLASS_BARD:
}
case CLASS_RED_MAGE:
{
+ if (!can_do_cmd_cast()) return FALSE;
handle_stuff();
do_cmd_cast();
handle_stuff();
- if (!p_ptr->paralyzed)
+ if (!p_ptr->paralyzed && can_do_cmd_cast())
do_cmd_cast();
break;
}
}
else if (command == -4)
{
- if (!buki_motteruka(INVEN_RARM))
+ if (!buki_motteruka(INVEN_RARM) && !buki_motteruka(INVEN_LARM))
{
#ifdef JP
msg_print("Éð´ï¤ò»ý¤¿¤Ê¤¤¤È¤¤¤±¤Þ¤»¤ó¡£");
#endif
return FALSE;
}
- if (choose_kata()) energy_use = 100;
- else energy_use = 0;
+ if (!choose_kata()) return FALSE;
p_ptr->update |= (PU_BONUS);
- p_ptr->redraw |= (PR_ARMOR);
}
break;
}
}
case CLASS_NINJA:
{
- if (p_ptr->action == ACTION_HAYAGAKE) set_action(ACTION_NONE);
- else set_action(ACTION_HAYAGAKE);
+ if (p_ptr->action == ACTION_HAYAGAKE)
+ {
+ set_action(ACTION_NONE);
+ }
+ else
+ {
+ cave_type *c_ptr = &cave[py][px];
+ feature_type *f_ptr = &f_info[c_ptr->feat];
+
+ if (!have_flag(f_ptr->flags, FF_PROJECT) ||
+ (!p_ptr->levitation && have_flag(f_ptr->flags, FF_DEEP)))
+ {
+#ifdef JP
+ msg_print("¤³¤³¤Ç¤ÏÁÇÁ᤯ư¤±¤Ê¤¤¡£");
+#else
+ msg_print("You cannot run in here.");
+#endif
+ }
+ else
+ {
+ set_action(ACTION_HAYAGAKE);
+ }
+ }
+
+
energy_use = 0;
break;
}
+
}
}
else if (p_ptr->mimic_form)
{
int type = (one_in_(2) ? GF_NETHER : GF_FIRE);
if (!get_aim_dir(&dir)) return FALSE;
+ ratial_stop_mouth();
#ifdef JP
msg_format("¤¢¤Ê¤¿¤Ï%s¤Î¥Ö¥ì¥¹¤òÅǤ¤¤¿¡£",((type == GF_NETHER) ? "ÃϹö" : "²Ð±ê"));
#else
x = px + ddx[dir];
c_ptr = &cave[y][x];
+ ratial_stop_mouth();
+
if (!c_ptr->m_idx)
{
#ifdef JP
msg_print("Blink!");
#endif
- teleport_player(10, FALSE);
+ teleport_player(10, 0L);
break;
case RACE_HALF_ORC:
case RACE_HALF_GIANT:
if (!get_aim_dir(&dir)) return FALSE;
- (void)wall_to_mud(dir);
+ (void)wall_to_mud(dir, 20 + randint1(30));
break;
case RACE_HALF_TITAN:
case RACE_YEEK:
if (!get_aim_dir(&dir)) return FALSE;
+ ratial_stop_mouth();
#ifdef JP
msg_print("¿È¤ÎÌÓ¤â¤è¤À¤Ä¶«¤ÓÀ¼¤ò¾å¤²¤¿¡ª");
#else
case RACE_KLACKON:
if (!get_aim_dir(&dir)) return FALSE;
+ ratial_stop_mouth();
#ifdef JP
msg_print("»À¤òÅǤ¤¤¿¡£");
#else
}
}
+ ratial_stop_mouth();
+
#ifdef JP
msg_format("¤¢¤Ê¤¿¤Ï%s¤Î¥Ö¥ì¥¹¤òÅǤ¤¤¿¡£", Type_desc);
#else
x = px + ddx[dir];
c_ptr = &cave[y][x];
+ ratial_stop_mouth();
+
if (!c_ptr->m_idx)
{
#ifdef JP
case RACE_SPECTRE:
if (!get_aim_dir(&dir)) return FALSE;
+ ratial_stop_mouth();
#ifdef JP
msg_print("¤¢¤Ê¤¿¤Ï¤ª¤É¤í¤ª¤É¤í¤·¤¤¶«¤ÓÀ¼¤ò¤¢¤²¤¿¡ª");
#else
#endif
if (plev < 25) sleep_monsters_touch();
- else (void)sleep_monsters();
+ else (void)sleep_monsters(plev);
break;
case RACE_DEMON:
{
int type = (one_in_(2) ? GF_NETHER : GF_FIRE);
if (!get_aim_dir(&dir)) return FALSE;
+ ratial_stop_mouth();
#ifdef JP
msg_format("¤¢¤Ê¤¿¤Ï%s¤Î¥Ö¥ì¥¹¤òÅǤ¤¤¿¡£",((type == GF_NETHER) ? "ÃϹö" : "²Ð±ê"));
#else
}
break;
- case RACE_KUTA:
+ case RACE_KUTAR:
(void)set_tsubureru(randint1(20) + 30, FALSE);
break;
#else
msg_print("You fire a rocket.");
#endif
- fire_ball(GF_ROCKET, dir, plev * 5, 2);
+ fire_rocket(GF_ROCKET, dir, plev * 5, 2);
}
break;
return TRUE;
}
-
-/*
- * Allow user to choose a power (racial / mutation) to activate
+/*!
+ * @brief ¥ì¥¤¥·¥ã¥ë¡¦¥Ñ¥ï¡¼¥³¥Þ¥ó¥É¤Î¥á¥¤¥ó¥ë¡¼¥Á¥ó / Allow user to choose a power (racial / mutation) to activate
+ * @return ¤Ê¤·
*/
void do_cmd_racial_power(void)
{
power_desc[num++].number = -3;
break;
}
- case CLASS_MAGE:
case CLASS_HIGH_MAGE:
+ if (p_ptr->realm1 == REALM_HEX)
+ {
+#ifdef JP
+ strcpy(power_desc[num].name, "±Ó¾§¤ò¤ä¤á¤ë");
+#else
+ strcpy(power_desc[num].name, "Stop spelling");
+#endif
+ power_desc[num].level = 1;
+ power_desc[num].cost = 0;
+ power_desc[num].stat = A_INT;
+ power_desc[num].fail = 0;
+ power_desc[num++].number = -3;
+ break;
+ }
+ case CLASS_MAGE:
+ /* case CLASS_HIGH_MAGE: */
case CLASS_SORCERER:
{
#ifdef JP
break;
}
case CLASS_RANGER:
+ case CLASS_SNIPER:
{
#ifdef JP
strcpy(power_desc[num].name, "¥â¥ó¥¹¥¿¡¼Ä´ºº");
power_desc[num].stat = A_INT;
power_desc[num].fail = 0;
power_desc[num++].number = -3;
+
+ strcpy(power_desc[num].name, _("¶¯ÎÏȯư", "Powerful Activation"));
+ power_desc[num].level = 10;
+ power_desc[num].cost = 10 + (lvl - 10) / 2;
+ power_desc[num].stat = A_INT;
+ power_desc[num].fail = 0;
+ power_desc[num++].number = -4;
break;
}
case CLASS_BARD:
power_desc[num].fail = 20;
power_desc[num++].number = -1;
break;
- case RACE_KUTA:
+ case RACE_KUTAR:
#ifdef JP
strcpy(power_desc[num].name, "²£¤Ë¿¤Ó¤ë");
#else