Skip to content

Commit

Permalink
Merge pull request hengband#4843 from Hourier/Demolish-MonraceHook-13
Browse files Browse the repository at this point in the history
モンスター生成フィルタ用のグローバル関数解体 その7
  • Loading branch information
Hourier authored Jan 19, 2025
2 parents d127b6c + a2cde3f commit 1c396a4
Show file tree
Hide file tree
Showing 11 changed files with 107 additions and 239 deletions.
208 changes: 0 additions & 208 deletions src/monster-race/monster-race-hook.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,26 +80,6 @@ void vault_prep_dragon(PlayerType *player_ptr)
vault_aux_dragon_mask4.set(rand_choice(breath_list));
}

/*
* Helper function for "glass room"
*/
bool vault_aux_shards(PlayerType *player_ptr, MonraceId r_idx)
{
const auto &monrace = MonraceList::get_instance().get_monrace(r_idx);
const auto &floor = *player_ptr->current_floor_ptr;
auto is_valid = !floor.is_underground() || DungeonMonraceService::is_suitable_for_dungeon(floor.dungeon_id, r_idx);
is_valid &= monrace.is_suitable_for_special_room();
if (!is_valid) {
return false;
}

if (monrace.ability_flags.has_not(MonsterAbilityType::BR_SHAR)) {
return false;
}

return true;
}

/*!
* @brief モンスターがゼリーnestの生成必要条件を満たしているかを返す /
* Helper function for "monster nest (jelly)"
Expand Down Expand Up @@ -339,91 +319,6 @@ bool vault_aux_symbol_g(PlayerType *player_ptr, MonraceId r_idx)
return true;
}

/*!
* @brief モンスターがオークpitの生成必要条件を満たしているかを返す /
* Helper function for "monster pit (orc)"
* @param r_idx 確認したいモンスター種族ID
* @return 生成必要条件を満たしているならTRUEを返す。
*/
bool vault_aux_orc(PlayerType *player_ptr, MonraceId r_idx)
{
const auto &monrace = MonraceList::get_instance().get_monrace(r_idx);
const auto &floor = *player_ptr->current_floor_ptr;
auto is_valid = !floor.is_underground() || DungeonMonraceService::is_suitable_for_dungeon(floor.dungeon_id, r_idx);
is_valid &= monrace.is_suitable_for_special_room();
if (!is_valid) {
return false;
}

if (monrace.kind_flags.has_not(MonsterKindType::ORC)) {
return false;
}

if (monrace.kind_flags.has(MonsterKindType::UNDEAD)) {
return false;
}

return true;
}

/*!
* @brief モンスターがトロルpitの生成必要条件を満たしているかを返す /
* Helper function for "monster pit (troll)"
* @param r_idx 確認したいモンスター種族ID
* @return 生成必要条件を満たしているならTRUEを返す。
*/
bool vault_aux_troll(PlayerType *player_ptr, MonraceId r_idx)
{
const auto &monrace = MonraceList::get_instance().get_monrace(r_idx);
const auto &floor = *player_ptr->current_floor_ptr;
auto is_valid = !floor.is_underground() || DungeonMonraceService::is_suitable_for_dungeon(floor.dungeon_id, r_idx);
is_valid &= monrace.is_suitable_for_special_room();
if (!is_valid) {
return false;
}

if (monrace.kind_flags.has_not(MonsterKindType::TROLL)) {
return false;
}

if (monrace.kind_flags.has(MonsterKindType::UNDEAD)) {
return false;
}

return true;
}

/*!
* @brief モンスターが巨人pitの生成必要条件を満たしているかを返す /
* Helper function for "monster pit (giant)"
* @param r_idx 確認したいモンスター種族ID
* @return 生成必要条件を満たしているならTRUEを返す。
*/
bool vault_aux_giant(PlayerType *player_ptr, MonraceId r_idx)
{
const auto &monrace = MonraceList::get_instance().get_monrace(r_idx);
const auto &floor = *player_ptr->current_floor_ptr;
auto is_valid = !floor.is_underground() || DungeonMonraceService::is_suitable_for_dungeon(floor.dungeon_id, r_idx);
is_valid &= monrace.is_suitable_for_special_room();
if (!is_valid) {
return false;
}

if (monrace.kind_flags.has_not(MonsterKindType::GIANT)) {
return false;
}

if (monrace.kind_flags.has(MonsterKindType::GOOD)) {
return false;
}

if (monrace.kind_flags.has(MonsterKindType::UNDEAD)) {
return false;
}

return true;
}

