From: Hourier Date: Fri, 12 Jun 2020 10:30:49 +0000 (+0900) Subject: [Refactor] #40014 Separated lore-calculator.c/h from monster-lore.c/h X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=21aee438ff2fd8a11877bb8a836782ce07155ad9;p=hengband%2Fhengband.git [Refactor] #40014 Separated lore-calculator.c/h from monster-lore.c/h --- diff --git a/Hengband/Hengband/Hengband.vcxproj b/Hengband/Hengband/Hengband.vcxproj index f7b70e3c9..724b28497 100644 --- a/Hengband/Hengband/Hengband.vcxproj +++ b/Hengband/Hengband/Hengband.vcxproj @@ -187,6 +187,7 @@ + @@ -540,6 +541,7 @@ + diff --git a/Hengband/Hengband/Hengband.vcxproj.filters b/Hengband/Hengband/Hengband.vcxproj.filters index d839d3a38..2ad00bcd8 100644 --- a/Hengband/Hengband/Hengband.vcxproj.filters +++ b/Hengband/Hengband/Hengband.vcxproj.filters @@ -1286,6 +1286,9 @@ view + + lore + @@ -2824,6 +2827,9 @@ view + + lore + diff --git a/src/Makefile.am b/src/Makefile.am index 27e9dfa1a..505434f29 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -228,6 +228,7 @@ hengband_SOURCES = \ \ locale/japanese.c locale/japanese.h locale/english.c locale/english.h \ \ + lore/lore-calculator.c lore/lore-calculator.h \ lore/lore-store.c lore/lore-store.h \ lore/lore-util.c lore/lore-util.h \ lore/monster-lore.c lore/monster-lore.h \ diff --git a/src/lore/lore-calculator.c b/src/lore/lore-calculator.c new file mode 100644 index 000000000..952795456 --- /dev/null +++ b/src/lore/lore-calculator.c @@ -0,0 +1,150 @@ +#include "lore/lore-calculator.h" +#include "monster-race/race-flags1.h" +#include "mspell/monster-spell.h" +#include "mspell/mspell-damage-calculator.h" + +/*! + * @brief ダイス目を文字列に変換する + * @param base_damage 固定値 + * @param dice_num ダイス数 + * @param dice_side ダイス面 + * @param dice_mult ダイス倍率 + * @param dice_div ダイス除数 + * @param msg 文字列を格納するポインタ + * @return なし + */ +void dice_to_string(int base_damage, int dice_num, int dice_side, int dice_mult, int dice_div, char *msg) +{ + char base[80] = "", dice[80] = "", mult[80] = ""; + + if (dice_num == 0) { + sprintf(msg, "%d", base_damage); + return; + } + + if (base_damage != 0) + sprintf(base, "%d+", base_damage); + + if (dice_num == 1) + sprintf(dice, "d%d", dice_side); + else + sprintf(dice, "%dd%d", dice_num, dice_side); + + if (dice_mult != 1 || dice_div != 1) { + if (dice_div == 1) + sprintf(mult, "*%d", dice_mult); + else + sprintf(mult, "*(%d/%d)", dice_mult, dice_div); + } + + sprintf(msg, "%s%s%s", base, dice, mult); +} + +/*! + * @brief モンスターのAC情報を得ることができるかを返す / Determine if the "armor" is known + * @param r_idx モンスターの種族ID + * @return 敵のACを知る条件が満たされているならTRUEを返す + * @details + * The higher the level, the fewer kills needed. + */ +bool know_armour(MONRACE_IDX r_idx) +{ + monster_race *r_ptr = &r_info[r_idx]; + DEPTH level = r_ptr->level; + MONSTER_NUMBER kills = r_ptr->r_tkills; + + bool known = (r_ptr->r_cast_spell == MAX_UCHAR) ? TRUE : FALSE; + + if (cheat_know || known) + return TRUE; + if (kills > 304 / (4 + level)) + return TRUE; + if (!(r_ptr->flags1 & RF1_UNIQUE)) + return FALSE; + if (kills > 304 / (38 + (5 * level) / 4)) + return TRUE; + return FALSE; +} + +/*! + * @brief モンスターの打撃威力を知ることができるかどうかを返す + * Determine if the "damage" of the given attack is known + * @param r_idx モンスターの種族ID + * @param i 確認したい攻撃手番 + * @return 敵のダメージダイスを知る条件が満たされているならTRUEを返す + * @details + *
+ * the higher the level of the monster, the fewer the attacks you need,
+ * the more damage an attack does, the more attacks you need
+ * 
+ */ +bool know_damage(MONRACE_IDX r_idx, int i) +{ + monster_race *r_ptr = &r_info[r_idx]; + DEPTH level = r_ptr->level; + s32b a = r_ptr->r_blows[i]; + + s32b d1 = r_ptr->blow[i].d_dice; + s32b d2 = r_ptr->blow[i].d_side; + s32b d = d1 * d2; + + if (d >= ((4 + level) * MAX_UCHAR) / 80) + d = ((4 + level) * MAX_UCHAR - 1) / 80; + if ((4 + level) * a > 80 * d) + return TRUE; + if (!(r_ptr->flags1 & RF1_UNIQUE)) + return FALSE; + if ((4 + level) * (2 * a) > 80 * d) + return TRUE; + + return FALSE; +} + +/*! + * @brief 文字列にモンスターの攻撃力を加える + * @param r_idx モンスターの種族ID + * @param SPELL_NUM 呪文番号 + * @param msg 表示する文字列 + * @param tmp 返すメッセージを格納する配列 + * @return なし + */ +void set_damage(player_type *player_ptr, MONRACE_IDX r_idx, monster_spell_type ms_type, char *msg, char *tmp) +{ + int base_damage = monspell_race_damage(player_ptr, ms_type, r_idx, BASE_DAM); + int dice_num = monspell_race_damage(player_ptr, ms_type, r_idx, DICE_NUM); + int dice_side = monspell_race_damage(player_ptr, ms_type, r_idx, DICE_SIDE); + int dice_mult = monspell_race_damage(player_ptr, ms_type, r_idx, DICE_MULT); + int dice_div = monspell_race_damage(player_ptr, ms_type, r_idx, DICE_DIV); + char dmg_str[80], dice_str[80]; + dice_to_string(base_damage, dice_num, dice_side, dice_mult, dice_div, dmg_str); + sprintf(dice_str, "(%s)", dmg_str); + + if (know_armour(r_idx)) + sprintf(tmp, msg, dice_str); + else + sprintf(tmp, msg, ""); +} + +void set_drop_flags(lore_type *lore_ptr) +{ + if (!lore_ptr->know_everything) + return; + + lore_ptr->drop_gold = lore_ptr->drop_item = (((lore_ptr->r_ptr->flags1 & RF1_DROP_4D2) ? 8 : 0) + ((lore_ptr->r_ptr->flags1 & RF1_DROP_3D2) ? 6 : 0) + + ((lore_ptr->r_ptr->flags1 & RF1_DROP_2D2) ? 4 : 0) + ((lore_ptr->r_ptr->flags1 & RF1_DROP_1D2) ? 2 : 0) + + ((lore_ptr->r_ptr->flags1 & RF1_DROP_90) ? 1 : 0) + ((lore_ptr->r_ptr->flags1 & RF1_DROP_60) ? 1 : 0)); + + if (lore_ptr->r_ptr->flags1 & RF1_ONLY_GOLD) + lore_ptr->drop_item = 0; + + if (lore_ptr->r_ptr->flags1 & RF1_ONLY_ITEM) + lore_ptr->drop_gold = 0; + + lore_ptr->flags1 = lore_ptr->r_ptr->flags1; + lore_ptr->flags2 = lore_ptr->r_ptr->flags2; + lore_ptr->flags3 = lore_ptr->r_ptr->flags3; + lore_ptr->flags4 = lore_ptr->r_ptr->flags4; + lore_ptr->a_ability_flags1 = lore_ptr->r_ptr->a_ability_flags1; + lore_ptr->a_ability_flags2 = lore_ptr->r_ptr->a_ability_flags2; + lore_ptr->flagsr = lore_ptr->r_ptr->flagsr; +} diff --git a/src/lore/lore-calculator.h b/src/lore/lore-calculator.h new file mode 100644 index 000000000..d985057fc --- /dev/null +++ b/src/lore/lore-calculator.h @@ -0,0 +1,11 @@ +#pragma once + +#include "lore/lore-util.h" +#include "mspell/mspell-type.h" +#include "system/angband.h" + +void dice_to_string(int base_damage, int dice_num, int dice_side, int dice_mult, int dice_div, char *msg); +bool know_armour(MONRACE_IDX r_idx); +bool know_damage(MONRACE_IDX r_idx, int i); +void set_damage(player_type *player_ptr, MONRACE_IDX r_idx, monster_spell_type ms_type, char *msg, char *tmp); +void set_drop_flags(lore_type *lore_ptr); diff --git a/src/lore/monster-lore.c b/src/lore/monster-lore.c index 7fdf54669..478e808db 100644 --- a/src/lore/monster-lore.c +++ b/src/lore/monster-lore.c @@ -7,6 +7,7 @@ #include "lore/monster-lore.h" #include "locale/english.h" #include "locale/japanese.h" +#include "lore/lore-calculator.h" #include "lore/lore-util.h" #include "monster-race/race-flags-ability1.h" #include "monster-race/race-flags-ability2.h" @@ -29,152 +30,6 @@ */ #define plural(c, s, p) (((c) == 1) ? (s) : (p)) -/*! - * @brief ダイス目を文字列に変換する - * @param base_damage 固定値 - * @param dice_num ダイス数 - * @param dice_side ダイス面 - * @param dice_mult ダイス倍率 - * @param dice_div ダイス除数 - * @param msg 文字列を格納するポインタ - * @return なし - */ -void dice_to_string(int base_damage, int dice_num, int dice_side, int dice_mult, int dice_div, char *msg) -{ - char base[80] = "", dice[80] = "", mult[80] = ""; - - if (dice_num == 0) { - sprintf(msg, "%d", base_damage); - return; - } - - if (base_damage != 0) - sprintf(base, "%d+", base_damage); - - if (dice_num == 1) - sprintf(dice, "d%d", dice_side); - else - sprintf(dice, "%dd%d", dice_num, dice_side); - - if (dice_mult != 1 || dice_div != 1) { - if (dice_div == 1) - sprintf(mult, "*%d", dice_mult); - else - sprintf(mult, "*(%d/%d)", dice_mult, dice_div); - } - - sprintf(msg, "%s%s%s", base, dice, mult); -} - -/*! - * @brief モンスターのAC情報を得ることができるかを返す / Determine if the "armor" is known - * @param r_idx モンスターの種族ID - * @return 敵のACを知る条件が満たされているならTRUEを返す - * @details - * The higher the level, the fewer kills needed. - */ -static bool know_armour(MONRACE_IDX r_idx) -{ - monster_race *r_ptr = &r_info[r_idx]; - DEPTH level = r_ptr->level; - MONSTER_NUMBER kills = r_ptr->r_tkills; - - bool known = (r_ptr->r_cast_spell == MAX_UCHAR) ? TRUE : FALSE; - - if (cheat_know || known) - return TRUE; - if (kills > 304 / (4 + level)) - return TRUE; - if (!(r_ptr->flags1 & RF1_UNIQUE)) - return FALSE; - if (kills > 304 / (38 + (5 * level) / 4)) - return TRUE; - return FALSE; -} - -/*! - * @brief モンスターの打撃威力を知ることができるかどうかを返す - * Determine if the "damage" of the given attack is known - * @param r_idx モンスターの種族ID - * @param i 確認したい攻撃手番 - * @return 敵のダメージダイスを知る条件が満たされているならTRUEを返す - * @details - *
- * the higher the level of the monster, the fewer the attacks you need,
- * the more damage an attack does, the more attacks you need
- * 
- */ -static bool know_damage(MONRACE_IDX r_idx, int i) -{ - monster_race *r_ptr = &r_info[r_idx]; - DEPTH level = r_ptr->level; - s32b a = r_ptr->r_blows[i]; - - s32b d1 = r_ptr->blow[i].d_dice; - s32b d2 = r_ptr->blow[i].d_side; - s32b d = d1 * d2; - - if (d >= ((4 + level) * MAX_UCHAR) / 80) - d = ((4 + level) * MAX_UCHAR - 1) / 80; - if ((4 + level) * a > 80 * d) - return TRUE; - if (!(r_ptr->flags1 & RF1_UNIQUE)) - return FALSE; - if ((4 + level) * (2 * a) > 80 * d) - return TRUE; - - return FALSE; -} - -/*! - * @brief 文字列にモンスターの攻撃力を加える - * @param r_idx モンスターの種族ID - * @param SPELL_NUM 呪文番号 - * @param msg 表示する文字列 - * @param tmp 返すメッセージを格納する配列 - * @return なし - */ -static void set_damage(player_type *player_ptr, MONRACE_IDX r_idx, monster_spell_type ms_type, char *msg, char *tmp) -{ - int base_damage = monspell_race_damage(player_ptr, ms_type, r_idx, BASE_DAM); - int dice_num = monspell_race_damage(player_ptr, ms_type, r_idx, DICE_NUM); - int dice_side = monspell_race_damage(player_ptr, ms_type, r_idx, DICE_SIDE); - int dice_mult = monspell_race_damage(player_ptr, ms_type, r_idx, DICE_MULT); - int dice_div = monspell_race_damage(player_ptr, ms_type, r_idx, DICE_DIV); - char dmg_str[80], dice_str[80]; - dice_to_string(base_damage, dice_num, dice_side, dice_mult, dice_div, dmg_str); - sprintf(dice_str, "(%s)", dmg_str); - - if (know_armour(r_idx)) - sprintf(tmp, msg, dice_str); - else - sprintf(tmp, msg, ""); -} - -static void set_drop_flags(lore_type *lore_ptr) -{ - if (!lore_ptr->know_everything) - return; - - lore_ptr->drop_gold = lore_ptr->drop_item = (((lore_ptr->r_ptr->flags1 & RF1_DROP_4D2) ? 8 : 0) + ((lore_ptr->r_ptr->flags1 & RF1_DROP_3D2) ? 6 : 0) - + ((lore_ptr->r_ptr->flags1 & RF1_DROP_2D2) ? 4 : 0) + ((lore_ptr->r_ptr->flags1 & RF1_DROP_1D2) ? 2 : 0) - + ((lore_ptr->r_ptr->flags1 & RF1_DROP_90) ? 1 : 0) + ((lore_ptr->r_ptr->flags1 & RF1_DROP_60) ? 1 : 0)); - - if (lore_ptr->r_ptr->flags1 & RF1_ONLY_GOLD) - lore_ptr->drop_item = 0; - - if (lore_ptr->r_ptr->flags1 & RF1_ONLY_ITEM) - lore_ptr->drop_gold = 0; - - lore_ptr->flags1 = lore_ptr->r_ptr->flags1; - lore_ptr->flags2 = lore_ptr->r_ptr->flags2; - lore_ptr->flags3 = lore_ptr->r_ptr->flags3; - lore_ptr->flags4 = lore_ptr->r_ptr->flags4; - lore_ptr->a_ability_flags1 = lore_ptr->r_ptr->a_ability_flags1; - lore_ptr->a_ability_flags2 = lore_ptr->r_ptr->a_ability_flags2; - lore_ptr->flagsr = lore_ptr->r_ptr->flagsr; -} - static void set_msex_flags(lore_type *lore_ptr) { lore_ptr->msex = MSEX_NONE; @@ -320,28 +175,7 @@ void process_monster_lore(player_type *player_ptr, MONRACE_IDX r_idx, BIT_FLAGS lore_ptr->color[lore_ptr->vn++] = TERM_L_WHITE; } - if (lore_ptr->flags4 & RF4_ROCKET) { - set_damage(player_ptr, r_idx, (MS_ROCKET), _("ロケット%sを発射する", "shoot a rocket%s"), lore_ptr->tmp_msg[lore_ptr->vn]); - lore_ptr->vp[lore_ptr->vn] = lore_ptr->tmp_msg[lore_ptr->vn]; - lore_ptr->color[lore_ptr->vn++] = TERM_UMBER; - } - - if (lore_ptr->flags4 & RF4_SHOOT) { - for (int m = 0; m < 4; m++) { - if (lore_ptr->r_ptr->blow[m].method != RBM_SHOOT) - continue; - - if (know_armour(r_idx)) - sprintf( - lore_ptr->tmp_msg[lore_ptr->vn], _("威力 %dd%d の射撃をする", "fire an arrow (Power:%dd%d)"), lore_ptr->r_ptr->blow[m].d_side, lore_ptr->r_ptr->blow[m].d_dice); - else - sprintf(lore_ptr->tmp_msg[lore_ptr->vn], _("射撃をする", "fire an arrow")); - lore_ptr->vp[lore_ptr->vn] = lore_ptr->tmp_msg[lore_ptr->vn]; - lore_ptr->color[lore_ptr->vn++] = TERM_UMBER; - break; - } - } - + display_monster_launching(player_ptr, lore_ptr); if (lore_ptr->a_ability_flags2 & (RF6_SPECIAL)) { lore_ptr->vp[lore_ptr->vn] = _("特別な行動をする", "do something"); lore_ptr->color[lore_ptr->vn++] = TERM_VIOLET; diff --git a/src/lore/monster-lore.h b/src/lore/monster-lore.h index 5022176a4..59af014a4 100644 --- a/src/lore/monster-lore.h +++ b/src/lore/monster-lore.h @@ -2,5 +2,4 @@ #include "system/angband.h" -void dice_to_string(int base_damage, int dice_num, int dice_side, int dice_mult, int dice_div, char *msg); void process_monster_lore(player_type *player_ptr, MONRACE_IDX r_idx, BIT_FLAGS mode); diff --git a/src/spell/spells3.c b/src/spell/spells3.c index 7112d8f9a..0a8ae6672 100644 --- a/src/spell/spells3.c +++ b/src/spell/spells3.c @@ -14,9 +14,9 @@ #include "autopick/autopick.h" #include "cmd-action/cmd-attack.h" #include "cmd-action/cmd-spell.h" -#include "cmd-io/cmd-dump.h" #include "cmd-building/cmd-building.h" -#include "mind/mind-sniper.h" +#include "cmd-io/cmd-dump.h" +#include "core/speed-table.h" #include "core/stuff-handler.h" #include "dungeon/dungeon.h" #include "dungeon/quest.h" @@ -32,10 +32,11 @@ #include "io/files-util.h" #include "io/targeting.h" #include "io/write-diary.h" +#include "lore/lore-calculator.h" #include "market/building-util.h" -#include "mind/mind.h" #include "mind/mind-force-trainer.h" -#include "core/speed-table.h" +#include "mind/mind-sniper.h" +#include "mind/mind.h" #include "monster-race/race-flags1.h" #include "monster-race/race-flags7.h" #include "monster/monster-describer.h" @@ -52,21 +53,21 @@ #include "mspell/monster-spell.h" #include "object-enchant/artifact.h" #include "object-enchant/item-feeling.h" -#include "object/item-use-flags.h" -#include "object/object-info.h" -#include "perception/identification.h" -#include "perception/object-perception.h" #include "object-enchant/object-boost.h" #include "object-enchant/object-ego.h" +#include "object-enchant/special-object-flags.h" +#include "object-enchant/tr-types.h" +#include "object-enchant/trc-types.h" +#include "object/item-use-flags.h" #include "object/object-flavor.h" #include "object/object-generator.h" #include "object/object-hook.h" +#include "object/object-info.h" #include "object/object-kind.h" #include "object/object-mark-types.h" #include "object/object-value.h" -#include "object-enchant/special-object-flags.h" -#include "object-enchant/tr-types.h" -#include "object-enchant/trc-types.h" +#include "perception/identification.h" +#include "perception/object-perception.h" #include "player/avatar.h" #include "player/player-class.h" #include "player/player-damage.h" @@ -75,12 +76,12 @@ #include "player/player-personalities-table.h" #include "player/player-skill.h" #include "player/player-status.h" -#include "spell/process-effect.h" #include "spell-kind/earthquake.h" #include "spell-kind/spells-floor.h" #include "spell-kind/spells-launcher.h" #include "spell-kind/spells-sight.h" #include "spell-kind/spells-teleport.h" +#include "spell/process-effect.h" #include "spell/spells-execution.h" #include "spell/spells-summon.h" #include "spell/spells-type.h" diff --git a/src/view/display-lore.c b/src/view/display-lore.c index f37395c55..649dd6d8b 100644 --- a/src/view/display-lore.c +++ b/src/view/display-lore.c @@ -5,11 +5,14 @@ */ #include "view/display-lore.h" +#include "lore/lore-calculator.h" #include "lore/monster-lore.h" #include "monster-race/race-flags1.h" #include "monster-race/race-flags2.h" #include "monster-race/race-flags3.h" +#include "monster-race/race-flags4.h" #include "monster-race/race-indice-types.h" +#include "mspell/mspell-type.h" #include "term/term-color-types.h" #include "world/world.h" @@ -469,3 +472,29 @@ void display_monster_collective(lore_type *lore_ptr) hooked_roff(format(_("%^sは通常集団で現れる。", "%^s usually appears in groups. "), wd_he[lore_ptr->msex])); } } + +void display_monster_launching(player_type *player_ptr, lore_type *lore_ptr) +{ + if (lore_ptr->flags4 & RF4_ROCKET) { + set_damage(player_ptr, lore_ptr->r_idx, (MS_ROCKET), _("ロケット%sを発射する", "shoot a rocket%s"), lore_ptr->tmp_msg[lore_ptr->vn]); + lore_ptr->vp[lore_ptr->vn] = lore_ptr->tmp_msg[lore_ptr->vn]; + lore_ptr->color[lore_ptr->vn++] = TERM_UMBER; + } + + if ((lore_ptr->flags4 & RF4_SHOOT) == 0) + return; + + for (int m = 0; m < 4; m++) { + if (lore_ptr->r_ptr->blow[m].method != RBM_SHOOT) + continue; + + if (know_armour(lore_ptr->r_idx)) + sprintf(lore_ptr->tmp_msg[lore_ptr->vn], _("威力 %dd%d の射撃をする", "fire an arrow (Power:%dd%d)"), lore_ptr->r_ptr->blow[m].d_side, + lore_ptr->r_ptr->blow[m].d_dice); + else + sprintf(lore_ptr->tmp_msg[lore_ptr->vn], _("射撃をする", "fire an arrow")); + lore_ptr->vp[lore_ptr->vn] = lore_ptr->tmp_msg[lore_ptr->vn]; + lore_ptr->color[lore_ptr->vn++] = TERM_UMBER; + break; + } +} diff --git a/src/view/display-lore.h b/src/view/display-lore.h index 8bf598a77..2aef0d3dd 100644 --- a/src/view/display-lore.h +++ b/src/view/display-lore.h @@ -18,3 +18,4 @@ void display_monster_exp(player_type *player_ptr, lore_type *lore_ptr); void display_monster_aura(lore_type *lore_ptr); void display_lore_this(player_type *player_ptr, lore_type *lore_ptr); void display_monster_collective(lore_type *lore_ptr); +void display_monster_launching(player_type *player_ptr, lore_type *lore_ptr);