From bcb61c59216c1d73d3fa97fa4e57afbca50b7418 Mon Sep 17 00:00:00 2001 From: Hourier Date: Sat, 27 Jun 2020 22:40:28 +0900 Subject: [PATCH] [Refactor] #40482 Separated mind-mage.c/h from spells3.c/h --- Hengband/Hengband/Hengband.vcxproj | 2 + Hengband/Hengband/Hengband.vcxproj.filters | 6 + src/Makefile.am | 1 + src/cmd-action/cmd-mane.c | 1 + src/core/stuff-handler.c | 19 +++ src/core/stuff-handler.h | 3 + src/mind/mind-mage.c | 188 +++++++++++++++++++++++++++ src/mind/mind-mage.h | 5 + src/mind/racial.c | 21 ++-- src/mutation/mutation.c | 1 + src/object/object-kind.c | 11 +- src/object/object-kind.h | 25 +--- src/spell/spells3.c | 195 ----------------------------- src/spell/spells3.h | 1 - 14 files changed, 255 insertions(+), 224 deletions(-) create mode 100644 src/mind/mind-mage.c create mode 100644 src/mind/mind-mage.h diff --git a/Hengband/Hengband/Hengband.vcxproj b/Hengband/Hengband/Hengband.vcxproj index 0825bcf9f..c6c4db52b 100644 --- a/Hengband/Hengband/Hengband.vcxproj +++ b/Hengband/Hengband/Hengband.vcxproj @@ -213,6 +213,7 @@ + @@ -620,6 +621,7 @@ + diff --git a/Hengband/Hengband/Hengband.vcxproj.filters b/Hengband/Hengband/Hengband.vcxproj.filters index b572d75cc..f3d2a16e9 100644 --- a/Hengband/Hengband/Hengband.vcxproj.filters +++ b/Hengband/Hengband/Hengband.vcxproj.filters @@ -1466,6 +1466,9 @@ spell-kind + + mind + @@ -3223,6 +3226,9 @@ spell-kind + + mind + diff --git a/src/Makefile.am b/src/Makefile.am index 303003233..ed0112b1e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -304,6 +304,7 @@ hengband_SOURCES = \ 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 \ diff --git a/src/cmd-action/cmd-mane.c b/src/cmd-action/cmd-mane.c index d98222cbc..5cf0f78ed 100644 --- a/src/cmd-action/cmd-mane.c +++ b/src/cmd-action/cmd-mane.c @@ -20,6 +20,7 @@ #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" diff --git a/src/core/stuff-handler.c b/src/core/stuff-handler.c index 8f5bacf64..4b1e8339a 100644 --- a/src/core/stuff-handler.c +++ b/src/core/stuff-handler.c @@ -48,3 +48,22 @@ void health_track(player_type *player_ptr, MONSTER_IDX m_idx) 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; +} diff --git a/src/core/stuff-handler.h b/src/core/stuff-handler.h index ba27a935b..054dfd286 100644 --- a/src/core/stuff-handler.h +++ b/src/core/stuff-handler.h @@ -6,3 +6,6 @@ void handle_stuff(player_type* player_ptr); 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); diff --git a/src/mind/mind-mage.c b/src/mind/mind-mage.c new file mode 100644 index 000000000..2daaba4db --- /dev/null +++ b/src/mind/mind-mage.c @@ -0,0 +1,188 @@ +#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); +} diff --git a/src/mind/mind-mage.h b/src/mind/mind-mage.h new file mode 100644 index 000000000..ce6986471 --- /dev/null +++ b/src/mind/mind-mage.h @@ -0,0 +1,5 @@ +#pragma once + +#include "system/angband.h" + +bool eat_magic(player_type *caster_ptr, int power); diff --git a/src/mind/racial.c b/src/mind/racial.c index 470d0d265..6cad957d3 100644 --- a/src/mind/racial.c +++ b/src/mind/racial.c @@ -28,6 +28,7 @@ #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" @@ -325,18 +326,22 @@ static bool exe_racial_power(player_type *creature_ptr, s32b command) 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: diff --git a/src/mutation/mutation.c b/src/mutation/mutation.c index bc8aa2d52..1c2d46f24 100644 --- a/src/mutation/mutation.c +++ b/src/mutation/mutation.c @@ -23,6 +23,7 @@ #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" diff --git a/src/object/object-kind.c b/src/object/object-kind.c index e5fdc70da..72264b577 100644 --- a/src/object/object-kind.c +++ b/src/object/object-kind.c @@ -1,4 +1,13 @@ -#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 diff --git a/src/object/object-kind.h b/src/object/object-kind.h index 0105d3f5e..7fa65c578 100644 --- a/src/object/object-kind.h +++ b/src/object/object-kind.h @@ -3,30 +3,17 @@ #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) */ @@ -74,7 +61,7 @@ struct object_kind 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; diff --git a/src/spell/spells3.c b/src/spell/spells3.c index 78c10cf95..61c7ee0e0 100644 --- a/src/spell/spells3.c +++ b/src/spell/spells3.c @@ -524,25 +524,6 @@ bool mundane_spell(player_type *owner_ptr, bool only_equip) 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. @@ -1309,182 +1290,6 @@ bool polymorph_monster(player_type *caster_ptr, POSITION y, POSITION x) } /*! - * @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 なし diff --git a/src/spell/spells3.h b/src/spell/spells3.h index f49a15c67..910dea3dc 100644 --- a/src/spell/spells3.h +++ b/src/spell/spells3.h @@ -4,7 +4,6 @@ #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); -- 2.11.0