/*!
* @brief モンスターがドラゴンpitの生成必要条件を満たしているかを返す /
* Helper function for "monster pit (dragon)"
Expand Down Expand Up @@ -457,106 +352,3 @@ bool vault_aux_dragon(PlayerType *player_ptr, MonraceId r_idx)

return true;
}

/*!
* @brief モンスターが悪魔pitの生成必要条件を満たしているかを返す /
* Helper function for "monster pit (demon)"
* @param r_idx 確認したいモンスター種族ID
* @return 生成必要条件を満たしているならTRUEを返す。
*/
bool vault_aux_demon(PlayerType *player_ptr, MonraceId r_idx)
{
const auto &monrace = MonraceList::get_instance().get_monrace(r_idx);
const auto &floor = *player_ptr->current_floor_ptr;
auto is_valid = !floor.is_underground() || DungeonMonraceService::is_suitable_for_dungeon(floor.dungeon_id, r_idx);
is_valid &= monrace.is_suitable_for_special_room();
if (!is_valid) {
return false;
}

if (monrace.behavior_flags.has(MonsterBehaviorType::KILL_BODY) && monrace.behavior_flags.has_not(MonsterBehaviorType::NEVER_BLOW)) {
return false;
}

if (monrace.kind_flags.has_not(MonsterKindType::DEMON)) {
return false;
}

return true;
}

/*!
* @brief モンスターが狂気pitの生成必要条件を満たしているかを返す /
* Helper function for "monster pit (lovecraftian)"
* @param r_idx 確認したいモンスター種族ID
* @return 生成必要条件を満たしているならTRUEを返す。
*/
bool vault_aux_cthulhu(PlayerType *player_ptr, MonraceId r_idx)
{
const auto &monrace = MonraceList::get_instance().get_monrace(r_idx);
const auto &floor = *player_ptr->current_floor_ptr;
auto is_valid = !floor.is_underground() || DungeonMonraceService::is_suitable_for_dungeon(floor.dungeon_id, r_idx);
is_valid &= monrace.is_suitable_for_special_room();
if (!is_valid) {
return false;
}

if (monrace.behavior_flags.has(MonsterBehaviorType::KILL_BODY) && monrace.behavior_flags.has_not(MonsterBehaviorType::NEVER_BLOW)) {
return false;
}

if (monrace.misc_flags.has_not(MonsterMiscType::ELDRITCH_HORROR)) {
return false;
}

return true;
}

/*!
* @brief モンスターがダークエルフpitの生成必要条件を満たしているかを返す /
* Helper function for "monster pit (dark elf)"
* @param r_idx 確認したいモンスター種族ID
* @return 生成必要条件を満たしているならTRUEを返す。
*/
bool vault_aux_dark_elf(PlayerType *player_ptr, MonraceId r_idx)
{
static const std::set<MonraceId> dark_elf_list = {
MonraceId::D_ELF,
MonraceId::D_ELF_MAGE,
MonraceId::D_ELF_WARRIOR,
MonraceId::D_ELF_PRIEST,
MonraceId::D_ELF_LORD,
MonraceId::D_ELF_WARLOCK,
MonraceId::D_ELF_DRUID,
MonraceId::NIGHTBLADE,
MonraceId::D_ELF_SORC,
MonraceId::D_ELF_SHADE,
};

const auto &monrace = MonraceList::get_instance().get_monrace(r_idx);
const auto &floor = *player_ptr->current_floor_ptr;
auto is_valid = !floor.is_underground() || DungeonMonraceService::is_suitable_for_dungeon(floor.dungeon_id, r_idx);
is_valid &= monrace.is_suitable_for_special_room();
if (!is_valid) {
return false;
}

return dark_elf_list.find(r_idx) != dark_elf_list.end();
}

/*!
* @brief モンスター種族が釣れる種族かどうかを判定する。
* @param r_idx 判定したいモンスター種族のID
* @return 釣れる対象ならばTRUEを返す
*/
bool monster_is_fishing_target(PlayerType *player_ptr, MonraceId r_idx)
{
/* Unused */
(void)player_ptr;

const auto &monrace = monraces_info[r_idx];
auto can_fish = monrace.feature_flags.has(MonsterFeatureType::AQUATIC);
can_fish &= monrace.kind_flags.has_not(MonsterKindType::UNIQUE);
can_fish &= angband_strchr("Jjlw", monrace.symbol_definition.character) != nullptr;
return can_fish;
}
9 changes: 0 additions & 9 deletions src/monster-race/monster-race-hook.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ void vault_prep_clone(PlayerType *player_ptr);
void vault_prep_dragon(PlayerType *player_ptr);
void vault_prep_symbol(PlayerType *player_ptr);

