m_ptr = &player_ptr->current_floor_ptr->m_list[g_ptr->m_idx];
monster_race *r_ptr;
r_ptr = &r_info[m_ptr->r_idx];
- if ((r_ptr->flags3 & RF3_EVIL) && !(r_ptr->flags1 & RF1_QUESTOR) && !(r_ptr->flags1 & RF1_UNIQUE) && !player_ptr->current_floor_ptr->inside_arena && !player_ptr->current_floor_ptr->quest_number && (r_ptr->level < randint1(player_ptr->lev + 50)) && m_ptr->mflag2.has_not(MonsterConstantFlagType::NOGENO)) {
+ if ((r_ptr->flags3 & RF3_EVIL) && !(r_ptr->flags1 & RF1_QUESTOR) && !(r_ptr->flags1 & RF1_UNIQUE) && !player_ptr->current_floor_ptr->inside_arena && !inside_quest(player_ptr->current_floor_ptr->quest_number) && (r_ptr->level < randint1(player_ptr->lev + 50)) && m_ptr->mflag2.has_not(MonsterConstantFlagType::NOGENO)) {
if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname) {
GAME_TEXT m_name[MAX_NLEN];
monster_desc(player_ptr, m_name, m_ptr, MD_INDEF_VISIBLE);
player_ptr->max_plv = player_ptr->lev = 1;
player_ptr->arena_number = 0;
player_ptr->current_floor_ptr->inside_arena = false;
- player_ptr->current_floor_ptr->quest_number = 0;
+ player_ptr->current_floor_ptr->quest_number = QuestId::NONE;
player_ptr->exit_bldg = true;
player_ptr->today_mon = 0;
int number_of_quests = MAX_RANDOM_QUEST - MIN_RANDOM_QUEST + 1;
init_flags = INIT_ASSIGN;
floor_type *floor_ptr = player_ptr->current_floor_ptr;
- floor_ptr->quest_number = MIN_RANDOM_QUEST;
+ floor_ptr->quest_number = i2enum<QuestId>(MIN_RANDOM_QUEST);
parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
- floor_ptr->quest_number = 0;
+ floor_ptr->quest_number = QuestId::NONE;
for (int i = MIN_RANDOM_QUEST + number_of_quests - 1; i >= MIN_RANDOM_QUEST; i--) {
quest_type *q_ptr = &quest[i];
monster_race *quest_r_ptr;
}
init_flags = INIT_ASSIGN;
- floor_ptr->quest_number = QUEST_OBERON;
+ floor_ptr->quest_number = QuestId::OBERON;
parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
- quest[QUEST_OBERON].status = QuestStatusType::TAKEN;
+ quest[enum2i(QuestId::OBERON)].status = QuestStatusType::TAKEN;
- floor_ptr->quest_number = QUEST_SERPENT;
+ floor_ptr->quest_number = QuestId::SERPENT;
parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
- quest[QUEST_SERPENT].status = QuestStatusType::TAKEN;
- floor_ptr->quest_number = 0;
+ quest[enum2i(QuestId::SERPENT)].status = QuestStatusType::TAKEN;
+ floor_ptr->quest_number = QuestId::NONE;
}
/*!
*/
static bool confirm_leave_level(PlayerType *player_ptr, bool down_stair)
{
- quest_type *q_ptr = &quest[player_ptr->current_floor_ptr->quest_number];
- if (confirm_quest && player_ptr->current_floor_ptr->quest_number && (q_ptr->type == QuestKindType::RANDOM || (q_ptr->flags & QUEST_FLAG_ONCE && q_ptr->status != QuestStatusType::COMPLETED) || (q_ptr->flags & QUEST_FLAG_TOWER && ((q_ptr->status != QuestStatusType::STAGE_COMPLETED) || (down_stair && (quest[QUEST_TOWER1].status != QuestStatusType::COMPLETED)))))) {
+ quest_type *q_ptr = &quest[enum2i(player_ptr->current_floor_ptr->quest_number)];
+ if (confirm_quest && inside_quest(player_ptr->current_floor_ptr->quest_number) && (q_ptr->type == QuestKindType::RANDOM || (q_ptr->flags & QUEST_FLAG_ONCE && q_ptr->status != QuestStatusType::COMPLETED) || (q_ptr->flags & QUEST_FLAG_TOWER && ((q_ptr->status != QuestStatusType::STAGE_COMPLETED) || (down_stair && (quest[enum2i(QuestId::TOWER1)].status != QuestStatusType::COMPLETED)))))) {
msg_print(_("この階を一度去ると二度と戻って来られません。", "You can't come back here once you leave this floor."));
return get_check(_("本当にこの階を去りますか?", "Really leave this floor? "));
}
sound(SOUND_STAIRWAY);
leave_quest_check(player_ptr);
- player_ptr->current_floor_ptr->quest_number = g_ptr->special;
- if (quest[player_ptr->current_floor_ptr->quest_number].status == QuestStatusType::UNTAKEN) {
- if (quest[player_ptr->current_floor_ptr->quest_number].type != QuestKindType::RANDOM) {
+ player_ptr->current_floor_ptr->quest_number = i2enum<QuestId>(g_ptr->special);
+ if (quest[enum2i(player_ptr->current_floor_ptr->quest_number)].status == QuestStatusType::UNTAKEN) {
+ if (quest[enum2i(player_ptr->current_floor_ptr->quest_number)].type != QuestKindType::RANDOM) {
init_flags = INIT_ASSIGN;
parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
}
- quest[player_ptr->current_floor_ptr->quest_number].status = QuestStatusType::TAKEN;
+ quest[enum2i(player_ptr->current_floor_ptr->quest_number)].status = QuestStatusType::TAKEN;
}
- if (!player_ptr->current_floor_ptr->quest_number) {
+ if (!inside_quest(player_ptr->current_floor_ptr->quest_number)) {
player_ptr->current_floor_ptr->dun_level = 0;
player_ptr->word_recall = 0;
}
if (autosave_l)
do_cmd_save_game(player_ptr, true);
- if (player_ptr->current_floor_ptr->quest_number && quest[player_ptr->current_floor_ptr->quest_number].type == QuestKindType::RANDOM) {
+ if (inside_quest(player_ptr->current_floor_ptr->quest_number) && quest[enum2i(player_ptr->current_floor_ptr->quest_number)].type == QuestKindType::RANDOM) {
leave_quest_check(player_ptr);
- player_ptr->current_floor_ptr->quest_number = 0;
+ player_ptr->current_floor_ptr->quest_number = QuestId::NONE;
}
- if (player_ptr->current_floor_ptr->quest_number && quest[player_ptr->current_floor_ptr->quest_number].type != QuestKindType::RANDOM) {
+ if (inside_quest(player_ptr->current_floor_ptr->quest_number) && quest[enum2i(player_ptr->current_floor_ptr->quest_number)].type != QuestKindType::RANDOM) {
leave_quest_check(player_ptr);
- player_ptr->current_floor_ptr->quest_number = g_ptr->special;
+ player_ptr->current_floor_ptr->quest_number = i2enum<QuestId>(g_ptr->special);
player_ptr->current_floor_ptr->dun_level = 0;
up_num = 0;
} else {
leave_quest_check(player_ptr);
leave_tower_check(player_ptr);
- player_ptr->current_floor_ptr->quest_number = g_ptr->special;
- if (quest[player_ptr->current_floor_ptr->quest_number].status == QuestStatusType::UNTAKEN) {
- if (quest[player_ptr->current_floor_ptr->quest_number].type != QuestKindType::RANDOM) {
+ player_ptr->current_floor_ptr->quest_number = i2enum<QuestId>(g_ptr->special);
+ if (quest[enum2i(player_ptr->current_floor_ptr->quest_number)].status == QuestStatusType::UNTAKEN) {
+ if (quest[enum2i(player_ptr->current_floor_ptr->quest_number)].type != QuestKindType::RANDOM) {
init_flags = INIT_ASSIGN;
parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
}
- quest[player_ptr->current_floor_ptr->quest_number].status = QuestStatusType::TAKEN;
+ quest[enum2i(player_ptr->current_floor_ptr->quest_number)].status = QuestStatusType::TAKEN;
}
- if (!player_ptr->current_floor_ptr->quest_number) {
+ if (!inside_quest(player_ptr->current_floor_ptr->quest_number)) {
player_ptr->current_floor_ptr->dun_level = 0;
player_ptr->word_recall = 0;
}
if (player_ptr->wild_mode)
return;
- if (player_ptr->current_floor_ptr->quest_number && !random_quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level)) {
+ if (inside_quest(player_ptr->current_floor_ptr->quest_number) && !inside_quest(random_quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level))) {
msg_print(_("典型的なクエストのダンジョンのようだ。", "Looks like a typical quest level."));
return;
}
w_ptr->character_dungeon = false;
floor_type *floor_ptr = player_ptr->current_floor_ptr;
floor_ptr->dun_level = 0;
- floor_ptr->quest_number = 0;
+ floor_ptr->quest_number = QuestId::NONE;
floor_ptr->inside_arena = false;
player_ptr->phase_out = false;
write_level = true;
static void generate_wilderness(PlayerType *player_ptr)
{
floor_type *floor_ptr = player_ptr->current_floor_ptr;
- if ((floor_ptr->dun_level == 0) && floor_ptr->quest_number)
+ if ((floor_ptr->dun_level == 0) && inside_quest(floor_ptr->quest_number))
return;
parse_fixed_map(player_ptr, "w_info.txt", 0, 0, w_ptr->max_wild_y, w_ptr->max_wild_x);
#include "system/monster-race-definition.h"
#include "system/player-type-definition.h"
#include "target/target-checker.h"
+#include "util/bit-flags-calculator.h"
#include "view/display-messages.h"
#include "world/world-turn-processor.h"
#include "world/world.h"
disturb(player_ptr, true, true);
auto quest_num = quest_number(player_ptr, floor_ptr->dun_level);
- if (quest_num > 0) {
- r_info[quest[quest_num].r_idx].flags1 |= RF1_QUESTOR;
+ if (inside_quest(quest_num)) {
+ r_info[quest[enum2i(quest_num)].r_idx].flags1 |= RF1_QUESTOR;
}
if (player_ptr->max_plv < player_ptr->lev) {
player_ptr->max_plv = player_ptr->lev;
}
- if ((max_dlv[player_ptr->dungeon_idx] < floor_ptr->dun_level) && !floor_ptr->quest_number) {
+ if ((max_dlv[player_ptr->dungeon_idx] < floor_ptr->dun_level) && !inside_quest(floor_ptr->quest_number)) {
max_dlv[player_ptr->dungeon_idx] = floor_ptr->dun_level;
if (record_maxdepth)
exe_write_diary(player_ptr, DIARY_MAXDEAPTH, floor_ptr->dun_level, nullptr);
handle_stuff(player_ptr);
term_fresh();
- if ((quest_num > 0)
- && (quest_type::is_fixed(quest_num) && !((quest_num == QUEST_OBERON) || (quest_num == QUEST_SERPENT) || !(quest[quest_num].flags & QUEST_FLAG_PRESET))))
+ if (inside_quest(quest_num)
+ && (quest_type::is_fixed(quest_num) && !((quest_num == QuestId::OBERON) || (quest_num == QuestId::SERPENT) || !(quest[enum2i(quest_num)].flags & QUEST_FLAG_PRESET))))
do_cmd_feeling(player_ptr);
if (player_ptr->phase_out) {
if (!player_ptr->playing || player_ptr->is_dead)
return;
- if (!floor_ptr->quest_number && (player_ptr->dungeon_idx == DUNGEON_ANGBAND)) {
+ if (!inside_quest(floor_ptr->quest_number) && (player_ptr->dungeon_idx == DUNGEON_ANGBAND)) {
quest_discovery(random_quest_number(player_ptr, floor_ptr->dun_level));
floor_ptr->quest_number = random_quest_number(player_ptr, floor_ptr->dun_level);
}
wild_regen--;
}
- if ((quest_num > 0) && !(r_info[quest[quest_num].r_idx].flags1 & RF1_UNIQUE)) {
- r_info[quest[quest_num].r_idx].flags1 &= ~RF1_QUESTOR;
+ if ((inside_quest(quest_num)) && none_bits(r_info[quest[enum2i(quest_num)].r_idx].flags1, RF1_UNIQUE)) {
+ r_info[quest[enum2i(quest_num)].r_idx].flags1 &= ~RF1_QUESTOR;
}
if (player_ptr->playing && !player_ptr->is_dead) {
this->set_quest_idx();
auto create_stairs = false;
auto reward = false;
- if ((this->quest_idx > 0) && (quest[this->quest_idx].status == QuestStatusType::TAKEN)) {
- this->q_ptr = &quest[this->quest_idx];
+ if (inside_quest(this->quest_idx) && (quest[enum2i(this->quest_idx)].status == QuestStatusType::TAKEN)) {
+ this->q_ptr = &quest[enum2i(this->quest_idx)];
auto [tmp_create_stairs, tmp_reward] = this->switch_completion();
create_stairs = tmp_create_stairs;
reward = tmp_reward;
{
auto *floor_ptr = this->player_ptr->current_floor_ptr;
this->quest_idx = floor_ptr->quest_number;
- if (this->quest_idx > 0) {
+ if (inside_quest(this->quest_idx)) {
return;
}
}
}
- this->quest_idx = i;
+ this->quest_idx = i2enum<QuestId>(i);
}
std::tuple<bool, bool> QuestCompletionChecker::switch_completion()
auto create_stairs = false;
if (none_bits(this->q_ptr->flags, QUEST_FLAG_PRESET)) {
create_stairs = true;
- this->player_ptr->current_floor_ptr->quest_number = 0;
+ this->player_ptr->current_floor_ptr->quest_number = QuestId::NONE;
}
- if ((this->quest_idx == QUEST_OBERON) || (this->quest_idx == QUEST_SERPENT)) {
+ if ((this->quest_idx == QuestId::OBERON) || (this->quest_idx == QuestId::SERPENT)) {
this->q_ptr->status = QuestStatusType::FINISHED;
}
}
this->q_ptr->status = QuestStatusType::STAGE_COMPLETED;
- auto is_tower_completed = quest[QUEST_TOWER1].status == QuestStatusType::STAGE_COMPLETED;
- is_tower_completed &= quest[QUEST_TOWER2].status == QuestStatusType::STAGE_COMPLETED;
- is_tower_completed &= quest[QUEST_TOWER3].status == QuestStatusType::STAGE_COMPLETED;
+ auto is_tower_completed = quest[enum2i(QuestId::TOWER1)].status == QuestStatusType::STAGE_COMPLETED;
+ is_tower_completed &= quest[enum2i(QuestId::TOWER2)].status == QuestStatusType::STAGE_COMPLETED;
+ is_tower_completed &= quest[enum2i(QuestId::TOWER3)].status == QuestStatusType::STAGE_COMPLETED;
if (is_tower_completed) {
- complete_quest(this->player_ptr, QUEST_TOWER1);
+ complete_quest(this->player_ptr, QuestId::TOWER1);
}
}
#pragma once
+#include "dungeon/quest.h"
#include "system/angband.h"
#include "util/point-2d.h"
#include <tuple>
private:
PlayerType *player_ptr;
monster_type *m_ptr;
- short quest_idx;
+ QuestId quest_idx;
quest_type *q_ptr = nullptr;
void set_quest_idx();
#include "world/world.h"
std::vector<quest_type> quest; /*!< Quest info */
-QUEST_IDX max_q_idx; /*!< Maximum number of quests */
+int16_t max_q_idx; /*!< Maximum number of quests */
char quest_text[10][80]; /*!< Quest text */
int quest_text_line; /*!< Current line of the quest text */
-int leaving_quest = 0;
+QuestId leaving_quest = QuestId::NONE;
/*!
* @brief クエスト突入時のメッセージテーブル / Array of places to find an inscription
* @param quest_idx クエストID
* @return 固定クエストならばTRUEを返す
*/
-bool quest_type::is_fixed(short quest_idx)
+bool quest_type::is_fixed(QuestId quest_idx)
{
- return ((quest_idx) < MIN_RANDOM_QUEST) || ((quest_idx) > MAX_RANDOM_QUEST);
+ return (enum2i(quest_idx) < MIN_RANDOM_QUEST) || (enum2i(quest_idx) > MAX_RANDOM_QUEST);
}
/*!
* @param player_ptr プレイヤーへの参照ポインタ
* @param quest_num 達成状態にしたいクエストのID
*/
-void complete_quest(PlayerType *player_ptr, QUEST_IDX quest_num)
+void complete_quest(PlayerType *player_ptr, QuestId quest_num)
{
- quest_type *const q_ptr = &quest[quest_num];
+ quest_type *const q_ptr = &quest[enum2i(quest_num)];
switch (q_ptr->type) {
case QuestKindType::RANDOM:
if (record_rand_quest)
- exe_write_diary(player_ptr, DIARY_RAND_QUEST_C, quest_num, nullptr);
+ exe_write_diary(player_ptr, DIARY_RAND_QUEST_C, enum2i(quest_num), nullptr);
break;
default:
if (record_fix_quest)
- exe_write_diary(player_ptr, DIARY_FIX_QUEST_C, quest_num, nullptr);
+ exe_write_diary(player_ptr, DIARY_FIX_QUEST_C, enum2i(quest_num), nullptr);
break;
}
void check_find_art_quest_completion(PlayerType *player_ptr, ObjectType *o_ptr)
{
/* Check if completed a quest */
- for (QUEST_IDX i = 0; i < max_q_idx; i++) {
+ for (int16_t i = 0; i < max_q_idx; i++) {
if ((quest[i].type == QuestKindType::FIND_ARTIFACT) && (quest[i].status == QuestStatusType::TAKEN) && (quest[i].k_idx == o_ptr->name1)) {
- complete_quest(player_ptr, i);
+ complete_quest(player_ptr, i2enum<QuestId>(i));
}
}
}
* @brief クエストの導入メッセージを表示する / Discover quest
* @param q_idx 開始されたクエストのID
*/
-void quest_discovery(QUEST_IDX q_idx)
+void quest_discovery(QuestId q_idx)
{
- quest_type *q_ptr = &quest[q_idx];
+ quest_type *q_ptr = &quest[enum2i(q_idx)];
monster_race *r_ptr = &r_info[q_ptr->r_idx];
MONSTER_NUMBER q_num = q_ptr->max_num;
- if (!q_idx)
+ if (!inside_quest(q_idx))
return;
GAME_TEXT name[MAX_NLEN];
* @param level 検索対象になる階
* @return クエストIDを返す。該当がない場合0を返す。
*/
-QUEST_IDX quest_number(PlayerType *player_ptr, DEPTH level)
+QuestId quest_number(PlayerType *player_ptr, DEPTH level)
{
floor_type *floor_ptr = player_ptr->current_floor_ptr;
- if (floor_ptr->quest_number)
+ if (inside_quest(floor_ptr->quest_number))
return (floor_ptr->quest_number);
- for (QUEST_IDX i = 0; i < max_q_idx; i++) {
+ for (int16_t i = 0; i < max_q_idx; i++) {
if (quest[i].status != QuestStatusType::TAKEN)
continue;
if ((quest[i].type == QuestKindType::KILL_LEVEL) && !(quest[i].flags & QUEST_FLAG_PRESET) && (quest[i].level == level) && (quest[i].dungeon == player_ptr->dungeon_idx))
- return i;
+ return i2enum<QuestId>(i);
}
return random_quest_number(player_ptr, level);
* @param level 検索対象になる階
* @return クエストIDを返す。該当がない場合0を返す。
*/
-QUEST_IDX random_quest_number(PlayerType *player_ptr, DEPTH level)
+QuestId random_quest_number(PlayerType *player_ptr, DEPTH level)
{
if (player_ptr->dungeon_idx != DUNGEON_ANGBAND)
- return 0;
+ return QuestId::NONE;
- for (QUEST_IDX i = MIN_RANDOM_QUEST; i < MAX_RANDOM_QUEST + 1; i++) {
+ for (int16_t i = MIN_RANDOM_QUEST; i < MAX_RANDOM_QUEST + 1; i++) {
if ((quest[i].type == QuestKindType::RANDOM) && (quest[i].status == QuestStatusType::TAKEN) && (quest[i].level == level) && (quest[i].dungeon == DUNGEON_ANGBAND)) {
- return i;
+ return i2enum<QuestId>(i);
}
}
- return 0;
+ return QuestId::NONE;
}
/*!
void leave_quest_check(PlayerType *player_ptr)
{
leaving_quest = player_ptr->current_floor_ptr->quest_number;
- if (!leaving_quest)
+ if (!inside_quest(leaving_quest))
return;
- quest_type *const q_ptr = &quest[leaving_quest];
+ quest_type *const q_ptr = &quest[enum2i<QuestId>(leaving_quest)];
bool is_one_time_quest = ((q_ptr->flags & QUEST_FLAG_ONCE) || (q_ptr->type == QuestKindType::RANDOM)) && (q_ptr->status == QuestStatusType::TAKEN);
if (!is_one_time_quest)
return;
/* Additional settings */
switch (q_ptr->type) {
case QuestKindType::TOWER:
- quest[QUEST_TOWER1].status = QuestStatusType::FAILED;
- quest[QUEST_TOWER1].complev = player_ptr->lev;
+ quest[enum2i(QuestId::TOWER1)].status = QuestStatusType::FAILED;
+ quest[enum2i(QuestId::TOWER1)].complev = player_ptr->lev;
break;
case QuestKindType::FIND_ARTIFACT:
a_info[q_ptr->k_idx].gen_flags.reset(ItemGenerationTraitType::QUESTITEM);
/* Record finishing a quest */
if (q_ptr->type == QuestKindType::RANDOM) {
if (record_rand_quest)
- exe_write_diary(player_ptr, DIARY_RAND_QUEST_F, leaving_quest, nullptr);
+ exe_write_diary(player_ptr, DIARY_RAND_QUEST_F, enum2i<QuestId>(leaving_quest), nullptr);
return;
}
if (record_fix_quest)
- exe_write_diary(player_ptr, DIARY_FIX_QUEST_F, leaving_quest, nullptr);
+ exe_write_diary(player_ptr, DIARY_FIX_QUEST_F, enum2i<QuestId>(leaving_quest), nullptr);
}
/*!
void leave_tower_check(PlayerType *player_ptr)
{
leaving_quest = player_ptr->current_floor_ptr->quest_number;
- bool is_leaving_from_tower = leaving_quest != 0;
- is_leaving_from_tower &= quest[leaving_quest].type == QuestKindType::TOWER;
- is_leaving_from_tower &= quest[QUEST_TOWER1].status != QuestStatusType::COMPLETED;
+ bool is_leaving_from_tower = inside_quest(leaving_quest);
+ is_leaving_from_tower &= quest[enum2i<QuestId>(leaving_quest)].type == QuestKindType::TOWER;
+ is_leaving_from_tower &= quest[enum2i(QuestId::TOWER1)].status != QuestStatusType::COMPLETED;
if (!is_leaving_from_tower)
return;
- if (quest[leaving_quest].type != QuestKindType::TOWER)
+ if (quest[enum2i<QuestId>(leaving_quest)].type != QuestKindType::TOWER)
return;
- quest[QUEST_TOWER1].status = QuestStatusType::FAILED;
- quest[QUEST_TOWER1].complev = player_ptr->lev;
+ quest[enum2i(QuestId::TOWER1)].status = QuestStatusType::FAILED;
+ quest[enum2i(QuestId::TOWER1)].complev = player_ptr->lev;
update_playtime();
- quest[QUEST_TOWER1].comptime = w_ptr->play_time;
+ quest[enum2i(QuestId::TOWER1)].comptime = w_ptr->play_time;
}
/*!
* @brief Player enters a new quest
*/
-void exe_enter_quest(PlayerType *player_ptr, QUEST_IDX quest_idx)
+void exe_enter_quest(PlayerType *player_ptr, QuestId quest_idx)
{
- if (quest[quest_idx].type != QuestKindType::RANDOM)
+ if (quest[enum2i<QuestId>(quest_idx)].type != QuestKindType::RANDOM)
player_ptr->current_floor_ptr->dun_level = 1;
player_ptr->current_floor_ptr->quest_number = quest_idx;
player_ptr->oldpx = 0;
leave_quest_check(player_ptr);
- exe_enter_quest(player_ptr, player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x].special);
+ exe_enter_quest(player_ptr, i2enum<QuestId>(player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x].special));
}
bool inside_quest(QuestId id)
#include "system/angband.h"
+#include "util/enum-converter.h"
#include <vector>
// clang-format off
/*
* Quest constants
*/
-constexpr short MIN_RANDOM_QUEST = 40; /*<! ランダムクエストを割り当てるクエストIDの開始値 */
-constexpr short MAX_RANDOM_QUEST = 49; /*<! ランダムクエストを割り当てるクエストIDの終了値 */
-constexpr short QUEST_TOWER1 = 5; /*<! 塔クエスト(第1階層)に割り振るクエストID */
-constexpr short QUEST_TOWER2 = 6; /*<! 塔クエスト(第2階層)に割り振るクエストID */
-constexpr short QUEST_TOWER3 = 7; /*<! 塔クエスト(第3階層)に割り振るクエストID */
-constexpr short QUEST_OBERON = 8; /*<! オベロン打倒クエストに割り振るクエストID */
-constexpr short QUEST_SERPENT = 9; /*<! サーペント打倒クエストに割り振るクエストID */
+enum class QuestId : int16_t{
+ NONE = 0, /* クエストなし */
+ THIEF = 1, /*<! 盗賊の隠れ家 */
+ SEWER = 2, /*<! 下水道 */
+ LOGURUS = 3, /*<! ログルス使い */
+ VAULT = 4, /*<! 宝物庫 */
+ TOWER1 = 5, /*<! 塔クエスト(第1階層)に割り振るクエストID */
+ TOWER2 = 6, /*<! 塔クエスト(第2階層)に割り振るクエストID */
+ TOWER3 = 7, /*<! 塔クエスト(第3階層)に割り振るクエストID */
+ OBERON = 8, /*<! オベロン打倒クエストに割り振るクエストID */
+ SERPENT = 9, /*<! サーペント打倒クエストに割り振るクエストID */
+ SORCERER = 10, /*<! 仙術エネルギー特異点 */
+ CHAOS = 11, /*<! カオスの特異点 */
+ NATURE = 12, /*<! 自然魔術の特異点 */
+ WARG = 14, /*<! ワーグを殲滅せよ */
+ ERIC = 15, /*<! エリックの要塞 */
+ MONSALVAT = 16, /*<! モンサルヴァト城への侵攻 */
+ CITY_SEA = 17, /*<! 海底都市(現在は没) */
+ WATER_CAVE = 18, /*<! 湖の洞窟 */
+ DOOM_1 = 19, /*<! 破滅のクエスト1 */
+ VAPOR = 20, /*<! 謎の瘴気 */
+ DOOM_2 = 21, /*<! 破滅のクエスト2 */
+ ORC_CAMP = 22, /*<! オークのキャンプ */
+ SPAWNING = 23, /*<! 増殖地獄 */
+ MS = 24, /*<! マイクロンフトの興亡 */
+ HAUNTED_HOUCE = 25, /*<! 幽霊屋敷 */
+ KILLING_FIELDS = 26, /*<! 激戦場 */
+ OLD_CASTLE = 27, /*<! 古い城 */
+ ROYAL_CRYPT = 28, /*<! 王家の墓 */
+ MIMIC = 29, /*<! ミミックの財宝 */
+ TENGU = 30, /*<! テングとデスソード */
+ WILLOW = 31, /*<! 柳じじい */
+ DARK_ELF = 32, /*<! ダークエルフの王 */
+ CLONE = 33, /*<! クローン地獄 */
+ DUMP_WITNESS = 34, /*<! もの言えぬ証人 */
+ RANDOM_QUEST1 = 40, /*<! ランダムクエストを割り当てるクエストIDの開始値 */
+ RANDOM_QUEST2 = 41,
+ RANDOM_QUEST3 = 42,
+ RANDOM_QUEST4 = 43,
+ RANDOM_QUEST5 = 44,
+ RANDOM_QUEST6 = 45,
+ RANDOM_QUEST7 = 46,
+ RANDOM_QUEST8 = 47,
+ RANDOM_QUEST9 = 48,
+ RANDOM_QUEST10 = 49, /*<! ランダムクエストを割り当てるクエストIDの終了値 */
+};
+
+constexpr auto MIN_RANDOM_QUEST = enum2i(QuestId::RANDOM_QUEST1);
+constexpr auto MAX_RANDOM_QUEST = enum2i(QuestId::RANDOM_QUEST10);
constexpr uint QUEST_FLAG_SILENT = 0x01; /*!< クエストフラグ: クエスト進行に関する情報表示を抑止する / no messages from completion */
constexpr uint QUEST_FLAG_PRESET = 0x02; /*!< クエストフラグ: クエストがダンジョン外で発生する / quest is outside the main dungeon */
PLAYER_LEVEL complev; /*!< クリア時プレイヤーレベル / player level (complete) */
REAL_TIME comptime; /*!< クリア時ゲーム時間 / quest clear time*/
- static bool is_fixed(short quest_idx);
+ static bool is_fixed(QuestId quest_idx);
};
extern std::vector<quest_type> quest;
-extern QUEST_IDX max_q_idx;
+extern int16_t max_q_idx;
extern char quest_text[10][80];
extern int quest_text_line;
-extern int leaving_quest;
+extern QuestId leaving_quest;
class ObjectType;
class PlayerType;
void determine_random_questor(PlayerType *player_ptr, quest_type *q_ptr);
void record_quest_final_status(quest_type *q_ptr, PLAYER_LEVEL lev, QuestStatusType stat);
-void complete_quest(PlayerType *player_ptr, QUEST_IDX quest_num);
+void complete_quest(PlayerType *player_ptr, QuestId quest_num);
void check_find_art_quest_completion(PlayerType *player_ptr, ObjectType *o_ptr);
-void quest_discovery(QUEST_IDX q_idx);
-QUEST_IDX quest_number(PlayerType *player_ptr, DEPTH level);
-QUEST_IDX random_quest_number(PlayerType *player_ptr, DEPTH level);
+void quest_discovery(QuestId q_idx);
+QuestId quest_number(PlayerType *player_ptr, DEPTH level);
+QuestId random_quest_number(PlayerType *player_ptr, DEPTH level);
void leave_quest_check(PlayerType *player_ptr);
void leave_tower_check(PlayerType *player_ptr);
-void exe_enter_quest(PlayerType *player_ptr, QUEST_IDX quest_idx);
+void exe_enter_quest(PlayerType *player_ptr, QuestId quest_idx);
void do_cmd_quest(PlayerType *player_ptr);
bool inside_quest(QuestId id);
process_result effect_monster_capture(PlayerType *player_ptr, effect_monster_type *em_ptr)
{
floor_type *floor_ptr = player_ptr->current_floor_ptr;
- if ((floor_ptr->quest_number && (quest[floor_ptr->inside_quest].type == QuestKindType::KILL_ALL) && !is_pet(em_ptr->m_ptr)) || any_bits(em_ptr->r_ptr->flags1, RF1_UNIQUE | RF1_QUESTOR) || any_bits(em_ptr->r_ptr->flags7, RF7_NAZGUL | RF7_UNIQUE2) || em_ptr->m_ptr->parent_m_idx) {
+ if ((inside_quest(floor_ptr->quest_number) && (quest[enum2i(floor_ptr->quest_number)].type == QuestKindType::KILL_ALL) && !is_pet(em_ptr->m_ptr)) || any_bits(em_ptr->r_ptr->flags1, RF1_UNIQUE | RF1_QUESTOR) || any_bits(em_ptr->r_ptr->flags7, RF7_NAZGUL | RF7_UNIQUE2) || em_ptr->m_ptr->parent_m_idx) {
msg_format(_("%sには効果がなかった。", "%s is unaffected."), em_ptr->m_name);
em_ptr->skipped = true;
return PROCESS_CONTINUE;
floor_ptr->width = panels_x * SCREEN_WID;
panel_row_min = floor_ptr->height;
panel_col_min = floor_ptr->width;
- if (floor_ptr->quest_number) {
+ if (inside_quest(floor_ptr->quest_number)) {
POSITION py = atoi(zz[0]);
POSITION px = atoi(zz[1]);
player_ptr->y = py;
if (zz[0][0] == 'T') {
max_towns = static_cast<int16_t>(atoi(zz[1]));
} else if (zz[0][0] == 'Q') {
- max_q_idx = (QUEST_IDX)atoi(zz[1]);
+ max_q_idx = (int16_t)atoi(zz[1]);
} else if (zz[0][0] == 'O') {
w_ptr->max_o_idx = (OBJECT_IDX)atoi(zz[1]);
} else if (zz[0][0] == 'M') {
return;
grid_type *g_ptr = &player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x];
- if ((player_ptr->change_floor_mode & CFM_UP) && !quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level))
+ if ((player_ptr->change_floor_mode & CFM_UP) && !inside_quest(quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level)))
g_ptr->feat = (player_ptr->change_floor_mode & CFM_SHAFT) ? feat_state(player_ptr->current_floor_ptr, feat_down_stair, FloorFeatureType::SHAFT) : feat_down_stair;
else if ((player_ptr->change_floor_mode & CFM_DOWN) && !ironman_downward)
g_ptr->feat = (player_ptr->change_floor_mode & CFM_SHAFT) ? feat_state(player_ptr->current_floor_ptr, feat_up_stair, FloorFeatureType::SHAFT) : feat_up_stair;
return;
auto quest_num = quest_number(player_ptr, floor_ptr->dun_level);
- if ((quest_num > 0)
- && (quest_type::is_fixed(quest_num) && !((quest_num == QUEST_OBERON) || (quest_num == QUEST_SERPENT) || !(quest[quest_num].flags & QUEST_FLAG_PRESET))))
+ if (inside_quest(quest_num)
+ && (quest_type::is_fixed(quest_num) && !((quest_num == QuestId::OBERON) || (quest_num == QuestId::SERPENT) || !(quest[enum2i(quest_num)].flags & QUEST_FLAG_PRESET))))
return;
byte new_feeling = get_dungeon_feeling(player_ptr);
for (POSITION x = 0; x < floor_ptr->width; x++)
place_bold(player_ptr, y, x, GB_SOLID_PERM);
- floor_ptr->base_level = quest[floor_ptr->quest_number].level;
+ floor_ptr->base_level = quest[enum2i(floor_ptr->quest_number)].level;
floor_ptr->dun_level = floor_ptr->base_level;
floor_ptr->object_level = floor_ptr->base_level;
floor_ptr->monster_level = floor_ptr->base_level;
if (record_stair)
- exe_write_diary(player_ptr, DIARY_TO_QUEST, floor_ptr->quest_number, nullptr);
+ exe_write_diary(player_ptr, DIARY_TO_QUEST, enum2i(floor_ptr->quest_number), nullptr);
get_mon_num_prep(player_ptr, get_monster_hook(player_ptr), nullptr);
init_flags = INIT_CREATE_DUNGEON;
generate_challenge_arena(player_ptr);
else if (player_ptr->phase_out)
generate_gambling_arena(player_ptr);
- else if (floor_ptr->quest_number)
+ else if (inside_quest(floor_ptr->quest_number))
generate_fixed_floor(player_ptr);
else if (!floor_ptr->dun_level)
if (player_ptr->wild_mode)
// 狂戦士でのプレイに支障をきたしうるので再生成する。
// 地上、荒野マップ、クエストでは連結性判定は行わない。
// TODO: 本来はダンジョン生成アルゴリズム自身で連結性を保証するのが理想ではある。
- const bool check_conn = okay && floor_ptr->dun_level > 0 && floor_ptr->quest_number == 0;
+ const bool check_conn = okay && floor_ptr->dun_level > 0 && !inside_quest(floor_ptr->quest_number);
if (check_conn && !floor_is_connected(floor_ptr, is_permanent_blocker)) {
// 一定回数試しても連結にならないなら諦める。
if (num >= 1000) {
#include "monster/monster-info.h"
#include "monster/monster-status.h"
#include "pet/pet-util.h"
+#include "player-status/player-energy.h"
#include "player/player-status.h"
#include "player/special-defense-types.h"
-#include "player-status/player-energy.h"
#include "save/floor-writer.h"
#include "system/artifact-type-definition.h"
#include "system/floor-type-definition.h"
feature_type *f_ptr = &f_info[g_ptr->feat];
bool ok = false;
if (floor_mode & CFM_UP) {
- if (f_ptr->flags.has_all_of({FloorFeatureType::LESS, FloorFeatureType::STAIRS}) && f_ptr->flags.has_not(FloorFeatureType::SPECIAL)) {
+ if (f_ptr->flags.has_all_of({ FloorFeatureType::LESS, FloorFeatureType::STAIRS }) && f_ptr->flags.has_not(FloorFeatureType::SPECIAL)) {
ok = true;
if (g_ptr->special && g_ptr->special == sf_ptr->upper_floor_id) {
sx = x;
}
}
} else if (floor_mode & CFM_DOWN) {
- if (f_ptr->flags.has_all_of({FloorFeatureType::MORE, FloorFeatureType::STAIRS}) && f_ptr->flags.has_not(FloorFeatureType::SPECIAL)) {
+ if (f_ptr->flags.has_all_of({ FloorFeatureType::MORE, FloorFeatureType::STAIRS }) && f_ptr->flags.has_not(FloorFeatureType::SPECIAL)) {
ok = true;
if (g_ptr->special && g_ptr->special == sf_ptr->lower_floor_id) {
sx = x;
if (tries > 20 * dis * dis)
dis++;
- if (!in_bounds(floor_ptr, ny, nx) || !is_cave_empty_bold(player_ptr, ny, nx) || floor_ptr->grid_array[ny][nx].is_rune_protection()
- || floor_ptr->grid_array[ny][nx].is_rune_explosion() || pattern_tile(floor_ptr, ny, nx))
+ if (!in_bounds(floor_ptr, ny, nx) || !is_cave_empty_bold(player_ptr, ny, nx)
+ || floor_ptr->grid_array[ny][nx].is_rune_protection() || floor_ptr->grid_array[ny][nx].is_rune_explosion() || pattern_tile(floor_ptr, ny, nx))
continue;
m_ptr = &floor_ptr->m_list[m_idx];
return;
*g_ptr = &player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x];
- feature_type *f_ptr = &f_info[(*g_ptr)->feat];
+ feature_type *f_ptr = &f_info[(*g_ptr)->feat];
if ((*g_ptr)->special && f_ptr->flags.has_not(FloorFeatureType::SPECIAL) && get_sf_ptr((*g_ptr)->special))
new_floor_id = (*g_ptr)->special;
- if (f_ptr->flags.has_all_of({FloorFeatureType::STAIRS, FloorFeatureType::SHAFT}))
+ if (f_ptr->flags.has_all_of({ FloorFeatureType::STAIRS, FloorFeatureType::SHAFT }))
prepare_change_floor_mode(player_ptr, CFM_SHAFT);
}
latest_visit_mark = 1;
return;
}
-
if (player_ptr->change_floor_mode & CFM_NO_RETURN)
kill_saved_floor(player_ptr, sf_ptr);
}
if (record_stair)
exe_write_diary(player_ptr, DIARY_WIZ_TELE, 0, nullptr);
- player_ptr->current_floor_ptr->quest_number = 0;
+ player_ptr->current_floor_ptr->quest_number = QuestId::NONE;
PlayerEnergy(player_ptr).reset_player_turn();
player_ptr->energy_need = 0;
prepare_change_floor_mode(player_ptr, CFM_FIRST_FLOOR);
concptr map_name(PlayerType *player_ptr)
{
floor_type *floor_ptr = player_ptr->current_floor_ptr;
- if (floor_ptr->quest_number && quest_type::is_fixed(floor_ptr->quest_number) && (quest[floor_ptr->quest_number].flags & QUEST_FLAG_PRESET))
+ if (inside_quest(floor_ptr->quest_number) && quest_type::is_fixed(floor_ptr->quest_number) && (quest[enum2i(floor_ptr->quest_number)].flags & QUEST_FLAG_PRESET))
return _("クエスト", "Quest");
else if (player_ptr->wild_mode)
return _("地上", "Surface");
if (floor_ptr->dun_level > d_info[floor_ptr->dungeon_idx].mindepth)
shaft_num = (randint1(num + 1)) / 2;
} else if (f_ptr->flags.has(FloorFeatureType::MORE)) {
- QUEST_IDX q_idx = quest_number(player_ptr, floor_ptr->dun_level);
- if (floor_ptr->dun_level > 1 && q_idx) {
- monster_race *r_ptr = &r_info[quest[q_idx].r_idx];
+ QuestId q_idx = quest_number(player_ptr, floor_ptr->dun_level);
+ if (floor_ptr->dun_level > 1 && inside_quest(q_idx)) {
+ monster_race *r_ptr = &r_info[quest[enum2i(q_idx)].r_idx];
if (!(r_ptr->flags1 & RF1_UNIQUE) || 0 < r_ptr->max_num)
return true;
}
if (floor_ptr->dun_level >= d_info[floor_ptr->dungeon_idx].maxdepth)
return true;
- if ((floor_ptr->dun_level < d_info[floor_ptr->dungeon_idx].maxdepth - 1) && !quest_number(player_ptr, floor_ptr->dun_level + 1))
+ if ((floor_ptr->dun_level < d_info[floor_ptr->dungeon_idx].maxdepth - 1) && !inside_quest(quest_number(player_ptr, floor_ptr->dun_level + 1)))
shaft_num = (randint1(num) + 1) / 2;
} else
return false;
if (record_stair)
exe_write_diary(player_ptr, DIARY_PAT_TELE, 0, nullptr);
- player_ptr->current_floor_ptr->quest_number = 0;
+ player_ptr->current_floor_ptr->quest_number = QuestId::NONE;
PlayerEnergy(player_ptr).reset_player_turn();
/*
build_cavern(player_ptr);
}
- if (quest_number(player_ptr, floor_ptr->dun_level))
+ if (inside_quest(quest_number(player_ptr, floor_ptr->dun_level)))
dd_ptr->destroyed = false;
}
if (floor_ptr->dun_level >= d_info[player_ptr->dungeon_idx].maxdepth)
down_stairs = false;
- if (quest_number(player_ptr, floor_ptr->dun_level) && (floor_ptr->dun_level > 1))
+ if (inside_quest(quest_number(player_ptr, floor_ptr->dun_level)) && (floor_ptr->dun_level > 1))
down_stairs = false;
if (down_stairs && up_stairs) {
break;
/* Hack -- no trap doors on special levels */
- if (floor_ptr->inside_arena || quest_number(player_ptr, floor_ptr->dun_level))
+ if (floor_ptr->inside_arena || inside_quest(quest_number(player_ptr, floor_ptr->dun_level)))
continue;
/* Hack -- no trap doors on the deepest level */
sprintf(tmp, "%d", player_ptr->lev);
v = tmp;
} else if (streq(b + 1, "QUEST_NUMBER")) {
- sprintf(tmp, "%d", player_ptr->current_floor_ptr->quest_number);
+ sprintf(tmp, "%d", enum2i(player_ptr->current_floor_ptr->quest_number));
v = tmp;
} else if (streq(b + 1, "LEAVING_QUEST")) {
- sprintf(tmp, "%d", leaving_quest);
+ sprintf(tmp, "%d", enum2i(leaving_quest));
v = tmp;
} else if (prefix(b + 1, "QUEST_TYPE")) {
sprintf(tmp, "%d", enum2i(quest[atoi(b + 11)].type));
if (zz[6][1])
letter[index].artifact = (ARTIFACT_IDX)atoi(zz[6] + 1);
} else if (zz[6][0] == '!') {
- if (floor_ptr->quest_number) {
- letter[index].artifact = quest[floor_ptr->quest_number].k_idx;
+ if (inside_quest(floor_ptr->quest_number)) {
+ letter[index].artifact = quest[enum2i(floor_ptr->quest_number)].k_idx;
}
} else {
letter[index].artifact = (ARTIFACT_IDX)atoi(zz[6]);
if (zz[4][1])
letter[index].object = (OBJECT_IDX)atoi(zz[4] + 1);
} else if (zz[4][0] == '!') {
- if (floor_ptr->quest_number) {
- ARTIFACT_IDX a_idx = quest[floor_ptr->quest_number].k_idx;
+ if (inside_quest(floor_ptr->quest_number)) {
+ ARTIFACT_IDX a_idx = quest[enum2i(floor_ptr->quest_number)].k_idx;
if (a_idx) {
artifact_type *a_ptr = &a_info[a_idx];
if (a_ptr->gen_flags.has_not(ItemGenerationTraitType::INSTA_ART)) {
static void dump_aux_quest(PlayerType *player_ptr, FILE *fff)
{
fprintf(fff, _("\n\n [クエスト情報]\n", "\n\n [Quest Information]\n"));
- std::vector<QUEST_IDX> quest_num(max_q_idx);
+ std::vector<int16_t> quest_num(max_q_idx);
- std::iota(quest_num.begin(), quest_num.end(), static_cast<QUEST_IDX>(0));
+ std::iota(quest_num.begin(), quest_num.end(), enum2i(QuestId::NONE));
int dummy;
ang_sort(player_ptr, quest_num.data(), &dummy, quest_num.size(), ang_sort_comp_quest_num, ang_sort_swap_quest_num);
break;
}
case '<': {
- if (!player_ptr->wild_mode && !floor_ptr->dun_level && !floor_ptr->inside_arena && !floor_ptr->quest_number) {
+ if (!player_ptr->wild_mode && !floor_ptr->dun_level && !floor_ptr->inside_arena && !inside_quest(floor_ptr->quest_number)) {
if (vanilla_town)
break;
menu_name = special_menu_info[hoge].name;
break;
case MENU_WILD:
- if (!floor_ptr->dun_level && !floor_ptr->inside_arena && !floor_ptr->quest_number) {
+ if (!floor_ptr->dun_level && !floor_ptr->inside_arena && !inside_quest(floor_ptr->quest_number)) {
auto can_do_in_wilderness = enum2i(special_menu_info[hoge].jouken_naiyou) > 0;
if (player_ptr->wild_mode == can_do_in_wilderness) {
menu_name = special_menu_info[hoge].name;
* @param player_ptr プレイヤーへの参照ポインタ
* @return クエストID
*/
-static QUEST_IDX write_floor(PlayerType *player_ptr, concptr *note_level, char *note_level_buf)
+static QuestId write_floor(PlayerType *player_ptr, concptr *note_level, char *note_level_buf)
{
floor_type *floor_ptr = player_ptr->current_floor_ptr;
- QUEST_IDX q_idx = quest_number(player_ptr, floor_ptr->dun_level);
+ QuestId q_idx = quest_number(player_ptr, floor_ptr->dun_level);
if (!write_level)
return q_idx;
*note_level = _("アリーナ:", "Arena:");
else if (!floor_ptr->dun_level)
*note_level = _("地上:", "Surface:");
- else if (q_idx && quest_type::is_fixed(q_idx) && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT)))
+ else if (inside_quest(q_idx) && quest_type::is_fixed(q_idx) && !((q_idx == QuestId::OBERON) || (q_idx == QuestId::SERPENT)))
*note_level = _("クエスト:", "Quest:");
else {
#ifdef JP
type == DIARY_RAND_QUEST_C ||
type == DIARY_RAND_QUEST_F ||
type == DIARY_TO_QUEST) {
- QUEST_IDX old_quest = player_ptr->current_floor_ptr->quest_number;
- player_ptr->current_floor_ptr->quest_number = (quest[num].type == QuestKindType::RANDOM) ? 0 : num;
+ QuestId old_quest = player_ptr->current_floor_ptr->quest_number;
+ player_ptr->current_floor_ptr->quest_number = (quest[num].type == QuestKindType::RANDOM) ? QuestId::NONE : i2enum<QuestId>(num);
init_flags = INIT_NAME_ONLY;
parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
player_ptr->current_floor_ptr->quest_number = old_quest;
concptr note_level = "";
char note_level_buf[40];
- QUEST_IDX q_idx = write_floor(player_ptr, ¬e_level, note_level_buf);
+ QuestId q_idx = write_floor(player_ptr, ¬e_level, note_level_buf);
bool do_level = true;
switch (type) {
break;
}
case DIARY_STAIR: {
- concptr to = q_idx && (quest_type::is_fixed(q_idx) && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT)))
+ concptr to = inside_quest(q_idx) && (quest_type::is_fixed(q_idx) && !((q_idx == QuestId::OBERON) || (q_idx == QuestId::SERPENT)))
? _("地上", "the surface")
: !(player_ptr->current_floor_ptr->dun_level + num)
? _("地上", "the surface")
-/*!
+/*!
* @brief 既知のクエストを表示する
* @date 2020/04/23
* @author Hourier
fprintf(fff, _("《遂行中のクエスト》\n", "< Current Quest >\n"));
- for (QUEST_IDX i = 1; i < max_q_idx; i++) {
+ for (int16_t i = 1; i < max_q_idx; i++) {
bool is_print = quest[i].status == QuestStatusType::TAKEN;
is_print |= (quest[i].status == QuestStatusType::STAGE_COMPLETED) && (quest[i].type == QuestKindType::TOWER);
is_print |= quest[i].status == QuestStatusType::COMPLETED;
if (!is_print)
continue;
- QUEST_IDX old_quest = player_ptr->current_floor_ptr->quest_number;
+ QuestId old_quest = player_ptr->current_floor_ptr->quest_number;
for (int j = 0; j < 10; j++)
quest_text[j][0] = '\0';
quest_text_line = 0;
- player_ptr->current_floor_ptr->quest_number = i;
+ player_ptr->current_floor_ptr->quest_number = i2enum<QuestId>(i);
init_flags = INIT_SHOW_TEXT;
parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
player_ptr->current_floor_ptr->quest_number = old_quest;
fprintf(fff, _(" なし\n", " Nothing.\n"));
}
-static bool do_cmd_knowledge_quests_aux(PlayerType *player_ptr, FILE *fff, IDX q_idx)
+static bool do_cmd_knowledge_quests_aux(PlayerType *player_ptr, FILE *fff, QuestId q_idx)
{
char tmp_str[120];
char playtime_str[16];
- quest_type *const q_ptr = &quest[q_idx];
+ quest_type *const q_ptr = &quest[enum2i(q_idx)];
floor_type *floor_ptr = player_ptr->current_floor_ptr;
auto is_fixed_quest = quest_type::is_fixed(q_idx);
if (is_fixed_quest) {
- IDX old_quest = floor_ptr->quest_number;
+ QuestId old_quest = floor_ptr->quest_number;
floor_ptr->quest_number = q_idx;
init_flags = INIT_NAME_ONLY;
parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
* @param fff セーブファイル (展開済?)
* @param quest_num[] 受注したことのあるクエスト群
*/
-void do_cmd_knowledge_quests_completed(PlayerType *player_ptr, FILE *fff, QUEST_IDX quest_num[])
+void do_cmd_knowledge_quests_completed(PlayerType *player_ptr, FILE *fff, int16_t quest_num[])
{
fprintf(fff, _("《達成したクエスト》\n", "< Completed Quest >\n"));
- QUEST_IDX total = 0;
- for (QUEST_IDX i = 1; i < max_q_idx; i++) {
- QUEST_IDX q_idx = quest_num[i];
- quest_type *const q_ptr = &quest[q_idx];
+ int16_t total = 0;
+ for (int16_t i = 1; i < max_q_idx; i++) {
+ QuestId q_idx = i2enum<QuestId>(quest_num[i]);
+ quest_type *const q_ptr = &quest[enum2i(q_idx)];
if (q_ptr->status == QuestStatusType::FINISHED && do_cmd_knowledge_quests_aux(player_ptr, fff, q_idx)) {
++total;
* @param fff セーブファイル (展開済?)
* @param quest_num[] 受注したことのあるクエスト群
*/
-void do_cmd_knowledge_quests_failed(PlayerType *player_ptr, FILE *fff, QUEST_IDX quest_num[])
+void do_cmd_knowledge_quests_failed(PlayerType *player_ptr, FILE *fff, int16_t quest_num[])
{
fprintf(fff, _("《失敗したクエスト》\n", "< Failed Quest >\n"));
- QUEST_IDX total = 0;
- for (QUEST_IDX i = 1; i < max_q_idx; i++) {
- QUEST_IDX q_idx = quest_num[i];
- quest_type *const q_ptr = &quest[q_idx];
+ int16_t total = 0;
+ for (int16_t i = 1; i < max_q_idx; i++) {
+ QuestId q_idx = i2enum<QuestId>(quest_num[i]);
+ quest_type *const q_ptr = &quest[enum2i(q_idx)];
if (((q_ptr->status == QuestStatusType::FAILED_DONE) || (q_ptr->status == QuestStatusType::FAILED)) && do_cmd_knowledge_quests_aux(player_ptr, fff, q_idx)) {
++total;
{
fprintf(fff, _("《残りのランダムクエスト》\n", "< Remaining Random Quest >\n"));
GAME_TEXT tmp_str[120];
- QUEST_IDX total = 0;
- for (QUEST_IDX i = 1; i < max_q_idx; i++) {
+ int16_t total = 0;
+ for (int16_t i = 1; i < max_q_idx; i++) {
if (quest[i].flags & QUEST_FLAG_SILENT)
continue;
if (!open_temporary_file(&fff, file_name))
return;
- std::vector<QUEST_IDX> quest_num(max_q_idx);
- std::iota(quest_num.begin(), quest_num.end(), static_cast<QUEST_IDX>(0));
+ std::vector<int16_t> quest_num(max_q_idx);
+ std::iota(quest_num.begin(), quest_num.end(), enum2i(QuestId::NONE));
int dummy;
ang_sort(player_ptr, quest_num.data(), &dummy, quest_num.size(), ang_sort_comp_quest_num, ang_sort_swap_quest_num);
#pragma once
+#include "dungeon/quest.h"
#include "system/angband.h"
class PlayerType;
void do_cmd_checkquest(PlayerType *player_ptr);
-void do_cmd_knowledge_quests_completed(PlayerType *player_ptr, FILE *fff, QUEST_IDX quest_num[]);
-void do_cmd_knowledge_quests_failed(PlayerType *player_ptr, FILE *fff, QUEST_IDX quest_num[]);
+void do_cmd_knowledge_quests_completed(PlayerType *player_ptr, FILE *fff, int16_t quest_num[]);
+void do_cmd_knowledge_quests_failed(PlayerType *player_ptr, FILE *fff, int16_t quest_num[]);
void do_cmd_knowledge_quests(PlayerType *player_ptr);
} else if (g_ptr->feat == OLD_FEAT_BLDG_1) {
g_ptr->special = lite_town ? QUEST_OLD_CASTLE : QUEST_ROYAL_CRYPT;
}
- } else if ((g_ptr->feat == OLD_FEAT_QUEST_EXIT) && (floor_ptr->quest_number == OLD_QUEST_WATER_CAVE)) {
+ } else if ((g_ptr->feat == OLD_FEAT_QUEST_EXIT) && (floor_ptr->quest_number == i2enum<QuestId>(OLD_QUEST_WATER_CAVE))) {
g_ptr->feat = feat_up_stair;
g_ptr->special = 0;
}
player_ptr->visit = 1L;
}
-void set_zangband_quest(PlayerType *player_ptr, quest_type *const q_ptr, int loading_quest_index, const QUEST_IDX old_inside_quest)
+void set_zangband_quest(PlayerType *player_ptr, quest_type *const q_ptr, int loading_quest_index, const QuestId old_inside_quest)
{
if (q_ptr->flags & QUEST_FLAG_PRESET) {
q_ptr->dungeon = 0;
}
init_flags = INIT_ASSIGN;
- player_ptr->current_floor_ptr->quest_number = (QUEST_IDX)loading_quest_index;
+ player_ptr->current_floor_ptr->quest_number = i2enum<QuestId>(loading_quest_index);
parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
player_ptr->current_floor_ptr->quest_number = old_inside_quest;
}
#pragma once
+#include "dungeon/quest.h"
#include "system/angband.h"
class PlayerType;
void set_zangband_special_defense(PlayerType *player_ptr);
void set_zangband_action(PlayerType *player_ptr);
void set_zangband_visited_towns(PlayerType *player_ptr);
-void set_zangband_quest(PlayerType *player_ptr, quest_type *const q_ptr, int loading_quest_index, const QUEST_IDX old_inside_quest);
+void set_zangband_quest(PlayerType *player_ptr, quest_type *const q_ptr, int loading_quest_index, const QuestId old_inside_quest);
void set_zangband_class(PlayerType *player_ptr);
void set_zangband_learnt_spells(PlayerType *player_ptr);
void set_zangband_pet(PlayerType *player_ptr);
} else if (g_ptr->feat == OLD_FEAT_BLDG_1) {
g_ptr->special = lite_town ? QUEST_OLD_CASTLE : QUEST_ROYAL_CRYPT;
}
- } else if ((g_ptr->feat == OLD_FEAT_QUEST_EXIT) && (floor_ptr->quest_number == OLD_QUEST_WATER_CAVE)) {
+ } else if ((g_ptr->feat == OLD_FEAT_QUEST_EXIT) && (floor_ptr->quest_number == i2enum<QuestId>(OLD_QUEST_WATER_CAVE))) {
g_ptr->feat = feat_up_stair;
g_ptr->special = 0;
}
void remove_water_cave(PlayerType *player_ptr)
{
- if (player_ptr->current_floor_ptr->quest_number != OLD_QUEST_WATER_CAVE)
+ if (player_ptr->current_floor_ptr->quest_number != i2enum<QuestId>(OLD_QUEST_WATER_CAVE))
return;
player_ptr->dungeon_idx = lite_town ? DUNGEON_ANGBAND : DUNGEON_GALGALS;
player_ptr->current_floor_ptr->dun_level = 1;
- player_ptr->current_floor_ptr->quest_number = 0;
+ player_ptr->current_floor_ptr->quest_number = QuestId::NONE;
}
static void rd_phase_out(PlayerType *player_ptr)
{
player_ptr->current_floor_ptr->inside_arena = rd_s16b() != 0;
- player_ptr->current_floor_ptr->quest_number = rd_s16b();
+ player_ptr->current_floor_ptr->quest_number = i2enum<QuestId>(rd_s16b());
if (h_older_than(0, 3, 5))
player_ptr->phase_out = false;
else {
void analyze_quests(PlayerType *player_ptr, const uint16_t max_quests_load, const byte max_rquests_load)
{
- QUEST_IDX old_inside_quest = player_ptr->current_floor_ptr->quest_number;
+ QuestId old_inside_quest = player_ptr->current_floor_ptr->quest_number;
for (int i = 0; i < max_quests_load; i++) {
if (check_quest_index(i))
continue;
return buf;
}
-static inline QUEST_IDX get_quest_count()
+static inline int16_t get_quest_count()
{
return max_q_idx;
}
static bool scene_quest(PlayerType *player_ptr, scene_type *value)
{
- const QUEST_IDX quest_id = quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level);
- const bool enable = (quest_id > 0);
+ const QuestId quest_id = quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level);
+ const bool enable = (inside_quest(quest_id));
if (enable) {
value->type = TERM_XTRA_MUSIC_QUEST;
- value->val = quest_id;
+ value->val = enum2i(quest_id);
}
return enable;
static bool scene_quest_basic(PlayerType *player_ptr, scene_type *value)
{
- const QUEST_IDX quest_id = quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level);
- const bool enable = (quest_id > 0);
+ const QuestId quest_id = quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level);
+ const bool enable = (inside_quest(quest_id));
if (enable) {
value->type = TERM_XTRA_MUSIC_BASIC;
value->val = MUSIC_BASIC_QUEST;
* @param questnum クエストのID
* @param do_init クエストの開始処理か(true)、結果処理か(FALSE)
*/
-static void get_questinfo(PlayerType *player_ptr, IDX questnum, bool do_init)
+static void get_questinfo(PlayerType *player_ptr, QuestId questnum, bool do_init)
{
for (int i = 0; i < 10; i++) {
quest_text[i][0] = '\0';
quest_text_line = 0;
floor_type *floor_ptr = player_ptr->current_floor_ptr;
- QUEST_IDX old_quest = floor_ptr->quest_number;
+ QuestId old_quest = floor_ptr->quest_number;
floor_ptr->quest_number = questnum;
init_flags = INIT_SHOW_TEXT;
* @param questnum クエストのID
* @param do_init クエストの開始処理か(true)、結果処理か(FALSE)
*/
-void print_questinfo(PlayerType *player_ptr, IDX questnum, bool do_init)
+void print_questinfo(PlayerType *player_ptr, QuestId questnum, bool do_init)
{
get_questinfo(player_ptr, questnum, do_init);
GAME_TEXT tmp_str[80];
- sprintf(tmp_str, _("クエスト情報 (危険度: %d 階相当)", "Quest Information (Danger level: %d)"), (int)quest[questnum].level);
+ sprintf(tmp_str, _("クエスト情報 (危険度: %d 階相当)", "Quest Information (Danger level: %d)"), (int)quest[enum2i(questnum)].level);
prt(tmp_str, 5, 0);
- prt(quest[questnum].name, 7, 0);
+ prt(quest[enum2i(questnum)].name, 7, 0);
for (int i = 0; i < 10; i++) {
c_put_str(TERM_YELLOW, quest_text[i], i + 8, 0);
void castle_quest(PlayerType *player_ptr)
{
clear_bldg(4, 18);
- QUEST_IDX q_index = player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x].special;
+ QuestId q_index = i2enum<QuestId>(player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x].special);
- if (!q_index) {
+ if (!inside_quest(q_index)) {
put_str(_("今のところクエストはありません。", "I don't have a quest for you at the moment."), 8, 0);
return;
}
quest_type *q_ptr;
- q_ptr = &quest[q_index];
+ q_ptr = &quest[enum2i(q_index)];
if (q_ptr->status == QuestStatusType::COMPLETED) {
q_ptr->status = QuestStatusType::REWARDED;
print_questinfo(player_ptr, q_index, false);
ms_ptr->see_m = is_seen(player_ptr, ms_ptr->m_ptr);
ms_ptr->maneable = player_has_los_bold(player_ptr, ms_ptr->m_ptr->fy, ms_ptr->m_ptr->fx);
ms_ptr->pet = is_pet(ms_ptr->m_ptr);
- ms_ptr->in_no_magic_dungeon = d_info[player_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_MAGIC) && floor_ptr->dun_level && (!floor_ptr->quest_number || quest_type::is_fixed(floor_ptr->quest_number));
+ ms_ptr->in_no_magic_dungeon = d_info[player_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_MAGIC) && floor_ptr->dun_level && (!inside_quest(floor_ptr->quest_number) || quest_type::is_fixed(floor_ptr->quest_number));
return ms_ptr;
}
static bool check_quest_placeable(PlayerType *player_ptr, MONRACE_IDX r_idx)
{
floor_type *floor_ptr = player_ptr->current_floor_ptr;
- if (quest_number(player_ptr, floor_ptr->dun_level) == 0)
+ if (!inside_quest(quest_number(player_ptr, floor_ptr->dun_level)))
return true;
- int hoge = quest_number(player_ptr, floor_ptr->dun_level);
- if ((quest[hoge].type != QuestKindType::KILL_LEVEL) && (quest[hoge].type != QuestKindType::RANDOM))
+ QuestId hoge = quest_number(player_ptr, floor_ptr->dun_level);
+ if ((quest[enum2i(hoge)].type != QuestKindType::KILL_LEVEL) && (quest[enum2i(hoge)].type != QuestKindType::RANDOM))
return true;
- if (r_idx != quest[hoge].r_idx)
+ if (r_idx != quest[enum2i(hoge)].r_idx)
return true;
int number_mon = 0;
for (int i2 = 0; i2 < floor_ptr->width; ++i2)
for (int j2 = 0; j2 < floor_ptr->height; j2++)
- if ((floor_ptr->grid_array[j2][i2].m_idx > 0) && (floor_ptr->m_list[floor_ptr->grid_array[j2][i2].m_idx].r_idx == quest[hoge].r_idx))
+ if ((floor_ptr->grid_array[j2][i2].m_idx > 0) && (floor_ptr->m_list[floor_ptr->grid_array[j2][i2].m_idx].r_idx == quest[enum2i(hoge)].r_idx))
number_mon++;
- if (number_mon + quest[hoge].cur_num >= quest[hoge].max_num)
+ if (number_mon + quest[enum2i(hoge)].cur_num >= quest[enum2i(hoge)].max_num)
return false;
return true;
*/
bool mon_hook_dungeon(PlayerType *player_ptr, MONRACE_IDX r_idx)
{
- if (!is_in_dungeon(player_ptr) && !player_ptr->current_floor_ptr->quest_number)
+ if (!is_in_dungeon(player_ptr) && !inside_quest(player_ptr->current_floor_ptr->quest_number))
return true;
monster_race *r_ptr = &r_info[r_idx];
*/
monsterrace_hook_type get_monster_hook(PlayerType *player_ptr)
{
- if ((player_ptr->current_floor_ptr->dun_level > 0) || (player_ptr->current_floor_ptr->quest_number > 0))
+ if ((player_ptr->current_floor_ptr->dun_level > 0) || (inside_quest(player_ptr->current_floor_ptr->quest_number)))
return (monsterrace_hook_type)mon_hook_dungeon;
switch (wilderness[player_ptr->wilderness_y][player_ptr->wilderness_x].terrain) {
continue;
// クエスト内でRES_ALLの生成を禁止する (殲滅系クエストの詰み防止)
- if (player_ptr->current_floor_ptr->quest_number && any_bits(r_ptr->flagsr, RFR_RES_ALL))
+ if (inside_quest(player_ptr->current_floor_ptr->quest_number) && any_bits(r_ptr->flagsr, RFR_RES_ALL))
continue;
}
// * フェイズアウト状態でない
// * 1階かそれより深いところにいる
// * ランダムクエスト中でない
- const bool in_random_quest = floor_ptr->quest_number && !quest_type::is_fixed(floor_ptr->quest_number);
+ const bool in_random_quest = inside_quest(floor_ptr->quest_number) && !quest_type::is_fixed(floor_ptr->quest_number);
const bool cond = !player_ptr->phase_out && floor_ptr->dun_level > 0 && !in_random_quest;
if (cond && !restrict_monster_to_dungeon(player_ptr, entry->index)) {
static void check_mspell_stupid(PlayerType *player_ptr, msa_type *msa_ptr)
{
floor_type *floor_ptr = player_ptr->current_floor_ptr;
- msa_ptr->in_no_magic_dungeon = d_info[player_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_MAGIC) && floor_ptr->dun_level && (!floor_ptr->quest_number || quest_type::is_fixed(floor_ptr->inside_quest));
- if (!msa_ptr->in_no_magic_dungeon || ((msa_ptr->r_ptr->behavior_flags.has(MonsterBehaviorType::STUPID))))
+ msa_ptr->in_no_magic_dungeon = d_info[player_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_MAGIC) && floor_ptr->dun_level && (!inside_quest(floor_ptr->quest_number) || quest_type::is_fixed(floor_ptr->quest_number));
+ if (!msa_ptr->in_no_magic_dungeon || (msa_ptr->r_ptr->behavior_flags.has(MonsterBehaviorType::STUPID)))
return;
msa_ptr->ability_flags &= RF_ABILITY_NOMAGIC_MASK;
-#include "object-hook/hook-quest.h"
+#include "object-hook/hook-quest.h"
#include "cmd-building/cmd-building.h"
#include "dungeon/quest.h"
#include "game-option/birth-options.h"
* @param o_ptr 特性短縮表記を得たいオブジェクト構造体の参照ポインタ
* @return 現在クエスト達成目的のアイテムならばTRUEを返す。
*/
-bool object_is_quest_target(QUEST_IDX quest_idx, ObjectType *o_ptr)
+bool object_is_quest_target(QuestId quest_idx, ObjectType *o_ptr)
{
- if (quest_idx == 0)
+ if (!inside_quest(quest_idx))
return false;
- ARTIFACT_IDX a_idx = quest[quest_idx].k_idx;
+ ARTIFACT_IDX a_idx = quest[enum2i(quest_idx)].k_idx;
if (a_idx == 0)
return false;
#pragma once
+#include "dungeon/quest.h"
#include "system/angband.h"
class ObjectType;
class PlayerType;
bool object_is_bounty(PlayerType *player_ptr, ObjectType *o_ptr);
-bool object_is_quest_target(QUEST_IDX quest_idx, ObjectType *o_ptr);
+bool object_is_quest_target(QuestId quest_idx, ObjectType *o_ptr);
if (record_arena)
exe_write_diary(player_ptr, DIARY_ARENA, -1 - player_ptr->arena_number, m_name);
} else {
- QUEST_IDX q_idx = quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level);
+ QuestId q_idx = quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level);
bool seppuku = streq(hit_from, "Seppuku");
bool winning_seppuku = w_ptr->total_winner && seppuku;
char dummy[1024];
#ifdef JP
sprintf(dummy, "%s%s%s",
- !player_ptr->paralyzed ? ""
- : player_ptr->free_act ? "彫像状態で"
- : "麻痺状態で",
+ !player_ptr->paralyzed ? ""
+ : player_ptr->free_act ? "彫像状態で"
+ : "麻痺状態で",
player_ptr->hallucinated ? "幻覚に歪んだ" : "", hit_from);
#else
sprintf(dummy, "%s%s", hit_from, !player_ptr->paralyzed ? "" : " while helpless");
strcpy(buf, _("アリーナ", "in the Arena"));
else if (!is_in_dungeon(player_ptr))
strcpy(buf, _("地上", "on the surface"));
- else if (q_idx && (quest_type::is_fixed(q_idx) && !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT))))
+ else if (inside_quest(q_idx) && (quest_type::is_fixed(q_idx) && !((q_idx == QuestId::OBERON) || (q_idx == QuestId::SERPENT))))
strcpy(buf, _("クエスト", "in a quest"));
else
sprintf(buf, _("%d階", "level %d"), (int)player_ptr->current_floor_ptr->dun_level);
energy.reset_player_turn();
command_new = SPECIAL_KEY_QUEST;
} else if (f_ptr->flags.has(FloorFeatureType::QUEST_EXIT)) {
- if (quest[floor_ptr->quest_number].type == QuestKindType::FIND_EXIT)
+ if (quest[enum2i(floor_ptr->quest_number)].type == QuestKindType::FIND_EXIT)
complete_quest(player_ptr, floor_ptr->quest_number);
leave_quest_check(player_ptr);
- floor_ptr->quest_number = g_ptr->special;
+ floor_ptr->quest_number = i2enum<QuestId>(g_ptr->special);
floor_ptr->dun_level = 0;
- if (!floor_ptr->quest_number)
+ if (!inside_quest(floor_ptr->quest_number))
player_ptr->word_recall = 0;
player_ptr->oldpx = 0;
player_ptr->oldpy = 0;
wr_s16b(player_ptr->arena_number);
wr_s16b(player_ptr->current_floor_ptr->inside_arena);
- wr_s16b(player_ptr->current_floor_ptr->quest_number);
+ wr_s16b(enum2i(player_ptr->current_floor_ptr->quest_number));
wr_s16b(player_ptr->phase_out);
wr_byte(player_ptr->exit_bldg);
wr_byte(0); /* Unused */
wr_byte(tmp8u);
v_stamp = 0L;
x_stamp = 0L;
-
+
wr_u32b(w_ptr->sf_system);
wr_u32b(w_ptr->sf_when);
wr_u16b(w_ptr->sf_lives);
bool is_quest_running = q_ptr->status == QuestStatusType::TAKEN;
is_quest_running |= q_ptr->status == QuestStatusType::COMPLETED;
- is_quest_running |= !quest_type::is_fixed(i);
+ is_quest_running |= !quest_type::is_fixed(i2enum<QuestId>(i));
if (!is_quest_running)
continue;
bool earthquake(PlayerType *player_ptr, POSITION cy, POSITION cx, POSITION r, MONSTER_IDX m_idx)
{
floor_type *floor_ptr = player_ptr->current_floor_ptr;
- if ((floor_ptr->quest_number && quest_type::is_fixed(floor_ptr->quest_number)) || !floor_ptr->dun_level) {
+ if ((inside_quest(floor_ptr->quest_number) && quest_type::is_fixed(floor_ptr->quest_number)) || !floor_ptr->dun_level) {
return false;
}
{
/* Prevent destruction of quest levels and town */
floor_type *floor_ptr = player_ptr->current_floor_ptr;
- if ((floor_ptr->quest_number && quest_type::is_fixed(floor_ptr->quest_number)) || !floor_ptr->dun_level) {
+ if ((inside_quest(floor_ptr->quest_number) && quest_type::is_fixed(floor_ptr->quest_number)) || !floor_ptr->dun_level) {
return false;
}
resist = true;
else if (m_idx == player_ptr->riding)
resist = true;
- else if ((player_ptr->current_floor_ptr->quest_number && !random_quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level)) || player_ptr->current_floor_ptr->inside_arena || player_ptr->phase_out)
+ else if ((inside_quest(player_ptr->current_floor_ptr->quest_number) && !inside_quest(random_quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level))) || player_ptr->current_floor_ptr->inside_arena || player_ptr->phase_out)
resist = true;
else if (player_cast && (r_ptr->level > randint0(power)))
resist = true;
bool symbol_genocide(PlayerType *player_ptr, int power, bool player_cast)
{
floor_type *floor_ptr = player_ptr->current_floor_ptr;
- bool is_special_floor = floor_ptr->quest_number && !random_quest_number(player_ptr, floor_ptr->dun_level);
+ bool is_special_floor = inside_quest(floor_ptr->quest_number) && !inside_quest(random_quest_number(player_ptr, floor_ptr->dun_level));
is_special_floor |= player_ptr->current_floor_ptr->inside_arena;
is_special_floor |= player_ptr->phase_out;
if (is_special_floor) {
bool mass_genocide(PlayerType *player_ptr, int power, bool player_cast)
{
floor_type *floor_ptr = player_ptr->current_floor_ptr;
- bool is_special_floor = floor_ptr->quest_number && !random_quest_number(player_ptr, floor_ptr->dun_level);
+ bool is_special_floor = inside_quest(floor_ptr->quest_number) && !inside_quest(random_quest_number(player_ptr, floor_ptr->dun_level));
is_special_floor |= player_ptr->current_floor_ptr->inside_arena;
is_special_floor |= player_ptr->phase_out;
if (is_special_floor) {
bool mass_genocide_undead(PlayerType *player_ptr, int power, bool player_cast)
{
floor_type *floor_ptr = player_ptr->current_floor_ptr;
- bool is_special_floor = floor_ptr->quest_number && !random_quest_number(player_ptr, floor_ptr->dun_level);
+ bool is_special_floor = inside_quest(floor_ptr->quest_number) && !inside_quest(random_quest_number(player_ptr, floor_ptr->dun_level));
is_special_floor |= player_ptr->current_floor_ptr->inside_arena;
is_special_floor |= player_ptr->phase_out;
if (is_special_floor) {
bool down = true;
floor_type *floor_ptr = player_ptr->current_floor_ptr;
- if (quest_number(player_ptr, floor_ptr->dun_level) || (floor_ptr->dun_level >= d_info[player_ptr->dungeon_idx].maxdepth))
+ if (inside_quest(quest_number(player_ptr, floor_ptr->dun_level)) || (floor_ptr->dun_level >= d_info[player_ptr->dungeon_idx].maxdepth))
down = false;
- if (!floor_ptr->dun_level || (!up && !down) || (floor_ptr->quest_number && quest_type::is_fixed(floor_ptr->quest_number)) || floor_ptr->inside_arena || player_ptr->phase_out) {
+ if (!floor_ptr->dun_level || (!up && !down) || (inside_quest(floor_ptr->quest_number) && quest_type::is_fixed(floor_ptr->quest_number)) || floor_ptr->inside_arena || player_ptr->phase_out) {
msg_print(_("効果がありません!", "There is no effect!"));
return;
}
#include "core/asking-player.h"
#include "core/player-update-types.h"
#include "core/speed-table.h"
+#include "effect/attribute-types.h"
#include "effect/effect-characteristics.h"
#include "floor/cave.h"
#include "floor/geometry.h"
#include "player/player-move.h"
#include "player/player-status.h"
#include "spell-kind/spells-launcher.h"
-#include "effect/attribute-types.h"
#include "system/floor-type-definition.h"
#include "system/grid-type-definition.h"
#include "system/monster-race-definition.h"
continue;
if (!cave_monster_teleportable_bold(player_ptr, m_idx, ny, nx, mode))
continue;
- if (!(player_ptr->current_floor_ptr->quest_number || player_ptr->current_floor_ptr->inside_arena))
+ if (!(inside_quest(player_ptr->current_floor_ptr->quest_number) || player_ptr->current_floor_ptr->inside_arena))
if (player_ptr->current_floor_ptr->grid_array[ny][nx].is_icky())
continue;
-#include "spell-kind/spells-world.h"
+#include "spell-kind/spells-world.h"
#include "cmd-io/cmd-save.h"
#include "core/asking-player.h"
#include "core/player-redraw-types.h"
bool is_teleport_level_ineffective(PlayerType *player_ptr, MONSTER_IDX idx)
{
floor_type *floor_ptr = player_ptr->current_floor_ptr;
- bool is_special_floor = floor_ptr->inside_arena || player_ptr->phase_out || (floor_ptr->quest_number && !random_quest_number(player_ptr, floor_ptr->dun_level));
+ bool is_special_floor = floor_ptr->inside_arena || player_ptr->phase_out || (inside_quest(floor_ptr->quest_number) && !inside_quest(random_quest_number(player_ptr, floor_ptr->dun_level)));
bool is_invalid_floor = idx <= 0;
- is_invalid_floor &= quest_number(player_ptr, floor_ptr->dun_level) || (floor_ptr->dun_level >= d_info[player_ptr->dungeon_idx].maxdepth);
+ is_invalid_floor &= inside_quest(quest_number(player_ptr, floor_ptr->dun_level)) || (floor_ptr->dun_level >= d_info[player_ptr->dungeon_idx].maxdepth);
is_invalid_floor &= player_ptr->current_floor_ptr->dun_level >= 1;
is_invalid_floor &= ironman_downward;
return is_special_floor || is_invalid_floor;
player_ptr->leaving = true;
}
- } else if (quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level)
+ } else if (inside_quest(quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level))
|| (player_ptr->current_floor_ptr->dun_level >= d_info[player_ptr->dungeon_idx].maxdepth)) {
#ifdef JP
if (see_m)
prepare_change_floor_mode(player_ptr, CFM_SAVE_FLOORS | CFM_UP | CFM_RAND_PLACE | CFM_RAND_CONNECT);
leave_quest_check(player_ptr);
- player_ptr->current_floor_ptr->quest_number = 0;
+ player_ptr->current_floor_ptr->quest_number = QuestId::NONE;
player_ptr->leaving = true;
}
} else if (go_up) {
bool is_special_floor = is_in_dungeon(player_ptr);
is_special_floor &= max_dlv[player_ptr->dungeon_idx] > player_ptr->current_floor_ptr->dun_level;
- is_special_floor &= !player_ptr->current_floor_ptr->quest_number;
+ is_special_floor &= !inside_quest(player_ptr->current_floor_ptr->quest_number);
is_special_floor &= !player_ptr->word_recall;
if (is_special_floor) {
if (get_check(_("ここは最深到達階より浅い階です。この階に戻って来ますか? ", "Reset recall depth? "))) {
DEPTH max_depth = d_info[select_dungeon].maxdepth;
if (select_dungeon == DUNGEON_ANGBAND) {
- if (quest[QUEST_OBERON].status != QuestStatusType::FINISHED)
+ if (quest[enum2i(QuestId::OBERON)].status != QuestStatusType::FINISHED)
max_depth = 98;
- else if (quest[QUEST_SERPENT].status != QuestStatusType::FINISHED)
+ else if (quest[enum2i(QuestId::SERPENT)].status != QuestStatusType::FINISHED)
max_depth = 99;
}
player_ptr->recall_dungeon = select_dungeon;
max_dlv[player_ptr->recall_dungeon]
= ((amt > d_info[select_dungeon].maxdepth) ? d_info[select_dungeon].maxdepth
- : ((amt < d_info[select_dungeon].mindepth) ? d_info[select_dungeon].mindepth : amt));
+ : ((amt < d_info[select_dungeon].mindepth) ? d_info[select_dungeon].mindepth : amt));
if (record_maxdepth)
exe_write_diary(player_ptr, DIARY_TRUMP, select_dungeon, _("トランプタワーで", "at Trump Tower"));
return;
}
- bool is_special_fllor = floor_ptr->quest_number && quest_type::is_fixed(floor_ptr->quest_number);
+ bool is_special_fllor = inside_quest(floor_ptr->quest_number) && quest_type::is_fixed(floor_ptr->quest_number);
is_special_fllor |= floor_ptr->dun_level > 0;
if (is_special_fllor) {
msg_print(_("地面が揺れた。", "The ground trembles."));
bool vanish_dungeon(PlayerType *player_ptr)
{
auto *floor_ptr = player_ptr->current_floor_ptr;
- bool is_special_floor = floor_ptr->quest_number && quest_type::is_fixed(floor_ptr->quest_number);
+ bool is_special_floor = inside_quest(floor_ptr->quest_number) && quest_type::is_fixed(floor_ptr->quest_number);
is_special_floor |= floor_ptr->dun_level > 0;
if (is_special_floor)
return false;
#pragma once
+#include "dungeon/quest.h"
#include "floor/floor-base-definitions.h"
#include "floor/sight-definitions.h"
#include "monster/monster-timed-effect-types.h"
POSITION redraw_x[REDRAW_MAX];
bool monster_noise;
- QUEST_IDX quest_number; /* Inside quest level */
+ QuestId quest_number; /* Inside quest level */
bool inside_arena; /* Is character inside on_defeat_arena_monster? */
};
static concptr decide_target_floor(PlayerType *player_ptr, eg_type *eg_ptr)
{
if (eg_ptr->f_ptr->flags.has(FloorFeatureType::QUEST_ENTER)) {
- QUEST_IDX old_quest = player_ptr->current_floor_ptr->quest_number;
+ QuestId old_quest = player_ptr->current_floor_ptr->quest_number;
for (int j = 0; j < 10; j++)
quest_text[j][0] = '\0';
quest_text_line = 0;
- player_ptr->current_floor_ptr->quest_number = eg_ptr->g_ptr->special;
+ player_ptr->current_floor_ptr->quest_number = i2enum<QuestId>(eg_ptr->g_ptr->special);
init_flags = INIT_NAME_ONLY;
parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
player_ptr->current_floor_ptr->quest_number = old_quest;
#include "monster-race/monster-race.h"
#include "monster-race/race-flags1.h"
#include "monster/monster-flag-types.h"
+#include "system//monster-race-definition.h"
#include "system/artifact-type-definition.h"
#include "system/floor-type-definition.h"
#include "system/grid-type-definition.h"
-#include "system//monster-race-definition.h"
#include "system/monster-type-definition.h"
#include "system/player-type-definition.h"
(void)player_ptr;
(void)v;
- QUEST_IDX *q_num = (QUEST_IDX *)u;
- quest_type *qa = &quest[q_num[a]];
- quest_type *qb = &quest[q_num[b]];
+ QuestId *q_num = (QuestId *)u;
+ quest_type *qa = &quest[enum2i(q_num[a])];
+ quest_type *qb = &quest[enum2i(q_num[b])];
return (qa->comptime != qb->comptime) ? (qa->comptime < qb->comptime) : (qa->level <= qb->level);
}
(void)player_ptr;
(void)v;
- QUEST_IDX *q_num = (QUEST_IDX *)u;
- QUEST_IDX tmp = q_num[a];
+ QuestId *q_num = (QuestId *)u;
+ QuestId tmp = q_num[a];
q_num[a] = q_num[b];
q_num[b] = tmp;
}
#endif
}
- if (floor_ptr->quest_number && quest_type::is_fixed(floor_ptr->quest_number)) {
+ if (inside_quest(floor_ptr->quest_number) && quest_type::is_fixed(floor_ptr->quest_number)) {
/* Get the quest text */
/* Bewere that INIT_ASSIGN resets the cur_num. */
init_flags = INIT_NAME_ONLY;
parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
#ifdef JP
- return std::string(format("…あなたは、クエスト「%s」で%sに殺された。", quest[floor_ptr->quest_number].name, player_ptr->died_from));
+ return std::string(format("…あなたは、クエスト「%s」で%sに殺された。", quest[enum2i(floor_ptr->quest_number)].name, player_ptr->died_from));
#else
- return std::string(format("...You were killed by %s in the quest '%s'.", player_ptr->died_from, quest[floor_ptr->quest_number].name));
+ return std::string(format("...You were killed by %s in the quest '%s'.", player_ptr->died_from, quest[enum2i(floor_ptr->quest_number)].name));
#endif
}
static std::optional<std::string> decide_death_in_quest(PlayerType *player_ptr)
{
floor_type *floor_ptr = player_ptr->current_floor_ptr;
- if (!floor_ptr->quest_number || !quest_type::is_fixed(floor_ptr->quest_number))
+ if (!inside_quest(floor_ptr->quest_number) || !quest_type::is_fixed(floor_ptr->quest_number))
return std::nullopt;
for (int i = 0; i < 10; i++)
quest_text_line = 0;
init_flags = INIT_NAME_ONLY;
parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
- return std::string(format(_("…あなたは現在、 クエスト「%s」を遂行中だ。", "...Now, you are in the quest '%s'."), quest[floor_ptr->quest_number].name));
+ return std::string(format(_("…あなたは現在、 クエスト「%s」を遂行中だ。", "...Now, you are in the quest '%s'."), quest[enum2i(floor_ptr->quest_number)].name));
}
/*!
return;
}
- if (floor_ptr->quest_number && !player_ptr->dungeon_idx) {
+ if (inside_quest(floor_ptr->quest_number) && !player_ptr->dungeon_idx) {
strcpy(depths, _("地上", "Quest"));
c_prt(attr, format("%7s", depths), row_depth, col_depth);
return;
* @brief 指定したクエストに突入する
* @param プレイヤーの情報へのポインタ
*/
-void wiz_enter_quest(PlayerType* player_ptr)
+void wiz_enter_quest(PlayerType *player_ptr)
{
char ppp[30];
char tmp_val[5];
return;
init_flags = i2enum<init_flags_type>(INIT_SHOW_TEXT | INIT_ASSIGN);
- player_ptr->current_floor_ptr->quest_number = (QUEST_IDX)tmp_int;
+ player_ptr->current_floor_ptr->quest_number = i2enum<QuestId>(tmp_int);
parse_fixed_map(player_ptr, "q_info.txt", 0, 0, 0, 0);
quest[tmp_int].status = QuestStatusType::TAKEN;
if (quest[tmp_int].dungeon == 0)
- exe_enter_quest(player_ptr, (QUEST_IDX)tmp_int);
+ exe_enter_quest(player_ptr, i2enum<QuestId>(tmp_int));
}
/*!
*/
void wiz_complete_quest(PlayerType *player_ptr)
{
- if (!player_ptr->current_floor_ptr->quest_number) {
+ if (!inside_quest(player_ptr->current_floor_ptr->quest_number)) {
msg_print("No current quest");
msg_print(nullptr);
return;
}
- if (quest[player_ptr->current_floor_ptr->quest_number].status == QuestStatusType::TAKEN)
+ if (quest[enum2i(player_ptr->current_floor_ptr->quest_number)].status == QuestStatusType::TAKEN)
complete_quest(player_ptr, player_ptr->current_floor_ptr->quest_number);
}
floor_ptr->dun_level = 0;
floor_ptr->inside_arena = false;
player_ptr->phase_out = false;
- leaving_quest = 0;
- floor_ptr->quest_number = 0;
+ leaving_quest = QuestId::NONE;
+ floor_ptr->quest_number = QuestId::NONE;
if (player_ptr->dungeon_idx)
player_ptr->recall_dungeon = player_ptr->dungeon_idx;
player_ptr->dungeon_idx = 0;
disturb(player_ptr, false, true);
floor_type *floor_ptr = player_ptr->current_floor_ptr;
- if (floor_ptr->dun_level || player_ptr->current_floor_ptr->quest_number || player_ptr->enter_dungeon) {
+ if (floor_ptr->dun_level || inside_quest(player_ptr->current_floor_ptr->quest_number) || player_ptr->enter_dungeon) {
msg_print(_("上に引っ張りあげられる感じがする!", "You feel yourself yanked upwards!"));
if (player_ptr->dungeon_idx)
player_ptr->recall_dungeon = player_ptr->dungeon_idx;
player_ptr->dungeon_idx = 0;
leave_quest_check(player_ptr);
leave_tower_check(player_ptr);
- player_ptr->current_floor_ptr->quest_number = 0;
+ player_ptr->current_floor_ptr->quest_number = QuestId::NONE;
player_ptr->leaving = true;
sound(SOUND_TPLEVEL);
return;
return;
disturb(player_ptr, false, true);
- if (!quest_number(player_ptr, floor_ptr->dun_level) && floor_ptr->dun_level) {
+ if (!inside_quest(quest_number(player_ptr, floor_ptr->dun_level)) && floor_ptr->dun_level) {
msg_print(_("世界が変わった!", "The world changes!"));
/*
void WorldTurnProcessor::process_change_daytime_night()
{
auto *floor_ptr = this->player_ptr->current_floor_ptr;
- if (!floor_ptr->dun_level && !floor_ptr->quest_number && !this->player_ptr->phase_out && !floor_ptr->inside_arena) {
+ if (!floor_ptr->dun_level && !inside_quest(floor_ptr->quest_number) && !this->player_ptr->phase_out && !floor_ptr->inside_arena) {
if (!(w_ptr->game_turn % ((TURNS_PER_TICK * TOWN_DAWN) / 2))) {
auto dawn = w_ptr->game_turn % (TURNS_PER_TICK * TOWN_DAWN) == 0;
if (dawn) {
}
auto is_in_dungeon = vanilla_town;
- is_in_dungeon |= lite_town && (floor_ptr->quest_number == 0) && !this->player_ptr->phase_out && !floor_ptr->inside_arena;
+ is_in_dungeon |= lite_town && (!inside_quest(floor_ptr->quest_number)) && !this->player_ptr->phase_out && !floor_ptr->inside_arena;
is_in_dungeon &= floor_ptr->dun_level != 0;
if (!is_in_dungeon) {
return;
auto *floor_ptr = this->player_ptr->current_floor_ptr;
auto should_alloc = one_in_(d_info[this->player_ptr->dungeon_idx].max_m_alloc_chance);
should_alloc &= !floor_ptr->inside_arena;
- should_alloc &= floor_ptr->quest_number == 0;
+ should_alloc &= !inside_quest(floor_ptr->quest_number);
should_alloc &= !this->player_ptr->phase_out;
if (should_alloc) {
(void)alloc_monster(this->player_ptr, MAX_SIGHT + 5, 0, summon_specific);