*/
#include "artifact/random-art-generator.h"
+#include "artifact/fixed-art-types.h"
#include "artifact/random-art-activation.h"
#include "artifact/random-art-bias-types.h"
#include "artifact/random-art-characteristics.h"
bool become_random_artifact(PlayerType *player_ptr, ObjectType *o_ptr, bool a_scroll)
{
o_ptr->artifact_bias = 0;
- o_ptr->fixed_artifact_idx = i2enum<FixedArtifactId>(0);
+ o_ptr->fixed_artifact_idx = FixedArtifactId::NONE;
o_ptr->ego_idx = EgoType::NONE;
o_ptr->art_flags |= k_info[o_ptr->k_idx].flags;
for (const auto &[q_idx, q_ref] : quest_list) {
auto found_artifact = (q_ref.type == QuestKindType::FIND_ARTIFACT);
found_artifact &= (q_ref.status == QuestStatusType::TAKEN);
- found_artifact &= (i2enum<FixedArtifactId>(q_ref.k_idx) == o_ptr->fixed_artifact_idx);
+ found_artifact &= (q_ref.reward_artifact_idx == o_ptr->fixed_artifact_idx);
if (found_artifact) {
complete_quest(player_ptr, q_idx);
}
quest_list[QuestId::TOWER1].complev = player_ptr->lev;
break;
case QuestKindType::FIND_ARTIFACT:
- a_info[q_ptr->k_idx].gen_flags.reset(ItemGenerationTraitType::QUESTITEM);
+ a_info[enum2i(q_ptr->reward_artifact_idx)].gen_flags.reset(ItemGenerationTraitType::QUESTITEM);
break;
case QuestKindType::RANDOM:
r_info[q_ptr->r_idx].flags1 &= ~(RF1_QUESTOR);
#include <map>
#include <vector>
+enum class FixedArtifactId : short;
enum class MonsterRaceId : int16_t;
// clang-format off
MONSTER_NUMBER cur_num; /*!< 撃破したモンスターの数 / Number killed */
MONSTER_NUMBER max_num; /*!< 求められるモンスターの撃破数 / Number required */
- KIND_OBJECT_IDX k_idx; /*!< クエスト対象のアイテムID / object index */
+ FixedArtifactId reward_artifact_idx; /*!< クエスト対象のアイテムID / object index */
MONSTER_NUMBER num_mon; /*!< QuestKindTypeがKILL_NUMBER時の目標撃破数 number of monsters on level */
BIT_FLAGS flags; /*!< クエストに関するフラグビット / quest flags */
}
if (flavor_ptr->o_ptr->is_fixed_artifact()) {
- auto *a_ptr = &a_info[flavor_ptr->o_ptr->fixed_artifact_idx];
+ auto *a_ptr = &a_info[enum2i(flavor_ptr->o_ptr->fixed_artifact_idx)];
flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
flavor_ptr->t = object_desc_str(flavor_ptr->t, a_ptr->name.c_str());
return;
q_ptr->max_num = (MONSTER_NUMBER)atoi(zz[5]);
q_ptr->level = (DEPTH)atoi(zz[6]);
q_ptr->r_idx = i2enum<MonsterRaceId>(atoi(zz[7]));
- q_ptr->k_idx = (KIND_OBJECT_IDX)atoi(zz[8]);
+ q_ptr->reward_artifact_idx = i2enum<FixedArtifactId>(atoi(zz[8]));
q_ptr->dungeon = (DUNGEON_IDX)atoi(zz[9]);
if (num > 10) {
r_ptr->flags1 |= RF1_QUESTOR;
}
- a_ptr = &a_info[q_ptr->k_idx];
+ a_ptr = &a_info[enum2i(q_ptr->reward_artifact_idx)];
a_ptr->gen_flags.set(ItemGenerationTraitType::QUESTITEM);
return true;
}
}
int count = 0;
- ARTIFACT_IDX idx, reward_idx = 0;
- for (idx = 2; idx < num; idx++) {
- ARTIFACT_IDX a_idx = (ARTIFACT_IDX)atoi(zz[idx]);
- if (a_idx < 1) {
+ FixedArtifactId reward_idx = FixedArtifactId::NONE;
+ for (auto idx = 2; idx < num; idx++) {
+ const auto a_idx = i2enum<FixedArtifactId>(atoi(zz[idx]));
+ if (a_idx == FixedArtifactId::NONE) {
continue;
}
- if (a_info[a_idx].is_generated) {
+
+ if (a_info[enum2i(a_idx)].is_generated) {
continue;
}
+
count++;
if (one_in_(count)) {
reward_idx = a_idx;
}
}
- if (reward_idx) {
- q_ptr->k_idx = (KIND_OBJECT_IDX)reward_idx;
- a_info[reward_idx].gen_flags.set(ItemGenerationTraitType::QUESTITEM);
+ if (reward_idx != FixedArtifactId::NONE) {
+ q_ptr->reward_artifact_idx = reward_idx;
+ a_info[enum2i(reward_idx)].gen_flags.set(ItemGenerationTraitType::QUESTITEM);
} else {
q_ptr->type = QuestKindType::KILL_ALL;
}
} else if (zz[6][0] == '!') {
if (inside_quest(floor_ptr->quest_number)) {
const auto &quest_list = QuestList::get_instance();
- letter[index].artifact = i2enum<FixedArtifactId>(quest_list[floor_ptr->quest_number].k_idx);
+ letter[index].artifact = quest_list[floor_ptr->quest_number].reward_artifact_idx;
}
} else {
letter[index].artifact = i2enum<FixedArtifactId>(atoi(zz[6]));
} else if (zz[4][0] == '!') {
if (inside_quest(floor_ptr->quest_number)) {
const auto &quest_list = QuestList::get_instance();
- ARTIFACT_IDX a_idx = quest_list[floor_ptr->quest_number].k_idx;
- if (a_idx) {
- auto *a_ptr = &a_info[a_idx];
+ const auto a_idx = quest_list[floor_ptr->quest_number].reward_artifact_idx;
+ if (a_idx != FixedArtifactId::NONE) {
+ const auto *a_ptr = &a_info[enum2i(a_idx)];
if (a_ptr->gen_flags.has_not(ItemGenerationTraitType::INSTA_ART)) {
letter[index].object = lookup_kind(a_ptr->tval, a_ptr->sval);
}
}
}
- for (ARTIFACT_IDX i = 0; i < INVEN_TOTAL; i++) {
+ for (auto i = 0; i < INVEN_TOTAL; i++) {
auto *o_ptr = &player_ptr->inventory_list[i];
if (!o_ptr->k_idx) {
continue;
auto *a_ptr = &a_info[enum2i(a_idx)];
GAME_TEXT base_name[MAX_NLEN];
strcpy(base_name, _("未知の伝説のアイテム", "Unknown Artifact"));
- ARTIFACT_IDX z = lookup_kind(a_ptr->tval, a_ptr->sval);
- if (z) {
+ const auto z = lookup_kind(a_ptr->tval, a_ptr->sval);
+ if (z != 0) {
ObjectType forge;
ObjectType *q_ptr;
q_ptr = &forge;
*/
#include "knowledge/knowledge-quests.h"
+#include "artifact/fixed-art-types.h"
#include "core/show-file.h"
#include "dungeon/dungeon.h"
#include "dungeon/quest.h"
#include "system/player-type-definition.h"
#include "term/screen-processor.h"
#include "util/angband-files.h"
+#include "util/enum-converter.h"
#include "util/sort.h"
#include "world/world.h"
break;
case QuestKindType::FIND_ARTIFACT:
- if (q_ref.k_idx) {
- auto *a_ptr = &a_info[q_ref.k_idx];
+ if (q_ref.reward_artifact_idx != FixedArtifactId::NONE) {
+ auto *a_ptr = &a_info[enum2i(q_ref.reward_artifact_idx)];
ObjectType forge;
auto *o_ptr = &forge;
KIND_OBJECT_IDX k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
o_ptr->prep(k_idx);
- o_ptr->fixed_artifact_idx = i2enum<FixedArtifactId>(q_ref.k_idx);
+ o_ptr->fixed_artifact_idx = q_ref.reward_artifact_idx;
o_ptr->ident = IDENT_STORE;
describe_flavor(player_ptr, name, o_ptr, OD_NAME_ONLY);
}
#include "load/quest-loader.h"
+#include "artifact/fixed-art-types.h"
#include "dungeon/quest.h"
#include "floor/floor-town.h"
#include "load/angband-version-comparer.h"
auto &quest_list = QuestList::get_instance();
determine_random_questor(player_ptr, &quest_list[loading_quest_index]);
}
- q_ptr->k_idx = rd_s16b();
- if (q_ptr->k_idx) {
- a_info[q_ptr->k_idx].gen_flags.set(ItemGenerationTraitType::QUESTITEM);
+ q_ptr->reward_artifact_idx = i2enum<FixedArtifactId>(rd_s16b());
+ if (q_ptr->reward_artifact_idx != FixedArtifactId::NONE) {
+ a_info[enum2i(q_ptr->reward_artifact_idx)].gen_flags.set(ItemGenerationTraitType::QUESTITEM);
}
q_ptr->flags = rd_byte();
#include "object-hook/hook-quest.h"
+#include "artifact/fixed-art-types.h"
#include "cmd-building/cmd-building.h"
#include "dungeon/quest.h"
#include "game-option/birth-options.h"
#include "system/monster-race-definition.h"
#include "system/object-type-definition.h"
#include "system/player-type-definition.h"
+#include "util/enum-converter.h"
#include "world/world.h"
/*!
}
const auto &quest_list = QuestList::get_instance();
- auto a_idx = quest_list[quest_idx].k_idx;
- if (a_idx == 0) {
+ auto a_idx = quest_list[quest_idx].reward_artifact_idx;
+ if (a_idx == FixedArtifactId::NONE) {
return false;
}
- auto *a_ptr = &a_info[a_idx];
+ auto *a_ptr = &a_info[enum2i(a_idx)];
if (a_ptr->gen_flags.has(ItemGenerationTraitType::INSTA_ART)) {
return false;
}
}
for (int i = 0; i < 2; i++) {
- const auto wielding_weapon = this->player_ptr->inventory_list[INVEN_MAIN_HAND + i];
+ const auto &wielding_weapon = this->player_ptr->inventory_list[INVEN_MAIN_HAND + i];
if (!has_melee_weapon(this->player_ptr, INVEN_MAIN_HAND + i) || (wielding_weapon.fixed_artifact_idx != FixedArtifactId::IRON_BALL)) {
continue;
}
wr_s16b((int16_t)q_ref.max_num);
wr_s16b(enum2i(q_ref.type));
wr_s16b(enum2i(q_ref.r_idx));
- wr_s16b(q_ref.k_idx);
+ wr_s16b(enum2i(q_ref.reward_artifact_idx));
wr_byte((byte)q_ref.flags);
wr_byte((byte)q_ref.dungeon);
}
// typedef int16_t MonsterRaceId; /*!< @todo MonsterRaceIdに差し替えて消滅させる ゲーム中のモンスター種族ID型を定義 */
typedef int16_t MONSTER_IDX; /*!< @todo MonsterRaceIdに差し替えて消滅させる ゲーム中のモンスター個体ID型を定義 */
typedef int16_t DUNGEON_IDX; /*!< ゲーム中のダンジョンID型を定義 */
-typedef int16_t ARTIFACT_IDX; /*!< ゲーム中のアーティファクトID型を定義 */
typedef int16_t EGO_IDX; /*!< アイテムエゴのID型を定義 */
typedef int16_t QUEST_IDX; /*!< ゲーム中のクエストID型を定義 */
static_cast<int>(std::numeric_limits<T>::max())));
}
-void wiz_restore_aware_flag_of_fixed_arfifact(ARTIFACT_IDX a_idx, bool aware = false);
+void wiz_restore_aware_flag_of_fixed_arfifact(FixedArtifactId a_idx, bool aware = false);
void wiz_modify_item_activation(PlayerType *player_ptr);
void wiz_identify_full_inventory(PlayerType *player_ptr);
case '\r':
break;
case 'a':
- wiz_restore_aware_flag_of_fixed_arfifact(command_arg);
+ wiz_restore_aware_flag_of_fixed_arfifact(i2enum<FixedArtifactId>(command_arg));
break;
case 'A':
- wiz_restore_aware_flag_of_fixed_arfifact(command_arg, true);
+ wiz_restore_aware_flag_of_fixed_arfifact(i2enum<FixedArtifactId>(command_arg), true);
break;
case 'e':
if (command_arg <= 0) {
/*!
* @brief 固定アーティファクトの出現フラグをリセットする
* @param a_idx 指定したアーティファクトID
+ * @details 外からはenum class を受け取るが、この関数内では数値の直指定処理なので即数値型にキャストする.
*/
-void wiz_restore_aware_flag_of_fixed_arfifact(ARTIFACT_IDX a_idx, bool aware)
+void wiz_restore_aware_flag_of_fixed_arfifact(FixedArtifactId a_idx, bool aware)
{
- if (a_idx <= 0) {
+ auto int_a_idx = enum2i(a_idx);
+ if (int_a_idx <= 0) {
char tmp[80] = "";
sprintf(tmp, "Artifact ID (1-%d): ", static_cast<int>(a_info.size()) - 1);
char tmp_val[10] = "";
return;
}
- a_idx = (ARTIFACT_IDX)atoi(tmp_val);
+ int_a_idx = static_cast<short>(atoi(tmp_val));
}
- if (a_idx <= 0 || a_idx >= static_cast<ARTIFACT_IDX>(a_info.size())) {
+ if (int_a_idx <= 0 || int_a_idx >= static_cast<short>(a_info.size())) {
msg_format(_("番号は1から%dの間で指定して下さい。", "ID must be between 1 to %d."), a_info.size() - 1);
return;
}
- auto *a_ptr = &a_info[a_idx];
+ auto *a_ptr = &a_info[int_a_idx];
a_ptr->is_generated = aware;
msg_print(aware ? "Modified." : "Restored.");
}