bool vault_aux_shards(PlayerType *player_ptr, MonraceId r_idx);
bool vault_aux_jelly(PlayerType *player_ptr, MonraceId r_idx);
bool vault_aux_animal(PlayerType *player_ptr, MonraceId r_idx);
bool vault_aux_undead(PlayerType *player_ptr, MonraceId r_idx);
Expand All @@ -24,12 +23,4 @@ bool vault_aux_mimic(PlayerType *player_ptr, MonraceId r_idx);
bool vault_aux_clone(PlayerType *player_ptr, MonraceId r_idx);
bool vault_aux_symbol_e(PlayerType *player_ptr, MonraceId r_idx);
bool vault_aux_symbol_g(PlayerType *player_ptr, MonraceId r_idx);
bool vault_aux_orc(PlayerType *player_ptr, MonraceId r_idx);
bool vault_aux_troll(PlayerType *player_ptr, MonraceId r_idx);
bool vault_aux_giant(PlayerType *player_ptr, MonraceId r_idx);
bool vault_aux_dragon(PlayerType *player_ptr, MonraceId r_idx);
bool vault_aux_demon(PlayerType *player_ptr, MonraceId r_idx);
bool vault_aux_cthulhu(PlayerType *player_ptr, MonraceId r_idx);
bool vault_aux_dark_elf(PlayerType *player_ptr, MonraceId r_idx);

