summaryrefslogtreecommitdiff
path: root/src/init1.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/init1.cc')
-rw-r--r--src/init1.cc634
1 files changed, 100 insertions, 534 deletions
diff --git a/src/init1.cc b/src/init1.cc
index 38736f0e..0a6ecff0 100644
--- a/src/init1.cc
+++ b/src/init1.cc
@@ -21,6 +21,8 @@
#include "monster_type.hpp"
#include "object1.hpp"
#include "object2.hpp"
+#include "object_flag.hpp"
+#include "object_flag_meta.hpp"
#include "object_kind.hpp"
#include "owner_type.hpp"
#include "player_class.hpp"
@@ -153,280 +155,6 @@ static cptr r_info_blow_effect[] =
};
-/*
- * Object flags
- */
-static cptr k_info_flags1[] =
-{
- "STR",
- "INT",
- "WIS",
- "DEX",
- "CON",
- "CHR",
- "MANA",
- "SPELL",
- "STEALTH",
- "SEARCH",
- "INFRA",
- "TUNNEL",
- "SPEED",
- "BLOWS",
- "CHAOTIC",
- "VAMPIRIC",
- "SLAY_ANIMAL",
- "SLAY_EVIL",
- "SLAY_UNDEAD",
- "SLAY_DEMON",
- "SLAY_ORC",
- "SLAY_TROLL",
- "SLAY_GIANT",
- "SLAY_DRAGON",
- "KILL_DRAGON",
- "VORPAL",
- "IMPACT",
- "BRAND_POIS",
- "BRAND_ACID",
- "BRAND_ELEC",
- "BRAND_FIRE",
- "BRAND_COLD"
-};
-
-/*
- * Object flags
- */
-static cptr k_info_flags2[] =
-{
- "SUST_STR",
- "SUST_INT",
- "SUST_WIS",
- "SUST_DEX",
- "SUST_CON",
- "SUST_CHR",
- "INVIS",
- "LIFE",
- "IM_ACID",
- "IM_ELEC",
- "IM_FIRE",
- "IM_COLD",
- "SENS_FIRE",
- "REFLECT",
- "FREE_ACT",
- "HOLD_LIFE",
- "RES_ACID",
- "RES_ELEC",
- "RES_FIRE",
- "RES_COLD",
- "RES_POIS",
- "RES_FEAR",
- "RES_LITE",
- "RES_DARK",
- "RES_BLIND",
- "RES_CONF",
- "RES_SOUND",
- "RES_SHARDS",
- "RES_NETHER",
- "RES_NEXUS",
- "RES_CHAOS",
- "RES_DISEN"
-};
-
-/*
- * Trap flags
- */
-static cptr k_info_flags2_trap[] =
-{
- "AUTOMATIC_5",
- "AUTOMATIC_99",
- "KILL_GHOST",
- "TELEPORT_TO",
- "ONLY_DRAGON",
- "ONLY_DEMON",
- "XXX3",
- "XXX3",
- "ONLY_ANIMAL",
- "ONLY_UNDEAD",
- "ONLY_EVIL",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
- "XXX3",
-};
-
-
-/*
- * Object flags
- */
-static cptr k_info_flags3[] =
-{
- "SH_FIRE",
- "SH_ELEC",
- "AUTO_CURSE",
- "DECAY",
- "NO_TELE",
- "NO_MAGIC",
- "WRAITH",
- "TY_CURSE",
- "EASY_KNOW",
- "HIDE_TYPE",
- "SHOW_MODS",
- "INSTA_ART",
- "FEATHER",
- "LITE1",
- "SEE_INVIS",
- "NORM_ART",
- "SLOW_DIGEST",
- "REGEN",
- "XTRA_MIGHT",
- "XTRA_SHOTS",
- "IGNORE_ACID",
- "IGNORE_ELEC",
- "IGNORE_FIRE",
- "IGNORE_COLD",
- "ACTIVATE",
- "DRAIN_EXP",
- "TELEPORT",
- "AGGRAVATE",
- "BLESSED",
- "CURSED",
- "HEAVY_CURSE",
- "PERMA_CURSE"
-};
-
-/*
- * Object flags
- */
-static cptr k_info_flags4[] =
-{
- "NEVER_BLOW",
- "PRECOGNITION",
- "BLACK_BREATH",
- "RECHARGE",
- "FLY",
- "DG_CURSE",
- "COULD2H",
- "MUST2H",
- "LEVELS",
- "CLONE",
- "SPECIAL_GENE",
- "CLIMB",
- "FAST_CAST",
- "CAPACITY",
- "CHARGING",
- "CHEAPNESS",
- "FOUNTAIN",
- "ANTIMAGIC_50",
- "XXX5",
- "XXX5",
- "XXX5",
- "EASY_USE",
- "IM_NETHER",
- "RECHARGED",
- "ULTIMATE",
- "AUTO_ID",
- "LITE2",
- "LITE3",
- "FUEL_LITE",
- "XXX5",
- "CURSE_NO_DROP",
- "NO_RECHARGE"
-};
-
-/*
- * Object flags
- */
-static cptr k_info_flags5[] =
-{
- "TEMPORARY",
- "DRAIN_MANA",
- "DRAIN_HP",
- "KILL_DEMON",
- "KILL_UNDEAD",
- "CRIT",
- "ATTR_MULTI",
- "WOUNDING",
- "FULL_NAME",
- "LUCK",
- "IMMOVABLE",
- "SPELL_CONTAIN",
- "RES_MORGUL",
- "ACTIVATE_NO_WIELD",
- "MAGIC_BREATH",
- "WATER_BREATH",
- "WIELD_CAST",
- "RANDOM_RESIST",
- "RANDOM_POWER",
- "RANDOM_RES_OR_POWER",
- "XXX8X20",
- "XXX8X21",
- "XXX8X22",
- "XXX8X23",
- "XXX8X24",
- "XXX8X25",
- "XXX8X26",
- "XXX8X27",
- "XXX8X28",
- "XXX8X29",
- "XXX8X02",
- "XXX8X22",
-};
-
-/*
- * ESP flags
- */
-static cptr esp_flags[] =
-{
- "ESP_ORC",
- "ESP_TROLL",
- "ESP_DRAGON",
- "ESP_GIANT",
- "ESP_DEMON",
- "ESP_UNDEAD",
- "ESP_EVIL",
- "ESP_ANIMAL",
- "ESP_THUNDERLORD",
- "ESP_GOOD",
- "ESP_NONLIVING",
- "ESP_UNIQUE",
- "ESP_SPIDER",
- "XXX8X02",
- "XXX8X02",
- "XXX8X02",
- "XXX8X02",
- "XXX8X17",
- "XXX8X18",
- "XXX8X19",
- "XXX8X20",
- "XXX8X21",
- "XXX8X22",
- "XXX8X23",
- "XXX8X24",
- "XXX8X25",
- "XXX8X26",
- "XXX8X27",
- "XXX8X28",
- "XXX8X29",
- "XXX8X02",
- "ESP_ALL",
-};
-
/* Specially handled properties for ego-items */
static cptr ego_flags[] =
@@ -1190,6 +918,7 @@ static errr grab_one_class_flag(u32b *choice, cptr what)
/* Failure */
return (1);
}
+
static errr grab_one_race_allow_flag(u32b *choice, cptr what)
{
int i;
@@ -1264,18 +993,29 @@ static int get_activation(char *activation)
}
/*
+ * Convert string to object_flag_set value
+ */
+static object_flag_set object_flag_set_from_string(cptr what)
+{
+ for (auto const flag_meta: object_flags_meta())
+ {
+ if (streq(what, flag_meta->e_name))
+ {
+ return flag_meta->flag_set;
+ };
+ }
+
+ return object_flag_set();
+}
+
+/*
* Grab one flag in an object_kind from a textual string
*/
-static errr grab_one_race_kind_flag(u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp, cptr what)
+static errr grab_object_flag(object_flag_set *flags, cptr what)
{
- if (lookup_flags(what,
- flag_tie(f1, k_info_flags1),
- flag_tie(f2, k_info_flags2),
- flag_tie(f3, k_info_flags3),
- flag_tie(f4, k_info_flags4),
- flag_tie(f5, k_info_flags5),
- flag_tie(esp, esp_flags)))
+ if (object_flag_set f = object_flag_set_from_string(what))
{
+ *flags |= f;
return 0;
}
@@ -1620,7 +1360,7 @@ errr init_player_info_txt(FILE *fp)
/* Process 'F' for "level Flags" (multiple lines) */
if ((buf[0] == 'R') && (buf[2] == 'F'))
{
- if (0 != grab_one_race_kind_flag(&rp_ptr->oflags1[lev], &rp_ptr->oflags2[lev], &rp_ptr->oflags3[lev], &rp_ptr->oflags4[lev], &rp_ptr->oflags5[lev], &rp_ptr->oesp[lev], buf + 4))
+ if (grab_object_flag(&rp_ptr->oflags[lev], buf + 4))
{
return (5);
}
@@ -1916,7 +1656,7 @@ errr init_player_info_txt(FILE *fp)
/* Process 'F' for "level Flags" (multiple lines) */
if ((buf[0] == 'S') && (buf[2] == 'F'))
{
- if (0 != grab_one_race_kind_flag(&rmp_ptr->oflags1[lev], &rmp_ptr->oflags2[lev], &rmp_ptr->oflags3[lev], &rmp_ptr->oflags4[lev], &rmp_ptr->oflags5[lev], &rmp_ptr->oesp[lev], buf + 4))
+ if (0 != grab_object_flag(&rmp_ptr->oflags[lev], buf + 4))
{
return (5);
}
@@ -2370,7 +2110,10 @@ errr init_player_info_txt(FILE *fp)
}
/* Parse this entry */
- if (0 != grab_one_race_kind_flag(&c_ptr->oflags1[lev], &c_ptr->oflags2[lev], &c_ptr->oflags3[lev], &c_ptr->oflags4[lev], &c_ptr->oflags5[lev], &c_ptr->oesp[lev], s)) return (5);
+ if (0 != grab_object_flag(&c_ptr->oflags[lev], s))
+ {
+ return (5);
+ }
/* Start the next entry */
s = t;
@@ -3059,39 +2802,6 @@ errr init_f_info_txt(FILE *fp)
/*
- * Grab one flag in an object_kind from a textual string
- */
-static errr grab_one_kind_flag(object_kind *k_ptr, cptr what, bool_ obvious)
-{
- /* Dispatch to correct set of flags */
- u32b *f1 = obvious ? &k_ptr->oflags1 : &k_ptr->flags1;
- u32b *f2 = obvious ? &k_ptr->oflags2 : &k_ptr->flags2;
- u32b *f3 = obvious ? &k_ptr->oflags3 : &k_ptr->flags3;
- u32b *f4 = obvious ? &k_ptr->oflags4 : &k_ptr->flags4;
- u32b *f5 = obvious ? &k_ptr->oflags5 : &k_ptr->flags5;
- u32b *esp = obvious ? &k_ptr->oesp : &k_ptr->esp;
-
- /* Lookup */
- if (lookup_flags(what,
- flag_tie(f1, k_info_flags1),
- flag_tie(f2, k_info_flags2),
- flag_tie(f2, k_info_flags2_trap),
- flag_tie(f3, k_info_flags3),
- flag_tie(f4, k_info_flags4),
- flag_tie(f5, k_info_flags5),
- flag_tie(esp, esp_flags)))
- {
- return 0;
- }
-
- /* Oops */
- msg_format("Unknown object flag '%s'.", what);
-
- /* Error */
- return (1);
-}
-
-/*
* Initialize the "k_info" array, by parsing an ascii "template" file
*/
errr init_k_info_txt(FILE *fp)
@@ -3162,7 +2872,6 @@ errr init_k_info_txt(FILE *fp)
k_ptr->text = my_strdup("");
/* Needed hack */
- k_ptr->esp = 0;
k_ptr->power = -1;
/* Next... */
@@ -3388,7 +3097,7 @@ errr init_k_info_txt(FILE *fp)
/* Hack -- Process 'F' for flags */
if (buf[0] == 'F')
{
- if (0 != grab_one_kind_flag(k_ptr, buf + 2, FALSE))
+ if (0 != grab_object_flag(&k_ptr->flags, buf + 2))
{
return (5);
}
@@ -3400,7 +3109,7 @@ errr init_k_info_txt(FILE *fp)
/* Hack -- Process 'f' for obvious flags */
if (buf[0] == 'f')
{
- if (0 != grab_one_kind_flag(k_ptr, buf + 2, TRUE))
+ if (0 != grab_object_flag(&k_ptr->oflags, buf + 2))
{
return (5);
}
@@ -3418,40 +3127,6 @@ errr init_k_info_txt(FILE *fp)
return (0);
}
-/*
- * Grab one flag in an artifact_type from a textual string
- */
-static errr grab_one_artifact_flag(artifact_type *a_ptr, cptr what, bool_ obvious)
-{
- /* Dispatch to correct set of flags */
- u32b *f1 = obvious ? &a_ptr->oflags1 : &a_ptr->flags1;
- u32b *f2 = obvious ? &a_ptr->oflags2 : &a_ptr->flags2;
- u32b *f3 = obvious ? &a_ptr->oflags3 : &a_ptr->flags3;
- u32b *f4 = obvious ? &a_ptr->oflags4 : &a_ptr->flags4;
- u32b *f5 = obvious ? &a_ptr->oflags5 : &a_ptr->flags5;
- u32b *esp = obvious ? &a_ptr->oesp : &a_ptr->esp;
-
- /* Lookup */
- if (lookup_flags(what,
- flag_tie(f1, k_info_flags1),
- flag_tie(f2, k_info_flags2),
- flag_tie(f2, k_info_flags2_trap),
- flag_tie(f3, k_info_flags3),
- flag_tie(f4, k_info_flags4),
- flag_tie(f5, k_info_flags5),
- flag_tie(esp, esp_flags)))
- {
- return 0;
- }
-
- /* Oops */
- msg_format("Unknown artifact flag '%s'.", what);
-
- /* Error */
- return (1);
-}
-
-
/*
@@ -3524,17 +3199,16 @@ errr init_a_info_txt(FILE *fp)
a_ptr->text = my_strdup("");
/* Ignore everything */
- a_ptr->flags3 |= (TR3_IGNORE_ACID);
- a_ptr->flags3 |= (TR3_IGNORE_ELEC);
- a_ptr->flags3 |= (TR3_IGNORE_FIRE);
- a_ptr->flags3 |= (TR3_IGNORE_COLD);
+ a_ptr->flags |= TR_IGNORE_ACID |
+ TR_IGNORE_ELEC |
+ TR_IGNORE_FIRE |
+ TR_IGNORE_COLD;
/* Needed hack */
- a_ptr->esp = 0;
a_ptr->power = -1;
/*Require activating artifacts to have a activation type */
- if (a_ptr && a_ptr->flags3 & TR3_ACTIVATE && !a_ptr->activate)
+ if (a_ptr && (a_ptr->flags & TR_ACTIVATE) && !a_ptr->activate)
{
msg_print("Activate flag without activate type");
return 1;
@@ -3654,7 +3328,10 @@ errr init_a_info_txt(FILE *fp)
/* Hack -- Process 'F' for flags */
if (buf[0] == 'F')
{
- if (0 != grab_one_artifact_flag(a_ptr, buf+2, FALSE)) return (5);
+ if (grab_object_flag(&a_ptr->flags, buf+2))
+ {
+ return (5);
+ }
/* Next... */
continue;
@@ -3663,7 +3340,10 @@ errr init_a_info_txt(FILE *fp)
/* Hack -- Process 'f' for obvious flags */
if (buf[0] == 'f')
{
- if (0 != grab_one_artifact_flag(a_ptr, buf+2, TRUE)) return (5);
+ if (grab_object_flag(&a_ptr->oflags, buf+2))
+ {
+ return (5);
+ }
/* Next... */
continue;
@@ -3759,26 +3439,6 @@ errr init_set_info_txt(FILE *fp)
assert(!set_ptr->name);
set_ptr->name = my_strdup(s);
- /* Initialize */
- set_ptr->num = 0;
- set_ptr->num_use = 0;
-
- for (std::size_t z = 0; z < SET_MAX_SIZE; z++)
- {
- set_ptr->arts[z].a_idx = 0;
- set_ptr->arts[z].present = FALSE;
- for (std::size_t y = 0; y < SET_MAX_SIZE; y++)
- {
- set_ptr->arts[z].flags1[y] = 0;
- set_ptr->arts[z].flags2[y] = 0;
- set_ptr->arts[z].flags3[y] = 0;
- set_ptr->arts[z].flags4[y] = 0;
- set_ptr->arts[z].flags5[y] = 0;
- set_ptr->arts[z].esp[y] = 0;
- set_ptr->arts[z].pval[y] = 0;
- }
- }
-
/* Next... */
continue;
}
@@ -3832,14 +3492,7 @@ errr init_set_info_txt(FILE *fp)
/* Process 'F' for flags */
if (buf[0] == 'F')
{
- /* Parse this entry */
- if (0 != grab_one_race_kind_flag(&set_ptr->arts[cur_art].flags1[cur_num],
- &set_ptr->arts[cur_art].flags2[cur_num],
- &set_ptr->arts[cur_art].flags3[cur_num],
- &set_ptr->arts[cur_art].flags4[cur_num],
- &set_ptr->arts[cur_art].flags5[cur_num],
- &set_ptr->arts[cur_art].esp[cur_num],
- buf + 2))
+ if (grab_object_flag(&set_ptr->arts[cur_art].flags[cur_num], buf + 2))
{
return (5);
}
@@ -4429,67 +4082,30 @@ errr init_ab_info_txt(FILE *fp)
/*
- * Grab one flag in a ego-item_type from a textual string
+ * Grab one flag in a ego-item_type from a textual string.
+ *
+ * We explicitly allow nullptr for the "ego" parameter.
*/
-static bool_ grab_one_ego_item_flag(ego_item_type *e_ptr, cptr what, int n, bool_ obvious)
+static bool_ grab_one_ego_item_flag(object_flag_set *flags, u32b *ego, cptr what)
{
- assert(n < FLAG_RARITY_MAX);
-
- /* Dispatch to correct set of flags */
- u32b *f1 = obvious ? &e_ptr->oflags1[n] : &e_ptr->flags1[n];
- u32b *f2 = obvious ? &e_ptr->oflags2[n] : &e_ptr->flags2[n];
- u32b *f3 = obvious ? &e_ptr->oflags3[n] : &e_ptr->flags3[n];
- u32b *f4 = obvious ? &e_ptr->oflags4[n] : &e_ptr->flags4[n];
- u32b *f5 = obvious ? &e_ptr->oflags5[n] : &e_ptr->flags5[n];
- u32b *esp = obvious ? &e_ptr->oesp[n] : &e_ptr->esp[n];
- u32b *ego = obvious ? &e_ptr->fego[n] : &e_ptr->fego[n];
-
- /* Lookup */
- if (lookup_flags(what,
- flag_tie(f1, k_info_flags1),
- flag_tie(f2, k_info_flags2),
- flag_tie(f2, k_info_flags2_trap),
- flag_tie(f3, k_info_flags3),
- flag_tie(f4, k_info_flags4),
- flag_tie(f5, k_info_flags5),
- flag_tie(esp, esp_flags),
- flag_tie(ego, ego_flags)))
+ /* Lookup as an object_flag */
+ if (auto f = object_flag_set_from_string(what))
{
- return (0);
+ *flags |= f;
+ return 0;
}
- /* Oops */
- msg_format("Unknown ego-item flag '%s'.", what);
-
- /* Error */
- return (1);
-}
-
-static bool_ grab_one_ego_item_flag_restrict(ego_item_type *e_ptr, cptr what, bool_ need)
-{
- /* Dispatch to correct set of flags */
- u32b *f1 = need ? &e_ptr->need_flags1 : &e_ptr->forbid_flags1;
- u32b *f2 = need ? &e_ptr->need_flags2 : &e_ptr->forbid_flags2;
- u32b *f3 = need ? &e_ptr->need_flags3 : &e_ptr->forbid_flags3;
- u32b *f4 = need ? &e_ptr->need_flags4 : &e_ptr->forbid_flags4;
- u32b *f5 = need ? &e_ptr->need_flags5 : &e_ptr->forbid_flags5;
- u32b *esp = need ? &e_ptr->need_esp : &e_ptr->forbid_esp;
-
- /* Lookup */
- if (lookup_flags(what,
- flag_tie(f1, k_info_flags1),
- flag_tie(f2, k_info_flags2),
- flag_tie(f2, k_info_flags2_trap),
- flag_tie(f3, k_info_flags3),
- flag_tie(f4, k_info_flags4),
- flag_tie(f5, k_info_flags5),
- flag_tie(esp, esp_flags)))
+ /* Lookup as ego flag */
+ if (ego)
{
- return 0;
+ if (lookup_flags(what, flag_tie(ego, ego_flags)))
+ {
+ return (0);
+ }
}
/* Oops */
- msg_format("Unknown ego-item restrict flag '%s'.", what);
+ msg_format("Unknown ego-item flag '%s'.", what);
/* Error */
return (1);
@@ -4497,13 +4113,12 @@ static bool_ grab_one_ego_item_flag_restrict(ego_item_type *e_ptr, cptr what, bo
-
/*
* Initialize the "e_info" array, by parsing an ascii "template" file
*/
errr init_e_info_txt(FILE *fp)
{
- int i, cur_r = -1, cur_t = 0, j;
+ int i, cur_r = -1, cur_t = 0;
char buf[1024];
char *s, *t;
@@ -4557,6 +4172,10 @@ errr init_e_info_txt(FILE *fp)
/* Save the index */
error_idx = i;
+ /* Reset cur_* variables */
+ cur_r = -1;
+ cur_t = 0;
+
/* Point at the "info" */
e_ptr = &e_info[i];
@@ -4564,33 +4183,6 @@ errr init_e_info_txt(FILE *fp)
assert(!e_ptr->name);
e_ptr->name = my_strdup(s);
- /* Needed hack */
- e_ptr->power = -1;
- cur_r = -1;
- cur_t = 0;
-
- for (j = 0; j < 10; j++)
- {
- e_ptr->tval[j] = 255;
- }
- for (j = 0; j < FLAG_RARITY_MAX; j++)
- {
- e_ptr->rar[j] = 0;
- e_ptr->flags1[j] = 0;
- e_ptr->flags2[j] = 0;
- e_ptr->flags3[j] = 0;
- e_ptr->flags4[j] = 0;
- e_ptr->flags5[j] = 0;
- e_ptr->esp[j] = 0;
- e_ptr->oflags1[j] = 0;
- e_ptr->oflags2[j] = 0;
- e_ptr->oflags3[j] = 0;
- e_ptr->oflags4[j] = 0;
- e_ptr->oflags5[j] = 0;
- e_ptr->oesp[j] = 0;
- e_ptr->fego[j] = 0;
- }
-
/* Next... */
continue;
}
@@ -4751,7 +4343,10 @@ errr init_e_info_txt(FILE *fp)
}
/* Parse this entry */
- if (0 != grab_one_ego_item_flag_restrict(e_ptr, s, TRUE)) return (5);
+ if (grab_object_flag(&e_ptr->need_flags, s))
+ {
+ return (5);
+ }
/* Start the next entry */
s = t;
@@ -4764,7 +4359,7 @@ errr init_e_info_txt(FILE *fp)
/* Hack -- Process 'r:F' for forbidden flags */
if ((buf[0] == 'r') && (buf[2] == 'F'))
{
- if (0 != grab_one_ego_item_flag_restrict(e_ptr, buf + 4, FALSE))
+ if (grab_object_flag(&e_ptr->forbid_flags, buf + 4))
{
return (5);
}
@@ -4792,7 +4387,14 @@ errr init_e_info_txt(FILE *fp)
}
/* Parse this entry */
- if (0 != grab_one_ego_item_flag(e_ptr, s, cur_r, FALSE)) return (5);
+ assert(cur_r < FLAG_RARITY_MAX);
+ if (0 != grab_one_ego_item_flag(
+ &e_ptr->flags[cur_r],
+ &e_ptr->fego[cur_r],
+ s))
+ {
+ return (5);
+ }
/* Start the next entry */
s = t;
@@ -4821,7 +4423,14 @@ errr init_e_info_txt(FILE *fp)
}
/* Parse this entry */
- if (0 != grab_one_ego_item_flag(e_ptr, s, cur_r, TRUE)) return (5);
+ assert(cur_r < FLAG_RARITY_MAX);
+ if (0 != grab_one_ego_item_flag(
+ &e_ptr->oflags[cur_r],
+ nullptr,
+ s))
+ {
+ return (5);
+ }
/* Start the next entry */
s = t;
@@ -4839,51 +4448,6 @@ errr init_e_info_txt(FILE *fp)
return (0);
}
-/*
- * Grab one flag in a randart_part_type from a textual string
- */
-static bool_ grab_one_randart_item_flag(randart_part_type *ra_ptr, cptr what, char c)
-{
- bool regular = (c == 'F');
-
- /* Dispatch to correct set of flags */
- u32b *f1 = regular ? &ra_ptr->flags1 : &ra_ptr->aflags1;
- u32b *f2 = regular ? &ra_ptr->flags2 : &ra_ptr->aflags2;
- u32b *f3 = regular ? &ra_ptr->flags3 : &ra_ptr->aflags3;
- u32b *f4 = regular ? &ra_ptr->flags4 : &ra_ptr->aflags4;
- u32b *f5 = regular ? &ra_ptr->flags5 : &ra_ptr->aflags5;
- u32b *esp = regular ? &ra_ptr->esp : &ra_ptr->aesp;
-
- /* Check flags */
- if (lookup_flags(what,
- flag_tie(f1, k_info_flags1),
- flag_tie(f2, k_info_flags2),
- flag_tie(f2, k_info_flags2_trap),
- flag_tie(f3, k_info_flags3),
- flag_tie(f4, k_info_flags4),
- flag_tie(f5, k_info_flags5),
- flag_tie(esp, esp_flags)))
- {
- return 0;
- }
-
- /* Check ego_flags */
- if (regular)
- {
- if (lookup_flags(what, flag_tie(&ra_ptr->fego, ego_flags)))
- {
- return 0;
- }
- }
-
- /* Oops */
- msg_format("Unknown ego-item flag '%s'.", what);
-
- /* Error */
- return (1);
-}
-
-
/*
@@ -4964,12 +4528,7 @@ errr init_ra_info_txt(FILE *fp)
{
ra_ptr->tval[j] = 255;
}
- ra_ptr->flags1 = 0;
- ra_ptr->flags2 = 0;
- ra_ptr->flags3 = 0;
- ra_ptr->flags4 = 0;
- ra_ptr->flags5 = 0;
- ra_ptr->esp = 0;
+ ra_ptr->flags = object_flag_set();
ra_ptr->fego = 0;
/* Next... */
@@ -5076,10 +4635,13 @@ errr init_ra_info_txt(FILE *fp)
continue;
}
- /* Hack -- Process 'F' for flags */
+ /* Process 'F' for flags */
if (buf[0] == 'F')
{
- if (0 != grab_one_randart_item_flag(ra_ptr, buf + 2, 'F'))
+ if (0 != grab_one_ego_item_flag(
+ &ra_ptr->flags,
+ &ra_ptr->fego,
+ buf + 2))
{
return (5);
}
@@ -5088,10 +4650,13 @@ errr init_ra_info_txt(FILE *fp)
continue;
}
- /* Hack -- Process 'A' for antagonic flags */
+ /* Process 'A' for antagonic flags */
if (buf[0] == 'A')
{
- if (0 != grab_one_randart_item_flag(ra_ptr, buf + 2, 'A'))
+ if (0 != grab_one_ego_item_flag(
+ &ra_ptr->aflags,
+ nullptr,
+ buf + 2))
{
return (5);
}
@@ -7659,10 +7224,11 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst
Let's just HACK around one observed bug: Shadow Cloak
of Luthien [Globe of Light] */
{
- u32b f1, f2, f3, f4, f5, esp;
- object_flags(q_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
- if (f5 & TR5_SPELL_CONTAIN)
+ auto const flags = object_flags(q_ptr);
+ if (flags & TR_SPELL_CONTAIN)
+ {
q_ptr->pval2 = -1;
+ }
}
/* Drop the artifact */