From 3bcca798ea14fcc9311f6226a44f9c085116878c Mon Sep 17 00:00:00 2001 From: Hourier Date: Sun, 5 Jul 2020 10:45:18 +0900 Subject: [PATCH] [Refactor] #40467 Moved set_old_lore() from load.c to load-v1-5-0.c/h --- src/savedata/load-v1-5-0.c | 57 +++++++++++++++++++++++++++++++ src/savedata/load-v1-5-0.h | 30 +++++++++++++++++ src/savedata/load.c | 83 ++++------------------------------------------ 3 files changed, 93 insertions(+), 77 deletions(-) diff --git a/src/savedata/load-v1-5-0.c b/src/savedata/load-v1-5-0.c index d08bc385b..7fba18393 100644 --- a/src/savedata/load-v1-5-0.c +++ b/src/savedata/load-v1-5-0.c @@ -11,6 +11,7 @@ #include "mind/mind-weaponsmith.h" #include "monster-floor/monster-move.h" #include "monster-race/monster-race.h" +#include "monster-race/race-flags-resistance.h" #include "monster-race/race-flags1.h" #include "monster-race/race-flags3.h" #include "monster-race/race-indice-types.h" @@ -444,3 +445,59 @@ void rd_monster_old(player_type *player_ptr, monster_type *m_ptr) rd_byte(&tmp8u); } + +static void move_RF3_to_RFR(monster_race *r_ptr, const BIT_FLAGS rf3, const BIT_FLAGS rfr) +{ + if (r_ptr->r_flags3 & rf3) { + r_ptr->r_flags3 &= ~rf3; + r_ptr->r_flagsr |= rfr; + } +} + +static void move_RF4_BR_to_RFR(monster_race *r_ptr, const BIT_FLAGS rf4_br, const BIT_FLAGS rfr) +{ + if (r_ptr->r_flags4 & rf4_br) + r_ptr->r_flagsr |= rfr; +} + +/*! + * @brief モンスターの思い出を読み込む + * @param r_ptr モンスター種族情報への参照ポインタ + * @param r_idx モンスター種族ID + * @details 本来はr_idxからr_ptrを決定可能だが、互換性を優先するため元コードのままとする + */ +void set_old_lore(monster_race *r_ptr, const MONRACE_IDX r_idx) +{ + r_ptr->r_flagsr = 0L; + move_RF3_to_RFR(r_ptr, RF3_IM_ACID, RFR_IM_ACID); + move_RF3_to_RFR(r_ptr, RF3_IM_ELEC, RFR_IM_ELEC); + move_RF3_to_RFR(r_ptr, RF3_IM_FIRE, RFR_IM_FIRE); + move_RF3_to_RFR(r_ptr, RF3_IM_COLD, RFR_IM_COLD); + move_RF3_to_RFR(r_ptr, RF3_IM_POIS, RFR_IM_POIS); + move_RF3_to_RFR(r_ptr, RF3_RES_TELE, RFR_RES_TELE); + move_RF3_to_RFR(r_ptr, RF3_RES_NETH, RFR_RES_NETH); + move_RF3_to_RFR(r_ptr, RF3_RES_WATE, RFR_RES_WATE); + move_RF3_to_RFR(r_ptr, RF3_RES_PLAS, RFR_RES_PLAS); + move_RF3_to_RFR(r_ptr, RF3_RES_NEXU, RFR_RES_NEXU); + move_RF3_to_RFR(r_ptr, RF3_RES_DISE, RFR_RES_DISE); + move_RF3_to_RFR(r_ptr, RF3_RES_ALL, RFR_RES_ALL); + + move_RF4_BR_to_RFR(r_ptr, RF4_BR_LITE, RFR_RES_LITE); + move_RF4_BR_to_RFR(r_ptr, RF4_BR_DARK, RFR_RES_DARK); + move_RF4_BR_to_RFR(r_ptr, RF4_BR_SOUN, RFR_RES_SOUN); + move_RF4_BR_to_RFR(r_ptr, RF4_BR_CHAO, RFR_RES_CHAO); + move_RF4_BR_to_RFR(r_ptr, RF4_BR_TIME, RFR_RES_TIME); + move_RF4_BR_to_RFR(r_ptr, RF4_BR_INER, RFR_RES_INER); + move_RF4_BR_to_RFR(r_ptr, RF4_BR_GRAV, RFR_RES_GRAV); + move_RF4_BR_to_RFR(r_ptr, RF4_BR_SHAR, RFR_RES_SHAR); + move_RF4_BR_to_RFR(r_ptr, RF4_BR_WALL, RFR_RES_WALL); + + if (r_ptr->r_flags4 & RF4_BR_CONF) + r_ptr->r_flags3 |= RF3_NO_CONF; + + if (r_idx == MON_STORMBRINGER) + r_ptr->r_flagsr |= RFR_RES_CHAO; + + if (r_ptr->r_flags3 & RF3_ORC) + r_ptr->r_flagsr |= RFR_RES_DARK; +} diff --git a/src/savedata/load-v1-5-0.h b/src/savedata/load-v1-5-0.h index d1bfee307..2dac82439 100644 --- a/src/savedata/load-v1-5-0.h +++ b/src/savedata/load-v1-5-0.h @@ -3,5 +3,35 @@ #include "system/angband.h" #include "system/monster-type-definition.h" +// TODO: 更に分割する可能性が中程度あるのでヘッダに置いておく +typedef enum old_monster_resistance_type { + RF3_IM_ACID = 0x00010000, /* Resist acid a lot */ + RF3_IM_ELEC = 0x00020000, /* Resist elec a lot */ + RF3_IM_FIRE = 0x00040000, /* Resist fire a lot */ + RF3_IM_COLD = 0x00080000, /* Resist cold a lot */ + RF3_IM_POIS = 0x00100000, /* Resist poison a lot */ + RF3_RES_TELE = 0x00200000, /* Resist teleportation */ + RF3_RES_NETH = 0x00400000, /* Resist nether a lot */ + RF3_RES_WATE = 0x00800000, /* Resist water */ + RF3_RES_PLAS = 0x01000000, /* Resist plasma */ + RF3_RES_NEXU = 0x02000000, /* Resist nexus */ + RF3_RES_DISE = 0x04000000, /* Resist disenchantment */ + RF3_RES_ALL = 0x08000000, /* Resist all */ +} old_monster_resistance_type; + +typedef enum old_monster_breath_type { + RF4_BR_LITE = 0x00004000, /* Breathe Lite */ + RF4_BR_DARK = 0x00008000, /* Breathe Dark */ + RF4_BR_CONF = 0x00010000, /* Breathe Confusion */ + RF4_BR_SOUN = 0x00020000, /* Breathe Sound */ + RF4_BR_CHAO = 0x00040000, /* Breathe Chaos */ + RF4_BR_TIME = 0x00200000, /* Breathe Time */ + RF4_BR_INER = 0x00400000, /* Breathe Inertia */ + RF4_BR_GRAV = 0x00800000, /* Breathe Gravity */ + RF4_BR_SHAR = 0x01000000, /* Breathe Shards */ + RF4_BR_WALL = 0x04000000, /* Breathe Force */ +} old_monster_breath_type; + void rd_item_old(player_type *player_ptr, object_type *o_ptr); void rd_monster_old(player_type *player_ptr, monster_type *m_ptr); +void set_old_lore(monster_race *r_ptr, const MONRACE_IDX r_idx); diff --git a/src/savedata/load.c b/src/savedata/load.c index 20b14506a..45f335c74 100644 --- a/src/savedata/load.c +++ b/src/savedata/load.c @@ -76,10 +76,11 @@ #include "savedata/angband-version-comparer.h" #include "savedata/item-loader.h" #include "savedata/load-util.h" +#include "savedata/load-v1-5-0.h" #include "savedata/monster-loader.h" #include "savedata/old-feature-types.h" -#include "savedata/savedata-flag-types.h" #include "savedata/save.h" +#include "savedata/savedata-flag-types.h" #include "spell/spells-status.h" #include "store/store-util.h" #include "store/store.h" @@ -103,48 +104,6 @@ static const int OLD_QUEST_WATER_CAVE = 18; // 湖の洞窟. static const int QUEST_OLD_CASTLE = 27; // 古い城. static const int QUEST_ROYAL_CRYPT = 28; // 王家の墓. -/* - * Old monster bit flags of racial resistances - */ -#define RF3_IM_ACID 0x00010000 /* Resist acid a lot */ -#define RF3_IM_ELEC 0x00020000 /* Resist elec a lot */ -#define RF3_IM_FIRE 0x00040000 /* Resist fire a lot */ -#define RF3_IM_COLD 0x00080000 /* Resist cold a lot */ -#define RF3_IM_POIS 0x00100000 /* Resist poison a lot */ -#define RF3_RES_TELE 0x00200000 /* Resist teleportation */ -#define RF3_RES_NETH 0x00400000 /* Resist nether a lot */ -#define RF3_RES_WATE 0x00800000 /* Resist water */ -#define RF3_RES_PLAS 0x01000000 /* Resist plasma */ -#define RF3_RES_NEXU 0x02000000 /* Resist nexus */ -#define RF3_RES_DISE 0x04000000 /* Resist disenchantment */ -#define RF3_RES_ALL 0x08000000 /* Resist all */ - -#define MOVE_RF3_TO_RFR(R_PTR, RF3, RFR) \ - { \ - if ((R_PTR)->r_flags3 & (RF3)) { \ - (R_PTR)->r_flags3 &= ~(RF3); \ - (R_PTR)->r_flagsr |= (RFR); \ - } \ - } - -#define RF4_BR_TO_RFR(R_PTR, RF4_BR, RFR) \ - { \ - if ((R_PTR)->r_flags4 & (RF4_BR)) { \ - (R_PTR)->r_flagsr |= (RFR); \ - } \ - } - -#define RF4_BR_LITE 0x00004000 /* Breathe Lite */ -#define RF4_BR_DARK 0x00008000 /* Breathe Dark */ -#define RF4_BR_CONF 0x00010000 /* Breathe Confusion */ -#define RF4_BR_SOUN 0x00020000 /* Breathe Sound */ -#define RF4_BR_CHAO 0x00040000 /* Breathe Chaos */ -#define RF4_BR_TIME 0x00200000 /* Breathe Time */ -#define RF4_BR_INER 0x00400000 /* Breathe Inertia */ -#define RF4_BR_GRAV 0x00800000 /* Breathe Gravity */ -#define RF4_BR_SHAR 0x01000000 /* Breathe Shards */ -#define RF4_BR_WALL 0x04000000 /* Breathe Force */ - /*! * @brief モンスターの思い出を読み込む / Read the monster lore * @param r_idx 読み込み先モンスターID @@ -199,40 +158,10 @@ static void rd_lore(MONRACE_IDX r_idx) rd_u32b(&r_ptr->r_flags4); rd_u32b(&r_ptr->r_flags5); rd_u32b(&r_ptr->r_flags6); - if (h_older_than(1, 5, 0, 3)) { - r_ptr->r_flagsr = 0L; - MOVE_RF3_TO_RFR(r_ptr, RF3_IM_ACID, RFR_IM_ACID); - MOVE_RF3_TO_RFR(r_ptr, RF3_IM_ELEC, RFR_IM_ELEC); - MOVE_RF3_TO_RFR(r_ptr, RF3_IM_FIRE, RFR_IM_FIRE); - MOVE_RF3_TO_RFR(r_ptr, RF3_IM_COLD, RFR_IM_COLD); - MOVE_RF3_TO_RFR(r_ptr, RF3_IM_POIS, RFR_IM_POIS); - MOVE_RF3_TO_RFR(r_ptr, RF3_RES_TELE, RFR_RES_TELE); - MOVE_RF3_TO_RFR(r_ptr, RF3_RES_NETH, RFR_RES_NETH); - MOVE_RF3_TO_RFR(r_ptr, RF3_RES_WATE, RFR_RES_WATE); - MOVE_RF3_TO_RFR(r_ptr, RF3_RES_PLAS, RFR_RES_PLAS); - MOVE_RF3_TO_RFR(r_ptr, RF3_RES_NEXU, RFR_RES_NEXU); - MOVE_RF3_TO_RFR(r_ptr, RF3_RES_DISE, RFR_RES_DISE); - MOVE_RF3_TO_RFR(r_ptr, RF3_RES_ALL, RFR_RES_ALL); - - RF4_BR_TO_RFR(r_ptr, RF4_BR_LITE, RFR_RES_LITE); - RF4_BR_TO_RFR(r_ptr, RF4_BR_DARK, RFR_RES_DARK); - RF4_BR_TO_RFR(r_ptr, RF4_BR_SOUN, RFR_RES_SOUN); - RF4_BR_TO_RFR(r_ptr, RF4_BR_CHAO, RFR_RES_CHAO); - RF4_BR_TO_RFR(r_ptr, RF4_BR_TIME, RFR_RES_TIME); - RF4_BR_TO_RFR(r_ptr, RF4_BR_INER, RFR_RES_INER); - RF4_BR_TO_RFR(r_ptr, RF4_BR_GRAV, RFR_RES_GRAV); - RF4_BR_TO_RFR(r_ptr, RF4_BR_SHAR, RFR_RES_SHAR); - RF4_BR_TO_RFR(r_ptr, RF4_BR_WALL, RFR_RES_WALL); - - if (r_ptr->r_flags4 & RF4_BR_CONF) - r_ptr->r_flags3 |= RF3_NO_CONF; - if (r_idx == MON_STORMBRINGER) - r_ptr->r_flagsr |= RFR_RES_CHAO; - if (r_ptr->r_flags3 & RF3_ORC) - r_ptr->r_flagsr |= RFR_RES_DARK; - } else { + if (h_older_than(1, 5, 0, 3)) + set_old_lore(r_ptr, r_idx); + else rd_u32b(&r_ptr->r_flagsr); - } rd_byte(&tmp8u); r_ptr->max_num = (MONSTER_NUMBER)tmp8u; @@ -1871,7 +1800,7 @@ static errr rd_savefile_new_aux(player_type *creature_ptr) if (arg_fiddle) load_note(_("メッセージをロードしました", "Loaded Messages")); - /* ランダムクエストのモンスターを確定するために試行する回数 / Maximum number of tries for selection of a proper quest monster */ + /* ランダムクエストのモンスターを確定するために試行する回数 / Maximum number of tries for selection of a proper quest monster */ const int MAX_TRIES = 100; for (int i = 0; i < max_r_idx; i++) { monster_race *r_ptr = &r_info[i]; -- 2.11.0