bool monster_is_fishing_target(PlayerType *player_ptr, MonraceId r_idx);
20 changes: 10 additions & 10 deletions src/monster/monster-util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -225,9 +225,9 @@ static bool do_hook(PlayerType *player_ptr, MonraceHook hook, MonraceId monrace_
case MonraceHook::HUMAN:
return monrace.is_eatable_human();
case MonraceHook::GLASS:
return is_suitable_for_dungeon && monrace.is_suitable_for_glass();
return is_suitable_for_dungeon && monrace.is_suitable_for_glass_through();
case MonraceHook::SHARDS:
return vault_aux_shards(player_ptr, monrace_id);
return is_suitable_for_dungeon && monrace.is_suitable_for_glass_breaking();
case MonraceHook::TANUKI: {
if (!monrace.is_suitable_for_tanuki()) {
return false;
Expand All @@ -238,7 +238,7 @@ static bool do_hook(PlayerType *player_ptr, MonraceHook hook, MonraceId monrace_
return do_hook(player_ptr, hook_tanuki, monrace_id);
}
case MonraceHook::FISHING:
return monster_is_fishing_target(player_ptr, monrace_id);
return monrace.is_catchable_for_fishing();
case MonraceHook::QUEST:
return monrace.is_suitable_for_random_quest();
case MonraceHook::VAULT:
Expand All @@ -253,8 +253,8 @@ static bool do_hook(PlayerType *player_ptr, MonraceHook hook, MonraceId monrace_
return vault_aux_symbol_e(player_ptr, monrace_id);
case MonraceHook::MIMIC:
return vault_aux_mimic(player_ptr, monrace_id);
case MonraceHook::LOVECRAFTIAN:
return vault_aux_cthulhu(player_ptr, monrace_id);
case MonraceHook::HORROR:
return is_suitable_for_dungeon && monrace.is_suitable_for_horror_pit();
case MonraceHook::KENNEL:
return vault_aux_kennel(player_ptr, monrace_id);
case MonraceHook::ANIMAL:
Expand All @@ -264,17 +264,17 @@ static bool do_hook(PlayerType *player_ptr, MonraceHook hook, MonraceId monrace_
case MonraceHook::UNDEAD:
return vault_aux_undead(player_ptr, monrace_id);
case MonraceHook::ORC:
return vault_aux_orc(player_ptr, monrace_id);
return is_suitable_for_dungeon && monrace.is_suitable_for_orc_pit();
case MonraceHook::TROLL:
return vault_aux_troll(player_ptr, monrace_id);
return is_suitable_for_dungeon && monrace.is_suitable_for_troll_pit();
case MonraceHook::GIANT:
return vault_aux_giant(player_ptr, monrace_id);
return is_suitable_for_dungeon && monrace.is_suitable_for_giant_pit();
case MonraceHook::DRAGON:
return vault_aux_dragon(player_ptr, monrace_id);
case MonraceHook::DEMON:
return vault_aux_demon(player_ptr, monrace_id);
return is_suitable_for_dungeon && monrace.is_suitable_for_demon_pit();
case MonraceHook::DARK_ELF:
return vault_aux_dark_elf(player_ptr, monrace_id);
return is_suitable_for_dungeon && monrace.is_suitable_for_special_room() && MonraceList::is_dark_elf(monrace_id);
default:
THROW_EXCEPTION(std::logic_error, format("Invalid monrace hook type is specified! %d", enum2i(hook)));
}
Expand Down
4 changes: 2 additions & 2 deletions src/room/pit-nest-util.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ enum class NestKind {
SYMBOL_GOOD = 2,
SYMBOL_EVIL = 3,
MIMIC = 4,
LOVECRAFTIAN = 5,
HORROR = 5,
KENNEL = 6,
ANIMAL = 7,
CHAPEL = 8,
Expand All @@ -23,7 +23,7 @@ enum class PitKind {
ORC = 0,
TROLL = 1,
GIANT = 2,
LOVECRAFTIAN = 3,
HORROR = 3,
SYMBOL_GOOD = 4,
SYMBOL_EVIL = 5,
CHAPEL = 6,
Expand Down
2 changes: 1 addition & 1 deletion src/room/rooms-nest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ const std::map<NestKind, nest_pit_type> nest_types = {
{ NestKind::SYMBOL_GOOD, { _("シンボル(善)", "symbol good"), MonraceHook::GOOD, vault_prep_symbol, 25, 2 } },
{ NestKind::SYMBOL_EVIL, { _("シンボル(悪)", "symbol evil"), MonraceHook::EVIL, vault_prep_symbol, 25, 2 } },
{ NestKind::MIMIC, { _("ミミック", "mimic"), MonraceHook::MIMIC, std::nullopt, 30, 4 } },
{ NestKind::LOVECRAFTIAN, { _("狂気", "lovecraftian"), MonraceHook::LOVECRAFTIAN, std::nullopt, 70, 2 } },
{ NestKind::HORROR, { _("狂気", "lovecraftian"), MonraceHook::HORROR, std::nullopt, 70, 2 } },
{ NestKind::KENNEL, { _("犬小屋", "kennel"), MonraceHook::KENNEL, std::nullopt, 45, 4 } },
{ NestKind::ANIMAL, { _("動物園", "animal"), MonraceHook::ANIMAL, std::nullopt, 35, 5 } },
{ NestKind::CHAPEL, { _("教会", "chapel"), MonraceHook::CHAPEL, std::nullopt, 75, 4 } },
Expand Down
2 changes: 1 addition & 1 deletion src/room/rooms-pit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ const std::map<PitKind, nest_pit_type> pit_types = {
{ PitKind::ORC, { _("オーク", "orc"), MonraceHook::ORC, std::nullopt, 5, 6 } },
{ PitKind::TROLL, { _("トロル", "troll"), MonraceHook::TROLL, std::nullopt, 20, 6 } },
{ PitKind::GIANT, { _("巨人", "giant"), MonraceHook::GIANT, std::nullopt, 50, 6 } },
{ PitKind::LOVECRAFTIAN, { _("狂気", "lovecraftian"), MonraceHook::LOVECRAFTIAN, std::nullopt, 80, 2 } },
{ PitKind::HORROR, { _("狂気", "lovecraftian"), MonraceHook::HORROR, std::nullopt, 80, 2 } },
{ PitKind::SYMBOL_GOOD, { _("シンボル(善)", "symbol good"), MonraceHook::GOOD, vault_prep_symbol, 70, 1 } },
{ PitKind::SYMBOL_EVIL, { _("シンボル(悪)", "symbol evil"), MonraceHook::EVIL, vault_prep_symbol, 70, 1 } },
{ PitKind::CHAPEL, { _("教会", "chapel"), MonraceHook::CHAPEL, std::nullopt, 65, 2 } },
Expand Down
2 changes: 1 addition & 1 deletion src/system/enums/monrace/monrace-hook-types.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ enum class MonraceHook {
GOOD,
EVIL,
MIMIC,
LOVECRAFTIAN,
HORROR,
KENNEL,
ANIMAL,
CHAPEL,
Expand Down
Loading

0 comments on commit 1c396a4

Please sign in to comment.