<ClCompile Include="..\..\src\io\input-key-acceptor.c" />\r
<ClCompile Include="..\..\src\io\input-key-requester.c" />\r
<ClCompile Include="..\..\src\locale\vowel-checker.c" />\r
+ <ClCompile Include="..\..\src\mind\mind-mage.c" />\r
<ClCompile Include="..\..\src\mind\racial-kutar.c" />\r
<ClCompile Include="..\..\src\mind\stances-table.c" />\r
<ClCompile Include="..\..\src\player\bad-status-setter.c" />\r
<ClInclude Include="..\..\src\locale\language-switcher.h" />\r
<ClInclude Include="..\..\src\locale\vowel-checker.h" />\r
<ClInclude Include="..\..\src\mind\mind-blue-mage.h" />\r
+ <ClInclude Include="..\..\src\mind\mind-mage.h" />\r
<ClInclude Include="..\..\src\mind\racial-kutar.h" />\r
<ClInclude Include="..\..\src\mind\stances-table.h" />\r
<ClInclude Include="..\..\src\mspell\monster-power-table.h" />\r
<ClCompile Include="..\..\src\spell-kind\spells-perception.c">
<Filter>spell-kind</Filter>
</ClCompile>
+ <ClCompile Include="..\..\src\mind\mind-mage.c">
+ <Filter>mind</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\src\cmd\cmd-basic.h">
<ClInclude Include="..\..\src\spell-kind\spells-perception.h">
<Filter>spell-kind</Filter>
</ClInclude>
+ <ClInclude Include="..\..\src\mind\mind-mage.h">
+ <Filter>mind</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="..\..\src\wall.bmp" />
mind/mind-blue-mage.h \
mind/mind-cavalry.c mind/mind-cavalry.h \
mind/mind-force-trainer.c mind/mind-force-trainer.h \
+ mind/mind-mage.c mind/mind-mage.h \
mind/mind-mindcrafter.c mind/mind-mindcrafter.h \
mind/mind-mirror-master.c mind/mind-mirror-master.h \
mind/mind-ninja.c mind/mind-ninja.h \
#include "io/targeting.h"
#include "main/sound-definitions-table.h"
#include "main/sound-of-music.h"
+#include "mind/mind-mage.h"
#include "monster-race/monster-race.h"
#include "monster-race/race-flags1.h"
#include "monster-race/race-flags-resistance.h"
player_ptr->health_who = m_idx;
player_ptr->redraw |= (PR_HEALTH);
}
+
+bool update_player(player_type *caster_ptr)
+{
+ caster_ptr->update |= PU_COMBINE | PU_REORDER;
+ caster_ptr->window |= PW_INVEN;
+ return TRUE;
+}
+
+bool redraw_player(player_type *caster_ptr)
+{
+ if (caster_ptr->csp > caster_ptr->msp) {
+ caster_ptr->csp = caster_ptr->msp;
+ }
+
+ caster_ptr->redraw |= PR_MANA;
+ caster_ptr->update |= PU_COMBINE | PU_REORDER;
+ caster_ptr->window |= PW_INVEN;
+ return TRUE;
+}
void monster_race_track(player_type *player_ptr, MONRACE_IDX r_idx);
void object_kind_track(player_type *player_ptr, KIND_OBJECT_IDX k_idx);
void health_track(player_type *player_ptr, MONSTER_IDX m_idx);
+
+bool update_player(player_type *caster_ptr);
+bool redraw_player(player_type *caster_ptr);
--- /dev/null
+#include "mind/mind-mage.h"
+#include "core/stuff-handler.h"
+#include "inventory/inventory-object.h"
+#include "inventory/player-inventory.h"
+#include "object-enchant/special-object-flags.h"
+#include "object/item-use-flags.h"
+#include "object/object-flavor.h"
+#include "object/object-hook.h"
+#include "object/object-kind.h"
+#include "player/player-class.h"
+#include "system/object-type-definition.h"
+#include "view/display-messages.h"
+
+/*!
+ * @brief 魔力食い処理
+ * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param power 基本効力
+ * @return ターンを消費した場合TRUEを返す
+ */
+bool eat_magic(player_type *caster_ptr, int power)
+{
+ byte fail_type = 1;
+ GAME_TEXT o_name[MAX_NLEN];
+
+ item_tester_hook = item_tester_hook_recharge;
+
+ concptr q = _("どのアイテムから魔力を吸収しますか?", "Drain which item? ");
+ concptr s = _("魔力を吸収できるアイテムがありません。", "You have nothing to drain.");
+
+ object_type *o_ptr;
+ OBJECT_IDX item;
+ o_ptr = choose_object(caster_ptr, &item, q, s, (USE_INVEN | USE_FLOOR), 0);
+ if (!o_ptr)
+ return FALSE;
+
+ object_kind *k_ptr;
+ k_ptr = &k_info[o_ptr->k_idx];
+ DEPTH lev = k_info[o_ptr->k_idx].level;
+
+ int recharge_strength = 0;
+ bool is_eating_successful = TRUE;
+ if (o_ptr->tval == TV_ROD) {
+ recharge_strength = ((power > lev / 2) ? (power - lev / 2) : 0) / 5;
+ if (one_in_(recharge_strength)) {
+ is_eating_successful = FALSE;
+ } else {
+ if (o_ptr->timeout > (o_ptr->number - 1) * k_ptr->pval) {
+ msg_print(_("充填中のロッドから魔力を吸収することはできません。", "You can't absorb energy from a discharged rod."));
+ } else {
+ caster_ptr->csp += lev;
+ o_ptr->timeout += k_ptr->pval;
+ }
+ }
+ } else {
+ recharge_strength = (100 + power - lev) / 15;
+ if (recharge_strength < 0)
+ recharge_strength = 0;
+
+ if (one_in_(recharge_strength)) {
+ is_eating_successful = FALSE;
+ } else {
+ if (o_ptr->pval > 0) {
+ caster_ptr->csp += lev / 2;
+ o_ptr->pval--;
+
+ if ((o_ptr->tval == TV_STAFF) && (item >= 0) && (o_ptr->number > 1)) {
+ object_type forge;
+ object_type *q_ptr;
+ q_ptr = &forge;
+ object_copy(q_ptr, o_ptr);
+
+ q_ptr->number = 1;
+ o_ptr->pval++;
+ o_ptr->number--;
+ caster_ptr->total_weight -= q_ptr->weight;
+ item = store_item_to_inventory(caster_ptr, q_ptr);
+
+ msg_print(_("杖をまとめなおした。", "You unstack your staff."));
+ }
+ } else {
+ msg_print(_("吸収できる魔力がありません!", "There's no energy there to absorb!"));
+ }
+
+ if (!o_ptr->pval)
+ o_ptr->ident |= IDENT_EMPTY;
+ }
+ }
+
+ if (is_eating_successful) {
+ return redraw_player(caster_ptr);
+ }
+
+ if (object_is_fixed_artifact(o_ptr)) {
+ object_desc(caster_ptr, o_name, o_ptr, OD_NAME_ONLY);
+ msg_format(_("魔力が逆流した!%sは完全に魔力を失った。", "The recharging backfires - %s is completely drained!"), o_name);
+ if (o_ptr->tval == TV_ROD)
+ o_ptr->timeout = k_ptr->pval * o_ptr->number;
+ else if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_STAFF))
+ o_ptr->pval = 0;
+
+ return redraw_player(caster_ptr);
+ }
+
+ object_desc(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
+
+ /* Mages recharge objects more safely. */
+ if (IS_WIZARD_CLASS(caster_ptr)) {
+ /* 10% chance to blow up one rod, otherwise draining. */
+ if (o_ptr->tval == TV_ROD) {
+ if (one_in_(10))
+ fail_type = 2;
+ else
+ fail_type = 1;
+ }
+ /* 75% chance to blow up one wand, otherwise draining. */
+ else if (o_ptr->tval == TV_WAND) {
+ if (!one_in_(3))
+ fail_type = 2;
+ else
+ fail_type = 1;
+ }
+ /* 50% chance to blow up one staff, otherwise no effect. */
+ else if (o_ptr->tval == TV_STAFF) {
+ if (one_in_(2))
+ fail_type = 2;
+ else
+ fail_type = 0;
+ }
+ }
+
+ /* All other classes get no special favors. */
+ else {
+ /* 33% chance to blow up one rod, otherwise draining. */
+ if (o_ptr->tval == TV_ROD) {
+ if (one_in_(3))
+ fail_type = 2;
+ else
+ fail_type = 1;
+ }
+ /* 20% chance of the entire stack, else destroy one wand. */
+ else if (o_ptr->tval == TV_WAND) {
+ if (one_in_(5))
+ fail_type = 3;
+ else
+ fail_type = 2;
+ }
+ /* Blow up one staff. */
+ else if (o_ptr->tval == TV_STAFF) {
+ fail_type = 2;
+ }
+ }
+
+ if (fail_type == 1) {
+ if (o_ptr->tval == TV_ROD) {
+ msg_format(_("ロッドは破損を免れたが、魔力は全て失なわれた。", "You save your rod from destruction, but all charges are lost."), o_name);
+ o_ptr->timeout = k_ptr->pval * o_ptr->number;
+ } else if (o_ptr->tval == TV_WAND) {
+ msg_format(_("%sは破損を免れたが、魔力が全て失われた。", "You save your %s from destruction, but all charges are lost."), o_name);
+ o_ptr->pval = 0;
+ }
+ }
+
+ if (fail_type == 2) {
+ if (o_ptr->number > 1) {
+ msg_format(_("乱暴な魔法のために%sが一本壊れた!", "Wild magic consumes one of your %s!"), o_name);
+ /* Reduce rod stack maximum timeout, drain wands. */
+ if (o_ptr->tval == TV_ROD)
+ o_ptr->timeout = MIN(o_ptr->timeout, k_ptr->pval * (o_ptr->number - 1));
+ else if (o_ptr->tval == TV_WAND)
+ o_ptr->pval = o_ptr->pval * (o_ptr->number - 1) / o_ptr->number;
+ } else {
+ msg_format(_("乱暴な魔法のために%sが何本か壊れた!", "Wild magic consumes your %s!"), o_name);
+ }
+
+ vary_item(caster_ptr, item, -1);
+ }
+
+ if (fail_type == 3) {
+ if (o_ptr->number > 1)
+ msg_format(_("乱暴な魔法のために%sが全て壊れた!", "Wild magic consumes all your %s!"), o_name);
+ else
+ msg_format(_("乱暴な魔法のために%sが壊れた!", "Wild magic consumes your %s!"), o_name);
+
+ vary_item(caster_ptr, item, -999);
+ }
+
+ return redraw_player(caster_ptr);
+}
--- /dev/null
+#pragma once
+
+#include "system/angband.h"
+
+bool eat_magic(player_type *caster_ptr, int power);
#include "melee/melee-postprocess.h"
#include "mind/mind-cavalry.h"
#include "mind/mind-force-trainer.h"
+#include "mind/mind-mage.h"
#include "mind/mind-mirror-master.h"
#include "mind/mind-ninja.h"
#include "mind/mind-samurai.h"
break;
}
case CLASS_HIGH_MAGE:
- if (creature_ptr->realm1 == REALM_HEX)
- {
- bool retval = stop_hex_spell(creature_ptr);
- if (retval) creature_ptr->energy_use = 10;
- return (retval);
- }
+ if (creature_ptr->realm1 == REALM_HEX)
+ {
+ bool retval = stop_hex_spell(creature_ptr);
+ if (retval)
+ creature_ptr->energy_use = 10;
+
+ return retval;
+ }
+
/* Fall through */
case CLASS_MAGE:
- /* case CLASS_HIGH_MAGE: */
case CLASS_SORCERER:
{
- if (!eat_magic(creature_ptr, creature_ptr->lev * 2)) return FALSE;
+ if (!eat_magic(creature_ptr, creature_ptr->lev * 2))
+ return FALSE;
+
break;
}
case CLASS_PRIEST:
#include "grid/grid.h"
#include "io/targeting.h"
#include "io/write-diary.h"
+#include "mind/mind-mage.h"
#include "mind/mind-warrior.h"
#include "mind/racial-vampire.h"
#include "monster-floor/monster-remover.h"
-#include "object-kind.h"
+/*!
+ * @brief ベースアイテム情報の構造体 / Information about object "kinds", including player knowledge.
+ * @date 2019/05/01
+ * @author deskull
+ * @details
+ * ゲーム進行用のセーブファイル上では aware と tried のみ保存対象とすること。と英文ではあるが実際はもっとある様子である。 /
+ * Only "aware" and "tried" are saved in the savefile
+ */
+
+#include "object-kind.h"
/*
* The object kind arrays
#include "system/angband.h"
#include "system/object-type-definition.h"
-/*!
- * @struct object_kind
- * @brief ベースアイテム情報の構造体 / Information about object "kinds", including player knowledge.
- * @details
- * ゲーム進行用のセーブファイル上では aware と tried のみ保存対象とすること。と英文ではあるが実際はもっとある様子である。 /
- * Only "aware" and "tried" are saved in the savefile
+/*
+ * Return the "char" for a given item.
+ * Use "flavor" if available.
+ * Default to user definitions.
*/
-
-
- /*
- * Return the "char" for a given item.
- * Use "flavor" if available.
- * Default to user definitions.
- */
#define object_char(T) \
((k_info[(T)->k_idx].flavor) ? \
(k_info[k_info[(T)->k_idx].flavor].x_char) : \
(k_info[(T)->k_idx].x_char))
-
-typedef struct object_kind object_kind;
-
-struct object_kind
-{
+typedef struct object_kind {
STR_OFFSET name; /*!< ベースアイテム名参照のためのネームバッファオフセット値 / Name (offset) */
STR_OFFSET text; /*!< 解説テキスト参照のためのネームバッファオフセット値 / Text (offset) */
STR_OFFSET flavor_name; /*!< 未確定名参照のためのネームバッファオフセット値 / Flavor name (offset) */
bool tried; /*!< ベースアイテムを未鑑定のまま試したことがあるか / The player has "tried" one of the items */
ACTIVATION_IDX act_idx; /*!< 発動能力のID / Activative ability index */
-};
+} object_kind;
extern object_kind *k_info;
extern char *k_name;
return TRUE;
}
-static bool update_player(player_type *caster_ptr)
-{
- caster_ptr->update |= PU_COMBINE | PU_REORDER;
- caster_ptr->window |= PW_INVEN;
- return TRUE;
-}
-
-static bool redraw_player(player_type *caster_ptr)
-{
- if (caster_ptr->csp > caster_ptr->msp) {
- caster_ptr->csp = caster_ptr->msp;
- }
-
- caster_ptr->redraw |= PR_MANA;
- caster_ptr->update |= PU_COMBINE | PU_REORDER;
- caster_ptr->window |= PW_INVEN;
- return TRUE;
-}
-
/*!
* @brief 魔力充填処理 /
* Recharge a wand/staff/rod from the pack or on the floor.
}
/*!
- * @brief 魔力食い処理
- * @param caster_ptr プレーヤーへの参照ポインタ
- * @param power 基本効力
- * @return ターンを消費した場合TRUEを返す
- */
-bool eat_magic(player_type *caster_ptr, int power)
-{
- byte fail_type = 1;
- GAME_TEXT o_name[MAX_NLEN];
-
- item_tester_hook = item_tester_hook_recharge;
-
- concptr q = _("どのアイテムから魔力を吸収しますか?", "Drain which item? ");
- concptr s = _("魔力を吸収できるアイテムがありません。", "You have nothing to drain.");
-
- object_type *o_ptr;
- OBJECT_IDX item;
- o_ptr = choose_object(caster_ptr, &item, q, s, (USE_INVEN | USE_FLOOR), 0);
- if (!o_ptr)
- return FALSE;
-
- object_kind *k_ptr;
- k_ptr = &k_info[o_ptr->k_idx];
- DEPTH lev = k_info[o_ptr->k_idx].level;
-
- int recharge_strength = 0;
- bool is_eating_successful = TRUE;
- if (o_ptr->tval == TV_ROD) {
- recharge_strength = ((power > lev / 2) ? (power - lev / 2) : 0) / 5;
- if (one_in_(recharge_strength)) {
- is_eating_successful = FALSE;
- } else {
- if (o_ptr->timeout > (o_ptr->number - 1) * k_ptr->pval) {
- msg_print(_("充填中のロッドから魔力を吸収することはできません。", "You can't absorb energy from a discharged rod."));
- } else {
- caster_ptr->csp += lev;
- o_ptr->timeout += k_ptr->pval;
- }
- }
- } else {
- recharge_strength = (100 + power - lev) / 15;
- if (recharge_strength < 0)
- recharge_strength = 0;
-
- if (one_in_(recharge_strength)) {
- is_eating_successful = FALSE;
- } else {
- if (o_ptr->pval > 0) {
- caster_ptr->csp += lev / 2;
- o_ptr->pval--;
-
- if ((o_ptr->tval == TV_STAFF) && (item >= 0) && (o_ptr->number > 1)) {
- object_type forge;
- object_type *q_ptr;
- q_ptr = &forge;
- object_copy(q_ptr, o_ptr);
-
- q_ptr->number = 1;
- o_ptr->pval++;
- o_ptr->number--;
- caster_ptr->total_weight -= q_ptr->weight;
- item = store_item_to_inventory(caster_ptr, q_ptr);
-
- msg_print(_("杖をまとめなおした。", "You unstack your staff."));
- }
- } else {
- msg_print(_("吸収できる魔力がありません!", "There's no energy there to absorb!"));
- }
-
- if (!o_ptr->pval)
- o_ptr->ident |= IDENT_EMPTY;
- }
- }
-
- if (is_eating_successful) {
- return redraw_player(caster_ptr);
- }
-
- if (object_is_fixed_artifact(o_ptr)) {
- object_desc(caster_ptr, o_name, o_ptr, OD_NAME_ONLY);
- msg_format(_("魔力が逆流した!%sは完全に魔力を失った。", "The recharging backfires - %s is completely drained!"), o_name);
- if (o_ptr->tval == TV_ROD)
- o_ptr->timeout = k_ptr->pval * o_ptr->number;
- else if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_STAFF))
- o_ptr->pval = 0;
-
- return redraw_player(caster_ptr);
- }
-
- object_desc(caster_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
-
- /* Mages recharge objects more safely. */
- if (IS_WIZARD_CLASS(caster_ptr)) {
- /* 10% chance to blow up one rod, otherwise draining. */
- if (o_ptr->tval == TV_ROD) {
- if (one_in_(10))
- fail_type = 2;
- else
- fail_type = 1;
- }
- /* 75% chance to blow up one wand, otherwise draining. */
- else if (o_ptr->tval == TV_WAND) {
- if (!one_in_(3))
- fail_type = 2;
- else
- fail_type = 1;
- }
- /* 50% chance to blow up one staff, otherwise no effect. */
- else if (o_ptr->tval == TV_STAFF) {
- if (one_in_(2))
- fail_type = 2;
- else
- fail_type = 0;
- }
- }
-
- /* All other classes get no special favors. */
- else {
- /* 33% chance to blow up one rod, otherwise draining. */
- if (o_ptr->tval == TV_ROD) {
- if (one_in_(3))
- fail_type = 2;
- else
- fail_type = 1;
- }
- /* 20% chance of the entire stack, else destroy one wand. */
- else if (o_ptr->tval == TV_WAND) {
- if (one_in_(5))
- fail_type = 3;
- else
- fail_type = 2;
- }
- /* Blow up one staff. */
- else if (o_ptr->tval == TV_STAFF) {
- fail_type = 2;
- }
- }
-
- if (fail_type == 1) {
- if (o_ptr->tval == TV_ROD) {
- msg_format(_("ロッドは破損を免れたが、魔力は全て失なわれた。", "You save your rod from destruction, but all charges are lost."), o_name);
- o_ptr->timeout = k_ptr->pval * o_ptr->number;
- } else if (o_ptr->tval == TV_WAND) {
- msg_format(_("%sは破損を免れたが、魔力が全て失われた。", "You save your %s from destruction, but all charges are lost."), o_name);
- o_ptr->pval = 0;
- }
- }
-
- if (fail_type == 2) {
- if (o_ptr->number > 1) {
- msg_format(_("乱暴な魔法のために%sが一本壊れた!", "Wild magic consumes one of your %s!"), o_name);
- /* Reduce rod stack maximum timeout, drain wands. */
- if (o_ptr->tval == TV_ROD)
- o_ptr->timeout = MIN(o_ptr->timeout, k_ptr->pval * (o_ptr->number - 1));
- else if (o_ptr->tval == TV_WAND)
- o_ptr->pval = o_ptr->pval * (o_ptr->number - 1) / o_ptr->number;
- } else {
- msg_format(_("乱暴な魔法のために%sが何本か壊れた!", "Wild magic consumes your %s!"), o_name);
- }
-
- vary_item(caster_ptr, item, -1);
- }
-
- if (fail_type == 3) {
- if (o_ptr->number > 1)
- msg_format(_("乱暴な魔法のために%sが全て壊れた!", "Wild magic consumes all your %s!"), o_name);
- else
- msg_format(_("乱暴な魔法のために%sが壊れた!", "Wild magic consumes your %s!"), o_name);
-
- vary_item(caster_ptr, item, -999);
- }
-
- return redraw_player(caster_ptr);
-}
-
-/*!
* @brief 皆殺し(全方向攻撃)処理
* @param caster_ptr プレーヤーへの参照ポインタ
* @return なし
#include "spell/spells-util.h"
#include "system/angband.h"
-bool eat_magic(player_type *caster_ptr, int power);
bool apply_disenchant(player_type* target_ptr, BIT_FLAGS mode);
void fetch(player_type* caster_ptr, DIRECTION dir, WEIGHT wgt, bool require_los);
void reserve_alter_reality(player_type* caster_ptr);